diff --git a/.github/workflows/pr-title-comment.yml b/.github/workflows/pr-title-comment.yml
index a3117f269..648eb1c44 100644
--- a/.github/workflows/pr-title-comment.yml
+++ b/.github/workflows/pr-title-comment.yml
@@ -20,7 +20,12 @@ concurrency:
jobs:
comment:
- if: github.event.workflow_run.event == 'pull_request'
+ # Only run when the lint run actually produced a result artifact: a run
+ # cancelled by concurrency (rapid pushes to the same PR) completes with
+ # conclusion "cancelled" before uploading it, and would fail the download.
+ if: >
+ github.event.workflow_run.event == 'pull_request' &&
+ contains(fromJSON('["success", "failure"]'), github.event.workflow_run.conclusion)
runs-on: ubuntu-26.04
steps:
- name: ⬇️ Download lint result
diff --git a/app/(auth)/(tabs)/(home)/settings/appearance/hide-libraries/page.tsx b/app/(auth)/(tabs)/(home)/settings/appearance/hide-libraries/page.tsx
index 24a3011e3..d0109fb7e 100644
--- a/app/(auth)/(tabs)/(home)/settings/appearance/hide-libraries/page.tsx
+++ b/app/(auth)/(tabs)/(home)/settings/appearance/hide-libraries/page.tsx
@@ -71,7 +71,7 @@ export default function AppearanceHideLibrariesPage() {
))}
- {t("home.settings.other.select_liraries_you_want_to_hide")}
+ {t("home.settings.other.select_libraries_you_want_to_hide")}
diff --git a/app/(auth)/(tabs)/(home)/settings/hide-libraries/page.tsx b/app/(auth)/(tabs)/(home)/settings/hide-libraries/page.tsx
index e7a61bde3..fe777462f 100644
--- a/app/(auth)/(tabs)/(home)/settings/hide-libraries/page.tsx
+++ b/app/(auth)/(tabs)/(home)/settings/hide-libraries/page.tsx
@@ -60,7 +60,7 @@ export default function HideLibrariesPage() {
))}
- {t("home.settings.other.select_liraries_you_want_to_hide")}
+ {t("home.settings.other.select_libraries_you_want_to_hide")}
);
diff --git a/app/(auth)/player/direct-player.tsx b/app/(auth)/player/direct-player.tsx
index 515e39d15..1a29ffc02 100644
--- a/app/(auth)/player/direct-player.tsx
+++ b/app/(auth)/player/direct-player.tsx
@@ -1318,7 +1318,7 @@ export default function DirectPlayerPage() {
console.error("Video Error:", e.nativeEvent);
Alert.alert(
t("player.error"),
- t("player.an_error_occured_while_playing_the_video"),
+ t("player.an_error_occurred_while_playing_the_video"),
);
writeToLog("ERROR", "Video Error", e.nativeEvent);
}}
diff --git a/components/TrackSheet.tsx b/components/TrackSheet.tsx
deleted file mode 100644
index 52735f6fe..000000000
--- a/components/TrackSheet.tsx
+++ /dev/null
@@ -1,99 +0,0 @@
-import type { MediaSourceInfo } from "@jellyfin/sdk/lib/generated-client/models";
-import { useMemo, useState } from "react";
-import { useTranslation } from "react-i18next";
-import { Platform, TouchableOpacity, View } from "react-native";
-import { Text } from "./common/Text";
-import { FilterSheet } from "./filters/FilterSheet";
-
-interface Props extends React.ComponentProps {
- source?: MediaSourceInfo;
- onChange: (value: number) => void;
- selected?: number | undefined;
- streamType?: string;
- title: string;
-}
-
-export const TrackSheet: React.FC = ({
- source,
- onChange,
- selected,
- streamType,
- title,
- ...props
-}) => {
- const isTv = Platform.isTV;
- const { t } = useTranslation();
-
- const streams = useMemo(
- () => source?.MediaStreams?.filter((x) => x.Type === streamType),
- [source, streamType],
- );
-
- const selectedSteam = useMemo(
- () => streams?.find((x) => x.Index === selected),
- [streams, selected],
- );
-
- const noneOption = useMemo(
- () => ({ Index: -1, DisplayTitle: t("common.none") }),
- [t],
- );
-
- // Creates a modified data array that includes a "None" option for subtitles
- // We might want to possibly do this for other places, like audio?
- const addNoneToSubtitles = useMemo(() => {
- if (streamType === "Subtitle") {
- const result = streams ? [noneOption, ...streams] : [noneOption];
- return result;
- }
- return streams;
- }, [streams, streamType, noneOption]);
- const [open, setOpen] = useState(false);
-
- if (isTv || (streams && streams.length === 0)) return null;
-
- return (
-
-
- {title}
- setOpen(true)}
- >
-
- {selected === -1 && streamType === "Subtitle"
- ? t("common.none")
- : selectedSteam?.DisplayTitle || t("common.select")}
-
-
-
- {
- const label = (item as any).DisplayTitle || "";
- return label.toLowerCase().includes(query.toLowerCase());
- }}
- renderItemLabel={(item) => (
- {(item as any).DisplayTitle || ""}
- )}
- set={(vals) => {
- const chosen = vals[0] as any;
- if (chosen && chosen.Index !== null && chosen.Index !== undefined) {
- onChange(chosen.Index);
- }
- }}
- />
-
- );
-};
diff --git a/components/WatchedIndicator.tsx b/components/WatchedIndicator.tsx
index 0d2999f53..145ee7e0e 100644
--- a/components/WatchedIndicator.tsx
+++ b/components/WatchedIndicator.tsx
@@ -1,43 +1,119 @@
import { Ionicons } from "@expo/vector-icons";
import type { BaseItemDto } from "@jellyfin/sdk/lib/generated-client/models";
-import type React from "react";
-import { Platform, View } from "react-native";
+import React from "react";
+import { Platform, View, type ViewStyle } from "react-native";
+import { Text } from "@/components/common/Text";
+import { scaleSize } from "@/utils/scaleSize";
-export const WatchedIndicator: React.FC<{ item: BaseItemDto }> = ({ item }) => {
- if (Platform.isTV) {
- // TV: Show white checkmark when watched
- if (
- item.UserData?.Played &&
- (item.Type === "Movie" || item.Type === "Episode")
- ) {
+const isAggregateType = (item: BaseItemDto) =>
+ item.Type === "Series" || item.Type === "BoxSet";
+
+// TV sizes are scaled relative to a 1920×1080 reference (see scaleSize).
+const tvBadgeBase: ViewStyle = {
+ position: "absolute",
+ top: scaleSize(8),
+ right: scaleSize(8),
+ height: scaleSize(28),
+ borderRadius: scaleSize(14),
+ backgroundColor: "rgba(255,255,255,0.92)",
+ alignItems: "center",
+ justifyContent: "center",
+};
+
+// Mobile uses raw dp — no scaling.
+const mobileBadgeBase: ViewStyle = {
+ position: "absolute",
+ top: 4,
+ right: 4,
+ height: 20,
+ borderRadius: 10,
+ backgroundColor: "#9333ea",
+ alignItems: "center",
+ justifyContent: "center",
+};
+
+/**
+ * Renders the unplayed-episode count badge for Series/BoxSet items that still
+ * have episodes left to watch. Returns null for non-aggregate types, fully
+ * watched items, or items with no unplayed count, so it is safe to mount
+ * unconditionally as an overlay (e.g. on top of the tvOS glass poster, where
+ * the watched checkmark is drawn natively and only the count needs RN).
+ */
+export const UnplayedCountBadge: React.FC<{ item: BaseItemDto }> = React.memo(
+ ({ item }) => {
+ if (!isAggregateType(item)) return null;
+ if (item.UserData?.Played) return null;
+ const unplayed = item.UserData?.UnplayedItemCount ?? 0;
+ if (unplayed <= 0) return null;
+ // Cap at 1k+ to keep the badge compact (jellyfin-web caps at 99+).
+ const label = unplayed >= 1000 ? "1k+" : String(unplayed);
+
+ if (Platform.isTV) {
return (
-
+
+ {label}
+
);
}
- return null;
+
+ return (
+
+
+ {label}
+
+
+ );
+ },
+);
+
+export const WatchedIndicator: React.FC<{ item: BaseItemDto }> = ({ item }) => {
+ const isMovieOrEpisode = item.Type === "Movie" || item.Type === "Episode";
+ const isAggregate = isAggregateType(item);
+ const isPlayed = item.UserData?.Played === true;
+
+ if (Platform.isTV) {
+ // Fully watched → white checkmark badge (top-right)
+ if (isPlayed && (isMovieOrEpisode || isAggregate)) {
+ return (
+
+
+
+ );
+ }
+ // Series/BoxSet with remaining episodes → count badge
+ return ;
}
- // Mobile: Show purple triangle for unwatched
+ // Mobile: purple corner ribbon for unwatched Movie/Episode (existing behavior)
return (
<>
- {item.UserData?.Played === false &&
- (item.Type === "Movie" || item.Type === "Episode") && (
-
- )}
+ {/* Strict === false: items without UserData (unknown state) get no ribbon */}
+ {isMovieOrEpisode && item.UserData?.Played === false && (
+
+ )}
+
+ {/* Fully watched Series/BoxSet → small purple checkmark */}
+ {isAggregate && isPlayed && (
+
+
+
+ )}
+
+ {/* Series/BoxSet with remaining episodes → count badge */}
+
>
);
};
diff --git a/components/login/Login.tsx b/components/login/Login.tsx
index 7cf5f43fc..da634ad09 100644
--- a/components/login/Login.tsx
+++ b/components/login/Login.tsx
@@ -146,7 +146,7 @@ export const Login: React.FC = () => {
} else {
Alert.alert(
t("login.connection_failed"),
- t("login.an_unexpected_error_occured"),
+ t("login.an_unexpected_error_occurred"),
);
}
} finally {
diff --git a/components/login/TVLogin.tsx b/components/login/TVLogin.tsx
index 4ce611924..00bd7f65f 100644
--- a/components/login/TVLogin.tsx
+++ b/components/login/TVLogin.tsx
@@ -437,7 +437,7 @@ export const TVLogin: React.FC = () => {
} else {
Alert.alert(
t("login.connection_failed"),
- t("login.an_unexpected_error_occured"),
+ t("login.an_unexpected_error_occurred"),
);
}
} finally {
@@ -499,7 +499,7 @@ export const TVLogin: React.FC = () => {
const message =
error instanceof Error
? error.message
- : t("login.an_unexpected_error_occured");
+ : t("login.an_unexpected_error_occurred");
Alert.alert(t("login.connection_failed"), message);
goToQRScreen();
} finally {
@@ -523,7 +523,7 @@ export const TVLogin: React.FC = () => {
} else {
Alert.alert(
t("login.connection_failed"),
- t("login.an_unexpected_error_occured"),
+ t("login.an_unexpected_error_occurred"),
);
}
} finally {
@@ -768,7 +768,7 @@ export const TVLogin: React.FC = () => {
const message =
error instanceof Error
? error.message
- : t("login.an_unexpected_error_occured");
+ : t("login.an_unexpected_error_occurred");
Alert.alert(t("login.connection_failed"), message);
goToQRScreen();
});
diff --git a/components/posters/ItemPoster.tsx b/components/posters/ItemPoster.tsx
index bcd857e79..9990727be 100644
--- a/components/posters/ItemPoster.tsx
+++ b/components/posters/ItemPoster.tsx
@@ -1,8 +1,8 @@
import { type BaseItemDto } from "@jellyfin/sdk/lib/generated-client/models";
import { useState } from "react";
import { View, type ViewProps } from "react-native";
+import { WatchedIndicator } from "@/components/WatchedIndicator";
import { ItemImage } from "../common/ItemImage";
-import { WatchedIndicator } from "../WatchedIndicator";
interface Props extends ViewProps {
item: BaseItemDto;
diff --git a/components/posters/SeriesPoster.tsx b/components/posters/SeriesPoster.tsx
index 07f212d7f..82cf146c7 100644
--- a/components/posters/SeriesPoster.tsx
+++ b/components/posters/SeriesPoster.tsx
@@ -3,6 +3,7 @@ import { Image } from "expo-image";
import { useAtom } from "jotai";
import { useMemo } from "react";
import { View } from "react-native";
+import { WatchedIndicator } from "@/components/WatchedIndicator";
import { apiAtom } from "@/providers/JellyfinProvider";
import { getPrimaryImageUrl } from "@/utils/jellyfin/image/getPrimaryImageUrl";
@@ -52,6 +53,7 @@ const SeriesPoster: React.FC = ({ item }) => {
width: "100%",
}}
/>
+
);
};
diff --git a/components/settings/QuickConnect.tsx b/components/settings/QuickConnect.tsx
index 725e7e6fa..643a902d2 100644
--- a/components/settings/QuickConnect.tsx
+++ b/components/settings/QuickConnect.tsx
@@ -58,7 +58,7 @@ export const QuickConnect: React.FC = ({ ...props }) => {
successHapticFeedback();
Alert.alert(
t("home.settings.quick_connect.success"),
- t("home.settings.quick_connect.quick_connect_autorized"),
+ t("home.settings.quick_connect.quick_connect_authorized"),
);
setQuickConnectCode(undefined);
bottomSheetModalRef?.current?.close();
diff --git a/components/tv/TVPosterCard.tsx b/components/tv/TVPosterCard.tsx
index 6c20075fd..9a24a5034 100644
--- a/components/tv/TVPosterCard.tsx
+++ b/components/tv/TVPosterCard.tsx
@@ -12,7 +12,10 @@ import {
} from "react-native";
import { ProgressBar } from "@/components/common/ProgressBar";
import { Text } from "@/components/common/Text";
-import { WatchedIndicator } from "@/components/WatchedIndicator";
+import {
+ UnplayedCountBadge,
+ WatchedIndicator,
+} from "@/components/WatchedIndicator";
import { useScaledTVPosterSizes } from "@/constants/TVPosterSizes";
import { useScaledTVTypography } from "@/constants/TVTypography";
import {
@@ -427,6 +430,12 @@ export const TVPosterCard: React.FC = ({
/>
{PlayButtonOverlay}
{NowPlayingBadge}
+ {/*
+ The glass view draws the watched checkmark natively but cannot show
+ an unplayed-episode count, so render it as an RN overlay on top.
+ Returns null when not applicable (non-series / fully watched).
+ */}
+ {showWatchedIndicator && }
);
}
@@ -459,7 +468,7 @@ export const TVPosterCard: React.FC = ({
/>
{PlayButtonOverlay}
{NowPlayingBadge}
-
+ {showWatchedIndicator && }
);
diff --git a/components/video-player/controls/TVSubtitleSheet.tsx b/components/video-player/controls/TVSubtitleSheet.tsx
deleted file mode 100644
index 6284b5660..000000000
--- a/components/video-player/controls/TVSubtitleSheet.tsx
+++ /dev/null
@@ -1,560 +0,0 @@
-import { Ionicons } from "@expo/vector-icons";
-import type {
- BaseItemDto,
- MediaStream,
-} from "@jellyfin/sdk/lib/generated-client";
-import { BlurView } from "expo-blur";
-import React, {
- useCallback,
- useEffect,
- useMemo,
- useRef,
- useState,
-} from "react";
-import { useTranslation } from "react-i18next";
-import {
- ActivityIndicator,
- Animated,
- Easing,
- ScrollView,
- StyleSheet,
- TVFocusGuideView,
- View,
-} from "react-native";
-import { Text } from "@/components/common/Text";
-import {
- TVCancelButton,
- TVLanguageCard,
- TVSubtitleResultCard,
- TVTabButton,
- TVTrackCard,
-} from "@/components/tv";
-import {
- type SubtitleSearchResult,
- useRemoteSubtitles,
-} from "@/hooks/useRemoteSubtitles";
-import { COMMON_SUBTITLE_LANGUAGES } from "@/utils/opensubtitles/api";
-
-interface TVSubtitleSheetProps {
- visible: boolean;
- item: BaseItemDto;
- mediaSourceId?: string | null;
- subtitleTracks: MediaStream[];
- currentSubtitleIndex: number;
- onSubtitleIndexChange: (index: number) => void;
- onClose: () => void;
- onServerSubtitleDownloaded?: () => void;
- onLocalSubtitleDownloaded?: (path: string) => void;
-}
-
-type TabType = "tracks" | "download";
-
-export const TVSubtitleSheet: React.FC = ({
- visible,
- item,
- mediaSourceId,
- subtitleTracks,
- currentSubtitleIndex,
- onSubtitleIndexChange,
- onClose,
- onServerSubtitleDownloaded,
- onLocalSubtitleDownloaded,
-}) => {
- const { t } = useTranslation();
-
- console.log(
- "[TVSubtitleSheet] visible:",
- visible,
- "tracks:",
- subtitleTracks.length,
- );
- const [activeTab, setActiveTab] = useState("tracks");
- const [selectedLanguage, setSelectedLanguage] = useState("eng");
- const [downloadingId, setDownloadingId] = useState(null);
- const [hasSearchedThisSession, setHasSearchedThisSession] = useState(false);
- const [isReady, setIsReady] = useState(false);
- const [isTabContentReady, setIsTabContentReady] = useState(false);
- const firstTrackRef = useRef(null);
-
- const {
- hasOpenSubtitlesApiKey,
- isSearching,
- searchError,
- searchResults,
- search,
- downloadAsync,
- reset,
- } = useRemoteSubtitles({
- itemId: item.Id ?? "",
- item,
- mediaSourceId,
- });
-
- const resetRef = useRef(reset);
- resetRef.current = reset;
-
- const overlayOpacity = useRef(new Animated.Value(0)).current;
- const sheetTranslateY = useRef(new Animated.Value(300)).current;
-
- const initialSelectedTrackIndex = useMemo(() => {
- if (currentSubtitleIndex === -1) return 0;
- const trackIdx = subtitleTracks.findIndex(
- (t) => t.Index === currentSubtitleIndex,
- );
- return trackIdx >= 0 ? trackIdx + 1 : 0;
- }, [subtitleTracks, currentSubtitleIndex]);
-
- useEffect(() => {
- if (visible) {
- overlayOpacity.setValue(0);
- sheetTranslateY.setValue(300);
-
- Animated.parallel([
- Animated.timing(overlayOpacity, {
- toValue: 1,
- duration: 250,
- easing: Easing.out(Easing.quad),
- useNativeDriver: true,
- }),
- Animated.timing(sheetTranslateY, {
- toValue: 0,
- duration: 300,
- easing: Easing.out(Easing.cubic),
- useNativeDriver: true,
- }),
- ]).start();
- }
- }, [visible, overlayOpacity, sheetTranslateY]);
-
- useEffect(() => {
- if (!visible) {
- setHasSearchedThisSession(false);
- setActiveTab("tracks");
- resetRef.current();
- setIsReady(false);
- }
- }, [visible]);
-
- useEffect(() => {
- if (visible) {
- const timer = setTimeout(() => setIsReady(true), 100);
- return () => clearTimeout(timer);
- }
- setIsReady(false);
- }, [visible]);
-
- useEffect(() => {
- if (visible && activeTab === "download" && !hasSearchedThisSession) {
- search({ language: selectedLanguage });
- setHasSearchedThisSession(true);
- }
- }, [visible, activeTab, hasSearchedThisSession, search, selectedLanguage]);
-
- useEffect(() => {
- if (isReady) {
- setIsTabContentReady(false);
- const timer = setTimeout(() => setIsTabContentReady(true), 50);
- return () => clearTimeout(timer);
- }
- setIsTabContentReady(false);
- }, [activeTab, isReady]);
-
- const handleLanguageSelect = useCallback(
- (code: string) => {
- setSelectedLanguage(code);
- search({ language: code });
- },
- [search],
- );
-
- const handleTrackSelect = useCallback(
- (index: number) => {
- onSubtitleIndexChange(index);
- onClose();
- },
- [onSubtitleIndexChange, onClose],
- );
-
- const handleDownload = useCallback(
- async (result: SubtitleSearchResult) => {
- setDownloadingId(result.id);
-
- try {
- const downloadResult = await downloadAsync(result);
-
- if (downloadResult.type === "server") {
- onServerSubtitleDownloaded?.();
- } else if (downloadResult.type === "local" && downloadResult.path) {
- onLocalSubtitleDownloaded?.(downloadResult.path);
- }
-
- onClose();
- } catch (error) {
- console.error("Failed to download subtitle:", error);
- } finally {
- setDownloadingId(null);
- }
- },
- [
- downloadAsync,
- onServerSubtitleDownloaded,
- onLocalSubtitleDownloaded,
- onClose,
- ],
- );
-
- const displayLanguages = useMemo(
- () => COMMON_SUBTITLE_LANGUAGES.slice(0, 16),
- [],
- );
-
- const trackOptions = useMemo(() => {
- const noneOption = {
- label: t("item_card.subtitles.none"),
- sublabel: undefined as string | undefined,
- value: -1,
- selected: currentSubtitleIndex === -1,
- };
- const options = subtitleTracks.map((track) => ({
- label:
- track.DisplayTitle || `${track.Language || "Unknown"} (${track.Codec})`,
- sublabel: track.Codec?.toUpperCase(),
- value: track.Index!,
- selected: track.Index === currentSubtitleIndex,
- }));
- return [noneOption, ...options];
- }, [subtitleTracks, currentSubtitleIndex, t]);
-
- if (!visible) return null;
-
- return (
-
-
-
-
- {/* Header with tabs */}
-
-
- {t("item_card.subtitles.label") || "Subtitles"}
-
-
- {/* Tab bar */}
-
- setActiveTab("tracks")}
- />
- setActiveTab("download")}
- />
-
-
-
- {/* Tracks Tab Content */}
- {activeTab === "tracks" && isTabContentReady && (
-
-
- {trackOptions.map((option, index) => (
- handleTrackSelect(option.value)}
- />
- ))}
-
-
- )}
-
- {/* Download Tab Content */}
- {activeTab === "download" && isTabContentReady && (
- <>
- {/* Language Selector */}
-
-
- {t("player.language") || "Language"}
-
-
- {displayLanguages.map((lang, index) => (
- handleLanguageSelect(lang.code)}
- />
- ))}
-
-
-
- {/* Results Section */}
-
-
- {t("player.results") || "Results"}
- {searchResults && ` (${searchResults.length})`}
-
-
- {/* Loading state */}
- {isSearching && (
-
-
-
- {t("player.searching") || "Searching..."}
-
-
- )}
-
- {/* Error state */}
- {searchError && !isSearching && (
-
-
-
- {t("player.search_failed") || "Search failed"}
-
-
- {!hasOpenSubtitlesApiKey
- ? t("player.no_subtitle_provider") ||
- "No subtitle provider configured on server"
- : String(searchError)}
-
-
- )}
-
- {/* No results */}
- {searchResults &&
- searchResults.length === 0 &&
- !isSearching &&
- !searchError && (
-
-
-
- {t("player.no_subtitles_found") ||
- "No subtitles found"}
-
-
- )}
-
- {/* Results list */}
- {searchResults &&
- searchResults.length > 0 &&
- !isSearching && (
-
- {searchResults.map((result, index) => (
- handleDownload(result)}
- />
- ))}
-
- )}
-
-
- {/* API Key hint if no fallback available */}
- {!hasOpenSubtitlesApiKey && (
-
-
-
- {t("player.add_opensubtitles_key_hint") ||
- "Add OpenSubtitles API key in settings for client-side fallback"}
-
-
- )}
- >
- )}
-
- {/* Cancel button */}
- {isReady && (
-
-
-
- )}
-
-
-
-
- );
-};
-
-const styles = StyleSheet.create({
- overlay: {
- position: "absolute",
- top: 0,
- left: 0,
- right: 0,
- bottom: 0,
- backgroundColor: "rgba(0, 0, 0, 0.6)",
- justifyContent: "flex-end",
- zIndex: 1000,
- },
- sheetContainer: {
- maxHeight: "70%",
- },
- blurContainer: {
- borderTopLeftRadius: 24,
- borderTopRightRadius: 24,
- overflow: "hidden",
- },
- content: {
- paddingTop: 24,
- paddingBottom: 48,
- },
- header: {
- paddingHorizontal: 48,
- marginBottom: 20,
- },
- title: {
- fontSize: 24,
- fontWeight: "600",
- color: "#fff",
- marginBottom: 16,
- },
- tabRow: {
- flexDirection: "row",
- gap: 24,
- },
- section: {
- marginBottom: 20,
- },
- sectionTitle: {
- fontSize: 14,
- fontWeight: "500",
- color: "rgba(255,255,255,0.5)",
- textTransform: "uppercase",
- letterSpacing: 1,
- marginBottom: 12,
- paddingHorizontal: 48,
- },
- tracksScroll: {
- overflow: "visible",
- },
- tracksScrollContent: {
- paddingHorizontal: 48,
- paddingVertical: 8,
- gap: 12,
- },
- languageScroll: {
- overflow: "visible",
- },
- languageScrollContent: {
- paddingHorizontal: 48,
- paddingVertical: 8,
- gap: 10,
- },
- resultsScroll: {
- overflow: "visible",
- },
- resultsScrollContent: {
- paddingHorizontal: 48,
- paddingVertical: 8,
- gap: 12,
- },
- loadingContainer: {
- paddingVertical: 40,
- alignItems: "center",
- },
- loadingText: {
- color: "rgba(255,255,255,0.6)",
- marginTop: 12,
- fontSize: 14,
- },
- errorContainer: {
- paddingVertical: 40,
- paddingHorizontal: 48,
- alignItems: "center",
- },
- errorText: {
- color: "rgba(255,100,100,0.9)",
- marginTop: 8,
- fontSize: 16,
- fontWeight: "500",
- },
- errorHint: {
- color: "rgba(255,255,255,0.5)",
- marginTop: 4,
- fontSize: 13,
- textAlign: "center",
- },
- emptyContainer: {
- paddingVertical: 40,
- alignItems: "center",
- },
- emptyText: {
- color: "rgba(255,255,255,0.5)",
- marginTop: 8,
- fontSize: 14,
- },
- apiKeyHint: {
- flexDirection: "row",
- alignItems: "center",
- gap: 8,
- paddingHorizontal: 48,
- paddingTop: 8,
- },
- apiKeyHintText: {
- color: "rgba(255,255,255,0.4)",
- fontSize: 12,
- },
- cancelButtonContainer: {
- paddingHorizontal: 48,
- paddingTop: 20,
- alignItems: "flex-start",
- },
-});
diff --git a/providers/JellyfinProvider.tsx b/providers/JellyfinProvider.tsx
index 52647bde7..137709948 100644
--- a/providers/JellyfinProvider.tsx
+++ b/providers/JellyfinProvider.tsx
@@ -386,7 +386,7 @@ export const JellyfinProvider: React.FC<{ children: ReactNode }> = ({
default:
throw new Error(
t(
- "login.an_unexpected_error_occured_did_you_enter_the_correct_url",
+ "login.an_unexpected_error_occurred_did_you_enter_the_correct_url",
),
);
}
diff --git a/translations/ar.json b/translations/ar.json
index ce1e00cd5..ec2e796c6 100644
--- a/translations/ar.json
+++ b/translations/ar.json
@@ -484,7 +484,6 @@
},
"common": {
"no_results": "No Results",
- "select": "اختر",
"no_trailer_available": "لا يوجد مقطع دعائي متوفر",
"video": "فيديو",
"audio": "الصوت",
@@ -621,7 +620,6 @@
"using_jellyfin_server": "Using Jellyfin Server",
"language": "Language",
"results": "Results",
- "searching": "Searching...",
"search_failed": "Search failed",
"no_subtitle_provider": "No subtitle provider configured on server",
"no_subtitles_found": "No subtitles found",
diff --git a/translations/ca.json b/translations/ca.json
index fb9ea6ba8..b296a8874 100644
--- a/translations/ca.json
+++ b/translations/ca.json
@@ -484,7 +484,6 @@
},
"common": {
"no_results": "No Results",
- "select": "Select",
"no_trailer_available": "No trailer available",
"video": "Vídeo",
"audio": "Àudio",
@@ -621,7 +620,6 @@
"using_jellyfin_server": "Using Jellyfin Server",
"language": "Language",
"results": "Results",
- "searching": "Searching...",
"search_failed": "Search failed",
"no_subtitle_provider": "No subtitle provider configured on server",
"no_subtitles_found": "No subtitles found",
diff --git a/translations/cs.json b/translations/cs.json
index da81ce087..cdfb6ebc3 100644
--- a/translations/cs.json
+++ b/translations/cs.json
@@ -484,7 +484,6 @@
},
"common": {
"no_results": "No Results",
- "select": "Vybrat",
"no_trailer_available": "Přípojné vozidlo není k dispozici",
"video": "Video",
"audio": "Zvuk",
@@ -621,7 +620,6 @@
"using_jellyfin_server": "Using Jellyfin Server",
"language": "Language",
"results": "Results",
- "searching": "Searching...",
"search_failed": "Search failed",
"no_subtitle_provider": "No subtitle provider configured on server",
"no_subtitles_found": "No subtitles found",
diff --git a/translations/da.json b/translations/da.json
index 95e2f6d6e..44039430d 100644
--- a/translations/da.json
+++ b/translations/da.json
@@ -484,7 +484,6 @@
},
"common": {
"no_results": "No Results",
- "select": "Vælg",
"no_trailer_available": "Intet påhængskøretøj tilgængeligt",
"video": "Video",
"audio": "Lyd",
@@ -621,7 +620,6 @@
"using_jellyfin_server": "Using Jellyfin Server",
"language": "Language",
"results": "Results",
- "searching": "Searching...",
"search_failed": "Search failed",
"no_subtitle_provider": "No subtitle provider configured on server",
"no_subtitles_found": "No subtitles found",
diff --git a/translations/de.json b/translations/de.json
index 6363bb039..c3c8d3021 100644
--- a/translations/de.json
+++ b/translations/de.json
@@ -484,7 +484,6 @@
},
"common": {
"no_results": "No Results",
- "select": "Auswählen",
"no_trailer_available": "Kein Trailer verfügbar",
"video": "Video",
"audio": "Audio",
@@ -621,7 +620,6 @@
"using_jellyfin_server": "Using Jellyfin Server",
"language": "Sprache",
"results": "Ergebnisse",
- "searching": "Suche ...",
"search_failed": "Suche fehlgeschlagen",
"no_subtitle_provider": "Kein Untertitelanbieter auf dem Server konfiguriert",
"no_subtitles_found": "Keine Untertitel gefunden",
diff --git a/translations/el.json b/translations/el.json
index f8ba3917d..b5be9db7c 100644
--- a/translations/el.json
+++ b/translations/el.json
@@ -484,7 +484,6 @@
},
"common": {
"no_results": "No Results",
- "select": "Επιλογή",
"no_trailer_available": "Δεν υπάρχει διαθέσιμο ρυμουλκούμενο",
"video": "Βίντεο",
"audio": "Ήχος",
@@ -621,7 +620,6 @@
"using_jellyfin_server": "Using Jellyfin Server",
"language": "Language",
"results": "Results",
- "searching": "Searching...",
"search_failed": "Search failed",
"no_subtitle_provider": "No subtitle provider configured on server",
"no_subtitles_found": "No subtitles found",
diff --git a/translations/en.json b/translations/en.json
index f3bf6eec1..74c906f5a 100644
--- a/translations/en.json
+++ b/translations/en.json
@@ -16,14 +16,14 @@
"got_it": "Got it",
"connection_failed": "Connection failed",
"could_not_connect_to_server": "Could not connect to the server. Please check the URL and your network connection.",
- "an_unexpected_error_occured": "An unexpected error occurred",
+ "an_unexpected_error_occurred": "An unexpected error occurred",
"change_server": "Change server",
"invalid_username_or_password": "Invalid username or password",
"user_does_not_have_permission_to_log_in": "User does not have permission to log in",
"server_is_taking_too_long_to_respond_try_again_later": "Server is taking too long to respond, try again later",
"server_received_too_many_requests_try_again_later": "Server received too many requests, try again later.",
"there_is_a_server_error": "There is a server error",
- "an_unexpected_error_occured_did_you_enter_the_correct_url": "An unexpected error occurred. Did you enter the server URL correctly?",
+ "an_unexpected_error_occurred_did_you_enter_the_correct_url": "An unexpected error occurred. Did you enter the server URL correctly?",
"too_old_server_text": "Unsupported Jellyfin server discovered",
"too_old_server_description": "Please update Jellyfin to the latest version"
},
@@ -191,7 +191,7 @@
"authorize_button": "Authorize Quick Connect",
"enter_the_quick_connect_code": "Enter the Quick Connect code...",
"success": "Success",
- "quick_connect_autorized": "Quick Connect authorized",
+ "quick_connect_authorized": "Quick Connect authorized",
"error": "Error",
"invalid_code": "Invalid code",
"authorize": "Authorize"
@@ -301,7 +301,7 @@
"show_custom_menu_links": "Show custom menu links",
"show_large_home_carousel": "Show large home carousel (beta)",
"hide_libraries": "Hide libraries",
- "select_liraries_you_want_to_hide": "Select the libraries you want to hide from the Library tab and home page sections.",
+ "select_libraries_you_want_to_hide": "Select the libraries you want to hide from the Library tab and home page sections.",
"disable_haptic_feedback": "Disable haptic feedback",
"default_quality": "Default quality",
"default_playback_speed": "Default playback speed",
@@ -487,7 +487,6 @@
},
"common": {
"no_results": "No results",
- "select": "Select",
"no_trailer_available": "No trailer available",
"video": "Video",
"audio": "Audio",
@@ -602,7 +601,7 @@
"mpv_player_title": "MPV player",
"error": "Error",
"failed_to_get_stream_url": "Failed to get the stream URL",
- "an_error_occured_while_playing_the_video": "An error occurred while playing the video. Check logs in settings.",
+ "an_error_occurred_while_playing_the_video": "An error occurred while playing the video. Check logs in settings.",
"client_error": "Client error",
"could_not_create_stream_for_chromecast": "Could not create a stream for Chromecast",
"message_from_server": "Message from server: {{message}}",
@@ -624,7 +623,6 @@
"using_jellyfin_server": "Using Jellyfin server",
"language": "Language",
"results": "Results",
- "searching": "Searching...",
"search_failed": "Search failed",
"no_subtitle_provider": "No subtitle provider configured on server",
"no_subtitles_found": "No subtitles found",
diff --git a/translations/es.json b/translations/es.json
index 57f30e9bf..9cc32a747 100644
--- a/translations/es.json
+++ b/translations/es.json
@@ -484,7 +484,6 @@
},
"common": {
"no_results": "No Results",
- "select": "Seleccionar",
"no_trailer_available": "No hay tráiler disponible",
"video": "Vídeo",
"audio": "Audio",
@@ -621,7 +620,6 @@
"using_jellyfin_server": "Using Jellyfin Server",
"language": "Language",
"results": "Results",
- "searching": "Searching...",
"search_failed": "Search failed",
"no_subtitle_provider": "No subtitle provider configured on server",
"no_subtitles_found": "No subtitles found",
diff --git a/translations/fi.json b/translations/fi.json
index 471b3c29e..acfe6fbcf 100644
--- a/translations/fi.json
+++ b/translations/fi.json
@@ -484,7 +484,6 @@
},
"common": {
"no_results": "No Results",
- "select": "Valitse",
"no_trailer_available": "Perävaunua ei saatavilla",
"video": "Video",
"audio": "Ääni",
@@ -621,7 +620,6 @@
"using_jellyfin_server": "Using Jellyfin Server",
"language": "Language",
"results": "Results",
- "searching": "Searching...",
"search_failed": "Search failed",
"no_subtitle_provider": "No subtitle provider configured on server",
"no_subtitles_found": "No subtitles found",
diff --git a/translations/fr.json b/translations/fr.json
index daf35a820..cdd1a457e 100644
--- a/translations/fr.json
+++ b/translations/fr.json
@@ -4,9 +4,9 @@
"error_title": "Erreur",
"login_title": "Se connecter",
"login_to_title": "Se connecter à",
- "select_user": "Select a user to log in",
- "add_user_to_login": "Add a user to log in",
- "add_user": "Add User",
+ "select_user": "Sélectionnez un utilisateur pour vous connecter",
+ "add_user_to_login": "Ajouter un utilisateur pour se connecter",
+ "add_user": "Ajouter un utilisateur",
"username_placeholder": "Nom d'utilisateur",
"password_placeholder": "Mot de passe",
"login_button": "Se connecter",
@@ -42,19 +42,19 @@
"please_login_again": "Votre session enregistrée a expiré. Veuillez vous connecter à nouveau.",
"remove_saved_login": "Supprimer l'identifiant enregistré",
"remove_saved_login_description": "Cela supprimera vos identifiants enregistrés pour ce serveur. Vous devrez saisir à nouveau votre nom d’utilisateur et votre mot de passe la prochaine fois.",
- "accounts_count": "Comptes {{count}}",
+ "accounts_count": "{{count}} comptes",
"select_account": "Sélectionnez un compte",
"add_account": "Ajouter un compte",
"remove_account_description": "Cela supprimera les identifiants enregistrés pour {{username}}.",
- "remove_server": "Remove Server",
- "remove_server_description": "This will remove {{server}} and all saved accounts from your list.",
- "select_your_server": "Select Your Server",
- "add_server_to_get_started": "Add a server to get started",
- "add_server": "Add Server",
- "change_server": "Change Server"
+ "remove_server": "Supprimer le serveur",
+ "remove_server_description": "Ceci supprimera {{server}} et tous les comptes enregistrés de votre liste.",
+ "select_your_server": "Sélectionnez votre serveur",
+ "add_server_to_get_started": "Ajouter un serveur pour commencer",
+ "add_server": "Ajouter un serveur",
+ "change_server": "Changer de serveur"
},
"save_account": {
- "title": "Sauvegarder le compte",
+ "title": "Enregistrer le compte",
"save_for_later": "Enregistrer ce compte",
"security_option": "Options de sécurité",
"no_protection": "Aucune protection",
@@ -95,9 +95,9 @@
"oops": "Oups !",
"error_message": "Quelque chose s'est mal passé.\nVeuillez vous reconnecter à nouveau.",
"continue_watching": "Continuer à regarder",
- "continue": "Continue",
+ "continue": "Continuer",
"next_up": "À suivre",
- "continue_and_next_up": "Continuer de regarder et à suivre",
+ "continue_and_next_up": "Continuer à regarder et à suivre",
"recently_added_in": "Ajoutés récemment dans {{libraryName}}",
"suggested_movies": "Films suggérés",
"suggested_episodes": "Épisodes suggérés",
@@ -120,10 +120,10 @@
"settings_title": "Paramètres",
"log_out_button": "Déconnexion",
"switch_user": {
- "title": "Switch User",
- "account": "Account",
- "switch_user": "Switch User on This Server",
- "current": "current"
+ "title": "Changer d'utilisateur",
+ "account": "Compte",
+ "switch_user": "Changer d'utilisateur sur ce serveur",
+ "current": "actuel"
},
"categories": {
"title": "Catégories"
@@ -136,32 +136,32 @@
},
"appearance": {
"title": "Apparence",
- "merge_next_up_continue_watching": "Fusionner, continuer à regarder et à suivre",
+ "merge_next_up_continue_watching": "Fusionner « Continuer à regarder » et « À suivre »",
"hide_remote_session_button": "Masquer le bouton de session distante",
- "show_home_backdrop": "Dynamic Home Backdrop",
- "show_hero_carousel": "Hero Carousel",
- "show_series_poster_on_episode": "Show Series Poster on Episodes",
- "theme_music": "Theme Music",
- "display_size": "Display Size",
- "display_size_small": "Small",
- "display_size_default": "Default",
- "display_size_large": "Large",
- "display_size_extra_large": "Extra Large"
+ "show_home_backdrop": "Arrière-plan d'accueil dynamique",
+ "show_hero_carousel": "Carrousel principal",
+ "show_series_poster_on_episode": "Afficher l'affiche de la série sur les épisodes",
+ "theme_music": "Musique de thème",
+ "display_size": "Taille d'affichage",
+ "display_size_small": "Petite",
+ "display_size_default": "Par défaut",
+ "display_size_large": "Grande",
+ "display_size_extra_large": "Très grande"
},
"network": {
"title": "Réseau",
"local_network": "Réseau local",
- "auto_switch_enabled": "Basculement automatique quand à la maison",
+ "auto_switch_enabled": "Basculement automatique à la maison",
"auto_switch_description": "Basculer automatiquement vers l'URL locale lorsque vous êtes connecté au Wi-Fi de la maison",
"local_url": "URL locale",
- "local_url_hint": "Entrez l'adresse de votre serveur local (exemple, http://192.168.1.100:8096)",
+ "local_url_hint": "Entrez l'adresse de votre serveur local (par exemple http://192.168.1.100:8096)",
"local_url_placeholder": "http://192.168.1.100:8096",
"home_wifi_networks": "Réseaux Wi-Fi domestiques",
"add_current_network": "Ajouter \"{{ssid}}\"",
- "not_connected_to_wifi": "Non connecté au WiFi",
+ "not_connected_to_wifi": "Non connecté au Wi-Fi",
"no_networks_configured": "Pas de réseau configuré",
- "add_network_hint": "Ajouter votre réseau Wi-Fi domestique pour activer la commutation automatique",
- "current_wifi": "WiFi actuel",
+ "add_network_hint": "Ajouter votre réseau Wi-Fi domestique pour activer le basculement automatique",
+ "current_wifi": "Wi-Fi actuel",
"using_url": "Utilisant",
"local": "URL locale",
"remote": "URL à distance",
@@ -172,9 +172,9 @@
"not_configured": "Non configuré",
"network_added": "Réseau ajouté",
"network_already_added": "Réseau déjà ajouté",
- "no_wifi_connected": "Non connecté au WiFi",
+ "no_wifi_connected": "Non connecté au Wi-Fi",
"permission_denied": "Autorisation de localisation refusée",
- "permission_denied_explanation": "Une autorisation de localisation est requise pour détecter le réseau Wifi afin de changer automatiquement. Veuillez l’activer dans les paramètres."
+ "permission_denied_explanation": "Une autorisation de localisation est requise pour détecter le réseau Wi-Fi afin de basculer automatiquement. Veuillez l'activer dans les paramètres."
},
"user_info": {
"user_info_title": "Informations utilisateur",
@@ -184,35 +184,35 @@
"app_version": "Version de l'application"
},
"quick_connect": {
- "quick_connect_title": "Connexion Rapide",
- "authorize_button": "Autoriser une Connexion Rapide",
- "enter_the_quick_connect_code": "Entrez le code de Connexion Rapide...",
+ "quick_connect_title": "Connexion rapide",
+ "authorize_button": "Autoriser une connexion rapide",
+ "enter_the_quick_connect_code": "Entrez le code de connexion rapide...",
"success": "Succès",
- "quick_connect_autorized": "Connexion Rapide autorisé",
+ "quick_connect_autorized": "Connexion rapide autorisée",
"error": "Erreur",
"invalid_code": "Code invalide",
"authorize": "Autoriser"
},
"media_controls": {
- "media_controls_title": "Contrôles Média",
+ "media_controls_title": "Contrôles média",
"forward_skip_length": "Durée de saut en avant",
"rewind_length": "Durée de retour en arrière",
"seconds_unit": "s"
},
"buffer": {
- "title": "Buffer Settings",
- "cache_mode": "Cache Mode",
+ "title": "Paramètres du tampon",
+ "cache_mode": "Mode de cache",
"cache_auto": "Auto",
- "cache_yes": "Enabled",
- "cache_no": "Disabled",
- "buffer_duration": "Buffer Duration",
- "max_cache_size": "Max Cache Size",
- "max_backward_cache": "Max Backward Cache"
+ "cache_yes": "Activé",
+ "cache_no": "Désactivé",
+ "buffer_duration": "Durée du tampon",
+ "max_cache_size": "Taille maximale du cache",
+ "max_backward_cache": "Cache arrière maximal"
},
"vo_driver": {
- "title": "Video Output",
- "vo_mode": "VO Driver",
- "gpu_next": "gpu-next (Recommended)",
+ "title": "Sortie vidéo",
+ "vo_mode": "Pilote VO",
+ "gpu_next": "gpu-next (Recommandé)",
"gpu": "gpu"
},
"gesture_controls": {
@@ -225,8 +225,8 @@
"right_side_volume_description": "Glisser vers le haut/bas sur le côté droit pour ajuster le volume",
"hide_volume_slider": "Masquer le curseur de volume",
"hide_volume_slider_description": "Masquer le curseur de volume dans le lecteur vidéo",
- "hide_brightness_slider": "Cacher le curseur de luminosité",
- "hide_brightness_slider_description": "Masquer le curseur de volume dans le lecteur vidéo"
+ "hide_brightness_slider": "Masquer le curseur de luminosité",
+ "hide_brightness_slider_description": "Masquer le curseur de luminosité dans le lecteur vidéo"
},
"audio": {
"audio_title": "Audio",
@@ -234,14 +234,14 @@
"audio_language": "Langue audio",
"audio_hint": "Choisissez une langue audio par défaut.",
"none": "Aucune",
- "language": "Langage",
+ "language": "Langue",
"transcode_mode": {
"title": "Transcodage audio",
"description": "Contrôle la gestion de l'audio surround (7.1, TrueHD, DTS-HD)",
"auto": "Auto",
"stereo": "Forcer la stéréo",
"5_1": "Autoriser 5.1",
- "passthrough": "Intercommunication"
+ "passthrough": "Passthrough"
}
},
"subtitles": {
@@ -252,7 +252,7 @@
"set_subtitle_track": "Piste de sous-titres de l'élément précédent",
"subtitle_size": "Taille des sous-titres",
"none": "Aucune",
- "language": "Langage",
+ "language": "Langue",
"loading": "Chargement",
"modes": {
"Default": "Par défaut",
@@ -262,20 +262,20 @@
"OnlyForced": "Forcés seulement"
},
"opensubtitles_title": "OpenSubtitles",
- "opensubtitles_hint": "Enter your OpenSubtitles API key to enable client-side subtitle search as a fallback when your Jellyfin server doesn't have a subtitle provider configured.",
- "opensubtitles_api_key": "API Key",
- "opensubtitles_api_key_placeholder": "Enter API key...",
- "opensubtitles_get_key": "Get your free API key at opensubtitles.com/en/consumers",
- "mpv_subtitle_scale": "Subtitle Scale",
- "mpv_subtitle_margin_y": "Vertical Margin",
- "mpv_subtitle_align_x": "Horizontal Align",
- "mpv_subtitle_align_y": "Vertical Align",
+ "opensubtitles_hint": "Entrez votre clé API OpenSubtitles pour activer la recherche de sous-titres côté client comme solution de secours lorsque votre serveur Jellyfin n'a pas de fournisseur de sous-titres configuré.",
+ "opensubtitles_api_key": "Clé API",
+ "opensubtitles_api_key_placeholder": "Entrez la clé API...",
+ "opensubtitles_get_key": "Obtenez votre clé API gratuite sur opensubtitles.com/fr/consumers",
+ "mpv_subtitle_scale": "Échelle des sous-titres",
+ "mpv_subtitle_margin_y": "Marge verticale",
+ "mpv_subtitle_align_x": "Alignement horizontal",
+ "mpv_subtitle_align_y": "Alignement vertical",
"align": {
- "left": "Left",
- "center": "Center",
- "right": "Right",
- "top": "Top",
- "bottom": "Bottom"
+ "left": "Gauche",
+ "center": "Centre",
+ "right": "Droite",
+ "top": "Haut",
+ "bottom": "Bas"
}
},
"other": {
@@ -283,38 +283,38 @@
"video_orientation": "Orientation vidéo",
"orientation": "Orientation",
"orientations": {
- "DEFAULT": "Par défaut",
+ "DEFAULT": "Suivre l'orientation de l'appareil",
"ALL": "Toutes",
- "PORTRAIT": "Portrait",
- "PORTRAIT_UP": "Portrait Haut",
- "PORTRAIT_DOWN": "Portrait Bas",
- "LANDSCAPE": "Paysage",
- "LANDSCAPE_LEFT": "Paysage Gauche",
- "LANDSCAPE_RIGHT": "Paysage Droite",
+ "PORTRAIT": "Portrait auto",
+ "PORTRAIT_UP": "Portrait haut",
+ "PORTRAIT_DOWN": "Portrait bas",
+ "LANDSCAPE": "Paysage auto",
+ "LANDSCAPE_LEFT": "Paysage gauche",
+ "LANDSCAPE_RIGHT": "Paysage droite",
"OTHER": "Autre",
"UNKNOWN": "Inconnu"
},
"safe_area_in_controls": "Zone de sécurité dans les contrôles",
"show_custom_menu_links": "Afficher les liens personnalisés",
"show_large_home_carousel": "Afficher le grand carrousel d’accueil (bêta)",
- "hide_libraries": "Cacher des bibliothèques",
+ "hide_libraries": "Masquer les bibliothèques",
"select_liraries_you_want_to_hide": "Sélectionnez les bibliothèques que vous souhaitez masquer dans l'onglet Bibliothèque et les sections de la page d'accueil.",
"disable_haptic_feedback": "Désactiver le retour haptique",
"default_quality": "Qualité par défaut",
"default_playback_speed": "Vitesse de lecture par défaut",
"auto_play_next_episode": "Lecture automatique de l'épisode suivant",
- "max_auto_play_episode_count": "Nombre d'épisodes en lecture automatique max",
+ "max_auto_play_episode_count": "Nombre max d'épisodes en lecture automatique",
"disabled": "Désactivé"
},
"music": {
"title": "Musique",
"playback_title": "Lecture",
"playback_description": "Configurer le mode de lecture de la musique.",
- "prefer_downloaded": "Supprimer toutes les musiques téléchargées",
+ "prefer_downloaded": "Préférer les musiques téléchargées",
"caching_title": "Mise en cache",
"caching_description": "Mettre automatiquement en cache les pistes à venir pour une lecture plus fluide.",
- "lookahead_enabled": "Activer la mise en cache guidée",
- "lookahead_count": "Pistes à pré-mettre en cache",
+ "lookahead_enabled": "Activer la mise en cache anticipée",
+ "lookahead_count": "Pistes à mettre en cache à l'avance",
"max_cache_size": "Taille max de cache"
},
"plugins": {
@@ -333,7 +333,7 @@
"tv_quota_days": "Jours de quota de séries",
"reset_jellyseerr_config_button": "Réinitialiser la configuration Seerr",
"unlimited": "Illimité",
- "plus_n_more": "+{{n}} Plus",
+ "plus_n_more": "+{{n}} de plus",
"order_by": {
"DEFAULT": "Par défaut",
"VOTE_COUNT_AND_AVERAGE": "Nombre de votes et moyenne",
@@ -341,7 +341,7 @@
}
},
"marlin_search": {
- "enable_marlin_search": "Activer Marlin Search",
+ "enable_marlin_search": "Activer la recherche Marlin",
"url": "URL",
"server_url_placeholder": "http(s)://domaine.org:port",
"marlin_search_hint": "Entrez l'URL du serveur Marlin. L'URL devrait inclure http ou https et optionnellement le port.",
@@ -362,10 +362,10 @@
"features_title": "Fonctionnalités",
"enable_movie_recommendations": "Recommandations de films",
"enable_series_recommendations": "Recommandations de séries",
- "enable_promoted_watchlists": "Listes de lecture promues",
- "hide_watchlists_tab": "Masquer l'onglet des listes de lecture",
- "home_sections_hint": "Afficher des recommandations personnalisées et des listes de lecture promues de Streamystats sur la page d’accueil.",
- "recommended_movies": "Films Recommandés",
+ "enable_promoted_watchlists": "Listes de suivi promues",
+ "hide_watchlists_tab": "Masquer l'onglet des listes de suivi",
+ "home_sections_hint": "Afficher des recommandations personnalisées et des listes de suivi promues de Streamystats sur la page d’accueil.",
+ "recommended_movies": "Films recommandés",
"recommended_series": "Séries recommandées",
"toasts": {
"saved": "Enregistré",
@@ -375,7 +375,7 @@
"refresh_from_server": "Rafraîchir les paramètres depuis le serveur"
},
"kefinTweaks": {
- "watchlist_enabler": "Activer l'intégration de notre liste de lecture"
+ "watchlist_enabler": "Activer l'intégration de la liste de suivi"
}
},
"storage": {
@@ -392,10 +392,10 @@
"delete_all_downloaded_songs": "Supprimer toutes les musiques téléchargées",
"downloaded_songs_size": "{{size}} téléchargé",
"downloaded_songs_deleted": "Chansons téléchargées supprimées",
- "clear_all_cache": "Clear All Cache",
- "clear_all_cache_confirm": "Clear All Cache?",
- "clear_all_cache_confirm_desc": "Are you sure you want to clear all cached data? This will clear all cached images, music files, subtitles, and query caches. Your settings and login session will be kept.",
- "clear_all_cache_error_desc": "An error occurred while clearing the cache."
+ "clear_all_cache": "Effacer tout le cache",
+ "clear_all_cache_confirm": "Effacer tout le cache ?",
+ "clear_all_cache_confirm_desc": "Êtes-vous sûr de vouloir effacer toutes les données en cache ? Cela supprimera toutes les images, fichiers musicaux, sous-titres et caches de requêtes mis en cache. Vos paramètres et votre session de connexion seront conservés.",
+ "clear_all_cache_error_desc": "Une erreur est survenue lors de l'effacement du cache."
},
"intro": {
"title": "Introduction",
@@ -419,17 +419,17 @@
"error_deleting_files": "Erreur lors de la suppression des fichiers"
},
"security": {
- "title": "Security",
+ "title": "Sécurité",
"inactivity_timeout": {
- "title": "Inactivity Timeout",
- "disabled": "Disabled",
+ "title": "Délai d'inactivité",
+ "disabled": "Désactivé",
"1_minute": "1 minute",
"5_minutes": "5 minutes",
"15_minutes": "15 minutes",
"30_minutes": "30 minutes",
- "1_hour": "1 hour",
- "4_hours": "4 hours",
- "24_hours": "24 hours"
+ "1_hour": "1 heure",
+ "4_hours": "4 heures",
+ "24_hours": "24 heures"
}
}
},
@@ -446,7 +446,7 @@
"delete_all_movies_button": "Supprimer tous les films",
"delete_all_series_button": "Supprimer toutes les séries",
"delete_all_button": "Supprimer tous les médias",
- "delete_all_other_media_button": "Supprimer un autre média",
+ "delete_all_other_media_button": "Supprimer les autres médias",
"active_download": "Téléchargement actif",
"no_active_downloads": "Pas de téléchargements actifs",
"active_downloads": "Téléchargements actifs",
@@ -454,7 +454,7 @@
"new_app_version_requires_re_download_description": "La nouvelle mise à jour nécessite que le contenu soit téléchargé à nouveau. Veuillez supprimer tout le contenu téléchargé et réessayer.",
"back": "Retour",
"delete": "Supprimer",
- "delete_download": "Delete Download",
+ "delete_download": "Supprimer le téléchargement",
"something_went_wrong": "Quelque chose s'est mal passé",
"could_not_get_stream_url_from_jellyfin": "Impossible d'obtenir l'URL du flux depuis Jellyfin",
"eta": "ETA {{eta}}",
@@ -465,7 +465,7 @@
"deleted_all_series_successfully": "Toutes les séries ont été supprimées avec succès !",
"failed_to_delete_all_series": "Échec de la suppression de toutes les séries",
"deleted_media_successfully": "Les autres médias ont été supprimés avec succès !",
- "failed_to_delete_media": "Échec de la suppression d'un autre média",
+ "failed_to_delete_media": "Échec de la suppression des autres médias",
"download_cancelled": "Téléchargement annulé",
"could_not_delete_download": "Impossible de supprimer le téléchargement",
"download_completed": "Téléchargement terminé",
@@ -483,17 +483,16 @@
}
},
"common": {
- "no_results": "No Results",
- "select": "Sélectionner",
+ "no_results": "Aucun résultat",
"no_trailer_available": "Aucune bande-annonce disponible",
"video": "Vidéo",
"audio": "Audio",
"subtitle": "Sous-titres",
"play": "Lecture",
- "mark_as_played": "Mark as Played",
- "mark_as_not_played": "Mark as not Played",
+ "mark_as_played": "Marquer comme vu",
+ "mark_as_not_played": "Marquer comme non vu",
"none": "Aucun",
- "track": "Suivre",
+ "track": "Piste",
"cancel": "Annuler",
"delete": "Supprimer",
"ok": "Ok",
@@ -501,15 +500,15 @@
"back": "Précédent",
"continue": "Continuer",
"verifying": "Vérification...",
- "login": "Login",
- "episodes": "Episodes",
- "movies": "Movies",
- "loading": "Loading…",
- "seeAll": "See all"
+ "login": "Connexion",
+ "episodes": "Épisodes",
+ "movies": "Films",
+ "loading": "Chargement…",
+ "seeAll": "Tout afficher"
},
"search": {
"search": "Rechercher...",
- "x_items": "{{count}} Médias",
+ "x_items": "{{count}} médias",
"library": "Bibliothèque",
"discover": "Découvrir",
"no_results": "Aucun résultat",
@@ -527,7 +526,7 @@
"request_series": "Demander une série",
"recently_added": "Ajoutés récemment",
"recent_requests": "Demandes récentes",
- "plex_watchlist": "Liste de lecture Plex",
+ "plex_watchlist": "Liste de suivi Plex",
"trending": "Tendance",
"popular_movies": "Films populaires",
"movie_genres": "Genres de films",
@@ -536,7 +535,7 @@
"popular_tv": "Séries populaires",
"tv_genres": "Genres des séries",
"upcoming_tv": "Séries à venir",
- "networks": "Studios",
+ "networks": "Chaînes",
"tmdb_movie_keyword": "Mots-clés de film TMDB",
"tmdb_movie_genre": "Genre de film TMDB",
"tmdb_tv_keyword": "Mots-clés de séries TMDB",
@@ -553,7 +552,7 @@
"item_types": {
"movies": "Films",
"series": "Séries",
- "boxsets": "Coffrets ",
+ "boxsets": "Coffrets",
"playlists": "Playlists",
"items": "Médias"
},
@@ -575,10 +574,10 @@
"filter_by": "Filtrer par",
"sort_order": "Ordre de tri",
"tags": "Tags",
- "all": "All",
- "reset": "Reset",
- "asc": "Ascending",
- "desc": "Descending"
+ "all": "Tout",
+ "reset": "Réinitialiser",
+ "asc": "Croissant",
+ "desc": "Décroissant"
}
},
"favorites": {
@@ -592,11 +591,11 @@
"noData": "Marquez des éléments comme favoris pour les voir apparaître ici pour un accès rapide."
},
"custom_links": {
- "no_links": "Aucuns liens"
+ "no_links": "Aucun lien"
},
"player": {
- "live": "LIVE",
- "mpv_player_title": "MPV Player",
+ "live": "EN DIRECT",
+ "mpv_player_title": "Lecteur MPV",
"error": "Erreur",
"failed_to_get_stream_url": "Échec de l'obtention de l'URL du flux",
"an_error_occured_while_playing_the_video": "Une erreur s’est produite lors de la lecture de la vidéo. Vérifiez les journaux dans les paramètres.",
@@ -611,72 +610,71 @@
"downloaded_file_yes": "Oui",
"downloaded_file_no": "Non",
"downloaded_file_cancel": "Annuler",
- "swipe_down_settings": "Swipe down for settings",
- "ends_at": "Ends at {{time}}",
- "search_subtitles": "Search Subtitles",
- "subtitle_tracks": "Tracks",
- "subtitle_search": "Search & Download",
- "download": "Download",
- "subtitle_download_hint": "Downloaded subtitles will be saved to your library",
- "using_jellyfin_server": "Using Jellyfin Server",
- "language": "Language",
- "results": "Results",
- "searching": "Searching...",
- "search_failed": "Search failed",
- "no_subtitle_provider": "No subtitle provider configured on server",
- "no_subtitles_found": "No subtitles found",
- "add_opensubtitles_key_hint": "Add OpenSubtitles API key in settings for client-side fallback",
- "settings": "Settings",
- "skip_intro": "Skip Intro",
- "skip_credits": "Skip Credits",
- "stopPlayback": "Stop Playback",
- "stopPlayingTitle": "Stop playing \"{{title}}\"?",
- "stopPlayingConfirm": "Are you sure you want to stop playback?",
- "downloaded": "Downloaded",
- "missing_parameters": "Missing playback parameters"
+ "swipe_down_settings": "Balayez vers le bas pour les paramètres",
+ "ends_at": "Se termine à {{time}}",
+ "search_subtitles": "Rechercher des sous-titres",
+ "subtitle_tracks": "Pistes",
+ "subtitle_search": "Rechercher et télécharger",
+ "download": "Télécharger",
+ "subtitle_download_hint": "Les sous-titres téléchargés seront enregistrés dans votre bibliothèque",
+ "using_jellyfin_server": "Utilisation du serveur Jellyfin",
+ "language": "Langue",
+ "results": "Résultats",
+ "search_failed": "Recherche échouée",
+ "no_subtitle_provider": "Aucun fournisseur de sous-titres configuré sur le serveur",
+ "no_subtitles_found": "Aucun sous-titre trouvé",
+ "add_opensubtitles_key_hint": "Ajoutez une clé API OpenSubtitles dans les paramètres pour une solution de secours côté client",
+ "settings": "Paramètres",
+ "skip_intro": "Passer l'intro",
+ "skip_credits": "Passer le générique",
+ "stopPlayback": "Arrêter la lecture",
+ "stopPlayingTitle": "Arrêter de lire \"{{title}}\" ?",
+ "stopPlayingConfirm": "Êtes-vous sûr de vouloir arrêter la lecture ?",
+ "downloaded": "Téléchargé",
+ "missing_parameters": "Paramètres de lecture manquants"
},
"chapters": {
- "title": "Chapters",
- "chapter_number": "Chapter {{number}}",
- "open": "Open chapters",
- "close": "Close chapters"
+ "title": "Chapitres",
+ "chapter_number": "Chapitre {{number}}",
+ "open": "Ouvrir les chapitres",
+ "close": "Fermer les chapitres"
},
"item_card": {
"next_up": "À suivre",
- "no_items_to_display": "Aucuns médias à afficher",
+ "no_items_to_display": "Aucun média à afficher",
"cast_and_crew": "Distribution et équipe",
"series": "Séries",
"seasons": "Saisons",
"season": "Saison",
- "from_this_series": "From This Series",
- "more_from_this_season": "More from this Season",
- "view_series": "View Series",
- "view_season": "View Season",
- "select_season": "Select Season",
+ "from_this_series": "De cette série",
+ "more_from_this_season": "Plus de cette saison",
+ "view_series": "Voir la série",
+ "view_season": "Voir la saison",
+ "select_season": "Sélectionner une saison",
"no_episodes_for_this_season": "Aucun épisode pour cette saison",
"overview": "Aperçu",
"more_with": "Plus avec {{name}}",
"similar_items": "Médias similaires",
- "no_similar_items_found": "Aucuns médias similaires trouvés",
+ "no_similar_items_found": "Aucun média similaire trouvé",
"video": "Vidéo",
"more_details": "Plus de détails",
"media_options": "Options média",
"quality": "Qualité",
"audio": "Audio",
"subtitles": {
- "label": "Subtitle",
- "none": "None",
- "tracks": "Tracks"
+ "label": "Sous-titres",
+ "none": "Aucun",
+ "tracks": "Pistes"
},
"show_more": "Afficher plus",
"show_less": "Afficher moins",
- "left": "left",
- "director": "Director",
- "cast": "Cast",
- "technical_details": "Technical Details",
+ "left": "restant",
+ "director": "Réalisateur",
+ "cast": "Distribution",
+ "technical_details": "Détails techniques",
"appeared_in": "Apparu dans",
- "movies": "Movies",
- "shows": "Shows",
+ "movies": "Films",
+ "shows": "Séries",
"could_not_load_item": "Impossible de charger le média",
"none": "Aucun",
"download": {
@@ -688,13 +686,13 @@
"download_unwatched_only": "Non visionné uniquement",
"download_button": "Télécharger"
},
- "mark_played": "Mark as Watched",
- "mark_unplayed": "Mark as Unwatched",
- "resume_playback": "Resume Playback",
- "resume_playback_description": "Do you want to continue where you left off or start from the beginning?",
- "play_from_start": "Play from Start",
- "continue_from": "Continue from {{time}}",
- "no_data_available": "No data available"
+ "mark_played": "Marquer comme vu",
+ "mark_unplayed": "Marquer comme non vu",
+ "resume_playback": "Reprendre la lecture",
+ "resume_playback_description": "Voulez-vous continuer où vous vous êtes arrêté ou commencer à partir du début ?",
+ "play_from_start": "Lire depuis le début",
+ "continue_from": "Continuer depuis {{time}}",
+ "no_data_available": "Aucune donnée disponible"
},
"live_tv": {
"next": "Suivant",
@@ -706,16 +704,16 @@
"sports": "Sports",
"for_kids": "Pour enfants",
"news": "Actualités",
- "page_of": "Page {{current}} of {{total}}",
- "no_programs": "No programs available",
- "no_channels": "No channels available",
+ "page_of": "Page {{current}} sur {{total}}",
+ "no_programs": "Aucun programme disponible",
+ "no_channels": "Aucune chaîne disponible",
"tabs": {
- "programs": "Programs",
+ "programs": "Programmes",
"guide": "Guide",
- "channels": "Channels",
- "recordings": "Recordings",
- "schedule": "Schedule",
- "series": "Series"
+ "channels": "Chaînes",
+ "recordings": "Enregistrements",
+ "schedule": "Programmation",
+ "series": "Séries"
}
},
"jellyseerr": {
@@ -725,7 +723,7 @@
"whats_wrong": "Quel est le problème ?",
"issue_type": "Type de problème",
"select_an_issue": "Sélectionnez un problème",
- "types": "Types de fichiers",
+ "types": "Types",
"describe_the_issue": "(optionnel) Décrivez le problème...",
"submit_button": "Soumettre",
"report_issue_button": "Signaler un problème",
@@ -734,7 +732,7 @@
"failed_to_login": "Échec de la connexion",
"cast": "Distribution",
"details": "Détails",
- "status": "Statuts",
+ "status": "Statut",
"original_title": "Titre original",
"series_type": "Type de série",
"release_dates": "Dates de sortie",
@@ -752,32 +750,32 @@
"tags": "Tags",
"quality_profile": "Profil de qualité",
"root_folder": "Dossier racine",
- "season_all": "Saison (Tous)",
+ "season_all": "Saison (Toutes)",
"season_number": "Saison {{season_number}}",
- "number_episodes": "{{episode_number}} Épisodes",
+ "number_episodes": "{{episode_number}} épisodes",
"born": "Né(e) le",
- "appearances": "Apparences",
+ "appearances": "Apparitions",
"approve": "Valider",
"decline": "Refuser",
"requested_by": "Demandé par {{user}}",
"unknown_user": "Utilisateur inconnu",
- "select": "Select",
- "request_all": "Request All",
- "request_seasons": "Request Seasons",
- "select_seasons": "Select Seasons",
- "request_selected": "Request Selected",
- "n_selected": "{{count}} selected",
+ "select": "Sélectionner",
+ "request_all": "Tout demander",
+ "request_seasons": "Demander des saisons",
+ "select_seasons": "Sélectionner les saisons",
+ "request_selected": "Demander la sélection",
+ "n_selected": "{{count}} sélectionnés",
"toasts": {
"jellyseer_does_not_meet_requirements": "Seerr ne répond pas aux exigences ! Veuillez mettre à jour au moins vers la version 2.0.0.",
"jellyseerr_test_failed": "Le test Seerr a échoué. Veuillez réessayer.",
"failed_to_test_jellyseerr_server_url": "Échec du test de l'URL du serveur Seerr",
"issue_submitted": "Problème soumis !",
- "requested_item": "{{item}}} demandé !",
+ "requested_item": "{{item}} demandé !",
"you_dont_have_permission_to_request": "Vous n'avez pas la permission de demander !",
- "something_went_wrong_requesting_media": "Quelque chose s'est mal passé en demandant le média !",
+ "something_went_wrong_requesting_media": "Une erreur s'est produite lors de la demande du média !",
"request_approved": "Demande approuvée !",
- "request_declined": "Demande déclinée !",
- "failed_to_approve_request": "Échec d'approbation de la demande",
+ "request_declined": "Demande refusée !",
+ "failed_to_approve_request": "Échec de l'approbation de la demande",
"failed_to_decline_request": "Échec du refus de la demande"
}
},
@@ -787,7 +785,7 @@
"library": "Bibliothèque",
"custom_links": "Liens personnalisés",
"favorites": "Favoris",
- "settings": "Settings"
+ "settings": "Réglages"
},
"music": {
"title": "Musique",
@@ -807,13 +805,13 @@
"play_top_tracks": "Jouer les pistes les plus populaires",
"no_suggestions": "Pas de suggestion disponible",
"no_albums": "Pas d'albums trouvés",
- "no_artists": "Pas d'artistes trouvé",
+ "no_artists": "Pas d'artistes trouvés",
"no_playlists": "Pas de playlists trouvées",
"album_not_found": "Album introuvable",
"artist_not_found": "Artiste introuvable",
"playlist_not_found": "Playlist introuvable",
"track_options": {
- "play_next": "Lecture suivante",
+ "play_next": "Lire ensuite",
"add_to_queue": "Ajouter à la file d'attente",
"add_to_playlist": "Ajouter à la playlist",
"download": "Télécharger",
@@ -822,15 +820,15 @@
"cached": "En cache",
"delete_download": "Supprimer un téléchargement",
"delete_cache": "Supprimer du cache",
- "go_to_artist": "Voir l'artiste",
- "go_to_album": "Aller à l’album",
+ "go_to_artist": "Aller à l'artiste",
+ "go_to_album": "Aller à l'album",
"add_to_favorites": "Ajouter aux favoris",
"remove_from_favorites": "Retirer des favoris",
"remove_from_playlist": "Retirer de la playlist"
},
"playlists": {
- "create_playlist": "Créer une Playlist",
- "playlist_name": "Nom de la Playlist",
+ "create_playlist": "Créer une playlist",
+ "playlist_name": "Nom de la playlist",
"enter_name": "Entrer le nom de la playlist",
"create": "Créer",
"search_playlists": "Rechercher des playlists...",
@@ -841,10 +839,10 @@
"created": "Playlist créée",
"create_new": "Créer une nouvelle playlist",
"failed_to_add": "Échec de l'ajout à la playlist",
- "failed_to_remove": "Échec de la suppression de la playlist",
- "failed_to_create": "Échec de la suppression de la playlist",
+ "failed_to_remove": "Échec du retrait de la playlist",
+ "failed_to_create": "Échec de la création de la playlist",
"delete_playlist": "Supprimer la playlist",
- "delete_confirm": "Êtes-vous sûr de vouloir supprimer « {{ name }} » ? Cette action est irréversible.",
+ "delete_confirm": "Êtes-vous sûr de vouloir supprimer « {{name}} » ? Cette action est irréversible.",
"deleted": "Playlist supprimée",
"failed_to_delete": "Échec de la suppression de la playlist"
},
@@ -855,46 +853,46 @@
}
},
"watchlists": {
- "title": "Listes de lecture",
- "my_watchlists": "Mes listes de lecture",
- "public_watchlists": "Watchlist publique",
- "create_title": "Créer une Watchlist",
- "edit_title": "Modifier la Watchlist",
- "create_button": "Créer une Watchlist",
+ "title": "Listes de suivi",
+ "my_watchlists": "Mes listes de suivi",
+ "public_watchlists": "Listes de suivi publiques",
+ "create_title": "Créer une liste de suivi",
+ "edit_title": "Modifier la liste de suivi",
+ "create_button": "Créer une liste de suivi",
"save_button": "Enregistrer les modifications",
"delete_button": "Supprimer",
"remove_button": "Retirer",
"cancel_button": "Annuler",
"name_label": "Nom",
- "name_placeholder": "Entrer le nom de la playlist",
+ "name_placeholder": "Entrez le nom de la liste de suivi",
"description_label": "Description",
"description_placeholder": "Entrez la description (facultatif)",
- "is_public_label": "Liste de lecture Publique",
+ "is_public_label": "Liste de suivi publique",
"is_public_description": "Autoriser d'autres personnes à voir cette liste de suivi",
"allowed_type_label": "Type de contenu",
"sort_order_label": "Ordre de tri par défaut",
- "empty_title": "Pas de Watchlists",
+ "empty_title": "Aucune liste de suivi",
"empty_description": "Créez votre première liste de suivi pour commencer à organiser vos médias",
"empty_watchlist": "Cette liste de suivi est vide",
"empty_watchlist_hint": "Ajouter des éléments de votre bibliothèque à cette liste de suivi",
"not_configured_title": "Streamystats non configuré",
"not_configured_description": "Configurer Streamystats dans les paramètres pour utiliser les listes de suivi",
- "go_to_settings": "Accédez aux Paramètres",
- "add_to_watchlist": "Ajouter à la Watchlist",
- "remove_from_watchlist": "Retirer de la Watchlist",
+ "go_to_settings": "Accédez aux paramètres",
+ "add_to_watchlist": "Ajouter à la liste de suivi",
+ "remove_from_watchlist": "Retirer de la liste de suivi",
"select_watchlist": "Sélectionner la liste de suivi",
- "create_new": "Créer une Watchlist",
- "item": "médias",
- "items": "élément",
+ "create_new": "Créer une nouvelle liste de suivi",
+ "item": "élément",
+ "items": "éléments",
"public": "Publique",
"private": "Privée",
- "you": "Vous-même",
+ "you": "Vous",
"by_owner": "Par un autre utilisateur",
- "not_found": "Playlist introuvable",
- "delete_confirm_title": "Supprimer la Watchlist",
- "delete_confirm_message": "Tous les médias (par défaut)",
- "remove_item_title": "Retirer de la Watchlist",
- "remove_item_message": "Retirer «{{name}}» de cette liste de suivi?",
+ "not_found": "Liste de suivi introuvable",
+ "delete_confirm_title": "Supprimer la liste de suivi",
+ "delete_confirm_message": "Voulez-vous vraiment supprimer « {{name}} » ? Cette action est irréversible.",
+ "remove_item_title": "Retirer de la liste de suivi",
+ "remove_item_message": "Retirer « {{name}} » de cette liste de suivi ?",
"loading": "Chargement des listes de suivi...",
"no_compatible_watchlists": "Aucune liste de suivi compatible",
"create_one_first": "Créer une liste de suivi qui accepte ce type de contenu"
@@ -910,33 +908,33 @@
}
},
"companion_login": {
- "title": "Pair with TV",
- "align_qr": "Align the QR code within the frame",
- "enter_code_manually": "Enter code manually",
- "pairing_enter_credentials": "Enter credentials for TV",
- "pairing_code_label": "Pairing code",
- "server": "Server",
- "authorize_button": "Authorize",
- "authorizing": "Authorizing...",
- "scan_again": "Scan Again",
- "done": "Done",
- "success_title": "Authorization Sent",
- "pairing_tv_connecting": "The TV is connecting to your account",
- "error_title": "Authorization Failed",
- "error_invalid_qr": "Invalid QR code. Please scan the TV pairing code.",
- "error_generic": "Something went wrong. Please try again.",
- "error_permission_denied": "Camera permission is required to scan QR codes.",
- "login_as": "Log in as {{username}}?",
- "on_server": "on {{server}}",
- "use_different_user": "Use a different user",
- "open_settings": "Open Settings"
+ "title": "Associer à la TV",
+ "align_qr": "Alignez le code QR dans le cadre",
+ "enter_code_manually": "Saisir le code manuellement",
+ "pairing_enter_credentials": "Entrez les identifiants pour le téléviseur",
+ "pairing_code_label": "Code d'appairage",
+ "server": "Serveur",
+ "authorize_button": "Autoriser",
+ "authorizing": "Autorisation en cours...",
+ "scan_again": "Scanner à nouveau",
+ "done": "Terminé",
+ "success_title": "Autorisation envoyée",
+ "pairing_tv_connecting": "La TV se connecte à votre compte",
+ "error_title": "Échec de l'autorisation",
+ "error_invalid_qr": "Code QR invalide. Veuillez scanner le code d'appairage du téléviseur.",
+ "error_generic": "Une erreur s'est produite. Veuillez réessayer.",
+ "error_permission_denied": "L'accès à la caméra est nécessaire pour scanner les QR codes.",
+ "login_as": "Se connecter en tant que {{username}} ?",
+ "on_server": "sur {{server}}",
+ "use_different_user": "Utiliser un autre utilisateur",
+ "open_settings": "Ouvrir les paramètres"
},
"pairing": {
- "pair_with_phone": "Pair with Phone",
- "pair_with_phone_title": "Login TV",
- "waiting_for_phone": "Waiting for phone...",
- "scan_with_phone": "Scan with the Streamyfin app on your phone",
- "logging_in": "Logging in...",
- "logging_in_description": "Connecting to your server"
+ "pair_with_phone": "Associer au téléphone",
+ "pair_with_phone_title": "Se connecter sur la TV",
+ "waiting_for_phone": "En attente du téléphone...",
+ "scan_with_phone": "Scanner avec l'application Streamyfin sur votre téléphone",
+ "logging_in": "Connexion en cours...",
+ "logging_in_description": "Connexion à votre serveur"
}
}
diff --git a/translations/he.json b/translations/he.json
index a5fff137b..4952bb4dd 100644
--- a/translations/he.json
+++ b/translations/he.json
@@ -484,7 +484,6 @@
},
"common": {
"no_results": "No Results",
- "select": "בחר",
"no_trailer_available": "אין טריילר זמין",
"video": "וידאו",
"audio": "שמע",
@@ -621,7 +620,6 @@
"using_jellyfin_server": "Using Jellyfin Server",
"language": "Language",
"results": "Results",
- "searching": "Searching...",
"search_failed": "Search failed",
"no_subtitle_provider": "No subtitle provider configured on server",
"no_subtitles_found": "No subtitles found",
diff --git a/translations/hu.json b/translations/hu.json
index 0ca2121ee..3550bb0a1 100644
--- a/translations/hu.json
+++ b/translations/hu.json
@@ -484,7 +484,6 @@
},
"common": {
"no_results": "No Results",
- "select": "Select",
"no_trailer_available": "No trailer available",
"video": "Videó",
"audio": "Hang",
@@ -621,7 +620,6 @@
"using_jellyfin_server": "Using Jellyfin Server",
"language": "Language",
"results": "Results",
- "searching": "Searching...",
"search_failed": "Search failed",
"no_subtitle_provider": "No subtitle provider configured on server",
"no_subtitles_found": "No subtitles found",
diff --git a/translations/it.json b/translations/it.json
index b714aafe7..c445d5bf3 100644
--- a/translations/it.json
+++ b/translations/it.json
@@ -226,7 +226,7 @@
"hide_volume_slider": "Hide Volume Slider",
"hide_volume_slider_description": "Nascondi il cursore del volume nel lettore video",
"hide_brightness_slider": "Hide Brightness Slider",
- "hide_brightness_slider_description": "Hide the brightness slider in the video player"
+ "hide_brightness_slider_description": "Nascondi il cursore della luminosità nel lettore video"
},
"audio": {
"audio_title": "Audio",
@@ -237,10 +237,10 @@
"language": "Lingua",
"transcode_mode": {
"title": "Audio Transcoding",
- "description": "Controls how surround audio (7.1, TrueHD, DTS-HD) is handled",
- "auto": "Auto",
+ "description": "Controlla come viene gestito l'audio surround (7.1, TrueHD, DTS-HD)",
+ "auto": "Automatico",
"stereo": "Force Stereo",
- "5_1": "Allow 5.1",
+ "5_1": "Consenti 5.1",
"passthrough": "Passthrough"
}
},
@@ -262,20 +262,20 @@
"OnlyForced": "Solo forzati"
},
"opensubtitles_title": "OpenSubtitles",
- "opensubtitles_hint": "Enter your OpenSubtitles API key to enable client-side subtitle search as a fallback when your Jellyfin server doesn't have a subtitle provider configured.",
+ "opensubtitles_hint": "Inserisci la tua chiave API OpenSubtitles per abilitare la ricerca dei sottotitoli quando il tuo server Jellyfin non ha un provider di sottotitoli configurato.",
"opensubtitles_api_key": "API Key",
- "opensubtitles_api_key_placeholder": "Enter API key...",
- "opensubtitles_get_key": "Get your free API key at opensubtitles.com/en/consumers",
+ "opensubtitles_api_key_placeholder": "Inserisci la chiave API...",
+ "opensubtitles_get_key": "Ottieni la tua chiave API gratuita su opensubtitles.com/en/consumers",
"mpv_subtitle_scale": "Subtitle Scale",
"mpv_subtitle_margin_y": "Vertical Margin",
"mpv_subtitle_align_x": "Horizontal Align",
"mpv_subtitle_align_y": "Vertical Align",
"align": {
- "left": "Left",
- "center": "Center",
- "right": "Right",
- "top": "Top",
- "bottom": "Bottom"
+ "left": "Sinistra",
+ "center": "Centro",
+ "right": "Destra",
+ "top": "Alto",
+ "bottom": "Basso"
}
},
"other": {
@@ -307,9 +307,9 @@
"disabled": "Disabilitato"
},
"music": {
- "title": "Music",
- "playback_title": "Playback",
- "playback_description": "Configure how music is played.",
+ "title": "Musica",
+ "playback_title": "Riproduzione",
+ "playback_description": "Configura come viene riprodotta la musica.",
"prefer_downloaded": "Prefer Downloaded Songs",
"caching_title": "Caching",
"caching_description": "Automatically cache upcoming tracks for smoother playback.",
@@ -333,7 +333,7 @@
"tv_quota_days": "Giorni di quota per le serie TV",
"reset_jellyseerr_config_button": "Ripristina la configurazione di Jellyseerr",
"unlimited": "Illimitato",
- "plus_n_more": "+{{n}} more",
+ "plus_n_more": "+{{n}} altro",
"order_by": {
"DEFAULT": "Predefinito",
"VOTE_COUNT_AND_AVERAGE": "Conteggio delle votazioni e media",
@@ -352,25 +352,25 @@
}
},
"streamystats": {
- "disable_streamystats": "Disable Streamystats",
+ "disable_streamystats": "Disabilita Streamystats",
"enable_search": "Use for Search",
"url": "URL",
"server_url_placeholder": "http(s)://streamystats.example.com",
- "streamystats_search_hint": "Enter the URL for your Streamystats server. The URL should include http or https and optionally the port.",
+ "streamystats_search_hint": "Inserisci l'URL per il tuo server Streamystats. L'URL dovrebbe includere http o https ed eventualmente la porta.",
"read_more_about_streamystats": "Read More About Streamystats.",
- "save": "Save",
- "features_title": "Features",
+ "save": "Salva",
+ "features_title": "Funzionalità",
"enable_movie_recommendations": "Movie Recommendations",
"enable_series_recommendations": "Series Recommendations",
"enable_promoted_watchlists": "Promoted Watchlists",
"hide_watchlists_tab": "Hide Watchlists Tab",
- "home_sections_hint": "Show personalized recommendations and promoted watchlists from Streamystats on the home page.",
+ "home_sections_hint": "Mostra consigli personalizzati e watchlist promosse da Streamystats nella home page.",
"recommended_movies": "Recommended Movies",
"recommended_series": "Recommended Series",
"toasts": {
- "saved": "Saved",
- "refreshed": "Settings refreshed from server",
- "disabled": "Streamystats disabled"
+ "saved": "Salvato",
+ "refreshed": "Impostazioni aggiornate dal server",
+ "disabled": "Streamystats disabilitato"
},
"refresh_from_server": "Refresh Settings from Server"
},
@@ -385,17 +385,17 @@
"size_used": "{{used}} di {{total}} usato",
"delete_all_downloaded_files": "Cancella Tutti i File Scaricati",
"music_cache_title": "Music Cache",
- "music_cache_description": "Automatically cache songs as you listen for smoother playback and offline support",
+ "music_cache_description": "Precarica automaticamente i brani mentre ascolti per una riproduzione più fluida e il supporto offline",
"clear_music_cache": "Clear Music Cache",
- "music_cache_size": "{{size}} cached",
- "music_cache_cleared": "Music cache cleared",
+ "music_cache_size": "{{size}} nella cache",
+ "music_cache_cleared": "Cache musicale cancellata",
"delete_all_downloaded_songs": "Delete All Downloaded Songs",
- "downloaded_songs_size": "{{size}} downloaded",
- "downloaded_songs_deleted": "Downloaded songs deleted",
+ "downloaded_songs_size": "{{size}} scaricato",
+ "downloaded_songs_deleted": "Brani scaricati eliminati",
"clear_all_cache": "Clear All Cache",
"clear_all_cache_confirm": "Clear All Cache?",
- "clear_all_cache_confirm_desc": "Are you sure you want to clear all cached data? This will clear all cached images, music files, subtitles, and query caches. Your settings and login session will be kept.",
- "clear_all_cache_error_desc": "An error occurred while clearing the cache."
+ "clear_all_cache_confirm_desc": "Sei sicuro di voler cancellare tutti i dati nella cache? Questo cancellerà tutte le immagini nella cache, i file musicali, i sottotitoli e le cache delle interrogazioni. Le impostazioni e la sessione di login verranno mantenute.",
+ "clear_all_cache_error_desc": "Si è verificato un errore durante la cancellazione della cache."
},
"intro": {
"title": "Intro",
@@ -404,8 +404,8 @@
},
"logs": {
"logs_title": "Log",
- "export_logs": "Export logs",
- "click_for_more_info": "Click for more info",
+ "export_logs": "Esporta i logs",
+ "click_for_more_info": "Clicca per maggiori informazioni",
"level": "Livello",
"no_logs_available": "Nessun log disponibile",
"delete_all_logs": "Cancella tutti i log"
@@ -419,17 +419,17 @@
"error_deleting_files": "Errore nella cancellazione dei file"
},
"security": {
- "title": "Security",
+ "title": "Sicurezza",
"inactivity_timeout": {
"title": "Inactivity Timeout",
- "disabled": "Disabled",
- "1_minute": "1 minute",
- "5_minutes": "5 minutes",
- "15_minutes": "15 minutes",
- "30_minutes": "30 minutes",
- "1_hour": "1 hour",
- "4_hours": "4 hours",
- "24_hours": "24 hours"
+ "disabled": "Disabilitato",
+ "1_minute": "1 minuto",
+ "5_minutes": "5 minuti",
+ "15_minutes": "15 minuti",
+ "30_minutes": "30 minuti",
+ "1_hour": "1 ora",
+ "4_hours": "4 ore",
+ "24_hours": "24 ore"
}
}
},
@@ -484,7 +484,6 @@
},
"common": {
"no_results": "No Results",
- "select": "Seleziona",
"no_trailer_available": "Nessun trailer disponibile",
"video": "Video",
"audio": "Audio",
@@ -494,18 +493,18 @@
"mark_as_not_played": "Mark as not Played",
"none": "Nulla",
"track": "Traccia",
- "cancel": "Cancel",
- "delete": "Delete",
+ "cancel": "Annulla",
+ "delete": "Cancella",
"ok": "OK",
- "remove": "Remove",
- "back": "Back",
- "continue": "Continue",
- "verifying": "Verifying...",
- "login": "Login",
- "episodes": "Episodes",
- "movies": "Movies",
- "loading": "Loading…",
- "seeAll": "See all"
+ "remove": "Rimuovi",
+ "back": "Indietro",
+ "continue": "Continua",
+ "verifying": "Verifica in corso...",
+ "login": "Accedi",
+ "episodes": "Episodi",
+ "movies": "Film",
+ "loading": "Caricamento…",
+ "seeAll": "Visualizza tutti"
},
"search": {
"search": "Cerca...",
@@ -519,10 +518,10 @@
"episodes": "Episodi",
"collections": "Collezioni",
"actors": "Attori",
- "artists": "Artists",
- "albums": "Albums",
- "songs": "Songs",
- "playlists": "Playlists",
+ "artists": "Artisti",
+ "albums": "Album",
+ "songs": "Tracce",
+ "playlists": "Playlist",
"request_movies": "Film Richiesti",
"request_series": "Serie Richieste",
"recently_added": "Aggiunti di Recente",
@@ -554,7 +553,7 @@
"movies": "film",
"series": "serie TV",
"boxsets": "cofanetti",
- "playlists": "Playlists",
+ "playlists": "Playlist",
"items": "elementi"
},
"options": {
@@ -566,7 +565,7 @@
"cover": "Copertina",
"show_titles": "Mostra titoli",
"show_stats": "Mostra statistiche",
- "options_title": "Options"
+ "options_title": "Impostazioni"
},
"filters": {
"genres": "Generi",
@@ -575,10 +574,10 @@
"filter_by": "Filter By",
"sort_order": "Criterio di ordinamento",
"tags": "Tag",
- "all": "All",
- "reset": "Reset",
- "asc": "Ascending",
- "desc": "Descending"
+ "all": "Tutto",
+ "reset": "Ripristina",
+ "asc": "Crescente",
+ "desc": "Decrescente"
}
},
"favorites": {
@@ -595,7 +594,7 @@
"no_links": "Nessun link"
},
"player": {
- "live": "LIVE",
+ "live": "IN DIRETTA",
"mpv_player_title": "MPV Player",
"error": "Errore",
"failed_to_get_stream_url": "Impossibile ottenere l'URL dello stream",
@@ -606,40 +605,39 @@
"next_episode": "Prossimo Episodio",
"continue_watching": "Continua a guardare",
"go_back": "Indietro",
- "downloaded_file_title": "You have this file downloaded",
- "downloaded_file_message": "Do you want to play the downloaded file?",
- "downloaded_file_yes": "Yes",
+ "downloaded_file_title": "Questo file è stato scaricato",
+ "downloaded_file_message": "Vuoi riprodurre il file scaricato?",
+ "downloaded_file_yes": "Si",
"downloaded_file_no": "No",
- "downloaded_file_cancel": "Cancel",
- "swipe_down_settings": "Swipe down for settings",
- "ends_at": "Ends at {{time}}",
+ "downloaded_file_cancel": "Annulla",
+ "swipe_down_settings": "Scorri in basso per le impostazioni",
+ "ends_at": "Termina alle {{time}}",
"search_subtitles": "Search Subtitles",
- "subtitle_tracks": "Tracks",
+ "subtitle_tracks": "Tracce",
"subtitle_search": "Search & Download",
- "download": "Download",
- "subtitle_download_hint": "Downloaded subtitles will be saved to your library",
+ "download": "Scarica",
+ "subtitle_download_hint": "I sottotitoli scaricati verranno salvati nella tua libreria",
"using_jellyfin_server": "Using Jellyfin Server",
- "language": "Language",
- "results": "Results",
- "searching": "Searching...",
- "search_failed": "Search failed",
- "no_subtitle_provider": "No subtitle provider configured on server",
- "no_subtitles_found": "No subtitles found",
- "add_opensubtitles_key_hint": "Add OpenSubtitles API key in settings for client-side fallback",
- "settings": "Settings",
+ "language": "Lingua",
+ "results": "Risultati",
+ "search_failed": "Ricerca fallita",
+ "no_subtitle_provider": "Nessun provider di sottotitoli configurato sul server",
+ "no_subtitles_found": "Nessun sottotitolo trovato",
+ "add_opensubtitles_key_hint": "Aggiungi la chiave API OpenSubtitles nelle impostazioni",
+ "settings": "Impostazioni",
"skip_intro": "Skip Intro",
"skip_credits": "Skip Credits",
"stopPlayback": "Stop Playback",
- "stopPlayingTitle": "Stop playing \"{{title}}\"?",
- "stopPlayingConfirm": "Are you sure you want to stop playback?",
- "downloaded": "Downloaded",
- "missing_parameters": "Missing playback parameters"
+ "stopPlayingTitle": "Interrompere la riproduzione \"{{title}}\"?",
+ "stopPlayingConfirm": "Sei sicuro di voler interrompere la riproduzione?",
+ "downloaded": "Scaricato",
+ "missing_parameters": "Parametri di riproduzione mancanti"
},
"chapters": {
- "title": "Chapters",
- "chapter_number": "Chapter {{number}}",
- "open": "Open chapters",
- "close": "Close chapters"
+ "title": "Capitoli",
+ "chapter_number": "Capitolo {{number}}",
+ "open": "Apri capitoli",
+ "close": "Chiudi i capitoli"
},
"item_card": {
"next_up": "Il prossimo",
@@ -664,19 +662,19 @@
"quality": "Qualità",
"audio": "Audio",
"subtitles": {
- "label": "Subtitle",
- "none": "None",
- "tracks": "Tracks"
+ "label": "Sottotitoli",
+ "none": "Vuoto",
+ "tracks": "Tracce"
},
"show_more": "Mostra di più",
"show_less": "Mostra di meno",
- "left": "left",
- "director": "Director",
+ "left": "sinistra",
+ "director": "Regista",
"cast": "Cast",
"technical_details": "Technical Details",
"appeared_in": "Apparso in",
- "movies": "Movies",
- "shows": "Shows",
+ "movies": "Film",
+ "shows": "Serie",
"could_not_load_item": "Impossibile caricare l'elemento",
"none": "Nessuno",
"download": {
@@ -691,10 +689,10 @@
"mark_played": "Mark as Watched",
"mark_unplayed": "Mark as Unwatched",
"resume_playback": "Resume Playback",
- "resume_playback_description": "Do you want to continue where you left off or start from the beginning?",
+ "resume_playback_description": "Vuoi continuare da dove hai lasciato o riniziare da capo?",
"play_from_start": "Play from Start",
- "continue_from": "Continue from {{time}}",
- "no_data_available": "No data available"
+ "continue_from": "Continua da {{time}}",
+ "no_data_available": "Nessun dato disponibile"
},
"live_tv": {
"next": "Prossimo",
@@ -706,16 +704,16 @@
"sports": "Sport",
"for_kids": "Per Bambini",
"news": "Notiziari",
- "page_of": "Page {{current}} of {{total}}",
- "no_programs": "No programs available",
- "no_channels": "No channels available",
+ "page_of": "Pagina {{current}} di {{total}}",
+ "no_programs": "Nessun programma disponibile",
+ "no_channels": "Nessun canale disponibile",
"tabs": {
- "programs": "Programs",
- "guide": "Guide",
- "channels": "Channels",
- "recordings": "Recordings",
- "schedule": "Schedule",
- "series": "Series"
+ "programs": "Programmi",
+ "guide": "Guida",
+ "channels": "Canali",
+ "recordings": "Registrazioni",
+ "schedule": "Pianifica",
+ "series": "Serie Tv"
}
},
"jellyseerr": {
@@ -761,12 +759,12 @@
"decline": "Rifiuta",
"requested_by": "Richiesto da {{user}}",
"unknown_user": "Utente Sconosciuto",
- "select": "Select",
+ "select": "Seleziona",
"request_all": "Request All",
"request_seasons": "Request Seasons",
"select_seasons": "Select Seasons",
"request_selected": "Request Selected",
- "n_selected": "{{count}} selected",
+ "n_selected": "{{count}} selezionati",
"toasts": {
"jellyseer_does_not_meet_requirements": "Il server Jellyseerr non soddisfa i requisiti minimi di versione! Aggiornare almeno alla versione 2.0.0.",
"jellyseerr_test_failed": "Il test di Jellyseerr non è riuscito. Riprovare.",
@@ -787,39 +785,39 @@
"library": "Libreria",
"custom_links": "Collegamenti personalizzati",
"favorites": "Preferiti",
- "settings": "Settings"
+ "settings": "Impostazioni"
},
"music": {
- "title": "Music",
+ "title": "Musica",
"tabs": {
- "suggestions": "Suggestions",
- "albums": "Albums",
- "artists": "Artists",
- "playlists": "Playlists",
+ "suggestions": "Suggerimenti",
+ "albums": "Album",
+ "artists": "Artisti",
+ "playlists": "Playlist",
"tracks": "tracks"
},
"recently_added": "Recently Added",
"recently_played": "Recently Played",
"frequently_played": "Frequently Played",
"top_tracks": "Top Tracks",
- "play": "Play",
- "shuffle": "Shuffle",
+ "play": "Riproduci",
+ "shuffle": "Riproduzione casuale",
"play_top_tracks": "Play Top Tracks",
- "no_suggestions": "No suggestions available",
- "no_albums": "No albums found",
- "no_artists": "No artists found",
- "no_playlists": "No playlists found",
- "album_not_found": "Album not found",
- "artist_not_found": "Artist not found",
- "playlist_not_found": "Playlist not found",
+ "no_suggestions": "Nessun suggerimento disponibile",
+ "no_albums": "Nessun album trovato",
+ "no_artists": "Artista non trovato",
+ "no_playlists": "Nessuna playlist trovata",
+ "album_not_found": "Album non trovato",
+ "artist_not_found": "Artista non trovato",
+ "playlist_not_found": "Playlist non trovata",
"track_options": {
"play_next": "Play Next",
"add_to_queue": "Add to Queue",
"add_to_playlist": "Add to Playlist",
- "download": "Download",
- "downloaded": "Downloaded",
- "downloading": "Downloading...",
- "cached": "Cached",
+ "download": "Scarica",
+ "downloaded": "Scaricato",
+ "downloading": "Scaricamento...",
+ "cached": "Memorizzato nella cache",
"delete_download": "Delete Download",
"delete_cache": "Remove from Cache",
"go_to_artist": "Go to Artist",
@@ -831,112 +829,112 @@
"playlists": {
"create_playlist": "Create Playlist",
"playlist_name": "Playlist Name",
- "enter_name": "Enter playlist name",
- "create": "Create",
- "search_playlists": "Search playlists...",
- "added_to": "Added to {{name}}",
- "added": "Added to playlist",
- "removed_from": "Removed from {{name}}",
- "removed": "Removed from playlist",
- "created": "Playlist created",
+ "enter_name": "Inserisci il nome della playlist",
+ "create": "Crea",
+ "search_playlists": "Cerca playlist...",
+ "added_to": "Aggiunto a {{name}}",
+ "added": "Aggiunto alla playlist",
+ "removed_from": "Rimosso da {{name}}",
+ "removed": "Rimosso dalla playlist",
+ "created": "Playlist creata",
"create_new": "Create New Playlist",
- "failed_to_add": "Failed to add to playlist",
- "failed_to_remove": "Failed to remove from playlist",
- "failed_to_create": "Failed to create playlist",
+ "failed_to_add": "Impossibile aggiungere alla playlist",
+ "failed_to_remove": "Impossibile rimuovere dalla playlist",
+ "failed_to_create": "Impossibile creare la playlist",
"delete_playlist": "Delete Playlist",
- "delete_confirm": "Are you sure you want to delete \"{{name}}\"? This action cannot be undone.",
- "deleted": "Playlist deleted",
- "failed_to_delete": "Failed to delete playlist"
+ "delete_confirm": "Sei sicuro di voler eliminare\"{{name}}\"? Questa azione non può essere annullata.",
+ "deleted": "Playlist eliminata",
+ "failed_to_delete": "Impossibile eliminare la playlist"
},
"sort": {
"title": "Sort By",
- "alphabetical": "Alphabetical",
+ "alphabetical": "Alfabetico",
"date_created": "Date Created"
}
},
"watchlists": {
- "title": "Watchlists",
+ "title": "Da vedere",
"my_watchlists": "My Watchlists",
"public_watchlists": "Public Watchlists",
"create_title": "Create Watchlist",
"edit_title": "Edit Watchlist",
"create_button": "Create Watchlist",
"save_button": "Save Changes",
- "delete_button": "Delete",
- "remove_button": "Remove",
- "cancel_button": "Cancel",
- "name_label": "Name",
- "name_placeholder": "Enter watchlist name",
- "description_label": "Description",
- "description_placeholder": "Enter description (optional)",
+ "delete_button": "Cancella",
+ "remove_button": "Rimuovi",
+ "cancel_button": "Annulla",
+ "name_label": "Nome",
+ "name_placeholder": "Inserisci il nome della lista \"Da vedere\"",
+ "description_label": "Descrizione",
+ "description_placeholder": "Inserisci descrizione (opzionale)",
"is_public_label": "Public Watchlist",
- "is_public_description": "Allow others to view this watchlist",
+ "is_public_description": "Permetti ad altri di vedere questa lista",
"allowed_type_label": "Content Type",
"sort_order_label": "Default Sort Order",
"empty_title": "No Watchlists",
- "empty_description": "Create your first watchlist to start organizing your media",
- "empty_watchlist": "This watchlist is empty",
- "empty_watchlist_hint": "Add items from your library to this watchlist",
+ "empty_description": "Crea la tua prima lista \"Da vedere\" per iniziare a organizzare i tuoi media",
+ "empty_watchlist": "Questa lista è vuota",
+ "empty_watchlist_hint": "Aggiungi elementi dalla tua libreria a questa lista",
"not_configured_title": "Streamystats Not Configured",
- "not_configured_description": "Configure Streamystats in settings to use watchlists",
- "go_to_settings": "Go to Settings",
+ "not_configured_description": "Configura Streamystats nelle impostazioni per utilizzare le watchlist",
+ "go_to_settings": "Vai alle impostazioni",
"add_to_watchlist": "Add to Watchlist",
"remove_from_watchlist": "Remove from Watchlist",
"select_watchlist": "Select Watchlist",
"create_new": "Create New Watchlist",
- "item": "item",
- "items": "items",
- "public": "Public",
- "private": "Private",
- "you": "You",
- "by_owner": "By another user",
- "not_found": "Watchlist not found",
+ "item": "elemento",
+ "items": "elementi",
+ "public": "Pubblico",
+ "private": "Privato",
+ "you": "Tu",
+ "by_owner": "Da un altro utente",
+ "not_found": "\"Da vedere\" non trovata",
"delete_confirm_title": "Delete Watchlist",
- "delete_confirm_message": "Are you sure you want to delete \"{{name}}\"? This action cannot be undone.",
+ "delete_confirm_message": "Sei sicuro di voler eliminare\"{{name}}\"? Questa azione non può essere annullata.",
"remove_item_title": "Remove from Watchlist",
- "remove_item_message": "Remove \"{{name}}\" from this watchlist?",
- "loading": "Loading watchlists...",
- "no_compatible_watchlists": "No compatible watchlists",
- "create_one_first": "Create a watchlist that accepts this content type"
+ "remove_item_message": "Rimuovere \"{{name}}\" da questa lista?",
+ "loading": "Caricamento liste...",
+ "no_compatible_watchlists": "Nessuna lista compatibile",
+ "create_one_first": "Crea una lista che accetti questo tipo di contenuto"
},
"playback_speed": {
"title": "Playback Speed",
"apply_to": "Apply To",
- "speed": "Speed",
+ "speed": "Velocità",
"scope": {
- "media": "This media only",
- "show": "This show",
- "all": "All media (default)"
+ "media": "Solo questo media",
+ "show": "Questo show",
+ "all": "Tutti i media (predefinito)"
}
},
"companion_login": {
- "title": "Pair with TV",
- "align_qr": "Align the QR code within the frame",
- "enter_code_manually": "Enter code manually",
- "pairing_enter_credentials": "Enter credentials for TV",
- "pairing_code_label": "Pairing code",
+ "title": "Associa con la TV",
+ "align_qr": "Allinea il QR code all'interno del riquadro",
+ "enter_code_manually": "Inserisci il codice manualmente",
+ "pairing_enter_credentials": "Inserire le credenziali per la TV",
+ "pairing_code_label": "Codice di associazione",
"server": "Server",
- "authorize_button": "Authorize",
- "authorizing": "Authorizing...",
+ "authorize_button": "Autorizza",
+ "authorizing": "Autorizzando...",
"scan_again": "Scan Again",
- "done": "Done",
+ "done": "Fatto",
"success_title": "Authorization Sent",
- "pairing_tv_connecting": "The TV is connecting to your account",
+ "pairing_tv_connecting": "La TV si sta collegando al tuo account",
"error_title": "Authorization Failed",
- "error_invalid_qr": "Invalid QR code. Please scan the TV pairing code.",
- "error_generic": "Something went wrong. Please try again.",
- "error_permission_denied": "Camera permission is required to scan QR codes.",
- "login_as": "Log in as {{username}}?",
- "on_server": "on {{server}}",
- "use_different_user": "Use a different user",
- "open_settings": "Open Settings"
+ "error_invalid_qr": "QR code non valido. Scansiona il codice di associazione della TV.",
+ "error_generic": "Si è verificato un errore. Riprova.",
+ "error_permission_denied": "Per scansionare i codici QR è necessaria l'autorizzazione della fotocamera.",
+ "login_as": "Accedi come {{username}}?",
+ "on_server": "su {{server}}",
+ "use_different_user": "Usa un altro utente",
+ "open_settings": "Apri le impostazioni"
},
"pairing": {
"pair_with_phone": "Pair with Phone",
"pair_with_phone_title": "Login TV",
- "waiting_for_phone": "Waiting for phone...",
- "scan_with_phone": "Scan with the Streamyfin app on your phone",
- "logging_in": "Logging in...",
- "logging_in_description": "Connecting to your server"
+ "waiting_for_phone": "In attesa del telefono...",
+ "scan_with_phone": "Scansiona con l'applicazione Streamyfin sul tuo telefono",
+ "logging_in": "Accesso in corso...",
+ "logging_in_description": "Sto connettendo al server"
}
}
diff --git a/translations/ja.json b/translations/ja.json
index 70a2ad4c0..728092c56 100644
--- a/translations/ja.json
+++ b/translations/ja.json
@@ -484,7 +484,6 @@
},
"common": {
"no_results": "No Results",
- "select": "選択",
"no_trailer_available": "トレーラーがありません",
"video": "映像",
"audio": "音声",
@@ -621,7 +620,6 @@
"using_jellyfin_server": "Using Jellyfin Server",
"language": "Language",
"results": "Results",
- "searching": "Searching...",
"search_failed": "Search failed",
"no_subtitle_provider": "No subtitle provider configured on server",
"no_subtitles_found": "No subtitles found",
diff --git a/translations/ko.json b/translations/ko.json
index 8c6a53398..f16ce2f3c 100644
--- a/translations/ko.json
+++ b/translations/ko.json
@@ -484,7 +484,6 @@
},
"common": {
"no_results": "No Results",
- "select": "Select",
"no_trailer_available": "No trailer available",
"video": "Video",
"audio": "Audio",
@@ -621,7 +620,6 @@
"using_jellyfin_server": "Using Jellyfin Server",
"language": "Language",
"results": "Results",
- "searching": "Searching...",
"search_failed": "Search failed",
"no_subtitle_provider": "No subtitle provider configured on server",
"no_subtitles_found": "No subtitles found",
diff --git a/translations/nl.json b/translations/nl.json
index e7137439f..5933e2778 100644
--- a/translations/nl.json
+++ b/translations/nl.json
@@ -484,7 +484,6 @@
},
"common": {
"no_results": "No Results",
- "select": "Selecteren",
"no_trailer_available": "Geen trailer beschikbaar",
"video": "Video",
"audio": "Audio",
@@ -621,7 +620,6 @@
"using_jellyfin_server": "Using Jellyfin Server",
"language": "Language",
"results": "Results",
- "searching": "Searching...",
"search_failed": "Search failed",
"no_subtitle_provider": "No subtitle provider configured on server",
"no_subtitles_found": "No subtitles found",
diff --git a/translations/no.json b/translations/no.json
index 38fda84f0..7a37cb779 100644
--- a/translations/no.json
+++ b/translations/no.json
@@ -484,7 +484,6 @@
},
"common": {
"no_results": "No Results",
- "select": "Velg",
"no_trailer_available": "Ingen trailer tilgjengelig",
"video": "Video",
"audio": "Lyd",
@@ -621,7 +620,6 @@
"using_jellyfin_server": "Using Jellyfin Server",
"language": "Language",
"results": "Results",
- "searching": "Searching...",
"search_failed": "Search failed",
"no_subtitle_provider": "No subtitle provider configured on server",
"no_subtitles_found": "No subtitles found",
diff --git a/translations/pl.json b/translations/pl.json
index 1370e947d..cd3ab08a6 100644
--- a/translations/pl.json
+++ b/translations/pl.json
@@ -484,7 +484,6 @@
},
"common": {
"no_results": "No Results",
- "select": "Wybierz",
"no_trailer_available": "Brak dostępnego zwiastunu",
"video": "Wideo",
"audio": "Dźwięk",
@@ -621,7 +620,6 @@
"using_jellyfin_server": "Using Jellyfin Server",
"language": "Language",
"results": "Results",
- "searching": "Searching...",
"search_failed": "Search failed",
"no_subtitle_provider": "No subtitle provider configured on server",
"no_subtitles_found": "No subtitles found",
diff --git a/translations/pt.json b/translations/pt.json
index f76876f42..7caf9d1dc 100644
--- a/translations/pt.json
+++ b/translations/pt.json
@@ -484,7 +484,6 @@
},
"common": {
"no_results": "No Results",
- "select": "Selecionar",
"no_trailer_available": "Nenhum trailer disponível",
"video": "Vídeo",
"audio": "Áudio",
@@ -621,7 +620,6 @@
"using_jellyfin_server": "Using Jellyfin Server",
"language": "Language",
"results": "Results",
- "searching": "Searching...",
"search_failed": "Search failed",
"no_subtitle_provider": "No subtitle provider configured on server",
"no_subtitles_found": "No subtitles found",
diff --git a/translations/ro.json b/translations/ro.json
index 7ca56a275..c18ad0ede 100644
--- a/translations/ro.json
+++ b/translations/ro.json
@@ -484,7 +484,6 @@
},
"common": {
"no_results": "No Results",
- "select": "Selectare",
"no_trailer_available": "Nicio remorcă disponibilă",
"video": "Video",
"audio": "Audio",
@@ -621,7 +620,6 @@
"using_jellyfin_server": "Using Jellyfin Server",
"language": "Language",
"results": "Results",
- "searching": "Searching...",
"search_failed": "Search failed",
"no_subtitle_provider": "No subtitle provider configured on server",
"no_subtitles_found": "No subtitles found",
diff --git a/translations/ru.json b/translations/ru.json
index 3f7e1bec0..fc35d053a 100644
--- a/translations/ru.json
+++ b/translations/ru.json
@@ -484,7 +484,6 @@
},
"common": {
"no_results": "No Results",
- "select": "Выбрать",
"no_trailer_available": "Трейлер недоступен",
"video": "Видео",
"audio": "Звук",
@@ -621,7 +620,6 @@
"using_jellyfin_server": "Using Jellyfin Server",
"language": "Language",
"results": "Results",
- "searching": "Searching...",
"search_failed": "Search failed",
"no_subtitle_provider": "No subtitle provider configured on server",
"no_subtitles_found": "No subtitles found",
diff --git a/translations/sv.json b/translations/sv.json
index b36c4dc0d..0207e6c26 100644
--- a/translations/sv.json
+++ b/translations/sv.json
@@ -484,7 +484,6 @@
},
"common": {
"no_results": "Inga resultat",
- "select": "Välj",
"no_trailer_available": "Ingen trailer tillgänglig",
"video": "Video",
"audio": "Ljud",
@@ -621,7 +620,6 @@
"using_jellyfin_server": "Använder Jellyfin-server",
"language": "Språk",
"results": "Resultat",
- "searching": "Söker...",
"search_failed": "Sökningen misslyckades",
"no_subtitle_provider": "Ingen undertextleverantör konfigurerad på servern",
"no_subtitles_found": "Inga undertexter hittades",
diff --git a/translations/th.json b/translations/th.json
index 4feea2b86..a611bb80d 100644
--- a/translations/th.json
+++ b/translations/th.json
@@ -484,7 +484,6 @@
},
"common": {
"no_results": "No Results",
- "select": "Select",
"no_trailer_available": "No trailer available",
"video": "Video",
"audio": "Audio",
@@ -621,7 +620,6 @@
"using_jellyfin_server": "Using Jellyfin Server",
"language": "Language",
"results": "Results",
- "searching": "Searching...",
"search_failed": "Search failed",
"no_subtitle_provider": "No subtitle provider configured on server",
"no_subtitles_found": "No subtitles found",
diff --git a/translations/tlh.json b/translations/tlh.json
index b99e701a2..eee8dc081 100644
--- a/translations/tlh.json
+++ b/translations/tlh.json
@@ -484,7 +484,6 @@
},
"common": {
"no_results": "No Results",
- "select": "Select",
"no_trailer_available": "No trailer available",
"video": "mu'tlhegh",
"audio": "QoQ",
@@ -621,7 +620,6 @@
"using_jellyfin_server": "Using Jellyfin Server",
"language": "Language",
"results": "Results",
- "searching": "Searching...",
"search_failed": "Search failed",
"no_subtitle_provider": "No subtitle provider configured on server",
"no_subtitles_found": "No subtitles found",
diff --git a/translations/tr.json b/translations/tr.json
index 1600ebc13..0107d8a3d 100644
--- a/translations/tr.json
+++ b/translations/tr.json
@@ -484,7 +484,6 @@
},
"common": {
"no_results": "No Results",
- "select": "Seç",
"no_trailer_available": "Fragman mevcut değil",
"video": "Video",
"audio": "Ses",
@@ -621,7 +620,6 @@
"using_jellyfin_server": "Using Jellyfin Server",
"language": "Language",
"results": "Results",
- "searching": "Searching...",
"search_failed": "Search failed",
"no_subtitle_provider": "No subtitle provider configured on server",
"no_subtitles_found": "No subtitles found",
diff --git a/translations/uk.json b/translations/uk.json
index 7be58253f..6c04b7aa4 100644
--- a/translations/uk.json
+++ b/translations/uk.json
@@ -484,7 +484,6 @@
},
"common": {
"no_results": "No Results",
- "select": "Select",
"no_trailer_available": "No trailer available",
"video": "Video",
"audio": "Audio",
@@ -621,7 +620,6 @@
"using_jellyfin_server": "Using Jellyfin Server",
"language": "Language",
"results": "Results",
- "searching": "Searching...",
"search_failed": "Search failed",
"no_subtitle_provider": "No subtitle provider configured on server",
"no_subtitles_found": "No subtitles found",
diff --git a/translations/vi.json b/translations/vi.json
index 7977420b5..9bb01ccd0 100644
--- a/translations/vi.json
+++ b/translations/vi.json
@@ -484,7 +484,6 @@
},
"common": {
"no_results": "No Results",
- "select": "Select",
"no_trailer_available": "No trailer available",
"video": "Video",
"audio": "Âm thanh",
@@ -621,7 +620,6 @@
"using_jellyfin_server": "Using Jellyfin Server",
"language": "Language",
"results": "Results",
- "searching": "Searching...",
"search_failed": "Search failed",
"no_subtitle_provider": "No subtitle provider configured on server",
"no_subtitles_found": "No subtitles found",
diff --git a/translations/zh.json b/translations/zh.json
index 7c6c4a91a..6fc417719 100644
--- a/translations/zh.json
+++ b/translations/zh.json
@@ -484,7 +484,6 @@
},
"common": {
"no_results": "No Results",
- "select": "Select",
"no_trailer_available": "No trailer available",
"video": "Video",
"audio": "Audio",
@@ -621,7 +620,6 @@
"using_jellyfin_server": "Using Jellyfin Server",
"language": "Language",
"results": "Results",
- "searching": "Searching...",
"search_failed": "Search failed",
"no_subtitle_provider": "No subtitle provider configured on server",
"no_subtitles_found": "No subtitles found",