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",