From 4c4b18e2cd82ea06a287389fe1ebda387283ae18 Mon Sep 17 00:00:00 2001 From: edde746 <86283021+edde746@users.noreply.github.com> Date: Sat, 6 Jun 2026 11:35:38 +0200 Subject: [PATCH] fix(i18n): localize hardcoded UI strings close #1257 --- lib/i18n/bg.i18n.json | 82 ++++- lib/i18n/da.i18n.json | 84 ++++- lib/i18n/de.i18n.json | 84 ++++- lib/i18n/en.i18n.json | 82 ++++- lib/i18n/es.i18n.json | 84 ++++- lib/i18n/fr.i18n.json | 84 ++++- lib/i18n/it.i18n.json | 84 ++++- lib/i18n/ja.i18n.json | 84 ++++- lib/i18n/ko.i18n.json | 84 ++++- lib/i18n/nb.i18n.json | 84 ++++- lib/i18n/nl.i18n.json | 84 ++++- lib/i18n/pl.i18n.json | 84 ++++- lib/i18n/pt.i18n.json | 84 ++++- lib/i18n/ru.i18n.json | 84 ++++- lib/i18n/strings.g.dart | 2 +- lib/i18n/strings_bg.g.dart | 176 +++++++++- lib/i18n/strings_da.g.dart | 180 +++++++++- lib/i18n/strings_de.g.dart | 180 +++++++++- lib/i18n/strings_en.g.dart | 324 +++++++++++++++++- lib/i18n/strings_es.g.dart | 180 +++++++++- lib/i18n/strings_fr.g.dart | 180 +++++++++- lib/i18n/strings_it.g.dart | 180 +++++++++- lib/i18n/strings_ja.g.dart | 180 +++++++++- lib/i18n/strings_ko.g.dart | 180 +++++++++- lib/i18n/strings_nb.g.dart | 180 +++++++++- lib/i18n/strings_nl.g.dart | 180 +++++++++- lib/i18n/strings_pl.g.dart | 180 +++++++++- lib/i18n/strings_pt.g.dart | 180 +++++++++- lib/i18n/strings_ru.g.dart | 180 +++++++++- lib/i18n/strings_sv.g.dart | 180 +++++++++- lib/i18n/strings_zh.g.dart | 180 +++++++++- lib/i18n/sv.i18n.json | 84 ++++- lib/i18n/zh.i18n.json | 84 ++++- lib/media/media_source_info.dart | 3 +- lib/media/media_version.dart | 3 +- lib/models/livetv_channel.dart | 4 +- lib/models/livetv_program.dart | 3 +- lib/providers/companion_remote_provider.dart | 12 +- lib/providers/download_provider.dart | 5 +- lib/providers/user_profile_provider.dart | 3 +- lib/screens/discover_screen.dart | 4 +- lib/screens/media_detail/action_buttons.dart | 25 +- lib/screens/media_detail_screen.dart | 4 +- .../settings/add_plex_account_screen.dart | 2 +- .../settings/external_player_screen.dart | 5 +- .../settings/hotkey_recorder_widget.dart | 5 +- .../settings/playback_settings_screen.dart | 4 +- lib/screens/video_player/parts/live_tv.dart | 8 +- lib/screens/video_player_screen.dart | 6 +- .../companion_remote_peer_service.dart | 27 +- .../jellyfin_client/parts/browse.dart | 2 +- .../jellyfin_client/parts/live_tv.dart | 2 +- .../jellyfin_client/parts/playlists.dart | 4 +- lib/services/jellyfin_mappers.dart | 3 +- lib/services/keyboard_shortcuts_service.dart | 2 +- lib/services/pip_service.dart | 2 +- lib/services/plex_client/parts/live_tv.dart | 4 +- .../services/watch_together_peer_service.dart | 5 +- lib/widgets/media_card.dart | 2 +- .../helpers/track_selection_helper.dart | 9 +- .../video_controls/parts/navigation.dart | 2 +- .../sheets/subtitle_search_sheet.dart | 4 +- .../sheets/video_settings_sheet.dart | 31 +- .../performance_overlay.dart | 92 ++--- 64 files changed, 4391 insertions(+), 258 deletions(-) diff --git a/lib/i18n/bg.i18n.json b/lib/i18n/bg.i18n.json index e9c06286..2055bdbd 100644 --- a/lib/i18n/bg.i18n.json +++ b/lib/i18n/bg.i18n.json @@ -52,6 +52,9 @@ "settings": "Настройки", "mute": "Заглуши", "ok": "OK", + "off": "Изкл.", + "seasonNumber": "Сезон ${number}", + "chapterNumber": "Глава ${number}", "reconnect": "Свържи отново", "exit": "Изход", "viewAll": "Виж всички", @@ -257,6 +260,10 @@ "dvConversionNative": "Нативно / изключено", "dvConversionDv81": "P7 → P8.1", "dvConversionHevcStrip": "P7 → HEVC", + "dvConversionAutoDescription": "Използва засичане на възможностите на устройството и нормално fallback поведение", + "dvConversionNativeDescription": "Принуждава нативен DV7 и спира повторния опит за DV конвертиране", + "dvConversionDv81Description": "Принуждава inline RPU конвертиране към Dolby Vision профил 8.1", + "dvConversionHevcStripDescription": "Премахва Dolby Vision RPU/EL слоевете и подава обикновен HEVC", "requireProfileSelectionOnOpen": "Питай за профил при отваряне на приложението", "requireProfileSelectionOnOpenDescription": "Показвай избор на профил всеки път при отваряне на приложението", "forceTvMode": "Принуди TV режим", @@ -290,6 +297,8 @@ "hotkeys": { "setShortcutFor": "Задай клавишна комбинация за ${actionName}", "clearShortcut": "Изчисти клавишната комбинация", + "noShortcutSet": "Няма зададена клавишна комбинация", + "currentShortcut": "Текуща комбинация:", "actions": { "playPause": "Пускане/пауза", "volumeUp": "Увеличи звука", @@ -352,6 +361,7 @@ "goToSeries": "Към сериала", "goToSeason": "Към сезона", "shufflePlay": "Разбъркано възпроизвеждане", + "shuffleNotAvailableOffline": "Разбърканото възпроизвеждане не е налично офлайн", "fileInfo": "Информация за файла", "deleteFromServer": "Изтрий от сървъра", "confirmDelete": "Да се изтрие ли тази медия и файловете ѝ от вашия сървър?", @@ -470,6 +480,10 @@ "searchSubtitles": "Търсене на субтитри", "language": "Език", "noSubtitlesFound": "Не са намерени субтитри", + "downloadedSubtitle": "Изтеглени субтитри", + "noSubtitlesAvailable": "Няма налични субтитри", + "noAudioTracksAvailable": "Няма налични аудио писти", + "noTracksAvailable": "Няма налични писти", "subtitleDownloaded": "Субтитърът е изтеглен", "subtitleDownloadFailed": "Неуспешно изтегляне на субтитър", "searchLanguages": "Търсене на езици..." @@ -615,7 +629,8 @@ "pinProtectionOptional": "PIN защита (по желание)", "pinExplain": "Изисква се 4-цифрен PIN за смяна на профили.", "continueButton": "Продължи", - "pinsDontMatch": "PIN кодовете не съвпадат" + "pinsDontMatch": "PIN кодовете не съвпадат", + "initializeServicesFailed": "Неуспешно инициализиране на услугите за профили" }, "connections": { "sectionTitle": "Връзки", @@ -647,7 +662,8 @@ "rating": "Рейтинг", "movie": "Филм", "tvShow": "ТВ сериал", - "minutesLeft": "Остават ${minutes} мин" + "minutesLeft": "Остават ${minutes} мин", + "moreLikeThis": "Подобно на това" }, "errors": { "searchFailed": "Търсенето е неуспешно: ${error}", @@ -666,6 +682,7 @@ }, "libraries": { "title": "Библиотеки", + "fallbackTitle": "Библиотека", "scanLibraryFiles": "Сканирай файловете на библиотеката", "scanLibrary": "Сканирай библиотеката", "analyze": "Анализирай", @@ -788,6 +805,12 @@ "noChannels": "Няма налични канали", "noDvr": "Няма конфигуриран DVR на нито един сървър", "noPrograms": "Няма налични програмни данни", + "liveStreamFailed": "Потокът на живо се провали", + "unknownProgram": "Неизвестна програма", + "unknownHub": "Неизвестно", + "unknownError": "Неизвестна грешка", + "channelNumber": "Канал ${number}", + "unknownChannel": "Неизвестен канал", "live": "НА ЖИВО", "reloadGuide": "Презареди ТВ програмата", "now": "Сега", @@ -966,10 +989,19 @@ "deleteDownload": "Изтрий изтегляне", "retryDownload": "Опитай изтеглянето отново", "downloadQueued": "Изтеглянето е добавено в опашката", + "downloadResumed": "Изтеглянето е възобновено", "serverErrorBitrate": "Грешка на сървъра: файлът може да надвишава лимита за отдалечен битрейт", "episodesQueued": "${count} епизода са добавени в опашката за изтегляне", "downloadDeleted": "Изтеглянето е изтрито", "deleteConfirm": "Да се изтрие ли \"${title}\" от това устройство?", + "cancelledDownloadTitle": "Отменено изтегляне", + "cancelledDownloadMessage": "Това изтегляне беше отменено. Какво искате да направите?", + "allEpisodesAlreadyDownloaded": "Всички епизоди вече са изтеглени", + "resumeDownload": "Възобнови изтеглянето", + "cancelledDownload": "Отменено изтегляне", + "syncingFile": "${file} (синхронизира се ${status})", + "downloadedFileClickToComplete": "Изтеглен ${file} — щракнете за довършване", + "partialDownloadClickToComplete": "Частично изтеглено — щракнете за довършване", "deleting": "Изтриване...", "deletingWithProgress": "Изтриване на ${title}... (${current} от ${total})", "queuedTooltip": "В опашката", @@ -1032,6 +1064,7 @@ "companionRemote": { "title": "Дистанционно управление", "connectedTo": "Свързан към ${name}", + "unknownDevice": "Непознато устройство", "session": { "startingServer": "Стартиране на сървър за дистанционно управление...", "failedToCreate": "Неуспешно стартиране на сървър за дистанционно управление:", @@ -1091,6 +1124,14 @@ "subtitles": "Субтитри", "audio": "Аудио", "searchHint": "Търсене на настолен компютър..." + }, + "errors": { + "noNetworkInterface": "Не е намерен мрежов интерфейс", + "authenticationFailed": "Неуспешно удостоверяване", + "joinTimedOut": "Времето за присъединяване към сесията изтече", + "failedToConnectAnyAddress": "Неуспешно свързване към който и да е адрес", + "connectionLostAfterAttempts": "Връзката е загубена след ${attempts} опита", + "connectionLost": "Връзката е загубена" } }, "videoSettings": { @@ -1105,6 +1146,42 @@ "audioPassthrough": "Аудио passthrough", "audioNormalization": "Нормализиране на силата на звука" }, + "performanceOverlay": { + "color": "Цвят", + "performance": "Производителност", + "buffer": "Буфер", + "app": "Приложение", + "decoder": "Декодер", + "rawDecoder": "Суров декодер", + "tunneling": "Тунелиране", + "aspect": "Съотношение", + "rotation": "Завъртане", + "dvSource": "DV източник", + "dvPath": "DV път", + "p7Conversion": "P7 конв.", + "sampleRate": "Честота", + "pixelFormat": "Пикселен формат", + "hwFormat": "HW формат", + "matrix": "Матрица", + "primaries": "Основни цветове", + "transfer": "Трансфер", + "renderFps": "Render FPS", + "displayFps": "Display FPS", + "avSync": "A/V синхр.", + "dropped": "Изпуснати", + "dvRpus": "DV RPU", + "dvRpuAverage": "Средно DV RPU", + "dvSampleAverage": "Средно DV семпл", + "maxLuma": "Макс. яркост", + "minLuma": "Мин. яркост", + "maxCll": "MaxCLL", + "maxFall": "MaxFALL", + "cacheUsed": "Използван кеш", + "speed": "Скорост", + "player": "Плеър", + "memory": "Памет", + "uiFps": "UI FPS" + }, "externalPlayer": { "title": "Външен плеър", "useExternalPlayer": "Използвай външен плеър", @@ -1114,6 +1191,7 @@ "systemDefault": "Системен по подразбиране", "addCustomPlayer": "Добави персонален плейър", "playerName": "Име на плейъра", + "playerNameHint": "Моят плеър", "playerCommand": "Команда", "playerPackage": "Име на пакет", "playerUrlScheme": "URL схема", diff --git a/lib/i18n/da.i18n.json b/lib/i18n/da.i18n.json index 26179794..cac9b303 100644 --- a/lib/i18n/da.i18n.json +++ b/lib/i18n/da.i18n.json @@ -52,6 +52,9 @@ "settings": "Indstillinger", "mute": "Lydløs", "ok": "OK", + "off": "Fra", + "seasonNumber": "Sæson ${number}", + "chapterNumber": "Kapitel ${number}", "reconnect": "Genopret forbindelse", "exit": "Afslut", "viewAll": "Vis alle", @@ -257,6 +260,10 @@ "dvConversionNative": "Native / deaktiveret", "dvConversionDv81": "P7 → P8.1", "dvConversionHevcStrip": "P7 → HEVC", + "dvConversionAutoDescription": "Brug enhedens kapabilitetsregistrering og normal fallbackadfærd", + "dvConversionNativeDescription": "Tving native DV7 og undertryk forsøg på DV-konvertering", + "dvConversionDv81Description": "Tving inline RPU-konvertering til Dolby Vision profil 8.1", + "dvConversionHevcStripDescription": "Fjern Dolby Vision RPU/EL-lag og brug almindelig HEVC", "requireProfileSelectionOnOpen": "Spørg om profil ved åbning", "requireProfileSelectionOnOpenDescription": "Vis profilvalg hver gang appen åbnes", "forceTvMode": "Gennemtving TV-tilstand", @@ -290,6 +297,8 @@ "hotkeys": { "setShortcutFor": "Indstil genvej for ${actionName}", "clearShortcut": "Ryd genvej", + "noShortcutSet": "Ingen genvej angivet", + "currentShortcut": "Nuværende genvej:", "actions": { "playPause": "Afspil/Pause", "volumeUp": "Lydstyrke op", @@ -352,6 +361,7 @@ "goToSeries": "Gå til serie", "goToSeason": "Gå til sæson", "shufflePlay": "Afspil tilfældigt", + "shuffleNotAvailableOffline": "Bland afspilning er ikke tilgængelig offline", "fileInfo": "Filinfo", "deleteFromServer": "Slet fra server", "confirmDelete": "Slet dette medie og dets filer fra din server?", @@ -470,6 +480,10 @@ "searchSubtitles": "Søg undertekster", "language": "Sprog", "noSubtitlesFound": "Ingen undertekster fundet", + "downloadedSubtitle": "Downloadet", + "noSubtitlesAvailable": "Ingen undertekster tilgængelige", + "noAudioTracksAvailable": "Ingen lydspor tilgængelige", + "noTracksAvailable": "Ingen spor tilgængelige", "subtitleDownloaded": "Undertekst downloadet", "subtitleDownloadFailed": "Kunne ikke downloade undertekst", "searchLanguages": "Søg sprog..." @@ -615,7 +629,8 @@ "pinProtectionOptional": "PIN-beskyttelse (valgfri)", "pinExplain": "4-cifret PIN kræves for at skifte profiler.", "continueButton": "Fortsæt", - "pinsDontMatch": "PIN-koder matcher ikke" + "pinsDontMatch": "PIN-koder matcher ikke", + "initializeServicesFailed": "Kunne ikke initialisere profiltjenester" }, "connections": { "sectionTitle": "Forbindelser", @@ -647,7 +662,8 @@ "rating": "Bedømmelse", "movie": "Film", "tvShow": "TV-serie", - "minutesLeft": "${minutes} min tilbage" + "minutesLeft": "${minutes} min tilbage", + "moreLikeThis": "Mere som dette" }, "errors": { "searchFailed": "Søgning mislykkedes: ${error}", @@ -666,6 +682,7 @@ }, "libraries": { "title": "Biblioteker", + "fallbackTitle": "Bibliotek", "scanLibraryFiles": "Scan biblioteksfiler", "scanLibrary": "Scan bibliotek", "analyze": "Analysér", @@ -788,6 +805,12 @@ "noChannels": "Ingen kanaler tilgængelige", "noDvr": "Ingen DVR konfigureret på nogen server", "noPrograms": "Ingen programdata tilgængelig", + "liveStreamFailed": "Livestream mislykkedes", + "unknownProgram": "Ukendt program", + "unknownHub": "Ukendt", + "unknownError": "Ukendt fejl", + "channelNumber": "Kanal ${number}", + "unknownChannel": "Ukendt kanal", "live": "LIVE", "reloadGuide": "Genindlæs guide", "now": "Nu", @@ -966,12 +989,21 @@ "deleteDownload": "Slet download", "retryDownload": "Prøv download igen", "downloadQueued": "Download i kø", + "downloadResumed": "Download genoptaget", "serverErrorBitrate": "Serverfejl: filen overskrider muligvis grænsen for ekstern bitrate", "episodesQueued": "${count} episoder i downloadkø", "downloadDeleted": "Download slettet", "deleteConfirm": "Slet \"${title}\" fra denne enhed?", - "deletingWithProgress": "Sletter ${title}... (${current} af ${total})", + "cancelledDownloadTitle": "Annulleret download", + "cancelledDownloadMessage": "Denne download blev annulleret. Hvad vil du gøre?", + "allEpisodesAlreadyDownloaded": "Alle episoder er allerede downloadet", + "resumeDownload": "Genoptag download", + "cancelledDownload": "Annulleret download", + "syncingFile": "${file} (synkroniserer ${status})", + "downloadedFileClickToComplete": "${file} downloadet — klik for at fuldføre", + "partialDownloadClickToComplete": "Delvist downloadet — klik for at fuldføre", "deleting": "Sletter...", + "deletingWithProgress": "Sletter ${title}... (${current} af ${total})", "queuedTooltip": "I kø", "queuedFilesTooltip": "I kø: ${files}", "downloadingTooltip": "Downloader...", @@ -1032,6 +1064,7 @@ "companionRemote": { "title": "Fjernbetjening", "connectedTo": "Forbundet til ${name}", + "unknownDevice": "Ukendt enhed", "session": { "startingServer": "Starter fjernserver...", "failedToCreate": "Kunne ikke starte fjernserver:", @@ -1091,6 +1124,14 @@ "subtitles": "Undertekster", "audio": "Lyd", "searchHint": "Søg på desktop..." + }, + "errors": { + "noNetworkInterface": "Ingen netværksgrænseflade fundet", + "authenticationFailed": "Godkendelse mislykkedes", + "joinTimedOut": "Tidsgrænse for deltagelse i session overskredet", + "failedToConnectAnyAddress": "Kunne ikke oprette forbindelse til nogen adresse", + "connectionLostAfterAttempts": "Forbindelse mistet efter ${attempts} forsøg", + "connectionLost": "Forbindelse mistet" } }, "videoSettings": { @@ -1105,6 +1146,42 @@ "audioPassthrough": "Lyd-passthrough", "audioNormalization": "Normalisér lydstyrke" }, + "performanceOverlay": { + "color": "Farve", + "performance": "Ydeevne", + "buffer": "Buffer", + "app": "App", + "decoder": "Dekoder", + "rawDecoder": "Rå dekoder", + "tunneling": "Tunneling", + "aspect": "Billedformat", + "rotation": "Rotation", + "dvSource": "DV-kilde", + "dvPath": "DV-sti", + "p7Conversion": "P7-konv.", + "sampleRate": "Samplingsrate", + "pixelFormat": "Pixelformat", + "hwFormat": "HW-format", + "matrix": "Matrix", + "primaries": "Primærfarver", + "transfer": "Transfer", + "renderFps": "Render FPS", + "displayFps": "Skærm-FPS", + "avSync": "A/V-synk.", + "dropped": "Tabte", + "dvRpus": "DV RPU’er", + "dvRpuAverage": "DV RPU gns.", + "dvSampleAverage": "DV-sample gns.", + "maxLuma": "Maks. luma", + "minLuma": "Min. luma", + "maxCll": "MaxCLL", + "maxFall": "MaxFALL", + "cacheUsed": "Brugt cache", + "speed": "Hastighed", + "player": "Afspiller", + "memory": "Hukommelse", + "uiFps": "UI FPS" + }, "externalPlayer": { "title": "Ekstern afspiller", "useExternalPlayer": "Brug ekstern afspiller", @@ -1114,6 +1191,7 @@ "systemDefault": "Systemstandard", "addCustomPlayer": "Tilføj brugerdefineret afspiller", "playerName": "Afspillernavn", + "playerNameHint": "Min afspiller", "playerCommand": "Kommando", "playerPackage": "Pakkenavn", "playerUrlScheme": "URL-skema", diff --git a/lib/i18n/de.i18n.json b/lib/i18n/de.i18n.json index 79d71994..b04014f4 100644 --- a/lib/i18n/de.i18n.json +++ b/lib/i18n/de.i18n.json @@ -52,6 +52,9 @@ "settings": "Optionen", "mute": "Stumm", "ok": "OK", + "off": "Aus", + "seasonNumber": "Staffel ${number}", + "chapterNumber": "Kapitel ${number}", "reconnect": "Erneut verbinden", "exit": "Beenden", "viewAll": "Alle anzeigen", @@ -257,6 +260,10 @@ "dvConversionNative": "Nativ / deaktiviert", "dvConversionDv81": "P7 → P8.1", "dvConversionHevcStrip": "P7 → HEVC", + "dvConversionAutoDescription": "Gerätefähigkeiten erkennen und normales Fallback-Verhalten verwenden", + "dvConversionNativeDescription": "Natives DV7 erzwingen und DV-Konvertierungsversuch unterdrücken", + "dvConversionDv81Description": "Inline-RPU-Konvertierung zu Dolby Vision Profil 8.1 erzwingen", + "dvConversionHevcStripDescription": "Dolby-Vision-RPU/EL-Schichten entfernen und reines HEVC ausgeben", "requireProfileSelectionOnOpen": "Profil beim Öffnen abfragen", "requireProfileSelectionOnOpenDescription": "Profilauswahl bei jedem Öffnen der App anzeigen", "forceTvMode": "TV-Modus erzwingen", @@ -290,6 +297,8 @@ "hotkeys": { "setShortcutFor": "Tastenkürzel festlegen für ${actionName}", "clearShortcut": "Kürzel löschen", + "noShortcutSet": "Keine Tastenkombination festgelegt", + "currentShortcut": "Aktuelle Tastenkombination:", "actions": { "playPause": "Wiedergabe/Pause", "volumeUp": "Lauter", @@ -352,6 +361,7 @@ "goToSeries": "Zur Serie", "goToSeason": "Zur Staffel", "shufflePlay": "Zufallswiedergabe", + "shuffleNotAvailableOffline": "Zufallswiedergabe ist offline nicht verfügbar", "fileInfo": "Dateiinfo", "deleteFromServer": "Vom Server löschen", "confirmDelete": "Dieses Medium und seine Dateien von deinem Server löschen?", @@ -470,6 +480,10 @@ "searchSubtitles": "Untertitel suchen", "language": "Sprache", "noSubtitlesFound": "Keine Untertitel gefunden", + "downloadedSubtitle": "Heruntergeladen", + "noSubtitlesAvailable": "Keine Untertitel verfügbar", + "noAudioTracksAvailable": "Keine Audiospuren verfügbar", + "noTracksAvailable": "Keine Spuren verfügbar", "subtitleDownloaded": "Untertitel heruntergeladen", "subtitleDownloadFailed": "Untertitel konnte nicht heruntergeladen werden", "searchLanguages": "Sprachen suchen..." @@ -615,7 +629,8 @@ "pinProtectionOptional": "PIN-Schutz (optional)", "pinExplain": "4-stellige PIN zum Profilwechsel erforderlich.", "continueButton": "Weiter", - "pinsDontMatch": "PINs stimmen nicht überein" + "pinsDontMatch": "PINs stimmen nicht überein", + "initializeServicesFailed": "Profildienste konnten nicht initialisiert werden" }, "connections": { "sectionTitle": "Verbindungen", @@ -647,7 +662,8 @@ "rating": "Altersfreigabe", "movie": "Film", "tvShow": "Serie", - "minutesLeft": "${minutes} Min übrig" + "minutesLeft": "${minutes} Min übrig", + "moreLikeThis": "Ähnliche Inhalte" }, "errors": { "searchFailed": "Suche fehlgeschlagen: ${error}", @@ -666,6 +682,7 @@ }, "libraries": { "title": "Mediatheken", + "fallbackTitle": "Mediathek", "scanLibraryFiles": "Mediatheksdateien scannen", "scanLibrary": "Mediathek scannen", "analyze": "Analysieren", @@ -788,6 +805,12 @@ "noChannels": "Keine Kanäle verfügbar", "noDvr": "Kein DVR auf einem Server konfiguriert", "noPrograms": "Keine Programmdaten verfügbar", + "liveStreamFailed": "Livestream fehlgeschlagen", + "unknownProgram": "Unbekannte Sendung", + "unknownHub": "Unbekannt", + "unknownError": "Unbekannter Fehler", + "channelNumber": "Kanal ${number}", + "unknownChannel": "Unbekannter Kanal", "live": "LIVE", "reloadGuide": "Programmführer neu laden", "now": "Jetzt", @@ -966,12 +989,21 @@ "deleteDownload": "Download löschen", "retryDownload": "Download wiederholen", "downloadQueued": "Download in Warteschlange", + "downloadResumed": "Download fortgesetzt", "serverErrorBitrate": "Serverfehler: Datei überschreitet möglicherweise das Remote-Bitrate-Limit", "episodesQueued": "${count} Episoden zum Download hinzugefügt", "downloadDeleted": "Download gelöscht", "deleteConfirm": "\"${title}\" von diesem Gerät löschen?", - "deletingWithProgress": "Lösche ${title}... (${current} von ${total})", + "cancelledDownloadTitle": "Abgebrochener Download", + "cancelledDownloadMessage": "Dieser Download wurde abgebrochen. Was möchtest du tun?", + "allEpisodesAlreadyDownloaded": "Alle Episoden sind bereits heruntergeladen", + "resumeDownload": "Download fortsetzen", + "cancelledDownload": "Abgebrochener Download", + "syncingFile": "${file} (${status} wird synchronisiert)", + "downloadedFileClickToComplete": "${file} heruntergeladen — zum Abschließen klicken", + "partialDownloadClickToComplete": "Teilweise heruntergeladen — zum Abschließen klicken", "deleting": "Lösche...", + "deletingWithProgress": "Lösche ${title}... (${current} von ${total})", "queuedTooltip": "In Warteschlange", "queuedFilesTooltip": "In Warteschlange: ${files}", "downloadingTooltip": "Lädt herunter...", @@ -1032,6 +1064,7 @@ "companionRemote": { "title": "Companion-Fernbedienung", "connectedTo": "Verbunden mit ${name}", + "unknownDevice": "Unbekanntes Gerät", "session": { "startingServer": "Remote-Server wird gestartet...", "failedToCreate": "Remote-Server konnte nicht gestartet werden:", @@ -1091,6 +1124,14 @@ "subtitles": "Untertitel", "audio": "Audio", "searchHint": "Auf Desktop suchen..." + }, + "errors": { + "noNetworkInterface": "Keine Netzwerkschnittstelle gefunden", + "authenticationFailed": "Authentifizierung fehlgeschlagen", + "joinTimedOut": "Zeitüberschreitung beim Beitreten zur Sitzung", + "failedToConnectAnyAddress": "Keine Verbindung zu einer Adresse möglich", + "connectionLostAfterAttempts": "Verbindung nach ${attempts} Versuchen verloren", + "connectionLost": "Verbindung verloren" } }, "videoSettings": { @@ -1105,6 +1146,42 @@ "audioPassthrough": "Audio-Durchleitung", "audioNormalization": "Lautstärke normalisieren" }, + "performanceOverlay": { + "color": "Farbe", + "performance": "Leistung", + "buffer": "Puffer", + "app": "App", + "decoder": "Decoder", + "rawDecoder": "Raw-Decoder", + "tunneling": "Tunneling", + "aspect": "Seitenverhältnis", + "rotation": "Drehung", + "dvSource": "DV-Quelle", + "dvPath": "DV-Pfad", + "p7Conversion": "P7-Konv.", + "sampleRate": "Abtastrate", + "pixelFormat": "Pixelformat", + "hwFormat": "HW-Format", + "matrix": "Matrix", + "primaries": "Primärfarben", + "transfer": "Transfer", + "renderFps": "Render-FPS", + "displayFps": "Display-FPS", + "avSync": "A/V-Sync", + "dropped": "Verworfen", + "dvRpus": "DV-RPUs", + "dvRpuAverage": "DV-RPU Ø", + "dvSampleAverage": "DV-Sample Ø", + "maxLuma": "Max. Luma", + "minLuma": "Min. Luma", + "maxCll": "MaxCLL", + "maxFall": "MaxFALL", + "cacheUsed": "Cache genutzt", + "speed": "Geschwindigkeit", + "player": "Player", + "memory": "Speicher", + "uiFps": "UI-FPS" + }, "externalPlayer": { "title": "Externer Player", "useExternalPlayer": "Externen Player verwenden", @@ -1114,6 +1191,7 @@ "systemDefault": "Systemstandard", "addCustomPlayer": "Benutzerdefinierten Player hinzufügen", "playerName": "Playername", + "playerNameHint": "Mein Player", "playerCommand": "Befehl", "playerPackage": "Paketname", "playerUrlScheme": "URL-Schema", diff --git a/lib/i18n/en.i18n.json b/lib/i18n/en.i18n.json index a5e490df..2606d102 100644 --- a/lib/i18n/en.i18n.json +++ b/lib/i18n/en.i18n.json @@ -52,6 +52,9 @@ "settings": "Settings", "mute": "Mute", "ok": "OK", + "off": "Off", + "seasonNumber": "Season ${number}", + "chapterNumber": "Chapter ${number}", "reconnect": "Reconnect", "exit": "Exit", "viewAll": "View All", @@ -257,6 +260,10 @@ "dvConversionNative": "Native / Disabled", "dvConversionDv81": "P7 → P8.1", "dvConversionHevcStrip": "P7 → HEVC", + "dvConversionAutoDescription": "Use device capability detection and normal fallback behavior", + "dvConversionNativeDescription": "Force native DV7 and suppress DV conversion retry", + "dvConversionDv81Description": "Force inline RPU conversion to Dolby Vision profile 8.1", + "dvConversionHevcStripDescription": "Strip Dolby Vision RPU/EL layers and present plain HEVC", "requireProfileSelectionOnOpen": "Ask for profile on app open", "requireProfileSelectionOnOpenDescription": "Show profile selection every time the app is opened", "forceTvMode": "Force TV mode", @@ -290,6 +297,8 @@ "hotkeys": { "setShortcutFor": "Set Shortcut for ${actionName}", "clearShortcut": "Clear shortcut", + "noShortcutSet": "No shortcut set", + "currentShortcut": "Current shortcut:", "actions": { "playPause": "Play/Pause", "volumeUp": "Volume Up", @@ -352,6 +361,7 @@ "goToSeries": "Go to series", "goToSeason": "Go to season", "shufflePlay": "Shuffle Play", + "shuffleNotAvailableOffline": "Shuffle not available offline", "fileInfo": "File Info", "deleteFromServer": "Delete from server", "confirmDelete": "Delete this media and its files from your server?", @@ -470,6 +480,10 @@ "searchSubtitles": "Search Subtitles", "language": "Language", "noSubtitlesFound": "No subtitles found", + "downloadedSubtitle": "Downloaded", + "noSubtitlesAvailable": "No subtitles available", + "noAudioTracksAvailable": "No audio tracks available", + "noTracksAvailable": "No tracks available", "subtitleDownloaded": "Subtitle downloaded", "subtitleDownloadFailed": "Failed to download subtitle", "searchLanguages": "Search languages..." @@ -615,7 +629,8 @@ "pinProtectionOptional": "PIN protection (optional)", "pinExplain": "4-digit PIN required to switch profiles.", "continueButton": "Continue", - "pinsDontMatch": "PINs don't match" + "pinsDontMatch": "PINs don't match", + "initializeServicesFailed": "Failed to initialize profile services" }, "connections": { "sectionTitle": "Connections", @@ -647,7 +662,8 @@ "rating": "Rating", "movie": "Movie", "tvShow": "TV Show", - "minutesLeft": "${minutes} min left" + "minutesLeft": "${minutes} min left", + "moreLikeThis": "More Like This" }, "errors": { "searchFailed": "Search failed: ${error}", @@ -666,6 +682,7 @@ }, "libraries": { "title": "Libraries", + "fallbackTitle": "Library", "scanLibraryFiles": "Scan Library Files", "scanLibrary": "Scan Library", "analyze": "Analyze", @@ -788,6 +805,12 @@ "noChannels": "No channels available", "noDvr": "No DVR configured on any server", "noPrograms": "No program data available", + "liveStreamFailed": "Live stream failed", + "unknownProgram": "Unknown Program", + "unknownHub": "Unknown", + "unknownError": "Unknown error", + "channelNumber": "Channel ${number}", + "unknownChannel": "Unknown channel", "live": "LIVE", "reloadGuide": "Reload Guide", "now": "Now", @@ -966,10 +989,19 @@ "deleteDownload": "Delete download", "retryDownload": "Retry download", "downloadQueued": "Download queued", + "downloadResumed": "Download resumed", "serverErrorBitrate": "Server error: file may exceed the remote bitrate limit", "episodesQueued": "${count} episodes queued for download", "downloadDeleted": "Download deleted", "deleteConfirm": "Delete \"${title}\" from this device?", + "cancelledDownloadTitle": "Cancelled Download", + "cancelledDownloadMessage": "This download was cancelled. What would you like to do?", + "allEpisodesAlreadyDownloaded": "All episodes already downloaded", + "resumeDownload": "Resume download", + "cancelledDownload": "Cancelled download", + "syncingFile": "${file} (syncing ${status})", + "downloadedFileClickToComplete": "Downloaded ${file} - Click to complete", + "partialDownloadClickToComplete": "Partially downloaded - Click to complete", "deleting": "Deleting...", "deletingWithProgress": "Deleting ${title}... (${current} of ${total})", "queuedTooltip": "Queued", @@ -1032,6 +1064,7 @@ "companionRemote": { "title": "Companion Remote", "connectedTo": "Connected to ${name}", + "unknownDevice": "Unknown Device", "session": { "startingServer": "Starting remote server...", "failedToCreate": "Failed to start remote server:", @@ -1091,6 +1124,14 @@ "subtitles": "Subtitles", "audio": "Audio", "searchHint": "Search on desktop..." + }, + "errors": { + "noNetworkInterface": "No network interface found", + "authenticationFailed": "Authentication failed", + "joinTimedOut": "Timed out joining session", + "failedToConnectAnyAddress": "Failed to connect to any address", + "connectionLostAfterAttempts": "Connection lost after ${attempts} attempts", + "connectionLost": "Connection lost" } }, "videoSettings": { @@ -1105,6 +1146,42 @@ "audioPassthrough": "Audio Passthrough", "audioNormalization": "Normalize Loudness" }, + "performanceOverlay": { + "color": "Color", + "performance": "Performance", + "buffer": "Buffer", + "app": "App", + "decoder": "Decoder", + "rawDecoder": "Raw Decoder", + "tunneling": "Tunneling", + "aspect": "Aspect", + "rotation": "Rotation", + "dvSource": "DV Source", + "dvPath": "DV Path", + "p7Conversion": "P7 Conv", + "sampleRate": "Sample Rate", + "pixelFormat": "Pixel Fmt", + "hwFormat": "HW Fmt", + "matrix": "Matrix", + "primaries": "Primaries", + "transfer": "Transfer", + "renderFps": "Render FPS", + "displayFps": "Display FPS", + "avSync": "A/V Sync", + "dropped": "Dropped", + "dvRpus": "DV RPUs", + "dvRpuAverage": "DV RPU Avg", + "dvSampleAverage": "DV Sample Avg", + "maxLuma": "Max Luma", + "minLuma": "Min Luma", + "maxCll": "MaxCLL", + "maxFall": "MaxFALL", + "cacheUsed": "Cache Used", + "speed": "Speed", + "player": "Player", + "memory": "Memory", + "uiFps": "UI FPS" + }, "externalPlayer": { "title": "External Player", "useExternalPlayer": "Use External Player", @@ -1114,6 +1191,7 @@ "systemDefault": "System Default", "addCustomPlayer": "Add Custom Player", "playerName": "Player Name", + "playerNameHint": "My Player", "playerCommand": "Command", "playerPackage": "Package Name", "playerUrlScheme": "URL Scheme", diff --git a/lib/i18n/es.i18n.json b/lib/i18n/es.i18n.json index 4664de99..daad7fe2 100644 --- a/lib/i18n/es.i18n.json +++ b/lib/i18n/es.i18n.json @@ -52,6 +52,9 @@ "settings": "Ajustes", "mute": "Silencio", "ok": "OK", + "off": "Desactivado", + "seasonNumber": "Temporada ${number}", + "chapterNumber": "Capítulo ${number}", "reconnect": "Reconectar", "exit": "Salir", "viewAll": "Ver todo", @@ -257,6 +260,10 @@ "dvConversionNative": "Nativo / desactivado", "dvConversionDv81": "P7 → P8.1", "dvConversionHevcStrip": "P7 → HEVC", + "dvConversionAutoDescription": "Usar detección de capacidades del dispositivo y el comportamiento de respaldo normal", + "dvConversionNativeDescription": "Forzar DV7 nativo y suprimir el reintento de conversión DV", + "dvConversionDv81Description": "Forzar conversión RPU en línea a Dolby Vision perfil 8.1", + "dvConversionHevcStripDescription": "Quitar capas RPU/EL de Dolby Vision y presentar HEVC normal", "requireProfileSelectionOnOpen": "Pedir perfil al abrir la app", "requireProfileSelectionOnOpenDescription": "Mostrar selección de perfil cada vez que se abre la aplicación", "forceTvMode": "Forzar modo TV", @@ -290,6 +297,8 @@ "hotkeys": { "setShortcutFor": "Establecer atajo para ${actionName}", "clearShortcut": "Borrar atajo", + "noShortcutSet": "Sin atajo asignado", + "currentShortcut": "Atajo actual:", "actions": { "playPause": "Reproducir/Pausar", "volumeUp": "Subir Volumen", @@ -352,6 +361,7 @@ "goToSeries": "Ir a la serie", "goToSeason": "Ir a la temporada", "shufflePlay": "Reproducción Aleatoria", + "shuffleNotAvailableOffline": "La reproducción aleatoria no está disponible sin conexión", "fileInfo": "Información del Archivo", "deleteFromServer": "Eliminar del servidor", "confirmDelete": "¿Eliminar este medio y sus archivos de tu servidor?", @@ -470,6 +480,10 @@ "searchSubtitles": "Buscar subtítulos", "language": "Idioma", "noSubtitlesFound": "No se encontraron subtítulos", + "downloadedSubtitle": "Descargado", + "noSubtitlesAvailable": "No hay subtítulos disponibles", + "noAudioTracksAvailable": "No hay pistas de audio disponibles", + "noTracksAvailable": "No hay pistas disponibles", "subtitleDownloaded": "Subtítulo descargado", "subtitleDownloadFailed": "Error al descargar subtítulo", "searchLanguages": "Buscar idiomas..." @@ -615,7 +629,8 @@ "pinProtectionOptional": "Protección con PIN (opcional)", "pinExplain": "Se requiere PIN de 4 dígitos para cambiar de perfil.", "continueButton": "Continuar", - "pinsDontMatch": "Los PIN no coinciden" + "pinsDontMatch": "Los PIN no coinciden", + "initializeServicesFailed": "No se pudieron inicializar los servicios de perfil" }, "connections": { "sectionTitle": "Conexiones", @@ -647,7 +662,8 @@ "rating": "Calificación", "movie": "Película", "tvShow": "Serie de TV", - "minutesLeft": "quedan ${minutes} min" + "minutesLeft": "quedan ${minutes} min", + "moreLikeThis": "Más como esto" }, "errors": { "searchFailed": "Error en la búsqueda: ${error}", @@ -666,6 +682,7 @@ }, "libraries": { "title": "Bibliotecas", + "fallbackTitle": "Biblioteca", "scanLibraryFiles": "Escanear Archivos de la Biblioteca", "scanLibrary": "Escanear Biblioteca", "analyze": "Analizar", @@ -788,6 +805,12 @@ "noChannels": "No hay canales disponibles", "noDvr": "No hay DVR configurado en ningún servidor", "noPrograms": "No hay datos de programación disponibles", + "liveStreamFailed": "Falló la transmisión en vivo", + "unknownProgram": "Programa desconocido", + "unknownHub": "Desconocido", + "unknownError": "Error desconocido", + "channelNumber": "Canal ${number}", + "unknownChannel": "Canal desconocido", "live": "EN VIVO", "reloadGuide": "Recargar guía", "now": "Ahora", @@ -966,12 +989,21 @@ "deleteDownload": "Eliminar descarga", "retryDownload": "Reintentar descarga", "downloadQueued": "Descarga en cola", + "downloadResumed": "Descarga reanudada", "serverErrorBitrate": "Error del servidor: el archivo puede superar el límite de bitrate remoto", "episodesQueued": "${count} episodios en cola para descargar", "downloadDeleted": "Descarga eliminada", "deleteConfirm": "¿Eliminar \"${title}\" de este dispositivo?", - "deletingWithProgress": "Eliminando ${title}... (${current} de ${total})", + "cancelledDownloadTitle": "Descarga cancelada", + "cancelledDownloadMessage": "Esta descarga se canceló. ¿Qué quieres hacer?", + "allEpisodesAlreadyDownloaded": "Todos los episodios ya están descargados", + "resumeDownload": "Reanudar descarga", + "cancelledDownload": "Descarga cancelada", + "syncingFile": "${file} (sincronizando ${status})", + "downloadedFileClickToComplete": "${file} descargado — haz clic para completar", + "partialDownloadClickToComplete": "Descarga parcial — haz clic para completar", "deleting": "Eliminando...", + "deletingWithProgress": "Eliminando ${title}... (${current} de ${total})", "queuedTooltip": "En cola", "queuedFilesTooltip": "En cola: ${files}", "downloadingTooltip": "Descargando...", @@ -1032,6 +1064,7 @@ "companionRemote": { "title": "Control remoto", "connectedTo": "Conectado a ${name}", + "unknownDevice": "Dispositivo desconocido", "session": { "startingServer": "Iniciando servidor remoto...", "failedToCreate": "Error al iniciar el servidor remoto:", @@ -1091,6 +1124,14 @@ "subtitles": "Subtítulos", "audio": "Audio", "searchHint": "Buscar en escritorio..." + }, + "errors": { + "noNetworkInterface": "No se encontró ninguna interfaz de red", + "authenticationFailed": "Autenticación fallida", + "joinTimedOut": "Se agotó el tiempo al unirse a la sesión", + "failedToConnectAnyAddress": "No se pudo conectar a ninguna dirección", + "connectionLostAfterAttempts": "Conexión perdida tras ${attempts} intentos", + "connectionLost": "Conexión perdida" } }, "videoSettings": { @@ -1105,6 +1146,42 @@ "audioPassthrough": "Audio Passthrough", "audioNormalization": "Normalizar volumen" }, + "performanceOverlay": { + "color": "Color", + "performance": "Rendimiento", + "buffer": "Búfer", + "app": "App", + "decoder": "Decodificador", + "rawDecoder": "Decodificador raw", + "tunneling": "Túnel", + "aspect": "Aspecto", + "rotation": "Rotación", + "dvSource": "Origen DV", + "dvPath": "Ruta DV", + "p7Conversion": "Conv. P7", + "sampleRate": "Frecuencia de muestreo", + "pixelFormat": "Formato de píxel", + "hwFormat": "Formato HW", + "matrix": "Matriz", + "primaries": "Primarios", + "transfer": "Transferencia", + "renderFps": "FPS render", + "displayFps": "FPS pantalla", + "avSync": "Sincronía A/V", + "dropped": "Descartados", + "dvRpus": "DV RPUs", + "dvRpuAverage": "Prom. DV RPU", + "dvSampleAverage": "Prom. muestra DV", + "maxLuma": "Luma máx.", + "minLuma": "Luma mín.", + "maxCll": "MaxCLL", + "maxFall": "MaxFALL", + "cacheUsed": "Caché usada", + "speed": "Velocidad", + "player": "Reproductor", + "memory": "Memoria", + "uiFps": "FPS UI" + }, "externalPlayer": { "title": "Reproductor externo", "useExternalPlayer": "Usar reproductor externo", @@ -1114,6 +1191,7 @@ "systemDefault": "Predeterminado del sistema", "addCustomPlayer": "Añadir reproductor personalizado", "playerName": "Nombre del reproductor", + "playerNameHint": "Mi reproductor", "playerCommand": "Comando", "playerPackage": "Nombre del paquete", "playerUrlScheme": "Esquema URL", diff --git a/lib/i18n/fr.i18n.json b/lib/i18n/fr.i18n.json index 8fa6d1e6..8bb270b3 100644 --- a/lib/i18n/fr.i18n.json +++ b/lib/i18n/fr.i18n.json @@ -52,6 +52,9 @@ "settings": "Réglages", "mute": "Muet", "ok": "OK", + "off": "Désactivé", + "seasonNumber": "Saison ${number}", + "chapterNumber": "Chapitre ${number}", "reconnect": "Reconnecter", "exit": "Quitter", "viewAll": "Tout afficher", @@ -257,6 +260,10 @@ "dvConversionNative": "Natif / désactivé", "dvConversionDv81": "P7 → P8.1", "dvConversionHevcStrip": "P7 → HEVC", + "dvConversionAutoDescription": "Utiliser la détection des capacités de l’appareil et le comportement de repli normal", + "dvConversionNativeDescription": "Forcer le DV7 natif et bloquer la nouvelle tentative de conversion DV", + "dvConversionDv81Description": "Forcer la conversion RPU intégrée vers Dolby Vision profil 8.1", + "dvConversionHevcStripDescription": "Supprimer les couches RPU/EL Dolby Vision et présenter du HEVC simple", "requireProfileSelectionOnOpen": "Demander le profil à l'ouverture", "requireProfileSelectionOnOpenDescription": "Afficher la sélection de profil à chaque ouverture de l'application", "forceTvMode": "Forcer le mode TV", @@ -290,6 +297,8 @@ "hotkeys": { "setShortcutFor": "Définir un raccourci pour ${actionName}", "clearShortcut": "Effacer le raccourci", + "noShortcutSet": "Aucun raccourci défini", + "currentShortcut": "Raccourci actuel :", "actions": { "playPause": "Lecture/Pause", "volumeUp": "Augmenter le volume", @@ -352,6 +361,7 @@ "goToSeries": "Aller à la série", "goToSeason": "Aller à la saison", "shufflePlay": "Lecture aléatoire", + "shuffleNotAvailableOffline": "La lecture aléatoire n’est pas disponible hors ligne", "fileInfo": "Informations sur le fichier", "deleteFromServer": "Supprimer du serveur", "confirmDelete": "Supprimer ce média et ses fichiers de votre serveur ?", @@ -470,6 +480,10 @@ "searchSubtitles": "Rechercher des sous-titres", "language": "Langue", "noSubtitlesFound": "Aucun sous-titre trouvé", + "downloadedSubtitle": "Téléchargé", + "noSubtitlesAvailable": "Aucun sous-titre disponible", + "noAudioTracksAvailable": "Aucune piste audio disponible", + "noTracksAvailable": "Aucune piste disponible", "subtitleDownloaded": "Sous-titre téléchargé", "subtitleDownloadFailed": "Échec du téléchargement du sous-titre", "searchLanguages": "Rechercher des langues..." @@ -615,7 +629,8 @@ "pinProtectionOptional": "Protection par PIN (optionnelle)", "pinExplain": "PIN à 4 chiffres requis pour changer de profil.", "continueButton": "Continuer", - "pinsDontMatch": "Les PIN ne correspondent pas" + "pinsDontMatch": "Les PIN ne correspondent pas", + "initializeServicesFailed": "Impossible d’initialiser les services de profil" }, "connections": { "sectionTitle": "Connexions", @@ -647,7 +662,8 @@ "rating": "Évaluation", "movie": "Film", "tvShow": "Show TV", - "minutesLeft": "${minutes} min restantes" + "minutesLeft": "${minutes} min restantes", + "moreLikeThis": "Plus de contenus similaires" }, "errors": { "searchFailed": "Recherche échouée: ${error}", @@ -666,6 +682,7 @@ }, "libraries": { "title": "Bibliothèques", + "fallbackTitle": "Bibliothèque", "scanLibraryFiles": "Scanner les fichiers de la bibliothèque", "scanLibrary": "Scanner la bibliothèque", "analyze": "Analyser", @@ -788,6 +805,12 @@ "noChannels": "Aucune chaîne disponible", "noDvr": "Aucun DVR configuré sur les serveurs", "noPrograms": "Aucune donnée de programme disponible", + "liveStreamFailed": "Échec du direct", + "unknownProgram": "Programme inconnu", + "unknownHub": "Inconnu", + "unknownError": "Erreur inconnue", + "channelNumber": "Chaîne ${number}", + "unknownChannel": "Chaîne inconnue", "live": "EN DIRECT", "reloadGuide": "Recharger le guide", "now": "Maintenant", @@ -966,12 +989,21 @@ "deleteDownload": "Supprimer le téléchargement", "retryDownload": "Réessayer le téléchargement", "downloadQueued": "Téléchargement en attente", + "downloadResumed": "Téléchargement repris", "serverErrorBitrate": "Erreur serveur : le fichier peut dépasser la limite de bitrate distant", "episodesQueued": "${count} épisodes en attente de téléchargement", "downloadDeleted": "Télécharger supprimé", "deleteConfirm": "Supprimer \"${title}\" de cet appareil ?", - "deletingWithProgress": "Suppression de ${title}... (${current} sur ${total})", + "cancelledDownloadTitle": "Téléchargement annulé", + "cancelledDownloadMessage": "Ce téléchargement a été annulé. Que voulez-vous faire ?", + "allEpisodesAlreadyDownloaded": "Tous les épisodes sont déjà téléchargés", + "resumeDownload": "Reprendre le téléchargement", + "cancelledDownload": "Téléchargement annulé", + "syncingFile": "${file} (synchronisation ${status})", + "downloadedFileClickToComplete": "${file} téléchargé — cliquez pour terminer", + "partialDownloadClickToComplete": "Téléchargement partiel — cliquez pour terminer", "deleting": "Suppression...", + "deletingWithProgress": "Suppression de ${title}... (${current} sur ${total})", "queuedTooltip": "En attente", "queuedFilesTooltip": "En attente : ${files}", "downloadingTooltip": "Téléchargement...", @@ -1032,6 +1064,7 @@ "companionRemote": { "title": "Télécommande compagnon", "connectedTo": "Connecté à ${name}", + "unknownDevice": "Appareil inconnu", "session": { "startingServer": "Démarrage du serveur distant...", "failedToCreate": "Échec du démarrage du serveur distant :", @@ -1091,6 +1124,14 @@ "subtitles": "Sous-titres", "audio": "Audio", "searchHint": "Rechercher sur le bureau..." + }, + "errors": { + "noNetworkInterface": "Aucune interface réseau trouvée", + "authenticationFailed": "Échec de l’authentification", + "joinTimedOut": "Délai dépassé lors de la connexion à la session", + "failedToConnectAnyAddress": "Impossible de se connecter à une adresse", + "connectionLostAfterAttempts": "Connexion perdue après ${attempts} tentatives", + "connectionLost": "Connexion perdue" } }, "videoSettings": { @@ -1105,6 +1146,42 @@ "audioPassthrough": "Audio Pass-Through", "audioNormalization": "Normaliser le volume" }, + "performanceOverlay": { + "color": "Couleur", + "performance": "Performances", + "buffer": "Tampon", + "app": "App", + "decoder": "Décodeur", + "rawDecoder": "Décodeur brut", + "tunneling": "Tunneling", + "aspect": "Format", + "rotation": "Rotation", + "dvSource": "Source DV", + "dvPath": "Chemin DV", + "p7Conversion": "Conv. P7", + "sampleRate": "Fréquence", + "pixelFormat": "Fmt pixel", + "hwFormat": "Fmt HW", + "matrix": "Matrice", + "primaries": "Primaires", + "transfer": "Transfert", + "renderFps": "FPS rendu", + "displayFps": "FPS écran", + "avSync": "Synchro A/V", + "dropped": "Perdues", + "dvRpus": "DV RPU", + "dvRpuAverage": "Moy. DV RPU", + "dvSampleAverage": "Moy. échant. DV", + "maxLuma": "Luma max.", + "minLuma": "Luma min.", + "maxCll": "MaxCLL", + "maxFall": "MaxFALL", + "cacheUsed": "Cache utilisé", + "speed": "Vitesse", + "player": "Lecteur", + "memory": "Mémoire", + "uiFps": "FPS UI" + }, "externalPlayer": { "title": "Lecteur externe", "useExternalPlayer": "Utiliser un lecteur externe", @@ -1114,6 +1191,7 @@ "systemDefault": "Par défaut du système", "addCustomPlayer": "Ajouter un lecteur personnalisé", "playerName": "Nom du lecteur", + "playerNameHint": "Mon lecteur", "playerCommand": "Commande", "playerPackage": "Nom du paquet", "playerUrlScheme": "Schéma URL", diff --git a/lib/i18n/it.i18n.json b/lib/i18n/it.i18n.json index 4cf9f618..8d489bfb 100644 --- a/lib/i18n/it.i18n.json +++ b/lib/i18n/it.i18n.json @@ -52,6 +52,9 @@ "settings": "Opzioni", "mute": "Muto", "ok": "OK", + "off": "Disattivato", + "seasonNumber": "Stagione ${number}", + "chapterNumber": "Capitolo ${number}", "reconnect": "Riconnetti", "exit": "Esci", "viewAll": "Mostra tutto", @@ -257,6 +260,10 @@ "dvConversionNative": "Nativo / disattivato", "dvConversionDv81": "P7 → P8.1", "dvConversionHevcStrip": "P7 → HEVC", + "dvConversionAutoDescription": "Usa il rilevamento delle capacità del dispositivo e il normale comportamento di fallback", + "dvConversionNativeDescription": "Forza DV7 nativo e sopprime il nuovo tentativo di conversione DV", + "dvConversionDv81Description": "Forza la conversione RPU inline a Dolby Vision profilo 8.1", + "dvConversionHevcStripDescription": "Rimuove i livelli RPU/EL Dolby Vision e presenta HEVC semplice", "requireProfileSelectionOnOpen": "Chiedi profilo all'apertura", "requireProfileSelectionOnOpenDescription": "Mostra la selezione del profilo ogni volta che l'app viene aperta", "forceTvMode": "Forza modalità TV", @@ -290,6 +297,8 @@ "hotkeys": { "setShortcutFor": "Imposta scorciatoia per ${actionName}", "clearShortcut": "Elimina scorciatoia", + "noShortcutSet": "Nessuna scorciatoia impostata", + "currentShortcut": "Scorciatoia attuale:", "actions": { "playPause": "Riproduci/Pausa", "volumeUp": "Alza volume", @@ -352,6 +361,7 @@ "goToSeries": "Vai alle serie", "goToSeason": "Vai alla stagione", "shufflePlay": "Riproduzione casuale", + "shuffleNotAvailableOffline": "Riproduzione casuale non disponibile offline", "fileInfo": "Info sul file", "deleteFromServer": "Elimina dal server", "confirmDelete": "Eliminare questo media e i suoi file dal server?", @@ -470,6 +480,10 @@ "searchSubtitles": "Cerca sottotitoli", "language": "Lingua", "noSubtitlesFound": "Nessun sottotitolo trovato", + "downloadedSubtitle": "Scaricato", + "noSubtitlesAvailable": "Nessun sottotitolo disponibile", + "noAudioTracksAvailable": "Nessuna traccia audio disponibile", + "noTracksAvailable": "Nessuna traccia disponibile", "subtitleDownloaded": "Sottotitolo scaricato", "subtitleDownloadFailed": "Impossibile scaricare il sottotitolo", "searchLanguages": "Cerca lingue..." @@ -615,7 +629,8 @@ "pinProtectionOptional": "Protezione PIN (opzionale)", "pinExplain": "PIN a 4 cifre richiesto per cambiare profilo.", "continueButton": "Continua", - "pinsDontMatch": "I PIN non corrispondono" + "pinsDontMatch": "I PIN non corrispondono", + "initializeServicesFailed": "Impossibile inizializzare i servizi profilo" }, "connections": { "sectionTitle": "Connessioni", @@ -647,7 +662,8 @@ "rating": "Classificazione", "movie": "Film", "tvShow": "Serie TV", - "minutesLeft": "${minutes} minuti rimanenti" + "minutesLeft": "${minutes} minuti rimanenti", + "moreLikeThis": "Altri contenuti simili" }, "errors": { "searchFailed": "Ricerca fallita: ${error}", @@ -666,6 +682,7 @@ }, "libraries": { "title": "Librerie", + "fallbackTitle": "Libreria", "scanLibraryFiles": "Scansiona file libreria", "scanLibrary": "Scansiona libreria", "analyze": "Analizza", @@ -788,6 +805,12 @@ "noChannels": "Nessun canale disponibile", "noDvr": "Nessun DVR configurato su nessun server", "noPrograms": "Nessun dato di programma disponibile", + "liveStreamFailed": "Streaming live non riuscito", + "unknownProgram": "Programma sconosciuto", + "unknownHub": "Sconosciuto", + "unknownError": "Errore sconosciuto", + "channelNumber": "Canale ${number}", + "unknownChannel": "Canale sconosciuto", "live": "IN DIRETTA", "reloadGuide": "Ricarica guida", "now": "Ora", @@ -966,12 +989,21 @@ "deleteDownload": "Elimina download", "retryDownload": "Riprova download", "downloadQueued": "Download in coda", + "downloadResumed": "Download ripreso", "serverErrorBitrate": "Errore server: il file può superare il limite di bitrate remoto", "episodesQueued": "${count} episodi in coda per il download", "downloadDeleted": "Download eliminato", "deleteConfirm": "Eliminare \"${title}\" da questo dispositivo?", - "deletingWithProgress": "Eliminazione di ${title}... (${current} di ${total})", + "cancelledDownloadTitle": "Download annullato", + "cancelledDownloadMessage": "Questo download è stato annullato. Cosa vuoi fare?", + "allEpisodesAlreadyDownloaded": "Tutti gli episodi sono già stati scaricati", + "resumeDownload": "Riprendi download", + "cancelledDownload": "Download annullato", + "syncingFile": "${file} (sincronizzazione ${status})", + "downloadedFileClickToComplete": "${file} scaricato — fai clic per completare", + "partialDownloadClickToComplete": "Scaricato parzialmente — fai clic per completare", "deleting": "Eliminazione...", + "deletingWithProgress": "Eliminazione di ${title}... (${current} di ${total})", "queuedTooltip": "In coda", "queuedFilesTooltip": "In coda: ${files}", "downloadingTooltip": "Download in corso...", @@ -1032,6 +1064,7 @@ "companionRemote": { "title": "Telecomando", "connectedTo": "Connesso a ${name}", + "unknownDevice": "Dispositivo sconosciuto", "session": { "startingServer": "Avvio del server remoto...", "failedToCreate": "Impossibile avviare il server remoto:", @@ -1091,6 +1124,14 @@ "subtitles": "Sottotitoli", "audio": "Audio", "searchHint": "Cerca sul desktop..." + }, + "errors": { + "noNetworkInterface": "Nessuna interfaccia di rete trovata", + "authenticationFailed": "Autenticazione non riuscita", + "joinTimedOut": "Tempo scaduto durante l’accesso alla sessione", + "failedToConnectAnyAddress": "Impossibile connettersi a qualsiasi indirizzo", + "connectionLostAfterAttempts": "Connessione persa dopo ${attempts} tentativi", + "connectionLost": "Connessione persa" } }, "videoSettings": { @@ -1105,6 +1146,42 @@ "audioPassthrough": "Audio Passthrough", "audioNormalization": "Normalizza volume" }, + "performanceOverlay": { + "color": "Colore", + "performance": "Prestazioni", + "buffer": "Buffer", + "app": "App", + "decoder": "Decoder", + "rawDecoder": "Decoder raw", + "tunneling": "Tunneling", + "aspect": "Aspetto", + "rotation": "Rotazione", + "dvSource": "Sorgente DV", + "dvPath": "Percorso DV", + "p7Conversion": "Conv. P7", + "sampleRate": "Frequenza camp.", + "pixelFormat": "Formato pixel", + "hwFormat": "Formato HW", + "matrix": "Matrice", + "primaries": "Primari", + "transfer": "Transfer", + "renderFps": "FPS render", + "displayFps": "FPS display", + "avSync": "Sync A/V", + "dropped": "Scartati", + "dvRpus": "DV RPU", + "dvRpuAverage": "Media DV RPU", + "dvSampleAverage": "Media camp. DV", + "maxLuma": "Luma max", + "minLuma": "Luma min", + "maxCll": "MaxCLL", + "maxFall": "MaxFALL", + "cacheUsed": "Cache usata", + "speed": "Velocità", + "player": "Player", + "memory": "Memoria", + "uiFps": "FPS UI" + }, "externalPlayer": { "title": "Lettore esterno", "useExternalPlayer": "Usa lettore esterno", @@ -1114,6 +1191,7 @@ "systemDefault": "Predefinito di sistema", "addCustomPlayer": "Aggiungi lettore personalizzato", "playerName": "Nome lettore", + "playerNameHint": "Il mio player", "playerCommand": "Comando", "playerPackage": "Nome pacchetto", "playerUrlScheme": "Schema URL", diff --git a/lib/i18n/ja.i18n.json b/lib/i18n/ja.i18n.json index f7e3c5eb..02cae8b4 100644 --- a/lib/i18n/ja.i18n.json +++ b/lib/i18n/ja.i18n.json @@ -52,6 +52,9 @@ "settings": "設定", "mute": "ミュート", "ok": "OK", + "off": "オフ", + "seasonNumber": "シーズン${number}", + "chapterNumber": "チャプター${number}", "reconnect": "再接続", "exit": "終了", "viewAll": "すべて表示", @@ -257,6 +260,10 @@ "dvConversionNative": "ネイティブ / 無効", "dvConversionDv81": "P7 → P8.1", "dvConversionHevcStrip": "P7 → HEVC", + "dvConversionAutoDescription": "デバイスの機能検出と通常のフォールバック動作を使用します", + "dvConversionNativeDescription": "ネイティブ DV7 を強制し、DV 変換の再試行を抑制します", + "dvConversionDv81Description": "Dolby Vision プロファイル 8.1 へのインライン RPU 変換を強制します", + "dvConversionHevcStripDescription": "Dolby Vision の RPU/EL レイヤーを削除し、通常の HEVC として扱います", "requireProfileSelectionOnOpen": "アプリ起動時にプロフィールを確認", "requireProfileSelectionOnOpenDescription": "アプリを開くたびにプロフィール選択を表示", "forceTvMode": "TVモードを強制", @@ -290,6 +297,8 @@ "hotkeys": { "setShortcutFor": "${actionName}のショートカットを設定", "clearShortcut": "ショートカットをクリア", + "noShortcutSet": "ショートカット未設定", + "currentShortcut": "現在のショートカット:", "actions": { "playPause": "再生/一時停止", "volumeUp": "音量を上げる", @@ -352,6 +361,7 @@ "goToSeries": "シリーズへ移動", "goToSeason": "シーズンへ移動", "shufflePlay": "シャッフル再生", + "shuffleNotAvailableOffline": "オフラインではシャッフルを利用できません", "fileInfo": "ファイル情報", "deleteFromServer": "サーバーから削除", "confirmDelete": "このメディアとそのファイルをサーバーから削除しますか?", @@ -470,6 +480,10 @@ "searchSubtitles": "字幕を検索", "language": "言語", "noSubtitlesFound": "字幕が見つかりません", + "downloadedSubtitle": "ダウンロード済み", + "noSubtitlesAvailable": "利用可能な字幕はありません", + "noAudioTracksAvailable": "利用可能な音声トラックはありません", + "noTracksAvailable": "利用可能なトラックはありません", "subtitleDownloaded": "字幕をダウンロードしました", "subtitleDownloadFailed": "字幕のダウンロードに失敗しました", "searchLanguages": "言語を検索..." @@ -615,7 +629,8 @@ "pinProtectionOptional": "PIN保護(オプション)", "pinExplain": "プロフィール切り替えには4桁のPINが必要です。", "continueButton": "続ける", - "pinsDontMatch": "PINが一致しません" + "pinsDontMatch": "PINが一致しません", + "initializeServicesFailed": "プロフィールサービスの初期化に失敗しました" }, "connections": { "sectionTitle": "接続", @@ -647,7 +662,8 @@ "rating": "評価", "movie": "映画", "tvShow": "テレビ番組", - "minutesLeft": "残り${minutes}分" + "minutesLeft": "残り${minutes}分", + "moreLikeThis": "似ている作品" }, "errors": { "searchFailed": "検索に失敗しました: ${error}", @@ -666,6 +682,7 @@ }, "libraries": { "title": "ライブラリ", + "fallbackTitle": "ライブラリ", "scanLibraryFiles": "ライブラリファイルをスキャン", "scanLibrary": "ライブラリをスキャン", "analyze": "解析", @@ -788,6 +805,12 @@ "noChannels": "チャンネルがありません", "noDvr": "どのサーバーにもDVRが設定されていません", "noPrograms": "番組データがありません", + "liveStreamFailed": "ライブストリームに失敗しました", + "unknownProgram": "不明な番組", + "unknownHub": "不明", + "unknownError": "不明なエラー", + "channelNumber": "チャンネル ${number}", + "unknownChannel": "不明なチャンネル", "live": "ライブ", "reloadGuide": "番組表を再読込", "now": "現在", @@ -966,12 +989,21 @@ "deleteDownload": "ダウンロードを削除", "retryDownload": "ダウンロードを再試行", "downloadQueued": "ダウンロードをキューに追加しました", + "downloadResumed": "ダウンロードを再開しました", "serverErrorBitrate": "サーバーエラー: ファイルがリモートビットレート制限を超えている可能性があります", "episodesQueued": "${count}エピソードをダウンロードキューに追加しました", "downloadDeleted": "ダウンロードを削除しました", "deleteConfirm": "このデバイスから「${title}」を削除しますか?", - "deletingWithProgress": "${title}を削除中... (${current}/${total})", + "cancelledDownloadTitle": "キャンセルされたダウンロード", + "cancelledDownloadMessage": "このダウンロードはキャンセルされました。どうしますか?", + "allEpisodesAlreadyDownloaded": "すべてのエピソードはすでにダウンロード済みです", + "resumeDownload": "ダウンロードを再開", + "cancelledDownload": "キャンセルされたダウンロード", + "syncingFile": "${file}(${status}を同期中)", + "downloadedFileClickToComplete": "${file} をダウンロード済み — クリックして完了", + "partialDownloadClickToComplete": "一部ダウンロード済み — クリックして完了", "deleting": "削除中...", + "deletingWithProgress": "${title}を削除中... (${current}/${total})", "queuedTooltip": "キュー", "queuedFilesTooltip": "キュー: ${files}", "downloadingTooltip": "ダウンロード中...", @@ -1032,6 +1064,7 @@ "companionRemote": { "title": "コンパニオンリモート", "connectedTo": "${name}に接続中", + "unknownDevice": "不明なデバイス", "session": { "startingServer": "リモートサーバーを起動中...", "failedToCreate": "リモートサーバーの起動に失敗しました:", @@ -1091,6 +1124,14 @@ "subtitles": "字幕", "audio": "音声", "searchHint": "デスクトップで検索..." + }, + "errors": { + "noNetworkInterface": "ネットワークインターフェースが見つかりません", + "authenticationFailed": "認証に失敗しました", + "joinTimedOut": "セッション参加がタイムアウトしました", + "failedToConnectAnyAddress": "どのアドレスにも接続できませんでした", + "connectionLostAfterAttempts": "${attempts}回試行後に接続が切断されました", + "connectionLost": "接続が切断されました" } }, "videoSettings": { @@ -1105,6 +1146,42 @@ "audioPassthrough": "オーディオパススルー", "audioNormalization": "ラウドネス正規化" }, + "performanceOverlay": { + "color": "色", + "performance": "パフォーマンス", + "buffer": "バッファ", + "app": "アプリ", + "decoder": "デコーダー", + "rawDecoder": "Raw デコーダー", + "tunneling": "トンネリング", + "aspect": "アスペクト", + "rotation": "回転", + "dvSource": "DV ソース", + "dvPath": "DV パス", + "p7Conversion": "P7 変換", + "sampleRate": "サンプルレート", + "pixelFormat": "ピクセル形式", + "hwFormat": "HW 形式", + "matrix": "マトリクス", + "primaries": "プライマリ", + "transfer": "転送", + "renderFps": "描画 FPS", + "displayFps": "表示 FPS", + "avSync": "A/V 同期", + "dropped": "ドロップ", + "dvRpus": "DV RPU", + "dvRpuAverage": "DV RPU 平均", + "dvSampleAverage": "DV サンプル平均", + "maxLuma": "最大輝度", + "minLuma": "最小輝度", + "maxCll": "MaxCLL", + "maxFall": "MaxFALL", + "cacheUsed": "使用キャッシュ", + "speed": "速度", + "player": "プレーヤー", + "memory": "メモリ", + "uiFps": "UI FPS" + }, "externalPlayer": { "title": "外部プレーヤー", "useExternalPlayer": "外部プレーヤーを使用", @@ -1114,6 +1191,7 @@ "systemDefault": "システムデフォルト", "addCustomPlayer": "カスタムプレーヤーを追加", "playerName": "プレーヤー名", + "playerNameHint": "マイプレーヤー", "playerCommand": "コマンド", "playerPackage": "パッケージ名", "playerUrlScheme": "URLスキーム", diff --git a/lib/i18n/ko.i18n.json b/lib/i18n/ko.i18n.json index 092758b8..419cbd87 100644 --- a/lib/i18n/ko.i18n.json +++ b/lib/i18n/ko.i18n.json @@ -52,6 +52,9 @@ "settings": "설정", "mute": "음소거", "ok": "확인", + "off": "끔", + "seasonNumber": "시즌 ${number}", + "chapterNumber": "챕터 ${number}", "reconnect": "다시 연결", "exit": "종료", "viewAll": "모두 보기", @@ -257,6 +260,10 @@ "dvConversionNative": "네이티브 / 비활성화", "dvConversionDv81": "P7 → P8.1", "dvConversionHevcStrip": "P7 → HEVC", + "dvConversionAutoDescription": "기기 기능 감지와 일반 폴백 동작을 사용합니다", + "dvConversionNativeDescription": "네이티브 DV7을 강제하고 DV 변환 재시도를 억제합니다", + "dvConversionDv81Description": "Dolby Vision 프로필 8.1로 인라인 RPU 변환을 강제합니다", + "dvConversionHevcStripDescription": "Dolby Vision RPU/EL 레이어를 제거하고 일반 HEVC로 제공합니다", "requireProfileSelectionOnOpen": "앱 실행 시 프로필 선택", "requireProfileSelectionOnOpenDescription": "앱을 열 때마다 프로필 선택 화면을 표시합니다", "forceTvMode": "TV 모드 강제 사용", @@ -290,6 +297,8 @@ "hotkeys": { "setShortcutFor": "${actionName}에 대한 단축키 설정", "clearShortcut": "단축키 삭제", + "noShortcutSet": "설정된 단축키 없음", + "currentShortcut": "현재 단축키:", "actions": { "playPause": "재생/일시정지", "volumeUp": "볼륨 높이기", @@ -352,6 +361,7 @@ "goToSeries": "시리즈로 이동", "goToSeason": "시즌으로 이동", "shufflePlay": "무작위 재생", + "shuffleNotAvailableOffline": "오프라인에서는 셔플을 사용할 수 없습니다", "fileInfo": "파일 정보", "deleteFromServer": "서버에서 삭제", "confirmDelete": "이 미디어와 해당 파일을 서버에서 삭제할까요?", @@ -470,6 +480,10 @@ "searchSubtitles": "자막 검색", "language": "언어", "noSubtitlesFound": "자막을 찾을 수 없습니다", + "downloadedSubtitle": "다운로드됨", + "noSubtitlesAvailable": "사용 가능한 자막 없음", + "noAudioTracksAvailable": "사용 가능한 오디오 트랙 없음", + "noTracksAvailable": "사용 가능한 트랙 없음", "subtitleDownloaded": "자막이 다운로드되었습니다", "subtitleDownloadFailed": "자막 다운로드에 실패했습니다", "searchLanguages": "언어 검색..." @@ -615,7 +629,8 @@ "pinProtectionOptional": "PIN 보호 (선택 사항)", "pinExplain": "프로필 전환에는 4자리 PIN이 필요합니다.", "continueButton": "계속", - "pinsDontMatch": "PIN이 일치하지 않습니다" + "pinsDontMatch": "PIN이 일치하지 않습니다", + "initializeServicesFailed": "프로필 서비스를 초기화하지 못했습니다" }, "connections": { "sectionTitle": "연결", @@ -647,7 +662,8 @@ "rating": "연령 등급", "movie": "영화", "tvShow": "TV 시리즈", - "minutesLeft": "${minutes}분 남음" + "minutesLeft": "${minutes}분 남음", + "moreLikeThis": "비슷한 콘텐츠" }, "errors": { "searchFailed": "검색 실패: ${error}", @@ -666,6 +682,7 @@ }, "libraries": { "title": "미디어 라이브러리", + "fallbackTitle": "라이브러리", "scanLibraryFiles": "미디어 라이브러리 파일 스캔", "scanLibrary": "미디어 라이브러리 스캔", "analyze": "분석", @@ -788,6 +805,12 @@ "noChannels": "사용 가능한 채널이 없습니다", "noDvr": "서버에 DVR이 구성되어 있지 않습니다", "noPrograms": "프로그램 데이터가 없습니다", + "liveStreamFailed": "라이브 스트림 실패", + "unknownProgram": "알 수 없는 프로그램", + "unknownHub": "알 수 없음", + "unknownError": "알 수 없는 오류", + "channelNumber": "채널 ${number}", + "unknownChannel": "알 수 없는 채널", "live": "실시간", "reloadGuide": "편성표 새로고침", "now": "지금", @@ -966,12 +989,21 @@ "deleteDownload": "다운로드 삭제", "retryDownload": "다운로드 재시도", "downloadQueued": "다운로드 대기 중", + "downloadResumed": "다운로드를 재개했습니다", "serverErrorBitrate": "서버 오류: 파일이 원격 비트레이트 제한을 초과할 수 있습니다", "episodesQueued": "${count} 에피소드가 다운로드 대기열에 추가 되었습니다", "downloadDeleted": "다운로드 삭제됨", "deleteConfirm": "이 기기에서 \"${title}\"을(를) 삭제할까요?", - "deletingWithProgress": "${title} 삭제 중... (${current}/${total})", + "cancelledDownloadTitle": "취소된 다운로드", + "cancelledDownloadMessage": "이 다운로드가 취소되었습니다. 어떻게 하시겠습니까?", + "allEpisodesAlreadyDownloaded": "모든 에피소드가 이미 다운로드되었습니다", + "resumeDownload": "다운로드 재개", + "cancelledDownload": "취소된 다운로드", + "syncingFile": "${file} (${status} 동기화 중)", + "downloadedFileClickToComplete": "${file} 다운로드됨 — 클릭하여 완료", + "partialDownloadClickToComplete": "부분 다운로드됨 — 클릭하여 완료", "deleting": "삭제 중...", + "deletingWithProgress": "${title} 삭제 중... (${current}/${total})", "queuedTooltip": "대기 중", "queuedFilesTooltip": "대기 중: ${files}", "downloadingTooltip": "다운로드 중...", @@ -1032,6 +1064,7 @@ "companionRemote": { "title": "컴패니언 리모컨", "connectedTo": "${name}에 연결됨", + "unknownDevice": "알 수 없는 기기", "session": { "startingServer": "원격 서버 시작 중...", "failedToCreate": "원격 서버를 시작하지 못했습니다:", @@ -1091,6 +1124,14 @@ "subtitles": "자막", "audio": "오디오", "searchHint": "데스크톱에서 검색..." + }, + "errors": { + "noNetworkInterface": "네트워크 인터페이스를 찾을 수 없습니다", + "authenticationFailed": "인증 실패", + "joinTimedOut": "세션 참가 시간이 초과되었습니다", + "failedToConnectAnyAddress": "어떤 주소에도 연결하지 못했습니다", + "connectionLostAfterAttempts": "${attempts}회 시도 후 연결이 끊어졌습니다", + "connectionLost": "연결이 끊어졌습니다" } }, "videoSettings": { @@ -1105,6 +1146,42 @@ "audioPassthrough": "오디오 패스스루", "audioNormalization": "음량 정규화" }, + "performanceOverlay": { + "color": "색상", + "performance": "성능", + "buffer": "버퍼", + "app": "앱", + "decoder": "디코더", + "rawDecoder": "원본 디코더", + "tunneling": "터널링", + "aspect": "화면비", + "rotation": "회전", + "dvSource": "DV 소스", + "dvPath": "DV 경로", + "p7Conversion": "P7 변환", + "sampleRate": "샘플 레이트", + "pixelFormat": "픽셀 형식", + "hwFormat": "HW 형식", + "matrix": "매트릭스", + "primaries": "원색", + "transfer": "전송", + "renderFps": "렌더 FPS", + "displayFps": "디스플레이 FPS", + "avSync": "A/V 동기화", + "dropped": "드롭됨", + "dvRpus": "DV RPU", + "dvRpuAverage": "DV RPU 평균", + "dvSampleAverage": "DV 샘플 평균", + "maxLuma": "최대 휘도", + "minLuma": "최소 휘도", + "maxCll": "MaxCLL", + "maxFall": "MaxFALL", + "cacheUsed": "사용 캐시", + "speed": "속도", + "player": "플레이어", + "memory": "메모리", + "uiFps": "UI FPS" + }, "externalPlayer": { "title": "외부 플레이어", "useExternalPlayer": "외부 플레이어 사용", @@ -1114,6 +1191,7 @@ "systemDefault": "시스템 기본값", "addCustomPlayer": "사용자 정의 플레이어 추가", "playerName": "플레이어 이름", + "playerNameHint": "내 플레이어", "playerCommand": "명령어", "playerPackage": "패키지 이름", "playerUrlScheme": "URL 스킴", diff --git a/lib/i18n/nb.i18n.json b/lib/i18n/nb.i18n.json index 8248de25..571a7b94 100644 --- a/lib/i18n/nb.i18n.json +++ b/lib/i18n/nb.i18n.json @@ -52,6 +52,9 @@ "settings": "Innstillinger", "mute": "Demp", "ok": "OK", + "off": "Av", + "seasonNumber": "Sesong ${number}", + "chapterNumber": "Kapittel ${number}", "reconnect": "Koble til på nytt", "exit": "Avslutt", "viewAll": "Vis alle", @@ -257,6 +260,10 @@ "dvConversionNative": "Innebygd / deaktivert", "dvConversionDv81": "P7 → P8.1", "dvConversionHevcStrip": "P7 → HEVC", + "dvConversionAutoDescription": "Bruk enhetens kapabilitetsdeteksjon og normal reserveoppførsel", + "dvConversionNativeDescription": "Tving native DV7 og undertrykk forsøk på DV-konvertering", + "dvConversionDv81Description": "Tving inline RPU-konvertering til Dolby Vision profil 8.1", + "dvConversionHevcStripDescription": "Fjern Dolby Vision RPU/EL-lag og presenter vanlig HEVC", "requireProfileSelectionOnOpen": "Spør om profil ved appåpning", "requireProfileSelectionOnOpenDescription": "Vis profilvalg hver gang appen åpnes", "forceTvMode": "Tving TV-modus", @@ -290,6 +297,8 @@ "hotkeys": { "setShortcutFor": "Angi snarvei for ${actionName}", "clearShortcut": "Fjern snarvei", + "noShortcutSet": "Ingen snarvei satt", + "currentShortcut": "Gjeldende snarvei:", "actions": { "playPause": "Spill av/Pause", "volumeUp": "Volum opp", @@ -352,6 +361,7 @@ "goToSeries": "Gå til serie", "goToSeason": "Gå til sesong", "shufflePlay": "Tilfeldig avspilling", + "shuffleNotAvailableOffline": "Tilfeldig avspilling er ikke tilgjengelig offline", "fileInfo": "Filinformasjon", "deleteFromServer": "Slett fra server", "confirmDelete": "Slette dette mediet og filene fra serveren?", @@ -470,6 +480,10 @@ "searchSubtitles": "Søk etter undertekster", "language": "Språk", "noSubtitlesFound": "Ingen undertekster funnet", + "downloadedSubtitle": "Lastet ned", + "noSubtitlesAvailable": "Ingen undertekster tilgjengelig", + "noAudioTracksAvailable": "Ingen lydspor tilgjengelig", + "noTracksAvailable": "Ingen spor tilgjengelig", "subtitleDownloaded": "Undertekst lastet ned", "subtitleDownloadFailed": "Kunne ikke laste ned undertekst", "searchLanguages": "Søk etter språk..." @@ -615,7 +629,8 @@ "pinProtectionOptional": "PIN-beskyttelse (valgfri)", "pinExplain": "4-sifret PIN kreves for å bytte profiler.", "continueButton": "Fortsett", - "pinsDontMatch": "PIN-ene samsvarer ikke" + "pinsDontMatch": "PIN-ene samsvarer ikke", + "initializeServicesFailed": "Kunne ikke initialisere profiltjenester" }, "connections": { "sectionTitle": "Tilkoblinger", @@ -647,7 +662,8 @@ "rating": "Vurdering", "movie": "Film", "tvShow": "TV-serie", - "minutesLeft": "${minutes} min igjen" + "minutesLeft": "${minutes} min igjen", + "moreLikeThis": "Mer som dette" }, "errors": { "searchFailed": "Søk mislyktes: ${error}", @@ -666,6 +682,7 @@ }, "libraries": { "title": "Biblioteker", + "fallbackTitle": "Bibliotek", "scanLibraryFiles": "Skann bibliotekfiler", "scanLibrary": "Skann bibliotek", "analyze": "Analyser", @@ -788,6 +805,12 @@ "noChannels": "Ingen kanaler tilgjengelig", "noDvr": "Ingen DVR konfigurert på noen server", "noPrograms": "Ingen programdata tilgjengelig", + "liveStreamFailed": "Direktesending mislyktes", + "unknownProgram": "Ukjent program", + "unknownHub": "Ukjent", + "unknownError": "Ukjent feil", + "channelNumber": "Kanal ${number}", + "unknownChannel": "Ukjent kanal", "live": "DIREKTE", "reloadGuide": "Last inn programguide på nytt", "now": "Nå", @@ -966,12 +989,21 @@ "deleteDownload": "Slett nedlasting", "retryDownload": "Prøv nedlasting på nytt", "downloadQueued": "Nedlasting i kø", + "downloadResumed": "Nedlasting gjenopptatt", "serverErrorBitrate": "Serverfeil: filen kan overskride grensen for ekstern bitrate", "episodesQueued": "${count} episoder i nedlastingskø", "downloadDeleted": "Nedlasting slettet", "deleteConfirm": "Slette \"${title}\" fra denne enheten?", - "deletingWithProgress": "Sletter ${title}... (${current} av ${total})", + "cancelledDownloadTitle": "Avbrutt nedlasting", + "cancelledDownloadMessage": "Denne nedlastingen ble avbrutt. Hva vil du gjøre?", + "allEpisodesAlreadyDownloaded": "Alle episoder er allerede lastet ned", + "resumeDownload": "Gjenoppta nedlasting", + "cancelledDownload": "Avbrutt nedlasting", + "syncingFile": "${file} (synkroniserer ${status})", + "downloadedFileClickToComplete": "${file} lastet ned – klikk for å fullføre", + "partialDownloadClickToComplete": "Delvis lastet ned – klikk for å fullføre", "deleting": "Sletter...", + "deletingWithProgress": "Sletter ${title}... (${current} av ${total})", "queuedTooltip": "I kø", "queuedFilesTooltip": "I kø: ${files}", "downloadingTooltip": "Laster ned...", @@ -1032,6 +1064,7 @@ "companionRemote": { "title": "Følgesvenn-fjernkontroll", "connectedTo": "Tilkoblet ${name}", + "unknownDevice": "Ukjent enhet", "session": { "startingServer": "Starter fjernserver...", "failedToCreate": "Kunne ikke starte fjernserver:", @@ -1091,6 +1124,14 @@ "subtitles": "Undertekster", "audio": "Lyd", "searchHint": "Søk på stasjonær..." + }, + "errors": { + "noNetworkInterface": "Fant ingen nettverksgrensesnitt", + "authenticationFailed": "Autentisering mislyktes", + "joinTimedOut": "Tidsavbrudd ved tilkobling til økt", + "failedToConnectAnyAddress": "Kunne ikke koble til noen adresse", + "connectionLostAfterAttempts": "Tilkobling mistet etter ${attempts} forsøk", + "connectionLost": "Tilkobling mistet" } }, "videoSettings": { @@ -1105,6 +1146,42 @@ "audioPassthrough": "Lydgjennomgang", "audioNormalization": "Normaliser lydstyrke" }, + "performanceOverlay": { + "color": "Farge", + "performance": "Ytelse", + "buffer": "Buffer", + "app": "App", + "decoder": "Dekoder", + "rawDecoder": "Rå dekoder", + "tunneling": "Tunneling", + "aspect": "Format", + "rotation": "Rotasjon", + "dvSource": "DV-kilde", + "dvPath": "DV-sti", + "p7Conversion": "P7-konv.", + "sampleRate": "Samplingsrate", + "pixelFormat": "Pikselformat", + "hwFormat": "HW-format", + "matrix": "Matrise", + "primaries": "Primærfarger", + "transfer": "Overføring", + "renderFps": "Render-FPS", + "displayFps": "Skjerm-FPS", + "avSync": "A/V-synk", + "dropped": "Droppet", + "dvRpus": "DV RPU-er", + "dvRpuAverage": "DV RPU snitt", + "dvSampleAverage": "DV-sample snitt", + "maxLuma": "Maks luma", + "minLuma": "Min luma", + "maxCll": "MaxCLL", + "maxFall": "MaxFALL", + "cacheUsed": "Cache brukt", + "speed": "Hastighet", + "player": "Spiller", + "memory": "Minne", + "uiFps": "UI FPS" + }, "externalPlayer": { "title": "Ekstern spiller", "useExternalPlayer": "Bruk ekstern spiller", @@ -1114,6 +1191,7 @@ "systemDefault": "Systemstandard", "addCustomPlayer": "Legg til egendefinert spiller", "playerName": "Spillernavn", + "playerNameHint": "Min spiller", "playerCommand": "Kommando", "playerPackage": "Pakkenavn", "playerUrlScheme": "URL-skjema", diff --git a/lib/i18n/nl.i18n.json b/lib/i18n/nl.i18n.json index bf542b11..3110a8d4 100644 --- a/lib/i18n/nl.i18n.json +++ b/lib/i18n/nl.i18n.json @@ -52,6 +52,9 @@ "settings": "Opties", "mute": "Dempen", "ok": "OK", + "off": "Uit", + "seasonNumber": "Seizoen ${number}", + "chapterNumber": "Hoofdstuk ${number}", "reconnect": "Opnieuw verbinden", "exit": "Afsluiten", "viewAll": "Alles weergeven", @@ -257,6 +260,10 @@ "dvConversionNative": "Native / uitgeschakeld", "dvConversionDv81": "P7 → P8.1", "dvConversionHevcStrip": "P7 → HEVC", + "dvConversionAutoDescription": "Gebruik apparaatdetectie en normaal fallbackgedrag", + "dvConversionNativeDescription": "Forceer native DV7 en onderdruk DV-conversie opnieuw proberen", + "dvConversionDv81Description": "Forceer inline RPU-conversie naar Dolby Vision-profiel 8.1", + "dvConversionHevcStripDescription": "Strip Dolby Vision RPU/EL-lagen en presenteer gewone HEVC", "requireProfileSelectionOnOpen": "Vraag om profiel bij openen", "requireProfileSelectionOnOpenDescription": "Toon profielselectie telkens wanneer de app wordt geopend", "forceTvMode": "TV-modus forceren", @@ -290,6 +297,8 @@ "hotkeys": { "setShortcutFor": "Stel sneltoets in voor ${actionName}", "clearShortcut": "Wis sneltoets", + "noShortcutSet": "Geen sneltoets ingesteld", + "currentShortcut": "Huidige sneltoets:", "actions": { "playPause": "Afspelen/Pauzeren", "volumeUp": "Volume omhoog", @@ -352,6 +361,7 @@ "goToSeries": "Ga naar serie", "goToSeason": "Ga naar seizoen", "shufflePlay": "Willekeurig afspelen", + "shuffleNotAvailableOffline": "Shuffle is offline niet beschikbaar", "fileInfo": "Bestand info", "deleteFromServer": "Verwijderen van server", "confirmDelete": "Deze media en bestanden van je server verwijderen?", @@ -470,6 +480,10 @@ "searchSubtitles": "Ondertitels zoeken", "language": "Taal", "noSubtitlesFound": "Geen ondertitels gevonden", + "downloadedSubtitle": "Gedownload", + "noSubtitlesAvailable": "Geen ondertitels beschikbaar", + "noAudioTracksAvailable": "Geen audiotracks beschikbaar", + "noTracksAvailable": "Geen tracks beschikbaar", "subtitleDownloaded": "Ondertitel gedownload", "subtitleDownloadFailed": "Ondertitel downloaden mislukt", "searchLanguages": "Talen zoeken..." @@ -615,7 +629,8 @@ "pinProtectionOptional": "PIN-beveiliging (optioneel)", "pinExplain": "4-cijferige PIN vereist om profielen te wisselen.", "continueButton": "Doorgaan", - "pinsDontMatch": "PIN-codes komen niet overeen" + "pinsDontMatch": "PIN-codes komen niet overeen", + "initializeServicesFailed": "Kan profielservices niet initialiseren" }, "connections": { "sectionTitle": "Verbindingen", @@ -647,7 +662,8 @@ "rating": "Leeftijd", "movie": "Film", "tvShow": "TV Serie", - "minutesLeft": "${minutes} min over" + "minutesLeft": "${minutes} min over", + "moreLikeThis": "Meer zoals dit" }, "errors": { "searchFailed": "Zoeken mislukt: ${error}", @@ -666,6 +682,7 @@ }, "libraries": { "title": "Bibliotheken", + "fallbackTitle": "Bibliotheek", "scanLibraryFiles": "Scan bibliotheek bestanden", "scanLibrary": "Scan bibliotheek", "analyze": "Analyseren", @@ -788,6 +805,12 @@ "noChannels": "Geen zenders beschikbaar", "noDvr": "Geen DVR geconfigureerd op een server", "noPrograms": "Geen programmagegevens beschikbaar", + "liveStreamFailed": "Livestream mislukt", + "unknownProgram": "Onbekend programma", + "unknownHub": "Onbekend", + "unknownError": "Onbekende fout", + "channelNumber": "Kanaal ${number}", + "unknownChannel": "Onbekend kanaal", "live": "LIVE", "reloadGuide": "Gids herladen", "now": "Nu", @@ -966,12 +989,21 @@ "deleteDownload": "Download verwijderen", "retryDownload": "Download opnieuw proberen", "downloadQueued": "Download in wachtrij", + "downloadResumed": "Download hervat", "serverErrorBitrate": "Serverfout: bestand overschrijdt mogelijk de externe bitrate-limiet", "episodesQueued": "${count} afleveringen in wachtrij voor download", "downloadDeleted": "Download verwijderd", "deleteConfirm": "\"${title}\" van dit apparaat verwijderen?", - "deletingWithProgress": "Verwijderen van ${title}... (${current} van ${total})", + "cancelledDownloadTitle": "Geannuleerde download", + "cancelledDownloadMessage": "Deze download is geannuleerd. Wat wil je doen?", + "allEpisodesAlreadyDownloaded": "Alle afleveringen zijn al gedownload", + "resumeDownload": "Download hervatten", + "cancelledDownload": "Geannuleerde download", + "syncingFile": "${file} (${status} synchroniseren)", + "downloadedFileClickToComplete": "${file} gedownload — klik om te voltooien", + "partialDownloadClickToComplete": "Gedeeltelijk gedownload — klik om te voltooien", "deleting": "Verwijderen...", + "deletingWithProgress": "Verwijderen van ${title}... (${current} van ${total})", "queuedTooltip": "In wachtrij", "queuedFilesTooltip": "In wachtrij: ${files}", "downloadingTooltip": "Downloaden...", @@ -1032,6 +1064,7 @@ "companionRemote": { "title": "Afstandsbediening", "connectedTo": "Verbonden met ${name}", + "unknownDevice": "Onbekend apparaat", "session": { "startingServer": "Externe server starten...", "failedToCreate": "Kan externe server niet starten:", @@ -1091,6 +1124,14 @@ "subtitles": "Ondertitels", "audio": "Audio", "searchHint": "Zoeken op desktop..." + }, + "errors": { + "noNetworkInterface": "Geen netwerkinterface gevonden", + "authenticationFailed": "Authenticatie mislukt", + "joinTimedOut": "Time-out bij deelnemen aan sessie", + "failedToConnectAnyAddress": "Kan met geen enkel adres verbinden", + "connectionLostAfterAttempts": "Verbinding verloren na ${attempts} pogingen", + "connectionLost": "Verbinding verloren" } }, "videoSettings": { @@ -1105,6 +1146,42 @@ "audioPassthrough": "Audio-doorvoer", "audioNormalization": "Volume normaliseren" }, + "performanceOverlay": { + "color": "Kleur", + "performance": "Prestaties", + "buffer": "Buffer", + "app": "App", + "decoder": "Decoder", + "rawDecoder": "Raw decoder", + "tunneling": "Tunneling", + "aspect": "Verhouding", + "rotation": "Rotatie", + "dvSource": "DV-bron", + "dvPath": "DV-pad", + "p7Conversion": "P7-conv.", + "sampleRate": "Samplefrequentie", + "pixelFormat": "Pixelformaat", + "hwFormat": "HW-formaat", + "matrix": "Matrix", + "primaries": "Primaire kleuren", + "transfer": "Transfer", + "renderFps": "Render-FPS", + "displayFps": "Scherm-FPS", + "avSync": "A/V-sync", + "dropped": "Gedropt", + "dvRpus": "DV RPU’s", + "dvRpuAverage": "DV RPU gem.", + "dvSampleAverage": "DV-sample gem.", + "maxLuma": "Max luma", + "minLuma": "Min luma", + "maxCll": "MaxCLL", + "maxFall": "MaxFALL", + "cacheUsed": "Cache gebruikt", + "speed": "Snelheid", + "player": "Speler", + "memory": "Geheugen", + "uiFps": "UI FPS" + }, "externalPlayer": { "title": "Externe speler", "useExternalPlayer": "Externe speler gebruiken", @@ -1114,6 +1191,7 @@ "systemDefault": "Systeemstandaard", "addCustomPlayer": "Aangepaste speler toevoegen", "playerName": "Spelernaam", + "playerNameHint": "Mijn speler", "playerCommand": "Commando", "playerPackage": "Pakketnaam", "playerUrlScheme": "URL-schema", diff --git a/lib/i18n/pl.i18n.json b/lib/i18n/pl.i18n.json index 4066da2a..e0fffb59 100644 --- a/lib/i18n/pl.i18n.json +++ b/lib/i18n/pl.i18n.json @@ -52,6 +52,9 @@ "settings": "Ustawienia", "mute": "Wycisz", "ok": "OK", + "off": "Wył.", + "seasonNumber": "Sezon ${number}", + "chapterNumber": "Rozdział ${number}", "reconnect": "Połącz ponownie", "exit": "Wyjdź", "viewAll": "Pokaż wszystko", @@ -257,6 +260,10 @@ "dvConversionNative": "Natywnie / wyłączone", "dvConversionDv81": "P7 → P8.1", "dvConversionHevcStrip": "P7 → HEVC", + "dvConversionAutoDescription": "Użyj wykrywania możliwości urządzenia i normalnego zachowania awaryjnego", + "dvConversionNativeDescription": "Wymuś natywne DV7 i wyłącz ponowną próbę konwersji DV", + "dvConversionDv81Description": "Wymuś wbudowaną konwersję RPU do profilu Dolby Vision 8.1", + "dvConversionHevcStripDescription": "Usuń warstwy Dolby Vision RPU/EL i przedstaw zwykłe HEVC", "requireProfileSelectionOnOpen": "Pytaj o profil przy otwarciu aplikacji", "requireProfileSelectionOnOpenDescription": "Pokaż wybór profilu za każdym razem, gdy aplikacja jest otwierana", "forceTvMode": "Wymuś tryb TV", @@ -290,6 +297,8 @@ "hotkeys": { "setShortcutFor": "Ustaw skrót dla ${actionName}", "clearShortcut": "Wyczyść skrót", + "noShortcutSet": "Brak ustawionego skrótu", + "currentShortcut": "Bieżący skrót:", "actions": { "playPause": "Odtwórz/Pauza", "volumeUp": "Głośniej", @@ -352,6 +361,7 @@ "goToSeries": "Przejdź do serialu", "goToSeason": "Przejdź do sezonu", "shufflePlay": "Odtwarzanie losowe", + "shuffleNotAvailableOffline": "Odtwarzanie losowe nie jest dostępne offline", "fileInfo": "Informacje o pliku", "deleteFromServer": "Usuń z serwera", "confirmDelete": "Usunąć to medium i jego pliki z serwera?", @@ -470,6 +480,10 @@ "searchSubtitles": "Szukaj napisów", "language": "Język", "noSubtitlesFound": "Nie znaleziono napisów", + "downloadedSubtitle": "Pobrano", + "noSubtitlesAvailable": "Brak dostępnych napisów", + "noAudioTracksAvailable": "Brak dostępnych ścieżek audio", + "noTracksAvailable": "Brak dostępnych ścieżek", "subtitleDownloaded": "Napisy pobrane", "subtitleDownloadFailed": "Nie udało się pobrać napisów", "searchLanguages": "Szukaj języków..." @@ -615,7 +629,8 @@ "pinProtectionOptional": "Ochrona PIN-em (opcjonalnie)", "pinExplain": "Do przełączania profili wymagany jest 4-cyfrowy PIN.", "continueButton": "Kontynuuj", - "pinsDontMatch": "PIN-y nie pasują" + "pinsDontMatch": "PIN-y nie pasują", + "initializeServicesFailed": "Nie udało się zainicjować usług profilu" }, "connections": { "sectionTitle": "Połączenia", @@ -647,7 +662,8 @@ "rating": "Ocena", "movie": "Film", "tvShow": "Serial TV", - "minutesLeft": "${minutes} min pozostało" + "minutesLeft": "${minutes} min pozostało", + "moreLikeThis": "Więcej podobnych" }, "errors": { "searchFailed": "Wyszukiwanie nie powiodło się: ${error}", @@ -666,6 +682,7 @@ }, "libraries": { "title": "Biblioteki", + "fallbackTitle": "Biblioteka", "scanLibraryFiles": "Skanuj pliki biblioteki", "scanLibrary": "Skanuj bibliotekę", "analyze": "Analizuj", @@ -788,6 +805,12 @@ "noChannels": "Brak dostępnych kanałów", "noDvr": "Brak skonfigurowanego DVR na żadnym serwerze", "noPrograms": "Brak danych o programach", + "liveStreamFailed": "Transmisja na żywo nie powiodła się", + "unknownProgram": "Nieznany program", + "unknownHub": "Nieznane", + "unknownError": "Nieznany błąd", + "channelNumber": "Kanał ${number}", + "unknownChannel": "Nieznany kanał", "live": "NA ŻYWO", "reloadGuide": "Odśwież przewodnik", "now": "Teraz", @@ -966,12 +989,21 @@ "deleteDownload": "Usuń pobranie", "retryDownload": "Ponów pobieranie", "downloadQueued": "Pobranie w kolejce", + "downloadResumed": "Pobieranie wznowione", "serverErrorBitrate": "Błąd serwera: plik może przekraczać zdalny limit bitrate", "episodesQueued": "${count} odcinków w kolejce pobierania", "downloadDeleted": "Pobranie usunięte", "deleteConfirm": "Usunąć \"${title}\" z tego urządzenia?", - "deletingWithProgress": "Usuwanie ${title}... (${current} z ${total})", + "cancelledDownloadTitle": "Anulowane pobieranie", + "cancelledDownloadMessage": "To pobieranie zostało anulowane. Co chcesz zrobić?", + "allEpisodesAlreadyDownloaded": "Wszystkie odcinki są już pobrane", + "resumeDownload": "Wznów pobieranie", + "cancelledDownload": "Anulowane pobieranie", + "syncingFile": "${file} (synchronizowanie ${status})", + "downloadedFileClickToComplete": "Pobrano ${file} — kliknij, aby dokończyć", + "partialDownloadClickToComplete": "Pobrano częściowo — kliknij, aby dokończyć", "deleting": "Usuwanie...", + "deletingWithProgress": "Usuwanie ${title}... (${current} z ${total})", "queuedTooltip": "W kolejce", "queuedFilesTooltip": "W kolejce: ${files}", "downloadingTooltip": "Pobieranie...", @@ -1032,6 +1064,7 @@ "companionRemote": { "title": "Pilot zdalny", "connectedTo": "Połączono z ${name}", + "unknownDevice": "Nieznane urządzenie", "session": { "startingServer": "Uruchamianie serwera zdalnego...", "failedToCreate": "Nie udało się uruchomić serwera zdalnego:", @@ -1091,6 +1124,14 @@ "subtitles": "Napisy", "audio": "Audio", "searchHint": "Szukaj na komputerze..." + }, + "errors": { + "noNetworkInterface": "Nie znaleziono interfejsu sieciowego", + "authenticationFailed": "Uwierzytelnianie nie powiodło się", + "joinTimedOut": "Upłynął limit czasu dołączania do sesji", + "failedToConnectAnyAddress": "Nie udało się połączyć z żadnym adresem", + "connectionLostAfterAttempts": "Połączenie utracone po ${attempts} próbach", + "connectionLost": "Połączenie utracone" } }, "videoSettings": { @@ -1105,6 +1146,42 @@ "audioPassthrough": "Bezpośrednie audio", "audioNormalization": "Normalizacja głośności" }, + "performanceOverlay": { + "color": "Kolor", + "performance": "Wydajność", + "buffer": "Bufor", + "app": "Aplikacja", + "decoder": "Dekoder", + "rawDecoder": "Surowy dekoder", + "tunneling": "Tunelowanie", + "aspect": "Proporcje", + "rotation": "Obrót", + "dvSource": "Źródło DV", + "dvPath": "Ścieżka DV", + "p7Conversion": "Konw. P7", + "sampleRate": "Częstotliwość próbkowania", + "pixelFormat": "Format pikseli", + "hwFormat": "Format HW", + "matrix": "Macierz", + "primaries": "Barwy podstawowe", + "transfer": "Transfer", + "renderFps": "FPS renderowania", + "displayFps": "FPS ekranu", + "avSync": "Sync A/V", + "dropped": "Porzucone", + "dvRpus": "DV RPU", + "dvRpuAverage": "Śr. DV RPU", + "dvSampleAverage": "Śr. próbki DV", + "maxLuma": "Maks. luma", + "minLuma": "Min. luma", + "maxCll": "MaxCLL", + "maxFall": "MaxFALL", + "cacheUsed": "Użyty cache", + "speed": "Szybkość", + "player": "Odtwarzacz", + "memory": "Pamięć", + "uiFps": "UI FPS" + }, "externalPlayer": { "title": "Zewnętrzny odtwarzacz", "useExternalPlayer": "Użyj zewnętrznego odtwarzacza", @@ -1114,6 +1191,7 @@ "systemDefault": "Domyślny systemowy", "addCustomPlayer": "Dodaj niestandardowy odtwarzacz", "playerName": "Nazwa odtwarzacza", + "playerNameHint": "Mój odtwarzacz", "playerCommand": "Polecenie", "playerPackage": "Nazwa pakietu", "playerUrlScheme": "Schemat URL", diff --git a/lib/i18n/pt.i18n.json b/lib/i18n/pt.i18n.json index 706611a0..2d072770 100644 --- a/lib/i18n/pt.i18n.json +++ b/lib/i18n/pt.i18n.json @@ -52,6 +52,9 @@ "settings": "Configurações", "mute": "Silenciar", "ok": "OK", + "off": "Desativado", + "seasonNumber": "Temporada ${number}", + "chapterNumber": "Capítulo ${number}", "reconnect": "Reconectar", "exit": "Sair", "viewAll": "Ver Tudo", @@ -257,6 +260,10 @@ "dvConversionNative": "Nativo / desativado", "dvConversionDv81": "P7 → P8.1", "dvConversionHevcStrip": "P7 → HEVC", + "dvConversionAutoDescription": "Usar detecção de recursos do dispositivo e comportamento normal de fallback", + "dvConversionNativeDescription": "Forçar DV7 nativo e suprimir nova tentativa de conversão DV", + "dvConversionDv81Description": "Forçar conversão RPU inline para Dolby Vision perfil 8.1", + "dvConversionHevcStripDescription": "Remover camadas RPU/EL do Dolby Vision e apresentar HEVC simples", "requireProfileSelectionOnOpen": "Pedir perfil ao abrir o app", "requireProfileSelectionOnOpenDescription": "Mostrar seleção de perfil toda vez que o app for aberto", "forceTvMode": "Forçar modo TV", @@ -290,6 +297,8 @@ "hotkeys": { "setShortcutFor": "Definir Atalho para ${actionName}", "clearShortcut": "Limpar atalho", + "noShortcutSet": "Nenhum atalho definido", + "currentShortcut": "Atalho atual:", "actions": { "playPause": "Reproduzir/Pausar", "volumeUp": "Aumentar Volume", @@ -352,6 +361,7 @@ "goToSeries": "Ir para a série", "goToSeason": "Ir para a temporada", "shufflePlay": "Reprodução Aleatória", + "shuffleNotAvailableOffline": "Reprodução aleatória indisponível offline", "fileInfo": "Info do Arquivo", "deleteFromServer": "Excluir do servidor", "confirmDelete": "Excluir esta mídia e seus arquivos do servidor?", @@ -470,6 +480,10 @@ "searchSubtitles": "Pesquisar legendas", "language": "Idioma", "noSubtitlesFound": "Nenhuma legenda encontrada", + "downloadedSubtitle": "Baixado", + "noSubtitlesAvailable": "Nenhuma legenda disponível", + "noAudioTracksAvailable": "Nenhuma faixa de áudio disponível", + "noTracksAvailable": "Nenhuma faixa disponível", "subtitleDownloaded": "Legenda baixada", "subtitleDownloadFailed": "Falha ao baixar legenda", "searchLanguages": "Pesquisar idiomas..." @@ -615,7 +629,8 @@ "pinProtectionOptional": "Proteção por PIN (opcional)", "pinExplain": "PIN de 4 dígitos necessário para trocar perfis.", "continueButton": "Continuar", - "pinsDontMatch": "Os PINs não correspondem" + "pinsDontMatch": "Os PINs não correspondem", + "initializeServicesFailed": "Falha ao inicializar serviços de perfil" }, "connections": { "sectionTitle": "Conexões", @@ -647,7 +662,8 @@ "rating": "Avaliação", "movie": "Filme", "tvShow": "Série de TV", - "minutesLeft": "${minutes} min restantes" + "minutesLeft": "${minutes} min restantes", + "moreLikeThis": "Mais como este" }, "errors": { "searchFailed": "Falha na busca: ${error}", @@ -666,6 +682,7 @@ }, "libraries": { "title": "Bibliotecas", + "fallbackTitle": "Biblioteca", "scanLibraryFiles": "Escanear Arquivos da Biblioteca", "scanLibrary": "Escanear Biblioteca", "analyze": "Analisar", @@ -788,6 +805,12 @@ "noChannels": "Nenhum canal disponível", "noDvr": "Nenhum DVR configurado em nenhum servidor", "noPrograms": "Nenhum dado de programação disponível", + "liveStreamFailed": "Falha no stream ao vivo", + "unknownProgram": "Programa desconhecido", + "unknownHub": "Desconhecido", + "unknownError": "Erro desconhecido", + "channelNumber": "Canal ${number}", + "unknownChannel": "Canal desconhecido", "live": "AO VIVO", "reloadGuide": "Recarregar Guia", "now": "Agora", @@ -966,12 +989,21 @@ "deleteDownload": "Excluir download", "retryDownload": "Tentar download novamente", "downloadQueued": "Download na fila", + "downloadResumed": "Download retomado", "serverErrorBitrate": "Erro do servidor: o arquivo pode exceder o limite remoto de bitrate", "episodesQueued": "${count} episódios na fila de download", "downloadDeleted": "Download excluído", "deleteConfirm": "Excluir \"${title}\" deste dispositivo?", - "deletingWithProgress": "Excluindo ${title}... (${current} de ${total})", + "cancelledDownloadTitle": "Download cancelado", + "cancelledDownloadMessage": "Este download foi cancelado. O que você deseja fazer?", + "allEpisodesAlreadyDownloaded": "Todos os episódios já foram baixados", + "resumeDownload": "Retomar download", + "cancelledDownload": "Download cancelado", + "syncingFile": "${file} (sincronizando ${status})", + "downloadedFileClickToComplete": "${file} baixado — clique para concluir", + "partialDownloadClickToComplete": "Parcialmente baixado — clique para concluir", "deleting": "Excluindo...", + "deletingWithProgress": "Excluindo ${title}... (${current} de ${total})", "queuedTooltip": "Na fila", "queuedFilesTooltip": "Na fila: ${files}", "downloadingTooltip": "Baixando...", @@ -1032,6 +1064,7 @@ "companionRemote": { "title": "Controle Remoto", "connectedTo": "Conectado a ${name}", + "unknownDevice": "Dispositivo desconhecido", "session": { "startingServer": "A iniciar servidor remoto...", "failedToCreate": "Falha ao iniciar o servidor remoto:", @@ -1091,6 +1124,14 @@ "subtitles": "Legendas", "audio": "Áudio", "searchHint": "Buscar no desktop..." + }, + "errors": { + "noNetworkInterface": "Nenhuma interface de rede encontrada", + "authenticationFailed": "Falha na autenticação", + "joinTimedOut": "Tempo esgotado ao entrar na sessão", + "failedToConnectAnyAddress": "Falha ao conectar a qualquer endereço", + "connectionLostAfterAttempts": "Conexão perdida após ${attempts} tentativas", + "connectionLost": "Conexão perdida" } }, "videoSettings": { @@ -1105,6 +1146,42 @@ "audioPassthrough": "Passagem de Áudio", "audioNormalization": "Normalizar Volume" }, + "performanceOverlay": { + "color": "Cor", + "performance": "Desempenho", + "buffer": "Buffer", + "app": "App", + "decoder": "Decodificador", + "rawDecoder": "Decodificador bruto", + "tunneling": "Túnel", + "aspect": "Aspecto", + "rotation": "Rotação", + "dvSource": "Fonte DV", + "dvPath": "Caminho DV", + "p7Conversion": "Conv. P7", + "sampleRate": "Taxa de amostragem", + "pixelFormat": "Formato de pixel", + "hwFormat": "Formato HW", + "matrix": "Matriz", + "primaries": "Primárias", + "transfer": "Transferência", + "renderFps": "FPS render", + "displayFps": "FPS tela", + "avSync": "Sync A/V", + "dropped": "Descartados", + "dvRpus": "DV RPUs", + "dvRpuAverage": "Média DV RPU", + "dvSampleAverage": "Média amostra DV", + "maxLuma": "Luma máx.", + "minLuma": "Luma mín.", + "maxCll": "MaxCLL", + "maxFall": "MaxFALL", + "cacheUsed": "Cache usado", + "speed": "Velocidade", + "player": "Player", + "memory": "Memória", + "uiFps": "UI FPS" + }, "externalPlayer": { "title": "Player Externo", "useExternalPlayer": "Usar Player Externo", @@ -1114,6 +1191,7 @@ "systemDefault": "Padrão do Sistema", "addCustomPlayer": "Adicionar Player Personalizado", "playerName": "Nome do Player", + "playerNameHint": "Meu player", "playerCommand": "Comando", "playerPackage": "Nome do Pacote", "playerUrlScheme": "Esquema de URL", diff --git a/lib/i18n/ru.i18n.json b/lib/i18n/ru.i18n.json index 97138fb4..180e37cd 100644 --- a/lib/i18n/ru.i18n.json +++ b/lib/i18n/ru.i18n.json @@ -52,6 +52,9 @@ "settings": "Настройки", "mute": "Без звука", "ok": "OK", + "off": "Выкл.", + "seasonNumber": "Сезон ${number}", + "chapterNumber": "Глава ${number}", "reconnect": "Переподключить", "exit": "Выход", "viewAll": "Показать все", @@ -257,6 +260,10 @@ "dvConversionNative": "Нативно / отключено", "dvConversionDv81": "P7 → P8.1", "dvConversionHevcStrip": "P7 → HEVC", + "dvConversionAutoDescription": "Использовать определение возможностей устройства и обычное резервное поведение", + "dvConversionNativeDescription": "Принудительно использовать нативный DV7 и не повторять DV-конвертацию", + "dvConversionDv81Description": "Принудительно выполнять inline-конвертацию RPU в Dolby Vision профиль 8.1", + "dvConversionHevcStripDescription": "Удалять слои Dolby Vision RPU/EL и передавать обычный HEVC", "requireProfileSelectionOnOpen": "Запрашивать профиль при запуске", "requireProfileSelectionOnOpenDescription": "Показывать выбор профиля при каждом открытии приложения", "forceTvMode": "Принудительный режим ТВ", @@ -290,6 +297,8 @@ "hotkeys": { "setShortcutFor": "Назначить клавишу для ${actionName}", "clearShortcut": "Очистить клавишу", + "noShortcutSet": "Сочетание не задано", + "currentShortcut": "Текущее сочетание:", "actions": { "playPause": "Воспроизведение/Пауза", "volumeUp": "Громкость выше", @@ -352,6 +361,7 @@ "goToSeries": "Перейти к сериалу", "goToSeason": "Перейти к сезону", "shufflePlay": "Случайное воспроизведение", + "shuffleNotAvailableOffline": "Перемешивание недоступно офлайн", "fileInfo": "Информация о файле", "deleteFromServer": "Удалить с сервера", "confirmDelete": "Удалить это медиа и его файлы с сервера?", @@ -470,6 +480,10 @@ "searchSubtitles": "Поиск субтитров", "language": "Язык", "noSubtitlesFound": "Субтитры не найдены", + "downloadedSubtitle": "Загружено", + "noSubtitlesAvailable": "Нет доступных субтитров", + "noAudioTracksAvailable": "Нет доступных аудиодорожек", + "noTracksAvailable": "Нет доступных дорожек", "subtitleDownloaded": "Субтитры загружены", "subtitleDownloadFailed": "Не удалось загрузить субтитры", "searchLanguages": "Поиск языков..." @@ -615,7 +629,8 @@ "pinProtectionOptional": "Защита PIN-кодом (необязательно)", "pinExplain": "Для переключения профилей нужен 4-значный PIN.", "continueButton": "Продолжить", - "pinsDontMatch": "PIN-коды не совпадают" + "pinsDontMatch": "PIN-коды не совпадают", + "initializeServicesFailed": "Не удалось инициализировать службы профиля" }, "connections": { "sectionTitle": "Подключения", @@ -647,7 +662,8 @@ "rating": "Рейтинг", "movie": "Фильм", "tvShow": "Сериал", - "minutesLeft": "Осталось ${minutes} мин" + "minutesLeft": "Осталось ${minutes} мин", + "moreLikeThis": "Похожее" }, "errors": { "searchFailed": "Ошибка поиска: ${error}", @@ -666,6 +682,7 @@ }, "libraries": { "title": "Библиотеки", + "fallbackTitle": "Библиотека", "scanLibraryFiles": "Сканировать файлы библиотеки", "scanLibrary": "Сканировать библиотеку", "analyze": "Анализировать", @@ -788,6 +805,12 @@ "noChannels": "Нет доступных каналов", "noDvr": "DVR не настроен ни на одном сервере", "noPrograms": "Нет данных о программах", + "liveStreamFailed": "Не удалось запустить прямой эфир", + "unknownProgram": "Неизвестная программа", + "unknownHub": "Неизвестно", + "unknownError": "Неизвестная ошибка", + "channelNumber": "Канал ${number}", + "unknownChannel": "Неизвестный канал", "live": "ЭФИР", "reloadGuide": "Перезагрузить программу", "now": "Сейчас", @@ -966,12 +989,21 @@ "deleteDownload": "Удалить загрузку", "retryDownload": "Повторить загрузку", "downloadQueued": "Загрузка поставлена в очередь", + "downloadResumed": "Загрузка возобновлена", "serverErrorBitrate": "Ошибка сервера: файл может превышать удаленный лимит bitrate", "episodesQueued": "${count} эпизодов поставлено в очередь загрузки", "downloadDeleted": "Загрузка удалена", "deleteConfirm": "Удалить \"${title}\" с этого устройства?", - "deletingWithProgress": "Удаление ${title}... (${current} из ${total})", + "cancelledDownloadTitle": "Загрузка отменена", + "cancelledDownloadMessage": "Эта загрузка была отменена. Что вы хотите сделать?", + "allEpisodesAlreadyDownloaded": "Все эпизоды уже загружены", + "resumeDownload": "Возобновить загрузку", + "cancelledDownload": "Загрузка отменена", + "syncingFile": "${file} (синхронизация ${status})", + "downloadedFileClickToComplete": "${file} загружен — нажмите, чтобы завершить", + "partialDownloadClickToComplete": "Частично загружено — нажмите, чтобы завершить", "deleting": "Удаление...", + "deletingWithProgress": "Удаление ${title}... (${current} из ${total})", "queuedTooltip": "В очереди", "queuedFilesTooltip": "В очереди: ${files}", "downloadingTooltip": "Загрузка...", @@ -1032,6 +1064,7 @@ "companionRemote": { "title": "Пульт управления", "connectedTo": "Подключено к ${name}", + "unknownDevice": "Неизвестное устройство", "session": { "startingServer": "Запуск удалённого сервера...", "failedToCreate": "Не удалось запустить удалённый сервер:", @@ -1091,6 +1124,14 @@ "subtitles": "Субтитры", "audio": "Аудио", "searchHint": "Поиск на десктопе..." + }, + "errors": { + "noNetworkInterface": "Сетевой интерфейс не найден", + "authenticationFailed": "Ошибка аутентификации", + "joinTimedOut": "Время подключения к сеансу истекло", + "failedToConnectAnyAddress": "Не удалось подключиться ни к одному адресу", + "connectionLostAfterAttempts": "Соединение потеряно после ${attempts} попыток", + "connectionLost": "Соединение потеряно" } }, "videoSettings": { @@ -1105,6 +1146,42 @@ "audioPassthrough": "Сквозной вывод аудио", "audioNormalization": "Нормализация громкости" }, + "performanceOverlay": { + "color": "Цвет", + "performance": "Производительность", + "buffer": "Буфер", + "app": "Приложение", + "decoder": "Декодер", + "rawDecoder": "Raw-декодер", + "tunneling": "Туннелирование", + "aspect": "Соотношение", + "rotation": "Поворот", + "dvSource": "Источник DV", + "dvPath": "Путь DV", + "p7Conversion": "Конв. P7", + "sampleRate": "Частота дискр.", + "pixelFormat": "Формат пикселей", + "hwFormat": "Формат HW", + "matrix": "Матрица", + "primaries": "Основные цвета", + "transfer": "Передача", + "renderFps": "FPS рендера", + "displayFps": "FPS дисплея", + "avSync": "A/V синхр.", + "dropped": "Пропущено", + "dvRpus": "DV RPU", + "dvRpuAverage": "Сред. DV RPU", + "dvSampleAverage": "Сред. сэмпл DV", + "maxLuma": "Макс. яркость", + "minLuma": "Мин. яркость", + "maxCll": "MaxCLL", + "maxFall": "MaxFALL", + "cacheUsed": "Кэш использован", + "speed": "Скорость", + "player": "Плеер", + "memory": "Память", + "uiFps": "UI FPS" + }, "externalPlayer": { "title": "Внешний плеер", "useExternalPlayer": "Использовать внешний плеер", @@ -1114,6 +1191,7 @@ "systemDefault": "Системный по умолчанию", "addCustomPlayer": "Добавить свой плеер", "playerName": "Название плеера", + "playerNameHint": "Мой плеер", "playerCommand": "Команда", "playerPackage": "Имя пакета", "playerUrlScheme": "URL-схема", diff --git a/lib/i18n/strings.g.dart b/lib/i18n/strings.g.dart index 623b51ef..31f441e6 100644 --- a/lib/i18n/strings.g.dart +++ b/lib/i18n/strings.g.dart @@ -4,7 +4,7 @@ /// To regenerate, run: `dart run slang` /// /// Locales: 16 -/// Strings: 19104 (1194 per locale) +/// Strings: 20288 (1268 per locale) // coverage:ignore-file // ignore_for_file: type=lint, unused_import diff --git a/lib/i18n/strings_bg.g.dart b/lib/i18n/strings_bg.g.dart index 69a3591a..4f90b809 100644 --- a/lib/i18n/strings_bg.g.dart +++ b/lib/i18n/strings_bg.g.dart @@ -77,6 +77,7 @@ class TranslationsBg extends Translations with BaseTranslations 'Настройки'; @override String get mute => 'Заглуши'; @override String get ok => 'OK'; + @override String get off => 'Изкл.'; + @override String seasonNumber({required Object number}) => 'Сезон ${number}'; + @override String chapterNumber({required Object number}) => 'Глава ${number}'; @override String get reconnect => 'Свържи отново'; @override String get exit => 'Изход'; @override String get viewAll => 'Виж всички'; @@ -385,6 +389,10 @@ class _TranslationsSettingsBg extends TranslationsSettingsEn { @override String get dvConversionNative => 'Нативно / изключено'; @override String get dvConversionDv81 => 'P7 → P8.1'; @override String get dvConversionHevcStrip => 'P7 → HEVC'; + @override String get dvConversionAutoDescription => 'Използва засичане на възможностите на устройството и нормално fallback поведение'; + @override String get dvConversionNativeDescription => 'Принуждава нативен DV7 и спира повторния опит за DV конвертиране'; + @override String get dvConversionDv81Description => 'Принуждава inline RPU конвертиране към Dolby Vision профил 8.1'; + @override String get dvConversionHevcStripDescription => 'Премахва Dolby Vision RPU/EL слоевете и подава обикновен HEVC'; @override String get requireProfileSelectionOnOpen => 'Питай за профил при отваряне на приложението'; @override String get requireProfileSelectionOnOpenDescription => 'Показвай избор на профил всеки път при отваряне на приложението'; @override String get forceTvMode => 'Принуди TV режим'; @@ -432,6 +440,8 @@ class _TranslationsHotkeysBg extends TranslationsHotkeysEn { // Translations @override String setShortcutFor({required Object actionName}) => 'Задай клавишна комбинация за ${actionName}'; @override String get clearShortcut => 'Изчисти клавишната комбинация'; + @override String get noShortcutSet => 'Няма зададена клавишна комбинация'; + @override String get currentShortcut => 'Текуща комбинация:'; @override late final _TranslationsHotkeysActionsBg actions = _TranslationsHotkeysActionsBg._(_root); } @@ -482,6 +492,7 @@ class _TranslationsMediaMenuBg extends TranslationsMediaMenuEn { @override String get goToSeries => 'Към сериала'; @override String get goToSeason => 'Към сезона'; @override String get shufflePlay => 'Разбъркано възпроизвеждане'; + @override String get shuffleNotAvailableOffline => 'Разбърканото възпроизвеждане не е налично офлайн'; @override String get fileInfo => 'Информация за файла'; @override String get deleteFromServer => 'Изтрий от сървъра'; @override String get confirmDelete => 'Да се изтрие ли тази медия и файловете ѝ от вашия сървър?'; @@ -620,6 +631,10 @@ class _TranslationsVideoControlsBg extends TranslationsVideoControlsEn { @override String get searchSubtitles => 'Търсене на субтитри'; @override String get language => 'Език'; @override String get noSubtitlesFound => 'Не са намерени субтитри'; + @override String get downloadedSubtitle => 'Изтеглени субтитри'; + @override String get noSubtitlesAvailable => 'Няма налични субтитри'; + @override String get noAudioTracksAvailable => 'Няма налични аудио писти'; + @override String get noTracksAvailable => 'Няма налични писти'; @override String get subtitleDownloaded => 'Субтитърът е изтеглен'; @override String get subtitleDownloadFailed => 'Неуспешно изтегляне на субтитър'; @override String get searchLanguages => 'Търсене на езици...'; @@ -808,6 +823,7 @@ class _TranslationsProfilesBg extends TranslationsProfilesEn { @override String get pinExplain => 'Изисква се 4-цифрен PIN за смяна на профили.'; @override String get continueButton => 'Продължи'; @override String get pinsDontMatch => 'PIN кодовете не съвпадат'; + @override String get initializeServicesFailed => 'Неуспешно инициализиране на услугите за профили'; } // Path: connections @@ -854,6 +870,7 @@ class _TranslationsDiscoverBg extends TranslationsDiscoverEn { @override String get movie => 'Филм'; @override String get tvShow => 'ТВ сериал'; @override String minutesLeft({required Object minutes}) => 'Остават ${minutes} мин'; + @override String get moreLikeThis => 'Подобно на това'; } // Path: errors @@ -886,6 +903,7 @@ class _TranslationsLibrariesBg extends TranslationsLibrariesEn { // Translations @override String get title => 'Библиотеки'; + @override String get fallbackTitle => 'Библиотека'; @override String get scanLibraryFiles => 'Сканирай файловете на библиотеката'; @override String get scanLibrary => 'Сканирай библиотеката'; @override String get analyze => 'Анализирай'; @@ -1018,6 +1036,12 @@ class _TranslationsLiveTvBg extends TranslationsLiveTvEn { @override String get noChannels => 'Няма налични канали'; @override String get noDvr => 'Няма конфигуриран DVR на нито един сървър'; @override String get noPrograms => 'Няма налични програмни данни'; + @override String get liveStreamFailed => 'Потокът на живо се провали'; + @override String get unknownProgram => 'Неизвестна програма'; + @override String get unknownHub => 'Неизвестно'; + @override String get unknownError => 'Неизвестна грешка'; + @override String channelNumber({required Object number}) => 'Канал ${number}'; + @override String get unknownChannel => 'Неизвестен канал'; @override String get live => 'НА ЖИВО'; @override String get reloadGuide => 'Презареди ТВ програмата'; @override String get now => 'Сега'; @@ -1224,10 +1248,19 @@ class _TranslationsDownloadsBg extends TranslationsDownloadsEn { @override String get deleteDownload => 'Изтрий изтегляне'; @override String get retryDownload => 'Опитай изтеглянето отново'; @override String get downloadQueued => 'Изтеглянето е добавено в опашката'; + @override String get downloadResumed => 'Изтеглянето е възобновено'; @override String get serverErrorBitrate => 'Грешка на сървъра: файлът може да надвишава лимита за отдалечен битрейт'; @override String episodesQueued({required Object count}) => '${count} епизода са добавени в опашката за изтегляне'; @override String get downloadDeleted => 'Изтеглянето е изтрито'; @override String deleteConfirm({required Object title}) => 'Да се изтрие ли "${title}" от това устройство?'; + @override String get cancelledDownloadTitle => 'Отменено изтегляне'; + @override String get cancelledDownloadMessage => 'Това изтегляне беше отменено. Какво искате да направите?'; + @override String get allEpisodesAlreadyDownloaded => 'Всички епизоди вече са изтеглени'; + @override String get resumeDownload => 'Възобнови изтеглянето'; + @override String get cancelledDownload => 'Отменено изтегляне'; + @override String syncingFile({required Object file, required Object status}) => '${file} (синхронизира се ${status})'; + @override String downloadedFileClickToComplete({required Object file}) => 'Изтеглен ${file} — щракнете за довършване'; + @override String get partialDownloadClickToComplete => 'Частично изтеглено — щракнете за довършване'; @override String get deleting => 'Изтриване...'; @override String deletingWithProgress({required Object title, required Object current, required Object total}) => 'Изтриване на ${title}... (${current} от ${total})'; @override String get queuedTooltip => 'В опашката'; @@ -1304,9 +1337,11 @@ class _TranslationsCompanionRemoteBg extends TranslationsCompanionRemoteEn { // Translations @override String get title => 'Дистанционно управление'; @override String connectedTo({required Object name}) => 'Свързан към ${name}'; + @override String get unknownDevice => 'Непознато устройство'; @override late final _TranslationsCompanionRemoteSessionBg session = _TranslationsCompanionRemoteSessionBg._(_root); @override late final _TranslationsCompanionRemotePairingBg pairing = _TranslationsCompanionRemotePairingBg._(_root); @override late final _TranslationsCompanionRemoteRemoteBg remote = _TranslationsCompanionRemoteRemoteBg._(_root); + @override late final _TranslationsCompanionRemoteErrorsBg errors = _TranslationsCompanionRemoteErrorsBg._(_root); } // Path: videoSettings @@ -1328,6 +1363,49 @@ class _TranslationsVideoSettingsBg extends TranslationsVideoSettingsEn { @override String get audioNormalization => 'Нормализиране на силата на звука'; } +// Path: performanceOverlay +class _TranslationsPerformanceOverlayBg extends TranslationsPerformanceOverlayEn { + _TranslationsPerformanceOverlayBg._(TranslationsBg root) : this._root = root, super.internal(root); + + final TranslationsBg _root; // ignore: unused_field + + // Translations + @override String get color => 'Цвят'; + @override String get performance => 'Производителност'; + @override String get buffer => 'Буфер'; + @override String get app => 'Приложение'; + @override String get decoder => 'Декодер'; + @override String get rawDecoder => 'Суров декодер'; + @override String get tunneling => 'Тунелиране'; + @override String get aspect => 'Съотношение'; + @override String get rotation => 'Завъртане'; + @override String get dvSource => 'DV източник'; + @override String get dvPath => 'DV път'; + @override String get p7Conversion => 'P7 конв.'; + @override String get sampleRate => 'Честота'; + @override String get pixelFormat => 'Пикселен формат'; + @override String get hwFormat => 'HW формат'; + @override String get matrix => 'Матрица'; + @override String get primaries => 'Основни цветове'; + @override String get transfer => 'Трансфер'; + @override String get renderFps => 'Render FPS'; + @override String get displayFps => 'Display FPS'; + @override String get avSync => 'A/V синхр.'; + @override String get dropped => 'Изпуснати'; + @override String get dvRpus => 'DV RPU'; + @override String get dvRpuAverage => 'Средно DV RPU'; + @override String get dvSampleAverage => 'Средно DV семпл'; + @override String get maxLuma => 'Макс. яркост'; + @override String get minLuma => 'Мин. яркост'; + @override String get maxCll => 'MaxCLL'; + @override String get maxFall => 'MaxFALL'; + @override String get cacheUsed => 'Използван кеш'; + @override String get speed => 'Скорост'; + @override String get player => 'Плеър'; + @override String get memory => 'Памет'; + @override String get uiFps => 'UI FPS'; +} + // Path: externalPlayer class _TranslationsExternalPlayerBg extends TranslationsExternalPlayerEn { _TranslationsExternalPlayerBg._(TranslationsBg root) : this._root = root, super.internal(root); @@ -1343,6 +1421,7 @@ class _TranslationsExternalPlayerBg extends TranslationsExternalPlayerEn { @override String get systemDefault => 'Системен по подразбиране'; @override String get addCustomPlayer => 'Добави персонален плейър'; @override String get playerName => 'Име на плейъра'; + @override String get playerNameHint => 'Моят плеър'; @override String get playerCommand => 'Команда'; @override String get playerPackage => 'Име на пакет'; @override String get playerUrlScheme => 'URL схема'; @@ -1755,6 +1834,21 @@ class _TranslationsCompanionRemoteRemoteBg extends TranslationsCompanionRemoteRe @override String get searchHint => 'Търсене на настолен компютър...'; } +// Path: companionRemote.errors +class _TranslationsCompanionRemoteErrorsBg extends TranslationsCompanionRemoteErrorsEn { + _TranslationsCompanionRemoteErrorsBg._(TranslationsBg root) : this._root = root, super.internal(root); + + final TranslationsBg _root; // ignore: unused_field + + // Translations + @override String get noNetworkInterface => 'Не е намерен мрежов интерфейс'; + @override String get authenticationFailed => 'Неуспешно удостоверяване'; + @override String get joinTimedOut => 'Времето за присъединяване към сесията изтече'; + @override String get failedToConnectAnyAddress => 'Неуспешно свързване към който и да е адрес'; + @override String connectionLostAfterAttempts({required Object attempts}) => 'Връзката е загубена след ${attempts} опита'; + @override String get connectionLost => 'Връзката е загубена'; +} + // Path: trackers.services class _TranslationsTrackersServicesBg extends TranslationsTrackersServicesEn { _TranslationsTrackersServicesBg._(TranslationsBg root) : this._root = root, super.internal(root); @@ -1871,6 +1965,9 @@ extension on TranslationsBg { 'common.settings' => 'Настройки', 'common.mute' => 'Заглуши', 'common.ok' => 'OK', + 'common.off' => 'Изкл.', + 'common.seasonNumber' => ({required Object number}) => 'Сезон ${number}', + 'common.chapterNumber' => ({required Object number}) => 'Глава ${number}', 'common.reconnect' => 'Свържи отново', 'common.exit' => 'Изход', 'common.viewAll' => 'Виж всички', @@ -2070,6 +2167,10 @@ extension on TranslationsBg { 'settings.dvConversionNative' => 'Нативно / изключено', 'settings.dvConversionDv81' => 'P7 → P8.1', 'settings.dvConversionHevcStrip' => 'P7 → HEVC', + 'settings.dvConversionAutoDescription' => 'Използва засичане на възможностите на устройството и нормално fallback поведение', + 'settings.dvConversionNativeDescription' => 'Принуждава нативен DV7 и спира повторния опит за DV конвертиране', + 'settings.dvConversionDv81Description' => 'Принуждава inline RPU конвертиране към Dolby Vision профил 8.1', + 'settings.dvConversionHevcStripDescription' => 'Премахва Dolby Vision RPU/EL слоевете и подава обикновен HEVC', 'settings.requireProfileSelectionOnOpen' => 'Питай за профил при отваряне на приложението', 'settings.requireProfileSelectionOnOpenDescription' => 'Показвай избор на профил всеки път при отваряне на приложението', 'settings.forceTvMode' => 'Принуди TV режим', @@ -2099,6 +2200,8 @@ extension on TranslationsBg { 'search.enterTitleActorOrKeyword' => 'Въведете заглавие, актьор или ключова дума', 'hotkeys.setShortcutFor' => ({required Object actionName}) => 'Задай клавишна комбинация за ${actionName}', 'hotkeys.clearShortcut' => 'Изчисти клавишната комбинация', + 'hotkeys.noShortcutSet' => 'Няма зададена клавишна комбинация', + 'hotkeys.currentShortcut' => 'Текуща комбинация:', 'hotkeys.actions.playPause' => 'Пускане/пауза', 'hotkeys.actions.volumeUp' => 'Увеличи звука', 'hotkeys.actions.volumeDown' => 'Намали звука', @@ -2155,6 +2258,7 @@ extension on TranslationsBg { 'mediaMenu.goToSeries' => 'Към сериала', 'mediaMenu.goToSeason' => 'Към сезона', 'mediaMenu.shufflePlay' => 'Разбъркано възпроизвеждане', + 'mediaMenu.shuffleNotAvailableOffline' => 'Разбърканото възпроизвеждане не е налично офлайн', 'mediaMenu.fileInfo' => 'Информация за файла', 'mediaMenu.deleteFromServer' => 'Изтрий от сървъра', 'mediaMenu.confirmDelete' => 'Да се изтрие ли тази медия и файловете ѝ от вашия сървър?', @@ -2263,6 +2367,10 @@ extension on TranslationsBg { 'videoControls.searchSubtitles' => 'Търсене на субтитри', 'videoControls.language' => 'Език', 'videoControls.noSubtitlesFound' => 'Не са намерени субтитри', + 'videoControls.downloadedSubtitle' => 'Изтеглени субтитри', + 'videoControls.noSubtitlesAvailable' => 'Няма налични субтитри', + 'videoControls.noAudioTracksAvailable' => 'Няма налични аудио писти', + 'videoControls.noTracksAvailable' => 'Няма налични писти', 'videoControls.subtitleDownloaded' => 'Субтитърът е изтеглен', 'videoControls.subtitleDownloadFailed' => 'Неуспешно изтегляне на субтитър', 'videoControls.searchLanguages' => 'Търсене на езици...', @@ -2321,6 +2429,8 @@ extension on TranslationsBg { 'subtitlingStyling.borderColor' => 'Цвят на рамката', 'subtitlingStyling.backgroundOpacity' => 'Прозрачност на фона', 'subtitlingStyling.backgroundColor' => 'Цвят на фона', + _ => null, + } ?? switch (path) { 'subtitlingStyling.position' => 'Позиция', 'subtitlingStyling.assOverride' => 'ASS презаписване', 'subtitlingStyling.bold' => 'Получер', @@ -2335,8 +2445,6 @@ extension on TranslationsBg { 'mpvConfig.loadPreset' => 'Зареди', 'mpvConfig.deletePreset' => 'Изтрий', 'mpvConfig.presetSaved' => 'Пресетът е запазен', - _ => null, - } ?? switch (path) { 'mpvConfig.presetLoaded' => 'Пресетът е зареден', 'mpvConfig.presetDeleted' => 'Пресетът е изтрит', 'mpvConfig.confirmDeletePreset' => 'Сигурни ли сте, че искате да изтриете този пресет?', @@ -2399,6 +2507,7 @@ extension on TranslationsBg { 'profiles.pinExplain' => 'Изисква се 4-цифрен PIN за смяна на профили.', 'profiles.continueButton' => 'Продължи', 'profiles.pinsDontMatch' => 'PIN кодовете не съвпадат', + 'profiles.initializeServicesFailed' => 'Неуспешно инициализиране на услугите за профили', 'connections.sectionTitle' => 'Връзки', 'connections.addConnection' => 'Добави връзка', 'connections.addConnectionSubtitleNoProfile' => 'Влезте с Plex или свържете Jellyfin сървър', @@ -2427,6 +2536,7 @@ extension on TranslationsBg { 'discover.movie' => 'Филм', 'discover.tvShow' => 'ТВ сериал', 'discover.minutesLeft' => ({required Object minutes}) => 'Остават ${minutes} мин', + 'discover.moreLikeThis' => 'Подобно на това', 'errors.searchFailed' => ({required Object error}) => 'Търсенето е неуспешно: ${error}', 'errors.connectionTimeout' => ({required Object context}) => 'Изтече времето за връзка при зареждане на ${context}', 'errors.connectionFailed' => 'Не може да се осъществи връзка с медиен сървър', @@ -2441,6 +2551,7 @@ extension on TranslationsBg { 'errors.failedToDeleteProfile' => ({required Object displayName}) => 'Неуспешно изтриване на ${displayName}', 'errors.failedToRate' => 'Оценката не можа да бъде обновена', 'libraries.title' => 'Библиотеки', + 'libraries.fallbackTitle' => 'Библиотека', 'libraries.scanLibraryFiles' => 'Сканирай файловете на библиотеката', 'libraries.scanLibrary' => 'Сканирай библиотеката', 'libraries.analyze' => 'Анализирай', @@ -2541,6 +2652,12 @@ extension on TranslationsBg { 'liveTv.noChannels' => 'Няма налични канали', 'liveTv.noDvr' => 'Няма конфигуриран DVR на нито един сървър', 'liveTv.noPrograms' => 'Няма налични програмни данни', + 'liveTv.liveStreamFailed' => 'Потокът на живо се провали', + 'liveTv.unknownProgram' => 'Неизвестна програма', + 'liveTv.unknownHub' => 'Неизвестно', + 'liveTv.unknownError' => 'Неизвестна грешка', + 'liveTv.channelNumber' => ({required Object number}) => 'Канал ${number}', + 'liveTv.unknownChannel' => 'Неизвестен канал', 'liveTv.live' => 'НА ЖИВО', 'liveTv.reloadGuide' => 'Презареди ТВ програмата', 'liveTv.now' => 'Сега', @@ -2711,10 +2828,19 @@ extension on TranslationsBg { 'downloads.deleteDownload' => 'Изтрий изтегляне', 'downloads.retryDownload' => 'Опитай изтеглянето отново', 'downloads.downloadQueued' => 'Изтеглянето е добавено в опашката', + 'downloads.downloadResumed' => 'Изтеглянето е възобновено', 'downloads.serverErrorBitrate' => 'Грешка на сървъра: файлът може да надвишава лимита за отдалечен битрейт', 'downloads.episodesQueued' => ({required Object count}) => '${count} епизода са добавени в опашката за изтегляне', 'downloads.downloadDeleted' => 'Изтеглянето е изтрито', 'downloads.deleteConfirm' => ({required Object title}) => 'Да се изтрие ли "${title}" от това устройство?', + 'downloads.cancelledDownloadTitle' => 'Отменено изтегляне', + 'downloads.cancelledDownloadMessage' => 'Това изтегляне беше отменено. Какво искате да направите?', + 'downloads.allEpisodesAlreadyDownloaded' => 'Всички епизоди вече са изтеглени', + 'downloads.resumeDownload' => 'Възобнови изтеглянето', + 'downloads.cancelledDownload' => 'Отменено изтегляне', + 'downloads.syncingFile' => ({required Object file, required Object status}) => '${file} (синхронизира се ${status})', + 'downloads.downloadedFileClickToComplete' => ({required Object file}) => 'Изтеглен ${file} — щракнете за довършване', + 'downloads.partialDownloadClickToComplete' => 'Частично изтеглено — щракнете за довършване', 'downloads.deleting' => 'Изтриване...', 'downloads.deletingWithProgress' => ({required Object title, required Object current, required Object total}) => 'Изтриване на ${title}... (${current} от ${total})', 'downloads.queuedTooltip' => 'В опашката', @@ -2773,6 +2899,7 @@ extension on TranslationsBg { 'shaders.deleteShaderConfirm' => ({required Object name}) => 'Да се изтрие ли "${name}"?', 'companionRemote.title' => 'Дистанционно управление', 'companionRemote.connectedTo' => ({required Object name}) => 'Свързан към ${name}', + 'companionRemote.unknownDevice' => 'Непознато устройство', 'companionRemote.session.startingServer' => 'Стартиране на сървър за дистанционно управление...', 'companionRemote.session.failedToCreate' => 'Неуспешно стартиране на сървър за дистанционно управление:', 'companionRemote.session.hostAddress' => 'Адрес на хоста', @@ -2816,6 +2943,8 @@ extension on TranslationsBg { 'companionRemote.remote.tabSettings' => 'Настройки', 'companionRemote.remote.previous' => 'Предишен', 'companionRemote.remote.playPause' => 'Пускане/пауза', + _ => null, + } ?? switch (path) { 'companionRemote.remote.next' => 'Следващ', 'companionRemote.remote.seekBack' => 'Назад', 'companionRemote.remote.stop' => 'Стоп', @@ -2827,6 +2956,12 @@ extension on TranslationsBg { 'companionRemote.remote.subtitles' => 'Субтитри', 'companionRemote.remote.audio' => 'Аудио', 'companionRemote.remote.searchHint' => 'Търсене на настолен компютър...', + 'companionRemote.errors.noNetworkInterface' => 'Не е намерен мрежов интерфейс', + 'companionRemote.errors.authenticationFailed' => 'Неуспешно удостоверяване', + 'companionRemote.errors.joinTimedOut' => 'Времето за присъединяване към сесията изтече', + 'companionRemote.errors.failedToConnectAnyAddress' => 'Неуспешно свързване към който и да е адрес', + 'companionRemote.errors.connectionLostAfterAttempts' => ({required Object attempts}) => 'Връзката е загубена след ${attempts} опита', + 'companionRemote.errors.connectionLost' => 'Връзката е загубена', 'videoSettings.playbackSpeed' => 'Скорост на възпроизвеждане', 'videoSettings.zoom' => 'Мащаб', 'videoSettings.sleepTimer' => 'Таймер за заспиване', @@ -2837,6 +2972,40 @@ extension on TranslationsBg { 'videoSettings.performanceOverlay' => 'Оверлей за производителност', 'videoSettings.audioPassthrough' => 'Аудио passthrough', 'videoSettings.audioNormalization' => 'Нормализиране на силата на звука', + 'performanceOverlay.color' => 'Цвят', + 'performanceOverlay.performance' => 'Производителност', + 'performanceOverlay.buffer' => 'Буфер', + 'performanceOverlay.app' => 'Приложение', + 'performanceOverlay.decoder' => 'Декодер', + 'performanceOverlay.rawDecoder' => 'Суров декодер', + 'performanceOverlay.tunneling' => 'Тунелиране', + 'performanceOverlay.aspect' => 'Съотношение', + 'performanceOverlay.rotation' => 'Завъртане', + 'performanceOverlay.dvSource' => 'DV източник', + 'performanceOverlay.dvPath' => 'DV път', + 'performanceOverlay.p7Conversion' => 'P7 конв.', + 'performanceOverlay.sampleRate' => 'Честота', + 'performanceOverlay.pixelFormat' => 'Пикселен формат', + 'performanceOverlay.hwFormat' => 'HW формат', + 'performanceOverlay.matrix' => 'Матрица', + 'performanceOverlay.primaries' => 'Основни цветове', + 'performanceOverlay.transfer' => 'Трансфер', + 'performanceOverlay.renderFps' => 'Render FPS', + 'performanceOverlay.displayFps' => 'Display FPS', + 'performanceOverlay.avSync' => 'A/V синхр.', + 'performanceOverlay.dropped' => 'Изпуснати', + 'performanceOverlay.dvRpus' => 'DV RPU', + 'performanceOverlay.dvRpuAverage' => 'Средно DV RPU', + 'performanceOverlay.dvSampleAverage' => 'Средно DV семпл', + 'performanceOverlay.maxLuma' => 'Макс. яркост', + 'performanceOverlay.minLuma' => 'Мин. яркост', + 'performanceOverlay.maxCll' => 'MaxCLL', + 'performanceOverlay.maxFall' => 'MaxFALL', + 'performanceOverlay.cacheUsed' => 'Използван кеш', + 'performanceOverlay.speed' => 'Скорост', + 'performanceOverlay.player' => 'Плеър', + 'performanceOverlay.memory' => 'Памет', + 'performanceOverlay.uiFps' => 'UI FPS', 'externalPlayer.title' => 'Външен плеър', 'externalPlayer.useExternalPlayer' => 'Използвай външен плеър', 'externalPlayer.useExternalPlayerDescription' => 'Отваряй видеата в друго приложение', @@ -2845,12 +3014,11 @@ extension on TranslationsBg { 'externalPlayer.systemDefault' => 'Системен по подразбиране', 'externalPlayer.addCustomPlayer' => 'Добави персонален плейър', 'externalPlayer.playerName' => 'Име на плейъра', + 'externalPlayer.playerNameHint' => 'Моят плеър', 'externalPlayer.playerCommand' => 'Команда', 'externalPlayer.playerPackage' => 'Име на пакет', 'externalPlayer.playerUrlScheme' => 'URL схема', 'externalPlayer.off' => 'Изключено', - _ => null, - } ?? switch (path) { 'externalPlayer.launchFailed' => 'Неуспешно отваряне на външен плеър', 'externalPlayer.appNotInstalled' => ({required Object name}) => '${name} не е инсталиран', 'externalPlayer.playInExternalPlayer' => 'Пусни във външен плеър', diff --git a/lib/i18n/strings_da.g.dart b/lib/i18n/strings_da.g.dart index 7dada554..869e5fb3 100644 --- a/lib/i18n/strings_da.g.dart +++ b/lib/i18n/strings_da.g.dart @@ -77,6 +77,7 @@ class TranslationsDa extends Translations with BaseTranslations 'Indstillinger'; @override String get mute => 'Lydløs'; @override String get ok => 'OK'; + @override String get off => 'Fra'; + @override String seasonNumber({required Object number}) => 'Sæson ${number}'; + @override String chapterNumber({required Object number}) => 'Kapitel ${number}'; @override String get reconnect => 'Genopret forbindelse'; @override String get exit => 'Afslut'; @override String get viewAll => 'Vis alle'; @@ -385,6 +389,10 @@ class _TranslationsSettingsDa extends TranslationsSettingsEn { @override String get dvConversionNative => 'Native / deaktiveret'; @override String get dvConversionDv81 => 'P7 → P8.1'; @override String get dvConversionHevcStrip => 'P7 → HEVC'; + @override String get dvConversionAutoDescription => 'Brug enhedens kapabilitetsregistrering og normal fallbackadfærd'; + @override String get dvConversionNativeDescription => 'Tving native DV7 og undertryk forsøg på DV-konvertering'; + @override String get dvConversionDv81Description => 'Tving inline RPU-konvertering til Dolby Vision profil 8.1'; + @override String get dvConversionHevcStripDescription => 'Fjern Dolby Vision RPU/EL-lag og brug almindelig HEVC'; @override String get requireProfileSelectionOnOpen => 'Spørg om profil ved åbning'; @override String get requireProfileSelectionOnOpenDescription => 'Vis profilvalg hver gang appen åbnes'; @override String get forceTvMode => 'Gennemtving TV-tilstand'; @@ -432,6 +440,8 @@ class _TranslationsHotkeysDa extends TranslationsHotkeysEn { // Translations @override String setShortcutFor({required Object actionName}) => 'Indstil genvej for ${actionName}'; @override String get clearShortcut => 'Ryd genvej'; + @override String get noShortcutSet => 'Ingen genvej angivet'; + @override String get currentShortcut => 'Nuværende genvej:'; @override late final _TranslationsHotkeysActionsDa actions = _TranslationsHotkeysActionsDa._(_root); } @@ -482,6 +492,7 @@ class _TranslationsMediaMenuDa extends TranslationsMediaMenuEn { @override String get goToSeries => 'Gå til serie'; @override String get goToSeason => 'Gå til sæson'; @override String get shufflePlay => 'Afspil tilfældigt'; + @override String get shuffleNotAvailableOffline => 'Bland afspilning er ikke tilgængelig offline'; @override String get fileInfo => 'Filinfo'; @override String get deleteFromServer => 'Slet fra server'; @override String get confirmDelete => 'Slet dette medie og dets filer fra din server?'; @@ -620,6 +631,10 @@ class _TranslationsVideoControlsDa extends TranslationsVideoControlsEn { @override String get searchSubtitles => 'Søg undertekster'; @override String get language => 'Sprog'; @override String get noSubtitlesFound => 'Ingen undertekster fundet'; + @override String get downloadedSubtitle => 'Downloadet'; + @override String get noSubtitlesAvailable => 'Ingen undertekster tilgængelige'; + @override String get noAudioTracksAvailable => 'Ingen lydspor tilgængelige'; + @override String get noTracksAvailable => 'Ingen spor tilgængelige'; @override String get subtitleDownloaded => 'Undertekst downloadet'; @override String get subtitleDownloadFailed => 'Kunne ikke downloade undertekst'; @override String get searchLanguages => 'Søg sprog...'; @@ -808,6 +823,7 @@ class _TranslationsProfilesDa extends TranslationsProfilesEn { @override String get pinExplain => '4-cifret PIN kræves for at skifte profiler.'; @override String get continueButton => 'Fortsæt'; @override String get pinsDontMatch => 'PIN-koder matcher ikke'; + @override String get initializeServicesFailed => 'Kunne ikke initialisere profiltjenester'; } // Path: connections @@ -854,6 +870,7 @@ class _TranslationsDiscoverDa extends TranslationsDiscoverEn { @override String get movie => 'Film'; @override String get tvShow => 'TV-serie'; @override String minutesLeft({required Object minutes}) => '${minutes} min tilbage'; + @override String get moreLikeThis => 'Mere som dette'; } // Path: errors @@ -886,6 +903,7 @@ class _TranslationsLibrariesDa extends TranslationsLibrariesEn { // Translations @override String get title => 'Biblioteker'; + @override String get fallbackTitle => 'Bibliotek'; @override String get scanLibraryFiles => 'Scan biblioteksfiler'; @override String get scanLibrary => 'Scan bibliotek'; @override String get analyze => 'Analysér'; @@ -1018,6 +1036,12 @@ class _TranslationsLiveTvDa extends TranslationsLiveTvEn { @override String get noChannels => 'Ingen kanaler tilgængelige'; @override String get noDvr => 'Ingen DVR konfigureret på nogen server'; @override String get noPrograms => 'Ingen programdata tilgængelig'; + @override String get liveStreamFailed => 'Livestream mislykkedes'; + @override String get unknownProgram => 'Ukendt program'; + @override String get unknownHub => 'Ukendt'; + @override String get unknownError => 'Ukendt fejl'; + @override String channelNumber({required Object number}) => 'Kanal ${number}'; + @override String get unknownChannel => 'Ukendt kanal'; @override String get live => 'LIVE'; @override String get reloadGuide => 'Genindlæs guide'; @override String get now => 'Nu'; @@ -1224,12 +1248,21 @@ class _TranslationsDownloadsDa extends TranslationsDownloadsEn { @override String get deleteDownload => 'Slet download'; @override String get retryDownload => 'Prøv download igen'; @override String get downloadQueued => 'Download i kø'; + @override String get downloadResumed => 'Download genoptaget'; @override String get serverErrorBitrate => 'Serverfejl: filen overskrider muligvis grænsen for ekstern bitrate'; @override String episodesQueued({required Object count}) => '${count} episoder i downloadkø'; @override String get downloadDeleted => 'Download slettet'; @override String deleteConfirm({required Object title}) => 'Slet "${title}" fra denne enhed?'; - @override String deletingWithProgress({required Object title, required Object current, required Object total}) => 'Sletter ${title}... (${current} af ${total})'; + @override String get cancelledDownloadTitle => 'Annulleret download'; + @override String get cancelledDownloadMessage => 'Denne download blev annulleret. Hvad vil du gøre?'; + @override String get allEpisodesAlreadyDownloaded => 'Alle episoder er allerede downloadet'; + @override String get resumeDownload => 'Genoptag download'; + @override String get cancelledDownload => 'Annulleret download'; + @override String syncingFile({required Object file, required Object status}) => '${file} (synkroniserer ${status})'; + @override String downloadedFileClickToComplete({required Object file}) => '${file} downloadet — klik for at fuldføre'; + @override String get partialDownloadClickToComplete => 'Delvist downloadet — klik for at fuldføre'; @override String get deleting => 'Sletter...'; + @override String deletingWithProgress({required Object title, required Object current, required Object total}) => 'Sletter ${title}... (${current} af ${total})'; @override String get queuedTooltip => 'I kø'; @override String queuedFilesTooltip({required Object files}) => 'I kø: ${files}'; @override String get downloadingTooltip => 'Downloader...'; @@ -1304,9 +1337,11 @@ class _TranslationsCompanionRemoteDa extends TranslationsCompanionRemoteEn { // Translations @override String get title => 'Fjernbetjening'; @override String connectedTo({required Object name}) => 'Forbundet til ${name}'; + @override String get unknownDevice => 'Ukendt enhed'; @override late final _TranslationsCompanionRemoteSessionDa session = _TranslationsCompanionRemoteSessionDa._(_root); @override late final _TranslationsCompanionRemotePairingDa pairing = _TranslationsCompanionRemotePairingDa._(_root); @override late final _TranslationsCompanionRemoteRemoteDa remote = _TranslationsCompanionRemoteRemoteDa._(_root); + @override late final _TranslationsCompanionRemoteErrorsDa errors = _TranslationsCompanionRemoteErrorsDa._(_root); } // Path: videoSettings @@ -1328,6 +1363,49 @@ class _TranslationsVideoSettingsDa extends TranslationsVideoSettingsEn { @override String get audioNormalization => 'Normalisér lydstyrke'; } +// Path: performanceOverlay +class _TranslationsPerformanceOverlayDa extends TranslationsPerformanceOverlayEn { + _TranslationsPerformanceOverlayDa._(TranslationsDa root) : this._root = root, super.internal(root); + + final TranslationsDa _root; // ignore: unused_field + + // Translations + @override String get color => 'Farve'; + @override String get performance => 'Ydeevne'; + @override String get buffer => 'Buffer'; + @override String get app => 'App'; + @override String get decoder => 'Dekoder'; + @override String get rawDecoder => 'Rå dekoder'; + @override String get tunneling => 'Tunneling'; + @override String get aspect => 'Billedformat'; + @override String get rotation => 'Rotation'; + @override String get dvSource => 'DV-kilde'; + @override String get dvPath => 'DV-sti'; + @override String get p7Conversion => 'P7-konv.'; + @override String get sampleRate => 'Samplingsrate'; + @override String get pixelFormat => 'Pixelformat'; + @override String get hwFormat => 'HW-format'; + @override String get matrix => 'Matrix'; + @override String get primaries => 'Primærfarver'; + @override String get transfer => 'Transfer'; + @override String get renderFps => 'Render FPS'; + @override String get displayFps => 'Skærm-FPS'; + @override String get avSync => 'A/V-synk.'; + @override String get dropped => 'Tabte'; + @override String get dvRpus => 'DV RPU’er'; + @override String get dvRpuAverage => 'DV RPU gns.'; + @override String get dvSampleAverage => 'DV-sample gns.'; + @override String get maxLuma => 'Maks. luma'; + @override String get minLuma => 'Min. luma'; + @override String get maxCll => 'MaxCLL'; + @override String get maxFall => 'MaxFALL'; + @override String get cacheUsed => 'Brugt cache'; + @override String get speed => 'Hastighed'; + @override String get player => 'Afspiller'; + @override String get memory => 'Hukommelse'; + @override String get uiFps => 'UI FPS'; +} + // Path: externalPlayer class _TranslationsExternalPlayerDa extends TranslationsExternalPlayerEn { _TranslationsExternalPlayerDa._(TranslationsDa root) : this._root = root, super.internal(root); @@ -1343,6 +1421,7 @@ class _TranslationsExternalPlayerDa extends TranslationsExternalPlayerEn { @override String get systemDefault => 'Systemstandard'; @override String get addCustomPlayer => 'Tilføj brugerdefineret afspiller'; @override String get playerName => 'Afspillernavn'; + @override String get playerNameHint => 'Min afspiller'; @override String get playerCommand => 'Kommando'; @override String get playerPackage => 'Pakkenavn'; @override String get playerUrlScheme => 'URL-skema'; @@ -1755,6 +1834,21 @@ class _TranslationsCompanionRemoteRemoteDa extends TranslationsCompanionRemoteRe @override String get searchHint => 'Søg på desktop...'; } +// Path: companionRemote.errors +class _TranslationsCompanionRemoteErrorsDa extends TranslationsCompanionRemoteErrorsEn { + _TranslationsCompanionRemoteErrorsDa._(TranslationsDa root) : this._root = root, super.internal(root); + + final TranslationsDa _root; // ignore: unused_field + + // Translations + @override String get noNetworkInterface => 'Ingen netværksgrænseflade fundet'; + @override String get authenticationFailed => 'Godkendelse mislykkedes'; + @override String get joinTimedOut => 'Tidsgrænse for deltagelse i session overskredet'; + @override String get failedToConnectAnyAddress => 'Kunne ikke oprette forbindelse til nogen adresse'; + @override String connectionLostAfterAttempts({required Object attempts}) => 'Forbindelse mistet efter ${attempts} forsøg'; + @override String get connectionLost => 'Forbindelse mistet'; +} + // Path: trackers.services class _TranslationsTrackersServicesDa extends TranslationsTrackersServicesEn { _TranslationsTrackersServicesDa._(TranslationsDa root) : this._root = root, super.internal(root); @@ -1871,6 +1965,9 @@ extension on TranslationsDa { 'common.settings' => 'Indstillinger', 'common.mute' => 'Lydløs', 'common.ok' => 'OK', + 'common.off' => 'Fra', + 'common.seasonNumber' => ({required Object number}) => 'Sæson ${number}', + 'common.chapterNumber' => ({required Object number}) => 'Kapitel ${number}', 'common.reconnect' => 'Genopret forbindelse', 'common.exit' => 'Afslut', 'common.viewAll' => 'Vis alle', @@ -2070,6 +2167,10 @@ extension on TranslationsDa { 'settings.dvConversionNative' => 'Native / deaktiveret', 'settings.dvConversionDv81' => 'P7 → P8.1', 'settings.dvConversionHevcStrip' => 'P7 → HEVC', + 'settings.dvConversionAutoDescription' => 'Brug enhedens kapabilitetsregistrering og normal fallbackadfærd', + 'settings.dvConversionNativeDescription' => 'Tving native DV7 og undertryk forsøg på DV-konvertering', + 'settings.dvConversionDv81Description' => 'Tving inline RPU-konvertering til Dolby Vision profil 8.1', + 'settings.dvConversionHevcStripDescription' => 'Fjern Dolby Vision RPU/EL-lag og brug almindelig HEVC', 'settings.requireProfileSelectionOnOpen' => 'Spørg om profil ved åbning', 'settings.requireProfileSelectionOnOpenDescription' => 'Vis profilvalg hver gang appen åbnes', 'settings.forceTvMode' => 'Gennemtving TV-tilstand', @@ -2099,6 +2200,8 @@ extension on TranslationsDa { 'search.enterTitleActorOrKeyword' => 'Indtast titel, skuespiller eller nøgleord', 'hotkeys.setShortcutFor' => ({required Object actionName}) => 'Indstil genvej for ${actionName}', 'hotkeys.clearShortcut' => 'Ryd genvej', + 'hotkeys.noShortcutSet' => 'Ingen genvej angivet', + 'hotkeys.currentShortcut' => 'Nuværende genvej:', 'hotkeys.actions.playPause' => 'Afspil/Pause', 'hotkeys.actions.volumeUp' => 'Lydstyrke op', 'hotkeys.actions.volumeDown' => 'Lydstyrke ned', @@ -2155,6 +2258,7 @@ extension on TranslationsDa { 'mediaMenu.goToSeries' => 'Gå til serie', 'mediaMenu.goToSeason' => 'Gå til sæson', 'mediaMenu.shufflePlay' => 'Afspil tilfældigt', + 'mediaMenu.shuffleNotAvailableOffline' => 'Bland afspilning er ikke tilgængelig offline', 'mediaMenu.fileInfo' => 'Filinfo', 'mediaMenu.deleteFromServer' => 'Slet fra server', 'mediaMenu.confirmDelete' => 'Slet dette medie og dets filer fra din server?', @@ -2263,6 +2367,10 @@ extension on TranslationsDa { 'videoControls.searchSubtitles' => 'Søg undertekster', 'videoControls.language' => 'Sprog', 'videoControls.noSubtitlesFound' => 'Ingen undertekster fundet', + 'videoControls.downloadedSubtitle' => 'Downloadet', + 'videoControls.noSubtitlesAvailable' => 'Ingen undertekster tilgængelige', + 'videoControls.noAudioTracksAvailable' => 'Ingen lydspor tilgængelige', + 'videoControls.noTracksAvailable' => 'Ingen spor tilgængelige', 'videoControls.subtitleDownloaded' => 'Undertekst downloadet', 'videoControls.subtitleDownloadFailed' => 'Kunne ikke downloade undertekst', 'videoControls.searchLanguages' => 'Søg sprog...', @@ -2321,6 +2429,8 @@ extension on TranslationsDa { 'subtitlingStyling.borderColor' => 'Kantfarve', 'subtitlingStyling.backgroundOpacity' => 'Baggrundsgennemsigtighed', 'subtitlingStyling.backgroundColor' => 'Baggrundsfarve', + _ => null, + } ?? switch (path) { 'subtitlingStyling.position' => 'Position', 'subtitlingStyling.assOverride' => 'ASS-tilsidesættelse', 'subtitlingStyling.bold' => 'Fed', @@ -2335,8 +2445,6 @@ extension on TranslationsDa { 'mpvConfig.loadPreset' => 'Indlæs', 'mpvConfig.deletePreset' => 'Slet', 'mpvConfig.presetSaved' => 'Forudindstilling gemt', - _ => null, - } ?? switch (path) { 'mpvConfig.presetLoaded' => 'Forudindstilling indlæst', 'mpvConfig.presetDeleted' => 'Forudindstilling slettet', 'mpvConfig.confirmDeletePreset' => 'Er du sikker på, at du vil slette denne forudindstilling?', @@ -2399,6 +2507,7 @@ extension on TranslationsDa { 'profiles.pinExplain' => '4-cifret PIN kræves for at skifte profiler.', 'profiles.continueButton' => 'Fortsæt', 'profiles.pinsDontMatch' => 'PIN-koder matcher ikke', + 'profiles.initializeServicesFailed' => 'Kunne ikke initialisere profiltjenester', 'connections.sectionTitle' => 'Forbindelser', 'connections.addConnection' => 'Tilføj forbindelse', 'connections.addConnectionSubtitleNoProfile' => 'Log ind med Plex eller forbind til en Jellyfin-server', @@ -2427,6 +2536,7 @@ extension on TranslationsDa { 'discover.movie' => 'Film', 'discover.tvShow' => 'TV-serie', 'discover.minutesLeft' => ({required Object minutes}) => '${minutes} min tilbage', + 'discover.moreLikeThis' => 'Mere som dette', 'errors.searchFailed' => ({required Object error}) => 'Søgning mislykkedes: ${error}', 'errors.connectionTimeout' => ({required Object context}) => 'Forbindelsestimeout ved indlæsning af ${context}', 'errors.connectionFailed' => 'Kan ikke oprette forbindelse til medieserver', @@ -2441,6 +2551,7 @@ extension on TranslationsDa { 'errors.failedToDeleteProfile' => ({required Object displayName}) => 'Kunne ikke slette ${displayName}', 'errors.failedToRate' => 'Kunne ikke opdatere bedømmelsen', 'libraries.title' => 'Biblioteker', + 'libraries.fallbackTitle' => 'Bibliotek', 'libraries.scanLibraryFiles' => 'Scan biblioteksfiler', 'libraries.scanLibrary' => 'Scan bibliotek', 'libraries.analyze' => 'Analysér', @@ -2541,6 +2652,12 @@ extension on TranslationsDa { 'liveTv.noChannels' => 'Ingen kanaler tilgængelige', 'liveTv.noDvr' => 'Ingen DVR konfigureret på nogen server', 'liveTv.noPrograms' => 'Ingen programdata tilgængelig', + 'liveTv.liveStreamFailed' => 'Livestream mislykkedes', + 'liveTv.unknownProgram' => 'Ukendt program', + 'liveTv.unknownHub' => 'Ukendt', + 'liveTv.unknownError' => 'Ukendt fejl', + 'liveTv.channelNumber' => ({required Object number}) => 'Kanal ${number}', + 'liveTv.unknownChannel' => 'Ukendt kanal', 'liveTv.live' => 'LIVE', 'liveTv.reloadGuide' => 'Genindlæs guide', 'liveTv.now' => 'Nu', @@ -2711,12 +2828,21 @@ extension on TranslationsDa { 'downloads.deleteDownload' => 'Slet download', 'downloads.retryDownload' => 'Prøv download igen', 'downloads.downloadQueued' => 'Download i kø', + 'downloads.downloadResumed' => 'Download genoptaget', 'downloads.serverErrorBitrate' => 'Serverfejl: filen overskrider muligvis grænsen for ekstern bitrate', 'downloads.episodesQueued' => ({required Object count}) => '${count} episoder i downloadkø', 'downloads.downloadDeleted' => 'Download slettet', 'downloads.deleteConfirm' => ({required Object title}) => 'Slet "${title}" fra denne enhed?', - 'downloads.deletingWithProgress' => ({required Object title, required Object current, required Object total}) => 'Sletter ${title}... (${current} af ${total})', + 'downloads.cancelledDownloadTitle' => 'Annulleret download', + 'downloads.cancelledDownloadMessage' => 'Denne download blev annulleret. Hvad vil du gøre?', + 'downloads.allEpisodesAlreadyDownloaded' => 'Alle episoder er allerede downloadet', + 'downloads.resumeDownload' => 'Genoptag download', + 'downloads.cancelledDownload' => 'Annulleret download', + 'downloads.syncingFile' => ({required Object file, required Object status}) => '${file} (synkroniserer ${status})', + 'downloads.downloadedFileClickToComplete' => ({required Object file}) => '${file} downloadet — klik for at fuldføre', + 'downloads.partialDownloadClickToComplete' => 'Delvist downloadet — klik for at fuldføre', 'downloads.deleting' => 'Sletter...', + 'downloads.deletingWithProgress' => ({required Object title, required Object current, required Object total}) => 'Sletter ${title}... (${current} af ${total})', 'downloads.queuedTooltip' => 'I kø', 'downloads.queuedFilesTooltip' => ({required Object files}) => 'I kø: ${files}', 'downloads.downloadingTooltip' => 'Downloader...', @@ -2773,6 +2899,7 @@ extension on TranslationsDa { 'shaders.deleteShaderConfirm' => ({required Object name}) => 'Slet "${name}"?', 'companionRemote.title' => 'Fjernbetjening', 'companionRemote.connectedTo' => ({required Object name}) => 'Forbundet til ${name}', + 'companionRemote.unknownDevice' => 'Ukendt enhed', 'companionRemote.session.startingServer' => 'Starter fjernserver...', 'companionRemote.session.failedToCreate' => 'Kunne ikke starte fjernserver:', 'companionRemote.session.hostAddress' => 'Værtsadresse', @@ -2816,6 +2943,8 @@ extension on TranslationsDa { 'companionRemote.remote.tabSettings' => 'Indstillinger', 'companionRemote.remote.previous' => 'Forrige', 'companionRemote.remote.playPause' => 'Afspil/Pause', + _ => null, + } ?? switch (path) { 'companionRemote.remote.next' => 'Næste', 'companionRemote.remote.seekBack' => 'Spol tilbage', 'companionRemote.remote.stop' => 'Stop', @@ -2827,6 +2956,12 @@ extension on TranslationsDa { 'companionRemote.remote.subtitles' => 'Undertekster', 'companionRemote.remote.audio' => 'Lyd', 'companionRemote.remote.searchHint' => 'Søg på desktop...', + 'companionRemote.errors.noNetworkInterface' => 'Ingen netværksgrænseflade fundet', + 'companionRemote.errors.authenticationFailed' => 'Godkendelse mislykkedes', + 'companionRemote.errors.joinTimedOut' => 'Tidsgrænse for deltagelse i session overskredet', + 'companionRemote.errors.failedToConnectAnyAddress' => 'Kunne ikke oprette forbindelse til nogen adresse', + 'companionRemote.errors.connectionLostAfterAttempts' => ({required Object attempts}) => 'Forbindelse mistet efter ${attempts} forsøg', + 'companionRemote.errors.connectionLost' => 'Forbindelse mistet', 'videoSettings.playbackSpeed' => 'Afspilningshastighed', 'videoSettings.zoom' => 'Zoom', 'videoSettings.sleepTimer' => 'Sove-timer', @@ -2837,6 +2972,40 @@ extension on TranslationsDa { 'videoSettings.performanceOverlay' => 'Ydelsesoverlay', 'videoSettings.audioPassthrough' => 'Lyd-passthrough', 'videoSettings.audioNormalization' => 'Normalisér lydstyrke', + 'performanceOverlay.color' => 'Farve', + 'performanceOverlay.performance' => 'Ydeevne', + 'performanceOverlay.buffer' => 'Buffer', + 'performanceOverlay.app' => 'App', + 'performanceOverlay.decoder' => 'Dekoder', + 'performanceOverlay.rawDecoder' => 'Rå dekoder', + 'performanceOverlay.tunneling' => 'Tunneling', + 'performanceOverlay.aspect' => 'Billedformat', + 'performanceOverlay.rotation' => 'Rotation', + 'performanceOverlay.dvSource' => 'DV-kilde', + 'performanceOverlay.dvPath' => 'DV-sti', + 'performanceOverlay.p7Conversion' => 'P7-konv.', + 'performanceOverlay.sampleRate' => 'Samplingsrate', + 'performanceOverlay.pixelFormat' => 'Pixelformat', + 'performanceOverlay.hwFormat' => 'HW-format', + 'performanceOverlay.matrix' => 'Matrix', + 'performanceOverlay.primaries' => 'Primærfarver', + 'performanceOverlay.transfer' => 'Transfer', + 'performanceOverlay.renderFps' => 'Render FPS', + 'performanceOverlay.displayFps' => 'Skærm-FPS', + 'performanceOverlay.avSync' => 'A/V-synk.', + 'performanceOverlay.dropped' => 'Tabte', + 'performanceOverlay.dvRpus' => 'DV RPU’er', + 'performanceOverlay.dvRpuAverage' => 'DV RPU gns.', + 'performanceOverlay.dvSampleAverage' => 'DV-sample gns.', + 'performanceOverlay.maxLuma' => 'Maks. luma', + 'performanceOverlay.minLuma' => 'Min. luma', + 'performanceOverlay.maxCll' => 'MaxCLL', + 'performanceOverlay.maxFall' => 'MaxFALL', + 'performanceOverlay.cacheUsed' => 'Brugt cache', + 'performanceOverlay.speed' => 'Hastighed', + 'performanceOverlay.player' => 'Afspiller', + 'performanceOverlay.memory' => 'Hukommelse', + 'performanceOverlay.uiFps' => 'UI FPS', 'externalPlayer.title' => 'Ekstern afspiller', 'externalPlayer.useExternalPlayer' => 'Brug ekstern afspiller', 'externalPlayer.useExternalPlayerDescription' => 'Åbn videoer i en anden app', @@ -2845,12 +3014,11 @@ extension on TranslationsDa { 'externalPlayer.systemDefault' => 'Systemstandard', 'externalPlayer.addCustomPlayer' => 'Tilføj brugerdefineret afspiller', 'externalPlayer.playerName' => 'Afspillernavn', + 'externalPlayer.playerNameHint' => 'Min afspiller', 'externalPlayer.playerCommand' => 'Kommando', 'externalPlayer.playerPackage' => 'Pakkenavn', 'externalPlayer.playerUrlScheme' => 'URL-skema', 'externalPlayer.off' => 'Fra', - _ => null, - } ?? switch (path) { 'externalPlayer.launchFailed' => 'Kunne ikke åbne ekstern afspiller', 'externalPlayer.appNotInstalled' => ({required Object name}) => '${name} er ikke installeret', 'externalPlayer.playInExternalPlayer' => 'Afspil i ekstern afspiller', diff --git a/lib/i18n/strings_de.g.dart b/lib/i18n/strings_de.g.dart index 5c24d1ab..64a10174 100644 --- a/lib/i18n/strings_de.g.dart +++ b/lib/i18n/strings_de.g.dart @@ -77,6 +77,7 @@ class TranslationsDe extends Translations with BaseTranslations 'Optionen'; @override String get mute => 'Stumm'; @override String get ok => 'OK'; + @override String get off => 'Aus'; + @override String seasonNumber({required Object number}) => 'Staffel ${number}'; + @override String chapterNumber({required Object number}) => 'Kapitel ${number}'; @override String get reconnect => 'Erneut verbinden'; @override String get exit => 'Beenden'; @override String get viewAll => 'Alle anzeigen'; @@ -385,6 +389,10 @@ class _TranslationsSettingsDe extends TranslationsSettingsEn { @override String get dvConversionNative => 'Nativ / deaktiviert'; @override String get dvConversionDv81 => 'P7 → P8.1'; @override String get dvConversionHevcStrip => 'P7 → HEVC'; + @override String get dvConversionAutoDescription => 'Gerätefähigkeiten erkennen und normales Fallback-Verhalten verwenden'; + @override String get dvConversionNativeDescription => 'Natives DV7 erzwingen und DV-Konvertierungsversuch unterdrücken'; + @override String get dvConversionDv81Description => 'Inline-RPU-Konvertierung zu Dolby Vision Profil 8.1 erzwingen'; + @override String get dvConversionHevcStripDescription => 'Dolby-Vision-RPU/EL-Schichten entfernen und reines HEVC ausgeben'; @override String get requireProfileSelectionOnOpen => 'Profil beim Öffnen abfragen'; @override String get requireProfileSelectionOnOpenDescription => 'Profilauswahl bei jedem Öffnen der App anzeigen'; @override String get forceTvMode => 'TV-Modus erzwingen'; @@ -432,6 +440,8 @@ class _TranslationsHotkeysDe extends TranslationsHotkeysEn { // Translations @override String setShortcutFor({required Object actionName}) => 'Tastenkürzel festlegen für ${actionName}'; @override String get clearShortcut => 'Kürzel löschen'; + @override String get noShortcutSet => 'Keine Tastenkombination festgelegt'; + @override String get currentShortcut => 'Aktuelle Tastenkombination:'; @override late final _TranslationsHotkeysActionsDe actions = _TranslationsHotkeysActionsDe._(_root); } @@ -482,6 +492,7 @@ class _TranslationsMediaMenuDe extends TranslationsMediaMenuEn { @override String get goToSeries => 'Zur Serie'; @override String get goToSeason => 'Zur Staffel'; @override String get shufflePlay => 'Zufallswiedergabe'; + @override String get shuffleNotAvailableOffline => 'Zufallswiedergabe ist offline nicht verfügbar'; @override String get fileInfo => 'Dateiinfo'; @override String get deleteFromServer => 'Vom Server löschen'; @override String get confirmDelete => 'Dieses Medium und seine Dateien von deinem Server löschen?'; @@ -620,6 +631,10 @@ class _TranslationsVideoControlsDe extends TranslationsVideoControlsEn { @override String get searchSubtitles => 'Untertitel suchen'; @override String get language => 'Sprache'; @override String get noSubtitlesFound => 'Keine Untertitel gefunden'; + @override String get downloadedSubtitle => 'Heruntergeladen'; + @override String get noSubtitlesAvailable => 'Keine Untertitel verfügbar'; + @override String get noAudioTracksAvailable => 'Keine Audiospuren verfügbar'; + @override String get noTracksAvailable => 'Keine Spuren verfügbar'; @override String get subtitleDownloaded => 'Untertitel heruntergeladen'; @override String get subtitleDownloadFailed => 'Untertitel konnte nicht heruntergeladen werden'; @override String get searchLanguages => 'Sprachen suchen...'; @@ -808,6 +823,7 @@ class _TranslationsProfilesDe extends TranslationsProfilesEn { @override String get pinExplain => '4-stellige PIN zum Profilwechsel erforderlich.'; @override String get continueButton => 'Weiter'; @override String get pinsDontMatch => 'PINs stimmen nicht überein'; + @override String get initializeServicesFailed => 'Profildienste konnten nicht initialisiert werden'; } // Path: connections @@ -854,6 +870,7 @@ class _TranslationsDiscoverDe extends TranslationsDiscoverEn { @override String get movie => 'Film'; @override String get tvShow => 'Serie'; @override String minutesLeft({required Object minutes}) => '${minutes} Min übrig'; + @override String get moreLikeThis => 'Ähnliche Inhalte'; } // Path: errors @@ -886,6 +903,7 @@ class _TranslationsLibrariesDe extends TranslationsLibrariesEn { // Translations @override String get title => 'Mediatheken'; + @override String get fallbackTitle => 'Mediathek'; @override String get scanLibraryFiles => 'Mediatheksdateien scannen'; @override String get scanLibrary => 'Mediathek scannen'; @override String get analyze => 'Analysieren'; @@ -1018,6 +1036,12 @@ class _TranslationsLiveTvDe extends TranslationsLiveTvEn { @override String get noChannels => 'Keine Kanäle verfügbar'; @override String get noDvr => 'Kein DVR auf einem Server konfiguriert'; @override String get noPrograms => 'Keine Programmdaten verfügbar'; + @override String get liveStreamFailed => 'Livestream fehlgeschlagen'; + @override String get unknownProgram => 'Unbekannte Sendung'; + @override String get unknownHub => 'Unbekannt'; + @override String get unknownError => 'Unbekannter Fehler'; + @override String channelNumber({required Object number}) => 'Kanal ${number}'; + @override String get unknownChannel => 'Unbekannter Kanal'; @override String get live => 'LIVE'; @override String get reloadGuide => 'Programmführer neu laden'; @override String get now => 'Jetzt'; @@ -1224,12 +1248,21 @@ class _TranslationsDownloadsDe extends TranslationsDownloadsEn { @override String get deleteDownload => 'Download löschen'; @override String get retryDownload => 'Download wiederholen'; @override String get downloadQueued => 'Download in Warteschlange'; + @override String get downloadResumed => 'Download fortgesetzt'; @override String get serverErrorBitrate => 'Serverfehler: Datei überschreitet möglicherweise das Remote-Bitrate-Limit'; @override String episodesQueued({required Object count}) => '${count} Episoden zum Download hinzugefügt'; @override String get downloadDeleted => 'Download gelöscht'; @override String deleteConfirm({required Object title}) => '"${title}" von diesem Gerät löschen?'; - @override String deletingWithProgress({required Object title, required Object current, required Object total}) => 'Lösche ${title}... (${current} von ${total})'; + @override String get cancelledDownloadTitle => 'Abgebrochener Download'; + @override String get cancelledDownloadMessage => 'Dieser Download wurde abgebrochen. Was möchtest du tun?'; + @override String get allEpisodesAlreadyDownloaded => 'Alle Episoden sind bereits heruntergeladen'; + @override String get resumeDownload => 'Download fortsetzen'; + @override String get cancelledDownload => 'Abgebrochener Download'; + @override String syncingFile({required Object file, required Object status}) => '${file} (${status} wird synchronisiert)'; + @override String downloadedFileClickToComplete({required Object file}) => '${file} heruntergeladen — zum Abschließen klicken'; + @override String get partialDownloadClickToComplete => 'Teilweise heruntergeladen — zum Abschließen klicken'; @override String get deleting => 'Lösche...'; + @override String deletingWithProgress({required Object title, required Object current, required Object total}) => 'Lösche ${title}... (${current} von ${total})'; @override String get queuedTooltip => 'In Warteschlange'; @override String queuedFilesTooltip({required Object files}) => 'In Warteschlange: ${files}'; @override String get downloadingTooltip => 'Lädt herunter...'; @@ -1304,9 +1337,11 @@ class _TranslationsCompanionRemoteDe extends TranslationsCompanionRemoteEn { // Translations @override String get title => 'Companion-Fernbedienung'; @override String connectedTo({required Object name}) => 'Verbunden mit ${name}'; + @override String get unknownDevice => 'Unbekanntes Gerät'; @override late final _TranslationsCompanionRemoteSessionDe session = _TranslationsCompanionRemoteSessionDe._(_root); @override late final _TranslationsCompanionRemotePairingDe pairing = _TranslationsCompanionRemotePairingDe._(_root); @override late final _TranslationsCompanionRemoteRemoteDe remote = _TranslationsCompanionRemoteRemoteDe._(_root); + @override late final _TranslationsCompanionRemoteErrorsDe errors = _TranslationsCompanionRemoteErrorsDe._(_root); } // Path: videoSettings @@ -1328,6 +1363,49 @@ class _TranslationsVideoSettingsDe extends TranslationsVideoSettingsEn { @override String get audioNormalization => 'Lautstärke normalisieren'; } +// Path: performanceOverlay +class _TranslationsPerformanceOverlayDe extends TranslationsPerformanceOverlayEn { + _TranslationsPerformanceOverlayDe._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get color => 'Farbe'; + @override String get performance => 'Leistung'; + @override String get buffer => 'Puffer'; + @override String get app => 'App'; + @override String get decoder => 'Decoder'; + @override String get rawDecoder => 'Raw-Decoder'; + @override String get tunneling => 'Tunneling'; + @override String get aspect => 'Seitenverhältnis'; + @override String get rotation => 'Drehung'; + @override String get dvSource => 'DV-Quelle'; + @override String get dvPath => 'DV-Pfad'; + @override String get p7Conversion => 'P7-Konv.'; + @override String get sampleRate => 'Abtastrate'; + @override String get pixelFormat => 'Pixelformat'; + @override String get hwFormat => 'HW-Format'; + @override String get matrix => 'Matrix'; + @override String get primaries => 'Primärfarben'; + @override String get transfer => 'Transfer'; + @override String get renderFps => 'Render-FPS'; + @override String get displayFps => 'Display-FPS'; + @override String get avSync => 'A/V-Sync'; + @override String get dropped => 'Verworfen'; + @override String get dvRpus => 'DV-RPUs'; + @override String get dvRpuAverage => 'DV-RPU Ø'; + @override String get dvSampleAverage => 'DV-Sample Ø'; + @override String get maxLuma => 'Max. Luma'; + @override String get minLuma => 'Min. Luma'; + @override String get maxCll => 'MaxCLL'; + @override String get maxFall => 'MaxFALL'; + @override String get cacheUsed => 'Cache genutzt'; + @override String get speed => 'Geschwindigkeit'; + @override String get player => 'Player'; + @override String get memory => 'Speicher'; + @override String get uiFps => 'UI-FPS'; +} + // Path: externalPlayer class _TranslationsExternalPlayerDe extends TranslationsExternalPlayerEn { _TranslationsExternalPlayerDe._(TranslationsDe root) : this._root = root, super.internal(root); @@ -1343,6 +1421,7 @@ class _TranslationsExternalPlayerDe extends TranslationsExternalPlayerEn { @override String get systemDefault => 'Systemstandard'; @override String get addCustomPlayer => 'Benutzerdefinierten Player hinzufügen'; @override String get playerName => 'Playername'; + @override String get playerNameHint => 'Mein Player'; @override String get playerCommand => 'Befehl'; @override String get playerPackage => 'Paketname'; @override String get playerUrlScheme => 'URL-Schema'; @@ -1755,6 +1834,21 @@ class _TranslationsCompanionRemoteRemoteDe extends TranslationsCompanionRemoteRe @override String get searchHint => 'Auf Desktop suchen...'; } +// Path: companionRemote.errors +class _TranslationsCompanionRemoteErrorsDe extends TranslationsCompanionRemoteErrorsEn { + _TranslationsCompanionRemoteErrorsDe._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String get noNetworkInterface => 'Keine Netzwerkschnittstelle gefunden'; + @override String get authenticationFailed => 'Authentifizierung fehlgeschlagen'; + @override String get joinTimedOut => 'Zeitüberschreitung beim Beitreten zur Sitzung'; + @override String get failedToConnectAnyAddress => 'Keine Verbindung zu einer Adresse möglich'; + @override String connectionLostAfterAttempts({required Object attempts}) => 'Verbindung nach ${attempts} Versuchen verloren'; + @override String get connectionLost => 'Verbindung verloren'; +} + // Path: trackers.services class _TranslationsTrackersServicesDe extends TranslationsTrackersServicesEn { _TranslationsTrackersServicesDe._(TranslationsDe root) : this._root = root, super.internal(root); @@ -1871,6 +1965,9 @@ extension on TranslationsDe { 'common.settings' => 'Optionen', 'common.mute' => 'Stumm', 'common.ok' => 'OK', + 'common.off' => 'Aus', + 'common.seasonNumber' => ({required Object number}) => 'Staffel ${number}', + 'common.chapterNumber' => ({required Object number}) => 'Kapitel ${number}', 'common.reconnect' => 'Erneut verbinden', 'common.exit' => 'Beenden', 'common.viewAll' => 'Alle anzeigen', @@ -2070,6 +2167,10 @@ extension on TranslationsDe { 'settings.dvConversionNative' => 'Nativ / deaktiviert', 'settings.dvConversionDv81' => 'P7 → P8.1', 'settings.dvConversionHevcStrip' => 'P7 → HEVC', + 'settings.dvConversionAutoDescription' => 'Gerätefähigkeiten erkennen und normales Fallback-Verhalten verwenden', + 'settings.dvConversionNativeDescription' => 'Natives DV7 erzwingen und DV-Konvertierungsversuch unterdrücken', + 'settings.dvConversionDv81Description' => 'Inline-RPU-Konvertierung zu Dolby Vision Profil 8.1 erzwingen', + 'settings.dvConversionHevcStripDescription' => 'Dolby-Vision-RPU/EL-Schichten entfernen und reines HEVC ausgeben', 'settings.requireProfileSelectionOnOpen' => 'Profil beim Öffnen abfragen', 'settings.requireProfileSelectionOnOpenDescription' => 'Profilauswahl bei jedem Öffnen der App anzeigen', 'settings.forceTvMode' => 'TV-Modus erzwingen', @@ -2099,6 +2200,8 @@ extension on TranslationsDe { 'search.enterTitleActorOrKeyword' => 'Titel, Schauspieler oder Stichwort eingeben', 'hotkeys.setShortcutFor' => ({required Object actionName}) => 'Tastenkürzel festlegen für ${actionName}', 'hotkeys.clearShortcut' => 'Kürzel löschen', + 'hotkeys.noShortcutSet' => 'Keine Tastenkombination festgelegt', + 'hotkeys.currentShortcut' => 'Aktuelle Tastenkombination:', 'hotkeys.actions.playPause' => 'Wiedergabe/Pause', 'hotkeys.actions.volumeUp' => 'Lauter', 'hotkeys.actions.volumeDown' => 'Leiser', @@ -2155,6 +2258,7 @@ extension on TranslationsDe { 'mediaMenu.goToSeries' => 'Zur Serie', 'mediaMenu.goToSeason' => 'Zur Staffel', 'mediaMenu.shufflePlay' => 'Zufallswiedergabe', + 'mediaMenu.shuffleNotAvailableOffline' => 'Zufallswiedergabe ist offline nicht verfügbar', 'mediaMenu.fileInfo' => 'Dateiinfo', 'mediaMenu.deleteFromServer' => 'Vom Server löschen', 'mediaMenu.confirmDelete' => 'Dieses Medium und seine Dateien von deinem Server löschen?', @@ -2263,6 +2367,10 @@ extension on TranslationsDe { 'videoControls.searchSubtitles' => 'Untertitel suchen', 'videoControls.language' => 'Sprache', 'videoControls.noSubtitlesFound' => 'Keine Untertitel gefunden', + 'videoControls.downloadedSubtitle' => 'Heruntergeladen', + 'videoControls.noSubtitlesAvailable' => 'Keine Untertitel verfügbar', + 'videoControls.noAudioTracksAvailable' => 'Keine Audiospuren verfügbar', + 'videoControls.noTracksAvailable' => 'Keine Spuren verfügbar', 'videoControls.subtitleDownloaded' => 'Untertitel heruntergeladen', 'videoControls.subtitleDownloadFailed' => 'Untertitel konnte nicht heruntergeladen werden', 'videoControls.searchLanguages' => 'Sprachen suchen...', @@ -2321,6 +2429,8 @@ extension on TranslationsDe { 'subtitlingStyling.borderColor' => 'Rahmenfarbe', 'subtitlingStyling.backgroundOpacity' => 'Hintergrunddeckkraft', 'subtitlingStyling.backgroundColor' => 'Hintergrundfarbe', + _ => null, + } ?? switch (path) { 'subtitlingStyling.position' => 'Position', 'subtitlingStyling.assOverride' => 'ASS-Überschreibung', 'subtitlingStyling.bold' => 'Fett', @@ -2335,8 +2445,6 @@ extension on TranslationsDe { 'mpvConfig.loadPreset' => 'Laden', 'mpvConfig.deletePreset' => 'Löschen', 'mpvConfig.presetSaved' => 'Voreinstellung gespeichert', - _ => null, - } ?? switch (path) { 'mpvConfig.presetLoaded' => 'Voreinstellung geladen', 'mpvConfig.presetDeleted' => 'Voreinstellung gelöscht', 'mpvConfig.confirmDeletePreset' => 'Möchten Sie diese Voreinstellung wirklich löschen?', @@ -2399,6 +2507,7 @@ extension on TranslationsDe { 'profiles.pinExplain' => '4-stellige PIN zum Profilwechsel erforderlich.', 'profiles.continueButton' => 'Weiter', 'profiles.pinsDontMatch' => 'PINs stimmen nicht überein', + 'profiles.initializeServicesFailed' => 'Profildienste konnten nicht initialisiert werden', 'connections.sectionTitle' => 'Verbindungen', 'connections.addConnection' => 'Verbindung hinzufügen', 'connections.addConnectionSubtitleNoProfile' => 'Mit Plex anmelden oder Jellyfin-Server verbinden', @@ -2427,6 +2536,7 @@ extension on TranslationsDe { 'discover.movie' => 'Film', 'discover.tvShow' => 'Serie', 'discover.minutesLeft' => ({required Object minutes}) => '${minutes} Min übrig', + 'discover.moreLikeThis' => 'Ähnliche Inhalte', 'errors.searchFailed' => ({required Object error}) => 'Suche fehlgeschlagen: ${error}', 'errors.connectionTimeout' => ({required Object context}) => 'Zeitüberschreitung beim Laden von ${context}', 'errors.connectionFailed' => 'Keine Verbindung zum Medienserver möglich', @@ -2441,6 +2551,7 @@ extension on TranslationsDe { 'errors.failedToDeleteProfile' => ({required Object displayName}) => 'Löschen von ${displayName} fehlgeschlagen', 'errors.failedToRate' => 'Bewertung konnte nicht aktualisiert werden', 'libraries.title' => 'Mediatheken', + 'libraries.fallbackTitle' => 'Mediathek', 'libraries.scanLibraryFiles' => 'Mediatheksdateien scannen', 'libraries.scanLibrary' => 'Mediathek scannen', 'libraries.analyze' => 'Analysieren', @@ -2541,6 +2652,12 @@ extension on TranslationsDe { 'liveTv.noChannels' => 'Keine Kanäle verfügbar', 'liveTv.noDvr' => 'Kein DVR auf einem Server konfiguriert', 'liveTv.noPrograms' => 'Keine Programmdaten verfügbar', + 'liveTv.liveStreamFailed' => 'Livestream fehlgeschlagen', + 'liveTv.unknownProgram' => 'Unbekannte Sendung', + 'liveTv.unknownHub' => 'Unbekannt', + 'liveTv.unknownError' => 'Unbekannter Fehler', + 'liveTv.channelNumber' => ({required Object number}) => 'Kanal ${number}', + 'liveTv.unknownChannel' => 'Unbekannter Kanal', 'liveTv.live' => 'LIVE', 'liveTv.reloadGuide' => 'Programmführer neu laden', 'liveTv.now' => 'Jetzt', @@ -2711,12 +2828,21 @@ extension on TranslationsDe { 'downloads.deleteDownload' => 'Download löschen', 'downloads.retryDownload' => 'Download wiederholen', 'downloads.downloadQueued' => 'Download in Warteschlange', + 'downloads.downloadResumed' => 'Download fortgesetzt', 'downloads.serverErrorBitrate' => 'Serverfehler: Datei überschreitet möglicherweise das Remote-Bitrate-Limit', 'downloads.episodesQueued' => ({required Object count}) => '${count} Episoden zum Download hinzugefügt', 'downloads.downloadDeleted' => 'Download gelöscht', 'downloads.deleteConfirm' => ({required Object title}) => '"${title}" von diesem Gerät löschen?', - 'downloads.deletingWithProgress' => ({required Object title, required Object current, required Object total}) => 'Lösche ${title}... (${current} von ${total})', + 'downloads.cancelledDownloadTitle' => 'Abgebrochener Download', + 'downloads.cancelledDownloadMessage' => 'Dieser Download wurde abgebrochen. Was möchtest du tun?', + 'downloads.allEpisodesAlreadyDownloaded' => 'Alle Episoden sind bereits heruntergeladen', + 'downloads.resumeDownload' => 'Download fortsetzen', + 'downloads.cancelledDownload' => 'Abgebrochener Download', + 'downloads.syncingFile' => ({required Object file, required Object status}) => '${file} (${status} wird synchronisiert)', + 'downloads.downloadedFileClickToComplete' => ({required Object file}) => '${file} heruntergeladen — zum Abschließen klicken', + 'downloads.partialDownloadClickToComplete' => 'Teilweise heruntergeladen — zum Abschließen klicken', 'downloads.deleting' => 'Lösche...', + 'downloads.deletingWithProgress' => ({required Object title, required Object current, required Object total}) => 'Lösche ${title}... (${current} von ${total})', 'downloads.queuedTooltip' => 'In Warteschlange', 'downloads.queuedFilesTooltip' => ({required Object files}) => 'In Warteschlange: ${files}', 'downloads.downloadingTooltip' => 'Lädt herunter...', @@ -2773,6 +2899,7 @@ extension on TranslationsDe { 'shaders.deleteShaderConfirm' => ({required Object name}) => '"${name}" löschen?', 'companionRemote.title' => 'Companion-Fernbedienung', 'companionRemote.connectedTo' => ({required Object name}) => 'Verbunden mit ${name}', + 'companionRemote.unknownDevice' => 'Unbekanntes Gerät', 'companionRemote.session.startingServer' => 'Remote-Server wird gestartet...', 'companionRemote.session.failedToCreate' => 'Remote-Server konnte nicht gestartet werden:', 'companionRemote.session.hostAddress' => 'Host-Adresse', @@ -2816,6 +2943,8 @@ extension on TranslationsDe { 'companionRemote.remote.tabSettings' => 'Einstellungen', 'companionRemote.remote.previous' => 'Zurück', 'companionRemote.remote.playPause' => 'Wiedergabe/Pause', + _ => null, + } ?? switch (path) { 'companionRemote.remote.next' => 'Weiter', 'companionRemote.remote.seekBack' => 'Zurückspulen', 'companionRemote.remote.stop' => 'Stopp', @@ -2827,6 +2956,12 @@ extension on TranslationsDe { 'companionRemote.remote.subtitles' => 'Untertitel', 'companionRemote.remote.audio' => 'Audio', 'companionRemote.remote.searchHint' => 'Auf Desktop suchen...', + 'companionRemote.errors.noNetworkInterface' => 'Keine Netzwerkschnittstelle gefunden', + 'companionRemote.errors.authenticationFailed' => 'Authentifizierung fehlgeschlagen', + 'companionRemote.errors.joinTimedOut' => 'Zeitüberschreitung beim Beitreten zur Sitzung', + 'companionRemote.errors.failedToConnectAnyAddress' => 'Keine Verbindung zu einer Adresse möglich', + 'companionRemote.errors.connectionLostAfterAttempts' => ({required Object attempts}) => 'Verbindung nach ${attempts} Versuchen verloren', + 'companionRemote.errors.connectionLost' => 'Verbindung verloren', 'videoSettings.playbackSpeed' => 'Wiedergabegeschwindigkeit', 'videoSettings.zoom' => 'Zoom', 'videoSettings.sleepTimer' => 'Schlaftimer', @@ -2837,6 +2972,40 @@ extension on TranslationsDe { 'videoSettings.performanceOverlay' => 'Leistungsanzeige', 'videoSettings.audioPassthrough' => 'Audio-Durchleitung', 'videoSettings.audioNormalization' => 'Lautstärke normalisieren', + 'performanceOverlay.color' => 'Farbe', + 'performanceOverlay.performance' => 'Leistung', + 'performanceOverlay.buffer' => 'Puffer', + 'performanceOverlay.app' => 'App', + 'performanceOverlay.decoder' => 'Decoder', + 'performanceOverlay.rawDecoder' => 'Raw-Decoder', + 'performanceOverlay.tunneling' => 'Tunneling', + 'performanceOverlay.aspect' => 'Seitenverhältnis', + 'performanceOverlay.rotation' => 'Drehung', + 'performanceOverlay.dvSource' => 'DV-Quelle', + 'performanceOverlay.dvPath' => 'DV-Pfad', + 'performanceOverlay.p7Conversion' => 'P7-Konv.', + 'performanceOverlay.sampleRate' => 'Abtastrate', + 'performanceOverlay.pixelFormat' => 'Pixelformat', + 'performanceOverlay.hwFormat' => 'HW-Format', + 'performanceOverlay.matrix' => 'Matrix', + 'performanceOverlay.primaries' => 'Primärfarben', + 'performanceOverlay.transfer' => 'Transfer', + 'performanceOverlay.renderFps' => 'Render-FPS', + 'performanceOverlay.displayFps' => 'Display-FPS', + 'performanceOverlay.avSync' => 'A/V-Sync', + 'performanceOverlay.dropped' => 'Verworfen', + 'performanceOverlay.dvRpus' => 'DV-RPUs', + 'performanceOverlay.dvRpuAverage' => 'DV-RPU Ø', + 'performanceOverlay.dvSampleAverage' => 'DV-Sample Ø', + 'performanceOverlay.maxLuma' => 'Max. Luma', + 'performanceOverlay.minLuma' => 'Min. Luma', + 'performanceOverlay.maxCll' => 'MaxCLL', + 'performanceOverlay.maxFall' => 'MaxFALL', + 'performanceOverlay.cacheUsed' => 'Cache genutzt', + 'performanceOverlay.speed' => 'Geschwindigkeit', + 'performanceOverlay.player' => 'Player', + 'performanceOverlay.memory' => 'Speicher', + 'performanceOverlay.uiFps' => 'UI-FPS', 'externalPlayer.title' => 'Externer Player', 'externalPlayer.useExternalPlayer' => 'Externen Player verwenden', 'externalPlayer.useExternalPlayerDescription' => 'Videos in einer anderen App öffnen', @@ -2845,12 +3014,11 @@ extension on TranslationsDe { 'externalPlayer.systemDefault' => 'Systemstandard', 'externalPlayer.addCustomPlayer' => 'Benutzerdefinierten Player hinzufügen', 'externalPlayer.playerName' => 'Playername', + 'externalPlayer.playerNameHint' => 'Mein Player', 'externalPlayer.playerCommand' => 'Befehl', 'externalPlayer.playerPackage' => 'Paketname', 'externalPlayer.playerUrlScheme' => 'URL-Schema', 'externalPlayer.off' => 'Aus', - _ => null, - } ?? switch (path) { 'externalPlayer.launchFailed' => 'Externer Player konnte nicht geöffnet werden', 'externalPlayer.appNotInstalled' => ({required Object name}) => '${name} ist nicht installiert', 'externalPlayer.playInExternalPlayer' => 'In externem Player abspielen', diff --git a/lib/i18n/strings_en.g.dart b/lib/i18n/strings_en.g.dart index 85a2b0a1..e9f47278 100644 --- a/lib/i18n/strings_en.g.dart +++ b/lib/i18n/strings_en.g.dart @@ -78,6 +78,7 @@ class Translations with BaseTranslations { late final TranslationsShadersEn shaders = TranslationsShadersEn.internal(_root); late final TranslationsCompanionRemoteEn companionRemote = TranslationsCompanionRemoteEn.internal(_root); late final TranslationsVideoSettingsEn videoSettings = TranslationsVideoSettingsEn.internal(_root); + late final TranslationsPerformanceOverlayEn performanceOverlay = TranslationsPerformanceOverlayEn.internal(_root); late final TranslationsExternalPlayerEn externalPlayer = TranslationsExternalPlayerEn.internal(_root); late final TranslationsMetadataEditEn metadataEdit = TranslationsMetadataEditEn.internal(_root); late final TranslationsMatchScreenEn matchScreen = TranslationsMatchScreenEn.internal(_root); @@ -257,6 +258,15 @@ class TranslationsCommonEn { /// en: 'OK' String get ok => 'OK'; + /// en: 'Off' + String get off => 'Off'; + + /// en: 'Season ${number}' + String seasonNumber({required Object number}) => 'Season ${number}'; + + /// en: 'Chapter ${number}' + String chapterNumber({required Object number}) => 'Chapter ${number}'; + /// en: 'Reconnect' String get reconnect => 'Reconnect'; @@ -881,6 +891,18 @@ class TranslationsSettingsEn { /// en: 'P7 → HEVC' String get dvConversionHevcStrip => 'P7 → HEVC'; + /// en: 'Use device capability detection and normal fallback behavior' + String get dvConversionAutoDescription => 'Use device capability detection and normal fallback behavior'; + + /// en: 'Force native DV7 and suppress DV conversion retry' + String get dvConversionNativeDescription => 'Force native DV7 and suppress DV conversion retry'; + + /// en: 'Force inline RPU conversion to Dolby Vision profile 8.1' + String get dvConversionDv81Description => 'Force inline RPU conversion to Dolby Vision profile 8.1'; + + /// en: 'Strip Dolby Vision RPU/EL layers and present plain HEVC' + String get dvConversionHevcStripDescription => 'Strip Dolby Vision RPU/EL layers and present plain HEVC'; + /// en: 'Ask for profile on app open' String get requireProfileSelectionOnOpen => 'Ask for profile on app open'; @@ -986,6 +1008,12 @@ class TranslationsHotkeysEn { /// en: 'Clear shortcut' String get clearShortcut => 'Clear shortcut'; + /// en: 'No shortcut set' + String get noShortcutSet => 'No shortcut set'; + + /// en: 'Current shortcut:' + String get currentShortcut => 'Current shortcut:'; + late final TranslationsHotkeysActionsEn actions = TranslationsHotkeysActionsEn.internal(_root); } @@ -1099,6 +1127,9 @@ class TranslationsMediaMenuEn { /// en: 'Shuffle Play' String get shufflePlay => 'Shuffle Play'; + /// en: 'Shuffle not available offline' + String get shuffleNotAvailableOffline => 'Shuffle not available offline'; + /// en: 'File Info' String get fileInfo => 'File Info'; @@ -1440,6 +1471,18 @@ class TranslationsVideoControlsEn { /// en: 'No subtitles found' String get noSubtitlesFound => 'No subtitles found'; + /// en: 'Downloaded' + String get downloadedSubtitle => 'Downloaded'; + + /// en: 'No subtitles available' + String get noSubtitlesAvailable => 'No subtitles available'; + + /// en: 'No audio tracks available' + String get noAudioTracksAvailable => 'No audio tracks available'; + + /// en: 'No tracks available' + String get noTracksAvailable => 'No tracks available'; + /// en: 'Subtitle downloaded' String get subtitleDownloaded => 'Subtitle downloaded'; @@ -1895,6 +1938,9 @@ class TranslationsProfilesEn { /// en: 'PINs don't match' String get pinsDontMatch => 'PINs don\'t match'; + + /// en: 'Failed to initialize profile services' + String get initializeServicesFailed => 'Failed to initialize profile services'; } // Path: connections @@ -1997,6 +2043,9 @@ class TranslationsDiscoverEn { /// en: '${minutes} min left' String minutesLeft({required Object minutes}) => '${minutes} min left'; + + /// en: 'More Like This' + String get moreLikeThis => 'More Like This'; } // Path: errors @@ -2058,6 +2107,9 @@ class TranslationsLibrariesEn { /// en: 'Libraries' String get title => 'Libraries'; + /// en: 'Library' + String get fallbackTitle => 'Library'; + /// en: 'Scan Library Files' String get scanLibraryFiles => 'Scan Library Files'; @@ -2321,6 +2373,24 @@ class TranslationsLiveTvEn { /// en: 'No program data available' String get noPrograms => 'No program data available'; + /// en: 'Live stream failed' + String get liveStreamFailed => 'Live stream failed'; + + /// en: 'Unknown Program' + String get unknownProgram => 'Unknown Program'; + + /// en: 'Unknown' + String get unknownHub => 'Unknown'; + + /// en: 'Unknown error' + String get unknownError => 'Unknown error'; + + /// en: 'Channel ${number}' + String channelNumber({required Object number}) => 'Channel ${number}'; + + /// en: 'Unknown channel' + String get unknownChannel => 'Unknown channel'; + /// en: 'LIVE' String get live => 'LIVE'; @@ -2867,6 +2937,9 @@ class TranslationsDownloadsEn { /// en: 'Download queued' String get downloadQueued => 'Download queued'; + /// en: 'Download resumed' + String get downloadResumed => 'Download resumed'; + /// en: 'Server error: file may exceed the remote bitrate limit' String get serverErrorBitrate => 'Server error: file may exceed the remote bitrate limit'; @@ -2879,6 +2952,30 @@ class TranslationsDownloadsEn { /// en: 'Delete "${title}" from this device?' String deleteConfirm({required Object title}) => 'Delete "${title}" from this device?'; + /// en: 'Cancelled Download' + String get cancelledDownloadTitle => 'Cancelled Download'; + + /// en: 'This download was cancelled. What would you like to do?' + String get cancelledDownloadMessage => 'This download was cancelled. What would you like to do?'; + + /// en: 'All episodes already downloaded' + String get allEpisodesAlreadyDownloaded => 'All episodes already downloaded'; + + /// en: 'Resume download' + String get resumeDownload => 'Resume download'; + + /// en: 'Cancelled download' + String get cancelledDownload => 'Cancelled download'; + + /// en: '${file} (syncing ${status})' + String syncingFile({required Object file, required Object status}) => '${file} (syncing ${status})'; + + /// en: 'Downloaded ${file} - Click to complete' + String downloadedFileClickToComplete({required Object file}) => 'Downloaded ${file} - Click to complete'; + + /// en: 'Partially downloaded - Click to complete' + String get partialDownloadClickToComplete => 'Partially downloaded - Click to complete'; + /// en: 'Deleting...' String get deleting => 'Deleting...'; @@ -3071,9 +3168,13 @@ class TranslationsCompanionRemoteEn { /// en: 'Connected to ${name}' String connectedTo({required Object name}) => 'Connected to ${name}'; + /// en: 'Unknown Device' + String get unknownDevice => 'Unknown Device'; + late final TranslationsCompanionRemoteSessionEn session = TranslationsCompanionRemoteSessionEn.internal(_root); late final TranslationsCompanionRemotePairingEn pairing = TranslationsCompanionRemotePairingEn.internal(_root); late final TranslationsCompanionRemoteRemoteEn remote = TranslationsCompanionRemoteRemoteEn.internal(_root); + late final TranslationsCompanionRemoteErrorsEn errors = TranslationsCompanionRemoteErrorsEn.internal(_root); } // Path: videoSettings @@ -3115,6 +3216,117 @@ class TranslationsVideoSettingsEn { String get audioNormalization => 'Normalize Loudness'; } +// Path: performanceOverlay +class TranslationsPerformanceOverlayEn { + TranslationsPerformanceOverlayEn.internal(this._root); + + final Translations _root; // ignore: unused_field + + // Translations + + /// en: 'Color' + String get color => 'Color'; + + /// en: 'Performance' + String get performance => 'Performance'; + + /// en: 'Buffer' + String get buffer => 'Buffer'; + + /// en: 'App' + String get app => 'App'; + + /// en: 'Decoder' + String get decoder => 'Decoder'; + + /// en: 'Raw Decoder' + String get rawDecoder => 'Raw Decoder'; + + /// en: 'Tunneling' + String get tunneling => 'Tunneling'; + + /// en: 'Aspect' + String get aspect => 'Aspect'; + + /// en: 'Rotation' + String get rotation => 'Rotation'; + + /// en: 'DV Source' + String get dvSource => 'DV Source'; + + /// en: 'DV Path' + String get dvPath => 'DV Path'; + + /// en: 'P7 Conv' + String get p7Conversion => 'P7 Conv'; + + /// en: 'Sample Rate' + String get sampleRate => 'Sample Rate'; + + /// en: 'Pixel Fmt' + String get pixelFormat => 'Pixel Fmt'; + + /// en: 'HW Fmt' + String get hwFormat => 'HW Fmt'; + + /// en: 'Matrix' + String get matrix => 'Matrix'; + + /// en: 'Primaries' + String get primaries => 'Primaries'; + + /// en: 'Transfer' + String get transfer => 'Transfer'; + + /// en: 'Render FPS' + String get renderFps => 'Render FPS'; + + /// en: 'Display FPS' + String get displayFps => 'Display FPS'; + + /// en: 'A/V Sync' + String get avSync => 'A/V Sync'; + + /// en: 'Dropped' + String get dropped => 'Dropped'; + + /// en: 'DV RPUs' + String get dvRpus => 'DV RPUs'; + + /// en: 'DV RPU Avg' + String get dvRpuAverage => 'DV RPU Avg'; + + /// en: 'DV Sample Avg' + String get dvSampleAverage => 'DV Sample Avg'; + + /// en: 'Max Luma' + String get maxLuma => 'Max Luma'; + + /// en: 'Min Luma' + String get minLuma => 'Min Luma'; + + /// en: 'MaxCLL' + String get maxCll => 'MaxCLL'; + + /// en: 'MaxFALL' + String get maxFall => 'MaxFALL'; + + /// en: 'Cache Used' + String get cacheUsed => 'Cache Used'; + + /// en: 'Speed' + String get speed => 'Speed'; + + /// en: 'Player' + String get player => 'Player'; + + /// en: 'Memory' + String get memory => 'Memory'; + + /// en: 'UI FPS' + String get uiFps => 'UI FPS'; +} + // Path: externalPlayer class TranslationsExternalPlayerEn { TranslationsExternalPlayerEn.internal(this._root); @@ -3147,6 +3359,9 @@ class TranslationsExternalPlayerEn { /// en: 'Player Name' String get playerName => 'Player Name'; + /// en: 'My Player' + String get playerNameHint => 'My Player'; + /// en: 'Command' String get playerCommand => 'Command'; @@ -4101,6 +4316,33 @@ class TranslationsCompanionRemoteRemoteEn { String get searchHint => 'Search on desktop...'; } +// Path: companionRemote.errors +class TranslationsCompanionRemoteErrorsEn { + TranslationsCompanionRemoteErrorsEn.internal(this._root); + + final Translations _root; // ignore: unused_field + + // Translations + + /// en: 'No network interface found' + String get noNetworkInterface => 'No network interface found'; + + /// en: 'Authentication failed' + String get authenticationFailed => 'Authentication failed'; + + /// en: 'Timed out joining session' + String get joinTimedOut => 'Timed out joining session'; + + /// en: 'Failed to connect to any address' + String get failedToConnectAnyAddress => 'Failed to connect to any address'; + + /// en: 'Connection lost after ${attempts} attempts' + String connectionLostAfterAttempts({required Object attempts}) => 'Connection lost after ${attempts} attempts'; + + /// en: 'Connection lost' + String get connectionLost => 'Connection lost'; +} + // Path: trackers.services class TranslationsTrackersServicesEn { TranslationsTrackersServicesEn.internal(this._root); @@ -4265,6 +4507,9 @@ extension on Translations { 'common.settings' => 'Settings', 'common.mute' => 'Mute', 'common.ok' => 'OK', + 'common.off' => 'Off', + 'common.seasonNumber' => ({required Object number}) => 'Season ${number}', + 'common.chapterNumber' => ({required Object number}) => 'Chapter ${number}', 'common.reconnect' => 'Reconnect', 'common.exit' => 'Exit', 'common.viewAll' => 'View All', @@ -4464,6 +4709,10 @@ extension on Translations { 'settings.dvConversionNative' => 'Native / Disabled', 'settings.dvConversionDv81' => 'P7 → P8.1', 'settings.dvConversionHevcStrip' => 'P7 → HEVC', + 'settings.dvConversionAutoDescription' => 'Use device capability detection and normal fallback behavior', + 'settings.dvConversionNativeDescription' => 'Force native DV7 and suppress DV conversion retry', + 'settings.dvConversionDv81Description' => 'Force inline RPU conversion to Dolby Vision profile 8.1', + 'settings.dvConversionHevcStripDescription' => 'Strip Dolby Vision RPU/EL layers and present plain HEVC', 'settings.requireProfileSelectionOnOpen' => 'Ask for profile on app open', 'settings.requireProfileSelectionOnOpenDescription' => 'Show profile selection every time the app is opened', 'settings.forceTvMode' => 'Force TV mode', @@ -4493,6 +4742,8 @@ extension on Translations { 'search.enterTitleActorOrKeyword' => 'Enter a title, actor, or keyword', 'hotkeys.setShortcutFor' => ({required Object actionName}) => 'Set Shortcut for ${actionName}', 'hotkeys.clearShortcut' => 'Clear shortcut', + 'hotkeys.noShortcutSet' => 'No shortcut set', + 'hotkeys.currentShortcut' => 'Current shortcut:', 'hotkeys.actions.playPause' => 'Play/Pause', 'hotkeys.actions.volumeUp' => 'Volume Up', 'hotkeys.actions.volumeDown' => 'Volume Down', @@ -4549,6 +4800,7 @@ extension on Translations { 'mediaMenu.goToSeries' => 'Go to series', 'mediaMenu.goToSeason' => 'Go to season', 'mediaMenu.shufflePlay' => 'Shuffle Play', + 'mediaMenu.shuffleNotAvailableOffline' => 'Shuffle not available offline', 'mediaMenu.fileInfo' => 'File Info', 'mediaMenu.deleteFromServer' => 'Delete from server', 'mediaMenu.confirmDelete' => 'Delete this media and its files from your server?', @@ -4657,6 +4909,10 @@ extension on Translations { 'videoControls.searchSubtitles' => 'Search Subtitles', 'videoControls.language' => 'Language', 'videoControls.noSubtitlesFound' => 'No subtitles found', + 'videoControls.downloadedSubtitle' => 'Downloaded', + 'videoControls.noSubtitlesAvailable' => 'No subtitles available', + 'videoControls.noAudioTracksAvailable' => 'No audio tracks available', + 'videoControls.noTracksAvailable' => 'No tracks available', 'videoControls.subtitleDownloaded' => 'Subtitle downloaded', 'videoControls.subtitleDownloadFailed' => 'Failed to download subtitle', 'videoControls.searchLanguages' => 'Search languages...', @@ -4715,6 +4971,8 @@ extension on Translations { 'subtitlingStyling.borderColor' => 'Border Color', 'subtitlingStyling.backgroundOpacity' => 'Background Opacity', 'subtitlingStyling.backgroundColor' => 'Background Color', + _ => null, + } ?? switch (path) { 'subtitlingStyling.position' => 'Position', 'subtitlingStyling.assOverride' => 'ASS Override', 'subtitlingStyling.bold' => 'Bold', @@ -4729,8 +4987,6 @@ extension on Translations { 'mpvConfig.loadPreset' => 'Load', 'mpvConfig.deletePreset' => 'Delete', 'mpvConfig.presetSaved' => 'Preset saved', - _ => null, - } ?? switch (path) { 'mpvConfig.presetLoaded' => 'Preset loaded', 'mpvConfig.presetDeleted' => 'Preset deleted', 'mpvConfig.confirmDeletePreset' => 'Are you sure you want to delete this preset?', @@ -4793,6 +5049,7 @@ extension on Translations { 'profiles.pinExplain' => '4-digit PIN required to switch profiles.', 'profiles.continueButton' => 'Continue', 'profiles.pinsDontMatch' => 'PINs don\'t match', + 'profiles.initializeServicesFailed' => 'Failed to initialize profile services', 'connections.sectionTitle' => 'Connections', 'connections.addConnection' => 'Add connection', 'connections.addConnectionSubtitleNoProfile' => 'Sign in with Plex or connect a Jellyfin server', @@ -4821,6 +5078,7 @@ extension on Translations { 'discover.movie' => 'Movie', 'discover.tvShow' => 'TV Show', 'discover.minutesLeft' => ({required Object minutes}) => '${minutes} min left', + 'discover.moreLikeThis' => 'More Like This', 'errors.searchFailed' => ({required Object error}) => 'Search failed: ${error}', 'errors.connectionTimeout' => ({required Object context}) => 'Connection timeout while loading ${context}', 'errors.connectionFailed' => 'Unable to connect to media server', @@ -4835,6 +5093,7 @@ extension on Translations { 'errors.failedToDeleteProfile' => ({required Object displayName}) => 'Failed to delete ${displayName}', 'errors.failedToRate' => 'Couldn\'t update rating', 'libraries.title' => 'Libraries', + 'libraries.fallbackTitle' => 'Library', 'libraries.scanLibraryFiles' => 'Scan Library Files', 'libraries.scanLibrary' => 'Scan Library', 'libraries.analyze' => 'Analyze', @@ -4935,6 +5194,12 @@ extension on Translations { 'liveTv.noChannels' => 'No channels available', 'liveTv.noDvr' => 'No DVR configured on any server', 'liveTv.noPrograms' => 'No program data available', + 'liveTv.liveStreamFailed' => 'Live stream failed', + 'liveTv.unknownProgram' => 'Unknown Program', + 'liveTv.unknownHub' => 'Unknown', + 'liveTv.unknownError' => 'Unknown error', + 'liveTv.channelNumber' => ({required Object number}) => 'Channel ${number}', + 'liveTv.unknownChannel' => 'Unknown channel', 'liveTv.live' => 'LIVE', 'liveTv.reloadGuide' => 'Reload Guide', 'liveTv.now' => 'Now', @@ -5105,10 +5370,19 @@ extension on Translations { 'downloads.deleteDownload' => 'Delete download', 'downloads.retryDownload' => 'Retry download', 'downloads.downloadQueued' => 'Download queued', + 'downloads.downloadResumed' => 'Download resumed', 'downloads.serverErrorBitrate' => 'Server error: file may exceed the remote bitrate limit', 'downloads.episodesQueued' => ({required Object count}) => '${count} episodes queued for download', 'downloads.downloadDeleted' => 'Download deleted', 'downloads.deleteConfirm' => ({required Object title}) => 'Delete "${title}" from this device?', + 'downloads.cancelledDownloadTitle' => 'Cancelled Download', + 'downloads.cancelledDownloadMessage' => 'This download was cancelled. What would you like to do?', + 'downloads.allEpisodesAlreadyDownloaded' => 'All episodes already downloaded', + 'downloads.resumeDownload' => 'Resume download', + 'downloads.cancelledDownload' => 'Cancelled download', + 'downloads.syncingFile' => ({required Object file, required Object status}) => '${file} (syncing ${status})', + 'downloads.downloadedFileClickToComplete' => ({required Object file}) => 'Downloaded ${file} - Click to complete', + 'downloads.partialDownloadClickToComplete' => 'Partially downloaded - Click to complete', 'downloads.deleting' => 'Deleting...', 'downloads.deletingWithProgress' => ({required Object title, required Object current, required Object total}) => 'Deleting ${title}... (${current} of ${total})', 'downloads.queuedTooltip' => 'Queued', @@ -5167,6 +5441,7 @@ extension on Translations { 'shaders.deleteShaderConfirm' => ({required Object name}) => 'Delete "${name}"?', 'companionRemote.title' => 'Companion Remote', 'companionRemote.connectedTo' => ({required Object name}) => 'Connected to ${name}', + 'companionRemote.unknownDevice' => 'Unknown Device', 'companionRemote.session.startingServer' => 'Starting remote server...', 'companionRemote.session.failedToCreate' => 'Failed to start remote server:', 'companionRemote.session.hostAddress' => 'Host Address', @@ -5210,6 +5485,8 @@ extension on Translations { 'companionRemote.remote.tabSettings' => 'Settings', 'companionRemote.remote.previous' => 'Previous', 'companionRemote.remote.playPause' => 'Play/Pause', + _ => null, + } ?? switch (path) { 'companionRemote.remote.next' => 'Next', 'companionRemote.remote.seekBack' => 'Seek Back', 'companionRemote.remote.stop' => 'Stop', @@ -5221,6 +5498,12 @@ extension on Translations { 'companionRemote.remote.subtitles' => 'Subtitles', 'companionRemote.remote.audio' => 'Audio', 'companionRemote.remote.searchHint' => 'Search on desktop...', + 'companionRemote.errors.noNetworkInterface' => 'No network interface found', + 'companionRemote.errors.authenticationFailed' => 'Authentication failed', + 'companionRemote.errors.joinTimedOut' => 'Timed out joining session', + 'companionRemote.errors.failedToConnectAnyAddress' => 'Failed to connect to any address', + 'companionRemote.errors.connectionLostAfterAttempts' => ({required Object attempts}) => 'Connection lost after ${attempts} attempts', + 'companionRemote.errors.connectionLost' => 'Connection lost', 'videoSettings.playbackSpeed' => 'Playback Speed', 'videoSettings.zoom' => 'Zoom', 'videoSettings.sleepTimer' => 'Sleep Timer', @@ -5231,6 +5514,40 @@ extension on Translations { 'videoSettings.performanceOverlay' => 'Performance Overlay', 'videoSettings.audioPassthrough' => 'Audio Passthrough', 'videoSettings.audioNormalization' => 'Normalize Loudness', + 'performanceOverlay.color' => 'Color', + 'performanceOverlay.performance' => 'Performance', + 'performanceOverlay.buffer' => 'Buffer', + 'performanceOverlay.app' => 'App', + 'performanceOverlay.decoder' => 'Decoder', + 'performanceOverlay.rawDecoder' => 'Raw Decoder', + 'performanceOverlay.tunneling' => 'Tunneling', + 'performanceOverlay.aspect' => 'Aspect', + 'performanceOverlay.rotation' => 'Rotation', + 'performanceOverlay.dvSource' => 'DV Source', + 'performanceOverlay.dvPath' => 'DV Path', + 'performanceOverlay.p7Conversion' => 'P7 Conv', + 'performanceOverlay.sampleRate' => 'Sample Rate', + 'performanceOverlay.pixelFormat' => 'Pixel Fmt', + 'performanceOverlay.hwFormat' => 'HW Fmt', + 'performanceOverlay.matrix' => 'Matrix', + 'performanceOverlay.primaries' => 'Primaries', + 'performanceOverlay.transfer' => 'Transfer', + 'performanceOverlay.renderFps' => 'Render FPS', + 'performanceOverlay.displayFps' => 'Display FPS', + 'performanceOverlay.avSync' => 'A/V Sync', + 'performanceOverlay.dropped' => 'Dropped', + 'performanceOverlay.dvRpus' => 'DV RPUs', + 'performanceOverlay.dvRpuAverage' => 'DV RPU Avg', + 'performanceOverlay.dvSampleAverage' => 'DV Sample Avg', + 'performanceOverlay.maxLuma' => 'Max Luma', + 'performanceOverlay.minLuma' => 'Min Luma', + 'performanceOverlay.maxCll' => 'MaxCLL', + 'performanceOverlay.maxFall' => 'MaxFALL', + 'performanceOverlay.cacheUsed' => 'Cache Used', + 'performanceOverlay.speed' => 'Speed', + 'performanceOverlay.player' => 'Player', + 'performanceOverlay.memory' => 'Memory', + 'performanceOverlay.uiFps' => 'UI FPS', 'externalPlayer.title' => 'External Player', 'externalPlayer.useExternalPlayer' => 'Use External Player', 'externalPlayer.useExternalPlayerDescription' => 'Open videos in another app', @@ -5239,12 +5556,11 @@ extension on Translations { 'externalPlayer.systemDefault' => 'System Default', 'externalPlayer.addCustomPlayer' => 'Add Custom Player', 'externalPlayer.playerName' => 'Player Name', + 'externalPlayer.playerNameHint' => 'My Player', 'externalPlayer.playerCommand' => 'Command', 'externalPlayer.playerPackage' => 'Package Name', 'externalPlayer.playerUrlScheme' => 'URL Scheme', 'externalPlayer.off' => 'Off', - _ => null, - } ?? switch (path) { 'externalPlayer.launchFailed' => 'Failed to open external player', 'externalPlayer.appNotInstalled' => ({required Object name}) => '${name} is not installed', 'externalPlayer.playInExternalPlayer' => 'Play in External Player', diff --git a/lib/i18n/strings_es.g.dart b/lib/i18n/strings_es.g.dart index 3d518cb4..018a7ff5 100644 --- a/lib/i18n/strings_es.g.dart +++ b/lib/i18n/strings_es.g.dart @@ -77,6 +77,7 @@ class TranslationsEs extends Translations with BaseTranslations 'Ajustes'; @override String get mute => 'Silencio'; @override String get ok => 'OK'; + @override String get off => 'Desactivado'; + @override String seasonNumber({required Object number}) => 'Temporada ${number}'; + @override String chapterNumber({required Object number}) => 'Capítulo ${number}'; @override String get reconnect => 'Reconectar'; @override String get exit => 'Salir'; @override String get viewAll => 'Ver todo'; @@ -385,6 +389,10 @@ class _TranslationsSettingsEs extends TranslationsSettingsEn { @override String get dvConversionNative => 'Nativo / desactivado'; @override String get dvConversionDv81 => 'P7 → P8.1'; @override String get dvConversionHevcStrip => 'P7 → HEVC'; + @override String get dvConversionAutoDescription => 'Usar detección de capacidades del dispositivo y el comportamiento de respaldo normal'; + @override String get dvConversionNativeDescription => 'Forzar DV7 nativo y suprimir el reintento de conversión DV'; + @override String get dvConversionDv81Description => 'Forzar conversión RPU en línea a Dolby Vision perfil 8.1'; + @override String get dvConversionHevcStripDescription => 'Quitar capas RPU/EL de Dolby Vision y presentar HEVC normal'; @override String get requireProfileSelectionOnOpen => 'Pedir perfil al abrir la app'; @override String get requireProfileSelectionOnOpenDescription => 'Mostrar selección de perfil cada vez que se abre la aplicación'; @override String get forceTvMode => 'Forzar modo TV'; @@ -432,6 +440,8 @@ class _TranslationsHotkeysEs extends TranslationsHotkeysEn { // Translations @override String setShortcutFor({required Object actionName}) => 'Establecer atajo para ${actionName}'; @override String get clearShortcut => 'Borrar atajo'; + @override String get noShortcutSet => 'Sin atajo asignado'; + @override String get currentShortcut => 'Atajo actual:'; @override late final _TranslationsHotkeysActionsEs actions = _TranslationsHotkeysActionsEs._(_root); } @@ -482,6 +492,7 @@ class _TranslationsMediaMenuEs extends TranslationsMediaMenuEn { @override String get goToSeries => 'Ir a la serie'; @override String get goToSeason => 'Ir a la temporada'; @override String get shufflePlay => 'Reproducción Aleatoria'; + @override String get shuffleNotAvailableOffline => 'La reproducción aleatoria no está disponible sin conexión'; @override String get fileInfo => 'Información del Archivo'; @override String get deleteFromServer => 'Eliminar del servidor'; @override String get confirmDelete => '¿Eliminar este medio y sus archivos de tu servidor?'; @@ -620,6 +631,10 @@ class _TranslationsVideoControlsEs extends TranslationsVideoControlsEn { @override String get searchSubtitles => 'Buscar subtítulos'; @override String get language => 'Idioma'; @override String get noSubtitlesFound => 'No se encontraron subtítulos'; + @override String get downloadedSubtitle => 'Descargado'; + @override String get noSubtitlesAvailable => 'No hay subtítulos disponibles'; + @override String get noAudioTracksAvailable => 'No hay pistas de audio disponibles'; + @override String get noTracksAvailable => 'No hay pistas disponibles'; @override String get subtitleDownloaded => 'Subtítulo descargado'; @override String get subtitleDownloadFailed => 'Error al descargar subtítulo'; @override String get searchLanguages => 'Buscar idiomas...'; @@ -808,6 +823,7 @@ class _TranslationsProfilesEs extends TranslationsProfilesEn { @override String get pinExplain => 'Se requiere PIN de 4 dígitos para cambiar de perfil.'; @override String get continueButton => 'Continuar'; @override String get pinsDontMatch => 'Los PIN no coinciden'; + @override String get initializeServicesFailed => 'No se pudieron inicializar los servicios de perfil'; } // Path: connections @@ -854,6 +870,7 @@ class _TranslationsDiscoverEs extends TranslationsDiscoverEn { @override String get movie => 'Película'; @override String get tvShow => 'Serie de TV'; @override String minutesLeft({required Object minutes}) => 'quedan ${minutes} min'; + @override String get moreLikeThis => 'Más como esto'; } // Path: errors @@ -886,6 +903,7 @@ class _TranslationsLibrariesEs extends TranslationsLibrariesEn { // Translations @override String get title => 'Bibliotecas'; + @override String get fallbackTitle => 'Biblioteca'; @override String get scanLibraryFiles => 'Escanear Archivos de la Biblioteca'; @override String get scanLibrary => 'Escanear Biblioteca'; @override String get analyze => 'Analizar'; @@ -1018,6 +1036,12 @@ class _TranslationsLiveTvEs extends TranslationsLiveTvEn { @override String get noChannels => 'No hay canales disponibles'; @override String get noDvr => 'No hay DVR configurado en ningún servidor'; @override String get noPrograms => 'No hay datos de programación disponibles'; + @override String get liveStreamFailed => 'Falló la transmisión en vivo'; + @override String get unknownProgram => 'Programa desconocido'; + @override String get unknownHub => 'Desconocido'; + @override String get unknownError => 'Error desconocido'; + @override String channelNumber({required Object number}) => 'Canal ${number}'; + @override String get unknownChannel => 'Canal desconocido'; @override String get live => 'EN VIVO'; @override String get reloadGuide => 'Recargar guía'; @override String get now => 'Ahora'; @@ -1224,12 +1248,21 @@ class _TranslationsDownloadsEs extends TranslationsDownloadsEn { @override String get deleteDownload => 'Eliminar descarga'; @override String get retryDownload => 'Reintentar descarga'; @override String get downloadQueued => 'Descarga en cola'; + @override String get downloadResumed => 'Descarga reanudada'; @override String get serverErrorBitrate => 'Error del servidor: el archivo puede superar el límite de bitrate remoto'; @override String episodesQueued({required Object count}) => '${count} episodios en cola para descargar'; @override String get downloadDeleted => 'Descarga eliminada'; @override String deleteConfirm({required Object title}) => '¿Eliminar "${title}" de este dispositivo?'; - @override String deletingWithProgress({required Object title, required Object current, required Object total}) => 'Eliminando ${title}... (${current} de ${total})'; + @override String get cancelledDownloadTitle => 'Descarga cancelada'; + @override String get cancelledDownloadMessage => 'Esta descarga se canceló. ¿Qué quieres hacer?'; + @override String get allEpisodesAlreadyDownloaded => 'Todos los episodios ya están descargados'; + @override String get resumeDownload => 'Reanudar descarga'; + @override String get cancelledDownload => 'Descarga cancelada'; + @override String syncingFile({required Object file, required Object status}) => '${file} (sincronizando ${status})'; + @override String downloadedFileClickToComplete({required Object file}) => '${file} descargado — haz clic para completar'; + @override String get partialDownloadClickToComplete => 'Descarga parcial — haz clic para completar'; @override String get deleting => 'Eliminando...'; + @override String deletingWithProgress({required Object title, required Object current, required Object total}) => 'Eliminando ${title}... (${current} de ${total})'; @override String get queuedTooltip => 'En cola'; @override String queuedFilesTooltip({required Object files}) => 'En cola: ${files}'; @override String get downloadingTooltip => 'Descargando...'; @@ -1304,9 +1337,11 @@ class _TranslationsCompanionRemoteEs extends TranslationsCompanionRemoteEn { // Translations @override String get title => 'Control remoto'; @override String connectedTo({required Object name}) => 'Conectado a ${name}'; + @override String get unknownDevice => 'Dispositivo desconocido'; @override late final _TranslationsCompanionRemoteSessionEs session = _TranslationsCompanionRemoteSessionEs._(_root); @override late final _TranslationsCompanionRemotePairingEs pairing = _TranslationsCompanionRemotePairingEs._(_root); @override late final _TranslationsCompanionRemoteRemoteEs remote = _TranslationsCompanionRemoteRemoteEs._(_root); + @override late final _TranslationsCompanionRemoteErrorsEs errors = _TranslationsCompanionRemoteErrorsEs._(_root); } // Path: videoSettings @@ -1328,6 +1363,49 @@ class _TranslationsVideoSettingsEs extends TranslationsVideoSettingsEn { @override String get audioNormalization => 'Normalizar volumen'; } +// Path: performanceOverlay +class _TranslationsPerformanceOverlayEs extends TranslationsPerformanceOverlayEn { + _TranslationsPerformanceOverlayEs._(TranslationsEs root) : this._root = root, super.internal(root); + + final TranslationsEs _root; // ignore: unused_field + + // Translations + @override String get color => 'Color'; + @override String get performance => 'Rendimiento'; + @override String get buffer => 'Búfer'; + @override String get app => 'App'; + @override String get decoder => 'Decodificador'; + @override String get rawDecoder => 'Decodificador raw'; + @override String get tunneling => 'Túnel'; + @override String get aspect => 'Aspecto'; + @override String get rotation => 'Rotación'; + @override String get dvSource => 'Origen DV'; + @override String get dvPath => 'Ruta DV'; + @override String get p7Conversion => 'Conv. P7'; + @override String get sampleRate => 'Frecuencia de muestreo'; + @override String get pixelFormat => 'Formato de píxel'; + @override String get hwFormat => 'Formato HW'; + @override String get matrix => 'Matriz'; + @override String get primaries => 'Primarios'; + @override String get transfer => 'Transferencia'; + @override String get renderFps => 'FPS render'; + @override String get displayFps => 'FPS pantalla'; + @override String get avSync => 'Sincronía A/V'; + @override String get dropped => 'Descartados'; + @override String get dvRpus => 'DV RPUs'; + @override String get dvRpuAverage => 'Prom. DV RPU'; + @override String get dvSampleAverage => 'Prom. muestra DV'; + @override String get maxLuma => 'Luma máx.'; + @override String get minLuma => 'Luma mín.'; + @override String get maxCll => 'MaxCLL'; + @override String get maxFall => 'MaxFALL'; + @override String get cacheUsed => 'Caché usada'; + @override String get speed => 'Velocidad'; + @override String get player => 'Reproductor'; + @override String get memory => 'Memoria'; + @override String get uiFps => 'FPS UI'; +} + // Path: externalPlayer class _TranslationsExternalPlayerEs extends TranslationsExternalPlayerEn { _TranslationsExternalPlayerEs._(TranslationsEs root) : this._root = root, super.internal(root); @@ -1343,6 +1421,7 @@ class _TranslationsExternalPlayerEs extends TranslationsExternalPlayerEn { @override String get systemDefault => 'Predeterminado del sistema'; @override String get addCustomPlayer => 'Añadir reproductor personalizado'; @override String get playerName => 'Nombre del reproductor'; + @override String get playerNameHint => 'Mi reproductor'; @override String get playerCommand => 'Comando'; @override String get playerPackage => 'Nombre del paquete'; @override String get playerUrlScheme => 'Esquema URL'; @@ -1755,6 +1834,21 @@ class _TranslationsCompanionRemoteRemoteEs extends TranslationsCompanionRemoteRe @override String get searchHint => 'Buscar en escritorio...'; } +// Path: companionRemote.errors +class _TranslationsCompanionRemoteErrorsEs extends TranslationsCompanionRemoteErrorsEn { + _TranslationsCompanionRemoteErrorsEs._(TranslationsEs root) : this._root = root, super.internal(root); + + final TranslationsEs _root; // ignore: unused_field + + // Translations + @override String get noNetworkInterface => 'No se encontró ninguna interfaz de red'; + @override String get authenticationFailed => 'Autenticación fallida'; + @override String get joinTimedOut => 'Se agotó el tiempo al unirse a la sesión'; + @override String get failedToConnectAnyAddress => 'No se pudo conectar a ninguna dirección'; + @override String connectionLostAfterAttempts({required Object attempts}) => 'Conexión perdida tras ${attempts} intentos'; + @override String get connectionLost => 'Conexión perdida'; +} + // Path: trackers.services class _TranslationsTrackersServicesEs extends TranslationsTrackersServicesEn { _TranslationsTrackersServicesEs._(TranslationsEs root) : this._root = root, super.internal(root); @@ -1871,6 +1965,9 @@ extension on TranslationsEs { 'common.settings' => 'Ajustes', 'common.mute' => 'Silencio', 'common.ok' => 'OK', + 'common.off' => 'Desactivado', + 'common.seasonNumber' => ({required Object number}) => 'Temporada ${number}', + 'common.chapterNumber' => ({required Object number}) => 'Capítulo ${number}', 'common.reconnect' => 'Reconectar', 'common.exit' => 'Salir', 'common.viewAll' => 'Ver todo', @@ -2070,6 +2167,10 @@ extension on TranslationsEs { 'settings.dvConversionNative' => 'Nativo / desactivado', 'settings.dvConversionDv81' => 'P7 → P8.1', 'settings.dvConversionHevcStrip' => 'P7 → HEVC', + 'settings.dvConversionAutoDescription' => 'Usar detección de capacidades del dispositivo y el comportamiento de respaldo normal', + 'settings.dvConversionNativeDescription' => 'Forzar DV7 nativo y suprimir el reintento de conversión DV', + 'settings.dvConversionDv81Description' => 'Forzar conversión RPU en línea a Dolby Vision perfil 8.1', + 'settings.dvConversionHevcStripDescription' => 'Quitar capas RPU/EL de Dolby Vision y presentar HEVC normal', 'settings.requireProfileSelectionOnOpen' => 'Pedir perfil al abrir la app', 'settings.requireProfileSelectionOnOpenDescription' => 'Mostrar selección de perfil cada vez que se abre la aplicación', 'settings.forceTvMode' => 'Forzar modo TV', @@ -2099,6 +2200,8 @@ extension on TranslationsEs { 'search.enterTitleActorOrKeyword' => 'Introduce un título, actor o palabra clave', 'hotkeys.setShortcutFor' => ({required Object actionName}) => 'Establecer atajo para ${actionName}', 'hotkeys.clearShortcut' => 'Borrar atajo', + 'hotkeys.noShortcutSet' => 'Sin atajo asignado', + 'hotkeys.currentShortcut' => 'Atajo actual:', 'hotkeys.actions.playPause' => 'Reproducir/Pausar', 'hotkeys.actions.volumeUp' => 'Subir Volumen', 'hotkeys.actions.volumeDown' => 'Bajar Volumen', @@ -2155,6 +2258,7 @@ extension on TranslationsEs { 'mediaMenu.goToSeries' => 'Ir a la serie', 'mediaMenu.goToSeason' => 'Ir a la temporada', 'mediaMenu.shufflePlay' => 'Reproducción Aleatoria', + 'mediaMenu.shuffleNotAvailableOffline' => 'La reproducción aleatoria no está disponible sin conexión', 'mediaMenu.fileInfo' => 'Información del Archivo', 'mediaMenu.deleteFromServer' => 'Eliminar del servidor', 'mediaMenu.confirmDelete' => '¿Eliminar este medio y sus archivos de tu servidor?', @@ -2263,6 +2367,10 @@ extension on TranslationsEs { 'videoControls.searchSubtitles' => 'Buscar subtítulos', 'videoControls.language' => 'Idioma', 'videoControls.noSubtitlesFound' => 'No se encontraron subtítulos', + 'videoControls.downloadedSubtitle' => 'Descargado', + 'videoControls.noSubtitlesAvailable' => 'No hay subtítulos disponibles', + 'videoControls.noAudioTracksAvailable' => 'No hay pistas de audio disponibles', + 'videoControls.noTracksAvailable' => 'No hay pistas disponibles', 'videoControls.subtitleDownloaded' => 'Subtítulo descargado', 'videoControls.subtitleDownloadFailed' => 'Error al descargar subtítulo', 'videoControls.searchLanguages' => 'Buscar idiomas...', @@ -2321,6 +2429,8 @@ extension on TranslationsEs { 'subtitlingStyling.borderColor' => 'Color de Borde', 'subtitlingStyling.backgroundOpacity' => 'Opacidad de Fondo', 'subtitlingStyling.backgroundColor' => 'Color de Fondo', + _ => null, + } ?? switch (path) { 'subtitlingStyling.position' => 'Posición', 'subtitlingStyling.assOverride' => 'Sobreescritura ASS', 'subtitlingStyling.bold' => 'Negrita', @@ -2335,8 +2445,6 @@ extension on TranslationsEs { 'mpvConfig.loadPreset' => 'Cargar', 'mpvConfig.deletePreset' => 'Eliminar', 'mpvConfig.presetSaved' => 'Ajuste guardado', - _ => null, - } ?? switch (path) { 'mpvConfig.presetLoaded' => 'Ajuste cargado', 'mpvConfig.presetDeleted' => 'Ajuste eliminado', 'mpvConfig.confirmDeletePreset' => '¿Estás seguro de que quieres eliminar este ajuste?', @@ -2399,6 +2507,7 @@ extension on TranslationsEs { 'profiles.pinExplain' => 'Se requiere PIN de 4 dígitos para cambiar de perfil.', 'profiles.continueButton' => 'Continuar', 'profiles.pinsDontMatch' => 'Los PIN no coinciden', + 'profiles.initializeServicesFailed' => 'No se pudieron inicializar los servicios de perfil', 'connections.sectionTitle' => 'Conexiones', 'connections.addConnection' => 'Añadir conexión', 'connections.addConnectionSubtitleNoProfile' => 'Inicia sesión con Plex o conecta un servidor de Jellyfin', @@ -2427,6 +2536,7 @@ extension on TranslationsEs { 'discover.movie' => 'Película', 'discover.tvShow' => 'Serie de TV', 'discover.minutesLeft' => ({required Object minutes}) => 'quedan ${minutes} min', + 'discover.moreLikeThis' => 'Más como esto', 'errors.searchFailed' => ({required Object error}) => 'Error en la búsqueda: ${error}', 'errors.connectionTimeout' => ({required Object context}) => 'Tiempo de conexión agotado al cargar ${context}', 'errors.connectionFailed' => 'No se puede conectar al servidor multimedia', @@ -2441,6 +2551,7 @@ extension on TranslationsEs { 'errors.failedToDeleteProfile' => ({required Object displayName}) => 'Error al eliminar ${displayName}', 'errors.failedToRate' => 'No se pudo actualizar la calificación', 'libraries.title' => 'Bibliotecas', + 'libraries.fallbackTitle' => 'Biblioteca', 'libraries.scanLibraryFiles' => 'Escanear Archivos de la Biblioteca', 'libraries.scanLibrary' => 'Escanear Biblioteca', 'libraries.analyze' => 'Analizar', @@ -2541,6 +2652,12 @@ extension on TranslationsEs { 'liveTv.noChannels' => 'No hay canales disponibles', 'liveTv.noDvr' => 'No hay DVR configurado en ningún servidor', 'liveTv.noPrograms' => 'No hay datos de programación disponibles', + 'liveTv.liveStreamFailed' => 'Falló la transmisión en vivo', + 'liveTv.unknownProgram' => 'Programa desconocido', + 'liveTv.unknownHub' => 'Desconocido', + 'liveTv.unknownError' => 'Error desconocido', + 'liveTv.channelNumber' => ({required Object number}) => 'Canal ${number}', + 'liveTv.unknownChannel' => 'Canal desconocido', 'liveTv.live' => 'EN VIVO', 'liveTv.reloadGuide' => 'Recargar guía', 'liveTv.now' => 'Ahora', @@ -2711,12 +2828,21 @@ extension on TranslationsEs { 'downloads.deleteDownload' => 'Eliminar descarga', 'downloads.retryDownload' => 'Reintentar descarga', 'downloads.downloadQueued' => 'Descarga en cola', + 'downloads.downloadResumed' => 'Descarga reanudada', 'downloads.serverErrorBitrate' => 'Error del servidor: el archivo puede superar el límite de bitrate remoto', 'downloads.episodesQueued' => ({required Object count}) => '${count} episodios en cola para descargar', 'downloads.downloadDeleted' => 'Descarga eliminada', 'downloads.deleteConfirm' => ({required Object title}) => '¿Eliminar "${title}" de este dispositivo?', - 'downloads.deletingWithProgress' => ({required Object title, required Object current, required Object total}) => 'Eliminando ${title}... (${current} de ${total})', + 'downloads.cancelledDownloadTitle' => 'Descarga cancelada', + 'downloads.cancelledDownloadMessage' => 'Esta descarga se canceló. ¿Qué quieres hacer?', + 'downloads.allEpisodesAlreadyDownloaded' => 'Todos los episodios ya están descargados', + 'downloads.resumeDownload' => 'Reanudar descarga', + 'downloads.cancelledDownload' => 'Descarga cancelada', + 'downloads.syncingFile' => ({required Object file, required Object status}) => '${file} (sincronizando ${status})', + 'downloads.downloadedFileClickToComplete' => ({required Object file}) => '${file} descargado — haz clic para completar', + 'downloads.partialDownloadClickToComplete' => 'Descarga parcial — haz clic para completar', 'downloads.deleting' => 'Eliminando...', + 'downloads.deletingWithProgress' => ({required Object title, required Object current, required Object total}) => 'Eliminando ${title}... (${current} de ${total})', 'downloads.queuedTooltip' => 'En cola', 'downloads.queuedFilesTooltip' => ({required Object files}) => 'En cola: ${files}', 'downloads.downloadingTooltip' => 'Descargando...', @@ -2773,6 +2899,7 @@ extension on TranslationsEs { 'shaders.deleteShaderConfirm' => ({required Object name}) => '¿Eliminar "${name}"?', 'companionRemote.title' => 'Control remoto', 'companionRemote.connectedTo' => ({required Object name}) => 'Conectado a ${name}', + 'companionRemote.unknownDevice' => 'Dispositivo desconocido', 'companionRemote.session.startingServer' => 'Iniciando servidor remoto...', 'companionRemote.session.failedToCreate' => 'Error al iniciar el servidor remoto:', 'companionRemote.session.hostAddress' => 'Dirección del host', @@ -2816,6 +2943,8 @@ extension on TranslationsEs { 'companionRemote.remote.tabSettings' => 'Configuración', 'companionRemote.remote.previous' => 'Anterior', 'companionRemote.remote.playPause' => 'Reproducir/Pausar', + _ => null, + } ?? switch (path) { 'companionRemote.remote.next' => 'Siguiente', 'companionRemote.remote.seekBack' => 'Retroceder', 'companionRemote.remote.stop' => 'Detener', @@ -2827,6 +2956,12 @@ extension on TranslationsEs { 'companionRemote.remote.subtitles' => 'Subtítulos', 'companionRemote.remote.audio' => 'Audio', 'companionRemote.remote.searchHint' => 'Buscar en escritorio...', + 'companionRemote.errors.noNetworkInterface' => 'No se encontró ninguna interfaz de red', + 'companionRemote.errors.authenticationFailed' => 'Autenticación fallida', + 'companionRemote.errors.joinTimedOut' => 'Se agotó el tiempo al unirse a la sesión', + 'companionRemote.errors.failedToConnectAnyAddress' => 'No se pudo conectar a ninguna dirección', + 'companionRemote.errors.connectionLostAfterAttempts' => ({required Object attempts}) => 'Conexión perdida tras ${attempts} intentos', + 'companionRemote.errors.connectionLost' => 'Conexión perdida', 'videoSettings.playbackSpeed' => 'Velocidad de reproducción', 'videoSettings.zoom' => 'Zoom', 'videoSettings.sleepTimer' => 'Temporizador de apagado', @@ -2837,6 +2972,40 @@ extension on TranslationsEs { 'videoSettings.performanceOverlay' => 'Indicador de rendimiento', 'videoSettings.audioPassthrough' => 'Audio Passthrough', 'videoSettings.audioNormalization' => 'Normalizar volumen', + 'performanceOverlay.color' => 'Color', + 'performanceOverlay.performance' => 'Rendimiento', + 'performanceOverlay.buffer' => 'Búfer', + 'performanceOverlay.app' => 'App', + 'performanceOverlay.decoder' => 'Decodificador', + 'performanceOverlay.rawDecoder' => 'Decodificador raw', + 'performanceOverlay.tunneling' => 'Túnel', + 'performanceOverlay.aspect' => 'Aspecto', + 'performanceOverlay.rotation' => 'Rotación', + 'performanceOverlay.dvSource' => 'Origen DV', + 'performanceOverlay.dvPath' => 'Ruta DV', + 'performanceOverlay.p7Conversion' => 'Conv. P7', + 'performanceOverlay.sampleRate' => 'Frecuencia de muestreo', + 'performanceOverlay.pixelFormat' => 'Formato de píxel', + 'performanceOverlay.hwFormat' => 'Formato HW', + 'performanceOverlay.matrix' => 'Matriz', + 'performanceOverlay.primaries' => 'Primarios', + 'performanceOverlay.transfer' => 'Transferencia', + 'performanceOverlay.renderFps' => 'FPS render', + 'performanceOverlay.displayFps' => 'FPS pantalla', + 'performanceOverlay.avSync' => 'Sincronía A/V', + 'performanceOverlay.dropped' => 'Descartados', + 'performanceOverlay.dvRpus' => 'DV RPUs', + 'performanceOverlay.dvRpuAverage' => 'Prom. DV RPU', + 'performanceOverlay.dvSampleAverage' => 'Prom. muestra DV', + 'performanceOverlay.maxLuma' => 'Luma máx.', + 'performanceOverlay.minLuma' => 'Luma mín.', + 'performanceOverlay.maxCll' => 'MaxCLL', + 'performanceOverlay.maxFall' => 'MaxFALL', + 'performanceOverlay.cacheUsed' => 'Caché usada', + 'performanceOverlay.speed' => 'Velocidad', + 'performanceOverlay.player' => 'Reproductor', + 'performanceOverlay.memory' => 'Memoria', + 'performanceOverlay.uiFps' => 'FPS UI', 'externalPlayer.title' => 'Reproductor externo', 'externalPlayer.useExternalPlayer' => 'Usar reproductor externo', 'externalPlayer.useExternalPlayerDescription' => 'Abrir videos en otra app', @@ -2845,12 +3014,11 @@ extension on TranslationsEs { 'externalPlayer.systemDefault' => 'Predeterminado del sistema', 'externalPlayer.addCustomPlayer' => 'Añadir reproductor personalizado', 'externalPlayer.playerName' => 'Nombre del reproductor', + 'externalPlayer.playerNameHint' => 'Mi reproductor', 'externalPlayer.playerCommand' => 'Comando', 'externalPlayer.playerPackage' => 'Nombre del paquete', 'externalPlayer.playerUrlScheme' => 'Esquema URL', 'externalPlayer.off' => 'Desactivado', - _ => null, - } ?? switch (path) { 'externalPlayer.launchFailed' => 'No se pudo abrir el reproductor externo', 'externalPlayer.appNotInstalled' => ({required Object name}) => '${name} no está instalado', 'externalPlayer.playInExternalPlayer' => 'Reproducir en reproductor externo', diff --git a/lib/i18n/strings_fr.g.dart b/lib/i18n/strings_fr.g.dart index 102298a4..39388800 100644 --- a/lib/i18n/strings_fr.g.dart +++ b/lib/i18n/strings_fr.g.dart @@ -77,6 +77,7 @@ class TranslationsFr extends Translations with BaseTranslations 'Réglages'; @override String get mute => 'Muet'; @override String get ok => 'OK'; + @override String get off => 'Désactivé'; + @override String seasonNumber({required Object number}) => 'Saison ${number}'; + @override String chapterNumber({required Object number}) => 'Chapitre ${number}'; @override String get reconnect => 'Reconnecter'; @override String get exit => 'Quitter'; @override String get viewAll => 'Tout afficher'; @@ -385,6 +389,10 @@ class _TranslationsSettingsFr extends TranslationsSettingsEn { @override String get dvConversionNative => 'Natif / désactivé'; @override String get dvConversionDv81 => 'P7 → P8.1'; @override String get dvConversionHevcStrip => 'P7 → HEVC'; + @override String get dvConversionAutoDescription => 'Utiliser la détection des capacités de l’appareil et le comportement de repli normal'; + @override String get dvConversionNativeDescription => 'Forcer le DV7 natif et bloquer la nouvelle tentative de conversion DV'; + @override String get dvConversionDv81Description => 'Forcer la conversion RPU intégrée vers Dolby Vision profil 8.1'; + @override String get dvConversionHevcStripDescription => 'Supprimer les couches RPU/EL Dolby Vision et présenter du HEVC simple'; @override String get requireProfileSelectionOnOpen => 'Demander le profil à l\'ouverture'; @override String get requireProfileSelectionOnOpenDescription => 'Afficher la sélection de profil à chaque ouverture de l\'application'; @override String get forceTvMode => 'Forcer le mode TV'; @@ -432,6 +440,8 @@ class _TranslationsHotkeysFr extends TranslationsHotkeysEn { // Translations @override String setShortcutFor({required Object actionName}) => 'Définir un raccourci pour ${actionName}'; @override String get clearShortcut => 'Effacer le raccourci'; + @override String get noShortcutSet => 'Aucun raccourci défini'; + @override String get currentShortcut => 'Raccourci actuel :'; @override late final _TranslationsHotkeysActionsFr actions = _TranslationsHotkeysActionsFr._(_root); } @@ -482,6 +492,7 @@ class _TranslationsMediaMenuFr extends TranslationsMediaMenuEn { @override String get goToSeries => 'Aller à la série'; @override String get goToSeason => 'Aller à la saison'; @override String get shufflePlay => 'Lecture aléatoire'; + @override String get shuffleNotAvailableOffline => 'La lecture aléatoire n’est pas disponible hors ligne'; @override String get fileInfo => 'Informations sur le fichier'; @override String get deleteFromServer => 'Supprimer du serveur'; @override String get confirmDelete => 'Supprimer ce média et ses fichiers de votre serveur ?'; @@ -620,6 +631,10 @@ class _TranslationsVideoControlsFr extends TranslationsVideoControlsEn { @override String get searchSubtitles => 'Rechercher des sous-titres'; @override String get language => 'Langue'; @override String get noSubtitlesFound => 'Aucun sous-titre trouvé'; + @override String get downloadedSubtitle => 'Téléchargé'; + @override String get noSubtitlesAvailable => 'Aucun sous-titre disponible'; + @override String get noAudioTracksAvailable => 'Aucune piste audio disponible'; + @override String get noTracksAvailable => 'Aucune piste disponible'; @override String get subtitleDownloaded => 'Sous-titre téléchargé'; @override String get subtitleDownloadFailed => 'Échec du téléchargement du sous-titre'; @override String get searchLanguages => 'Rechercher des langues...'; @@ -808,6 +823,7 @@ class _TranslationsProfilesFr extends TranslationsProfilesEn { @override String get pinExplain => 'PIN à 4 chiffres requis pour changer de profil.'; @override String get continueButton => 'Continuer'; @override String get pinsDontMatch => 'Les PIN ne correspondent pas'; + @override String get initializeServicesFailed => 'Impossible d’initialiser les services de profil'; } // Path: connections @@ -854,6 +870,7 @@ class _TranslationsDiscoverFr extends TranslationsDiscoverEn { @override String get movie => 'Film'; @override String get tvShow => 'Show TV'; @override String minutesLeft({required Object minutes}) => '${minutes} min restantes'; + @override String get moreLikeThis => 'Plus de contenus similaires'; } // Path: errors @@ -886,6 +903,7 @@ class _TranslationsLibrariesFr extends TranslationsLibrariesEn { // Translations @override String get title => 'Bibliothèques'; + @override String get fallbackTitle => 'Bibliothèque'; @override String get scanLibraryFiles => 'Scanner les fichiers de la bibliothèque'; @override String get scanLibrary => 'Scanner la bibliothèque'; @override String get analyze => 'Analyser'; @@ -1018,6 +1036,12 @@ class _TranslationsLiveTvFr extends TranslationsLiveTvEn { @override String get noChannels => 'Aucune chaîne disponible'; @override String get noDvr => 'Aucun DVR configuré sur les serveurs'; @override String get noPrograms => 'Aucune donnée de programme disponible'; + @override String get liveStreamFailed => 'Échec du direct'; + @override String get unknownProgram => 'Programme inconnu'; + @override String get unknownHub => 'Inconnu'; + @override String get unknownError => 'Erreur inconnue'; + @override String channelNumber({required Object number}) => 'Chaîne ${number}'; + @override String get unknownChannel => 'Chaîne inconnue'; @override String get live => 'EN DIRECT'; @override String get reloadGuide => 'Recharger le guide'; @override String get now => 'Maintenant'; @@ -1224,12 +1248,21 @@ class _TranslationsDownloadsFr extends TranslationsDownloadsEn { @override String get deleteDownload => 'Supprimer le téléchargement'; @override String get retryDownload => 'Réessayer le téléchargement'; @override String get downloadQueued => 'Téléchargement en attente'; + @override String get downloadResumed => 'Téléchargement repris'; @override String get serverErrorBitrate => 'Erreur serveur : le fichier peut dépasser la limite de bitrate distant'; @override String episodesQueued({required Object count}) => '${count} épisodes en attente de téléchargement'; @override String get downloadDeleted => 'Télécharger supprimé'; @override String deleteConfirm({required Object title}) => 'Supprimer "${title}" de cet appareil ?'; - @override String deletingWithProgress({required Object title, required Object current, required Object total}) => 'Suppression de ${title}... (${current} sur ${total})'; + @override String get cancelledDownloadTitle => 'Téléchargement annulé'; + @override String get cancelledDownloadMessage => 'Ce téléchargement a été annulé. Que voulez-vous faire ?'; + @override String get allEpisodesAlreadyDownloaded => 'Tous les épisodes sont déjà téléchargés'; + @override String get resumeDownload => 'Reprendre le téléchargement'; + @override String get cancelledDownload => 'Téléchargement annulé'; + @override String syncingFile({required Object file, required Object status}) => '${file} (synchronisation ${status})'; + @override String downloadedFileClickToComplete({required Object file}) => '${file} téléchargé — cliquez pour terminer'; + @override String get partialDownloadClickToComplete => 'Téléchargement partiel — cliquez pour terminer'; @override String get deleting => 'Suppression...'; + @override String deletingWithProgress({required Object title, required Object current, required Object total}) => 'Suppression de ${title}... (${current} sur ${total})'; @override String get queuedTooltip => 'En attente'; @override String queuedFilesTooltip({required Object files}) => 'En attente : ${files}'; @override String get downloadingTooltip => 'Téléchargement...'; @@ -1304,9 +1337,11 @@ class _TranslationsCompanionRemoteFr extends TranslationsCompanionRemoteEn { // Translations @override String get title => 'Télécommande compagnon'; @override String connectedTo({required Object name}) => 'Connecté à ${name}'; + @override String get unknownDevice => 'Appareil inconnu'; @override late final _TranslationsCompanionRemoteSessionFr session = _TranslationsCompanionRemoteSessionFr._(_root); @override late final _TranslationsCompanionRemotePairingFr pairing = _TranslationsCompanionRemotePairingFr._(_root); @override late final _TranslationsCompanionRemoteRemoteFr remote = _TranslationsCompanionRemoteRemoteFr._(_root); + @override late final _TranslationsCompanionRemoteErrorsFr errors = _TranslationsCompanionRemoteErrorsFr._(_root); } // Path: videoSettings @@ -1328,6 +1363,49 @@ class _TranslationsVideoSettingsFr extends TranslationsVideoSettingsEn { @override String get audioNormalization => 'Normaliser le volume'; } +// Path: performanceOverlay +class _TranslationsPerformanceOverlayFr extends TranslationsPerformanceOverlayEn { + _TranslationsPerformanceOverlayFr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get color => 'Couleur'; + @override String get performance => 'Performances'; + @override String get buffer => 'Tampon'; + @override String get app => 'App'; + @override String get decoder => 'Décodeur'; + @override String get rawDecoder => 'Décodeur brut'; + @override String get tunneling => 'Tunneling'; + @override String get aspect => 'Format'; + @override String get rotation => 'Rotation'; + @override String get dvSource => 'Source DV'; + @override String get dvPath => 'Chemin DV'; + @override String get p7Conversion => 'Conv. P7'; + @override String get sampleRate => 'Fréquence'; + @override String get pixelFormat => 'Fmt pixel'; + @override String get hwFormat => 'Fmt HW'; + @override String get matrix => 'Matrice'; + @override String get primaries => 'Primaires'; + @override String get transfer => 'Transfert'; + @override String get renderFps => 'FPS rendu'; + @override String get displayFps => 'FPS écran'; + @override String get avSync => 'Synchro A/V'; + @override String get dropped => 'Perdues'; + @override String get dvRpus => 'DV RPU'; + @override String get dvRpuAverage => 'Moy. DV RPU'; + @override String get dvSampleAverage => 'Moy. échant. DV'; + @override String get maxLuma => 'Luma max.'; + @override String get minLuma => 'Luma min.'; + @override String get maxCll => 'MaxCLL'; + @override String get maxFall => 'MaxFALL'; + @override String get cacheUsed => 'Cache utilisé'; + @override String get speed => 'Vitesse'; + @override String get player => 'Lecteur'; + @override String get memory => 'Mémoire'; + @override String get uiFps => 'FPS UI'; +} + // Path: externalPlayer class _TranslationsExternalPlayerFr extends TranslationsExternalPlayerEn { _TranslationsExternalPlayerFr._(TranslationsFr root) : this._root = root, super.internal(root); @@ -1343,6 +1421,7 @@ class _TranslationsExternalPlayerFr extends TranslationsExternalPlayerEn { @override String get systemDefault => 'Par défaut du système'; @override String get addCustomPlayer => 'Ajouter un lecteur personnalisé'; @override String get playerName => 'Nom du lecteur'; + @override String get playerNameHint => 'Mon lecteur'; @override String get playerCommand => 'Commande'; @override String get playerPackage => 'Nom du paquet'; @override String get playerUrlScheme => 'Schéma URL'; @@ -1755,6 +1834,21 @@ class _TranslationsCompanionRemoteRemoteFr extends TranslationsCompanionRemoteRe @override String get searchHint => 'Rechercher sur le bureau...'; } +// Path: companionRemote.errors +class _TranslationsCompanionRemoteErrorsFr extends TranslationsCompanionRemoteErrorsEn { + _TranslationsCompanionRemoteErrorsFr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String get noNetworkInterface => 'Aucune interface réseau trouvée'; + @override String get authenticationFailed => 'Échec de l’authentification'; + @override String get joinTimedOut => 'Délai dépassé lors de la connexion à la session'; + @override String get failedToConnectAnyAddress => 'Impossible de se connecter à une adresse'; + @override String connectionLostAfterAttempts({required Object attempts}) => 'Connexion perdue après ${attempts} tentatives'; + @override String get connectionLost => 'Connexion perdue'; +} + // Path: trackers.services class _TranslationsTrackersServicesFr extends TranslationsTrackersServicesEn { _TranslationsTrackersServicesFr._(TranslationsFr root) : this._root = root, super.internal(root); @@ -1871,6 +1965,9 @@ extension on TranslationsFr { 'common.settings' => 'Réglages', 'common.mute' => 'Muet', 'common.ok' => 'OK', + 'common.off' => 'Désactivé', + 'common.seasonNumber' => ({required Object number}) => 'Saison ${number}', + 'common.chapterNumber' => ({required Object number}) => 'Chapitre ${number}', 'common.reconnect' => 'Reconnecter', 'common.exit' => 'Quitter', 'common.viewAll' => 'Tout afficher', @@ -2070,6 +2167,10 @@ extension on TranslationsFr { 'settings.dvConversionNative' => 'Natif / désactivé', 'settings.dvConversionDv81' => 'P7 → P8.1', 'settings.dvConversionHevcStrip' => 'P7 → HEVC', + 'settings.dvConversionAutoDescription' => 'Utiliser la détection des capacités de l’appareil et le comportement de repli normal', + 'settings.dvConversionNativeDescription' => 'Forcer le DV7 natif et bloquer la nouvelle tentative de conversion DV', + 'settings.dvConversionDv81Description' => 'Forcer la conversion RPU intégrée vers Dolby Vision profil 8.1', + 'settings.dvConversionHevcStripDescription' => 'Supprimer les couches RPU/EL Dolby Vision et présenter du HEVC simple', 'settings.requireProfileSelectionOnOpen' => 'Demander le profil à l\'ouverture', 'settings.requireProfileSelectionOnOpenDescription' => 'Afficher la sélection de profil à chaque ouverture de l\'application', 'settings.forceTvMode' => 'Forcer le mode TV', @@ -2099,6 +2200,8 @@ extension on TranslationsFr { 'search.enterTitleActorOrKeyword' => 'Entrez un titre, un acteur ou un mot-clé', 'hotkeys.setShortcutFor' => ({required Object actionName}) => 'Définir un raccourci pour ${actionName}', 'hotkeys.clearShortcut' => 'Effacer le raccourci', + 'hotkeys.noShortcutSet' => 'Aucun raccourci défini', + 'hotkeys.currentShortcut' => 'Raccourci actuel :', 'hotkeys.actions.playPause' => 'Lecture/Pause', 'hotkeys.actions.volumeUp' => 'Augmenter le volume', 'hotkeys.actions.volumeDown' => 'Baisser le volume', @@ -2155,6 +2258,7 @@ extension on TranslationsFr { 'mediaMenu.goToSeries' => 'Aller à la série', 'mediaMenu.goToSeason' => 'Aller à la saison', 'mediaMenu.shufflePlay' => 'Lecture aléatoire', + 'mediaMenu.shuffleNotAvailableOffline' => 'La lecture aléatoire n’est pas disponible hors ligne', 'mediaMenu.fileInfo' => 'Informations sur le fichier', 'mediaMenu.deleteFromServer' => 'Supprimer du serveur', 'mediaMenu.confirmDelete' => 'Supprimer ce média et ses fichiers de votre serveur ?', @@ -2263,6 +2367,10 @@ extension on TranslationsFr { 'videoControls.searchSubtitles' => 'Rechercher des sous-titres', 'videoControls.language' => 'Langue', 'videoControls.noSubtitlesFound' => 'Aucun sous-titre trouvé', + 'videoControls.downloadedSubtitle' => 'Téléchargé', + 'videoControls.noSubtitlesAvailable' => 'Aucun sous-titre disponible', + 'videoControls.noAudioTracksAvailable' => 'Aucune piste audio disponible', + 'videoControls.noTracksAvailable' => 'Aucune piste disponible', 'videoControls.subtitleDownloaded' => 'Sous-titre téléchargé', 'videoControls.subtitleDownloadFailed' => 'Échec du téléchargement du sous-titre', 'videoControls.searchLanguages' => 'Rechercher des langues...', @@ -2321,6 +2429,8 @@ extension on TranslationsFr { 'subtitlingStyling.borderColor' => 'Couleur de la bordure', 'subtitlingStyling.backgroundOpacity' => 'Opacité d\'arrière-plan', 'subtitlingStyling.backgroundColor' => 'Couleur d\'arrière-plan', + _ => null, + } ?? switch (path) { 'subtitlingStyling.position' => 'Position', 'subtitlingStyling.assOverride' => 'Remplacement ASS', 'subtitlingStyling.bold' => 'Gras', @@ -2335,8 +2445,6 @@ extension on TranslationsFr { 'mpvConfig.loadPreset' => 'Charger', 'mpvConfig.deletePreset' => 'Supprimer', 'mpvConfig.presetSaved' => 'Préréglage enregistré', - _ => null, - } ?? switch (path) { 'mpvConfig.presetLoaded' => 'Préréglage chargé', 'mpvConfig.presetDeleted' => 'Préréglage supprimé', 'mpvConfig.confirmDeletePreset' => 'Êtes-vous sûr de vouloir supprimer ce préréglage ?', @@ -2399,6 +2507,7 @@ extension on TranslationsFr { 'profiles.pinExplain' => 'PIN à 4 chiffres requis pour changer de profil.', 'profiles.continueButton' => 'Continuer', 'profiles.pinsDontMatch' => 'Les PIN ne correspondent pas', + 'profiles.initializeServicesFailed' => 'Impossible d’initialiser les services de profil', 'connections.sectionTitle' => 'Connexions', 'connections.addConnection' => 'Ajouter une connexion', 'connections.addConnectionSubtitleNoProfile' => 'Connectez-vous avec Plex ou connectez un serveur Jellyfin', @@ -2427,6 +2536,7 @@ extension on TranslationsFr { 'discover.movie' => 'Film', 'discover.tvShow' => 'Show TV', 'discover.minutesLeft' => ({required Object minutes}) => '${minutes} min restantes', + 'discover.moreLikeThis' => 'Plus de contenus similaires', 'errors.searchFailed' => ({required Object error}) => 'Recherche échouée: ${error}', 'errors.connectionTimeout' => ({required Object context}) => 'Délai d\'attente de connexion dépassé pendant le chargement ${context}', 'errors.connectionFailed' => 'Impossible de se connecter au serveur multimédia', @@ -2441,6 +2551,7 @@ extension on TranslationsFr { 'errors.failedToDeleteProfile' => ({required Object displayName}) => 'Impossible de supprimer ${displayName}', 'errors.failedToRate' => 'Impossible de mettre à jour la note', 'libraries.title' => 'Bibliothèques', + 'libraries.fallbackTitle' => 'Bibliothèque', 'libraries.scanLibraryFiles' => 'Scanner les fichiers de la bibliothèque', 'libraries.scanLibrary' => 'Scanner la bibliothèque', 'libraries.analyze' => 'Analyser', @@ -2541,6 +2652,12 @@ extension on TranslationsFr { 'liveTv.noChannels' => 'Aucune chaîne disponible', 'liveTv.noDvr' => 'Aucun DVR configuré sur les serveurs', 'liveTv.noPrograms' => 'Aucune donnée de programme disponible', + 'liveTv.liveStreamFailed' => 'Échec du direct', + 'liveTv.unknownProgram' => 'Programme inconnu', + 'liveTv.unknownHub' => 'Inconnu', + 'liveTv.unknownError' => 'Erreur inconnue', + 'liveTv.channelNumber' => ({required Object number}) => 'Chaîne ${number}', + 'liveTv.unknownChannel' => 'Chaîne inconnue', 'liveTv.live' => 'EN DIRECT', 'liveTv.reloadGuide' => 'Recharger le guide', 'liveTv.now' => 'Maintenant', @@ -2711,12 +2828,21 @@ extension on TranslationsFr { 'downloads.deleteDownload' => 'Supprimer le téléchargement', 'downloads.retryDownload' => 'Réessayer le téléchargement', 'downloads.downloadQueued' => 'Téléchargement en attente', + 'downloads.downloadResumed' => 'Téléchargement repris', 'downloads.serverErrorBitrate' => 'Erreur serveur : le fichier peut dépasser la limite de bitrate distant', 'downloads.episodesQueued' => ({required Object count}) => '${count} épisodes en attente de téléchargement', 'downloads.downloadDeleted' => 'Télécharger supprimé', 'downloads.deleteConfirm' => ({required Object title}) => 'Supprimer "${title}" de cet appareil ?', - 'downloads.deletingWithProgress' => ({required Object title, required Object current, required Object total}) => 'Suppression de ${title}... (${current} sur ${total})', + 'downloads.cancelledDownloadTitle' => 'Téléchargement annulé', + 'downloads.cancelledDownloadMessage' => 'Ce téléchargement a été annulé. Que voulez-vous faire ?', + 'downloads.allEpisodesAlreadyDownloaded' => 'Tous les épisodes sont déjà téléchargés', + 'downloads.resumeDownload' => 'Reprendre le téléchargement', + 'downloads.cancelledDownload' => 'Téléchargement annulé', + 'downloads.syncingFile' => ({required Object file, required Object status}) => '${file} (synchronisation ${status})', + 'downloads.downloadedFileClickToComplete' => ({required Object file}) => '${file} téléchargé — cliquez pour terminer', + 'downloads.partialDownloadClickToComplete' => 'Téléchargement partiel — cliquez pour terminer', 'downloads.deleting' => 'Suppression...', + 'downloads.deletingWithProgress' => ({required Object title, required Object current, required Object total}) => 'Suppression de ${title}... (${current} sur ${total})', 'downloads.queuedTooltip' => 'En attente', 'downloads.queuedFilesTooltip' => ({required Object files}) => 'En attente : ${files}', 'downloads.downloadingTooltip' => 'Téléchargement...', @@ -2773,6 +2899,7 @@ extension on TranslationsFr { 'shaders.deleteShaderConfirm' => ({required Object name}) => 'Supprimer "${name}" ?', 'companionRemote.title' => 'Télécommande compagnon', 'companionRemote.connectedTo' => ({required Object name}) => 'Connecté à ${name}', + 'companionRemote.unknownDevice' => 'Appareil inconnu', 'companionRemote.session.startingServer' => 'Démarrage du serveur distant...', 'companionRemote.session.failedToCreate' => 'Échec du démarrage du serveur distant :', 'companionRemote.session.hostAddress' => 'Adresse de l\'hôte', @@ -2816,6 +2943,8 @@ extension on TranslationsFr { 'companionRemote.remote.tabSettings' => 'Paramètres', 'companionRemote.remote.previous' => 'Précédent', 'companionRemote.remote.playPause' => 'Lecture/Pause', + _ => null, + } ?? switch (path) { 'companionRemote.remote.next' => 'Suivant', 'companionRemote.remote.seekBack' => 'Reculer', 'companionRemote.remote.stop' => 'Arrêter', @@ -2827,6 +2956,12 @@ extension on TranslationsFr { 'companionRemote.remote.subtitles' => 'Sous-titres', 'companionRemote.remote.audio' => 'Audio', 'companionRemote.remote.searchHint' => 'Rechercher sur le bureau...', + 'companionRemote.errors.noNetworkInterface' => 'Aucune interface réseau trouvée', + 'companionRemote.errors.authenticationFailed' => 'Échec de l’authentification', + 'companionRemote.errors.joinTimedOut' => 'Délai dépassé lors de la connexion à la session', + 'companionRemote.errors.failedToConnectAnyAddress' => 'Impossible de se connecter à une adresse', + 'companionRemote.errors.connectionLostAfterAttempts' => ({required Object attempts}) => 'Connexion perdue après ${attempts} tentatives', + 'companionRemote.errors.connectionLost' => 'Connexion perdue', 'videoSettings.playbackSpeed' => 'Vitesse de lecture', 'videoSettings.zoom' => 'Zoom', 'videoSettings.sleepTimer' => 'Minuterie de mise en veille', @@ -2837,6 +2972,40 @@ extension on TranslationsFr { 'videoSettings.performanceOverlay' => 'Superposition de performance', 'videoSettings.audioPassthrough' => 'Audio Pass-Through', 'videoSettings.audioNormalization' => 'Normaliser le volume', + 'performanceOverlay.color' => 'Couleur', + 'performanceOverlay.performance' => 'Performances', + 'performanceOverlay.buffer' => 'Tampon', + 'performanceOverlay.app' => 'App', + 'performanceOverlay.decoder' => 'Décodeur', + 'performanceOverlay.rawDecoder' => 'Décodeur brut', + 'performanceOverlay.tunneling' => 'Tunneling', + 'performanceOverlay.aspect' => 'Format', + 'performanceOverlay.rotation' => 'Rotation', + 'performanceOverlay.dvSource' => 'Source DV', + 'performanceOverlay.dvPath' => 'Chemin DV', + 'performanceOverlay.p7Conversion' => 'Conv. P7', + 'performanceOverlay.sampleRate' => 'Fréquence', + 'performanceOverlay.pixelFormat' => 'Fmt pixel', + 'performanceOverlay.hwFormat' => 'Fmt HW', + 'performanceOverlay.matrix' => 'Matrice', + 'performanceOverlay.primaries' => 'Primaires', + 'performanceOverlay.transfer' => 'Transfert', + 'performanceOverlay.renderFps' => 'FPS rendu', + 'performanceOverlay.displayFps' => 'FPS écran', + 'performanceOverlay.avSync' => 'Synchro A/V', + 'performanceOverlay.dropped' => 'Perdues', + 'performanceOverlay.dvRpus' => 'DV RPU', + 'performanceOverlay.dvRpuAverage' => 'Moy. DV RPU', + 'performanceOverlay.dvSampleAverage' => 'Moy. échant. DV', + 'performanceOverlay.maxLuma' => 'Luma max.', + 'performanceOverlay.minLuma' => 'Luma min.', + 'performanceOverlay.maxCll' => 'MaxCLL', + 'performanceOverlay.maxFall' => 'MaxFALL', + 'performanceOverlay.cacheUsed' => 'Cache utilisé', + 'performanceOverlay.speed' => 'Vitesse', + 'performanceOverlay.player' => 'Lecteur', + 'performanceOverlay.memory' => 'Mémoire', + 'performanceOverlay.uiFps' => 'FPS UI', 'externalPlayer.title' => 'Lecteur externe', 'externalPlayer.useExternalPlayer' => 'Utiliser un lecteur externe', 'externalPlayer.useExternalPlayerDescription' => 'Ouvrir les vidéos dans une autre app', @@ -2845,12 +3014,11 @@ extension on TranslationsFr { 'externalPlayer.systemDefault' => 'Par défaut du système', 'externalPlayer.addCustomPlayer' => 'Ajouter un lecteur personnalisé', 'externalPlayer.playerName' => 'Nom du lecteur', + 'externalPlayer.playerNameHint' => 'Mon lecteur', 'externalPlayer.playerCommand' => 'Commande', 'externalPlayer.playerPackage' => 'Nom du paquet', 'externalPlayer.playerUrlScheme' => 'Schéma URL', 'externalPlayer.off' => 'Désactivé', - _ => null, - } ?? switch (path) { 'externalPlayer.launchFailed' => 'Impossible d\'ouvrir le lecteur externe', 'externalPlayer.appNotInstalled' => ({required Object name}) => '${name} n\'est pas installé', 'externalPlayer.playInExternalPlayer' => 'Lire dans un lecteur externe', diff --git a/lib/i18n/strings_it.g.dart b/lib/i18n/strings_it.g.dart index dc81b977..e5068bb7 100644 --- a/lib/i18n/strings_it.g.dart +++ b/lib/i18n/strings_it.g.dart @@ -77,6 +77,7 @@ class TranslationsIt extends Translations with BaseTranslations 'Opzioni'; @override String get mute => 'Muto'; @override String get ok => 'OK'; + @override String get off => 'Disattivato'; + @override String seasonNumber({required Object number}) => 'Stagione ${number}'; + @override String chapterNumber({required Object number}) => 'Capitolo ${number}'; @override String get reconnect => 'Riconnetti'; @override String get exit => 'Esci'; @override String get viewAll => 'Mostra tutto'; @@ -385,6 +389,10 @@ class _TranslationsSettingsIt extends TranslationsSettingsEn { @override String get dvConversionNative => 'Nativo / disattivato'; @override String get dvConversionDv81 => 'P7 → P8.1'; @override String get dvConversionHevcStrip => 'P7 → HEVC'; + @override String get dvConversionAutoDescription => 'Usa il rilevamento delle capacità del dispositivo e il normale comportamento di fallback'; + @override String get dvConversionNativeDescription => 'Forza DV7 nativo e sopprime il nuovo tentativo di conversione DV'; + @override String get dvConversionDv81Description => 'Forza la conversione RPU inline a Dolby Vision profilo 8.1'; + @override String get dvConversionHevcStripDescription => 'Rimuove i livelli RPU/EL Dolby Vision e presenta HEVC semplice'; @override String get requireProfileSelectionOnOpen => 'Chiedi profilo all\'apertura'; @override String get requireProfileSelectionOnOpenDescription => 'Mostra la selezione del profilo ogni volta che l\'app viene aperta'; @override String get forceTvMode => 'Forza modalità TV'; @@ -432,6 +440,8 @@ class _TranslationsHotkeysIt extends TranslationsHotkeysEn { // Translations @override String setShortcutFor({required Object actionName}) => 'Imposta scorciatoia per ${actionName}'; @override String get clearShortcut => 'Elimina scorciatoia'; + @override String get noShortcutSet => 'Nessuna scorciatoia impostata'; + @override String get currentShortcut => 'Scorciatoia attuale:'; @override late final _TranslationsHotkeysActionsIt actions = _TranslationsHotkeysActionsIt._(_root); } @@ -482,6 +492,7 @@ class _TranslationsMediaMenuIt extends TranslationsMediaMenuEn { @override String get goToSeries => 'Vai alle serie'; @override String get goToSeason => 'Vai alla stagione'; @override String get shufflePlay => 'Riproduzione casuale'; + @override String get shuffleNotAvailableOffline => 'Riproduzione casuale non disponibile offline'; @override String get fileInfo => 'Info sul file'; @override String get deleteFromServer => 'Elimina dal server'; @override String get confirmDelete => 'Eliminare questo media e i suoi file dal server?'; @@ -620,6 +631,10 @@ class _TranslationsVideoControlsIt extends TranslationsVideoControlsEn { @override String get searchSubtitles => 'Cerca sottotitoli'; @override String get language => 'Lingua'; @override String get noSubtitlesFound => 'Nessun sottotitolo trovato'; + @override String get downloadedSubtitle => 'Scaricato'; + @override String get noSubtitlesAvailable => 'Nessun sottotitolo disponibile'; + @override String get noAudioTracksAvailable => 'Nessuna traccia audio disponibile'; + @override String get noTracksAvailable => 'Nessuna traccia disponibile'; @override String get subtitleDownloaded => 'Sottotitolo scaricato'; @override String get subtitleDownloadFailed => 'Impossibile scaricare il sottotitolo'; @override String get searchLanguages => 'Cerca lingue...'; @@ -808,6 +823,7 @@ class _TranslationsProfilesIt extends TranslationsProfilesEn { @override String get pinExplain => 'PIN a 4 cifre richiesto per cambiare profilo.'; @override String get continueButton => 'Continua'; @override String get pinsDontMatch => 'I PIN non corrispondono'; + @override String get initializeServicesFailed => 'Impossibile inizializzare i servizi profilo'; } // Path: connections @@ -854,6 +870,7 @@ class _TranslationsDiscoverIt extends TranslationsDiscoverEn { @override String get movie => 'Film'; @override String get tvShow => 'Serie TV'; @override String minutesLeft({required Object minutes}) => '${minutes} minuti rimanenti'; + @override String get moreLikeThis => 'Altri contenuti simili'; } // Path: errors @@ -886,6 +903,7 @@ class _TranslationsLibrariesIt extends TranslationsLibrariesEn { // Translations @override String get title => 'Librerie'; + @override String get fallbackTitle => 'Libreria'; @override String get scanLibraryFiles => 'Scansiona file libreria'; @override String get scanLibrary => 'Scansiona libreria'; @override String get analyze => 'Analizza'; @@ -1018,6 +1036,12 @@ class _TranslationsLiveTvIt extends TranslationsLiveTvEn { @override String get noChannels => 'Nessun canale disponibile'; @override String get noDvr => 'Nessun DVR configurato su nessun server'; @override String get noPrograms => 'Nessun dato di programma disponibile'; + @override String get liveStreamFailed => 'Streaming live non riuscito'; + @override String get unknownProgram => 'Programma sconosciuto'; + @override String get unknownHub => 'Sconosciuto'; + @override String get unknownError => 'Errore sconosciuto'; + @override String channelNumber({required Object number}) => 'Canale ${number}'; + @override String get unknownChannel => 'Canale sconosciuto'; @override String get live => 'IN DIRETTA'; @override String get reloadGuide => 'Ricarica guida'; @override String get now => 'Ora'; @@ -1224,12 +1248,21 @@ class _TranslationsDownloadsIt extends TranslationsDownloadsEn { @override String get deleteDownload => 'Elimina download'; @override String get retryDownload => 'Riprova download'; @override String get downloadQueued => 'Download in coda'; + @override String get downloadResumed => 'Download ripreso'; @override String get serverErrorBitrate => 'Errore server: il file può superare il limite di bitrate remoto'; @override String episodesQueued({required Object count}) => '${count} episodi in coda per il download'; @override String get downloadDeleted => 'Download eliminato'; @override String deleteConfirm({required Object title}) => 'Eliminare "${title}" da questo dispositivo?'; - @override String deletingWithProgress({required Object title, required Object current, required Object total}) => 'Eliminazione di ${title}... (${current} di ${total})'; + @override String get cancelledDownloadTitle => 'Download annullato'; + @override String get cancelledDownloadMessage => 'Questo download è stato annullato. Cosa vuoi fare?'; + @override String get allEpisodesAlreadyDownloaded => 'Tutti gli episodi sono già stati scaricati'; + @override String get resumeDownload => 'Riprendi download'; + @override String get cancelledDownload => 'Download annullato'; + @override String syncingFile({required Object file, required Object status}) => '${file} (sincronizzazione ${status})'; + @override String downloadedFileClickToComplete({required Object file}) => '${file} scaricato — fai clic per completare'; + @override String get partialDownloadClickToComplete => 'Scaricato parzialmente — fai clic per completare'; @override String get deleting => 'Eliminazione...'; + @override String deletingWithProgress({required Object title, required Object current, required Object total}) => 'Eliminazione di ${title}... (${current} di ${total})'; @override String get queuedTooltip => 'In coda'; @override String queuedFilesTooltip({required Object files}) => 'In coda: ${files}'; @override String get downloadingTooltip => 'Download in corso...'; @@ -1304,9 +1337,11 @@ class _TranslationsCompanionRemoteIt extends TranslationsCompanionRemoteEn { // Translations @override String get title => 'Telecomando'; @override String connectedTo({required Object name}) => 'Connesso a ${name}'; + @override String get unknownDevice => 'Dispositivo sconosciuto'; @override late final _TranslationsCompanionRemoteSessionIt session = _TranslationsCompanionRemoteSessionIt._(_root); @override late final _TranslationsCompanionRemotePairingIt pairing = _TranslationsCompanionRemotePairingIt._(_root); @override late final _TranslationsCompanionRemoteRemoteIt remote = _TranslationsCompanionRemoteRemoteIt._(_root); + @override late final _TranslationsCompanionRemoteErrorsIt errors = _TranslationsCompanionRemoteErrorsIt._(_root); } // Path: videoSettings @@ -1328,6 +1363,49 @@ class _TranslationsVideoSettingsIt extends TranslationsVideoSettingsEn { @override String get audioNormalization => 'Normalizza volume'; } +// Path: performanceOverlay +class _TranslationsPerformanceOverlayIt extends TranslationsPerformanceOverlayEn { + _TranslationsPerformanceOverlayIt._(TranslationsIt root) : this._root = root, super.internal(root); + + final TranslationsIt _root; // ignore: unused_field + + // Translations + @override String get color => 'Colore'; + @override String get performance => 'Prestazioni'; + @override String get buffer => 'Buffer'; + @override String get app => 'App'; + @override String get decoder => 'Decoder'; + @override String get rawDecoder => 'Decoder raw'; + @override String get tunneling => 'Tunneling'; + @override String get aspect => 'Aspetto'; + @override String get rotation => 'Rotazione'; + @override String get dvSource => 'Sorgente DV'; + @override String get dvPath => 'Percorso DV'; + @override String get p7Conversion => 'Conv. P7'; + @override String get sampleRate => 'Frequenza camp.'; + @override String get pixelFormat => 'Formato pixel'; + @override String get hwFormat => 'Formato HW'; + @override String get matrix => 'Matrice'; + @override String get primaries => 'Primari'; + @override String get transfer => 'Transfer'; + @override String get renderFps => 'FPS render'; + @override String get displayFps => 'FPS display'; + @override String get avSync => 'Sync A/V'; + @override String get dropped => 'Scartati'; + @override String get dvRpus => 'DV RPU'; + @override String get dvRpuAverage => 'Media DV RPU'; + @override String get dvSampleAverage => 'Media camp. DV'; + @override String get maxLuma => 'Luma max'; + @override String get minLuma => 'Luma min'; + @override String get maxCll => 'MaxCLL'; + @override String get maxFall => 'MaxFALL'; + @override String get cacheUsed => 'Cache usata'; + @override String get speed => 'Velocità'; + @override String get player => 'Player'; + @override String get memory => 'Memoria'; + @override String get uiFps => 'FPS UI'; +} + // Path: externalPlayer class _TranslationsExternalPlayerIt extends TranslationsExternalPlayerEn { _TranslationsExternalPlayerIt._(TranslationsIt root) : this._root = root, super.internal(root); @@ -1343,6 +1421,7 @@ class _TranslationsExternalPlayerIt extends TranslationsExternalPlayerEn { @override String get systemDefault => 'Predefinito di sistema'; @override String get addCustomPlayer => 'Aggiungi lettore personalizzato'; @override String get playerName => 'Nome lettore'; + @override String get playerNameHint => 'Il mio player'; @override String get playerCommand => 'Comando'; @override String get playerPackage => 'Nome pacchetto'; @override String get playerUrlScheme => 'Schema URL'; @@ -1755,6 +1834,21 @@ class _TranslationsCompanionRemoteRemoteIt extends TranslationsCompanionRemoteRe @override String get searchHint => 'Cerca sul desktop...'; } +// Path: companionRemote.errors +class _TranslationsCompanionRemoteErrorsIt extends TranslationsCompanionRemoteErrorsEn { + _TranslationsCompanionRemoteErrorsIt._(TranslationsIt root) : this._root = root, super.internal(root); + + final TranslationsIt _root; // ignore: unused_field + + // Translations + @override String get noNetworkInterface => 'Nessuna interfaccia di rete trovata'; + @override String get authenticationFailed => 'Autenticazione non riuscita'; + @override String get joinTimedOut => 'Tempo scaduto durante l’accesso alla sessione'; + @override String get failedToConnectAnyAddress => 'Impossibile connettersi a qualsiasi indirizzo'; + @override String connectionLostAfterAttempts({required Object attempts}) => 'Connessione persa dopo ${attempts} tentativi'; + @override String get connectionLost => 'Connessione persa'; +} + // Path: trackers.services class _TranslationsTrackersServicesIt extends TranslationsTrackersServicesEn { _TranslationsTrackersServicesIt._(TranslationsIt root) : this._root = root, super.internal(root); @@ -1871,6 +1965,9 @@ extension on TranslationsIt { 'common.settings' => 'Opzioni', 'common.mute' => 'Muto', 'common.ok' => 'OK', + 'common.off' => 'Disattivato', + 'common.seasonNumber' => ({required Object number}) => 'Stagione ${number}', + 'common.chapterNumber' => ({required Object number}) => 'Capitolo ${number}', 'common.reconnect' => 'Riconnetti', 'common.exit' => 'Esci', 'common.viewAll' => 'Mostra tutto', @@ -2070,6 +2167,10 @@ extension on TranslationsIt { 'settings.dvConversionNative' => 'Nativo / disattivato', 'settings.dvConversionDv81' => 'P7 → P8.1', 'settings.dvConversionHevcStrip' => 'P7 → HEVC', + 'settings.dvConversionAutoDescription' => 'Usa il rilevamento delle capacità del dispositivo e il normale comportamento di fallback', + 'settings.dvConversionNativeDescription' => 'Forza DV7 nativo e sopprime il nuovo tentativo di conversione DV', + 'settings.dvConversionDv81Description' => 'Forza la conversione RPU inline a Dolby Vision profilo 8.1', + 'settings.dvConversionHevcStripDescription' => 'Rimuove i livelli RPU/EL Dolby Vision e presenta HEVC semplice', 'settings.requireProfileSelectionOnOpen' => 'Chiedi profilo all\'apertura', 'settings.requireProfileSelectionOnOpenDescription' => 'Mostra la selezione del profilo ogni volta che l\'app viene aperta', 'settings.forceTvMode' => 'Forza modalità TV', @@ -2099,6 +2200,8 @@ extension on TranslationsIt { 'search.enterTitleActorOrKeyword' => 'Inserisci un titolo, attore o parola chiave', 'hotkeys.setShortcutFor' => ({required Object actionName}) => 'Imposta scorciatoia per ${actionName}', 'hotkeys.clearShortcut' => 'Elimina scorciatoia', + 'hotkeys.noShortcutSet' => 'Nessuna scorciatoia impostata', + 'hotkeys.currentShortcut' => 'Scorciatoia attuale:', 'hotkeys.actions.playPause' => 'Riproduci/Pausa', 'hotkeys.actions.volumeUp' => 'Alza volume', 'hotkeys.actions.volumeDown' => 'Abbassa volume', @@ -2155,6 +2258,7 @@ extension on TranslationsIt { 'mediaMenu.goToSeries' => 'Vai alle serie', 'mediaMenu.goToSeason' => 'Vai alla stagione', 'mediaMenu.shufflePlay' => 'Riproduzione casuale', + 'mediaMenu.shuffleNotAvailableOffline' => 'Riproduzione casuale non disponibile offline', 'mediaMenu.fileInfo' => 'Info sul file', 'mediaMenu.deleteFromServer' => 'Elimina dal server', 'mediaMenu.confirmDelete' => 'Eliminare questo media e i suoi file dal server?', @@ -2263,6 +2367,10 @@ extension on TranslationsIt { 'videoControls.searchSubtitles' => 'Cerca sottotitoli', 'videoControls.language' => 'Lingua', 'videoControls.noSubtitlesFound' => 'Nessun sottotitolo trovato', + 'videoControls.downloadedSubtitle' => 'Scaricato', + 'videoControls.noSubtitlesAvailable' => 'Nessun sottotitolo disponibile', + 'videoControls.noAudioTracksAvailable' => 'Nessuna traccia audio disponibile', + 'videoControls.noTracksAvailable' => 'Nessuna traccia disponibile', 'videoControls.subtitleDownloaded' => 'Sottotitolo scaricato', 'videoControls.subtitleDownloadFailed' => 'Impossibile scaricare il sottotitolo', 'videoControls.searchLanguages' => 'Cerca lingue...', @@ -2321,6 +2429,8 @@ extension on TranslationsIt { 'subtitlingStyling.borderColor' => 'Colore bordo', 'subtitlingStyling.backgroundOpacity' => 'Opacità sfondo', 'subtitlingStyling.backgroundColor' => 'Colore sfondo', + _ => null, + } ?? switch (path) { 'subtitlingStyling.position' => 'Posizione', 'subtitlingStyling.assOverride' => 'Sovrascrittura ASS', 'subtitlingStyling.bold' => 'Grassetto', @@ -2335,8 +2445,6 @@ extension on TranslationsIt { 'mpvConfig.loadPreset' => 'Carica', 'mpvConfig.deletePreset' => 'Elimina', 'mpvConfig.presetSaved' => 'Preset salvato', - _ => null, - } ?? switch (path) { 'mpvConfig.presetLoaded' => 'Preset caricato', 'mpvConfig.presetDeleted' => 'Preset eliminato', 'mpvConfig.confirmDeletePreset' => 'Sei sicuro di voler eliminare questo preset?', @@ -2399,6 +2507,7 @@ extension on TranslationsIt { 'profiles.pinExplain' => 'PIN a 4 cifre richiesto per cambiare profilo.', 'profiles.continueButton' => 'Continua', 'profiles.pinsDontMatch' => 'I PIN non corrispondono', + 'profiles.initializeServicesFailed' => 'Impossibile inizializzare i servizi profilo', 'connections.sectionTitle' => 'Connessioni', 'connections.addConnection' => 'Aggiungi connessione', 'connections.addConnectionSubtitleNoProfile' => 'Accedi con Plex o collega un server Jellyfin', @@ -2427,6 +2536,7 @@ extension on TranslationsIt { 'discover.movie' => 'Film', 'discover.tvShow' => 'Serie TV', 'discover.minutesLeft' => ({required Object minutes}) => '${minutes} minuti rimanenti', + 'discover.moreLikeThis' => 'Altri contenuti simili', 'errors.searchFailed' => ({required Object error}) => 'Ricerca fallita: ${error}', 'errors.connectionTimeout' => ({required Object context}) => 'Timeout connessione durante caricamento di ${context}', 'errors.connectionFailed' => 'Impossibile connettersi al server multimediale', @@ -2441,6 +2551,7 @@ extension on TranslationsIt { 'errors.failedToDeleteProfile' => ({required Object displayName}) => 'Impossibile eliminare ${displayName}', 'errors.failedToRate' => 'Impossibile aggiornare la valutazione', 'libraries.title' => 'Librerie', + 'libraries.fallbackTitle' => 'Libreria', 'libraries.scanLibraryFiles' => 'Scansiona file libreria', 'libraries.scanLibrary' => 'Scansiona libreria', 'libraries.analyze' => 'Analizza', @@ -2541,6 +2652,12 @@ extension on TranslationsIt { 'liveTv.noChannels' => 'Nessun canale disponibile', 'liveTv.noDvr' => 'Nessun DVR configurato su nessun server', 'liveTv.noPrograms' => 'Nessun dato di programma disponibile', + 'liveTv.liveStreamFailed' => 'Streaming live non riuscito', + 'liveTv.unknownProgram' => 'Programma sconosciuto', + 'liveTv.unknownHub' => 'Sconosciuto', + 'liveTv.unknownError' => 'Errore sconosciuto', + 'liveTv.channelNumber' => ({required Object number}) => 'Canale ${number}', + 'liveTv.unknownChannel' => 'Canale sconosciuto', 'liveTv.live' => 'IN DIRETTA', 'liveTv.reloadGuide' => 'Ricarica guida', 'liveTv.now' => 'Ora', @@ -2711,12 +2828,21 @@ extension on TranslationsIt { 'downloads.deleteDownload' => 'Elimina download', 'downloads.retryDownload' => 'Riprova download', 'downloads.downloadQueued' => 'Download in coda', + 'downloads.downloadResumed' => 'Download ripreso', 'downloads.serverErrorBitrate' => 'Errore server: il file può superare il limite di bitrate remoto', 'downloads.episodesQueued' => ({required Object count}) => '${count} episodi in coda per il download', 'downloads.downloadDeleted' => 'Download eliminato', 'downloads.deleteConfirm' => ({required Object title}) => 'Eliminare "${title}" da questo dispositivo?', - 'downloads.deletingWithProgress' => ({required Object title, required Object current, required Object total}) => 'Eliminazione di ${title}... (${current} di ${total})', + 'downloads.cancelledDownloadTitle' => 'Download annullato', + 'downloads.cancelledDownloadMessage' => 'Questo download è stato annullato. Cosa vuoi fare?', + 'downloads.allEpisodesAlreadyDownloaded' => 'Tutti gli episodi sono già stati scaricati', + 'downloads.resumeDownload' => 'Riprendi download', + 'downloads.cancelledDownload' => 'Download annullato', + 'downloads.syncingFile' => ({required Object file, required Object status}) => '${file} (sincronizzazione ${status})', + 'downloads.downloadedFileClickToComplete' => ({required Object file}) => '${file} scaricato — fai clic per completare', + 'downloads.partialDownloadClickToComplete' => 'Scaricato parzialmente — fai clic per completare', 'downloads.deleting' => 'Eliminazione...', + 'downloads.deletingWithProgress' => ({required Object title, required Object current, required Object total}) => 'Eliminazione di ${title}... (${current} di ${total})', 'downloads.queuedTooltip' => 'In coda', 'downloads.queuedFilesTooltip' => ({required Object files}) => 'In coda: ${files}', 'downloads.downloadingTooltip' => 'Download in corso...', @@ -2773,6 +2899,7 @@ extension on TranslationsIt { 'shaders.deleteShaderConfirm' => ({required Object name}) => 'Eliminare "${name}"?', 'companionRemote.title' => 'Telecomando', 'companionRemote.connectedTo' => ({required Object name}) => 'Connesso a ${name}', + 'companionRemote.unknownDevice' => 'Dispositivo sconosciuto', 'companionRemote.session.startingServer' => 'Avvio del server remoto...', 'companionRemote.session.failedToCreate' => 'Impossibile avviare il server remoto:', 'companionRemote.session.hostAddress' => 'Indirizzo host', @@ -2816,6 +2943,8 @@ extension on TranslationsIt { 'companionRemote.remote.tabSettings' => 'Impostazioni', 'companionRemote.remote.previous' => 'Precedente', 'companionRemote.remote.playPause' => 'Riproduci/Pausa', + _ => null, + } ?? switch (path) { 'companionRemote.remote.next' => 'Successivo', 'companionRemote.remote.seekBack' => 'Riavvolgi', 'companionRemote.remote.stop' => 'Ferma', @@ -2827,6 +2956,12 @@ extension on TranslationsIt { 'companionRemote.remote.subtitles' => 'Sottotitoli', 'companionRemote.remote.audio' => 'Audio', 'companionRemote.remote.searchHint' => 'Cerca sul desktop...', + 'companionRemote.errors.noNetworkInterface' => 'Nessuna interfaccia di rete trovata', + 'companionRemote.errors.authenticationFailed' => 'Autenticazione non riuscita', + 'companionRemote.errors.joinTimedOut' => 'Tempo scaduto durante l’accesso alla sessione', + 'companionRemote.errors.failedToConnectAnyAddress' => 'Impossibile connettersi a qualsiasi indirizzo', + 'companionRemote.errors.connectionLostAfterAttempts' => ({required Object attempts}) => 'Connessione persa dopo ${attempts} tentativi', + 'companionRemote.errors.connectionLost' => 'Connessione persa', 'videoSettings.playbackSpeed' => 'Velocità di riproduzione', 'videoSettings.zoom' => 'Zoom', 'videoSettings.sleepTimer' => 'Timer di spegnimento', @@ -2837,6 +2972,40 @@ extension on TranslationsIt { 'videoSettings.performanceOverlay' => 'Overlay prestazioni', 'videoSettings.audioPassthrough' => 'Audio Passthrough', 'videoSettings.audioNormalization' => 'Normalizza volume', + 'performanceOverlay.color' => 'Colore', + 'performanceOverlay.performance' => 'Prestazioni', + 'performanceOverlay.buffer' => 'Buffer', + 'performanceOverlay.app' => 'App', + 'performanceOverlay.decoder' => 'Decoder', + 'performanceOverlay.rawDecoder' => 'Decoder raw', + 'performanceOverlay.tunneling' => 'Tunneling', + 'performanceOverlay.aspect' => 'Aspetto', + 'performanceOverlay.rotation' => 'Rotazione', + 'performanceOverlay.dvSource' => 'Sorgente DV', + 'performanceOverlay.dvPath' => 'Percorso DV', + 'performanceOverlay.p7Conversion' => 'Conv. P7', + 'performanceOverlay.sampleRate' => 'Frequenza camp.', + 'performanceOverlay.pixelFormat' => 'Formato pixel', + 'performanceOverlay.hwFormat' => 'Formato HW', + 'performanceOverlay.matrix' => 'Matrice', + 'performanceOverlay.primaries' => 'Primari', + 'performanceOverlay.transfer' => 'Transfer', + 'performanceOverlay.renderFps' => 'FPS render', + 'performanceOverlay.displayFps' => 'FPS display', + 'performanceOverlay.avSync' => 'Sync A/V', + 'performanceOverlay.dropped' => 'Scartati', + 'performanceOverlay.dvRpus' => 'DV RPU', + 'performanceOverlay.dvRpuAverage' => 'Media DV RPU', + 'performanceOverlay.dvSampleAverage' => 'Media camp. DV', + 'performanceOverlay.maxLuma' => 'Luma max', + 'performanceOverlay.minLuma' => 'Luma min', + 'performanceOverlay.maxCll' => 'MaxCLL', + 'performanceOverlay.maxFall' => 'MaxFALL', + 'performanceOverlay.cacheUsed' => 'Cache usata', + 'performanceOverlay.speed' => 'Velocità', + 'performanceOverlay.player' => 'Player', + 'performanceOverlay.memory' => 'Memoria', + 'performanceOverlay.uiFps' => 'FPS UI', 'externalPlayer.title' => 'Lettore esterno', 'externalPlayer.useExternalPlayer' => 'Usa lettore esterno', 'externalPlayer.useExternalPlayerDescription' => 'Apri video in un\'altra app', @@ -2845,12 +3014,11 @@ extension on TranslationsIt { 'externalPlayer.systemDefault' => 'Predefinito di sistema', 'externalPlayer.addCustomPlayer' => 'Aggiungi lettore personalizzato', 'externalPlayer.playerName' => 'Nome lettore', + 'externalPlayer.playerNameHint' => 'Il mio player', 'externalPlayer.playerCommand' => 'Comando', 'externalPlayer.playerPackage' => 'Nome pacchetto', 'externalPlayer.playerUrlScheme' => 'Schema URL', 'externalPlayer.off' => 'Disattivato', - _ => null, - } ?? switch (path) { 'externalPlayer.launchFailed' => 'Impossibile aprire il lettore esterno', 'externalPlayer.appNotInstalled' => ({required Object name}) => '${name} non è installato', 'externalPlayer.playInExternalPlayer' => 'Riproduci in lettore esterno', diff --git a/lib/i18n/strings_ja.g.dart b/lib/i18n/strings_ja.g.dart index 5f23f028..6c1b788b 100644 --- a/lib/i18n/strings_ja.g.dart +++ b/lib/i18n/strings_ja.g.dart @@ -77,6 +77,7 @@ class TranslationsJa extends Translations with BaseTranslations '設定'; @override String get mute => 'ミュート'; @override String get ok => 'OK'; + @override String get off => 'オフ'; + @override String seasonNumber({required Object number}) => 'シーズン${number}'; + @override String chapterNumber({required Object number}) => 'チャプター${number}'; @override String get reconnect => '再接続'; @override String get exit => '終了'; @override String get viewAll => 'すべて表示'; @@ -385,6 +389,10 @@ class _TranslationsSettingsJa extends TranslationsSettingsEn { @override String get dvConversionNative => 'ネイティブ / 無効'; @override String get dvConversionDv81 => 'P7 → P8.1'; @override String get dvConversionHevcStrip => 'P7 → HEVC'; + @override String get dvConversionAutoDescription => 'デバイスの機能検出と通常のフォールバック動作を使用します'; + @override String get dvConversionNativeDescription => 'ネイティブ DV7 を強制し、DV 変換の再試行を抑制します'; + @override String get dvConversionDv81Description => 'Dolby Vision プロファイル 8.1 へのインライン RPU 変換を強制します'; + @override String get dvConversionHevcStripDescription => 'Dolby Vision の RPU/EL レイヤーを削除し、通常の HEVC として扱います'; @override String get requireProfileSelectionOnOpen => 'アプリ起動時にプロフィールを確認'; @override String get requireProfileSelectionOnOpenDescription => 'アプリを開くたびにプロフィール選択を表示'; @override String get forceTvMode => 'TVモードを強制'; @@ -432,6 +440,8 @@ class _TranslationsHotkeysJa extends TranslationsHotkeysEn { // Translations @override String setShortcutFor({required Object actionName}) => '${actionName}のショートカットを設定'; @override String get clearShortcut => 'ショートカットをクリア'; + @override String get noShortcutSet => 'ショートカット未設定'; + @override String get currentShortcut => '現在のショートカット:'; @override late final _TranslationsHotkeysActionsJa actions = _TranslationsHotkeysActionsJa._(_root); } @@ -482,6 +492,7 @@ class _TranslationsMediaMenuJa extends TranslationsMediaMenuEn { @override String get goToSeries => 'シリーズへ移動'; @override String get goToSeason => 'シーズンへ移動'; @override String get shufflePlay => 'シャッフル再生'; + @override String get shuffleNotAvailableOffline => 'オフラインではシャッフルを利用できません'; @override String get fileInfo => 'ファイル情報'; @override String get deleteFromServer => 'サーバーから削除'; @override String get confirmDelete => 'このメディアとそのファイルをサーバーから削除しますか?'; @@ -620,6 +631,10 @@ class _TranslationsVideoControlsJa extends TranslationsVideoControlsEn { @override String get searchSubtitles => '字幕を検索'; @override String get language => '言語'; @override String get noSubtitlesFound => '字幕が見つかりません'; + @override String get downloadedSubtitle => 'ダウンロード済み'; + @override String get noSubtitlesAvailable => '利用可能な字幕はありません'; + @override String get noAudioTracksAvailable => '利用可能な音声トラックはありません'; + @override String get noTracksAvailable => '利用可能なトラックはありません'; @override String get subtitleDownloaded => '字幕をダウンロードしました'; @override String get subtitleDownloadFailed => '字幕のダウンロードに失敗しました'; @override String get searchLanguages => '言語を検索...'; @@ -808,6 +823,7 @@ class _TranslationsProfilesJa extends TranslationsProfilesEn { @override String get pinExplain => 'プロフィール切り替えには4桁のPINが必要です。'; @override String get continueButton => '続ける'; @override String get pinsDontMatch => 'PINが一致しません'; + @override String get initializeServicesFailed => 'プロフィールサービスの初期化に失敗しました'; } // Path: connections @@ -854,6 +870,7 @@ class _TranslationsDiscoverJa extends TranslationsDiscoverEn { @override String get movie => '映画'; @override String get tvShow => 'テレビ番組'; @override String minutesLeft({required Object minutes}) => '残り${minutes}分'; + @override String get moreLikeThis => '似ている作品'; } // Path: errors @@ -886,6 +903,7 @@ class _TranslationsLibrariesJa extends TranslationsLibrariesEn { // Translations @override String get title => 'ライブラリ'; + @override String get fallbackTitle => 'ライブラリ'; @override String get scanLibraryFiles => 'ライブラリファイルをスキャン'; @override String get scanLibrary => 'ライブラリをスキャン'; @override String get analyze => '解析'; @@ -1018,6 +1036,12 @@ class _TranslationsLiveTvJa extends TranslationsLiveTvEn { @override String get noChannels => 'チャンネルがありません'; @override String get noDvr => 'どのサーバーにもDVRが設定されていません'; @override String get noPrograms => '番組データがありません'; + @override String get liveStreamFailed => 'ライブストリームに失敗しました'; + @override String get unknownProgram => '不明な番組'; + @override String get unknownHub => '不明'; + @override String get unknownError => '不明なエラー'; + @override String channelNumber({required Object number}) => 'チャンネル ${number}'; + @override String get unknownChannel => '不明なチャンネル'; @override String get live => 'ライブ'; @override String get reloadGuide => '番組表を再読込'; @override String get now => '現在'; @@ -1224,12 +1248,21 @@ class _TranslationsDownloadsJa extends TranslationsDownloadsEn { @override String get deleteDownload => 'ダウンロードを削除'; @override String get retryDownload => 'ダウンロードを再試行'; @override String get downloadQueued => 'ダウンロードをキューに追加しました'; + @override String get downloadResumed => 'ダウンロードを再開しました'; @override String get serverErrorBitrate => 'サーバーエラー: ファイルがリモートビットレート制限を超えている可能性があります'; @override String episodesQueued({required Object count}) => '${count}エピソードをダウンロードキューに追加しました'; @override String get downloadDeleted => 'ダウンロードを削除しました'; @override String deleteConfirm({required Object title}) => 'このデバイスから「${title}」を削除しますか?'; - @override String deletingWithProgress({required Object title, required Object current, required Object total}) => '${title}を削除中... (${current}/${total})'; + @override String get cancelledDownloadTitle => 'キャンセルされたダウンロード'; + @override String get cancelledDownloadMessage => 'このダウンロードはキャンセルされました。どうしますか?'; + @override String get allEpisodesAlreadyDownloaded => 'すべてのエピソードはすでにダウンロード済みです'; + @override String get resumeDownload => 'ダウンロードを再開'; + @override String get cancelledDownload => 'キャンセルされたダウンロード'; + @override String syncingFile({required Object file, required Object status}) => '${file}(${status}を同期中)'; + @override String downloadedFileClickToComplete({required Object file}) => '${file} をダウンロード済み — クリックして完了'; + @override String get partialDownloadClickToComplete => '一部ダウンロード済み — クリックして完了'; @override String get deleting => '削除中...'; + @override String deletingWithProgress({required Object title, required Object current, required Object total}) => '${title}を削除中... (${current}/${total})'; @override String get queuedTooltip => 'キュー'; @override String queuedFilesTooltip({required Object files}) => 'キュー: ${files}'; @override String get downloadingTooltip => 'ダウンロード中...'; @@ -1304,9 +1337,11 @@ class _TranslationsCompanionRemoteJa extends TranslationsCompanionRemoteEn { // Translations @override String get title => 'コンパニオンリモート'; @override String connectedTo({required Object name}) => '${name}に接続中'; + @override String get unknownDevice => '不明なデバイス'; @override late final _TranslationsCompanionRemoteSessionJa session = _TranslationsCompanionRemoteSessionJa._(_root); @override late final _TranslationsCompanionRemotePairingJa pairing = _TranslationsCompanionRemotePairingJa._(_root); @override late final _TranslationsCompanionRemoteRemoteJa remote = _TranslationsCompanionRemoteRemoteJa._(_root); + @override late final _TranslationsCompanionRemoteErrorsJa errors = _TranslationsCompanionRemoteErrorsJa._(_root); } // Path: videoSettings @@ -1328,6 +1363,49 @@ class _TranslationsVideoSettingsJa extends TranslationsVideoSettingsEn { @override String get audioNormalization => 'ラウドネス正規化'; } +// Path: performanceOverlay +class _TranslationsPerformanceOverlayJa extends TranslationsPerformanceOverlayEn { + _TranslationsPerformanceOverlayJa._(TranslationsJa root) : this._root = root, super.internal(root); + + final TranslationsJa _root; // ignore: unused_field + + // Translations + @override String get color => '色'; + @override String get performance => 'パフォーマンス'; + @override String get buffer => 'バッファ'; + @override String get app => 'アプリ'; + @override String get decoder => 'デコーダー'; + @override String get rawDecoder => 'Raw デコーダー'; + @override String get tunneling => 'トンネリング'; + @override String get aspect => 'アスペクト'; + @override String get rotation => '回転'; + @override String get dvSource => 'DV ソース'; + @override String get dvPath => 'DV パス'; + @override String get p7Conversion => 'P7 変換'; + @override String get sampleRate => 'サンプルレート'; + @override String get pixelFormat => 'ピクセル形式'; + @override String get hwFormat => 'HW 形式'; + @override String get matrix => 'マトリクス'; + @override String get primaries => 'プライマリ'; + @override String get transfer => '転送'; + @override String get renderFps => '描画 FPS'; + @override String get displayFps => '表示 FPS'; + @override String get avSync => 'A/V 同期'; + @override String get dropped => 'ドロップ'; + @override String get dvRpus => 'DV RPU'; + @override String get dvRpuAverage => 'DV RPU 平均'; + @override String get dvSampleAverage => 'DV サンプル平均'; + @override String get maxLuma => '最大輝度'; + @override String get minLuma => '最小輝度'; + @override String get maxCll => 'MaxCLL'; + @override String get maxFall => 'MaxFALL'; + @override String get cacheUsed => '使用キャッシュ'; + @override String get speed => '速度'; + @override String get player => 'プレーヤー'; + @override String get memory => 'メモリ'; + @override String get uiFps => 'UI FPS'; +} + // Path: externalPlayer class _TranslationsExternalPlayerJa extends TranslationsExternalPlayerEn { _TranslationsExternalPlayerJa._(TranslationsJa root) : this._root = root, super.internal(root); @@ -1343,6 +1421,7 @@ class _TranslationsExternalPlayerJa extends TranslationsExternalPlayerEn { @override String get systemDefault => 'システムデフォルト'; @override String get addCustomPlayer => 'カスタムプレーヤーを追加'; @override String get playerName => 'プレーヤー名'; + @override String get playerNameHint => 'マイプレーヤー'; @override String get playerCommand => 'コマンド'; @override String get playerPackage => 'パッケージ名'; @override String get playerUrlScheme => 'URLスキーム'; @@ -1755,6 +1834,21 @@ class _TranslationsCompanionRemoteRemoteJa extends TranslationsCompanionRemoteRe @override String get searchHint => 'デスクトップで検索...'; } +// Path: companionRemote.errors +class _TranslationsCompanionRemoteErrorsJa extends TranslationsCompanionRemoteErrorsEn { + _TranslationsCompanionRemoteErrorsJa._(TranslationsJa root) : this._root = root, super.internal(root); + + final TranslationsJa _root; // ignore: unused_field + + // Translations + @override String get noNetworkInterface => 'ネットワークインターフェースが見つかりません'; + @override String get authenticationFailed => '認証に失敗しました'; + @override String get joinTimedOut => 'セッション参加がタイムアウトしました'; + @override String get failedToConnectAnyAddress => 'どのアドレスにも接続できませんでした'; + @override String connectionLostAfterAttempts({required Object attempts}) => '${attempts}回試行後に接続が切断されました'; + @override String get connectionLost => '接続が切断されました'; +} + // Path: trackers.services class _TranslationsTrackersServicesJa extends TranslationsTrackersServicesEn { _TranslationsTrackersServicesJa._(TranslationsJa root) : this._root = root, super.internal(root); @@ -1871,6 +1965,9 @@ extension on TranslationsJa { 'common.settings' => '設定', 'common.mute' => 'ミュート', 'common.ok' => 'OK', + 'common.off' => 'オフ', + 'common.seasonNumber' => ({required Object number}) => 'シーズン${number}', + 'common.chapterNumber' => ({required Object number}) => 'チャプター${number}', 'common.reconnect' => '再接続', 'common.exit' => '終了', 'common.viewAll' => 'すべて表示', @@ -2070,6 +2167,10 @@ extension on TranslationsJa { 'settings.dvConversionNative' => 'ネイティブ / 無効', 'settings.dvConversionDv81' => 'P7 → P8.1', 'settings.dvConversionHevcStrip' => 'P7 → HEVC', + 'settings.dvConversionAutoDescription' => 'デバイスの機能検出と通常のフォールバック動作を使用します', + 'settings.dvConversionNativeDescription' => 'ネイティブ DV7 を強制し、DV 変換の再試行を抑制します', + 'settings.dvConversionDv81Description' => 'Dolby Vision プロファイル 8.1 へのインライン RPU 変換を強制します', + 'settings.dvConversionHevcStripDescription' => 'Dolby Vision の RPU/EL レイヤーを削除し、通常の HEVC として扱います', 'settings.requireProfileSelectionOnOpen' => 'アプリ起動時にプロフィールを確認', 'settings.requireProfileSelectionOnOpenDescription' => 'アプリを開くたびにプロフィール選択を表示', 'settings.forceTvMode' => 'TVモードを強制', @@ -2099,6 +2200,8 @@ extension on TranslationsJa { 'search.enterTitleActorOrKeyword' => 'タイトル、俳優、またはキーワードを入力', 'hotkeys.setShortcutFor' => ({required Object actionName}) => '${actionName}のショートカットを設定', 'hotkeys.clearShortcut' => 'ショートカットをクリア', + 'hotkeys.noShortcutSet' => 'ショートカット未設定', + 'hotkeys.currentShortcut' => '現在のショートカット:', 'hotkeys.actions.playPause' => '再生/一時停止', 'hotkeys.actions.volumeUp' => '音量を上げる', 'hotkeys.actions.volumeDown' => '音量を下げる', @@ -2155,6 +2258,7 @@ extension on TranslationsJa { 'mediaMenu.goToSeries' => 'シリーズへ移動', 'mediaMenu.goToSeason' => 'シーズンへ移動', 'mediaMenu.shufflePlay' => 'シャッフル再生', + 'mediaMenu.shuffleNotAvailableOffline' => 'オフラインではシャッフルを利用できません', 'mediaMenu.fileInfo' => 'ファイル情報', 'mediaMenu.deleteFromServer' => 'サーバーから削除', 'mediaMenu.confirmDelete' => 'このメディアとそのファイルをサーバーから削除しますか?', @@ -2263,6 +2367,10 @@ extension on TranslationsJa { 'videoControls.searchSubtitles' => '字幕を検索', 'videoControls.language' => '言語', 'videoControls.noSubtitlesFound' => '字幕が見つかりません', + 'videoControls.downloadedSubtitle' => 'ダウンロード済み', + 'videoControls.noSubtitlesAvailable' => '利用可能な字幕はありません', + 'videoControls.noAudioTracksAvailable' => '利用可能な音声トラックはありません', + 'videoControls.noTracksAvailable' => '利用可能なトラックはありません', 'videoControls.subtitleDownloaded' => '字幕をダウンロードしました', 'videoControls.subtitleDownloadFailed' => '字幕のダウンロードに失敗しました', 'videoControls.searchLanguages' => '言語を検索...', @@ -2321,6 +2429,8 @@ extension on TranslationsJa { 'subtitlingStyling.borderColor' => '枠線の色', 'subtitlingStyling.backgroundOpacity' => '背景の不透明度', 'subtitlingStyling.backgroundColor' => '背景色', + _ => null, + } ?? switch (path) { 'subtitlingStyling.position' => '位置', 'subtitlingStyling.assOverride' => 'ASSオーバーライド', 'subtitlingStyling.bold' => '太字', @@ -2335,8 +2445,6 @@ extension on TranslationsJa { 'mpvConfig.loadPreset' => '読み込み', 'mpvConfig.deletePreset' => '削除', 'mpvConfig.presetSaved' => 'プリセットを保存しました', - _ => null, - } ?? switch (path) { 'mpvConfig.presetLoaded' => 'プリセットを読み込みました', 'mpvConfig.presetDeleted' => 'プリセットを削除しました', 'mpvConfig.confirmDeletePreset' => 'このプリセットを削除してもよろしいですか?', @@ -2399,6 +2507,7 @@ extension on TranslationsJa { 'profiles.pinExplain' => 'プロフィール切り替えには4桁のPINが必要です。', 'profiles.continueButton' => '続ける', 'profiles.pinsDontMatch' => 'PINが一致しません', + 'profiles.initializeServicesFailed' => 'プロフィールサービスの初期化に失敗しました', 'connections.sectionTitle' => '接続', 'connections.addConnection' => '接続を追加', 'connections.addConnectionSubtitleNoProfile' => 'Plexでサインインするか、Jellyfinサーバーに接続', @@ -2427,6 +2536,7 @@ extension on TranslationsJa { 'discover.movie' => '映画', 'discover.tvShow' => 'テレビ番組', 'discover.minutesLeft' => ({required Object minutes}) => '残り${minutes}分', + 'discover.moreLikeThis' => '似ている作品', 'errors.searchFailed' => ({required Object error}) => '検索に失敗しました: ${error}', 'errors.connectionTimeout' => ({required Object context}) => '${context}の読み込み中に接続がタイムアウトしました', 'errors.connectionFailed' => 'メディアサーバーに接続できません', @@ -2441,6 +2551,7 @@ extension on TranslationsJa { 'errors.failedToDeleteProfile' => ({required Object displayName}) => '${displayName}の削除に失敗しました', 'errors.failedToRate' => '評価を更新できませんでした', 'libraries.title' => 'ライブラリ', + 'libraries.fallbackTitle' => 'ライブラリ', 'libraries.scanLibraryFiles' => 'ライブラリファイルをスキャン', 'libraries.scanLibrary' => 'ライブラリをスキャン', 'libraries.analyze' => '解析', @@ -2541,6 +2652,12 @@ extension on TranslationsJa { 'liveTv.noChannels' => 'チャンネルがありません', 'liveTv.noDvr' => 'どのサーバーにもDVRが設定されていません', 'liveTv.noPrograms' => '番組データがありません', + 'liveTv.liveStreamFailed' => 'ライブストリームに失敗しました', + 'liveTv.unknownProgram' => '不明な番組', + 'liveTv.unknownHub' => '不明', + 'liveTv.unknownError' => '不明なエラー', + 'liveTv.channelNumber' => ({required Object number}) => 'チャンネル ${number}', + 'liveTv.unknownChannel' => '不明なチャンネル', 'liveTv.live' => 'ライブ', 'liveTv.reloadGuide' => '番組表を再読込', 'liveTv.now' => '現在', @@ -2711,12 +2828,21 @@ extension on TranslationsJa { 'downloads.deleteDownload' => 'ダウンロードを削除', 'downloads.retryDownload' => 'ダウンロードを再試行', 'downloads.downloadQueued' => 'ダウンロードをキューに追加しました', + 'downloads.downloadResumed' => 'ダウンロードを再開しました', 'downloads.serverErrorBitrate' => 'サーバーエラー: ファイルがリモートビットレート制限を超えている可能性があります', 'downloads.episodesQueued' => ({required Object count}) => '${count}エピソードをダウンロードキューに追加しました', 'downloads.downloadDeleted' => 'ダウンロードを削除しました', 'downloads.deleteConfirm' => ({required Object title}) => 'このデバイスから「${title}」を削除しますか?', - 'downloads.deletingWithProgress' => ({required Object title, required Object current, required Object total}) => '${title}を削除中... (${current}/${total})', + 'downloads.cancelledDownloadTitle' => 'キャンセルされたダウンロード', + 'downloads.cancelledDownloadMessage' => 'このダウンロードはキャンセルされました。どうしますか?', + 'downloads.allEpisodesAlreadyDownloaded' => 'すべてのエピソードはすでにダウンロード済みです', + 'downloads.resumeDownload' => 'ダウンロードを再開', + 'downloads.cancelledDownload' => 'キャンセルされたダウンロード', + 'downloads.syncingFile' => ({required Object file, required Object status}) => '${file}(${status}を同期中)', + 'downloads.downloadedFileClickToComplete' => ({required Object file}) => '${file} をダウンロード済み — クリックして完了', + 'downloads.partialDownloadClickToComplete' => '一部ダウンロード済み — クリックして完了', 'downloads.deleting' => '削除中...', + 'downloads.deletingWithProgress' => ({required Object title, required Object current, required Object total}) => '${title}を削除中... (${current}/${total})', 'downloads.queuedTooltip' => 'キュー', 'downloads.queuedFilesTooltip' => ({required Object files}) => 'キュー: ${files}', 'downloads.downloadingTooltip' => 'ダウンロード中...', @@ -2773,6 +2899,7 @@ extension on TranslationsJa { 'shaders.deleteShaderConfirm' => ({required Object name}) => '"${name}"を削除しますか?', 'companionRemote.title' => 'コンパニオンリモート', 'companionRemote.connectedTo' => ({required Object name}) => '${name}に接続中', + 'companionRemote.unknownDevice' => '不明なデバイス', 'companionRemote.session.startingServer' => 'リモートサーバーを起動中...', 'companionRemote.session.failedToCreate' => 'リモートサーバーの起動に失敗しました:', 'companionRemote.session.hostAddress' => 'ホストアドレス', @@ -2816,6 +2943,8 @@ extension on TranslationsJa { 'companionRemote.remote.tabSettings' => '設定', 'companionRemote.remote.previous' => '前へ', 'companionRemote.remote.playPause' => '再生/一時停止', + _ => null, + } ?? switch (path) { 'companionRemote.remote.next' => '次へ', 'companionRemote.remote.seekBack' => '巻き戻し', 'companionRemote.remote.stop' => '停止', @@ -2827,6 +2956,12 @@ extension on TranslationsJa { 'companionRemote.remote.subtitles' => '字幕', 'companionRemote.remote.audio' => '音声', 'companionRemote.remote.searchHint' => 'デスクトップで検索...', + 'companionRemote.errors.noNetworkInterface' => 'ネットワークインターフェースが見つかりません', + 'companionRemote.errors.authenticationFailed' => '認証に失敗しました', + 'companionRemote.errors.joinTimedOut' => 'セッション参加がタイムアウトしました', + 'companionRemote.errors.failedToConnectAnyAddress' => 'どのアドレスにも接続できませんでした', + 'companionRemote.errors.connectionLostAfterAttempts' => ({required Object attempts}) => '${attempts}回試行後に接続が切断されました', + 'companionRemote.errors.connectionLost' => '接続が切断されました', 'videoSettings.playbackSpeed' => '再生速度', 'videoSettings.zoom' => 'ズーム', 'videoSettings.sleepTimer' => 'スリープタイマー', @@ -2837,6 +2972,40 @@ extension on TranslationsJa { 'videoSettings.performanceOverlay' => 'パフォーマンスオーバーレイ', 'videoSettings.audioPassthrough' => 'オーディオパススルー', 'videoSettings.audioNormalization' => 'ラウドネス正規化', + 'performanceOverlay.color' => '色', + 'performanceOverlay.performance' => 'パフォーマンス', + 'performanceOverlay.buffer' => 'バッファ', + 'performanceOverlay.app' => 'アプリ', + 'performanceOverlay.decoder' => 'デコーダー', + 'performanceOverlay.rawDecoder' => 'Raw デコーダー', + 'performanceOverlay.tunneling' => 'トンネリング', + 'performanceOverlay.aspect' => 'アスペクト', + 'performanceOverlay.rotation' => '回転', + 'performanceOverlay.dvSource' => 'DV ソース', + 'performanceOverlay.dvPath' => 'DV パス', + 'performanceOverlay.p7Conversion' => 'P7 変換', + 'performanceOverlay.sampleRate' => 'サンプルレート', + 'performanceOverlay.pixelFormat' => 'ピクセル形式', + 'performanceOverlay.hwFormat' => 'HW 形式', + 'performanceOverlay.matrix' => 'マトリクス', + 'performanceOverlay.primaries' => 'プライマリ', + 'performanceOverlay.transfer' => '転送', + 'performanceOverlay.renderFps' => '描画 FPS', + 'performanceOverlay.displayFps' => '表示 FPS', + 'performanceOverlay.avSync' => 'A/V 同期', + 'performanceOverlay.dropped' => 'ドロップ', + 'performanceOverlay.dvRpus' => 'DV RPU', + 'performanceOverlay.dvRpuAverage' => 'DV RPU 平均', + 'performanceOverlay.dvSampleAverage' => 'DV サンプル平均', + 'performanceOverlay.maxLuma' => '最大輝度', + 'performanceOverlay.minLuma' => '最小輝度', + 'performanceOverlay.maxCll' => 'MaxCLL', + 'performanceOverlay.maxFall' => 'MaxFALL', + 'performanceOverlay.cacheUsed' => '使用キャッシュ', + 'performanceOverlay.speed' => '速度', + 'performanceOverlay.player' => 'プレーヤー', + 'performanceOverlay.memory' => 'メモリ', + 'performanceOverlay.uiFps' => 'UI FPS', 'externalPlayer.title' => '外部プレーヤー', 'externalPlayer.useExternalPlayer' => '外部プレーヤーを使用', 'externalPlayer.useExternalPlayerDescription' => '動画を別のアプリで開きます', @@ -2845,12 +3014,11 @@ extension on TranslationsJa { 'externalPlayer.systemDefault' => 'システムデフォルト', 'externalPlayer.addCustomPlayer' => 'カスタムプレーヤーを追加', 'externalPlayer.playerName' => 'プレーヤー名', + 'externalPlayer.playerNameHint' => 'マイプレーヤー', 'externalPlayer.playerCommand' => 'コマンド', 'externalPlayer.playerPackage' => 'パッケージ名', 'externalPlayer.playerUrlScheme' => 'URLスキーム', 'externalPlayer.off' => 'オフ', - _ => null, - } ?? switch (path) { 'externalPlayer.launchFailed' => '外部プレーヤーの起動に失敗しました', 'externalPlayer.appNotInstalled' => ({required Object name}) => '${name}がインストールされていません', 'externalPlayer.playInExternalPlayer' => '外部プレーヤーで再生', diff --git a/lib/i18n/strings_ko.g.dart b/lib/i18n/strings_ko.g.dart index a73e926b..a827e965 100644 --- a/lib/i18n/strings_ko.g.dart +++ b/lib/i18n/strings_ko.g.dart @@ -77,6 +77,7 @@ class TranslationsKo extends Translations with BaseTranslations '설정'; @override String get mute => '음소거'; @override String get ok => '확인'; + @override String get off => '끔'; + @override String seasonNumber({required Object number}) => '시즌 ${number}'; + @override String chapterNumber({required Object number}) => '챕터 ${number}'; @override String get reconnect => '다시 연결'; @override String get exit => '종료'; @override String get viewAll => '모두 보기'; @@ -385,6 +389,10 @@ class _TranslationsSettingsKo extends TranslationsSettingsEn { @override String get dvConversionNative => '네이티브 / 비활성화'; @override String get dvConversionDv81 => 'P7 → P8.1'; @override String get dvConversionHevcStrip => 'P7 → HEVC'; + @override String get dvConversionAutoDescription => '기기 기능 감지와 일반 폴백 동작을 사용합니다'; + @override String get dvConversionNativeDescription => '네이티브 DV7을 강제하고 DV 변환 재시도를 억제합니다'; + @override String get dvConversionDv81Description => 'Dolby Vision 프로필 8.1로 인라인 RPU 변환을 강제합니다'; + @override String get dvConversionHevcStripDescription => 'Dolby Vision RPU/EL 레이어를 제거하고 일반 HEVC로 제공합니다'; @override String get requireProfileSelectionOnOpen => '앱 실행 시 프로필 선택'; @override String get requireProfileSelectionOnOpenDescription => '앱을 열 때마다 프로필 선택 화면을 표시합니다'; @override String get forceTvMode => 'TV 모드 강제 사용'; @@ -432,6 +440,8 @@ class _TranslationsHotkeysKo extends TranslationsHotkeysEn { // Translations @override String setShortcutFor({required Object actionName}) => '${actionName}에 대한 단축키 설정'; @override String get clearShortcut => '단축키 삭제'; + @override String get noShortcutSet => '설정된 단축키 없음'; + @override String get currentShortcut => '현재 단축키:'; @override late final _TranslationsHotkeysActionsKo actions = _TranslationsHotkeysActionsKo._(_root); } @@ -482,6 +492,7 @@ class _TranslationsMediaMenuKo extends TranslationsMediaMenuEn { @override String get goToSeries => '시리즈로 이동'; @override String get goToSeason => '시즌으로 이동'; @override String get shufflePlay => '무작위 재생'; + @override String get shuffleNotAvailableOffline => '오프라인에서는 셔플을 사용할 수 없습니다'; @override String get fileInfo => '파일 정보'; @override String get deleteFromServer => '서버에서 삭제'; @override String get confirmDelete => '이 미디어와 해당 파일을 서버에서 삭제할까요?'; @@ -620,6 +631,10 @@ class _TranslationsVideoControlsKo extends TranslationsVideoControlsEn { @override String get searchSubtitles => '자막 검색'; @override String get language => '언어'; @override String get noSubtitlesFound => '자막을 찾을 수 없습니다'; + @override String get downloadedSubtitle => '다운로드됨'; + @override String get noSubtitlesAvailable => '사용 가능한 자막 없음'; + @override String get noAudioTracksAvailable => '사용 가능한 오디오 트랙 없음'; + @override String get noTracksAvailable => '사용 가능한 트랙 없음'; @override String get subtitleDownloaded => '자막이 다운로드되었습니다'; @override String get subtitleDownloadFailed => '자막 다운로드에 실패했습니다'; @override String get searchLanguages => '언어 검색...'; @@ -808,6 +823,7 @@ class _TranslationsProfilesKo extends TranslationsProfilesEn { @override String get pinExplain => '프로필 전환에는 4자리 PIN이 필요합니다.'; @override String get continueButton => '계속'; @override String get pinsDontMatch => 'PIN이 일치하지 않습니다'; + @override String get initializeServicesFailed => '프로필 서비스를 초기화하지 못했습니다'; } // Path: connections @@ -854,6 +870,7 @@ class _TranslationsDiscoverKo extends TranslationsDiscoverEn { @override String get movie => '영화'; @override String get tvShow => 'TV 시리즈'; @override String minutesLeft({required Object minutes}) => '${minutes}분 남음'; + @override String get moreLikeThis => '비슷한 콘텐츠'; } // Path: errors @@ -886,6 +903,7 @@ class _TranslationsLibrariesKo extends TranslationsLibrariesEn { // Translations @override String get title => '미디어 라이브러리'; + @override String get fallbackTitle => '라이브러리'; @override String get scanLibraryFiles => '미디어 라이브러리 파일 스캔'; @override String get scanLibrary => '미디어 라이브러리 스캔'; @override String get analyze => '분석'; @@ -1018,6 +1036,12 @@ class _TranslationsLiveTvKo extends TranslationsLiveTvEn { @override String get noChannels => '사용 가능한 채널이 없습니다'; @override String get noDvr => '서버에 DVR이 구성되어 있지 않습니다'; @override String get noPrograms => '프로그램 데이터가 없습니다'; + @override String get liveStreamFailed => '라이브 스트림 실패'; + @override String get unknownProgram => '알 수 없는 프로그램'; + @override String get unknownHub => '알 수 없음'; + @override String get unknownError => '알 수 없는 오류'; + @override String channelNumber({required Object number}) => '채널 ${number}'; + @override String get unknownChannel => '알 수 없는 채널'; @override String get live => '실시간'; @override String get reloadGuide => '편성표 새로고침'; @override String get now => '지금'; @@ -1224,12 +1248,21 @@ class _TranslationsDownloadsKo extends TranslationsDownloadsEn { @override String get deleteDownload => '다운로드 삭제'; @override String get retryDownload => '다운로드 재시도'; @override String get downloadQueued => '다운로드 대기 중'; + @override String get downloadResumed => '다운로드를 재개했습니다'; @override String get serverErrorBitrate => '서버 오류: 파일이 원격 비트레이트 제한을 초과할 수 있습니다'; @override String episodesQueued({required Object count}) => '${count} 에피소드가 다운로드 대기열에 추가 되었습니다'; @override String get downloadDeleted => '다운로드 삭제됨'; @override String deleteConfirm({required Object title}) => '이 기기에서 "${title}"을(를) 삭제할까요?'; - @override String deletingWithProgress({required Object title, required Object current, required Object total}) => '${title} 삭제 중... (${current}/${total})'; + @override String get cancelledDownloadTitle => '취소된 다운로드'; + @override String get cancelledDownloadMessage => '이 다운로드가 취소되었습니다. 어떻게 하시겠습니까?'; + @override String get allEpisodesAlreadyDownloaded => '모든 에피소드가 이미 다운로드되었습니다'; + @override String get resumeDownload => '다운로드 재개'; + @override String get cancelledDownload => '취소된 다운로드'; + @override String syncingFile({required Object file, required Object status}) => '${file} (${status} 동기화 중)'; + @override String downloadedFileClickToComplete({required Object file}) => '${file} 다운로드됨 — 클릭하여 완료'; + @override String get partialDownloadClickToComplete => '부분 다운로드됨 — 클릭하여 완료'; @override String get deleting => '삭제 중...'; + @override String deletingWithProgress({required Object title, required Object current, required Object total}) => '${title} 삭제 중... (${current}/${total})'; @override String get queuedTooltip => '대기 중'; @override String queuedFilesTooltip({required Object files}) => '대기 중: ${files}'; @override String get downloadingTooltip => '다운로드 중...'; @@ -1304,9 +1337,11 @@ class _TranslationsCompanionRemoteKo extends TranslationsCompanionRemoteEn { // Translations @override String get title => '컴패니언 리모컨'; @override String connectedTo({required Object name}) => '${name}에 연결됨'; + @override String get unknownDevice => '알 수 없는 기기'; @override late final _TranslationsCompanionRemoteSessionKo session = _TranslationsCompanionRemoteSessionKo._(_root); @override late final _TranslationsCompanionRemotePairingKo pairing = _TranslationsCompanionRemotePairingKo._(_root); @override late final _TranslationsCompanionRemoteRemoteKo remote = _TranslationsCompanionRemoteRemoteKo._(_root); + @override late final _TranslationsCompanionRemoteErrorsKo errors = _TranslationsCompanionRemoteErrorsKo._(_root); } // Path: videoSettings @@ -1328,6 +1363,49 @@ class _TranslationsVideoSettingsKo extends TranslationsVideoSettingsEn { @override String get audioNormalization => '음량 정규화'; } +// Path: performanceOverlay +class _TranslationsPerformanceOverlayKo extends TranslationsPerformanceOverlayEn { + _TranslationsPerformanceOverlayKo._(TranslationsKo root) : this._root = root, super.internal(root); + + final TranslationsKo _root; // ignore: unused_field + + // Translations + @override String get color => '색상'; + @override String get performance => '성능'; + @override String get buffer => '버퍼'; + @override String get app => '앱'; + @override String get decoder => '디코더'; + @override String get rawDecoder => '원본 디코더'; + @override String get tunneling => '터널링'; + @override String get aspect => '화면비'; + @override String get rotation => '회전'; + @override String get dvSource => 'DV 소스'; + @override String get dvPath => 'DV 경로'; + @override String get p7Conversion => 'P7 변환'; + @override String get sampleRate => '샘플 레이트'; + @override String get pixelFormat => '픽셀 형식'; + @override String get hwFormat => 'HW 형식'; + @override String get matrix => '매트릭스'; + @override String get primaries => '원색'; + @override String get transfer => '전송'; + @override String get renderFps => '렌더 FPS'; + @override String get displayFps => '디스플레이 FPS'; + @override String get avSync => 'A/V 동기화'; + @override String get dropped => '드롭됨'; + @override String get dvRpus => 'DV RPU'; + @override String get dvRpuAverage => 'DV RPU 평균'; + @override String get dvSampleAverage => 'DV 샘플 평균'; + @override String get maxLuma => '최대 휘도'; + @override String get minLuma => '최소 휘도'; + @override String get maxCll => 'MaxCLL'; + @override String get maxFall => 'MaxFALL'; + @override String get cacheUsed => '사용 캐시'; + @override String get speed => '속도'; + @override String get player => '플레이어'; + @override String get memory => '메모리'; + @override String get uiFps => 'UI FPS'; +} + // Path: externalPlayer class _TranslationsExternalPlayerKo extends TranslationsExternalPlayerEn { _TranslationsExternalPlayerKo._(TranslationsKo root) : this._root = root, super.internal(root); @@ -1343,6 +1421,7 @@ class _TranslationsExternalPlayerKo extends TranslationsExternalPlayerEn { @override String get systemDefault => '시스템 기본값'; @override String get addCustomPlayer => '사용자 정의 플레이어 추가'; @override String get playerName => '플레이어 이름'; + @override String get playerNameHint => '내 플레이어'; @override String get playerCommand => '명령어'; @override String get playerPackage => '패키지 이름'; @override String get playerUrlScheme => 'URL 스킴'; @@ -1755,6 +1834,21 @@ class _TranslationsCompanionRemoteRemoteKo extends TranslationsCompanionRemoteRe @override String get searchHint => '데스크톱에서 검색...'; } +// Path: companionRemote.errors +class _TranslationsCompanionRemoteErrorsKo extends TranslationsCompanionRemoteErrorsEn { + _TranslationsCompanionRemoteErrorsKo._(TranslationsKo root) : this._root = root, super.internal(root); + + final TranslationsKo _root; // ignore: unused_field + + // Translations + @override String get noNetworkInterface => '네트워크 인터페이스를 찾을 수 없습니다'; + @override String get authenticationFailed => '인증 실패'; + @override String get joinTimedOut => '세션 참가 시간이 초과되었습니다'; + @override String get failedToConnectAnyAddress => '어떤 주소에도 연결하지 못했습니다'; + @override String connectionLostAfterAttempts({required Object attempts}) => '${attempts}회 시도 후 연결이 끊어졌습니다'; + @override String get connectionLost => '연결이 끊어졌습니다'; +} + // Path: trackers.services class _TranslationsTrackersServicesKo extends TranslationsTrackersServicesEn { _TranslationsTrackersServicesKo._(TranslationsKo root) : this._root = root, super.internal(root); @@ -1871,6 +1965,9 @@ extension on TranslationsKo { 'common.settings' => '설정', 'common.mute' => '음소거', 'common.ok' => '확인', + 'common.off' => '끔', + 'common.seasonNumber' => ({required Object number}) => '시즌 ${number}', + 'common.chapterNumber' => ({required Object number}) => '챕터 ${number}', 'common.reconnect' => '다시 연결', 'common.exit' => '종료', 'common.viewAll' => '모두 보기', @@ -2070,6 +2167,10 @@ extension on TranslationsKo { 'settings.dvConversionNative' => '네이티브 / 비활성화', 'settings.dvConversionDv81' => 'P7 → P8.1', 'settings.dvConversionHevcStrip' => 'P7 → HEVC', + 'settings.dvConversionAutoDescription' => '기기 기능 감지와 일반 폴백 동작을 사용합니다', + 'settings.dvConversionNativeDescription' => '네이티브 DV7을 강제하고 DV 변환 재시도를 억제합니다', + 'settings.dvConversionDv81Description' => 'Dolby Vision 프로필 8.1로 인라인 RPU 변환을 강제합니다', + 'settings.dvConversionHevcStripDescription' => 'Dolby Vision RPU/EL 레이어를 제거하고 일반 HEVC로 제공합니다', 'settings.requireProfileSelectionOnOpen' => '앱 실행 시 프로필 선택', 'settings.requireProfileSelectionOnOpenDescription' => '앱을 열 때마다 프로필 선택 화면을 표시합니다', 'settings.forceTvMode' => 'TV 모드 강제 사용', @@ -2099,6 +2200,8 @@ extension on TranslationsKo { 'search.enterTitleActorOrKeyword' => '제목, 배우 또는 키워드를 입력하세요', 'hotkeys.setShortcutFor' => ({required Object actionName}) => '${actionName}에 대한 단축키 설정', 'hotkeys.clearShortcut' => '단축키 삭제', + 'hotkeys.noShortcutSet' => '설정된 단축키 없음', + 'hotkeys.currentShortcut' => '현재 단축키:', 'hotkeys.actions.playPause' => '재생/일시정지', 'hotkeys.actions.volumeUp' => '볼륨 높이기', 'hotkeys.actions.volumeDown' => '볼륨 낮추기', @@ -2155,6 +2258,7 @@ extension on TranslationsKo { 'mediaMenu.goToSeries' => '시리즈로 이동', 'mediaMenu.goToSeason' => '시즌으로 이동', 'mediaMenu.shufflePlay' => '무작위 재생', + 'mediaMenu.shuffleNotAvailableOffline' => '오프라인에서는 셔플을 사용할 수 없습니다', 'mediaMenu.fileInfo' => '파일 정보', 'mediaMenu.deleteFromServer' => '서버에서 삭제', 'mediaMenu.confirmDelete' => '이 미디어와 해당 파일을 서버에서 삭제할까요?', @@ -2263,6 +2367,10 @@ extension on TranslationsKo { 'videoControls.searchSubtitles' => '자막 검색', 'videoControls.language' => '언어', 'videoControls.noSubtitlesFound' => '자막을 찾을 수 없습니다', + 'videoControls.downloadedSubtitle' => '다운로드됨', + 'videoControls.noSubtitlesAvailable' => '사용 가능한 자막 없음', + 'videoControls.noAudioTracksAvailable' => '사용 가능한 오디오 트랙 없음', + 'videoControls.noTracksAvailable' => '사용 가능한 트랙 없음', 'videoControls.subtitleDownloaded' => '자막이 다운로드되었습니다', 'videoControls.subtitleDownloadFailed' => '자막 다운로드에 실패했습니다', 'videoControls.searchLanguages' => '언어 검색...', @@ -2321,6 +2429,8 @@ extension on TranslationsKo { 'subtitlingStyling.borderColor' => '테두리 색상', 'subtitlingStyling.backgroundOpacity' => '배경 불투명도', 'subtitlingStyling.backgroundColor' => '배경색', + _ => null, + } ?? switch (path) { 'subtitlingStyling.position' => '위치', 'subtitlingStyling.assOverride' => 'ASS 오버라이드', 'subtitlingStyling.bold' => '굵게', @@ -2335,8 +2445,6 @@ extension on TranslationsKo { 'mpvConfig.loadPreset' => '로드', 'mpvConfig.deletePreset' => '삭제', 'mpvConfig.presetSaved' => '프리셋이 저장 되었습니다', - _ => null, - } ?? switch (path) { 'mpvConfig.presetLoaded' => '프리셋이 로드 되었습니다', 'mpvConfig.presetDeleted' => '프리셋이 삭제 되었습니다', 'mpvConfig.confirmDeletePreset' => '이 프리셋을 삭제 하시겠습니까?', @@ -2399,6 +2507,7 @@ extension on TranslationsKo { 'profiles.pinExplain' => '프로필 전환에는 4자리 PIN이 필요합니다.', 'profiles.continueButton' => '계속', 'profiles.pinsDontMatch' => 'PIN이 일치하지 않습니다', + 'profiles.initializeServicesFailed' => '프로필 서비스를 초기화하지 못했습니다', 'connections.sectionTitle' => '연결', 'connections.addConnection' => '연결 추가', 'connections.addConnectionSubtitleNoProfile' => 'Plex로 로그인하거나 Jellyfin 서버에 연결', @@ -2427,6 +2536,7 @@ extension on TranslationsKo { 'discover.movie' => '영화', 'discover.tvShow' => 'TV 시리즈', 'discover.minutesLeft' => ({required Object minutes}) => '${minutes}분 남음', + 'discover.moreLikeThis' => '비슷한 콘텐츠', 'errors.searchFailed' => ({required Object error}) => '검색 실패: ${error}', 'errors.connectionTimeout' => ({required Object context}) => '${context} 로드 중 연결 시간 초과', 'errors.connectionFailed' => '미디어 서버에 연결할 수 없습니다', @@ -2441,6 +2551,7 @@ extension on TranslationsKo { 'errors.failedToDeleteProfile' => ({required Object displayName}) => '${displayName}을(를) 삭제할 수 없습니다', 'errors.failedToRate' => '평점을 업데이트하지 못했습니다', 'libraries.title' => '미디어 라이브러리', + 'libraries.fallbackTitle' => '라이브러리', 'libraries.scanLibraryFiles' => '미디어 라이브러리 파일 스캔', 'libraries.scanLibrary' => '미디어 라이브러리 스캔', 'libraries.analyze' => '분석', @@ -2541,6 +2652,12 @@ extension on TranslationsKo { 'liveTv.noChannels' => '사용 가능한 채널이 없습니다', 'liveTv.noDvr' => '서버에 DVR이 구성되어 있지 않습니다', 'liveTv.noPrograms' => '프로그램 데이터가 없습니다', + 'liveTv.liveStreamFailed' => '라이브 스트림 실패', + 'liveTv.unknownProgram' => '알 수 없는 프로그램', + 'liveTv.unknownHub' => '알 수 없음', + 'liveTv.unknownError' => '알 수 없는 오류', + 'liveTv.channelNumber' => ({required Object number}) => '채널 ${number}', + 'liveTv.unknownChannel' => '알 수 없는 채널', 'liveTv.live' => '실시간', 'liveTv.reloadGuide' => '편성표 새로고침', 'liveTv.now' => '지금', @@ -2711,12 +2828,21 @@ extension on TranslationsKo { 'downloads.deleteDownload' => '다운로드 삭제', 'downloads.retryDownload' => '다운로드 재시도', 'downloads.downloadQueued' => '다운로드 대기 중', + 'downloads.downloadResumed' => '다운로드를 재개했습니다', 'downloads.serverErrorBitrate' => '서버 오류: 파일이 원격 비트레이트 제한을 초과할 수 있습니다', 'downloads.episodesQueued' => ({required Object count}) => '${count} 에피소드가 다운로드 대기열에 추가 되었습니다', 'downloads.downloadDeleted' => '다운로드 삭제됨', 'downloads.deleteConfirm' => ({required Object title}) => '이 기기에서 "${title}"을(를) 삭제할까요?', - 'downloads.deletingWithProgress' => ({required Object title, required Object current, required Object total}) => '${title} 삭제 중... (${current}/${total})', + 'downloads.cancelledDownloadTitle' => '취소된 다운로드', + 'downloads.cancelledDownloadMessage' => '이 다운로드가 취소되었습니다. 어떻게 하시겠습니까?', + 'downloads.allEpisodesAlreadyDownloaded' => '모든 에피소드가 이미 다운로드되었습니다', + 'downloads.resumeDownload' => '다운로드 재개', + 'downloads.cancelledDownload' => '취소된 다운로드', + 'downloads.syncingFile' => ({required Object file, required Object status}) => '${file} (${status} 동기화 중)', + 'downloads.downloadedFileClickToComplete' => ({required Object file}) => '${file} 다운로드됨 — 클릭하여 완료', + 'downloads.partialDownloadClickToComplete' => '부분 다운로드됨 — 클릭하여 완료', 'downloads.deleting' => '삭제 중...', + 'downloads.deletingWithProgress' => ({required Object title, required Object current, required Object total}) => '${title} 삭제 중... (${current}/${total})', 'downloads.queuedTooltip' => '대기 중', 'downloads.queuedFilesTooltip' => ({required Object files}) => '대기 중: ${files}', 'downloads.downloadingTooltip' => '다운로드 중...', @@ -2773,6 +2899,7 @@ extension on TranslationsKo { 'shaders.deleteShaderConfirm' => ({required Object name}) => '"${name}"을(를) 삭제하시겠습니까?', 'companionRemote.title' => '컴패니언 리모컨', 'companionRemote.connectedTo' => ({required Object name}) => '${name}에 연결됨', + 'companionRemote.unknownDevice' => '알 수 없는 기기', 'companionRemote.session.startingServer' => '원격 서버 시작 중...', 'companionRemote.session.failedToCreate' => '원격 서버를 시작하지 못했습니다:', 'companionRemote.session.hostAddress' => '호스트 주소', @@ -2816,6 +2943,8 @@ extension on TranslationsKo { 'companionRemote.remote.tabSettings' => '설정', 'companionRemote.remote.previous' => '이전', 'companionRemote.remote.playPause' => '재생/일시정지', + _ => null, + } ?? switch (path) { 'companionRemote.remote.next' => '다음', 'companionRemote.remote.seekBack' => '되감기', 'companionRemote.remote.stop' => '정지', @@ -2827,6 +2956,12 @@ extension on TranslationsKo { 'companionRemote.remote.subtitles' => '자막', 'companionRemote.remote.audio' => '오디오', 'companionRemote.remote.searchHint' => '데스크톱에서 검색...', + 'companionRemote.errors.noNetworkInterface' => '네트워크 인터페이스를 찾을 수 없습니다', + 'companionRemote.errors.authenticationFailed' => '인증 실패', + 'companionRemote.errors.joinTimedOut' => '세션 참가 시간이 초과되었습니다', + 'companionRemote.errors.failedToConnectAnyAddress' => '어떤 주소에도 연결하지 못했습니다', + 'companionRemote.errors.connectionLostAfterAttempts' => ({required Object attempts}) => '${attempts}회 시도 후 연결이 끊어졌습니다', + 'companionRemote.errors.connectionLost' => '연결이 끊어졌습니다', 'videoSettings.playbackSpeed' => '재생 속도', 'videoSettings.zoom' => '확대/축소', 'videoSettings.sleepTimer' => '취침 타이머', @@ -2837,6 +2972,40 @@ extension on TranslationsKo { 'videoSettings.performanceOverlay' => '성능 오버레이', 'videoSettings.audioPassthrough' => '오디오 패스스루', 'videoSettings.audioNormalization' => '음량 정규화', + 'performanceOverlay.color' => '색상', + 'performanceOverlay.performance' => '성능', + 'performanceOverlay.buffer' => '버퍼', + 'performanceOverlay.app' => '앱', + 'performanceOverlay.decoder' => '디코더', + 'performanceOverlay.rawDecoder' => '원본 디코더', + 'performanceOverlay.tunneling' => '터널링', + 'performanceOverlay.aspect' => '화면비', + 'performanceOverlay.rotation' => '회전', + 'performanceOverlay.dvSource' => 'DV 소스', + 'performanceOverlay.dvPath' => 'DV 경로', + 'performanceOverlay.p7Conversion' => 'P7 변환', + 'performanceOverlay.sampleRate' => '샘플 레이트', + 'performanceOverlay.pixelFormat' => '픽셀 형식', + 'performanceOverlay.hwFormat' => 'HW 형식', + 'performanceOverlay.matrix' => '매트릭스', + 'performanceOverlay.primaries' => '원색', + 'performanceOverlay.transfer' => '전송', + 'performanceOverlay.renderFps' => '렌더 FPS', + 'performanceOverlay.displayFps' => '디스플레이 FPS', + 'performanceOverlay.avSync' => 'A/V 동기화', + 'performanceOverlay.dropped' => '드롭됨', + 'performanceOverlay.dvRpus' => 'DV RPU', + 'performanceOverlay.dvRpuAverage' => 'DV RPU 평균', + 'performanceOverlay.dvSampleAverage' => 'DV 샘플 평균', + 'performanceOverlay.maxLuma' => '최대 휘도', + 'performanceOverlay.minLuma' => '최소 휘도', + 'performanceOverlay.maxCll' => 'MaxCLL', + 'performanceOverlay.maxFall' => 'MaxFALL', + 'performanceOverlay.cacheUsed' => '사용 캐시', + 'performanceOverlay.speed' => '속도', + 'performanceOverlay.player' => '플레이어', + 'performanceOverlay.memory' => '메모리', + 'performanceOverlay.uiFps' => 'UI FPS', 'externalPlayer.title' => '외부 플레이어', 'externalPlayer.useExternalPlayer' => '외부 플레이어 사용', 'externalPlayer.useExternalPlayerDescription' => '동영상을 다른 앱에서 열기', @@ -2845,12 +3014,11 @@ extension on TranslationsKo { 'externalPlayer.systemDefault' => '시스템 기본값', 'externalPlayer.addCustomPlayer' => '사용자 정의 플레이어 추가', 'externalPlayer.playerName' => '플레이어 이름', + 'externalPlayer.playerNameHint' => '내 플레이어', 'externalPlayer.playerCommand' => '명령어', 'externalPlayer.playerPackage' => '패키지 이름', 'externalPlayer.playerUrlScheme' => 'URL 스킴', 'externalPlayer.off' => '꺼짐', - _ => null, - } ?? switch (path) { 'externalPlayer.launchFailed' => '외부 플레이어를 열 수 없습니다', 'externalPlayer.appNotInstalled' => ({required Object name}) => '${name}이(가) 설치되어 있지 않습니다', 'externalPlayer.playInExternalPlayer' => '외부 플레이어에서 재생', diff --git a/lib/i18n/strings_nb.g.dart b/lib/i18n/strings_nb.g.dart index 6e816c47..d9262faf 100644 --- a/lib/i18n/strings_nb.g.dart +++ b/lib/i18n/strings_nb.g.dart @@ -77,6 +77,7 @@ class TranslationsNb extends Translations with BaseTranslations 'Innstillinger'; @override String get mute => 'Demp'; @override String get ok => 'OK'; + @override String get off => 'Av'; + @override String seasonNumber({required Object number}) => 'Sesong ${number}'; + @override String chapterNumber({required Object number}) => 'Kapittel ${number}'; @override String get reconnect => 'Koble til på nytt'; @override String get exit => 'Avslutt'; @override String get viewAll => 'Vis alle'; @@ -385,6 +389,10 @@ class _TranslationsSettingsNb extends TranslationsSettingsEn { @override String get dvConversionNative => 'Innebygd / deaktivert'; @override String get dvConversionDv81 => 'P7 → P8.1'; @override String get dvConversionHevcStrip => 'P7 → HEVC'; + @override String get dvConversionAutoDescription => 'Bruk enhetens kapabilitetsdeteksjon og normal reserveoppførsel'; + @override String get dvConversionNativeDescription => 'Tving native DV7 og undertrykk forsøk på DV-konvertering'; + @override String get dvConversionDv81Description => 'Tving inline RPU-konvertering til Dolby Vision profil 8.1'; + @override String get dvConversionHevcStripDescription => 'Fjern Dolby Vision RPU/EL-lag og presenter vanlig HEVC'; @override String get requireProfileSelectionOnOpen => 'Spør om profil ved appåpning'; @override String get requireProfileSelectionOnOpenDescription => 'Vis profilvalg hver gang appen åpnes'; @override String get forceTvMode => 'Tving TV-modus'; @@ -432,6 +440,8 @@ class _TranslationsHotkeysNb extends TranslationsHotkeysEn { // Translations @override String setShortcutFor({required Object actionName}) => 'Angi snarvei for ${actionName}'; @override String get clearShortcut => 'Fjern snarvei'; + @override String get noShortcutSet => 'Ingen snarvei satt'; + @override String get currentShortcut => 'Gjeldende snarvei:'; @override late final _TranslationsHotkeysActionsNb actions = _TranslationsHotkeysActionsNb._(_root); } @@ -482,6 +492,7 @@ class _TranslationsMediaMenuNb extends TranslationsMediaMenuEn { @override String get goToSeries => 'Gå til serie'; @override String get goToSeason => 'Gå til sesong'; @override String get shufflePlay => 'Tilfeldig avspilling'; + @override String get shuffleNotAvailableOffline => 'Tilfeldig avspilling er ikke tilgjengelig offline'; @override String get fileInfo => 'Filinformasjon'; @override String get deleteFromServer => 'Slett fra server'; @override String get confirmDelete => 'Slette dette mediet og filene fra serveren?'; @@ -620,6 +631,10 @@ class _TranslationsVideoControlsNb extends TranslationsVideoControlsEn { @override String get searchSubtitles => 'Søk etter undertekster'; @override String get language => 'Språk'; @override String get noSubtitlesFound => 'Ingen undertekster funnet'; + @override String get downloadedSubtitle => 'Lastet ned'; + @override String get noSubtitlesAvailable => 'Ingen undertekster tilgjengelig'; + @override String get noAudioTracksAvailable => 'Ingen lydspor tilgjengelig'; + @override String get noTracksAvailable => 'Ingen spor tilgjengelig'; @override String get subtitleDownloaded => 'Undertekst lastet ned'; @override String get subtitleDownloadFailed => 'Kunne ikke laste ned undertekst'; @override String get searchLanguages => 'Søk etter språk...'; @@ -808,6 +823,7 @@ class _TranslationsProfilesNb extends TranslationsProfilesEn { @override String get pinExplain => '4-sifret PIN kreves for å bytte profiler.'; @override String get continueButton => 'Fortsett'; @override String get pinsDontMatch => 'PIN-ene samsvarer ikke'; + @override String get initializeServicesFailed => 'Kunne ikke initialisere profiltjenester'; } // Path: connections @@ -854,6 +870,7 @@ class _TranslationsDiscoverNb extends TranslationsDiscoverEn { @override String get movie => 'Film'; @override String get tvShow => 'TV-serie'; @override String minutesLeft({required Object minutes}) => '${minutes} min igjen'; + @override String get moreLikeThis => 'Mer som dette'; } // Path: errors @@ -886,6 +903,7 @@ class _TranslationsLibrariesNb extends TranslationsLibrariesEn { // Translations @override String get title => 'Biblioteker'; + @override String get fallbackTitle => 'Bibliotek'; @override String get scanLibraryFiles => 'Skann bibliotekfiler'; @override String get scanLibrary => 'Skann bibliotek'; @override String get analyze => 'Analyser'; @@ -1018,6 +1036,12 @@ class _TranslationsLiveTvNb extends TranslationsLiveTvEn { @override String get noChannels => 'Ingen kanaler tilgjengelig'; @override String get noDvr => 'Ingen DVR konfigurert på noen server'; @override String get noPrograms => 'Ingen programdata tilgjengelig'; + @override String get liveStreamFailed => 'Direktesending mislyktes'; + @override String get unknownProgram => 'Ukjent program'; + @override String get unknownHub => 'Ukjent'; + @override String get unknownError => 'Ukjent feil'; + @override String channelNumber({required Object number}) => 'Kanal ${number}'; + @override String get unknownChannel => 'Ukjent kanal'; @override String get live => 'DIREKTE'; @override String get reloadGuide => 'Last inn programguide på nytt'; @override String get now => 'Nå'; @@ -1224,12 +1248,21 @@ class _TranslationsDownloadsNb extends TranslationsDownloadsEn { @override String get deleteDownload => 'Slett nedlasting'; @override String get retryDownload => 'Prøv nedlasting på nytt'; @override String get downloadQueued => 'Nedlasting i kø'; + @override String get downloadResumed => 'Nedlasting gjenopptatt'; @override String get serverErrorBitrate => 'Serverfeil: filen kan overskride grensen for ekstern bitrate'; @override String episodesQueued({required Object count}) => '${count} episoder i nedlastingskø'; @override String get downloadDeleted => 'Nedlasting slettet'; @override String deleteConfirm({required Object title}) => 'Slette "${title}" fra denne enheten?'; - @override String deletingWithProgress({required Object title, required Object current, required Object total}) => 'Sletter ${title}... (${current} av ${total})'; + @override String get cancelledDownloadTitle => 'Avbrutt nedlasting'; + @override String get cancelledDownloadMessage => 'Denne nedlastingen ble avbrutt. Hva vil du gjøre?'; + @override String get allEpisodesAlreadyDownloaded => 'Alle episoder er allerede lastet ned'; + @override String get resumeDownload => 'Gjenoppta nedlasting'; + @override String get cancelledDownload => 'Avbrutt nedlasting'; + @override String syncingFile({required Object file, required Object status}) => '${file} (synkroniserer ${status})'; + @override String downloadedFileClickToComplete({required Object file}) => '${file} lastet ned – klikk for å fullføre'; + @override String get partialDownloadClickToComplete => 'Delvis lastet ned – klikk for å fullføre'; @override String get deleting => 'Sletter...'; + @override String deletingWithProgress({required Object title, required Object current, required Object total}) => 'Sletter ${title}... (${current} av ${total})'; @override String get queuedTooltip => 'I kø'; @override String queuedFilesTooltip({required Object files}) => 'I kø: ${files}'; @override String get downloadingTooltip => 'Laster ned...'; @@ -1304,9 +1337,11 @@ class _TranslationsCompanionRemoteNb extends TranslationsCompanionRemoteEn { // Translations @override String get title => 'Følgesvenn-fjernkontroll'; @override String connectedTo({required Object name}) => 'Tilkoblet ${name}'; + @override String get unknownDevice => 'Ukjent enhet'; @override late final _TranslationsCompanionRemoteSessionNb session = _TranslationsCompanionRemoteSessionNb._(_root); @override late final _TranslationsCompanionRemotePairingNb pairing = _TranslationsCompanionRemotePairingNb._(_root); @override late final _TranslationsCompanionRemoteRemoteNb remote = _TranslationsCompanionRemoteRemoteNb._(_root); + @override late final _TranslationsCompanionRemoteErrorsNb errors = _TranslationsCompanionRemoteErrorsNb._(_root); } // Path: videoSettings @@ -1328,6 +1363,49 @@ class _TranslationsVideoSettingsNb extends TranslationsVideoSettingsEn { @override String get audioNormalization => 'Normaliser lydstyrke'; } +// Path: performanceOverlay +class _TranslationsPerformanceOverlayNb extends TranslationsPerformanceOverlayEn { + _TranslationsPerformanceOverlayNb._(TranslationsNb root) : this._root = root, super.internal(root); + + final TranslationsNb _root; // ignore: unused_field + + // Translations + @override String get color => 'Farge'; + @override String get performance => 'Ytelse'; + @override String get buffer => 'Buffer'; + @override String get app => 'App'; + @override String get decoder => 'Dekoder'; + @override String get rawDecoder => 'Rå dekoder'; + @override String get tunneling => 'Tunneling'; + @override String get aspect => 'Format'; + @override String get rotation => 'Rotasjon'; + @override String get dvSource => 'DV-kilde'; + @override String get dvPath => 'DV-sti'; + @override String get p7Conversion => 'P7-konv.'; + @override String get sampleRate => 'Samplingsrate'; + @override String get pixelFormat => 'Pikselformat'; + @override String get hwFormat => 'HW-format'; + @override String get matrix => 'Matrise'; + @override String get primaries => 'Primærfarger'; + @override String get transfer => 'Overføring'; + @override String get renderFps => 'Render-FPS'; + @override String get displayFps => 'Skjerm-FPS'; + @override String get avSync => 'A/V-synk'; + @override String get dropped => 'Droppet'; + @override String get dvRpus => 'DV RPU-er'; + @override String get dvRpuAverage => 'DV RPU snitt'; + @override String get dvSampleAverage => 'DV-sample snitt'; + @override String get maxLuma => 'Maks luma'; + @override String get minLuma => 'Min luma'; + @override String get maxCll => 'MaxCLL'; + @override String get maxFall => 'MaxFALL'; + @override String get cacheUsed => 'Cache brukt'; + @override String get speed => 'Hastighet'; + @override String get player => 'Spiller'; + @override String get memory => 'Minne'; + @override String get uiFps => 'UI FPS'; +} + // Path: externalPlayer class _TranslationsExternalPlayerNb extends TranslationsExternalPlayerEn { _TranslationsExternalPlayerNb._(TranslationsNb root) : this._root = root, super.internal(root); @@ -1343,6 +1421,7 @@ class _TranslationsExternalPlayerNb extends TranslationsExternalPlayerEn { @override String get systemDefault => 'Systemstandard'; @override String get addCustomPlayer => 'Legg til egendefinert spiller'; @override String get playerName => 'Spillernavn'; + @override String get playerNameHint => 'Min spiller'; @override String get playerCommand => 'Kommando'; @override String get playerPackage => 'Pakkenavn'; @override String get playerUrlScheme => 'URL-skjema'; @@ -1755,6 +1834,21 @@ class _TranslationsCompanionRemoteRemoteNb extends TranslationsCompanionRemoteRe @override String get searchHint => 'Søk på stasjonær...'; } +// Path: companionRemote.errors +class _TranslationsCompanionRemoteErrorsNb extends TranslationsCompanionRemoteErrorsEn { + _TranslationsCompanionRemoteErrorsNb._(TranslationsNb root) : this._root = root, super.internal(root); + + final TranslationsNb _root; // ignore: unused_field + + // Translations + @override String get noNetworkInterface => 'Fant ingen nettverksgrensesnitt'; + @override String get authenticationFailed => 'Autentisering mislyktes'; + @override String get joinTimedOut => 'Tidsavbrudd ved tilkobling til økt'; + @override String get failedToConnectAnyAddress => 'Kunne ikke koble til noen adresse'; + @override String connectionLostAfterAttempts({required Object attempts}) => 'Tilkobling mistet etter ${attempts} forsøk'; + @override String get connectionLost => 'Tilkobling mistet'; +} + // Path: trackers.services class _TranslationsTrackersServicesNb extends TranslationsTrackersServicesEn { _TranslationsTrackersServicesNb._(TranslationsNb root) : this._root = root, super.internal(root); @@ -1871,6 +1965,9 @@ extension on TranslationsNb { 'common.settings' => 'Innstillinger', 'common.mute' => 'Demp', 'common.ok' => 'OK', + 'common.off' => 'Av', + 'common.seasonNumber' => ({required Object number}) => 'Sesong ${number}', + 'common.chapterNumber' => ({required Object number}) => 'Kapittel ${number}', 'common.reconnect' => 'Koble til på nytt', 'common.exit' => 'Avslutt', 'common.viewAll' => 'Vis alle', @@ -2070,6 +2167,10 @@ extension on TranslationsNb { 'settings.dvConversionNative' => 'Innebygd / deaktivert', 'settings.dvConversionDv81' => 'P7 → P8.1', 'settings.dvConversionHevcStrip' => 'P7 → HEVC', + 'settings.dvConversionAutoDescription' => 'Bruk enhetens kapabilitetsdeteksjon og normal reserveoppførsel', + 'settings.dvConversionNativeDescription' => 'Tving native DV7 og undertrykk forsøk på DV-konvertering', + 'settings.dvConversionDv81Description' => 'Tving inline RPU-konvertering til Dolby Vision profil 8.1', + 'settings.dvConversionHevcStripDescription' => 'Fjern Dolby Vision RPU/EL-lag og presenter vanlig HEVC', 'settings.requireProfileSelectionOnOpen' => 'Spør om profil ved appåpning', 'settings.requireProfileSelectionOnOpenDescription' => 'Vis profilvalg hver gang appen åpnes', 'settings.forceTvMode' => 'Tving TV-modus', @@ -2099,6 +2200,8 @@ extension on TranslationsNb { 'search.enterTitleActorOrKeyword' => 'Skriv inn tittel, skuespiller eller nøkkelord', 'hotkeys.setShortcutFor' => ({required Object actionName}) => 'Angi snarvei for ${actionName}', 'hotkeys.clearShortcut' => 'Fjern snarvei', + 'hotkeys.noShortcutSet' => 'Ingen snarvei satt', + 'hotkeys.currentShortcut' => 'Gjeldende snarvei:', 'hotkeys.actions.playPause' => 'Spill av/Pause', 'hotkeys.actions.volumeUp' => 'Volum opp', 'hotkeys.actions.volumeDown' => 'Volum ned', @@ -2155,6 +2258,7 @@ extension on TranslationsNb { 'mediaMenu.goToSeries' => 'Gå til serie', 'mediaMenu.goToSeason' => 'Gå til sesong', 'mediaMenu.shufflePlay' => 'Tilfeldig avspilling', + 'mediaMenu.shuffleNotAvailableOffline' => 'Tilfeldig avspilling er ikke tilgjengelig offline', 'mediaMenu.fileInfo' => 'Filinformasjon', 'mediaMenu.deleteFromServer' => 'Slett fra server', 'mediaMenu.confirmDelete' => 'Slette dette mediet og filene fra serveren?', @@ -2263,6 +2367,10 @@ extension on TranslationsNb { 'videoControls.searchSubtitles' => 'Søk etter undertekster', 'videoControls.language' => 'Språk', 'videoControls.noSubtitlesFound' => 'Ingen undertekster funnet', + 'videoControls.downloadedSubtitle' => 'Lastet ned', + 'videoControls.noSubtitlesAvailable' => 'Ingen undertekster tilgjengelig', + 'videoControls.noAudioTracksAvailable' => 'Ingen lydspor tilgjengelig', + 'videoControls.noTracksAvailable' => 'Ingen spor tilgjengelig', 'videoControls.subtitleDownloaded' => 'Undertekst lastet ned', 'videoControls.subtitleDownloadFailed' => 'Kunne ikke laste ned undertekst', 'videoControls.searchLanguages' => 'Søk etter språk...', @@ -2321,6 +2429,8 @@ extension on TranslationsNb { 'subtitlingStyling.borderColor' => 'Kantfarge', 'subtitlingStyling.backgroundOpacity' => 'Bakgrunnsopasitet', 'subtitlingStyling.backgroundColor' => 'Bakgrunnsfarge', + _ => null, + } ?? switch (path) { 'subtitlingStyling.position' => 'Posisjon', 'subtitlingStyling.assOverride' => 'ASS-overstyring', 'subtitlingStyling.bold' => 'Fet', @@ -2335,8 +2445,6 @@ extension on TranslationsNb { 'mpvConfig.loadPreset' => 'Last inn', 'mpvConfig.deletePreset' => 'Slett', 'mpvConfig.presetSaved' => 'Forhåndsinnstilling lagret', - _ => null, - } ?? switch (path) { 'mpvConfig.presetLoaded' => 'Forhåndsinnstilling lastet inn', 'mpvConfig.presetDeleted' => 'Forhåndsinnstilling slettet', 'mpvConfig.confirmDeletePreset' => 'Er du sikker på at du vil slette denne forhåndsinnstillingen?', @@ -2399,6 +2507,7 @@ extension on TranslationsNb { 'profiles.pinExplain' => '4-sifret PIN kreves for å bytte profiler.', 'profiles.continueButton' => 'Fortsett', 'profiles.pinsDontMatch' => 'PIN-ene samsvarer ikke', + 'profiles.initializeServicesFailed' => 'Kunne ikke initialisere profiltjenester', 'connections.sectionTitle' => 'Tilkoblinger', 'connections.addConnection' => 'Legg til tilkobling', 'connections.addConnectionSubtitleNoProfile' => 'Logg inn med Plex eller koble til en Jellyfin-server', @@ -2427,6 +2536,7 @@ extension on TranslationsNb { 'discover.movie' => 'Film', 'discover.tvShow' => 'TV-serie', 'discover.minutesLeft' => ({required Object minutes}) => '${minutes} min igjen', + 'discover.moreLikeThis' => 'Mer som dette', 'errors.searchFailed' => ({required Object error}) => 'Søk mislyktes: ${error}', 'errors.connectionTimeout' => ({required Object context}) => 'Tidsavbrudd ved lasting av ${context}', 'errors.connectionFailed' => 'Kan ikke koble til medieserver', @@ -2441,6 +2551,7 @@ extension on TranslationsNb { 'errors.failedToDeleteProfile' => ({required Object displayName}) => 'Kunne ikke slette ${displayName}', 'errors.failedToRate' => 'Kunne ikke oppdatere vurderingen', 'libraries.title' => 'Biblioteker', + 'libraries.fallbackTitle' => 'Bibliotek', 'libraries.scanLibraryFiles' => 'Skann bibliotekfiler', 'libraries.scanLibrary' => 'Skann bibliotek', 'libraries.analyze' => 'Analyser', @@ -2541,6 +2652,12 @@ extension on TranslationsNb { 'liveTv.noChannels' => 'Ingen kanaler tilgjengelig', 'liveTv.noDvr' => 'Ingen DVR konfigurert på noen server', 'liveTv.noPrograms' => 'Ingen programdata tilgjengelig', + 'liveTv.liveStreamFailed' => 'Direktesending mislyktes', + 'liveTv.unknownProgram' => 'Ukjent program', + 'liveTv.unknownHub' => 'Ukjent', + 'liveTv.unknownError' => 'Ukjent feil', + 'liveTv.channelNumber' => ({required Object number}) => 'Kanal ${number}', + 'liveTv.unknownChannel' => 'Ukjent kanal', 'liveTv.live' => 'DIREKTE', 'liveTv.reloadGuide' => 'Last inn programguide på nytt', 'liveTv.now' => 'Nå', @@ -2711,12 +2828,21 @@ extension on TranslationsNb { 'downloads.deleteDownload' => 'Slett nedlasting', 'downloads.retryDownload' => 'Prøv nedlasting på nytt', 'downloads.downloadQueued' => 'Nedlasting i kø', + 'downloads.downloadResumed' => 'Nedlasting gjenopptatt', 'downloads.serverErrorBitrate' => 'Serverfeil: filen kan overskride grensen for ekstern bitrate', 'downloads.episodesQueued' => ({required Object count}) => '${count} episoder i nedlastingskø', 'downloads.downloadDeleted' => 'Nedlasting slettet', 'downloads.deleteConfirm' => ({required Object title}) => 'Slette "${title}" fra denne enheten?', - 'downloads.deletingWithProgress' => ({required Object title, required Object current, required Object total}) => 'Sletter ${title}... (${current} av ${total})', + 'downloads.cancelledDownloadTitle' => 'Avbrutt nedlasting', + 'downloads.cancelledDownloadMessage' => 'Denne nedlastingen ble avbrutt. Hva vil du gjøre?', + 'downloads.allEpisodesAlreadyDownloaded' => 'Alle episoder er allerede lastet ned', + 'downloads.resumeDownload' => 'Gjenoppta nedlasting', + 'downloads.cancelledDownload' => 'Avbrutt nedlasting', + 'downloads.syncingFile' => ({required Object file, required Object status}) => '${file} (synkroniserer ${status})', + 'downloads.downloadedFileClickToComplete' => ({required Object file}) => '${file} lastet ned – klikk for å fullføre', + 'downloads.partialDownloadClickToComplete' => 'Delvis lastet ned – klikk for å fullføre', 'downloads.deleting' => 'Sletter...', + 'downloads.deletingWithProgress' => ({required Object title, required Object current, required Object total}) => 'Sletter ${title}... (${current} av ${total})', 'downloads.queuedTooltip' => 'I kø', 'downloads.queuedFilesTooltip' => ({required Object files}) => 'I kø: ${files}', 'downloads.downloadingTooltip' => 'Laster ned...', @@ -2773,6 +2899,7 @@ extension on TranslationsNb { 'shaders.deleteShaderConfirm' => ({required Object name}) => 'Slette "${name}"?', 'companionRemote.title' => 'Følgesvenn-fjernkontroll', 'companionRemote.connectedTo' => ({required Object name}) => 'Tilkoblet ${name}', + 'companionRemote.unknownDevice' => 'Ukjent enhet', 'companionRemote.session.startingServer' => 'Starter fjernserver...', 'companionRemote.session.failedToCreate' => 'Kunne ikke starte fjernserver:', 'companionRemote.session.hostAddress' => 'Vertsadresse', @@ -2816,6 +2943,8 @@ extension on TranslationsNb { 'companionRemote.remote.tabSettings' => 'Innstillinger', 'companionRemote.remote.previous' => 'Forrige', 'companionRemote.remote.playPause' => 'Spill av/Pause', + _ => null, + } ?? switch (path) { 'companionRemote.remote.next' => 'Neste', 'companionRemote.remote.seekBack' => 'Spol tilbake', 'companionRemote.remote.stop' => 'Stopp', @@ -2827,6 +2956,12 @@ extension on TranslationsNb { 'companionRemote.remote.subtitles' => 'Undertekster', 'companionRemote.remote.audio' => 'Lyd', 'companionRemote.remote.searchHint' => 'Søk på stasjonær...', + 'companionRemote.errors.noNetworkInterface' => 'Fant ingen nettverksgrensesnitt', + 'companionRemote.errors.authenticationFailed' => 'Autentisering mislyktes', + 'companionRemote.errors.joinTimedOut' => 'Tidsavbrudd ved tilkobling til økt', + 'companionRemote.errors.failedToConnectAnyAddress' => 'Kunne ikke koble til noen adresse', + 'companionRemote.errors.connectionLostAfterAttempts' => ({required Object attempts}) => 'Tilkobling mistet etter ${attempts} forsøk', + 'companionRemote.errors.connectionLost' => 'Tilkobling mistet', 'videoSettings.playbackSpeed' => 'Avspillingshastighet', 'videoSettings.zoom' => 'Zoom', 'videoSettings.sleepTimer' => 'Søvntimer', @@ -2837,6 +2972,40 @@ extension on TranslationsNb { 'videoSettings.performanceOverlay' => 'Ytelsesoverlegg', 'videoSettings.audioPassthrough' => 'Lydgjennomgang', 'videoSettings.audioNormalization' => 'Normaliser lydstyrke', + 'performanceOverlay.color' => 'Farge', + 'performanceOverlay.performance' => 'Ytelse', + 'performanceOverlay.buffer' => 'Buffer', + 'performanceOverlay.app' => 'App', + 'performanceOverlay.decoder' => 'Dekoder', + 'performanceOverlay.rawDecoder' => 'Rå dekoder', + 'performanceOverlay.tunneling' => 'Tunneling', + 'performanceOverlay.aspect' => 'Format', + 'performanceOverlay.rotation' => 'Rotasjon', + 'performanceOverlay.dvSource' => 'DV-kilde', + 'performanceOverlay.dvPath' => 'DV-sti', + 'performanceOverlay.p7Conversion' => 'P7-konv.', + 'performanceOverlay.sampleRate' => 'Samplingsrate', + 'performanceOverlay.pixelFormat' => 'Pikselformat', + 'performanceOverlay.hwFormat' => 'HW-format', + 'performanceOverlay.matrix' => 'Matrise', + 'performanceOverlay.primaries' => 'Primærfarger', + 'performanceOverlay.transfer' => 'Overføring', + 'performanceOverlay.renderFps' => 'Render-FPS', + 'performanceOverlay.displayFps' => 'Skjerm-FPS', + 'performanceOverlay.avSync' => 'A/V-synk', + 'performanceOverlay.dropped' => 'Droppet', + 'performanceOverlay.dvRpus' => 'DV RPU-er', + 'performanceOverlay.dvRpuAverage' => 'DV RPU snitt', + 'performanceOverlay.dvSampleAverage' => 'DV-sample snitt', + 'performanceOverlay.maxLuma' => 'Maks luma', + 'performanceOverlay.minLuma' => 'Min luma', + 'performanceOverlay.maxCll' => 'MaxCLL', + 'performanceOverlay.maxFall' => 'MaxFALL', + 'performanceOverlay.cacheUsed' => 'Cache brukt', + 'performanceOverlay.speed' => 'Hastighet', + 'performanceOverlay.player' => 'Spiller', + 'performanceOverlay.memory' => 'Minne', + 'performanceOverlay.uiFps' => 'UI FPS', 'externalPlayer.title' => 'Ekstern spiller', 'externalPlayer.useExternalPlayer' => 'Bruk ekstern spiller', 'externalPlayer.useExternalPlayerDescription' => 'Åpne videoer i en annen app', @@ -2845,12 +3014,11 @@ extension on TranslationsNb { 'externalPlayer.systemDefault' => 'Systemstandard', 'externalPlayer.addCustomPlayer' => 'Legg til egendefinert spiller', 'externalPlayer.playerName' => 'Spillernavn', + 'externalPlayer.playerNameHint' => 'Min spiller', 'externalPlayer.playerCommand' => 'Kommando', 'externalPlayer.playerPackage' => 'Pakkenavn', 'externalPlayer.playerUrlScheme' => 'URL-skjema', 'externalPlayer.off' => 'Av', - _ => null, - } ?? switch (path) { 'externalPlayer.launchFailed' => 'Kunne ikke åpne ekstern spiller', 'externalPlayer.appNotInstalled' => ({required Object name}) => '${name} er ikke installert', 'externalPlayer.playInExternalPlayer' => 'Spill av i ekstern spiller', diff --git a/lib/i18n/strings_nl.g.dart b/lib/i18n/strings_nl.g.dart index 1b9ef0da..3dab0586 100644 --- a/lib/i18n/strings_nl.g.dart +++ b/lib/i18n/strings_nl.g.dart @@ -77,6 +77,7 @@ class TranslationsNl extends Translations with BaseTranslations 'Opties'; @override String get mute => 'Dempen'; @override String get ok => 'OK'; + @override String get off => 'Uit'; + @override String seasonNumber({required Object number}) => 'Seizoen ${number}'; + @override String chapterNumber({required Object number}) => 'Hoofdstuk ${number}'; @override String get reconnect => 'Opnieuw verbinden'; @override String get exit => 'Afsluiten'; @override String get viewAll => 'Alles weergeven'; @@ -385,6 +389,10 @@ class _TranslationsSettingsNl extends TranslationsSettingsEn { @override String get dvConversionNative => 'Native / uitgeschakeld'; @override String get dvConversionDv81 => 'P7 → P8.1'; @override String get dvConversionHevcStrip => 'P7 → HEVC'; + @override String get dvConversionAutoDescription => 'Gebruik apparaatdetectie en normaal fallbackgedrag'; + @override String get dvConversionNativeDescription => 'Forceer native DV7 en onderdruk DV-conversie opnieuw proberen'; + @override String get dvConversionDv81Description => 'Forceer inline RPU-conversie naar Dolby Vision-profiel 8.1'; + @override String get dvConversionHevcStripDescription => 'Strip Dolby Vision RPU/EL-lagen en presenteer gewone HEVC'; @override String get requireProfileSelectionOnOpen => 'Vraag om profiel bij openen'; @override String get requireProfileSelectionOnOpenDescription => 'Toon profielselectie telkens wanneer de app wordt geopend'; @override String get forceTvMode => 'TV-modus forceren'; @@ -432,6 +440,8 @@ class _TranslationsHotkeysNl extends TranslationsHotkeysEn { // Translations @override String setShortcutFor({required Object actionName}) => 'Stel sneltoets in voor ${actionName}'; @override String get clearShortcut => 'Wis sneltoets'; + @override String get noShortcutSet => 'Geen sneltoets ingesteld'; + @override String get currentShortcut => 'Huidige sneltoets:'; @override late final _TranslationsHotkeysActionsNl actions = _TranslationsHotkeysActionsNl._(_root); } @@ -482,6 +492,7 @@ class _TranslationsMediaMenuNl extends TranslationsMediaMenuEn { @override String get goToSeries => 'Ga naar serie'; @override String get goToSeason => 'Ga naar seizoen'; @override String get shufflePlay => 'Willekeurig afspelen'; + @override String get shuffleNotAvailableOffline => 'Shuffle is offline niet beschikbaar'; @override String get fileInfo => 'Bestand info'; @override String get deleteFromServer => 'Verwijderen van server'; @override String get confirmDelete => 'Deze media en bestanden van je server verwijderen?'; @@ -620,6 +631,10 @@ class _TranslationsVideoControlsNl extends TranslationsVideoControlsEn { @override String get searchSubtitles => 'Ondertitels zoeken'; @override String get language => 'Taal'; @override String get noSubtitlesFound => 'Geen ondertitels gevonden'; + @override String get downloadedSubtitle => 'Gedownload'; + @override String get noSubtitlesAvailable => 'Geen ondertitels beschikbaar'; + @override String get noAudioTracksAvailable => 'Geen audiotracks beschikbaar'; + @override String get noTracksAvailable => 'Geen tracks beschikbaar'; @override String get subtitleDownloaded => 'Ondertitel gedownload'; @override String get subtitleDownloadFailed => 'Ondertitel downloaden mislukt'; @override String get searchLanguages => 'Talen zoeken...'; @@ -808,6 +823,7 @@ class _TranslationsProfilesNl extends TranslationsProfilesEn { @override String get pinExplain => '4-cijferige PIN vereist om profielen te wisselen.'; @override String get continueButton => 'Doorgaan'; @override String get pinsDontMatch => 'PIN-codes komen niet overeen'; + @override String get initializeServicesFailed => 'Kan profielservices niet initialiseren'; } // Path: connections @@ -854,6 +870,7 @@ class _TranslationsDiscoverNl extends TranslationsDiscoverEn { @override String get movie => 'Film'; @override String get tvShow => 'TV Serie'; @override String minutesLeft({required Object minutes}) => '${minutes} min over'; + @override String get moreLikeThis => 'Meer zoals dit'; } // Path: errors @@ -886,6 +903,7 @@ class _TranslationsLibrariesNl extends TranslationsLibrariesEn { // Translations @override String get title => 'Bibliotheken'; + @override String get fallbackTitle => 'Bibliotheek'; @override String get scanLibraryFiles => 'Scan bibliotheek bestanden'; @override String get scanLibrary => 'Scan bibliotheek'; @override String get analyze => 'Analyseren'; @@ -1018,6 +1036,12 @@ class _TranslationsLiveTvNl extends TranslationsLiveTvEn { @override String get noChannels => 'Geen zenders beschikbaar'; @override String get noDvr => 'Geen DVR geconfigureerd op een server'; @override String get noPrograms => 'Geen programmagegevens beschikbaar'; + @override String get liveStreamFailed => 'Livestream mislukt'; + @override String get unknownProgram => 'Onbekend programma'; + @override String get unknownHub => 'Onbekend'; + @override String get unknownError => 'Onbekende fout'; + @override String channelNumber({required Object number}) => 'Kanaal ${number}'; + @override String get unknownChannel => 'Onbekend kanaal'; @override String get live => 'LIVE'; @override String get reloadGuide => 'Gids herladen'; @override String get now => 'Nu'; @@ -1224,12 +1248,21 @@ class _TranslationsDownloadsNl extends TranslationsDownloadsEn { @override String get deleteDownload => 'Download verwijderen'; @override String get retryDownload => 'Download opnieuw proberen'; @override String get downloadQueued => 'Download in wachtrij'; + @override String get downloadResumed => 'Download hervat'; @override String get serverErrorBitrate => 'Serverfout: bestand overschrijdt mogelijk de externe bitrate-limiet'; @override String episodesQueued({required Object count}) => '${count} afleveringen in wachtrij voor download'; @override String get downloadDeleted => 'Download verwijderd'; @override String deleteConfirm({required Object title}) => '"${title}" van dit apparaat verwijderen?'; - @override String deletingWithProgress({required Object title, required Object current, required Object total}) => 'Verwijderen van ${title}... (${current} van ${total})'; + @override String get cancelledDownloadTitle => 'Geannuleerde download'; + @override String get cancelledDownloadMessage => 'Deze download is geannuleerd. Wat wil je doen?'; + @override String get allEpisodesAlreadyDownloaded => 'Alle afleveringen zijn al gedownload'; + @override String get resumeDownload => 'Download hervatten'; + @override String get cancelledDownload => 'Geannuleerde download'; + @override String syncingFile({required Object file, required Object status}) => '${file} (${status} synchroniseren)'; + @override String downloadedFileClickToComplete({required Object file}) => '${file} gedownload — klik om te voltooien'; + @override String get partialDownloadClickToComplete => 'Gedeeltelijk gedownload — klik om te voltooien'; @override String get deleting => 'Verwijderen...'; + @override String deletingWithProgress({required Object title, required Object current, required Object total}) => 'Verwijderen van ${title}... (${current} van ${total})'; @override String get queuedTooltip => 'In wachtrij'; @override String queuedFilesTooltip({required Object files}) => 'In wachtrij: ${files}'; @override String get downloadingTooltip => 'Downloaden...'; @@ -1304,9 +1337,11 @@ class _TranslationsCompanionRemoteNl extends TranslationsCompanionRemoteEn { // Translations @override String get title => 'Afstandsbediening'; @override String connectedTo({required Object name}) => 'Verbonden met ${name}'; + @override String get unknownDevice => 'Onbekend apparaat'; @override late final _TranslationsCompanionRemoteSessionNl session = _TranslationsCompanionRemoteSessionNl._(_root); @override late final _TranslationsCompanionRemotePairingNl pairing = _TranslationsCompanionRemotePairingNl._(_root); @override late final _TranslationsCompanionRemoteRemoteNl remote = _TranslationsCompanionRemoteRemoteNl._(_root); + @override late final _TranslationsCompanionRemoteErrorsNl errors = _TranslationsCompanionRemoteErrorsNl._(_root); } // Path: videoSettings @@ -1328,6 +1363,49 @@ class _TranslationsVideoSettingsNl extends TranslationsVideoSettingsEn { @override String get audioNormalization => 'Volume normaliseren'; } +// Path: performanceOverlay +class _TranslationsPerformanceOverlayNl extends TranslationsPerformanceOverlayEn { + _TranslationsPerformanceOverlayNl._(TranslationsNl root) : this._root = root, super.internal(root); + + final TranslationsNl _root; // ignore: unused_field + + // Translations + @override String get color => 'Kleur'; + @override String get performance => 'Prestaties'; + @override String get buffer => 'Buffer'; + @override String get app => 'App'; + @override String get decoder => 'Decoder'; + @override String get rawDecoder => 'Raw decoder'; + @override String get tunneling => 'Tunneling'; + @override String get aspect => 'Verhouding'; + @override String get rotation => 'Rotatie'; + @override String get dvSource => 'DV-bron'; + @override String get dvPath => 'DV-pad'; + @override String get p7Conversion => 'P7-conv.'; + @override String get sampleRate => 'Samplefrequentie'; + @override String get pixelFormat => 'Pixelformaat'; + @override String get hwFormat => 'HW-formaat'; + @override String get matrix => 'Matrix'; + @override String get primaries => 'Primaire kleuren'; + @override String get transfer => 'Transfer'; + @override String get renderFps => 'Render-FPS'; + @override String get displayFps => 'Scherm-FPS'; + @override String get avSync => 'A/V-sync'; + @override String get dropped => 'Gedropt'; + @override String get dvRpus => 'DV RPU’s'; + @override String get dvRpuAverage => 'DV RPU gem.'; + @override String get dvSampleAverage => 'DV-sample gem.'; + @override String get maxLuma => 'Max luma'; + @override String get minLuma => 'Min luma'; + @override String get maxCll => 'MaxCLL'; + @override String get maxFall => 'MaxFALL'; + @override String get cacheUsed => 'Cache gebruikt'; + @override String get speed => 'Snelheid'; + @override String get player => 'Speler'; + @override String get memory => 'Geheugen'; + @override String get uiFps => 'UI FPS'; +} + // Path: externalPlayer class _TranslationsExternalPlayerNl extends TranslationsExternalPlayerEn { _TranslationsExternalPlayerNl._(TranslationsNl root) : this._root = root, super.internal(root); @@ -1343,6 +1421,7 @@ class _TranslationsExternalPlayerNl extends TranslationsExternalPlayerEn { @override String get systemDefault => 'Systeemstandaard'; @override String get addCustomPlayer => 'Aangepaste speler toevoegen'; @override String get playerName => 'Spelernaam'; + @override String get playerNameHint => 'Mijn speler'; @override String get playerCommand => 'Commando'; @override String get playerPackage => 'Pakketnaam'; @override String get playerUrlScheme => 'URL-schema'; @@ -1755,6 +1834,21 @@ class _TranslationsCompanionRemoteRemoteNl extends TranslationsCompanionRemoteRe @override String get searchHint => 'Zoeken op desktop...'; } +// Path: companionRemote.errors +class _TranslationsCompanionRemoteErrorsNl extends TranslationsCompanionRemoteErrorsEn { + _TranslationsCompanionRemoteErrorsNl._(TranslationsNl root) : this._root = root, super.internal(root); + + final TranslationsNl _root; // ignore: unused_field + + // Translations + @override String get noNetworkInterface => 'Geen netwerkinterface gevonden'; + @override String get authenticationFailed => 'Authenticatie mislukt'; + @override String get joinTimedOut => 'Time-out bij deelnemen aan sessie'; + @override String get failedToConnectAnyAddress => 'Kan met geen enkel adres verbinden'; + @override String connectionLostAfterAttempts({required Object attempts}) => 'Verbinding verloren na ${attempts} pogingen'; + @override String get connectionLost => 'Verbinding verloren'; +} + // Path: trackers.services class _TranslationsTrackersServicesNl extends TranslationsTrackersServicesEn { _TranslationsTrackersServicesNl._(TranslationsNl root) : this._root = root, super.internal(root); @@ -1871,6 +1965,9 @@ extension on TranslationsNl { 'common.settings' => 'Opties', 'common.mute' => 'Dempen', 'common.ok' => 'OK', + 'common.off' => 'Uit', + 'common.seasonNumber' => ({required Object number}) => 'Seizoen ${number}', + 'common.chapterNumber' => ({required Object number}) => 'Hoofdstuk ${number}', 'common.reconnect' => 'Opnieuw verbinden', 'common.exit' => 'Afsluiten', 'common.viewAll' => 'Alles weergeven', @@ -2070,6 +2167,10 @@ extension on TranslationsNl { 'settings.dvConversionNative' => 'Native / uitgeschakeld', 'settings.dvConversionDv81' => 'P7 → P8.1', 'settings.dvConversionHevcStrip' => 'P7 → HEVC', + 'settings.dvConversionAutoDescription' => 'Gebruik apparaatdetectie en normaal fallbackgedrag', + 'settings.dvConversionNativeDescription' => 'Forceer native DV7 en onderdruk DV-conversie opnieuw proberen', + 'settings.dvConversionDv81Description' => 'Forceer inline RPU-conversie naar Dolby Vision-profiel 8.1', + 'settings.dvConversionHevcStripDescription' => 'Strip Dolby Vision RPU/EL-lagen en presenteer gewone HEVC', 'settings.requireProfileSelectionOnOpen' => 'Vraag om profiel bij openen', 'settings.requireProfileSelectionOnOpenDescription' => 'Toon profielselectie telkens wanneer de app wordt geopend', 'settings.forceTvMode' => 'TV-modus forceren', @@ -2099,6 +2200,8 @@ extension on TranslationsNl { 'search.enterTitleActorOrKeyword' => 'Voer een titel, acteur of trefwoord in', 'hotkeys.setShortcutFor' => ({required Object actionName}) => 'Stel sneltoets in voor ${actionName}', 'hotkeys.clearShortcut' => 'Wis sneltoets', + 'hotkeys.noShortcutSet' => 'Geen sneltoets ingesteld', + 'hotkeys.currentShortcut' => 'Huidige sneltoets:', 'hotkeys.actions.playPause' => 'Afspelen/Pauzeren', 'hotkeys.actions.volumeUp' => 'Volume omhoog', 'hotkeys.actions.volumeDown' => 'Volume omlaag', @@ -2155,6 +2258,7 @@ extension on TranslationsNl { 'mediaMenu.goToSeries' => 'Ga naar serie', 'mediaMenu.goToSeason' => 'Ga naar seizoen', 'mediaMenu.shufflePlay' => 'Willekeurig afspelen', + 'mediaMenu.shuffleNotAvailableOffline' => 'Shuffle is offline niet beschikbaar', 'mediaMenu.fileInfo' => 'Bestand info', 'mediaMenu.deleteFromServer' => 'Verwijderen van server', 'mediaMenu.confirmDelete' => 'Deze media en bestanden van je server verwijderen?', @@ -2263,6 +2367,10 @@ extension on TranslationsNl { 'videoControls.searchSubtitles' => 'Ondertitels zoeken', 'videoControls.language' => 'Taal', 'videoControls.noSubtitlesFound' => 'Geen ondertitels gevonden', + 'videoControls.downloadedSubtitle' => 'Gedownload', + 'videoControls.noSubtitlesAvailable' => 'Geen ondertitels beschikbaar', + 'videoControls.noAudioTracksAvailable' => 'Geen audiotracks beschikbaar', + 'videoControls.noTracksAvailable' => 'Geen tracks beschikbaar', 'videoControls.subtitleDownloaded' => 'Ondertitel gedownload', 'videoControls.subtitleDownloadFailed' => 'Ondertitel downloaden mislukt', 'videoControls.searchLanguages' => 'Talen zoeken...', @@ -2321,6 +2429,8 @@ extension on TranslationsNl { 'subtitlingStyling.borderColor' => 'Randkleur', 'subtitlingStyling.backgroundOpacity' => 'Achtergrond transparantie', 'subtitlingStyling.backgroundColor' => 'Achtergrondkleur', + _ => null, + } ?? switch (path) { 'subtitlingStyling.position' => 'Positie', 'subtitlingStyling.assOverride' => 'ASS-overschrijving', 'subtitlingStyling.bold' => 'Vet', @@ -2335,8 +2445,6 @@ extension on TranslationsNl { 'mpvConfig.loadPreset' => 'Laden', 'mpvConfig.deletePreset' => 'Verwijderen', 'mpvConfig.presetSaved' => 'Voorinstelling opgeslagen', - _ => null, - } ?? switch (path) { 'mpvConfig.presetLoaded' => 'Voorinstelling geladen', 'mpvConfig.presetDeleted' => 'Voorinstelling verwijderd', 'mpvConfig.confirmDeletePreset' => 'Weet je zeker dat je deze voorinstelling wilt verwijderen?', @@ -2399,6 +2507,7 @@ extension on TranslationsNl { 'profiles.pinExplain' => '4-cijferige PIN vereist om profielen te wisselen.', 'profiles.continueButton' => 'Doorgaan', 'profiles.pinsDontMatch' => 'PIN-codes komen niet overeen', + 'profiles.initializeServicesFailed' => 'Kan profielservices niet initialiseren', 'connections.sectionTitle' => 'Verbindingen', 'connections.addConnection' => 'Verbinding toevoegen', 'connections.addConnectionSubtitleNoProfile' => 'Meld je aan met Plex of verbind een Jellyfin-server', @@ -2427,6 +2536,7 @@ extension on TranslationsNl { 'discover.movie' => 'Film', 'discover.tvShow' => 'TV Serie', 'discover.minutesLeft' => ({required Object minutes}) => '${minutes} min over', + 'discover.moreLikeThis' => 'Meer zoals dit', 'errors.searchFailed' => ({required Object error}) => 'Zoeken mislukt: ${error}', 'errors.connectionTimeout' => ({required Object context}) => 'Verbinding time-out tijdens laden ${context}', 'errors.connectionFailed' => 'Kan geen verbinding maken met mediaserver', @@ -2441,6 +2551,7 @@ extension on TranslationsNl { 'errors.failedToDeleteProfile' => ({required Object displayName}) => 'Kon ${displayName} niet verwijderen', 'errors.failedToRate' => 'Beoordeling kon niet worden bijgewerkt', 'libraries.title' => 'Bibliotheken', + 'libraries.fallbackTitle' => 'Bibliotheek', 'libraries.scanLibraryFiles' => 'Scan bibliotheek bestanden', 'libraries.scanLibrary' => 'Scan bibliotheek', 'libraries.analyze' => 'Analyseren', @@ -2541,6 +2652,12 @@ extension on TranslationsNl { 'liveTv.noChannels' => 'Geen zenders beschikbaar', 'liveTv.noDvr' => 'Geen DVR geconfigureerd op een server', 'liveTv.noPrograms' => 'Geen programmagegevens beschikbaar', + 'liveTv.liveStreamFailed' => 'Livestream mislukt', + 'liveTv.unknownProgram' => 'Onbekend programma', + 'liveTv.unknownHub' => 'Onbekend', + 'liveTv.unknownError' => 'Onbekende fout', + 'liveTv.channelNumber' => ({required Object number}) => 'Kanaal ${number}', + 'liveTv.unknownChannel' => 'Onbekend kanaal', 'liveTv.live' => 'LIVE', 'liveTv.reloadGuide' => 'Gids herladen', 'liveTv.now' => 'Nu', @@ -2711,12 +2828,21 @@ extension on TranslationsNl { 'downloads.deleteDownload' => 'Download verwijderen', 'downloads.retryDownload' => 'Download opnieuw proberen', 'downloads.downloadQueued' => 'Download in wachtrij', + 'downloads.downloadResumed' => 'Download hervat', 'downloads.serverErrorBitrate' => 'Serverfout: bestand overschrijdt mogelijk de externe bitrate-limiet', 'downloads.episodesQueued' => ({required Object count}) => '${count} afleveringen in wachtrij voor download', 'downloads.downloadDeleted' => 'Download verwijderd', 'downloads.deleteConfirm' => ({required Object title}) => '"${title}" van dit apparaat verwijderen?', - 'downloads.deletingWithProgress' => ({required Object title, required Object current, required Object total}) => 'Verwijderen van ${title}... (${current} van ${total})', + 'downloads.cancelledDownloadTitle' => 'Geannuleerde download', + 'downloads.cancelledDownloadMessage' => 'Deze download is geannuleerd. Wat wil je doen?', + 'downloads.allEpisodesAlreadyDownloaded' => 'Alle afleveringen zijn al gedownload', + 'downloads.resumeDownload' => 'Download hervatten', + 'downloads.cancelledDownload' => 'Geannuleerde download', + 'downloads.syncingFile' => ({required Object file, required Object status}) => '${file} (${status} synchroniseren)', + 'downloads.downloadedFileClickToComplete' => ({required Object file}) => '${file} gedownload — klik om te voltooien', + 'downloads.partialDownloadClickToComplete' => 'Gedeeltelijk gedownload — klik om te voltooien', 'downloads.deleting' => 'Verwijderen...', + 'downloads.deletingWithProgress' => ({required Object title, required Object current, required Object total}) => 'Verwijderen van ${title}... (${current} van ${total})', 'downloads.queuedTooltip' => 'In wachtrij', 'downloads.queuedFilesTooltip' => ({required Object files}) => 'In wachtrij: ${files}', 'downloads.downloadingTooltip' => 'Downloaden...', @@ -2773,6 +2899,7 @@ extension on TranslationsNl { 'shaders.deleteShaderConfirm' => ({required Object name}) => '"${name}" verwijderen?', 'companionRemote.title' => 'Afstandsbediening', 'companionRemote.connectedTo' => ({required Object name}) => 'Verbonden met ${name}', + 'companionRemote.unknownDevice' => 'Onbekend apparaat', 'companionRemote.session.startingServer' => 'Externe server starten...', 'companionRemote.session.failedToCreate' => 'Kan externe server niet starten:', 'companionRemote.session.hostAddress' => 'Hostadres', @@ -2816,6 +2943,8 @@ extension on TranslationsNl { 'companionRemote.remote.tabSettings' => 'Instellingen', 'companionRemote.remote.previous' => 'Vorige', 'companionRemote.remote.playPause' => 'Afspelen/Pauzeren', + _ => null, + } ?? switch (path) { 'companionRemote.remote.next' => 'Volgende', 'companionRemote.remote.seekBack' => 'Terugspoelen', 'companionRemote.remote.stop' => 'Stoppen', @@ -2827,6 +2956,12 @@ extension on TranslationsNl { 'companionRemote.remote.subtitles' => 'Ondertitels', 'companionRemote.remote.audio' => 'Audio', 'companionRemote.remote.searchHint' => 'Zoeken op desktop...', + 'companionRemote.errors.noNetworkInterface' => 'Geen netwerkinterface gevonden', + 'companionRemote.errors.authenticationFailed' => 'Authenticatie mislukt', + 'companionRemote.errors.joinTimedOut' => 'Time-out bij deelnemen aan sessie', + 'companionRemote.errors.failedToConnectAnyAddress' => 'Kan met geen enkel adres verbinden', + 'companionRemote.errors.connectionLostAfterAttempts' => ({required Object attempts}) => 'Verbinding verloren na ${attempts} pogingen', + 'companionRemote.errors.connectionLost' => 'Verbinding verloren', 'videoSettings.playbackSpeed' => 'Afspeelsnelheid', 'videoSettings.zoom' => 'Zoom', 'videoSettings.sleepTimer' => 'Slaaptimer', @@ -2837,6 +2972,40 @@ extension on TranslationsNl { 'videoSettings.performanceOverlay' => 'Prestatie-overlay', 'videoSettings.audioPassthrough' => 'Audio-doorvoer', 'videoSettings.audioNormalization' => 'Volume normaliseren', + 'performanceOverlay.color' => 'Kleur', + 'performanceOverlay.performance' => 'Prestaties', + 'performanceOverlay.buffer' => 'Buffer', + 'performanceOverlay.app' => 'App', + 'performanceOverlay.decoder' => 'Decoder', + 'performanceOverlay.rawDecoder' => 'Raw decoder', + 'performanceOverlay.tunneling' => 'Tunneling', + 'performanceOverlay.aspect' => 'Verhouding', + 'performanceOverlay.rotation' => 'Rotatie', + 'performanceOverlay.dvSource' => 'DV-bron', + 'performanceOverlay.dvPath' => 'DV-pad', + 'performanceOverlay.p7Conversion' => 'P7-conv.', + 'performanceOverlay.sampleRate' => 'Samplefrequentie', + 'performanceOverlay.pixelFormat' => 'Pixelformaat', + 'performanceOverlay.hwFormat' => 'HW-formaat', + 'performanceOverlay.matrix' => 'Matrix', + 'performanceOverlay.primaries' => 'Primaire kleuren', + 'performanceOverlay.transfer' => 'Transfer', + 'performanceOverlay.renderFps' => 'Render-FPS', + 'performanceOverlay.displayFps' => 'Scherm-FPS', + 'performanceOverlay.avSync' => 'A/V-sync', + 'performanceOverlay.dropped' => 'Gedropt', + 'performanceOverlay.dvRpus' => 'DV RPU’s', + 'performanceOverlay.dvRpuAverage' => 'DV RPU gem.', + 'performanceOverlay.dvSampleAverage' => 'DV-sample gem.', + 'performanceOverlay.maxLuma' => 'Max luma', + 'performanceOverlay.minLuma' => 'Min luma', + 'performanceOverlay.maxCll' => 'MaxCLL', + 'performanceOverlay.maxFall' => 'MaxFALL', + 'performanceOverlay.cacheUsed' => 'Cache gebruikt', + 'performanceOverlay.speed' => 'Snelheid', + 'performanceOverlay.player' => 'Speler', + 'performanceOverlay.memory' => 'Geheugen', + 'performanceOverlay.uiFps' => 'UI FPS', 'externalPlayer.title' => 'Externe speler', 'externalPlayer.useExternalPlayer' => 'Externe speler gebruiken', 'externalPlayer.useExternalPlayerDescription' => 'Open video\'s in een andere app', @@ -2845,12 +3014,11 @@ extension on TranslationsNl { 'externalPlayer.systemDefault' => 'Systeemstandaard', 'externalPlayer.addCustomPlayer' => 'Aangepaste speler toevoegen', 'externalPlayer.playerName' => 'Spelernaam', + 'externalPlayer.playerNameHint' => 'Mijn speler', 'externalPlayer.playerCommand' => 'Commando', 'externalPlayer.playerPackage' => 'Pakketnaam', 'externalPlayer.playerUrlScheme' => 'URL-schema', 'externalPlayer.off' => 'Uit', - _ => null, - } ?? switch (path) { 'externalPlayer.launchFailed' => 'Kan externe speler niet openen', 'externalPlayer.appNotInstalled' => ({required Object name}) => '${name} is niet geïnstalleerd', 'externalPlayer.playInExternalPlayer' => 'Afspelen in externe speler', diff --git a/lib/i18n/strings_pl.g.dart b/lib/i18n/strings_pl.g.dart index d0c1b6ed..70547888 100644 --- a/lib/i18n/strings_pl.g.dart +++ b/lib/i18n/strings_pl.g.dart @@ -77,6 +77,7 @@ class TranslationsPl extends Translations with BaseTranslations 'Ustawienia'; @override String get mute => 'Wycisz'; @override String get ok => 'OK'; + @override String get off => 'Wył.'; + @override String seasonNumber({required Object number}) => 'Sezon ${number}'; + @override String chapterNumber({required Object number}) => 'Rozdział ${number}'; @override String get reconnect => 'Połącz ponownie'; @override String get exit => 'Wyjdź'; @override String get viewAll => 'Pokaż wszystko'; @@ -385,6 +389,10 @@ class _TranslationsSettingsPl extends TranslationsSettingsEn { @override String get dvConversionNative => 'Natywnie / wyłączone'; @override String get dvConversionDv81 => 'P7 → P8.1'; @override String get dvConversionHevcStrip => 'P7 → HEVC'; + @override String get dvConversionAutoDescription => 'Użyj wykrywania możliwości urządzenia i normalnego zachowania awaryjnego'; + @override String get dvConversionNativeDescription => 'Wymuś natywne DV7 i wyłącz ponowną próbę konwersji DV'; + @override String get dvConversionDv81Description => 'Wymuś wbudowaną konwersję RPU do profilu Dolby Vision 8.1'; + @override String get dvConversionHevcStripDescription => 'Usuń warstwy Dolby Vision RPU/EL i przedstaw zwykłe HEVC'; @override String get requireProfileSelectionOnOpen => 'Pytaj o profil przy otwarciu aplikacji'; @override String get requireProfileSelectionOnOpenDescription => 'Pokaż wybór profilu za każdym razem, gdy aplikacja jest otwierana'; @override String get forceTvMode => 'Wymuś tryb TV'; @@ -432,6 +440,8 @@ class _TranslationsHotkeysPl extends TranslationsHotkeysEn { // Translations @override String setShortcutFor({required Object actionName}) => 'Ustaw skrót dla ${actionName}'; @override String get clearShortcut => 'Wyczyść skrót'; + @override String get noShortcutSet => 'Brak ustawionego skrótu'; + @override String get currentShortcut => 'Bieżący skrót:'; @override late final _TranslationsHotkeysActionsPl actions = _TranslationsHotkeysActionsPl._(_root); } @@ -482,6 +492,7 @@ class _TranslationsMediaMenuPl extends TranslationsMediaMenuEn { @override String get goToSeries => 'Przejdź do serialu'; @override String get goToSeason => 'Przejdź do sezonu'; @override String get shufflePlay => 'Odtwarzanie losowe'; + @override String get shuffleNotAvailableOffline => 'Odtwarzanie losowe nie jest dostępne offline'; @override String get fileInfo => 'Informacje o pliku'; @override String get deleteFromServer => 'Usuń z serwera'; @override String get confirmDelete => 'Usunąć to medium i jego pliki z serwera?'; @@ -620,6 +631,10 @@ class _TranslationsVideoControlsPl extends TranslationsVideoControlsEn { @override String get searchSubtitles => 'Szukaj napisów'; @override String get language => 'Język'; @override String get noSubtitlesFound => 'Nie znaleziono napisów'; + @override String get downloadedSubtitle => 'Pobrano'; + @override String get noSubtitlesAvailable => 'Brak dostępnych napisów'; + @override String get noAudioTracksAvailable => 'Brak dostępnych ścieżek audio'; + @override String get noTracksAvailable => 'Brak dostępnych ścieżek'; @override String get subtitleDownloaded => 'Napisy pobrane'; @override String get subtitleDownloadFailed => 'Nie udało się pobrać napisów'; @override String get searchLanguages => 'Szukaj języków...'; @@ -808,6 +823,7 @@ class _TranslationsProfilesPl extends TranslationsProfilesEn { @override String get pinExplain => 'Do przełączania profili wymagany jest 4-cyfrowy PIN.'; @override String get continueButton => 'Kontynuuj'; @override String get pinsDontMatch => 'PIN-y nie pasują'; + @override String get initializeServicesFailed => 'Nie udało się zainicjować usług profilu'; } // Path: connections @@ -854,6 +870,7 @@ class _TranslationsDiscoverPl extends TranslationsDiscoverEn { @override String get movie => 'Film'; @override String get tvShow => 'Serial TV'; @override String minutesLeft({required Object minutes}) => '${minutes} min pozostało'; + @override String get moreLikeThis => 'Więcej podobnych'; } // Path: errors @@ -886,6 +903,7 @@ class _TranslationsLibrariesPl extends TranslationsLibrariesEn { // Translations @override String get title => 'Biblioteki'; + @override String get fallbackTitle => 'Biblioteka'; @override String get scanLibraryFiles => 'Skanuj pliki biblioteki'; @override String get scanLibrary => 'Skanuj bibliotekę'; @override String get analyze => 'Analizuj'; @@ -1018,6 +1036,12 @@ class _TranslationsLiveTvPl extends TranslationsLiveTvEn { @override String get noChannels => 'Brak dostępnych kanałów'; @override String get noDvr => 'Brak skonfigurowanego DVR na żadnym serwerze'; @override String get noPrograms => 'Brak danych o programach'; + @override String get liveStreamFailed => 'Transmisja na żywo nie powiodła się'; + @override String get unknownProgram => 'Nieznany program'; + @override String get unknownHub => 'Nieznane'; + @override String get unknownError => 'Nieznany błąd'; + @override String channelNumber({required Object number}) => 'Kanał ${number}'; + @override String get unknownChannel => 'Nieznany kanał'; @override String get live => 'NA ŻYWO'; @override String get reloadGuide => 'Odśwież przewodnik'; @override String get now => 'Teraz'; @@ -1224,12 +1248,21 @@ class _TranslationsDownloadsPl extends TranslationsDownloadsEn { @override String get deleteDownload => 'Usuń pobranie'; @override String get retryDownload => 'Ponów pobieranie'; @override String get downloadQueued => 'Pobranie w kolejce'; + @override String get downloadResumed => 'Pobieranie wznowione'; @override String get serverErrorBitrate => 'Błąd serwera: plik może przekraczać zdalny limit bitrate'; @override String episodesQueued({required Object count}) => '${count} odcinków w kolejce pobierania'; @override String get downloadDeleted => 'Pobranie usunięte'; @override String deleteConfirm({required Object title}) => 'Usunąć "${title}" z tego urządzenia?'; - @override String deletingWithProgress({required Object title, required Object current, required Object total}) => 'Usuwanie ${title}... (${current} z ${total})'; + @override String get cancelledDownloadTitle => 'Anulowane pobieranie'; + @override String get cancelledDownloadMessage => 'To pobieranie zostało anulowane. Co chcesz zrobić?'; + @override String get allEpisodesAlreadyDownloaded => 'Wszystkie odcinki są już pobrane'; + @override String get resumeDownload => 'Wznów pobieranie'; + @override String get cancelledDownload => 'Anulowane pobieranie'; + @override String syncingFile({required Object file, required Object status}) => '${file} (synchronizowanie ${status})'; + @override String downloadedFileClickToComplete({required Object file}) => 'Pobrano ${file} — kliknij, aby dokończyć'; + @override String get partialDownloadClickToComplete => 'Pobrano częściowo — kliknij, aby dokończyć'; @override String get deleting => 'Usuwanie...'; + @override String deletingWithProgress({required Object title, required Object current, required Object total}) => 'Usuwanie ${title}... (${current} z ${total})'; @override String get queuedTooltip => 'W kolejce'; @override String queuedFilesTooltip({required Object files}) => 'W kolejce: ${files}'; @override String get downloadingTooltip => 'Pobieranie...'; @@ -1304,9 +1337,11 @@ class _TranslationsCompanionRemotePl extends TranslationsCompanionRemoteEn { // Translations @override String get title => 'Pilot zdalny'; @override String connectedTo({required Object name}) => 'Połączono z ${name}'; + @override String get unknownDevice => 'Nieznane urządzenie'; @override late final _TranslationsCompanionRemoteSessionPl session = _TranslationsCompanionRemoteSessionPl._(_root); @override late final _TranslationsCompanionRemotePairingPl pairing = _TranslationsCompanionRemotePairingPl._(_root); @override late final _TranslationsCompanionRemoteRemotePl remote = _TranslationsCompanionRemoteRemotePl._(_root); + @override late final _TranslationsCompanionRemoteErrorsPl errors = _TranslationsCompanionRemoteErrorsPl._(_root); } // Path: videoSettings @@ -1328,6 +1363,49 @@ class _TranslationsVideoSettingsPl extends TranslationsVideoSettingsEn { @override String get audioNormalization => 'Normalizacja głośności'; } +// Path: performanceOverlay +class _TranslationsPerformanceOverlayPl extends TranslationsPerformanceOverlayEn { + _TranslationsPerformanceOverlayPl._(TranslationsPl root) : this._root = root, super.internal(root); + + final TranslationsPl _root; // ignore: unused_field + + // Translations + @override String get color => 'Kolor'; + @override String get performance => 'Wydajność'; + @override String get buffer => 'Bufor'; + @override String get app => 'Aplikacja'; + @override String get decoder => 'Dekoder'; + @override String get rawDecoder => 'Surowy dekoder'; + @override String get tunneling => 'Tunelowanie'; + @override String get aspect => 'Proporcje'; + @override String get rotation => 'Obrót'; + @override String get dvSource => 'Źródło DV'; + @override String get dvPath => 'Ścieżka DV'; + @override String get p7Conversion => 'Konw. P7'; + @override String get sampleRate => 'Częstotliwość próbkowania'; + @override String get pixelFormat => 'Format pikseli'; + @override String get hwFormat => 'Format HW'; + @override String get matrix => 'Macierz'; + @override String get primaries => 'Barwy podstawowe'; + @override String get transfer => 'Transfer'; + @override String get renderFps => 'FPS renderowania'; + @override String get displayFps => 'FPS ekranu'; + @override String get avSync => 'Sync A/V'; + @override String get dropped => 'Porzucone'; + @override String get dvRpus => 'DV RPU'; + @override String get dvRpuAverage => 'Śr. DV RPU'; + @override String get dvSampleAverage => 'Śr. próbki DV'; + @override String get maxLuma => 'Maks. luma'; + @override String get minLuma => 'Min. luma'; + @override String get maxCll => 'MaxCLL'; + @override String get maxFall => 'MaxFALL'; + @override String get cacheUsed => 'Użyty cache'; + @override String get speed => 'Szybkość'; + @override String get player => 'Odtwarzacz'; + @override String get memory => 'Pamięć'; + @override String get uiFps => 'UI FPS'; +} + // Path: externalPlayer class _TranslationsExternalPlayerPl extends TranslationsExternalPlayerEn { _TranslationsExternalPlayerPl._(TranslationsPl root) : this._root = root, super.internal(root); @@ -1343,6 +1421,7 @@ class _TranslationsExternalPlayerPl extends TranslationsExternalPlayerEn { @override String get systemDefault => 'Domyślny systemowy'; @override String get addCustomPlayer => 'Dodaj niestandardowy odtwarzacz'; @override String get playerName => 'Nazwa odtwarzacza'; + @override String get playerNameHint => 'Mój odtwarzacz'; @override String get playerCommand => 'Polecenie'; @override String get playerPackage => 'Nazwa pakietu'; @override String get playerUrlScheme => 'Schemat URL'; @@ -1755,6 +1834,21 @@ class _TranslationsCompanionRemoteRemotePl extends TranslationsCompanionRemoteRe @override String get searchHint => 'Szukaj na komputerze...'; } +// Path: companionRemote.errors +class _TranslationsCompanionRemoteErrorsPl extends TranslationsCompanionRemoteErrorsEn { + _TranslationsCompanionRemoteErrorsPl._(TranslationsPl root) : this._root = root, super.internal(root); + + final TranslationsPl _root; // ignore: unused_field + + // Translations + @override String get noNetworkInterface => 'Nie znaleziono interfejsu sieciowego'; + @override String get authenticationFailed => 'Uwierzytelnianie nie powiodło się'; + @override String get joinTimedOut => 'Upłynął limit czasu dołączania do sesji'; + @override String get failedToConnectAnyAddress => 'Nie udało się połączyć z żadnym adresem'; + @override String connectionLostAfterAttempts({required Object attempts}) => 'Połączenie utracone po ${attempts} próbach'; + @override String get connectionLost => 'Połączenie utracone'; +} + // Path: trackers.services class _TranslationsTrackersServicesPl extends TranslationsTrackersServicesEn { _TranslationsTrackersServicesPl._(TranslationsPl root) : this._root = root, super.internal(root); @@ -1871,6 +1965,9 @@ extension on TranslationsPl { 'common.settings' => 'Ustawienia', 'common.mute' => 'Wycisz', 'common.ok' => 'OK', + 'common.off' => 'Wył.', + 'common.seasonNumber' => ({required Object number}) => 'Sezon ${number}', + 'common.chapterNumber' => ({required Object number}) => 'Rozdział ${number}', 'common.reconnect' => 'Połącz ponownie', 'common.exit' => 'Wyjdź', 'common.viewAll' => 'Pokaż wszystko', @@ -2070,6 +2167,10 @@ extension on TranslationsPl { 'settings.dvConversionNative' => 'Natywnie / wyłączone', 'settings.dvConversionDv81' => 'P7 → P8.1', 'settings.dvConversionHevcStrip' => 'P7 → HEVC', + 'settings.dvConversionAutoDescription' => 'Użyj wykrywania możliwości urządzenia i normalnego zachowania awaryjnego', + 'settings.dvConversionNativeDescription' => 'Wymuś natywne DV7 i wyłącz ponowną próbę konwersji DV', + 'settings.dvConversionDv81Description' => 'Wymuś wbudowaną konwersję RPU do profilu Dolby Vision 8.1', + 'settings.dvConversionHevcStripDescription' => 'Usuń warstwy Dolby Vision RPU/EL i przedstaw zwykłe HEVC', 'settings.requireProfileSelectionOnOpen' => 'Pytaj o profil przy otwarciu aplikacji', 'settings.requireProfileSelectionOnOpenDescription' => 'Pokaż wybór profilu za każdym razem, gdy aplikacja jest otwierana', 'settings.forceTvMode' => 'Wymuś tryb TV', @@ -2099,6 +2200,8 @@ extension on TranslationsPl { 'search.enterTitleActorOrKeyword' => 'Wprowadź tytuł, aktora lub słowo kluczowe', 'hotkeys.setShortcutFor' => ({required Object actionName}) => 'Ustaw skrót dla ${actionName}', 'hotkeys.clearShortcut' => 'Wyczyść skrót', + 'hotkeys.noShortcutSet' => 'Brak ustawionego skrótu', + 'hotkeys.currentShortcut' => 'Bieżący skrót:', 'hotkeys.actions.playPause' => 'Odtwórz/Pauza', 'hotkeys.actions.volumeUp' => 'Głośniej', 'hotkeys.actions.volumeDown' => 'Ciszej', @@ -2155,6 +2258,7 @@ extension on TranslationsPl { 'mediaMenu.goToSeries' => 'Przejdź do serialu', 'mediaMenu.goToSeason' => 'Przejdź do sezonu', 'mediaMenu.shufflePlay' => 'Odtwarzanie losowe', + 'mediaMenu.shuffleNotAvailableOffline' => 'Odtwarzanie losowe nie jest dostępne offline', 'mediaMenu.fileInfo' => 'Informacje o pliku', 'mediaMenu.deleteFromServer' => 'Usuń z serwera', 'mediaMenu.confirmDelete' => 'Usunąć to medium i jego pliki z serwera?', @@ -2263,6 +2367,10 @@ extension on TranslationsPl { 'videoControls.searchSubtitles' => 'Szukaj napisów', 'videoControls.language' => 'Język', 'videoControls.noSubtitlesFound' => 'Nie znaleziono napisów', + 'videoControls.downloadedSubtitle' => 'Pobrano', + 'videoControls.noSubtitlesAvailable' => 'Brak dostępnych napisów', + 'videoControls.noAudioTracksAvailable' => 'Brak dostępnych ścieżek audio', + 'videoControls.noTracksAvailable' => 'Brak dostępnych ścieżek', 'videoControls.subtitleDownloaded' => 'Napisy pobrane', 'videoControls.subtitleDownloadFailed' => 'Nie udało się pobrać napisów', 'videoControls.searchLanguages' => 'Szukaj języków...', @@ -2321,6 +2429,8 @@ extension on TranslationsPl { 'subtitlingStyling.borderColor' => 'Kolor obramowania', 'subtitlingStyling.backgroundOpacity' => 'Przezroczystość tła', 'subtitlingStyling.backgroundColor' => 'Kolor tła', + _ => null, + } ?? switch (path) { 'subtitlingStyling.position' => 'Pozycja', 'subtitlingStyling.assOverride' => 'Nadpisywanie ASS', 'subtitlingStyling.bold' => 'Pogrubienie', @@ -2335,8 +2445,6 @@ extension on TranslationsPl { 'mpvConfig.loadPreset' => 'Załaduj', 'mpvConfig.deletePreset' => 'Usuń', 'mpvConfig.presetSaved' => 'Preset zapisany', - _ => null, - } ?? switch (path) { 'mpvConfig.presetLoaded' => 'Preset załadowany', 'mpvConfig.presetDeleted' => 'Preset usunięty', 'mpvConfig.confirmDeletePreset' => 'Czy na pewno chcesz usunąć ten preset?', @@ -2399,6 +2507,7 @@ extension on TranslationsPl { 'profiles.pinExplain' => 'Do przełączania profili wymagany jest 4-cyfrowy PIN.', 'profiles.continueButton' => 'Kontynuuj', 'profiles.pinsDontMatch' => 'PIN-y nie pasują', + 'profiles.initializeServicesFailed' => 'Nie udało się zainicjować usług profilu', 'connections.sectionTitle' => 'Połączenia', 'connections.addConnection' => 'Dodaj połączenie', 'connections.addConnectionSubtitleNoProfile' => 'Zaloguj się przez Plex lub połącz serwer Jellyfin', @@ -2427,6 +2536,7 @@ extension on TranslationsPl { 'discover.movie' => 'Film', 'discover.tvShow' => 'Serial TV', 'discover.minutesLeft' => ({required Object minutes}) => '${minutes} min pozostało', + 'discover.moreLikeThis' => 'Więcej podobnych', 'errors.searchFailed' => ({required Object error}) => 'Wyszukiwanie nie powiodło się: ${error}', 'errors.connectionTimeout' => ({required Object context}) => 'Limit czasu połączenia przy ładowaniu ${context}', 'errors.connectionFailed' => 'Nie można połączyć się z serwerem multimediów', @@ -2441,6 +2551,7 @@ extension on TranslationsPl { 'errors.failedToDeleteProfile' => ({required Object displayName}) => 'Nie udało się usunąć ${displayName}', 'errors.failedToRate' => 'Nie udało się zaktualizować oceny', 'libraries.title' => 'Biblioteki', + 'libraries.fallbackTitle' => 'Biblioteka', 'libraries.scanLibraryFiles' => 'Skanuj pliki biblioteki', 'libraries.scanLibrary' => 'Skanuj bibliotekę', 'libraries.analyze' => 'Analizuj', @@ -2541,6 +2652,12 @@ extension on TranslationsPl { 'liveTv.noChannels' => 'Brak dostępnych kanałów', 'liveTv.noDvr' => 'Brak skonfigurowanego DVR na żadnym serwerze', 'liveTv.noPrograms' => 'Brak danych o programach', + 'liveTv.liveStreamFailed' => 'Transmisja na żywo nie powiodła się', + 'liveTv.unknownProgram' => 'Nieznany program', + 'liveTv.unknownHub' => 'Nieznane', + 'liveTv.unknownError' => 'Nieznany błąd', + 'liveTv.channelNumber' => ({required Object number}) => 'Kanał ${number}', + 'liveTv.unknownChannel' => 'Nieznany kanał', 'liveTv.live' => 'NA ŻYWO', 'liveTv.reloadGuide' => 'Odśwież przewodnik', 'liveTv.now' => 'Teraz', @@ -2711,12 +2828,21 @@ extension on TranslationsPl { 'downloads.deleteDownload' => 'Usuń pobranie', 'downloads.retryDownload' => 'Ponów pobieranie', 'downloads.downloadQueued' => 'Pobranie w kolejce', + 'downloads.downloadResumed' => 'Pobieranie wznowione', 'downloads.serverErrorBitrate' => 'Błąd serwera: plik może przekraczać zdalny limit bitrate', 'downloads.episodesQueued' => ({required Object count}) => '${count} odcinków w kolejce pobierania', 'downloads.downloadDeleted' => 'Pobranie usunięte', 'downloads.deleteConfirm' => ({required Object title}) => 'Usunąć "${title}" z tego urządzenia?', - 'downloads.deletingWithProgress' => ({required Object title, required Object current, required Object total}) => 'Usuwanie ${title}... (${current} z ${total})', + 'downloads.cancelledDownloadTitle' => 'Anulowane pobieranie', + 'downloads.cancelledDownloadMessage' => 'To pobieranie zostało anulowane. Co chcesz zrobić?', + 'downloads.allEpisodesAlreadyDownloaded' => 'Wszystkie odcinki są już pobrane', + 'downloads.resumeDownload' => 'Wznów pobieranie', + 'downloads.cancelledDownload' => 'Anulowane pobieranie', + 'downloads.syncingFile' => ({required Object file, required Object status}) => '${file} (synchronizowanie ${status})', + 'downloads.downloadedFileClickToComplete' => ({required Object file}) => 'Pobrano ${file} — kliknij, aby dokończyć', + 'downloads.partialDownloadClickToComplete' => 'Pobrano częściowo — kliknij, aby dokończyć', 'downloads.deleting' => 'Usuwanie...', + 'downloads.deletingWithProgress' => ({required Object title, required Object current, required Object total}) => 'Usuwanie ${title}... (${current} z ${total})', 'downloads.queuedTooltip' => 'W kolejce', 'downloads.queuedFilesTooltip' => ({required Object files}) => 'W kolejce: ${files}', 'downloads.downloadingTooltip' => 'Pobieranie...', @@ -2773,6 +2899,7 @@ extension on TranslationsPl { 'shaders.deleteShaderConfirm' => ({required Object name}) => 'Usunąć "${name}"?', 'companionRemote.title' => 'Pilot zdalny', 'companionRemote.connectedTo' => ({required Object name}) => 'Połączono z ${name}', + 'companionRemote.unknownDevice' => 'Nieznane urządzenie', 'companionRemote.session.startingServer' => 'Uruchamianie serwera zdalnego...', 'companionRemote.session.failedToCreate' => 'Nie udało się uruchomić serwera zdalnego:', 'companionRemote.session.hostAddress' => 'Adres hosta', @@ -2816,6 +2943,8 @@ extension on TranslationsPl { 'companionRemote.remote.tabSettings' => 'Ustawienia', 'companionRemote.remote.previous' => 'Poprzedni', 'companionRemote.remote.playPause' => 'Odtwórz/Pauza', + _ => null, + } ?? switch (path) { 'companionRemote.remote.next' => 'Następny', 'companionRemote.remote.seekBack' => 'Przewiń wstecz', 'companionRemote.remote.stop' => 'Stop', @@ -2827,6 +2956,12 @@ extension on TranslationsPl { 'companionRemote.remote.subtitles' => 'Napisy', 'companionRemote.remote.audio' => 'Audio', 'companionRemote.remote.searchHint' => 'Szukaj na komputerze...', + 'companionRemote.errors.noNetworkInterface' => 'Nie znaleziono interfejsu sieciowego', + 'companionRemote.errors.authenticationFailed' => 'Uwierzytelnianie nie powiodło się', + 'companionRemote.errors.joinTimedOut' => 'Upłynął limit czasu dołączania do sesji', + 'companionRemote.errors.failedToConnectAnyAddress' => 'Nie udało się połączyć z żadnym adresem', + 'companionRemote.errors.connectionLostAfterAttempts' => ({required Object attempts}) => 'Połączenie utracone po ${attempts} próbach', + 'companionRemote.errors.connectionLost' => 'Połączenie utracone', 'videoSettings.playbackSpeed' => 'Prędkość odtwarzania', 'videoSettings.zoom' => 'Zoom', 'videoSettings.sleepTimer' => 'Wyłącznik czasowy', @@ -2837,6 +2972,40 @@ extension on TranslationsPl { 'videoSettings.performanceOverlay' => 'Nakładka wydajności', 'videoSettings.audioPassthrough' => 'Bezpośrednie audio', 'videoSettings.audioNormalization' => 'Normalizacja głośności', + 'performanceOverlay.color' => 'Kolor', + 'performanceOverlay.performance' => 'Wydajność', + 'performanceOverlay.buffer' => 'Bufor', + 'performanceOverlay.app' => 'Aplikacja', + 'performanceOverlay.decoder' => 'Dekoder', + 'performanceOverlay.rawDecoder' => 'Surowy dekoder', + 'performanceOverlay.tunneling' => 'Tunelowanie', + 'performanceOverlay.aspect' => 'Proporcje', + 'performanceOverlay.rotation' => 'Obrót', + 'performanceOverlay.dvSource' => 'Źródło DV', + 'performanceOverlay.dvPath' => 'Ścieżka DV', + 'performanceOverlay.p7Conversion' => 'Konw. P7', + 'performanceOverlay.sampleRate' => 'Częstotliwość próbkowania', + 'performanceOverlay.pixelFormat' => 'Format pikseli', + 'performanceOverlay.hwFormat' => 'Format HW', + 'performanceOverlay.matrix' => 'Macierz', + 'performanceOverlay.primaries' => 'Barwy podstawowe', + 'performanceOverlay.transfer' => 'Transfer', + 'performanceOverlay.renderFps' => 'FPS renderowania', + 'performanceOverlay.displayFps' => 'FPS ekranu', + 'performanceOverlay.avSync' => 'Sync A/V', + 'performanceOverlay.dropped' => 'Porzucone', + 'performanceOverlay.dvRpus' => 'DV RPU', + 'performanceOverlay.dvRpuAverage' => 'Śr. DV RPU', + 'performanceOverlay.dvSampleAverage' => 'Śr. próbki DV', + 'performanceOverlay.maxLuma' => 'Maks. luma', + 'performanceOverlay.minLuma' => 'Min. luma', + 'performanceOverlay.maxCll' => 'MaxCLL', + 'performanceOverlay.maxFall' => 'MaxFALL', + 'performanceOverlay.cacheUsed' => 'Użyty cache', + 'performanceOverlay.speed' => 'Szybkość', + 'performanceOverlay.player' => 'Odtwarzacz', + 'performanceOverlay.memory' => 'Pamięć', + 'performanceOverlay.uiFps' => 'UI FPS', 'externalPlayer.title' => 'Zewnętrzny odtwarzacz', 'externalPlayer.useExternalPlayer' => 'Użyj zewnętrznego odtwarzacza', 'externalPlayer.useExternalPlayerDescription' => 'Otwieraj wideo w innej aplikacji', @@ -2845,12 +3014,11 @@ extension on TranslationsPl { 'externalPlayer.systemDefault' => 'Domyślny systemowy', 'externalPlayer.addCustomPlayer' => 'Dodaj niestandardowy odtwarzacz', 'externalPlayer.playerName' => 'Nazwa odtwarzacza', + 'externalPlayer.playerNameHint' => 'Mój odtwarzacz', 'externalPlayer.playerCommand' => 'Polecenie', 'externalPlayer.playerPackage' => 'Nazwa pakietu', 'externalPlayer.playerUrlScheme' => 'Schemat URL', 'externalPlayer.off' => 'Wyłączony', - _ => null, - } ?? switch (path) { 'externalPlayer.launchFailed' => 'Nie udało się otworzyć zewnętrznego odtwarzacza', 'externalPlayer.appNotInstalled' => ({required Object name}) => '${name} nie jest zainstalowany', 'externalPlayer.playInExternalPlayer' => 'Odtwórz w zewnętrznym odtwarzaczu', diff --git a/lib/i18n/strings_pt.g.dart b/lib/i18n/strings_pt.g.dart index 4fd7e4af..edea3e3d 100644 --- a/lib/i18n/strings_pt.g.dart +++ b/lib/i18n/strings_pt.g.dart @@ -77,6 +77,7 @@ class TranslationsPt extends Translations with BaseTranslations 'Configurações'; @override String get mute => 'Silenciar'; @override String get ok => 'OK'; + @override String get off => 'Desativado'; + @override String seasonNumber({required Object number}) => 'Temporada ${number}'; + @override String chapterNumber({required Object number}) => 'Capítulo ${number}'; @override String get reconnect => 'Reconectar'; @override String get exit => 'Sair'; @override String get viewAll => 'Ver Tudo'; @@ -385,6 +389,10 @@ class _TranslationsSettingsPt extends TranslationsSettingsEn { @override String get dvConversionNative => 'Nativo / desativado'; @override String get dvConversionDv81 => 'P7 → P8.1'; @override String get dvConversionHevcStrip => 'P7 → HEVC'; + @override String get dvConversionAutoDescription => 'Usar detecção de recursos do dispositivo e comportamento normal de fallback'; + @override String get dvConversionNativeDescription => 'Forçar DV7 nativo e suprimir nova tentativa de conversão DV'; + @override String get dvConversionDv81Description => 'Forçar conversão RPU inline para Dolby Vision perfil 8.1'; + @override String get dvConversionHevcStripDescription => 'Remover camadas RPU/EL do Dolby Vision e apresentar HEVC simples'; @override String get requireProfileSelectionOnOpen => 'Pedir perfil ao abrir o app'; @override String get requireProfileSelectionOnOpenDescription => 'Mostrar seleção de perfil toda vez que o app for aberto'; @override String get forceTvMode => 'Forçar modo TV'; @@ -432,6 +440,8 @@ class _TranslationsHotkeysPt extends TranslationsHotkeysEn { // Translations @override String setShortcutFor({required Object actionName}) => 'Definir Atalho para ${actionName}'; @override String get clearShortcut => 'Limpar atalho'; + @override String get noShortcutSet => 'Nenhum atalho definido'; + @override String get currentShortcut => 'Atalho atual:'; @override late final _TranslationsHotkeysActionsPt actions = _TranslationsHotkeysActionsPt._(_root); } @@ -482,6 +492,7 @@ class _TranslationsMediaMenuPt extends TranslationsMediaMenuEn { @override String get goToSeries => 'Ir para a série'; @override String get goToSeason => 'Ir para a temporada'; @override String get shufflePlay => 'Reprodução Aleatória'; + @override String get shuffleNotAvailableOffline => 'Reprodução aleatória indisponível offline'; @override String get fileInfo => 'Info do Arquivo'; @override String get deleteFromServer => 'Excluir do servidor'; @override String get confirmDelete => 'Excluir esta mídia e seus arquivos do servidor?'; @@ -620,6 +631,10 @@ class _TranslationsVideoControlsPt extends TranslationsVideoControlsEn { @override String get searchSubtitles => 'Pesquisar legendas'; @override String get language => 'Idioma'; @override String get noSubtitlesFound => 'Nenhuma legenda encontrada'; + @override String get downloadedSubtitle => 'Baixado'; + @override String get noSubtitlesAvailable => 'Nenhuma legenda disponível'; + @override String get noAudioTracksAvailable => 'Nenhuma faixa de áudio disponível'; + @override String get noTracksAvailable => 'Nenhuma faixa disponível'; @override String get subtitleDownloaded => 'Legenda baixada'; @override String get subtitleDownloadFailed => 'Falha ao baixar legenda'; @override String get searchLanguages => 'Pesquisar idiomas...'; @@ -808,6 +823,7 @@ class _TranslationsProfilesPt extends TranslationsProfilesEn { @override String get pinExplain => 'PIN de 4 dígitos necessário para trocar perfis.'; @override String get continueButton => 'Continuar'; @override String get pinsDontMatch => 'Os PINs não correspondem'; + @override String get initializeServicesFailed => 'Falha ao inicializar serviços de perfil'; } // Path: connections @@ -854,6 +870,7 @@ class _TranslationsDiscoverPt extends TranslationsDiscoverEn { @override String get movie => 'Filme'; @override String get tvShow => 'Série de TV'; @override String minutesLeft({required Object minutes}) => '${minutes} min restantes'; + @override String get moreLikeThis => 'Mais como este'; } // Path: errors @@ -886,6 +903,7 @@ class _TranslationsLibrariesPt extends TranslationsLibrariesEn { // Translations @override String get title => 'Bibliotecas'; + @override String get fallbackTitle => 'Biblioteca'; @override String get scanLibraryFiles => 'Escanear Arquivos da Biblioteca'; @override String get scanLibrary => 'Escanear Biblioteca'; @override String get analyze => 'Analisar'; @@ -1018,6 +1036,12 @@ class _TranslationsLiveTvPt extends TranslationsLiveTvEn { @override String get noChannels => 'Nenhum canal disponível'; @override String get noDvr => 'Nenhum DVR configurado em nenhum servidor'; @override String get noPrograms => 'Nenhum dado de programação disponível'; + @override String get liveStreamFailed => 'Falha no stream ao vivo'; + @override String get unknownProgram => 'Programa desconhecido'; + @override String get unknownHub => 'Desconhecido'; + @override String get unknownError => 'Erro desconhecido'; + @override String channelNumber({required Object number}) => 'Canal ${number}'; + @override String get unknownChannel => 'Canal desconhecido'; @override String get live => 'AO VIVO'; @override String get reloadGuide => 'Recarregar Guia'; @override String get now => 'Agora'; @@ -1224,12 +1248,21 @@ class _TranslationsDownloadsPt extends TranslationsDownloadsEn { @override String get deleteDownload => 'Excluir download'; @override String get retryDownload => 'Tentar download novamente'; @override String get downloadQueued => 'Download na fila'; + @override String get downloadResumed => 'Download retomado'; @override String get serverErrorBitrate => 'Erro do servidor: o arquivo pode exceder o limite remoto de bitrate'; @override String episodesQueued({required Object count}) => '${count} episódios na fila de download'; @override String get downloadDeleted => 'Download excluído'; @override String deleteConfirm({required Object title}) => 'Excluir "${title}" deste dispositivo?'; - @override String deletingWithProgress({required Object title, required Object current, required Object total}) => 'Excluindo ${title}... (${current} de ${total})'; + @override String get cancelledDownloadTitle => 'Download cancelado'; + @override String get cancelledDownloadMessage => 'Este download foi cancelado. O que você deseja fazer?'; + @override String get allEpisodesAlreadyDownloaded => 'Todos os episódios já foram baixados'; + @override String get resumeDownload => 'Retomar download'; + @override String get cancelledDownload => 'Download cancelado'; + @override String syncingFile({required Object file, required Object status}) => '${file} (sincronizando ${status})'; + @override String downloadedFileClickToComplete({required Object file}) => '${file} baixado — clique para concluir'; + @override String get partialDownloadClickToComplete => 'Parcialmente baixado — clique para concluir'; @override String get deleting => 'Excluindo...'; + @override String deletingWithProgress({required Object title, required Object current, required Object total}) => 'Excluindo ${title}... (${current} de ${total})'; @override String get queuedTooltip => 'Na fila'; @override String queuedFilesTooltip({required Object files}) => 'Na fila: ${files}'; @override String get downloadingTooltip => 'Baixando...'; @@ -1304,9 +1337,11 @@ class _TranslationsCompanionRemotePt extends TranslationsCompanionRemoteEn { // Translations @override String get title => 'Controle Remoto'; @override String connectedTo({required Object name}) => 'Conectado a ${name}'; + @override String get unknownDevice => 'Dispositivo desconhecido'; @override late final _TranslationsCompanionRemoteSessionPt session = _TranslationsCompanionRemoteSessionPt._(_root); @override late final _TranslationsCompanionRemotePairingPt pairing = _TranslationsCompanionRemotePairingPt._(_root); @override late final _TranslationsCompanionRemoteRemotePt remote = _TranslationsCompanionRemoteRemotePt._(_root); + @override late final _TranslationsCompanionRemoteErrorsPt errors = _TranslationsCompanionRemoteErrorsPt._(_root); } // Path: videoSettings @@ -1328,6 +1363,49 @@ class _TranslationsVideoSettingsPt extends TranslationsVideoSettingsEn { @override String get audioNormalization => 'Normalizar Volume'; } +// Path: performanceOverlay +class _TranslationsPerformanceOverlayPt extends TranslationsPerformanceOverlayEn { + _TranslationsPerformanceOverlayPt._(TranslationsPt root) : this._root = root, super.internal(root); + + final TranslationsPt _root; // ignore: unused_field + + // Translations + @override String get color => 'Cor'; + @override String get performance => 'Desempenho'; + @override String get buffer => 'Buffer'; + @override String get app => 'App'; + @override String get decoder => 'Decodificador'; + @override String get rawDecoder => 'Decodificador bruto'; + @override String get tunneling => 'Túnel'; + @override String get aspect => 'Aspecto'; + @override String get rotation => 'Rotação'; + @override String get dvSource => 'Fonte DV'; + @override String get dvPath => 'Caminho DV'; + @override String get p7Conversion => 'Conv. P7'; + @override String get sampleRate => 'Taxa de amostragem'; + @override String get pixelFormat => 'Formato de pixel'; + @override String get hwFormat => 'Formato HW'; + @override String get matrix => 'Matriz'; + @override String get primaries => 'Primárias'; + @override String get transfer => 'Transferência'; + @override String get renderFps => 'FPS render'; + @override String get displayFps => 'FPS tela'; + @override String get avSync => 'Sync A/V'; + @override String get dropped => 'Descartados'; + @override String get dvRpus => 'DV RPUs'; + @override String get dvRpuAverage => 'Média DV RPU'; + @override String get dvSampleAverage => 'Média amostra DV'; + @override String get maxLuma => 'Luma máx.'; + @override String get minLuma => 'Luma mín.'; + @override String get maxCll => 'MaxCLL'; + @override String get maxFall => 'MaxFALL'; + @override String get cacheUsed => 'Cache usado'; + @override String get speed => 'Velocidade'; + @override String get player => 'Player'; + @override String get memory => 'Memória'; + @override String get uiFps => 'UI FPS'; +} + // Path: externalPlayer class _TranslationsExternalPlayerPt extends TranslationsExternalPlayerEn { _TranslationsExternalPlayerPt._(TranslationsPt root) : this._root = root, super.internal(root); @@ -1343,6 +1421,7 @@ class _TranslationsExternalPlayerPt extends TranslationsExternalPlayerEn { @override String get systemDefault => 'Padrão do Sistema'; @override String get addCustomPlayer => 'Adicionar Player Personalizado'; @override String get playerName => 'Nome do Player'; + @override String get playerNameHint => 'Meu player'; @override String get playerCommand => 'Comando'; @override String get playerPackage => 'Nome do Pacote'; @override String get playerUrlScheme => 'Esquema de URL'; @@ -1755,6 +1834,21 @@ class _TranslationsCompanionRemoteRemotePt extends TranslationsCompanionRemoteRe @override String get searchHint => 'Buscar no desktop...'; } +// Path: companionRemote.errors +class _TranslationsCompanionRemoteErrorsPt extends TranslationsCompanionRemoteErrorsEn { + _TranslationsCompanionRemoteErrorsPt._(TranslationsPt root) : this._root = root, super.internal(root); + + final TranslationsPt _root; // ignore: unused_field + + // Translations + @override String get noNetworkInterface => 'Nenhuma interface de rede encontrada'; + @override String get authenticationFailed => 'Falha na autenticação'; + @override String get joinTimedOut => 'Tempo esgotado ao entrar na sessão'; + @override String get failedToConnectAnyAddress => 'Falha ao conectar a qualquer endereço'; + @override String connectionLostAfterAttempts({required Object attempts}) => 'Conexão perdida após ${attempts} tentativas'; + @override String get connectionLost => 'Conexão perdida'; +} + // Path: trackers.services class _TranslationsTrackersServicesPt extends TranslationsTrackersServicesEn { _TranslationsTrackersServicesPt._(TranslationsPt root) : this._root = root, super.internal(root); @@ -1871,6 +1965,9 @@ extension on TranslationsPt { 'common.settings' => 'Configurações', 'common.mute' => 'Silenciar', 'common.ok' => 'OK', + 'common.off' => 'Desativado', + 'common.seasonNumber' => ({required Object number}) => 'Temporada ${number}', + 'common.chapterNumber' => ({required Object number}) => 'Capítulo ${number}', 'common.reconnect' => 'Reconectar', 'common.exit' => 'Sair', 'common.viewAll' => 'Ver Tudo', @@ -2070,6 +2167,10 @@ extension on TranslationsPt { 'settings.dvConversionNative' => 'Nativo / desativado', 'settings.dvConversionDv81' => 'P7 → P8.1', 'settings.dvConversionHevcStrip' => 'P7 → HEVC', + 'settings.dvConversionAutoDescription' => 'Usar detecção de recursos do dispositivo e comportamento normal de fallback', + 'settings.dvConversionNativeDescription' => 'Forçar DV7 nativo e suprimir nova tentativa de conversão DV', + 'settings.dvConversionDv81Description' => 'Forçar conversão RPU inline para Dolby Vision perfil 8.1', + 'settings.dvConversionHevcStripDescription' => 'Remover camadas RPU/EL do Dolby Vision e apresentar HEVC simples', 'settings.requireProfileSelectionOnOpen' => 'Pedir perfil ao abrir o app', 'settings.requireProfileSelectionOnOpenDescription' => 'Mostrar seleção de perfil toda vez que o app for aberto', 'settings.forceTvMode' => 'Forçar modo TV', @@ -2099,6 +2200,8 @@ extension on TranslationsPt { 'search.enterTitleActorOrKeyword' => 'Insira um título, ator ou palavra-chave', 'hotkeys.setShortcutFor' => ({required Object actionName}) => 'Definir Atalho para ${actionName}', 'hotkeys.clearShortcut' => 'Limpar atalho', + 'hotkeys.noShortcutSet' => 'Nenhum atalho definido', + 'hotkeys.currentShortcut' => 'Atalho atual:', 'hotkeys.actions.playPause' => 'Reproduzir/Pausar', 'hotkeys.actions.volumeUp' => 'Aumentar Volume', 'hotkeys.actions.volumeDown' => 'Diminuir Volume', @@ -2155,6 +2258,7 @@ extension on TranslationsPt { 'mediaMenu.goToSeries' => 'Ir para a série', 'mediaMenu.goToSeason' => 'Ir para a temporada', 'mediaMenu.shufflePlay' => 'Reprodução Aleatória', + 'mediaMenu.shuffleNotAvailableOffline' => 'Reprodução aleatória indisponível offline', 'mediaMenu.fileInfo' => 'Info do Arquivo', 'mediaMenu.deleteFromServer' => 'Excluir do servidor', 'mediaMenu.confirmDelete' => 'Excluir esta mídia e seus arquivos do servidor?', @@ -2263,6 +2367,10 @@ extension on TranslationsPt { 'videoControls.searchSubtitles' => 'Pesquisar legendas', 'videoControls.language' => 'Idioma', 'videoControls.noSubtitlesFound' => 'Nenhuma legenda encontrada', + 'videoControls.downloadedSubtitle' => 'Baixado', + 'videoControls.noSubtitlesAvailable' => 'Nenhuma legenda disponível', + 'videoControls.noAudioTracksAvailable' => 'Nenhuma faixa de áudio disponível', + 'videoControls.noTracksAvailable' => 'Nenhuma faixa disponível', 'videoControls.subtitleDownloaded' => 'Legenda baixada', 'videoControls.subtitleDownloadFailed' => 'Falha ao baixar legenda', 'videoControls.searchLanguages' => 'Pesquisar idiomas...', @@ -2321,6 +2429,8 @@ extension on TranslationsPt { 'subtitlingStyling.borderColor' => 'Cor da Borda', 'subtitlingStyling.backgroundOpacity' => 'Opacidade do Fundo', 'subtitlingStyling.backgroundColor' => 'Cor de Fundo', + _ => null, + } ?? switch (path) { 'subtitlingStyling.position' => 'Posição', 'subtitlingStyling.assOverride' => 'Substituição ASS', 'subtitlingStyling.bold' => 'Negrito', @@ -2335,8 +2445,6 @@ extension on TranslationsPt { 'mpvConfig.loadPreset' => 'Carregar', 'mpvConfig.deletePreset' => 'Excluir', 'mpvConfig.presetSaved' => 'Predefinição salva', - _ => null, - } ?? switch (path) { 'mpvConfig.presetLoaded' => 'Predefinição carregada', 'mpvConfig.presetDeleted' => 'Predefinição excluída', 'mpvConfig.confirmDeletePreset' => 'Tem certeza que deseja excluir esta predefinição?', @@ -2399,6 +2507,7 @@ extension on TranslationsPt { 'profiles.pinExplain' => 'PIN de 4 dígitos necessário para trocar perfis.', 'profiles.continueButton' => 'Continuar', 'profiles.pinsDontMatch' => 'Os PINs não correspondem', + 'profiles.initializeServicesFailed' => 'Falha ao inicializar serviços de perfil', 'connections.sectionTitle' => 'Conexões', 'connections.addConnection' => 'Adicionar conexão', 'connections.addConnectionSubtitleNoProfile' => 'Faça login com Plex ou conecte um servidor Jellyfin', @@ -2427,6 +2536,7 @@ extension on TranslationsPt { 'discover.movie' => 'Filme', 'discover.tvShow' => 'Série de TV', 'discover.minutesLeft' => ({required Object minutes}) => '${minutes} min restantes', + 'discover.moreLikeThis' => 'Mais como este', 'errors.searchFailed' => ({required Object error}) => 'Falha na busca: ${error}', 'errors.connectionTimeout' => ({required Object context}) => 'Tempo de conexão esgotado ao carregar ${context}', 'errors.connectionFailed' => 'Não foi possível conectar ao servidor de mídia', @@ -2441,6 +2551,7 @@ extension on TranslationsPt { 'errors.failedToDeleteProfile' => ({required Object displayName}) => 'Falha ao excluir ${displayName}', 'errors.failedToRate' => 'Não foi possível atualizar a classificação', 'libraries.title' => 'Bibliotecas', + 'libraries.fallbackTitle' => 'Biblioteca', 'libraries.scanLibraryFiles' => 'Escanear Arquivos da Biblioteca', 'libraries.scanLibrary' => 'Escanear Biblioteca', 'libraries.analyze' => 'Analisar', @@ -2541,6 +2652,12 @@ extension on TranslationsPt { 'liveTv.noChannels' => 'Nenhum canal disponível', 'liveTv.noDvr' => 'Nenhum DVR configurado em nenhum servidor', 'liveTv.noPrograms' => 'Nenhum dado de programação disponível', + 'liveTv.liveStreamFailed' => 'Falha no stream ao vivo', + 'liveTv.unknownProgram' => 'Programa desconhecido', + 'liveTv.unknownHub' => 'Desconhecido', + 'liveTv.unknownError' => 'Erro desconhecido', + 'liveTv.channelNumber' => ({required Object number}) => 'Canal ${number}', + 'liveTv.unknownChannel' => 'Canal desconhecido', 'liveTv.live' => 'AO VIVO', 'liveTv.reloadGuide' => 'Recarregar Guia', 'liveTv.now' => 'Agora', @@ -2711,12 +2828,21 @@ extension on TranslationsPt { 'downloads.deleteDownload' => 'Excluir download', 'downloads.retryDownload' => 'Tentar download novamente', 'downloads.downloadQueued' => 'Download na fila', + 'downloads.downloadResumed' => 'Download retomado', 'downloads.serverErrorBitrate' => 'Erro do servidor: o arquivo pode exceder o limite remoto de bitrate', 'downloads.episodesQueued' => ({required Object count}) => '${count} episódios na fila de download', 'downloads.downloadDeleted' => 'Download excluído', 'downloads.deleteConfirm' => ({required Object title}) => 'Excluir "${title}" deste dispositivo?', - 'downloads.deletingWithProgress' => ({required Object title, required Object current, required Object total}) => 'Excluindo ${title}... (${current} de ${total})', + 'downloads.cancelledDownloadTitle' => 'Download cancelado', + 'downloads.cancelledDownloadMessage' => 'Este download foi cancelado. O que você deseja fazer?', + 'downloads.allEpisodesAlreadyDownloaded' => 'Todos os episódios já foram baixados', + 'downloads.resumeDownload' => 'Retomar download', + 'downloads.cancelledDownload' => 'Download cancelado', + 'downloads.syncingFile' => ({required Object file, required Object status}) => '${file} (sincronizando ${status})', + 'downloads.downloadedFileClickToComplete' => ({required Object file}) => '${file} baixado — clique para concluir', + 'downloads.partialDownloadClickToComplete' => 'Parcialmente baixado — clique para concluir', 'downloads.deleting' => 'Excluindo...', + 'downloads.deletingWithProgress' => ({required Object title, required Object current, required Object total}) => 'Excluindo ${title}... (${current} de ${total})', 'downloads.queuedTooltip' => 'Na fila', 'downloads.queuedFilesTooltip' => ({required Object files}) => 'Na fila: ${files}', 'downloads.downloadingTooltip' => 'Baixando...', @@ -2773,6 +2899,7 @@ extension on TranslationsPt { 'shaders.deleteShaderConfirm' => ({required Object name}) => 'Excluir "${name}"?', 'companionRemote.title' => 'Controle Remoto', 'companionRemote.connectedTo' => ({required Object name}) => 'Conectado a ${name}', + 'companionRemote.unknownDevice' => 'Dispositivo desconhecido', 'companionRemote.session.startingServer' => 'A iniciar servidor remoto...', 'companionRemote.session.failedToCreate' => 'Falha ao iniciar o servidor remoto:', 'companionRemote.session.hostAddress' => 'Endereço do host', @@ -2816,6 +2943,8 @@ extension on TranslationsPt { 'companionRemote.remote.tabSettings' => 'Configurações', 'companionRemote.remote.previous' => 'Anterior', 'companionRemote.remote.playPause' => 'Reproduzir/Pausar', + _ => null, + } ?? switch (path) { 'companionRemote.remote.next' => 'Próximo', 'companionRemote.remote.seekBack' => 'Retroceder', 'companionRemote.remote.stop' => 'Parar', @@ -2827,6 +2956,12 @@ extension on TranslationsPt { 'companionRemote.remote.subtitles' => 'Legendas', 'companionRemote.remote.audio' => 'Áudio', 'companionRemote.remote.searchHint' => 'Buscar no desktop...', + 'companionRemote.errors.noNetworkInterface' => 'Nenhuma interface de rede encontrada', + 'companionRemote.errors.authenticationFailed' => 'Falha na autenticação', + 'companionRemote.errors.joinTimedOut' => 'Tempo esgotado ao entrar na sessão', + 'companionRemote.errors.failedToConnectAnyAddress' => 'Falha ao conectar a qualquer endereço', + 'companionRemote.errors.connectionLostAfterAttempts' => ({required Object attempts}) => 'Conexão perdida após ${attempts} tentativas', + 'companionRemote.errors.connectionLost' => 'Conexão perdida', 'videoSettings.playbackSpeed' => 'Velocidade de Reprodução', 'videoSettings.zoom' => 'Zoom', 'videoSettings.sleepTimer' => 'Timer de Sono', @@ -2837,6 +2972,40 @@ extension on TranslationsPt { 'videoSettings.performanceOverlay' => 'Overlay de Desempenho', 'videoSettings.audioPassthrough' => 'Passagem de Áudio', 'videoSettings.audioNormalization' => 'Normalizar Volume', + 'performanceOverlay.color' => 'Cor', + 'performanceOverlay.performance' => 'Desempenho', + 'performanceOverlay.buffer' => 'Buffer', + 'performanceOverlay.app' => 'App', + 'performanceOverlay.decoder' => 'Decodificador', + 'performanceOverlay.rawDecoder' => 'Decodificador bruto', + 'performanceOverlay.tunneling' => 'Túnel', + 'performanceOverlay.aspect' => 'Aspecto', + 'performanceOverlay.rotation' => 'Rotação', + 'performanceOverlay.dvSource' => 'Fonte DV', + 'performanceOverlay.dvPath' => 'Caminho DV', + 'performanceOverlay.p7Conversion' => 'Conv. P7', + 'performanceOverlay.sampleRate' => 'Taxa de amostragem', + 'performanceOverlay.pixelFormat' => 'Formato de pixel', + 'performanceOverlay.hwFormat' => 'Formato HW', + 'performanceOverlay.matrix' => 'Matriz', + 'performanceOverlay.primaries' => 'Primárias', + 'performanceOverlay.transfer' => 'Transferência', + 'performanceOverlay.renderFps' => 'FPS render', + 'performanceOverlay.displayFps' => 'FPS tela', + 'performanceOverlay.avSync' => 'Sync A/V', + 'performanceOverlay.dropped' => 'Descartados', + 'performanceOverlay.dvRpus' => 'DV RPUs', + 'performanceOverlay.dvRpuAverage' => 'Média DV RPU', + 'performanceOverlay.dvSampleAverage' => 'Média amostra DV', + 'performanceOverlay.maxLuma' => 'Luma máx.', + 'performanceOverlay.minLuma' => 'Luma mín.', + 'performanceOverlay.maxCll' => 'MaxCLL', + 'performanceOverlay.maxFall' => 'MaxFALL', + 'performanceOverlay.cacheUsed' => 'Cache usado', + 'performanceOverlay.speed' => 'Velocidade', + 'performanceOverlay.player' => 'Player', + 'performanceOverlay.memory' => 'Memória', + 'performanceOverlay.uiFps' => 'UI FPS', 'externalPlayer.title' => 'Player Externo', 'externalPlayer.useExternalPlayer' => 'Usar Player Externo', 'externalPlayer.useExternalPlayerDescription' => 'Abrir vídeos em outro app', @@ -2845,12 +3014,11 @@ extension on TranslationsPt { 'externalPlayer.systemDefault' => 'Padrão do Sistema', 'externalPlayer.addCustomPlayer' => 'Adicionar Player Personalizado', 'externalPlayer.playerName' => 'Nome do Player', + 'externalPlayer.playerNameHint' => 'Meu player', 'externalPlayer.playerCommand' => 'Comando', 'externalPlayer.playerPackage' => 'Nome do Pacote', 'externalPlayer.playerUrlScheme' => 'Esquema de URL', 'externalPlayer.off' => 'Desativado', - _ => null, - } ?? switch (path) { 'externalPlayer.launchFailed' => 'Falha ao abrir player externo', 'externalPlayer.appNotInstalled' => ({required Object name}) => '${name} não está instalado', 'externalPlayer.playInExternalPlayer' => 'Reproduzir no Player Externo', diff --git a/lib/i18n/strings_ru.g.dart b/lib/i18n/strings_ru.g.dart index d4b4f32e..c453c071 100644 --- a/lib/i18n/strings_ru.g.dart +++ b/lib/i18n/strings_ru.g.dart @@ -77,6 +77,7 @@ class TranslationsRu extends Translations with BaseTranslations 'Настройки'; @override String get mute => 'Без звука'; @override String get ok => 'OK'; + @override String get off => 'Выкл.'; + @override String seasonNumber({required Object number}) => 'Сезон ${number}'; + @override String chapterNumber({required Object number}) => 'Глава ${number}'; @override String get reconnect => 'Переподключить'; @override String get exit => 'Выход'; @override String get viewAll => 'Показать все'; @@ -385,6 +389,10 @@ class _TranslationsSettingsRu extends TranslationsSettingsEn { @override String get dvConversionNative => 'Нативно / отключено'; @override String get dvConversionDv81 => 'P7 → P8.1'; @override String get dvConversionHevcStrip => 'P7 → HEVC'; + @override String get dvConversionAutoDescription => 'Использовать определение возможностей устройства и обычное резервное поведение'; + @override String get dvConversionNativeDescription => 'Принудительно использовать нативный DV7 и не повторять DV-конвертацию'; + @override String get dvConversionDv81Description => 'Принудительно выполнять inline-конвертацию RPU в Dolby Vision профиль 8.1'; + @override String get dvConversionHevcStripDescription => 'Удалять слои Dolby Vision RPU/EL и передавать обычный HEVC'; @override String get requireProfileSelectionOnOpen => 'Запрашивать профиль при запуске'; @override String get requireProfileSelectionOnOpenDescription => 'Показывать выбор профиля при каждом открытии приложения'; @override String get forceTvMode => 'Принудительный режим ТВ'; @@ -432,6 +440,8 @@ class _TranslationsHotkeysRu extends TranslationsHotkeysEn { // Translations @override String setShortcutFor({required Object actionName}) => 'Назначить клавишу для ${actionName}'; @override String get clearShortcut => 'Очистить клавишу'; + @override String get noShortcutSet => 'Сочетание не задано'; + @override String get currentShortcut => 'Текущее сочетание:'; @override late final _TranslationsHotkeysActionsRu actions = _TranslationsHotkeysActionsRu._(_root); } @@ -482,6 +492,7 @@ class _TranslationsMediaMenuRu extends TranslationsMediaMenuEn { @override String get goToSeries => 'Перейти к сериалу'; @override String get goToSeason => 'Перейти к сезону'; @override String get shufflePlay => 'Случайное воспроизведение'; + @override String get shuffleNotAvailableOffline => 'Перемешивание недоступно офлайн'; @override String get fileInfo => 'Информация о файле'; @override String get deleteFromServer => 'Удалить с сервера'; @override String get confirmDelete => 'Удалить это медиа и его файлы с сервера?'; @@ -620,6 +631,10 @@ class _TranslationsVideoControlsRu extends TranslationsVideoControlsEn { @override String get searchSubtitles => 'Поиск субтитров'; @override String get language => 'Язык'; @override String get noSubtitlesFound => 'Субтитры не найдены'; + @override String get downloadedSubtitle => 'Загружено'; + @override String get noSubtitlesAvailable => 'Нет доступных субтитров'; + @override String get noAudioTracksAvailable => 'Нет доступных аудиодорожек'; + @override String get noTracksAvailable => 'Нет доступных дорожек'; @override String get subtitleDownloaded => 'Субтитры загружены'; @override String get subtitleDownloadFailed => 'Не удалось загрузить субтитры'; @override String get searchLanguages => 'Поиск языков...'; @@ -808,6 +823,7 @@ class _TranslationsProfilesRu extends TranslationsProfilesEn { @override String get pinExplain => 'Для переключения профилей нужен 4-значный PIN.'; @override String get continueButton => 'Продолжить'; @override String get pinsDontMatch => 'PIN-коды не совпадают'; + @override String get initializeServicesFailed => 'Не удалось инициализировать службы профиля'; } // Path: connections @@ -854,6 +870,7 @@ class _TranslationsDiscoverRu extends TranslationsDiscoverEn { @override String get movie => 'Фильм'; @override String get tvShow => 'Сериал'; @override String minutesLeft({required Object minutes}) => 'Осталось ${minutes} мин'; + @override String get moreLikeThis => 'Похожее'; } // Path: errors @@ -886,6 +903,7 @@ class _TranslationsLibrariesRu extends TranslationsLibrariesEn { // Translations @override String get title => 'Библиотеки'; + @override String get fallbackTitle => 'Библиотека'; @override String get scanLibraryFiles => 'Сканировать файлы библиотеки'; @override String get scanLibrary => 'Сканировать библиотеку'; @override String get analyze => 'Анализировать'; @@ -1018,6 +1036,12 @@ class _TranslationsLiveTvRu extends TranslationsLiveTvEn { @override String get noChannels => 'Нет доступных каналов'; @override String get noDvr => 'DVR не настроен ни на одном сервере'; @override String get noPrograms => 'Нет данных о программах'; + @override String get liveStreamFailed => 'Не удалось запустить прямой эфир'; + @override String get unknownProgram => 'Неизвестная программа'; + @override String get unknownHub => 'Неизвестно'; + @override String get unknownError => 'Неизвестная ошибка'; + @override String channelNumber({required Object number}) => 'Канал ${number}'; + @override String get unknownChannel => 'Неизвестный канал'; @override String get live => 'ЭФИР'; @override String get reloadGuide => 'Перезагрузить программу'; @override String get now => 'Сейчас'; @@ -1224,12 +1248,21 @@ class _TranslationsDownloadsRu extends TranslationsDownloadsEn { @override String get deleteDownload => 'Удалить загрузку'; @override String get retryDownload => 'Повторить загрузку'; @override String get downloadQueued => 'Загрузка поставлена в очередь'; + @override String get downloadResumed => 'Загрузка возобновлена'; @override String get serverErrorBitrate => 'Ошибка сервера: файл может превышать удаленный лимит bitrate'; @override String episodesQueued({required Object count}) => '${count} эпизодов поставлено в очередь загрузки'; @override String get downloadDeleted => 'Загрузка удалена'; @override String deleteConfirm({required Object title}) => 'Удалить "${title}" с этого устройства?'; - @override String deletingWithProgress({required Object title, required Object current, required Object total}) => 'Удаление ${title}... (${current} из ${total})'; + @override String get cancelledDownloadTitle => 'Загрузка отменена'; + @override String get cancelledDownloadMessage => 'Эта загрузка была отменена. Что вы хотите сделать?'; + @override String get allEpisodesAlreadyDownloaded => 'Все эпизоды уже загружены'; + @override String get resumeDownload => 'Возобновить загрузку'; + @override String get cancelledDownload => 'Загрузка отменена'; + @override String syncingFile({required Object file, required Object status}) => '${file} (синхронизация ${status})'; + @override String downloadedFileClickToComplete({required Object file}) => '${file} загружен — нажмите, чтобы завершить'; + @override String get partialDownloadClickToComplete => 'Частично загружено — нажмите, чтобы завершить'; @override String get deleting => 'Удаление...'; + @override String deletingWithProgress({required Object title, required Object current, required Object total}) => 'Удаление ${title}... (${current} из ${total})'; @override String get queuedTooltip => 'В очереди'; @override String queuedFilesTooltip({required Object files}) => 'В очереди: ${files}'; @override String get downloadingTooltip => 'Загрузка...'; @@ -1304,9 +1337,11 @@ class _TranslationsCompanionRemoteRu extends TranslationsCompanionRemoteEn { // Translations @override String get title => 'Пульт управления'; @override String connectedTo({required Object name}) => 'Подключено к ${name}'; + @override String get unknownDevice => 'Неизвестное устройство'; @override late final _TranslationsCompanionRemoteSessionRu session = _TranslationsCompanionRemoteSessionRu._(_root); @override late final _TranslationsCompanionRemotePairingRu pairing = _TranslationsCompanionRemotePairingRu._(_root); @override late final _TranslationsCompanionRemoteRemoteRu remote = _TranslationsCompanionRemoteRemoteRu._(_root); + @override late final _TranslationsCompanionRemoteErrorsRu errors = _TranslationsCompanionRemoteErrorsRu._(_root); } // Path: videoSettings @@ -1328,6 +1363,49 @@ class _TranslationsVideoSettingsRu extends TranslationsVideoSettingsEn { @override String get audioNormalization => 'Нормализация громкости'; } +// Path: performanceOverlay +class _TranslationsPerformanceOverlayRu extends TranslationsPerformanceOverlayEn { + _TranslationsPerformanceOverlayRu._(TranslationsRu root) : this._root = root, super.internal(root); + + final TranslationsRu _root; // ignore: unused_field + + // Translations + @override String get color => 'Цвет'; + @override String get performance => 'Производительность'; + @override String get buffer => 'Буфер'; + @override String get app => 'Приложение'; + @override String get decoder => 'Декодер'; + @override String get rawDecoder => 'Raw-декодер'; + @override String get tunneling => 'Туннелирование'; + @override String get aspect => 'Соотношение'; + @override String get rotation => 'Поворот'; + @override String get dvSource => 'Источник DV'; + @override String get dvPath => 'Путь DV'; + @override String get p7Conversion => 'Конв. P7'; + @override String get sampleRate => 'Частота дискр.'; + @override String get pixelFormat => 'Формат пикселей'; + @override String get hwFormat => 'Формат HW'; + @override String get matrix => 'Матрица'; + @override String get primaries => 'Основные цвета'; + @override String get transfer => 'Передача'; + @override String get renderFps => 'FPS рендера'; + @override String get displayFps => 'FPS дисплея'; + @override String get avSync => 'A/V синхр.'; + @override String get dropped => 'Пропущено'; + @override String get dvRpus => 'DV RPU'; + @override String get dvRpuAverage => 'Сред. DV RPU'; + @override String get dvSampleAverage => 'Сред. сэмпл DV'; + @override String get maxLuma => 'Макс. яркость'; + @override String get minLuma => 'Мин. яркость'; + @override String get maxCll => 'MaxCLL'; + @override String get maxFall => 'MaxFALL'; + @override String get cacheUsed => 'Кэш использован'; + @override String get speed => 'Скорость'; + @override String get player => 'Плеер'; + @override String get memory => 'Память'; + @override String get uiFps => 'UI FPS'; +} + // Path: externalPlayer class _TranslationsExternalPlayerRu extends TranslationsExternalPlayerEn { _TranslationsExternalPlayerRu._(TranslationsRu root) : this._root = root, super.internal(root); @@ -1343,6 +1421,7 @@ class _TranslationsExternalPlayerRu extends TranslationsExternalPlayerEn { @override String get systemDefault => 'Системный по умолчанию'; @override String get addCustomPlayer => 'Добавить свой плеер'; @override String get playerName => 'Название плеера'; + @override String get playerNameHint => 'Мой плеер'; @override String get playerCommand => 'Команда'; @override String get playerPackage => 'Имя пакета'; @override String get playerUrlScheme => 'URL-схема'; @@ -1755,6 +1834,21 @@ class _TranslationsCompanionRemoteRemoteRu extends TranslationsCompanionRemoteRe @override String get searchHint => 'Поиск на десктопе...'; } +// Path: companionRemote.errors +class _TranslationsCompanionRemoteErrorsRu extends TranslationsCompanionRemoteErrorsEn { + _TranslationsCompanionRemoteErrorsRu._(TranslationsRu root) : this._root = root, super.internal(root); + + final TranslationsRu _root; // ignore: unused_field + + // Translations + @override String get noNetworkInterface => 'Сетевой интерфейс не найден'; + @override String get authenticationFailed => 'Ошибка аутентификации'; + @override String get joinTimedOut => 'Время подключения к сеансу истекло'; + @override String get failedToConnectAnyAddress => 'Не удалось подключиться ни к одному адресу'; + @override String connectionLostAfterAttempts({required Object attempts}) => 'Соединение потеряно после ${attempts} попыток'; + @override String get connectionLost => 'Соединение потеряно'; +} + // Path: trackers.services class _TranslationsTrackersServicesRu extends TranslationsTrackersServicesEn { _TranslationsTrackersServicesRu._(TranslationsRu root) : this._root = root, super.internal(root); @@ -1871,6 +1965,9 @@ extension on TranslationsRu { 'common.settings' => 'Настройки', 'common.mute' => 'Без звука', 'common.ok' => 'OK', + 'common.off' => 'Выкл.', + 'common.seasonNumber' => ({required Object number}) => 'Сезон ${number}', + 'common.chapterNumber' => ({required Object number}) => 'Глава ${number}', 'common.reconnect' => 'Переподключить', 'common.exit' => 'Выход', 'common.viewAll' => 'Показать все', @@ -2070,6 +2167,10 @@ extension on TranslationsRu { 'settings.dvConversionNative' => 'Нативно / отключено', 'settings.dvConversionDv81' => 'P7 → P8.1', 'settings.dvConversionHevcStrip' => 'P7 → HEVC', + 'settings.dvConversionAutoDescription' => 'Использовать определение возможностей устройства и обычное резервное поведение', + 'settings.dvConversionNativeDescription' => 'Принудительно использовать нативный DV7 и не повторять DV-конвертацию', + 'settings.dvConversionDv81Description' => 'Принудительно выполнять inline-конвертацию RPU в Dolby Vision профиль 8.1', + 'settings.dvConversionHevcStripDescription' => 'Удалять слои Dolby Vision RPU/EL и передавать обычный HEVC', 'settings.requireProfileSelectionOnOpen' => 'Запрашивать профиль при запуске', 'settings.requireProfileSelectionOnOpenDescription' => 'Показывать выбор профиля при каждом открытии приложения', 'settings.forceTvMode' => 'Принудительный режим ТВ', @@ -2099,6 +2200,8 @@ extension on TranslationsRu { 'search.enterTitleActorOrKeyword' => 'Введите название, актёра или ключевое слово', 'hotkeys.setShortcutFor' => ({required Object actionName}) => 'Назначить клавишу для ${actionName}', 'hotkeys.clearShortcut' => 'Очистить клавишу', + 'hotkeys.noShortcutSet' => 'Сочетание не задано', + 'hotkeys.currentShortcut' => 'Текущее сочетание:', 'hotkeys.actions.playPause' => 'Воспроизведение/Пауза', 'hotkeys.actions.volumeUp' => 'Громкость выше', 'hotkeys.actions.volumeDown' => 'Громкость ниже', @@ -2155,6 +2258,7 @@ extension on TranslationsRu { 'mediaMenu.goToSeries' => 'Перейти к сериалу', 'mediaMenu.goToSeason' => 'Перейти к сезону', 'mediaMenu.shufflePlay' => 'Случайное воспроизведение', + 'mediaMenu.shuffleNotAvailableOffline' => 'Перемешивание недоступно офлайн', 'mediaMenu.fileInfo' => 'Информация о файле', 'mediaMenu.deleteFromServer' => 'Удалить с сервера', 'mediaMenu.confirmDelete' => 'Удалить это медиа и его файлы с сервера?', @@ -2263,6 +2367,10 @@ extension on TranslationsRu { 'videoControls.searchSubtitles' => 'Поиск субтитров', 'videoControls.language' => 'Язык', 'videoControls.noSubtitlesFound' => 'Субтитры не найдены', + 'videoControls.downloadedSubtitle' => 'Загружено', + 'videoControls.noSubtitlesAvailable' => 'Нет доступных субтитров', + 'videoControls.noAudioTracksAvailable' => 'Нет доступных аудиодорожек', + 'videoControls.noTracksAvailable' => 'Нет доступных дорожек', 'videoControls.subtitleDownloaded' => 'Субтитры загружены', 'videoControls.subtitleDownloadFailed' => 'Не удалось загрузить субтитры', 'videoControls.searchLanguages' => 'Поиск языков...', @@ -2321,6 +2429,8 @@ extension on TranslationsRu { 'subtitlingStyling.borderColor' => 'Цвет обводки', 'subtitlingStyling.backgroundOpacity' => 'Прозрачность фона', 'subtitlingStyling.backgroundColor' => 'Цвет фона', + _ => null, + } ?? switch (path) { 'subtitlingStyling.position' => 'Позиция', 'subtitlingStyling.assOverride' => 'Переопределение ASS', 'subtitlingStyling.bold' => 'Жирный', @@ -2335,8 +2445,6 @@ extension on TranslationsRu { 'mpvConfig.loadPreset' => 'Загрузить', 'mpvConfig.deletePreset' => 'Удалить', 'mpvConfig.presetSaved' => 'Пресет сохранён', - _ => null, - } ?? switch (path) { 'mpvConfig.presetLoaded' => 'Пресет загружен', 'mpvConfig.presetDeleted' => 'Пресет удалён', 'mpvConfig.confirmDeletePreset' => 'Вы уверены, что хотите удалить этот пресет?', @@ -2399,6 +2507,7 @@ extension on TranslationsRu { 'profiles.pinExplain' => 'Для переключения профилей нужен 4-значный PIN.', 'profiles.continueButton' => 'Продолжить', 'profiles.pinsDontMatch' => 'PIN-коды не совпадают', + 'profiles.initializeServicesFailed' => 'Не удалось инициализировать службы профиля', 'connections.sectionTitle' => 'Подключения', 'connections.addConnection' => 'Добавить подключение', 'connections.addConnectionSubtitleNoProfile' => 'Войдите через Plex или подключите сервер Jellyfin', @@ -2427,6 +2536,7 @@ extension on TranslationsRu { 'discover.movie' => 'Фильм', 'discover.tvShow' => 'Сериал', 'discover.minutesLeft' => ({required Object minutes}) => 'Осталось ${minutes} мин', + 'discover.moreLikeThis' => 'Похожее', 'errors.searchFailed' => ({required Object error}) => 'Ошибка поиска: ${error}', 'errors.connectionTimeout' => ({required Object context}) => 'Таймаут подключения при загрузке ${context}', 'errors.connectionFailed' => 'Не удалось подключиться к медиасерверу', @@ -2441,6 +2551,7 @@ extension on TranslationsRu { 'errors.failedToDeleteProfile' => ({required Object displayName}) => 'Не удалось удалить ${displayName}', 'errors.failedToRate' => 'Не удалось обновить оценку', 'libraries.title' => 'Библиотеки', + 'libraries.fallbackTitle' => 'Библиотека', 'libraries.scanLibraryFiles' => 'Сканировать файлы библиотеки', 'libraries.scanLibrary' => 'Сканировать библиотеку', 'libraries.analyze' => 'Анализировать', @@ -2541,6 +2652,12 @@ extension on TranslationsRu { 'liveTv.noChannels' => 'Нет доступных каналов', 'liveTv.noDvr' => 'DVR не настроен ни на одном сервере', 'liveTv.noPrograms' => 'Нет данных о программах', + 'liveTv.liveStreamFailed' => 'Не удалось запустить прямой эфир', + 'liveTv.unknownProgram' => 'Неизвестная программа', + 'liveTv.unknownHub' => 'Неизвестно', + 'liveTv.unknownError' => 'Неизвестная ошибка', + 'liveTv.channelNumber' => ({required Object number}) => 'Канал ${number}', + 'liveTv.unknownChannel' => 'Неизвестный канал', 'liveTv.live' => 'ЭФИР', 'liveTv.reloadGuide' => 'Перезагрузить программу', 'liveTv.now' => 'Сейчас', @@ -2711,12 +2828,21 @@ extension on TranslationsRu { 'downloads.deleteDownload' => 'Удалить загрузку', 'downloads.retryDownload' => 'Повторить загрузку', 'downloads.downloadQueued' => 'Загрузка поставлена в очередь', + 'downloads.downloadResumed' => 'Загрузка возобновлена', 'downloads.serverErrorBitrate' => 'Ошибка сервера: файл может превышать удаленный лимит bitrate', 'downloads.episodesQueued' => ({required Object count}) => '${count} эпизодов поставлено в очередь загрузки', 'downloads.downloadDeleted' => 'Загрузка удалена', 'downloads.deleteConfirm' => ({required Object title}) => 'Удалить "${title}" с этого устройства?', - 'downloads.deletingWithProgress' => ({required Object title, required Object current, required Object total}) => 'Удаление ${title}... (${current} из ${total})', + 'downloads.cancelledDownloadTitle' => 'Загрузка отменена', + 'downloads.cancelledDownloadMessage' => 'Эта загрузка была отменена. Что вы хотите сделать?', + 'downloads.allEpisodesAlreadyDownloaded' => 'Все эпизоды уже загружены', + 'downloads.resumeDownload' => 'Возобновить загрузку', + 'downloads.cancelledDownload' => 'Загрузка отменена', + 'downloads.syncingFile' => ({required Object file, required Object status}) => '${file} (синхронизация ${status})', + 'downloads.downloadedFileClickToComplete' => ({required Object file}) => '${file} загружен — нажмите, чтобы завершить', + 'downloads.partialDownloadClickToComplete' => 'Частично загружено — нажмите, чтобы завершить', 'downloads.deleting' => 'Удаление...', + 'downloads.deletingWithProgress' => ({required Object title, required Object current, required Object total}) => 'Удаление ${title}... (${current} из ${total})', 'downloads.queuedTooltip' => 'В очереди', 'downloads.queuedFilesTooltip' => ({required Object files}) => 'В очереди: ${files}', 'downloads.downloadingTooltip' => 'Загрузка...', @@ -2773,6 +2899,7 @@ extension on TranslationsRu { 'shaders.deleteShaderConfirm' => ({required Object name}) => 'Удалить "${name}"?', 'companionRemote.title' => 'Пульт управления', 'companionRemote.connectedTo' => ({required Object name}) => 'Подключено к ${name}', + 'companionRemote.unknownDevice' => 'Неизвестное устройство', 'companionRemote.session.startingServer' => 'Запуск удалённого сервера...', 'companionRemote.session.failedToCreate' => 'Не удалось запустить удалённый сервер:', 'companionRemote.session.hostAddress' => 'Адрес хоста', @@ -2816,6 +2943,8 @@ extension on TranslationsRu { 'companionRemote.remote.tabSettings' => 'Настройки', 'companionRemote.remote.previous' => 'Предыдущий', 'companionRemote.remote.playPause' => 'Воспроизведение/Пауза', + _ => null, + } ?? switch (path) { 'companionRemote.remote.next' => 'Следующий', 'companionRemote.remote.seekBack' => 'Назад', 'companionRemote.remote.stop' => 'Стоп', @@ -2827,6 +2956,12 @@ extension on TranslationsRu { 'companionRemote.remote.subtitles' => 'Субтитры', 'companionRemote.remote.audio' => 'Аудио', 'companionRemote.remote.searchHint' => 'Поиск на десктопе...', + 'companionRemote.errors.noNetworkInterface' => 'Сетевой интерфейс не найден', + 'companionRemote.errors.authenticationFailed' => 'Ошибка аутентификации', + 'companionRemote.errors.joinTimedOut' => 'Время подключения к сеансу истекло', + 'companionRemote.errors.failedToConnectAnyAddress' => 'Не удалось подключиться ни к одному адресу', + 'companionRemote.errors.connectionLostAfterAttempts' => ({required Object attempts}) => 'Соединение потеряно после ${attempts} попыток', + 'companionRemote.errors.connectionLost' => 'Соединение потеряно', 'videoSettings.playbackSpeed' => 'Скорость воспроизведения', 'videoSettings.zoom' => 'Масштаб', 'videoSettings.sleepTimer' => 'Таймер сна', @@ -2837,6 +2972,40 @@ extension on TranslationsRu { 'videoSettings.performanceOverlay' => 'Оверлей производительности', 'videoSettings.audioPassthrough' => 'Сквозной вывод аудио', 'videoSettings.audioNormalization' => 'Нормализация громкости', + 'performanceOverlay.color' => 'Цвет', + 'performanceOverlay.performance' => 'Производительность', + 'performanceOverlay.buffer' => 'Буфер', + 'performanceOverlay.app' => 'Приложение', + 'performanceOverlay.decoder' => 'Декодер', + 'performanceOverlay.rawDecoder' => 'Raw-декодер', + 'performanceOverlay.tunneling' => 'Туннелирование', + 'performanceOverlay.aspect' => 'Соотношение', + 'performanceOverlay.rotation' => 'Поворот', + 'performanceOverlay.dvSource' => 'Источник DV', + 'performanceOverlay.dvPath' => 'Путь DV', + 'performanceOverlay.p7Conversion' => 'Конв. P7', + 'performanceOverlay.sampleRate' => 'Частота дискр.', + 'performanceOverlay.pixelFormat' => 'Формат пикселей', + 'performanceOverlay.hwFormat' => 'Формат HW', + 'performanceOverlay.matrix' => 'Матрица', + 'performanceOverlay.primaries' => 'Основные цвета', + 'performanceOverlay.transfer' => 'Передача', + 'performanceOverlay.renderFps' => 'FPS рендера', + 'performanceOverlay.displayFps' => 'FPS дисплея', + 'performanceOverlay.avSync' => 'A/V синхр.', + 'performanceOverlay.dropped' => 'Пропущено', + 'performanceOverlay.dvRpus' => 'DV RPU', + 'performanceOverlay.dvRpuAverage' => 'Сред. DV RPU', + 'performanceOverlay.dvSampleAverage' => 'Сред. сэмпл DV', + 'performanceOverlay.maxLuma' => 'Макс. яркость', + 'performanceOverlay.minLuma' => 'Мин. яркость', + 'performanceOverlay.maxCll' => 'MaxCLL', + 'performanceOverlay.maxFall' => 'MaxFALL', + 'performanceOverlay.cacheUsed' => 'Кэш использован', + 'performanceOverlay.speed' => 'Скорость', + 'performanceOverlay.player' => 'Плеер', + 'performanceOverlay.memory' => 'Память', + 'performanceOverlay.uiFps' => 'UI FPS', 'externalPlayer.title' => 'Внешний плеер', 'externalPlayer.useExternalPlayer' => 'Использовать внешний плеер', 'externalPlayer.useExternalPlayerDescription' => 'Открывать видео в другом приложении', @@ -2845,12 +3014,11 @@ extension on TranslationsRu { 'externalPlayer.systemDefault' => 'Системный по умолчанию', 'externalPlayer.addCustomPlayer' => 'Добавить свой плеер', 'externalPlayer.playerName' => 'Название плеера', + 'externalPlayer.playerNameHint' => 'Мой плеер', 'externalPlayer.playerCommand' => 'Команда', 'externalPlayer.playerPackage' => 'Имя пакета', 'externalPlayer.playerUrlScheme' => 'URL-схема', 'externalPlayer.off' => 'Выкл.', - _ => null, - } ?? switch (path) { 'externalPlayer.launchFailed' => 'Не удалось открыть внешний плеер', 'externalPlayer.appNotInstalled' => ({required Object name}) => '${name} не установлен', 'externalPlayer.playInExternalPlayer' => 'Воспроизвести во внешнем плеере', diff --git a/lib/i18n/strings_sv.g.dart b/lib/i18n/strings_sv.g.dart index 35401ae4..a040baa9 100644 --- a/lib/i18n/strings_sv.g.dart +++ b/lib/i18n/strings_sv.g.dart @@ -77,6 +77,7 @@ class TranslationsSv extends Translations with BaseTranslations 'Mer'; @override String get mute => 'Ljud av'; @override String get ok => 'OK'; + @override String get off => 'Av'; + @override String seasonNumber({required Object number}) => 'Säsong ${number}'; + @override String chapterNumber({required Object number}) => 'Kapitel ${number}'; @override String get reconnect => 'Återanslut'; @override String get exit => 'Avsluta'; @override String get viewAll => 'Visa alla'; @@ -385,6 +389,10 @@ class _TranslationsSettingsSv extends TranslationsSettingsEn { @override String get dvConversionNative => 'Inbyggt / inaktiverat'; @override String get dvConversionDv81 => 'P7 → P8.1'; @override String get dvConversionHevcStrip => 'P7 → HEVC'; + @override String get dvConversionAutoDescription => 'Använd enhetens kapabilitetsdetektering och normalt reservbeteende'; + @override String get dvConversionNativeDescription => 'Tvinga native DV7 och undertryck försök till DV-konvertering'; + @override String get dvConversionDv81Description => 'Tvinga inline RPU-konvertering till Dolby Vision profil 8.1'; + @override String get dvConversionHevcStripDescription => 'Ta bort Dolby Vision RPU/EL-lager och presentera vanlig HEVC'; @override String get requireProfileSelectionOnOpen => 'Fråga efter profil vid appstart'; @override String get requireProfileSelectionOnOpenDescription => 'Visa profilval varje gång appen öppnas'; @override String get forceTvMode => 'Tvinga TV-läge'; @@ -432,6 +440,8 @@ class _TranslationsHotkeysSv extends TranslationsHotkeysEn { // Translations @override String setShortcutFor({required Object actionName}) => 'Sätt genväg för ${actionName}'; @override String get clearShortcut => 'Rensa genväg'; + @override String get noShortcutSet => 'Ingen genväg angiven'; + @override String get currentShortcut => 'Aktuell genväg:'; @override late final _TranslationsHotkeysActionsSv actions = _TranslationsHotkeysActionsSv._(_root); } @@ -482,6 +492,7 @@ class _TranslationsMediaMenuSv extends TranslationsMediaMenuEn { @override String get goToSeries => 'Gå till serie'; @override String get goToSeason => 'Gå till säsong'; @override String get shufflePlay => 'Blanda uppspelning'; + @override String get shuffleNotAvailableOffline => 'Blandad uppspelning är inte tillgänglig offline'; @override String get fileInfo => 'Filinformation'; @override String get deleteFromServer => 'Ta bort från servern'; @override String get confirmDelete => 'Ta bort detta media och dess filer från din server?'; @@ -620,6 +631,10 @@ class _TranslationsVideoControlsSv extends TranslationsVideoControlsEn { @override String get searchSubtitles => 'Sök undertexter'; @override String get language => 'Språk'; @override String get noSubtitlesFound => 'Inga undertexter hittades'; + @override String get downloadedSubtitle => 'Nedladdad'; + @override String get noSubtitlesAvailable => 'Inga undertexter tillgängliga'; + @override String get noAudioTracksAvailable => 'Inga ljudspår tillgängliga'; + @override String get noTracksAvailable => 'Inga spår tillgängliga'; @override String get subtitleDownloaded => 'Undertext nedladdad'; @override String get subtitleDownloadFailed => 'Kunde inte ladda ner undertext'; @override String get searchLanguages => 'Sök språk...'; @@ -808,6 +823,7 @@ class _TranslationsProfilesSv extends TranslationsProfilesEn { @override String get pinExplain => '4-siffrig PIN krävs för att byta profiler.'; @override String get continueButton => 'Fortsätt'; @override String get pinsDontMatch => 'PIN-koderna stämmer inte överens'; + @override String get initializeServicesFailed => 'Kunde inte initiera profiltjänster'; } // Path: connections @@ -854,6 +870,7 @@ class _TranslationsDiscoverSv extends TranslationsDiscoverEn { @override String get movie => 'Film'; @override String get tvShow => 'TV-serie'; @override String minutesLeft({required Object minutes}) => '${minutes} min kvar'; + @override String get moreLikeThis => 'Mer som detta'; } // Path: errors @@ -886,6 +903,7 @@ class _TranslationsLibrariesSv extends TranslationsLibrariesEn { // Translations @override String get title => 'Bibliotek'; + @override String get fallbackTitle => 'Bibliotek'; @override String get scanLibraryFiles => 'Skanna biblioteksfiler'; @override String get scanLibrary => 'Skanna bibliotek'; @override String get analyze => 'Analysera'; @@ -1018,6 +1036,12 @@ class _TranslationsLiveTvSv extends TranslationsLiveTvEn { @override String get noChannels => 'Inga kanaler tillgängliga'; @override String get noDvr => 'Ingen DVR konfigurerad på någon server'; @override String get noPrograms => 'Ingen programdata tillgänglig'; + @override String get liveStreamFailed => 'Liveström misslyckades'; + @override String get unknownProgram => 'Okänt program'; + @override String get unknownHub => 'Okänt'; + @override String get unknownError => 'Okänt fel'; + @override String channelNumber({required Object number}) => 'Kanal ${number}'; + @override String get unknownChannel => 'Okänd kanal'; @override String get live => 'LIVE'; @override String get reloadGuide => 'Ladda om programguide'; @override String get now => 'Nu'; @@ -1224,12 +1248,21 @@ class _TranslationsDownloadsSv extends TranslationsDownloadsEn { @override String get deleteDownload => 'Ta bort nedladdning'; @override String get retryDownload => 'Försök igen'; @override String get downloadQueued => 'Nedladdning köad'; + @override String get downloadResumed => 'Nedladdning återupptagen'; @override String get serverErrorBitrate => 'Serverfel: filen kan överskrida gränsen för fjärrbitrate'; @override String episodesQueued({required Object count}) => '${count} avsnitt köade för nedladdning'; @override String get downloadDeleted => 'Nedladdning borttagen'; @override String deleteConfirm({required Object title}) => 'Ta bort "${title}" från den här enheten?'; - @override String deletingWithProgress({required Object title, required Object current, required Object total}) => 'Tar bort ${title}... (${current} av ${total})'; + @override String get cancelledDownloadTitle => 'Avbruten nedladdning'; + @override String get cancelledDownloadMessage => 'Den här nedladdningen avbröts. Vad vill du göra?'; + @override String get allEpisodesAlreadyDownloaded => 'Alla avsnitt är redan nedladdade'; + @override String get resumeDownload => 'Återuppta nedladdning'; + @override String get cancelledDownload => 'Avbruten nedladdning'; + @override String syncingFile({required Object file, required Object status}) => '${file} (synkroniserar ${status})'; + @override String downloadedFileClickToComplete({required Object file}) => '${file} nedladdad – klicka för att slutföra'; + @override String get partialDownloadClickToComplete => 'Delvis nedladdad – klicka för att slutföra'; @override String get deleting => 'Tar bort...'; + @override String deletingWithProgress({required Object title, required Object current, required Object total}) => 'Tar bort ${title}... (${current} av ${total})'; @override String get queuedTooltip => 'I kö'; @override String queuedFilesTooltip({required Object files}) => 'I kö: ${files}'; @override String get downloadingTooltip => 'Laddar ned...'; @@ -1304,9 +1337,11 @@ class _TranslationsCompanionRemoteSv extends TranslationsCompanionRemoteEn { // Translations @override String get title => 'Fjärrkontroll'; @override String connectedTo({required Object name}) => 'Ansluten till ${name}'; + @override String get unknownDevice => 'Okänd enhet'; @override late final _TranslationsCompanionRemoteSessionSv session = _TranslationsCompanionRemoteSessionSv._(_root); @override late final _TranslationsCompanionRemotePairingSv pairing = _TranslationsCompanionRemotePairingSv._(_root); @override late final _TranslationsCompanionRemoteRemoteSv remote = _TranslationsCompanionRemoteRemoteSv._(_root); + @override late final _TranslationsCompanionRemoteErrorsSv errors = _TranslationsCompanionRemoteErrorsSv._(_root); } // Path: videoSettings @@ -1328,6 +1363,49 @@ class _TranslationsVideoSettingsSv extends TranslationsVideoSettingsEn { @override String get audioNormalization => 'Normalisera ljudstyrka'; } +// Path: performanceOverlay +class _TranslationsPerformanceOverlaySv extends TranslationsPerformanceOverlayEn { + _TranslationsPerformanceOverlaySv._(TranslationsSv root) : this._root = root, super.internal(root); + + final TranslationsSv _root; // ignore: unused_field + + // Translations + @override String get color => 'Färg'; + @override String get performance => 'Prestanda'; + @override String get buffer => 'Buffert'; + @override String get app => 'App'; + @override String get decoder => 'Dekoder'; + @override String get rawDecoder => 'Rå dekoder'; + @override String get tunneling => 'Tunneling'; + @override String get aspect => 'Bildformat'; + @override String get rotation => 'Rotation'; + @override String get dvSource => 'DV-källa'; + @override String get dvPath => 'DV-sökväg'; + @override String get p7Conversion => 'P7-konv.'; + @override String get sampleRate => 'Samplingsfrekvens'; + @override String get pixelFormat => 'Pixelformat'; + @override String get hwFormat => 'HW-format'; + @override String get matrix => 'Matris'; + @override String get primaries => 'Primärfärger'; + @override String get transfer => 'Transfer'; + @override String get renderFps => 'Render-FPS'; + @override String get displayFps => 'Skärm-FPS'; + @override String get avSync => 'A/V-synk'; + @override String get dropped => 'Tappade'; + @override String get dvRpus => 'DV RPU:er'; + @override String get dvRpuAverage => 'DV RPU snitt'; + @override String get dvSampleAverage => 'DV-sample snitt'; + @override String get maxLuma => 'Max luma'; + @override String get minLuma => 'Min luma'; + @override String get maxCll => 'MaxCLL'; + @override String get maxFall => 'MaxFALL'; + @override String get cacheUsed => 'Cache använd'; + @override String get speed => 'Hastighet'; + @override String get player => 'Spelare'; + @override String get memory => 'Minne'; + @override String get uiFps => 'UI FPS'; +} + // Path: externalPlayer class _TranslationsExternalPlayerSv extends TranslationsExternalPlayerEn { _TranslationsExternalPlayerSv._(TranslationsSv root) : this._root = root, super.internal(root); @@ -1343,6 +1421,7 @@ class _TranslationsExternalPlayerSv extends TranslationsExternalPlayerEn { @override String get systemDefault => 'Systemstandard'; @override String get addCustomPlayer => 'Lägg till anpassad spelare'; @override String get playerName => 'Spelarnamn'; + @override String get playerNameHint => 'Min spelare'; @override String get playerCommand => 'Kommando'; @override String get playerPackage => 'Paketnamn'; @override String get playerUrlScheme => 'URL-schema'; @@ -1755,6 +1834,21 @@ class _TranslationsCompanionRemoteRemoteSv extends TranslationsCompanionRemoteRe @override String get searchHint => 'Sök på datorn...'; } +// Path: companionRemote.errors +class _TranslationsCompanionRemoteErrorsSv extends TranslationsCompanionRemoteErrorsEn { + _TranslationsCompanionRemoteErrorsSv._(TranslationsSv root) : this._root = root, super.internal(root); + + final TranslationsSv _root; // ignore: unused_field + + // Translations + @override String get noNetworkInterface => 'Inget nätverksgränssnitt hittades'; + @override String get authenticationFailed => 'Autentisering misslyckades'; + @override String get joinTimedOut => 'Tidsgräns vid anslutning till session'; + @override String get failedToConnectAnyAddress => 'Kunde inte ansluta till någon adress'; + @override String connectionLostAfterAttempts({required Object attempts}) => 'Anslutning förlorad efter ${attempts} försök'; + @override String get connectionLost => 'Anslutning förlorad'; +} + // Path: trackers.services class _TranslationsTrackersServicesSv extends TranslationsTrackersServicesEn { _TranslationsTrackersServicesSv._(TranslationsSv root) : this._root = root, super.internal(root); @@ -1871,6 +1965,9 @@ extension on TranslationsSv { 'common.settings' => 'Mer', 'common.mute' => 'Ljud av', 'common.ok' => 'OK', + 'common.off' => 'Av', + 'common.seasonNumber' => ({required Object number}) => 'Säsong ${number}', + 'common.chapterNumber' => ({required Object number}) => 'Kapitel ${number}', 'common.reconnect' => 'Återanslut', 'common.exit' => 'Avsluta', 'common.viewAll' => 'Visa alla', @@ -2070,6 +2167,10 @@ extension on TranslationsSv { 'settings.dvConversionNative' => 'Inbyggt / inaktiverat', 'settings.dvConversionDv81' => 'P7 → P8.1', 'settings.dvConversionHevcStrip' => 'P7 → HEVC', + 'settings.dvConversionAutoDescription' => 'Använd enhetens kapabilitetsdetektering och normalt reservbeteende', + 'settings.dvConversionNativeDescription' => 'Tvinga native DV7 och undertryck försök till DV-konvertering', + 'settings.dvConversionDv81Description' => 'Tvinga inline RPU-konvertering till Dolby Vision profil 8.1', + 'settings.dvConversionHevcStripDescription' => 'Ta bort Dolby Vision RPU/EL-lager och presentera vanlig HEVC', 'settings.requireProfileSelectionOnOpen' => 'Fråga efter profil vid appstart', 'settings.requireProfileSelectionOnOpenDescription' => 'Visa profilval varje gång appen öppnas', 'settings.forceTvMode' => 'Tvinga TV-läge', @@ -2099,6 +2200,8 @@ extension on TranslationsSv { 'search.enterTitleActorOrKeyword' => 'Ange en titel, skådespelare eller nyckelord', 'hotkeys.setShortcutFor' => ({required Object actionName}) => 'Sätt genväg för ${actionName}', 'hotkeys.clearShortcut' => 'Rensa genväg', + 'hotkeys.noShortcutSet' => 'Ingen genväg angiven', + 'hotkeys.currentShortcut' => 'Aktuell genväg:', 'hotkeys.actions.playPause' => 'Spela/Pausa', 'hotkeys.actions.volumeUp' => 'Höj volym', 'hotkeys.actions.volumeDown' => 'Sänk volym', @@ -2155,6 +2258,7 @@ extension on TranslationsSv { 'mediaMenu.goToSeries' => 'Gå till serie', 'mediaMenu.goToSeason' => 'Gå till säsong', 'mediaMenu.shufflePlay' => 'Blanda uppspelning', + 'mediaMenu.shuffleNotAvailableOffline' => 'Blandad uppspelning är inte tillgänglig offline', 'mediaMenu.fileInfo' => 'Filinformation', 'mediaMenu.deleteFromServer' => 'Ta bort från servern', 'mediaMenu.confirmDelete' => 'Ta bort detta media och dess filer från din server?', @@ -2263,6 +2367,10 @@ extension on TranslationsSv { 'videoControls.searchSubtitles' => 'Sök undertexter', 'videoControls.language' => 'Språk', 'videoControls.noSubtitlesFound' => 'Inga undertexter hittades', + 'videoControls.downloadedSubtitle' => 'Nedladdad', + 'videoControls.noSubtitlesAvailable' => 'Inga undertexter tillgängliga', + 'videoControls.noAudioTracksAvailable' => 'Inga ljudspår tillgängliga', + 'videoControls.noTracksAvailable' => 'Inga spår tillgängliga', 'videoControls.subtitleDownloaded' => 'Undertext nedladdad', 'videoControls.subtitleDownloadFailed' => 'Kunde inte ladda ner undertext', 'videoControls.searchLanguages' => 'Sök språk...', @@ -2321,6 +2429,8 @@ extension on TranslationsSv { 'subtitlingStyling.borderColor' => 'Kantfärg', 'subtitlingStyling.backgroundOpacity' => 'Bakgrundsopacitet', 'subtitlingStyling.backgroundColor' => 'Bakgrundsfärg', + _ => null, + } ?? switch (path) { 'subtitlingStyling.position' => 'Position', 'subtitlingStyling.assOverride' => 'ASS-åsidosättning', 'subtitlingStyling.bold' => 'Fet', @@ -2335,8 +2445,6 @@ extension on TranslationsSv { 'mpvConfig.loadPreset' => 'Ladda', 'mpvConfig.deletePreset' => 'Ta bort', 'mpvConfig.presetSaved' => 'Förval sparat', - _ => null, - } ?? switch (path) { 'mpvConfig.presetLoaded' => 'Förval laddat', 'mpvConfig.presetDeleted' => 'Förval borttaget', 'mpvConfig.confirmDeletePreset' => 'Är du säker på att du vill ta bort detta förval?', @@ -2399,6 +2507,7 @@ extension on TranslationsSv { 'profiles.pinExplain' => '4-siffrig PIN krävs för att byta profiler.', 'profiles.continueButton' => 'Fortsätt', 'profiles.pinsDontMatch' => 'PIN-koderna stämmer inte överens', + 'profiles.initializeServicesFailed' => 'Kunde inte initiera profiltjänster', 'connections.sectionTitle' => 'Anslutningar', 'connections.addConnection' => 'Lägg till anslutning', 'connections.addConnectionSubtitleNoProfile' => 'Logga in med Plex eller anslut en Jellyfin-server', @@ -2427,6 +2536,7 @@ extension on TranslationsSv { 'discover.movie' => 'Film', 'discover.tvShow' => 'TV-serie', 'discover.minutesLeft' => ({required Object minutes}) => '${minutes} min kvar', + 'discover.moreLikeThis' => 'Mer som detta', 'errors.searchFailed' => ({required Object error}) => 'Sökning misslyckades: ${error}', 'errors.connectionTimeout' => ({required Object context}) => 'Anslutnings-timeout vid laddning ${context}', 'errors.connectionFailed' => 'Kan inte ansluta till mediaserver', @@ -2441,6 +2551,7 @@ extension on TranslationsSv { 'errors.failedToDeleteProfile' => ({required Object displayName}) => 'Misslyckades att ta bort ${displayName}', 'errors.failedToRate' => 'Det gick inte att uppdatera betyget', 'libraries.title' => 'Bibliotek', + 'libraries.fallbackTitle' => 'Bibliotek', 'libraries.scanLibraryFiles' => 'Skanna biblioteksfiler', 'libraries.scanLibrary' => 'Skanna bibliotek', 'libraries.analyze' => 'Analysera', @@ -2541,6 +2652,12 @@ extension on TranslationsSv { 'liveTv.noChannels' => 'Inga kanaler tillgängliga', 'liveTv.noDvr' => 'Ingen DVR konfigurerad på någon server', 'liveTv.noPrograms' => 'Ingen programdata tillgänglig', + 'liveTv.liveStreamFailed' => 'Liveström misslyckades', + 'liveTv.unknownProgram' => 'Okänt program', + 'liveTv.unknownHub' => 'Okänt', + 'liveTv.unknownError' => 'Okänt fel', + 'liveTv.channelNumber' => ({required Object number}) => 'Kanal ${number}', + 'liveTv.unknownChannel' => 'Okänd kanal', 'liveTv.live' => 'LIVE', 'liveTv.reloadGuide' => 'Ladda om programguide', 'liveTv.now' => 'Nu', @@ -2711,12 +2828,21 @@ extension on TranslationsSv { 'downloads.deleteDownload' => 'Ta bort nedladdning', 'downloads.retryDownload' => 'Försök igen', 'downloads.downloadQueued' => 'Nedladdning köad', + 'downloads.downloadResumed' => 'Nedladdning återupptagen', 'downloads.serverErrorBitrate' => 'Serverfel: filen kan överskrida gränsen för fjärrbitrate', 'downloads.episodesQueued' => ({required Object count}) => '${count} avsnitt köade för nedladdning', 'downloads.downloadDeleted' => 'Nedladdning borttagen', 'downloads.deleteConfirm' => ({required Object title}) => 'Ta bort "${title}" från den här enheten?', - 'downloads.deletingWithProgress' => ({required Object title, required Object current, required Object total}) => 'Tar bort ${title}... (${current} av ${total})', + 'downloads.cancelledDownloadTitle' => 'Avbruten nedladdning', + 'downloads.cancelledDownloadMessage' => 'Den här nedladdningen avbröts. Vad vill du göra?', + 'downloads.allEpisodesAlreadyDownloaded' => 'Alla avsnitt är redan nedladdade', + 'downloads.resumeDownload' => 'Återuppta nedladdning', + 'downloads.cancelledDownload' => 'Avbruten nedladdning', + 'downloads.syncingFile' => ({required Object file, required Object status}) => '${file} (synkroniserar ${status})', + 'downloads.downloadedFileClickToComplete' => ({required Object file}) => '${file} nedladdad – klicka för att slutföra', + 'downloads.partialDownloadClickToComplete' => 'Delvis nedladdad – klicka för att slutföra', 'downloads.deleting' => 'Tar bort...', + 'downloads.deletingWithProgress' => ({required Object title, required Object current, required Object total}) => 'Tar bort ${title}... (${current} av ${total})', 'downloads.queuedTooltip' => 'I kö', 'downloads.queuedFilesTooltip' => ({required Object files}) => 'I kö: ${files}', 'downloads.downloadingTooltip' => 'Laddar ned...', @@ -2773,6 +2899,7 @@ extension on TranslationsSv { 'shaders.deleteShaderConfirm' => ({required Object name}) => 'Ta bort "${name}"?', 'companionRemote.title' => 'Fjärrkontroll', 'companionRemote.connectedTo' => ({required Object name}) => 'Ansluten till ${name}', + 'companionRemote.unknownDevice' => 'Okänd enhet', 'companionRemote.session.startingServer' => 'Startar fjärrserver...', 'companionRemote.session.failedToCreate' => 'Kunde inte starta fjärrserver:', 'companionRemote.session.hostAddress' => 'Värdadress', @@ -2816,6 +2943,8 @@ extension on TranslationsSv { 'companionRemote.remote.tabSettings' => 'Inställningar', 'companionRemote.remote.previous' => 'Föregående', 'companionRemote.remote.playPause' => 'Spela/Pausa', + _ => null, + } ?? switch (path) { 'companionRemote.remote.next' => 'Nästa', 'companionRemote.remote.seekBack' => 'Spola bakåt', 'companionRemote.remote.stop' => 'Stopp', @@ -2827,6 +2956,12 @@ extension on TranslationsSv { 'companionRemote.remote.subtitles' => 'Undertexter', 'companionRemote.remote.audio' => 'Ljud', 'companionRemote.remote.searchHint' => 'Sök på datorn...', + 'companionRemote.errors.noNetworkInterface' => 'Inget nätverksgränssnitt hittades', + 'companionRemote.errors.authenticationFailed' => 'Autentisering misslyckades', + 'companionRemote.errors.joinTimedOut' => 'Tidsgräns vid anslutning till session', + 'companionRemote.errors.failedToConnectAnyAddress' => 'Kunde inte ansluta till någon adress', + 'companionRemote.errors.connectionLostAfterAttempts' => ({required Object attempts}) => 'Anslutning förlorad efter ${attempts} försök', + 'companionRemote.errors.connectionLost' => 'Anslutning förlorad', 'videoSettings.playbackSpeed' => 'Uppspelningshastighet', 'videoSettings.zoom' => 'Zoom', 'videoSettings.sleepTimer' => 'Sovtimer', @@ -2837,6 +2972,40 @@ extension on TranslationsSv { 'videoSettings.performanceOverlay' => 'Prestandaöverlägg', 'videoSettings.audioPassthrough' => 'Ljudgenomkoppling', 'videoSettings.audioNormalization' => 'Normalisera ljudstyrka', + 'performanceOverlay.color' => 'Färg', + 'performanceOverlay.performance' => 'Prestanda', + 'performanceOverlay.buffer' => 'Buffert', + 'performanceOverlay.app' => 'App', + 'performanceOverlay.decoder' => 'Dekoder', + 'performanceOverlay.rawDecoder' => 'Rå dekoder', + 'performanceOverlay.tunneling' => 'Tunneling', + 'performanceOverlay.aspect' => 'Bildformat', + 'performanceOverlay.rotation' => 'Rotation', + 'performanceOverlay.dvSource' => 'DV-källa', + 'performanceOverlay.dvPath' => 'DV-sökväg', + 'performanceOverlay.p7Conversion' => 'P7-konv.', + 'performanceOverlay.sampleRate' => 'Samplingsfrekvens', + 'performanceOverlay.pixelFormat' => 'Pixelformat', + 'performanceOverlay.hwFormat' => 'HW-format', + 'performanceOverlay.matrix' => 'Matris', + 'performanceOverlay.primaries' => 'Primärfärger', + 'performanceOverlay.transfer' => 'Transfer', + 'performanceOverlay.renderFps' => 'Render-FPS', + 'performanceOverlay.displayFps' => 'Skärm-FPS', + 'performanceOverlay.avSync' => 'A/V-synk', + 'performanceOverlay.dropped' => 'Tappade', + 'performanceOverlay.dvRpus' => 'DV RPU:er', + 'performanceOverlay.dvRpuAverage' => 'DV RPU snitt', + 'performanceOverlay.dvSampleAverage' => 'DV-sample snitt', + 'performanceOverlay.maxLuma' => 'Max luma', + 'performanceOverlay.minLuma' => 'Min luma', + 'performanceOverlay.maxCll' => 'MaxCLL', + 'performanceOverlay.maxFall' => 'MaxFALL', + 'performanceOverlay.cacheUsed' => 'Cache använd', + 'performanceOverlay.speed' => 'Hastighet', + 'performanceOverlay.player' => 'Spelare', + 'performanceOverlay.memory' => 'Minne', + 'performanceOverlay.uiFps' => 'UI FPS', 'externalPlayer.title' => 'Extern spelare', 'externalPlayer.useExternalPlayer' => 'Använd extern spelare', 'externalPlayer.useExternalPlayerDescription' => 'Öppna videor i en annan app', @@ -2845,12 +3014,11 @@ extension on TranslationsSv { 'externalPlayer.systemDefault' => 'Systemstandard', 'externalPlayer.addCustomPlayer' => 'Lägg till anpassad spelare', 'externalPlayer.playerName' => 'Spelarnamn', + 'externalPlayer.playerNameHint' => 'Min spelare', 'externalPlayer.playerCommand' => 'Kommando', 'externalPlayer.playerPackage' => 'Paketnamn', 'externalPlayer.playerUrlScheme' => 'URL-schema', 'externalPlayer.off' => 'Av', - _ => null, - } ?? switch (path) { 'externalPlayer.launchFailed' => 'Kunde inte öppna extern spelare', 'externalPlayer.appNotInstalled' => ({required Object name}) => '${name} är inte installerad', 'externalPlayer.playInExternalPlayer' => 'Spela i extern spelare', diff --git a/lib/i18n/strings_zh.g.dart b/lib/i18n/strings_zh.g.dart index ce33d905..f906d17c 100644 --- a/lib/i18n/strings_zh.g.dart +++ b/lib/i18n/strings_zh.g.dart @@ -77,6 +77,7 @@ class TranslationsZh extends Translations with BaseTranslations '设置'; @override String get mute => '静音'; @override String get ok => '确定'; + @override String get off => '关闭'; + @override String seasonNumber({required Object number}) => '第${number}季'; + @override String chapterNumber({required Object number}) => '章节 ${number}'; @override String get reconnect => '重新连接'; @override String get exit => '退出'; @override String get viewAll => '查看全部'; @@ -385,6 +389,10 @@ class _TranslationsSettingsZh extends TranslationsSettingsEn { @override String get dvConversionNative => '原生 / 禁用'; @override String get dvConversionDv81 => 'P7 → P8.1'; @override String get dvConversionHevcStrip => 'P7 → HEVC'; + @override String get dvConversionAutoDescription => '使用设备能力检测和正常回退行为'; + @override String get dvConversionNativeDescription => '强制原生 DV7 并抑制 DV 转换重试'; + @override String get dvConversionDv81Description => '强制内联 RPU 转换为 Dolby Vision Profile 8.1'; + @override String get dvConversionHevcStripDescription => '移除 Dolby Vision RPU/EL 层并呈现普通 HEVC'; @override String get requireProfileSelectionOnOpen => '打开应用时询问配置文件'; @override String get requireProfileSelectionOnOpenDescription => '每次打开应用时显示配置文件选择'; @override String get forceTvMode => '强制 TV 模式'; @@ -432,6 +440,8 @@ class _TranslationsHotkeysZh extends TranslationsHotkeysEn { // Translations @override String setShortcutFor({required Object actionName}) => '为 ${actionName} 设置快捷键'; @override String get clearShortcut => '清除快捷键'; + @override String get noShortcutSet => '未设置快捷键'; + @override String get currentShortcut => '当前快捷键:'; @override late final _TranslationsHotkeysActionsZh actions = _TranslationsHotkeysActionsZh._(_root); } @@ -482,6 +492,7 @@ class _TranslationsMediaMenuZh extends TranslationsMediaMenuEn { @override String get goToSeries => '转到系列'; @override String get goToSeason => '转到季'; @override String get shufflePlay => '随机播放'; + @override String get shuffleNotAvailableOffline => '离线时无法随机播放'; @override String get fileInfo => '文件信息'; @override String get deleteFromServer => '从服务器删除'; @override String get confirmDelete => '要从服务器删除此媒体及其文件吗?'; @@ -620,6 +631,10 @@ class _TranslationsVideoControlsZh extends TranslationsVideoControlsEn { @override String get searchSubtitles => '搜索字幕'; @override String get language => '语言'; @override String get noSubtitlesFound => '未找到字幕'; + @override String get downloadedSubtitle => '已下载'; + @override String get noSubtitlesAvailable => '没有可用字幕'; + @override String get noAudioTracksAvailable => '没有可用音轨'; + @override String get noTracksAvailable => '没有可用轨道'; @override String get subtitleDownloaded => '字幕已下载'; @override String get subtitleDownloadFailed => '字幕下载失败'; @override String get searchLanguages => '搜索语言...'; @@ -808,6 +823,7 @@ class _TranslationsProfilesZh extends TranslationsProfilesEn { @override String get pinExplain => '切换个人资料需要 4 位 PIN。'; @override String get continueButton => '继续'; @override String get pinsDontMatch => 'PIN 不匹配'; + @override String get initializeServicesFailed => '无法初始化个人资料服务'; } // Path: connections @@ -854,6 +870,7 @@ class _TranslationsDiscoverZh extends TranslationsDiscoverEn { @override String get movie => '电影'; @override String get tvShow => '电视剧'; @override String minutesLeft({required Object minutes}) => '剩余 ${minutes} 分钟'; + @override String get moreLikeThis => '更多类似内容'; } // Path: errors @@ -886,6 +903,7 @@ class _TranslationsLibrariesZh extends TranslationsLibrariesEn { // Translations @override String get title => '媒体库'; + @override String get fallbackTitle => '媒体库'; @override String get scanLibraryFiles => '扫描媒体库文件'; @override String get scanLibrary => '扫描媒体库'; @override String get analyze => '分析'; @@ -1018,6 +1036,12 @@ class _TranslationsLiveTvZh extends TranslationsLiveTvEn { @override String get noChannels => '没有可用的频道'; @override String get noDvr => '没有服务器配置了DVR'; @override String get noPrograms => '没有可用的节目数据'; + @override String get liveStreamFailed => '直播流失败'; + @override String get unknownProgram => '未知节目'; + @override String get unknownHub => '未知'; + @override String get unknownError => '未知错误'; + @override String channelNumber({required Object number}) => '频道 ${number}'; + @override String get unknownChannel => '未知频道'; @override String get live => '直播'; @override String get reloadGuide => '重新加载节目指南'; @override String get now => '现在'; @@ -1224,12 +1248,21 @@ class _TranslationsDownloadsZh extends TranslationsDownloadsEn { @override String get deleteDownload => '删除下载'; @override String get retryDownload => '重试下载'; @override String get downloadQueued => '下载已排队'; + @override String get downloadResumed => '下载已继续'; @override String get serverErrorBitrate => '服务器错误:文件可能超过远程比特率限制'; @override String episodesQueued({required Object count}) => '${count} 集已加入下载队列'; @override String get downloadDeleted => '下载已删除'; @override String deleteConfirm({required Object title}) => '要从此设备删除“${title}”吗?'; - @override String deletingWithProgress({required Object title, required Object current, required Object total}) => '正在删除 ${title}... (${current}/${total})'; + @override String get cancelledDownloadTitle => '已取消的下载'; + @override String get cancelledDownloadMessage => '此下载已取消。你想怎么做?'; + @override String get allEpisodesAlreadyDownloaded => '所有剧集均已下载'; + @override String get resumeDownload => '继续下载'; + @override String get cancelledDownload => '已取消的下载'; + @override String syncingFile({required Object file, required Object status}) => '${file}(正在同步 ${status})'; + @override String downloadedFileClickToComplete({required Object file}) => '已下载 ${file} — 点击完成'; + @override String get partialDownloadClickToComplete => '已部分下载 — 点击完成'; @override String get deleting => '正在删除...'; + @override String deletingWithProgress({required Object title, required Object current, required Object total}) => '正在删除 ${title}... (${current}/${total})'; @override String get queuedTooltip => '已排队'; @override String queuedFilesTooltip({required Object files}) => '已排队:${files}'; @override String get downloadingTooltip => '正在下载...'; @@ -1304,9 +1337,11 @@ class _TranslationsCompanionRemoteZh extends TranslationsCompanionRemoteEn { // Translations @override String get title => '伴侣遥控'; @override String connectedTo({required Object name}) => '已连接到 ${name}'; + @override String get unknownDevice => '未知设备'; @override late final _TranslationsCompanionRemoteSessionZh session = _TranslationsCompanionRemoteSessionZh._(_root); @override late final _TranslationsCompanionRemotePairingZh pairing = _TranslationsCompanionRemotePairingZh._(_root); @override late final _TranslationsCompanionRemoteRemoteZh remote = _TranslationsCompanionRemoteRemoteZh._(_root); + @override late final _TranslationsCompanionRemoteErrorsZh errors = _TranslationsCompanionRemoteErrorsZh._(_root); } // Path: videoSettings @@ -1328,6 +1363,49 @@ class _TranslationsVideoSettingsZh extends TranslationsVideoSettingsEn { @override String get audioNormalization => '响度标准化'; } +// Path: performanceOverlay +class _TranslationsPerformanceOverlayZh extends TranslationsPerformanceOverlayEn { + _TranslationsPerformanceOverlayZh._(TranslationsZh root) : this._root = root, super.internal(root); + + final TranslationsZh _root; // ignore: unused_field + + // Translations + @override String get color => '颜色'; + @override String get performance => '性能'; + @override String get buffer => '缓冲'; + @override String get app => '应用'; + @override String get decoder => '解码器'; + @override String get rawDecoder => '原始解码器'; + @override String get tunneling => '隧道'; + @override String get aspect => '宽高比'; + @override String get rotation => '旋转'; + @override String get dvSource => 'DV 来源'; + @override String get dvPath => 'DV 路径'; + @override String get p7Conversion => 'P7 转换'; + @override String get sampleRate => '采样率'; + @override String get pixelFormat => '像素格式'; + @override String get hwFormat => '硬件格式'; + @override String get matrix => '矩阵'; + @override String get primaries => '基色'; + @override String get transfer => '传输'; + @override String get renderFps => '渲染 FPS'; + @override String get displayFps => '显示 FPS'; + @override String get avSync => 'A/V 同步'; + @override String get dropped => '丢帧'; + @override String get dvRpus => 'DV RPU'; + @override String get dvRpuAverage => 'DV RPU 平均'; + @override String get dvSampleAverage => 'DV 采样平均'; + @override String get maxLuma => '最大亮度'; + @override String get minLuma => '最小亮度'; + @override String get maxCll => 'MaxCLL'; + @override String get maxFall => 'MaxFALL'; + @override String get cacheUsed => '已用缓存'; + @override String get speed => '速度'; + @override String get player => '播放器'; + @override String get memory => '内存'; + @override String get uiFps => 'UI FPS'; +} + // Path: externalPlayer class _TranslationsExternalPlayerZh extends TranslationsExternalPlayerEn { _TranslationsExternalPlayerZh._(TranslationsZh root) : this._root = root, super.internal(root); @@ -1343,6 +1421,7 @@ class _TranslationsExternalPlayerZh extends TranslationsExternalPlayerEn { @override String get systemDefault => '系统默认'; @override String get addCustomPlayer => '添加自定义播放器'; @override String get playerName => '播放器名称'; + @override String get playerNameHint => '我的播放器'; @override String get playerCommand => '命令'; @override String get playerPackage => '包名'; @override String get playerUrlScheme => 'URL 方案'; @@ -1755,6 +1834,21 @@ class _TranslationsCompanionRemoteRemoteZh extends TranslationsCompanionRemoteRe @override String get searchHint => '在桌面上搜索...'; } +// Path: companionRemote.errors +class _TranslationsCompanionRemoteErrorsZh extends TranslationsCompanionRemoteErrorsEn { + _TranslationsCompanionRemoteErrorsZh._(TranslationsZh root) : this._root = root, super.internal(root); + + final TranslationsZh _root; // ignore: unused_field + + // Translations + @override String get noNetworkInterface => '未找到网络接口'; + @override String get authenticationFailed => '身份验证失败'; + @override String get joinTimedOut => '加入会话超时'; + @override String get failedToConnectAnyAddress => '无法连接到任何地址'; + @override String connectionLostAfterAttempts({required Object attempts}) => '${attempts} 次尝试后连接丢失'; + @override String get connectionLost => '连接丢失'; +} + // Path: trackers.services class _TranslationsTrackersServicesZh extends TranslationsTrackersServicesEn { _TranslationsTrackersServicesZh._(TranslationsZh root) : this._root = root, super.internal(root); @@ -1871,6 +1965,9 @@ extension on TranslationsZh { 'common.settings' => '设置', 'common.mute' => '静音', 'common.ok' => '确定', + 'common.off' => '关闭', + 'common.seasonNumber' => ({required Object number}) => '第${number}季', + 'common.chapterNumber' => ({required Object number}) => '章节 ${number}', 'common.reconnect' => '重新连接', 'common.exit' => '退出', 'common.viewAll' => '查看全部', @@ -2070,6 +2167,10 @@ extension on TranslationsZh { 'settings.dvConversionNative' => '原生 / 禁用', 'settings.dvConversionDv81' => 'P7 → P8.1', 'settings.dvConversionHevcStrip' => 'P7 → HEVC', + 'settings.dvConversionAutoDescription' => '使用设备能力检测和正常回退行为', + 'settings.dvConversionNativeDescription' => '强制原生 DV7 并抑制 DV 转换重试', + 'settings.dvConversionDv81Description' => '强制内联 RPU 转换为 Dolby Vision Profile 8.1', + 'settings.dvConversionHevcStripDescription' => '移除 Dolby Vision RPU/EL 层并呈现普通 HEVC', 'settings.requireProfileSelectionOnOpen' => '打开应用时询问配置文件', 'settings.requireProfileSelectionOnOpenDescription' => '每次打开应用时显示配置文件选择', 'settings.forceTvMode' => '强制 TV 模式', @@ -2099,6 +2200,8 @@ extension on TranslationsZh { 'search.enterTitleActorOrKeyword' => '输入标题、演员或关键词', 'hotkeys.setShortcutFor' => ({required Object actionName}) => '为 ${actionName} 设置快捷键', 'hotkeys.clearShortcut' => '清除快捷键', + 'hotkeys.noShortcutSet' => '未设置快捷键', + 'hotkeys.currentShortcut' => '当前快捷键:', 'hotkeys.actions.playPause' => '播放/暂停', 'hotkeys.actions.volumeUp' => '增大音量', 'hotkeys.actions.volumeDown' => '减小音量', @@ -2155,6 +2258,7 @@ extension on TranslationsZh { 'mediaMenu.goToSeries' => '转到系列', 'mediaMenu.goToSeason' => '转到季', 'mediaMenu.shufflePlay' => '随机播放', + 'mediaMenu.shuffleNotAvailableOffline' => '离线时无法随机播放', 'mediaMenu.fileInfo' => '文件信息', 'mediaMenu.deleteFromServer' => '从服务器删除', 'mediaMenu.confirmDelete' => '要从服务器删除此媒体及其文件吗?', @@ -2263,6 +2367,10 @@ extension on TranslationsZh { 'videoControls.searchSubtitles' => '搜索字幕', 'videoControls.language' => '语言', 'videoControls.noSubtitlesFound' => '未找到字幕', + 'videoControls.downloadedSubtitle' => '已下载', + 'videoControls.noSubtitlesAvailable' => '没有可用字幕', + 'videoControls.noAudioTracksAvailable' => '没有可用音轨', + 'videoControls.noTracksAvailable' => '没有可用轨道', 'videoControls.subtitleDownloaded' => '字幕已下载', 'videoControls.subtitleDownloadFailed' => '字幕下载失败', 'videoControls.searchLanguages' => '搜索语言...', @@ -2321,6 +2429,8 @@ extension on TranslationsZh { 'subtitlingStyling.borderColor' => '边框颜色', 'subtitlingStyling.backgroundOpacity' => '背景不透明度', 'subtitlingStyling.backgroundColor' => '背景颜色', + _ => null, + } ?? switch (path) { 'subtitlingStyling.position' => '位置', 'subtitlingStyling.assOverride' => 'ASS 样式覆盖', 'subtitlingStyling.bold' => '粗体', @@ -2335,8 +2445,6 @@ extension on TranslationsZh { 'mpvConfig.loadPreset' => '加载', 'mpvConfig.deletePreset' => '删除', 'mpvConfig.presetSaved' => '预设已保存', - _ => null, - } ?? switch (path) { 'mpvConfig.presetLoaded' => '预设已加载', 'mpvConfig.presetDeleted' => '预设已删除', 'mpvConfig.confirmDeletePreset' => '确定要删除此预设吗?', @@ -2399,6 +2507,7 @@ extension on TranslationsZh { 'profiles.pinExplain' => '切换个人资料需要 4 位 PIN。', 'profiles.continueButton' => '继续', 'profiles.pinsDontMatch' => 'PIN 不匹配', + 'profiles.initializeServicesFailed' => '无法初始化个人资料服务', 'connections.sectionTitle' => '连接', 'connections.addConnection' => '添加连接', 'connections.addConnectionSubtitleNoProfile' => '使用 Plex 登录或连接 Jellyfin 服务器', @@ -2427,6 +2536,7 @@ extension on TranslationsZh { 'discover.movie' => '电影', 'discover.tvShow' => '电视剧', 'discover.minutesLeft' => ({required Object minutes}) => '剩余 ${minutes} 分钟', + 'discover.moreLikeThis' => '更多类似内容', 'errors.searchFailed' => ({required Object error}) => '搜索失败: ${error}', 'errors.connectionTimeout' => ({required Object context}) => '加载 ${context} 时连接超时', 'errors.connectionFailed' => '无法连接到媒体服务器', @@ -2441,6 +2551,7 @@ extension on TranslationsZh { 'errors.failedToDeleteProfile' => ({required Object displayName}) => '无法删除 ${displayName}', 'errors.failedToRate' => '无法更新评分', 'libraries.title' => '媒体库', + 'libraries.fallbackTitle' => '媒体库', 'libraries.scanLibraryFiles' => '扫描媒体库文件', 'libraries.scanLibrary' => '扫描媒体库', 'libraries.analyze' => '分析', @@ -2541,6 +2652,12 @@ extension on TranslationsZh { 'liveTv.noChannels' => '没有可用的频道', 'liveTv.noDvr' => '没有服务器配置了DVR', 'liveTv.noPrograms' => '没有可用的节目数据', + 'liveTv.liveStreamFailed' => '直播流失败', + 'liveTv.unknownProgram' => '未知节目', + 'liveTv.unknownHub' => '未知', + 'liveTv.unknownError' => '未知错误', + 'liveTv.channelNumber' => ({required Object number}) => '频道 ${number}', + 'liveTv.unknownChannel' => '未知频道', 'liveTv.live' => '直播', 'liveTv.reloadGuide' => '重新加载节目指南', 'liveTv.now' => '现在', @@ -2711,12 +2828,21 @@ extension on TranslationsZh { 'downloads.deleteDownload' => '删除下载', 'downloads.retryDownload' => '重试下载', 'downloads.downloadQueued' => '下载已排队', + 'downloads.downloadResumed' => '下载已继续', 'downloads.serverErrorBitrate' => '服务器错误:文件可能超过远程比特率限制', 'downloads.episodesQueued' => ({required Object count}) => '${count} 集已加入下载队列', 'downloads.downloadDeleted' => '下载已删除', 'downloads.deleteConfirm' => ({required Object title}) => '要从此设备删除“${title}”吗?', - 'downloads.deletingWithProgress' => ({required Object title, required Object current, required Object total}) => '正在删除 ${title}... (${current}/${total})', + 'downloads.cancelledDownloadTitle' => '已取消的下载', + 'downloads.cancelledDownloadMessage' => '此下载已取消。你想怎么做?', + 'downloads.allEpisodesAlreadyDownloaded' => '所有剧集均已下载', + 'downloads.resumeDownload' => '继续下载', + 'downloads.cancelledDownload' => '已取消的下载', + 'downloads.syncingFile' => ({required Object file, required Object status}) => '${file}(正在同步 ${status})', + 'downloads.downloadedFileClickToComplete' => ({required Object file}) => '已下载 ${file} — 点击完成', + 'downloads.partialDownloadClickToComplete' => '已部分下载 — 点击完成', 'downloads.deleting' => '正在删除...', + 'downloads.deletingWithProgress' => ({required Object title, required Object current, required Object total}) => '正在删除 ${title}... (${current}/${total})', 'downloads.queuedTooltip' => '已排队', 'downloads.queuedFilesTooltip' => ({required Object files}) => '已排队:${files}', 'downloads.downloadingTooltip' => '正在下载...', @@ -2773,6 +2899,7 @@ extension on TranslationsZh { 'shaders.deleteShaderConfirm' => ({required Object name}) => '删除"${name}"?', 'companionRemote.title' => '伴侣遥控', 'companionRemote.connectedTo' => ({required Object name}) => '已连接到 ${name}', + 'companionRemote.unknownDevice' => '未知设备', 'companionRemote.session.startingServer' => '正在启动远程服务器...', 'companionRemote.session.failedToCreate' => '启动远程服务器失败:', 'companionRemote.session.hostAddress' => '主机地址', @@ -2816,6 +2943,8 @@ extension on TranslationsZh { 'companionRemote.remote.tabSettings' => '设置', 'companionRemote.remote.previous' => '上一个', 'companionRemote.remote.playPause' => '播放/暂停', + _ => null, + } ?? switch (path) { 'companionRemote.remote.next' => '下一个', 'companionRemote.remote.seekBack' => '后退', 'companionRemote.remote.stop' => '停止', @@ -2827,6 +2956,12 @@ extension on TranslationsZh { 'companionRemote.remote.subtitles' => '字幕', 'companionRemote.remote.audio' => '音频', 'companionRemote.remote.searchHint' => '在桌面上搜索...', + 'companionRemote.errors.noNetworkInterface' => '未找到网络接口', + 'companionRemote.errors.authenticationFailed' => '身份验证失败', + 'companionRemote.errors.joinTimedOut' => '加入会话超时', + 'companionRemote.errors.failedToConnectAnyAddress' => '无法连接到任何地址', + 'companionRemote.errors.connectionLostAfterAttempts' => ({required Object attempts}) => '${attempts} 次尝试后连接丢失', + 'companionRemote.errors.connectionLost' => '连接丢失', 'videoSettings.playbackSpeed' => '播放速度', 'videoSettings.zoom' => '缩放', 'videoSettings.sleepTimer' => '睡眠定时器', @@ -2837,6 +2972,40 @@ extension on TranslationsZh { 'videoSettings.performanceOverlay' => '性能监控', 'videoSettings.audioPassthrough' => '音频直通', 'videoSettings.audioNormalization' => '响度标准化', + 'performanceOverlay.color' => '颜色', + 'performanceOverlay.performance' => '性能', + 'performanceOverlay.buffer' => '缓冲', + 'performanceOverlay.app' => '应用', + 'performanceOverlay.decoder' => '解码器', + 'performanceOverlay.rawDecoder' => '原始解码器', + 'performanceOverlay.tunneling' => '隧道', + 'performanceOverlay.aspect' => '宽高比', + 'performanceOverlay.rotation' => '旋转', + 'performanceOverlay.dvSource' => 'DV 来源', + 'performanceOverlay.dvPath' => 'DV 路径', + 'performanceOverlay.p7Conversion' => 'P7 转换', + 'performanceOverlay.sampleRate' => '采样率', + 'performanceOverlay.pixelFormat' => '像素格式', + 'performanceOverlay.hwFormat' => '硬件格式', + 'performanceOverlay.matrix' => '矩阵', + 'performanceOverlay.primaries' => '基色', + 'performanceOverlay.transfer' => '传输', + 'performanceOverlay.renderFps' => '渲染 FPS', + 'performanceOverlay.displayFps' => '显示 FPS', + 'performanceOverlay.avSync' => 'A/V 同步', + 'performanceOverlay.dropped' => '丢帧', + 'performanceOverlay.dvRpus' => 'DV RPU', + 'performanceOverlay.dvRpuAverage' => 'DV RPU 平均', + 'performanceOverlay.dvSampleAverage' => 'DV 采样平均', + 'performanceOverlay.maxLuma' => '最大亮度', + 'performanceOverlay.minLuma' => '最小亮度', + 'performanceOverlay.maxCll' => 'MaxCLL', + 'performanceOverlay.maxFall' => 'MaxFALL', + 'performanceOverlay.cacheUsed' => '已用缓存', + 'performanceOverlay.speed' => '速度', + 'performanceOverlay.player' => '播放器', + 'performanceOverlay.memory' => '内存', + 'performanceOverlay.uiFps' => 'UI FPS', 'externalPlayer.title' => '外部播放器', 'externalPlayer.useExternalPlayer' => '使用外部播放器', 'externalPlayer.useExternalPlayerDescription' => '在其他应用中打开视频', @@ -2845,12 +3014,11 @@ extension on TranslationsZh { 'externalPlayer.systemDefault' => '系统默认', 'externalPlayer.addCustomPlayer' => '添加自定义播放器', 'externalPlayer.playerName' => '播放器名称', + 'externalPlayer.playerNameHint' => '我的播放器', 'externalPlayer.playerCommand' => '命令', 'externalPlayer.playerPackage' => '包名', 'externalPlayer.playerUrlScheme' => 'URL 方案', 'externalPlayer.off' => '关闭', - _ => null, - } ?? switch (path) { 'externalPlayer.launchFailed' => '无法打开外部播放器', 'externalPlayer.appNotInstalled' => ({required Object name}) => '${name} 未安装', 'externalPlayer.playInExternalPlayer' => '在外部播放器中播放', diff --git a/lib/i18n/sv.i18n.json b/lib/i18n/sv.i18n.json index 1407ac2b..a26b81b8 100644 --- a/lib/i18n/sv.i18n.json +++ b/lib/i18n/sv.i18n.json @@ -52,6 +52,9 @@ "settings": "Mer", "mute": "Ljud av", "ok": "OK", + "off": "Av", + "seasonNumber": "Säsong ${number}", + "chapterNumber": "Kapitel ${number}", "reconnect": "Återanslut", "exit": "Avsluta", "viewAll": "Visa alla", @@ -257,6 +260,10 @@ "dvConversionNative": "Inbyggt / inaktiverat", "dvConversionDv81": "P7 → P8.1", "dvConversionHevcStrip": "P7 → HEVC", + "dvConversionAutoDescription": "Använd enhetens kapabilitetsdetektering och normalt reservbeteende", + "dvConversionNativeDescription": "Tvinga native DV7 och undertryck försök till DV-konvertering", + "dvConversionDv81Description": "Tvinga inline RPU-konvertering till Dolby Vision profil 8.1", + "dvConversionHevcStripDescription": "Ta bort Dolby Vision RPU/EL-lager och presentera vanlig HEVC", "requireProfileSelectionOnOpen": "Fråga efter profil vid appstart", "requireProfileSelectionOnOpenDescription": "Visa profilval varje gång appen öppnas", "forceTvMode": "Tvinga TV-läge", @@ -290,6 +297,8 @@ "hotkeys": { "setShortcutFor": "Sätt genväg för ${actionName}", "clearShortcut": "Rensa genväg", + "noShortcutSet": "Ingen genväg angiven", + "currentShortcut": "Aktuell genväg:", "actions": { "playPause": "Spela/Pausa", "volumeUp": "Höj volym", @@ -352,6 +361,7 @@ "goToSeries": "Gå till serie", "goToSeason": "Gå till säsong", "shufflePlay": "Blanda uppspelning", + "shuffleNotAvailableOffline": "Blandad uppspelning är inte tillgänglig offline", "fileInfo": "Filinformation", "deleteFromServer": "Ta bort från servern", "confirmDelete": "Ta bort detta media och dess filer från din server?", @@ -470,6 +480,10 @@ "searchSubtitles": "Sök undertexter", "language": "Språk", "noSubtitlesFound": "Inga undertexter hittades", + "downloadedSubtitle": "Nedladdad", + "noSubtitlesAvailable": "Inga undertexter tillgängliga", + "noAudioTracksAvailable": "Inga ljudspår tillgängliga", + "noTracksAvailable": "Inga spår tillgängliga", "subtitleDownloaded": "Undertext nedladdad", "subtitleDownloadFailed": "Kunde inte ladda ner undertext", "searchLanguages": "Sök språk..." @@ -615,7 +629,8 @@ "pinProtectionOptional": "PIN-skydd (valfritt)", "pinExplain": "4-siffrig PIN krävs för att byta profiler.", "continueButton": "Fortsätt", - "pinsDontMatch": "PIN-koderna stämmer inte överens" + "pinsDontMatch": "PIN-koderna stämmer inte överens", + "initializeServicesFailed": "Kunde inte initiera profiltjänster" }, "connections": { "sectionTitle": "Anslutningar", @@ -647,7 +662,8 @@ "rating": "Åldersgräns", "movie": "Film", "tvShow": "TV-serie", - "minutesLeft": "${minutes} min kvar" + "minutesLeft": "${minutes} min kvar", + "moreLikeThis": "Mer som detta" }, "errors": { "searchFailed": "Sökning misslyckades: ${error}", @@ -666,6 +682,7 @@ }, "libraries": { "title": "Bibliotek", + "fallbackTitle": "Bibliotek", "scanLibraryFiles": "Skanna biblioteksfiler", "scanLibrary": "Skanna bibliotek", "analyze": "Analysera", @@ -788,6 +805,12 @@ "noChannels": "Inga kanaler tillgängliga", "noDvr": "Ingen DVR konfigurerad på någon server", "noPrograms": "Ingen programdata tillgänglig", + "liveStreamFailed": "Liveström misslyckades", + "unknownProgram": "Okänt program", + "unknownHub": "Okänt", + "unknownError": "Okänt fel", + "channelNumber": "Kanal ${number}", + "unknownChannel": "Okänd kanal", "live": "LIVE", "reloadGuide": "Ladda om programguide", "now": "Nu", @@ -966,12 +989,21 @@ "deleteDownload": "Ta bort nedladdning", "retryDownload": "Försök igen", "downloadQueued": "Nedladdning köad", + "downloadResumed": "Nedladdning återupptagen", "serverErrorBitrate": "Serverfel: filen kan överskrida gränsen för fjärrbitrate", "episodesQueued": "${count} avsnitt köade för nedladdning", "downloadDeleted": "Nedladdning borttagen", "deleteConfirm": "Ta bort \"${title}\" från den här enheten?", - "deletingWithProgress": "Tar bort ${title}... (${current} av ${total})", + "cancelledDownloadTitle": "Avbruten nedladdning", + "cancelledDownloadMessage": "Den här nedladdningen avbröts. Vad vill du göra?", + "allEpisodesAlreadyDownloaded": "Alla avsnitt är redan nedladdade", + "resumeDownload": "Återuppta nedladdning", + "cancelledDownload": "Avbruten nedladdning", + "syncingFile": "${file} (synkroniserar ${status})", + "downloadedFileClickToComplete": "${file} nedladdad – klicka för att slutföra", + "partialDownloadClickToComplete": "Delvis nedladdad – klicka för att slutföra", "deleting": "Tar bort...", + "deletingWithProgress": "Tar bort ${title}... (${current} av ${total})", "queuedTooltip": "I kö", "queuedFilesTooltip": "I kö: ${files}", "downloadingTooltip": "Laddar ned...", @@ -1032,6 +1064,7 @@ "companionRemote": { "title": "Fjärrkontroll", "connectedTo": "Ansluten till ${name}", + "unknownDevice": "Okänd enhet", "session": { "startingServer": "Startar fjärrserver...", "failedToCreate": "Kunde inte starta fjärrserver:", @@ -1091,6 +1124,14 @@ "subtitles": "Undertexter", "audio": "Ljud", "searchHint": "Sök på datorn..." + }, + "errors": { + "noNetworkInterface": "Inget nätverksgränssnitt hittades", + "authenticationFailed": "Autentisering misslyckades", + "joinTimedOut": "Tidsgräns vid anslutning till session", + "failedToConnectAnyAddress": "Kunde inte ansluta till någon adress", + "connectionLostAfterAttempts": "Anslutning förlorad efter ${attempts} försök", + "connectionLost": "Anslutning förlorad" } }, "videoSettings": { @@ -1105,6 +1146,42 @@ "audioPassthrough": "Ljudgenomkoppling", "audioNormalization": "Normalisera ljudstyrka" }, + "performanceOverlay": { + "color": "Färg", + "performance": "Prestanda", + "buffer": "Buffert", + "app": "App", + "decoder": "Dekoder", + "rawDecoder": "Rå dekoder", + "tunneling": "Tunneling", + "aspect": "Bildformat", + "rotation": "Rotation", + "dvSource": "DV-källa", + "dvPath": "DV-sökväg", + "p7Conversion": "P7-konv.", + "sampleRate": "Samplingsfrekvens", + "pixelFormat": "Pixelformat", + "hwFormat": "HW-format", + "matrix": "Matris", + "primaries": "Primärfärger", + "transfer": "Transfer", + "renderFps": "Render-FPS", + "displayFps": "Skärm-FPS", + "avSync": "A/V-synk", + "dropped": "Tappade", + "dvRpus": "DV RPU:er", + "dvRpuAverage": "DV RPU snitt", + "dvSampleAverage": "DV-sample snitt", + "maxLuma": "Max luma", + "minLuma": "Min luma", + "maxCll": "MaxCLL", + "maxFall": "MaxFALL", + "cacheUsed": "Cache använd", + "speed": "Hastighet", + "player": "Spelare", + "memory": "Minne", + "uiFps": "UI FPS" + }, "externalPlayer": { "title": "Extern spelare", "useExternalPlayer": "Använd extern spelare", @@ -1114,6 +1191,7 @@ "systemDefault": "Systemstandard", "addCustomPlayer": "Lägg till anpassad spelare", "playerName": "Spelarnamn", + "playerNameHint": "Min spelare", "playerCommand": "Kommando", "playerPackage": "Paketnamn", "playerUrlScheme": "URL-schema", diff --git a/lib/i18n/zh.i18n.json b/lib/i18n/zh.i18n.json index 397b523f..1d9184d1 100644 --- a/lib/i18n/zh.i18n.json +++ b/lib/i18n/zh.i18n.json @@ -52,6 +52,9 @@ "settings": "设置", "mute": "静音", "ok": "确定", + "off": "关闭", + "seasonNumber": "第${number}季", + "chapterNumber": "章节 ${number}", "reconnect": "重新连接", "exit": "退出", "viewAll": "查看全部", @@ -257,6 +260,10 @@ "dvConversionNative": "原生 / 禁用", "dvConversionDv81": "P7 → P8.1", "dvConversionHevcStrip": "P7 → HEVC", + "dvConversionAutoDescription": "使用设备能力检测和正常回退行为", + "dvConversionNativeDescription": "强制原生 DV7 并抑制 DV 转换重试", + "dvConversionDv81Description": "强制内联 RPU 转换为 Dolby Vision Profile 8.1", + "dvConversionHevcStripDescription": "移除 Dolby Vision RPU/EL 层并呈现普通 HEVC", "requireProfileSelectionOnOpen": "打开应用时询问配置文件", "requireProfileSelectionOnOpenDescription": "每次打开应用时显示配置文件选择", "forceTvMode": "强制 TV 模式", @@ -290,6 +297,8 @@ "hotkeys": { "setShortcutFor": "为 ${actionName} 设置快捷键", "clearShortcut": "清除快捷键", + "noShortcutSet": "未设置快捷键", + "currentShortcut": "当前快捷键:", "actions": { "playPause": "播放/暂停", "volumeUp": "增大音量", @@ -352,6 +361,7 @@ "goToSeries": "转到系列", "goToSeason": "转到季", "shufflePlay": "随机播放", + "shuffleNotAvailableOffline": "离线时无法随机播放", "fileInfo": "文件信息", "deleteFromServer": "从服务器删除", "confirmDelete": "要从服务器删除此媒体及其文件吗?", @@ -470,6 +480,10 @@ "searchSubtitles": "搜索字幕", "language": "语言", "noSubtitlesFound": "未找到字幕", + "downloadedSubtitle": "已下载", + "noSubtitlesAvailable": "没有可用字幕", + "noAudioTracksAvailable": "没有可用音轨", + "noTracksAvailable": "没有可用轨道", "subtitleDownloaded": "字幕已下载", "subtitleDownloadFailed": "字幕下载失败", "searchLanguages": "搜索语言..." @@ -615,7 +629,8 @@ "pinProtectionOptional": "PIN 保护(可选)", "pinExplain": "切换个人资料需要 4 位 PIN。", "continueButton": "继续", - "pinsDontMatch": "PIN 不匹配" + "pinsDontMatch": "PIN 不匹配", + "initializeServicesFailed": "无法初始化个人资料服务" }, "connections": { "sectionTitle": "连接", @@ -647,7 +662,8 @@ "rating": "年龄分级", "movie": "电影", "tvShow": "电视剧", - "minutesLeft": "剩余 ${minutes} 分钟" + "minutesLeft": "剩余 ${minutes} 分钟", + "moreLikeThis": "更多类似内容" }, "errors": { "searchFailed": "搜索失败: ${error}", @@ -666,6 +682,7 @@ }, "libraries": { "title": "媒体库", + "fallbackTitle": "媒体库", "scanLibraryFiles": "扫描媒体库文件", "scanLibrary": "扫描媒体库", "analyze": "分析", @@ -788,6 +805,12 @@ "noChannels": "没有可用的频道", "noDvr": "没有服务器配置了DVR", "noPrograms": "没有可用的节目数据", + "liveStreamFailed": "直播流失败", + "unknownProgram": "未知节目", + "unknownHub": "未知", + "unknownError": "未知错误", + "channelNumber": "频道 ${number}", + "unknownChannel": "未知频道", "live": "直播", "reloadGuide": "重新加载节目指南", "now": "现在", @@ -966,12 +989,21 @@ "deleteDownload": "删除下载", "retryDownload": "重试下载", "downloadQueued": "下载已排队", + "downloadResumed": "下载已继续", "serverErrorBitrate": "服务器错误:文件可能超过远程比特率限制", "episodesQueued": "${count} 集已加入下载队列", "downloadDeleted": "下载已删除", "deleteConfirm": "要从此设备删除“${title}”吗?", - "deletingWithProgress": "正在删除 ${title}... (${current}/${total})", + "cancelledDownloadTitle": "已取消的下载", + "cancelledDownloadMessage": "此下载已取消。你想怎么做?", + "allEpisodesAlreadyDownloaded": "所有剧集均已下载", + "resumeDownload": "继续下载", + "cancelledDownload": "已取消的下载", + "syncingFile": "${file}(正在同步 ${status})", + "downloadedFileClickToComplete": "已下载 ${file} — 点击完成", + "partialDownloadClickToComplete": "已部分下载 — 点击完成", "deleting": "正在删除...", + "deletingWithProgress": "正在删除 ${title}... (${current}/${total})", "queuedTooltip": "已排队", "queuedFilesTooltip": "已排队:${files}", "downloadingTooltip": "正在下载...", @@ -1032,6 +1064,7 @@ "companionRemote": { "title": "伴侣遥控", "connectedTo": "已连接到 ${name}", + "unknownDevice": "未知设备", "session": { "startingServer": "正在启动远程服务器...", "failedToCreate": "启动远程服务器失败:", @@ -1091,6 +1124,14 @@ "subtitles": "字幕", "audio": "音频", "searchHint": "在桌面上搜索..." + }, + "errors": { + "noNetworkInterface": "未找到网络接口", + "authenticationFailed": "身份验证失败", + "joinTimedOut": "加入会话超时", + "failedToConnectAnyAddress": "无法连接到任何地址", + "connectionLostAfterAttempts": "${attempts} 次尝试后连接丢失", + "connectionLost": "连接丢失" } }, "videoSettings": { @@ -1105,6 +1146,42 @@ "audioPassthrough": "音频直通", "audioNormalization": "响度标准化" }, + "performanceOverlay": { + "color": "颜色", + "performance": "性能", + "buffer": "缓冲", + "app": "应用", + "decoder": "解码器", + "rawDecoder": "原始解码器", + "tunneling": "隧道", + "aspect": "宽高比", + "rotation": "旋转", + "dvSource": "DV 来源", + "dvPath": "DV 路径", + "p7Conversion": "P7 转换", + "sampleRate": "采样率", + "pixelFormat": "像素格式", + "hwFormat": "硬件格式", + "matrix": "矩阵", + "primaries": "基色", + "transfer": "传输", + "renderFps": "渲染 FPS", + "displayFps": "显示 FPS", + "avSync": "A/V 同步", + "dropped": "丢帧", + "dvRpus": "DV RPU", + "dvRpuAverage": "DV RPU 平均", + "dvSampleAverage": "DV 采样平均", + "maxLuma": "最大亮度", + "minLuma": "最小亮度", + "maxCll": "MaxCLL", + "maxFall": "MaxFALL", + "cacheUsed": "已用缓存", + "speed": "速度", + "player": "播放器", + "memory": "内存", + "uiFps": "UI FPS" + }, "externalPlayer": { "title": "外部播放器", "useExternalPlayer": "使用外部播放器", @@ -1114,6 +1191,7 @@ "systemDefault": "系统默认", "addCustomPlayer": "添加自定义播放器", "playerName": "播放器名称", + "playerNameHint": "我的播放器", "playerCommand": "命令", "playerPackage": "包名", "playerUrlScheme": "URL 方案", diff --git a/lib/media/media_source_info.dart b/lib/media/media_source_info.dart index 36d990d2..252a6f2d 100644 --- a/lib/media/media_source_info.dart +++ b/lib/media/media_source_info.dart @@ -1,3 +1,4 @@ +import '../i18n/strings.g.dart'; import '../utils/codec_utils.dart'; import '../utils/track_label_builder.dart' show TrackLabelBuilder, buildTrackLabel; import 'media_display_criteria.dart'; @@ -232,7 +233,7 @@ class MediaChapter { return chapters; } - String get label => title ?? 'Chapter ${(index ?? 0) + 1}'; + String get label => title ?? t.common.chapterNumber(number: (index ?? 0) + 1); Duration get startTime => Duration(milliseconds: startTimeOffset ?? 0); Duration? get endTime => endTimeOffset != null ? Duration(milliseconds: endTimeOffset!) : null; diff --git a/lib/media/media_version.dart b/lib/media/media_version.dart index adde96f7..e035bf47 100644 --- a/lib/media/media_version.dart +++ b/lib/media/media_version.dart @@ -1,5 +1,6 @@ import 'package:json_annotation/json_annotation.dart'; +import '../i18n/strings.g.dart'; import '../utils/codec_utils.dart'; import '../utils/formatters.dart'; import '../utils/json_utils.dart'; @@ -88,7 +89,7 @@ class MediaVersion { parts.add(container!.toUpperCase()); } - String label = parts.isNotEmpty ? parts.join(' ') : 'Unknown'; + String label = parts.isNotEmpty ? parts.join(' ') : t.common.unknown; if (bitrate != null && bitrate! > 0) { label += ' (${ByteFormatter.formatBitrate(bitrate!)})'; diff --git a/lib/models/livetv_channel.dart b/lib/models/livetv_channel.dart index ac19e497..b08c6db5 100644 --- a/lib/models/livetv_channel.dart +++ b/lib/models/livetv_channel.dart @@ -1,5 +1,6 @@ import 'package:json_annotation/json_annotation.dart'; +import '../i18n/strings.g.dart'; import '../utils/json_utils.dart'; import 'mixins/multi_server_fields.dart'; @@ -133,7 +134,8 @@ class LiveTvChannel with MultiServerFields { } /// Display name: prefer callSign, fallback to title - String get displayName => callSign ?? title ?? 'Channel $number'; + String get displayName => + callSign ?? title ?? (number == null ? t.liveTv.unknownChannel : t.liveTv.channelNumber(number: number!)); } /// A channel entry in the Plex cloud favorites list. diff --git a/lib/models/livetv_program.dart b/lib/models/livetv_program.dart index 0a5cd7a0..2767f731 100644 --- a/lib/models/livetv_program.dart +++ b/lib/models/livetv_program.dart @@ -1,3 +1,4 @@ +import '../i18n/strings.g.dart'; import '../utils/json_utils.dart'; import '../media/ids.dart'; @@ -78,7 +79,7 @@ class LiveTvProgram { key: json['key'] as String?, ratingKey: json['ratingKey'] as String?, guid: json['guid'] as String?, - title: json['title'] as String? ?? 'Unknown Program', + title: json['title'] as String? ?? t.liveTv.unknownProgram, summary: json['summary'] as String?, type: json['type'] as String?, year: flexibleInt(json['year']), diff --git a/lib/providers/companion_remote_provider.dart b/lib/providers/companion_remote_provider.dart index f0b9a4eb..e061fcdf 100644 --- a/lib/providers/companion_remote_provider.dart +++ b/lib/providers/companion_remote_provider.dart @@ -6,6 +6,7 @@ import 'package:device_info_plus/device_info_plus.dart'; import '../connection/connection.dart'; import '../connection/connection_registry.dart'; +import '../i18n/strings.g.dart'; import '../models/companion_remote/remote_command.dart'; import '../models/companion_remote/remote_session.dart'; import '../models/plex/plex_home.dart'; @@ -29,7 +30,7 @@ class CompanionRemoteProvider with ChangeNotifier, DisposableChangeNotifierMixin RemoteSession? _session; CompanionRemotePeerService? _peerService; LanDiscoveryService? _discoveryService; - String _deviceName = 'Unknown Device'; + String _deviceName = t.companionRemote.unknownDevice; String _platform = 'unknown'; bool _isPlayerActive = false; @@ -99,7 +100,7 @@ class CompanionRemoteProvider with ChangeNotifier, DisposableChangeNotifierMixin } } catch (e) { appLogger.e('CompanionRemote: Failed to get device info', error: e); - _deviceName = 'Unknown Device'; + _deviceName = t.companionRemote.unknownDevice; _platform = Platform.operatingSystem; } @@ -724,7 +725,7 @@ class CompanionRemoteProvider with ChangeNotifier, DisposableChangeNotifierMixin appLogger.w('CompanionRemote: Max reconnect attempts reached'); _session = _session?.copyWith( status: RemoteSessionStatus.error, - errorMessage: 'Connection lost after $_maxReconnectAttempts attempts', + errorMessage: t.companionRemote.errors.connectionLostAfterAttempts(attempts: _maxReconnectAttempts), ); _reconnectAttempts = 0; safeNotifyListeners(); @@ -742,7 +743,10 @@ class CompanionRemoteProvider with ChangeNotifier, DisposableChangeNotifierMixin Future _attemptReconnect() async { if (_lastHostAddresses == null || !isCryptoReady) { appLogger.w('CompanionRemote: No stored context for reconnect'); - _session = _session?.copyWith(status: RemoteSessionStatus.error, errorMessage: 'Connection lost'); + _session = _session?.copyWith( + status: RemoteSessionStatus.error, + errorMessage: t.companionRemote.errors.connectionLost, + ); safeNotifyListeners(); return; } diff --git a/lib/providers/download_provider.dart b/lib/providers/download_provider.dart index 3a05a43e..998d4b41 100644 --- a/lib/providers/download_provider.dart +++ b/lib/providers/download_provider.dart @@ -2,6 +2,7 @@ import 'dart:async'; import '../media/ids.dart'; import 'dart:io'; import 'package:flutter/foundation.dart'; +import '../i18n/strings.g.dart'; import '../media/media_backend.dart'; import '../media/media_item.dart'; import '../media/media_item_types.dart'; @@ -527,7 +528,7 @@ class DownloadProvider extends ChangeNotifier with DisposableChangeNotifierMixin id: showRatingKey, backend: meta.backend, kind: MediaKind.show, - title: meta.grandparentTitle ?? 'Unknown Show', + title: meta.grandparentTitle ?? t.common.unknown, thumbPath: meta.grandparentThumbPath, artPath: meta.grandparentArtPath, serverId: meta.serverId, @@ -1721,7 +1722,7 @@ class DownloadProvider extends ChangeNotifier with DisposableChangeNotifierMixin /// Exception thrown when download is blocked due to cellular-only setting class CellularDownloadBlockedException implements Exception { - final String message = 'Downloads are disabled on cellular data'; + String get message => t.settings.cellularDownloadBlocked; @override String toString() => message; diff --git a/lib/providers/user_profile_provider.dart b/lib/providers/user_profile_provider.dart index 4ebfeb73..bb5db7cb 100644 --- a/lib/providers/user_profile_provider.dart +++ b/lib/providers/user_profile_provider.dart @@ -5,6 +5,7 @@ import 'package:flutter/foundation.dart'; import '../connection/connection.dart'; import '../connection/connection_registry.dart'; +import '../i18n/strings.g.dart'; import '../media/media_server_user_profile.dart'; import '../mixins/disposable_change_notifier_mixin.dart'; import '../profiles/active_profile_provider.dart'; @@ -133,7 +134,7 @@ class UserProfileProvider extends ChangeNotifier with DisposableChangeNotifierMi _isInitialized = true; } catch (e) { appLogger.e('UserProfileProvider: critical initialization failure', error: e); - _setError('Failed to initialize profile services'); + _setError(t.profiles.initializeServicesFailed); _authService = null; _storageService = null; _isInitialized = false; diff --git a/lib/screens/discover_screen.dart b/lib/screens/discover_screen.dart index a169153f..ddd5c556 100644 --- a/lib/screens/discover_screen.dart +++ b/lib/screens/discover_screen.dart @@ -833,7 +833,7 @@ class _DiscoverScreenState extends State appLogger.e('Failed to load discover content', error: e); if (!mounted) return; setState(() { - _errorMessage = 'Failed to load content: $e'; + _errorMessage = t.errors.failedToLoad(context: t.discover.title, error: e.toString()); _isLoading = false; _areHubsLoading = false; }); @@ -1258,7 +1258,7 @@ class _DiscoverScreenState extends State context, MaterialPageRoute(builder: (_) => const WatchTogetherScreen()), ), - tooltip: 'Watch Together', + tooltip: t.watchTogether.title, ), if (watchTogether.isInSession && watchTogether.participantCount > 1) Positioned( diff --git a/lib/screens/media_detail/action_buttons.dart b/lib/screens/media_detail/action_buttons.dart index eda23845..edc03e88 100644 --- a/lib/screens/media_detail/action_buttons.dart +++ b/lib/screens/media_detail/action_buttons.dart @@ -383,7 +383,7 @@ extension _MediaDetailActionButtons on _MediaDetailScreenState { final client = _getMediaClientForMetadata(context); if (client == null) return; await downloadProvider.resumeDownload(globalKey, client); - if (mounted) showAppSnackBar(context, 'Download resumed'); + if (mounted) showAppSnackBar(context, t.downloads.downloadResumed); return; } @@ -407,10 +407,10 @@ extension _MediaDetailActionButtons on _MediaDetailScreenState { if (progress?.status == DownloadStatus.cancelled) { final retry = await showConfirmDialog( context, - title: 'Cancelled Download', - message: 'This download was cancelled. What would you like to do?', + title: t.downloads.cancelledDownloadTitle, + message: t.downloads.cancelledDownloadMessage, cancelText: t.common.delete, - confirmText: 'Retry', + confirmText: t.common.retry, ); if (!retry && mounted) { @@ -448,7 +448,7 @@ extension _MediaDetailActionButtons on _MediaDetailScreenState { final count = await downloadProvider.queueMissingEpisodes(metadata, client, versionConfig: versionConfig); if (mounted) { - final message = count > 0 ? t.downloads.episodesQueued(count: count) : 'All episodes already downloaded'; + final message = count > 0 ? t.downloads.episodesQueued(count: count) : t.downloads.allEpisodesAlreadyDownloaded; showAppSnackBar(context, message); } return; @@ -582,7 +582,7 @@ extension _MediaDetailActionButtons on _MediaDetailScreenState { return IconButton.filledTonal( onPressed: () => unawaited(_handleDownloadButtonPressed(metadata)), icon: const AppIcon(Symbols.pause_circle_outline_rounded, fill: 1), - tooltip: 'Resume download', + tooltip: t.downloads.resumeDownload, iconSize: iconSize, style: actionButtonStyle(foregroundColor: Colors.amber, showFocus: showFocus), ); @@ -593,7 +593,7 @@ extension _MediaDetailActionButtons on _MediaDetailScreenState { return IconButton.filledTonal( onPressed: () => unawaited(_handleDownloadButtonPressed(metadata)), icon: const AppIcon(Symbols.error_outline_rounded, fill: 1), - tooltip: 'Retry download', + tooltip: t.downloads.retryDownload, iconSize: iconSize, style: actionButtonStyle(foregroundColor: Colors.red, showFocus: showFocus), ); @@ -604,7 +604,7 @@ extension _MediaDetailActionButtons on _MediaDetailScreenState { return IconButton.filledTonal( onPressed: () => unawaited(_handleDownloadButtonPressed(metadata)), icon: const AppIcon(Symbols.cancel_rounded, fill: 1), - tooltip: 'Cancelled download', + tooltip: t.downloads.cancelledDownload, iconSize: iconSize, style: actionButtonStyle(foregroundColor: Colors.grey, showFocus: showFocus), ); @@ -620,7 +620,10 @@ extension _MediaDetailActionButtons on _MediaDetailScreenState { final syncRule = downloadProvider.getSyncRule(ruleKey); final isEnabled = syncRule?.enabled ?? true; final tooltip = currentFile != null - ? '$currentFile (syncing ${t.downloads.keepNUnwatched(count: syncRule?.episodeCount.toString() ?? '?')})' + ? t.downloads.syncingFile( + file: currentFile, + status: t.downloads.keepNUnwatched(count: syncRule?.episodeCount.toString() ?? '?'), + ) : t.downloads.keepSynced; return IconButton.filledTonal( @@ -633,8 +636,8 @@ extension _MediaDetailActionButtons on _MediaDetailScreenState { } final tooltip = currentFile != null - ? 'Downloaded $currentFile - Click to complete' - : 'Partially downloaded - Click to complete'; + ? t.downloads.downloadedFileClickToComplete(file: currentFile) + : t.downloads.partialDownloadClickToComplete; return IconButton.filledTonal( onPressed: () => unawaited(_handleDownloadButtonPressed(metadata)), diff --git a/lib/screens/media_detail_screen.dart b/lib/screens/media_detail_screen.dart index 49832c6c..f2a30463 100644 --- a/lib/screens/media_detail_screen.dart +++ b/lib/screens/media_detail_screen.dart @@ -1666,7 +1666,7 @@ class _MediaDetailScreenState extends State id: seasonId, backend: _metadata.backend, kind: MediaKind.season, - title: firstEp.parentTitle ?? 'Season ${entry.key}', + title: firstEp.parentTitle ?? t.common.seasonNumber(number: entry.key), index: entry.key, leafCount: entry.value.length, thumbPath: firstEp.parentThumbPath, @@ -3010,7 +3010,7 @@ class _MediaDetailScreenState extends State Future _handleShufflePlayWithQueue(BuildContext context, MediaItem metadata) async { if (widget.isOffline) { if (context.mounted) { - showErrorSnackBar(context, 'Shuffle not available offline'); + showErrorSnackBar(context, t.mediaMenu.shuffleNotAvailableOffline); } return; } diff --git a/lib/screens/settings/add_plex_account_screen.dart b/lib/screens/settings/add_plex_account_screen.dart index cf52d29f..63821a23 100644 --- a/lib/screens/settings/add_plex_account_screen.dart +++ b/lib/screens/settings/add_plex_account_screen.dart @@ -136,7 +136,7 @@ class _AddPlexAccountScreenState extends State with AsyncF }, ); if (mounted && completed != true) { - throw StateError(errorText ?? t.addServer.failedToRegisterAccount(error: 'Unknown error')); + throw StateError(errorText ?? t.addServer.failedToRegisterAccount(error: t.common.unknown)); } } diff --git a/lib/screens/settings/external_player_screen.dart b/lib/screens/settings/external_player_screen.dart index 813538ed..ed2e98d1 100644 --- a/lib/screens/settings/external_player_screen.dart +++ b/lib/screens/settings/external_player_screen.dart @@ -187,7 +187,10 @@ class _AddCustomPlayerDialogState extends State<_AddCustomPlayerDialog> { children: [ FocusableTextField( controller: _nameController, - decoration: InputDecoration(labelText: t.externalPlayer.playerName, hintText: 'My Player'), + decoration: InputDecoration( + labelText: t.externalPlayer.playerName, + hintText: t.externalPlayer.playerNameHint, + ), autofocus: true, textInputAction: TextInputAction.next, onSubmitted: (_) => _valueFocusNode.requestFocus(), diff --git a/lib/screens/settings/hotkey_recorder_widget.dart b/lib/screens/settings/hotkey_recorder_widget.dart index 1958a34c..4b784cf1 100644 --- a/lib/screens/settings/hotkey_recorder_widget.dart +++ b/lib/screens/settings/hotkey_recorder_widget.dart @@ -43,7 +43,10 @@ class _HotKeyRecorderWidgetState extends State { mainAxisSize: .min, crossAxisAlignment: .start, children: [ - Text('Current shortcut:', style: Theme.of(context).textTheme.bodyMedium?.copyWith(fontWeight: .bold)), + Text( + t.hotkeys.currentShortcut, + style: Theme.of(context).textTheme.bodyMedium?.copyWith(fontWeight: .bold), + ), const SizedBox(height: 6), Container( width: double.infinity, diff --git a/lib/screens/settings/playback_settings_screen.dart b/lib/screens/settings/playback_settings_screen.dart index 34ee4c83..28d3c15d 100644 --- a/lib/screens/settings/playback_settings_screen.dart +++ b/lib/screens/settings/playback_settings_screen.dart @@ -232,7 +232,9 @@ class _PlaybackSettingsScreenState extends State { return SettingNavigationTile( icon: Symbols.open_in_new_rounded, title: t.externalPlayer.title, - subtitle: useExt ? player.name : t.externalPlayer.off, + subtitle: useExt + ? (player.id == 'system_default' ? t.externalPlayer.systemDefault : player.name) + : t.externalPlayer.off, destinationBuilder: (_) => const ExternalPlayerScreen(), ); }, diff --git a/lib/screens/video_player/parts/live_tv.dart b/lib/screens/video_player/parts/live_tv.dart index 866e86e7..eea5357b 100644 --- a/lib/screens/video_player/parts/live_tv.dart +++ b/lib/screens/video_player/parts/live_tv.dart @@ -99,7 +99,7 @@ extension _VideoPlayerLiveTvMethods on VideoPlayerScreenState { final dvrKey = _liveDvrKey; if (channels == null || channelIndex < 0 || channelIndex >= channels.length || dvrKey == null) { appLogger.w('Cannot retry live stream — missing session info'); - showGlobalErrorSnackBar(_redactPlayerError(_lastLogError ?? 'Live stream failed')); + showGlobalErrorSnackBar(_redactPlayerError(_lastLogError ?? t.liveTv.liveStreamFailed)); unawaited(_handleBackButton()); return; } @@ -109,7 +109,7 @@ extension _VideoPlayerLiveTvMethods on VideoPlayerScreenState { // Re-tune to get a fresh capture session — the previous one is dead. final tuneResult = await client.tuneChannel(dvrKey, channel.key); if (tuneResult == null || !mounted) { - showGlobalErrorSnackBar(_redactPlayerError(_lastLogError ?? 'Live stream failed')); + showGlobalErrorSnackBar(_redactPlayerError(_lastLogError ?? t.liveTv.liveStreamFailed)); unawaited(_handleBackButton()); return; } @@ -126,7 +126,7 @@ extension _VideoPlayerLiveTvMethods on VideoPlayerScreenState { directStreamAudio: dsa, ); if (streamPath == null || !mounted) { - showGlobalErrorSnackBar(_redactPlayerError(_lastLogError ?? 'Live stream failed')); + showGlobalErrorSnackBar(_redactPlayerError(_lastLogError ?? t.liveTv.liveStreamFailed)); unawaited(_handleBackButton()); return; } @@ -154,7 +154,7 @@ extension _VideoPlayerLiveTvMethods on VideoPlayerScreenState { } appLogger.w('Cannot retry live stream — no compatible client/URL available'); - showGlobalErrorSnackBar(_redactPlayerError(_lastLogError ?? 'Live stream failed')); + showGlobalErrorSnackBar(_redactPlayerError(_lastLogError ?? t.liveTv.liveStreamFailed)); unawaited(_handleBackButton()); } diff --git a/lib/screens/video_player_screen.dart b/lib/screens/video_player_screen.dart index bb78aaaf..8f337f04 100644 --- a/lib/screens/video_player_screen.dart +++ b/lib/screens/video_player_screen.dart @@ -1060,9 +1060,9 @@ class VideoPlayerScreenState extends State with WidgetsBindin if (_watchTogetherProvider != null && _watchTogetherProvider!.isInSession && !_watchTogetherProvider!.isHost) { final confirmed = await showConfirmDialog( context, - title: 'Leave Session?', - message: 'You will be removed from the session.', - confirmText: 'Leave', + title: t.watchTogether.leaveSessionQuestion, + message: t.watchTogether.leaveSessionConfirm, + confirmText: t.watchTogether.leave, isDestructive: true, ); diff --git a/lib/services/companion_remote/companion_remote_peer_service.dart b/lib/services/companion_remote/companion_remote_peer_service.dart index 59f43d39..806193e9 100644 --- a/lib/services/companion_remote/companion_remote_peer_service.dart +++ b/lib/services/companion_remote/companion_remote_peer_service.dart @@ -6,6 +6,7 @@ import 'dart:math'; import 'package:web_socket_channel/io.dart'; import '../../utils/future_extensions.dart'; +import '../../i18n/strings.g.dart'; import '../../models/companion_remote/remote_command.dart'; import '../../models/companion_remote/remote_session.dart'; import '../../utils/app_logger.dart'; @@ -97,7 +98,10 @@ class CompanionRemotePeerService with KeepaliveMixin { final all = [...preferred, ...others]; if (all.isEmpty) { - throw const RemotePeerError(type: RemotePeerErrorType.networkError, message: 'No network interface found'); + throw RemotePeerError( + type: RemotePeerErrorType.networkError, + message: t.companionRemote.errors.noNetworkInterface, + ); } return all; } catch (e) { @@ -535,7 +539,10 @@ class CompanionRemotePeerService with KeepaliveMixin { } else if (json['type'] == 'authFailed') { if (!completer.isCompleted) { completer.completeError( - const RemotePeerError(type: RemotePeerErrorType.authFailed, message: 'Authentication failed'), + RemotePeerError( + type: RemotePeerErrorType.authFailed, + message: t.companionRemote.errors.authenticationFailed, + ), ); } } @@ -636,11 +643,17 @@ class CompanionRemotePeerService with KeepaliveMixin { appLogger.w('CompanionRemote: Authentication failed'); if (!completer.isCompleted) { completer.completeError( - const RemotePeerError(type: RemotePeerErrorType.authFailed, message: 'Authentication failed'), + RemotePeerError( + type: RemotePeerErrorType.authFailed, + message: t.companionRemote.errors.authenticationFailed, + ), ); } _errorController.add( - const RemotePeerError(type: RemotePeerErrorType.authFailed, message: 'Authentication failed'), + RemotePeerError( + type: RemotePeerErrorType.authFailed, + message: t.companionRemote.errors.authenticationFailed, + ), ); _connectionStateController.add(RemoteSessionStatus.error); } @@ -699,7 +712,7 @@ class CompanionRemotePeerService with KeepaliveMixin { } _channel = null; } - throw const RemotePeerError(type: RemotePeerErrorType.timeout, message: 'Timed out joining session'); + throw RemotePeerError(type: RemotePeerErrorType.timeout, message: t.companionRemote.errors.joinTimedOut); }, ); } @@ -809,9 +822,9 @@ class CompanionRemotePeerService with KeepaliveMixin { } if (channels.isEmpty) { - throw const RemotePeerError( + throw RemotePeerError( type: RemotePeerErrorType.connectionFailed, - message: 'Failed to connect to any address', + message: t.companionRemote.errors.failedToConnectAnyAddress, ); } diff --git a/lib/services/jellyfin_client/parts/browse.dart b/lib/services/jellyfin_client/parts/browse.dart index 11e524a3..a447682f 100644 --- a/lib/services/jellyfin_client/parts/browse.dart +++ b/lib/services/jellyfin_client/parts/browse.dart @@ -1209,7 +1209,7 @@ mixin _JellyfinBrowseMethods on MediaServerCacheMixin { JellyfinMappers.syntheticHub( mapItem: _mapItem, identifier: 'item.$id.similar', - title: 'More Like This', + title: t.discover.moreLikeThis, type: 'mixed', items: _itemsArray(response.data), serverId: serverId, diff --git a/lib/services/jellyfin_client/parts/live_tv.dart b/lib/services/jellyfin_client/parts/live_tv.dart index f279ec23..7ade0796 100644 --- a/lib/services/jellyfin_client/parts/live_tv.dart +++ b/lib/services/jellyfin_client/parts/live_tv.dart @@ -86,7 +86,7 @@ mixin _JellyfinLiveTvMethods on MediaServerCacheMixin { key: id, ratingKey: id, guid: null, - title: json['Name'] as String? ?? 'Unknown Program', + title: json['Name'] as String? ?? t.liveTv.unknownProgram, summary: json['Overview'] as String?, type: 'episode', year: (json['ProductionYear'] as num?)?.toInt(), diff --git a/lib/services/jellyfin_client/parts/playlists.dart b/lib/services/jellyfin_client/parts/playlists.dart index 7211c17d..19b483a5 100644 --- a/lib/services/jellyfin_client/parts/playlists.dart +++ b/lib/services/jellyfin_client/parts/playlists.dart @@ -94,7 +94,7 @@ mixin _JellyfinPlaylistMethods on MediaServerCacheMixin { return MediaPlaylist( id: item.id, backend: MediaBackend.jellyfin, - title: item.title ?? 'Playlist', + title: item.title ?? t.playlists.playlist, summary: item.summary, smart: false, playlistType: _playlistMediaType(item), @@ -230,7 +230,7 @@ mixin _JellyfinPlaylistMethods on MediaServerCacheMixin { return MediaPlaylist( id: id, backend: MediaBackend.jellyfin, - title: json['Name'] as String? ?? 'Playlist', + title: json['Name'] as String? ?? t.playlists.playlist, summary: json['Overview'] as String?, smart: false, playlistType: (json['MediaType'] as String?)?.toLowerCase() ?? 'video', diff --git a/lib/services/jellyfin_mappers.dart b/lib/services/jellyfin_mappers.dart index 3f235891..472bd85d 100644 --- a/lib/services/jellyfin_mappers.dart +++ b/lib/services/jellyfin_mappers.dart @@ -8,6 +8,7 @@ import '../media/media_part.dart'; import '../media/media_role.dart'; import '../media/media_stream.dart'; import '../media/media_version.dart'; +import '../i18n/strings.g.dart'; import '../utils/jellyfin_time.dart'; import '../utils/json_utils.dart'; import '../utils/resolution_label.dart'; @@ -237,7 +238,7 @@ class JellyfinMappers { return MediaLibrary( id: id, backend: MediaBackend.jellyfin, - title: view['Name'] as String? ?? 'Library', + title: view['Name'] as String? ?? t.libraries.fallbackTitle, kind: _libraryKindFromCollectionType(collectionType, view['Type'] as String?), updatedAt: jellyfinIsoToEpochSeconds(view['DateLastSaved'] as String? ?? view['DateModified'] as String?), createdAt: jellyfinIsoToEpochSeconds(view['DateCreated'] as String?), diff --git a/lib/services/keyboard_shortcuts_service.dart b/lib/services/keyboard_shortcuts_service.dart index 89ca90e2..1a56fcd4 100644 --- a/lib/services/keyboard_shortcuts_service.dart +++ b/lib/services/keyboard_shortcuts_service.dart @@ -135,7 +135,7 @@ class KeyboardShortcutsService extends ChangeNotifier { } String formatHotkey(HotKey? hotKey) { - if (hotKey == null) return 'No shortcut set'; + if (hotKey == null) return t.hotkeys.noShortcutSet; final isMac = Platform.isMacOS; diff --git a/lib/services/pip_service.dart b/lib/services/pip_service.dart index cc8c1b47..3680b25e 100644 --- a/lib/services/pip_service.dart +++ b/lib/services/pip_service.dart @@ -75,7 +75,7 @@ class PipService { 'not_supported' => t.videoControls.pipErrors.notSupported, 'vo_switch_failed' => t.videoControls.pipErrors.voSwitchFailed, 'failed' => t.videoControls.pipErrors.failed, - _ => t.videoControls.pipErrors.unknown(error: errorMessage ?? 'Unknown error'), + _ => t.videoControls.pipErrors.unknown(error: errorMessage ?? t.common.unknown), }; } } diff --git a/lib/services/plex_client/parts/live_tv.dart b/lib/services/plex_client/parts/live_tv.dart index 29c0262e..fd605d4d 100644 --- a/lib/services/plex_client/parts/live_tv.dart +++ b/lib/services/plex_client/parts/live_tv.dart @@ -638,7 +638,7 @@ mixin _PlexLiveTvClientMethods on MediaServerCacheMixin { if (entries.isEmpty) return null; return LiveTvHubResult( - title: hubJson['title'] as String? ?? 'Unknown', + title: hubJson['title'] as String? ?? t.liveTv.unknownHub, hubKey: hubJson['key'] as String? ?? '', entries: entries, ); @@ -825,7 +825,7 @@ mixin _PlexLiveTvClientMethods on MediaServerCacheMixin { ? int.tryParse(containerStatus) : null; if (statusInt != null && statusInt != 0 && statusInt != 200) { - final msg = container['message'] ?? 'Unknown error'; + final msg = container['message'] ?? t.liveTv.unknownError; appLogger.w('Tune channel error: $msg (status: $containerStatus)'); throw Exception(msg); } diff --git a/lib/watch_together/services/watch_together_peer_service.dart b/lib/watch_together/services/watch_together_peer_service.dart index 2c51e74a..ef72d827 100644 --- a/lib/watch_together/services/watch_together_peer_service.dart +++ b/lib/watch_together/services/watch_together_peer_service.dart @@ -6,6 +6,7 @@ import 'package:uuid/uuid.dart'; import '../../utils/future_extensions.dart'; import 'package:web_socket_channel/web_socket_channel.dart'; +import '../../i18n/strings.g.dart'; import '../../services/base_peer_service.dart'; import '../../utils/app_logger.dart'; import '../models/sync_message.dart'; @@ -214,7 +215,7 @@ class WatchTogetherPeerService with KeepaliveMixin { case 'error': final code = msg['code'] as String? ?? 'unknown'; - final message = msg['message'] as String? ?? 'Unknown error'; + final message = msg['message'] as String? ?? t.common.unknown; appLogger.e('WatchTogether: Server error: $code - $message'); final error = PeerError(type: PeerErrorType.serverError, message: '$code: $message', serverCode: code); _safeAdd(_errorController, error); @@ -400,7 +401,7 @@ class WatchTogetherPeerService with KeepaliveMixin { await completer.future.timeout( const Duration(seconds: 10), onTimeout: () { - throw const PeerError(type: PeerErrorType.timeout, message: 'Timed out joining session'); + throw PeerError(type: PeerErrorType.timeout, message: t.watchTogether.failedToJoin); }, ); diff --git a/lib/widgets/media_card.dart b/lib/widgets/media_card.dart index a66a0bce..9c45b513 100644 --- a/lib/widgets/media_card.dart +++ b/lib/widgets/media_card.dart @@ -1017,7 +1017,7 @@ void _navigateToSeason(BuildContext context, MediaItem episode, {bool isOffline id: episode.parentId!, backend: episode.backend, kind: MediaKind.season, - title: episode.parentTitle ?? 'Season ${episode.parentIndex ?? ''}', + title: episode.parentTitle ?? t.common.seasonNumber(number: episode.parentIndex ?? ''), index: episode.parentIndex, parentId: episode.grandparentId, thumbPath: episode.parentThumbPath, diff --git a/lib/widgets/video_controls/helpers/track_selection_helper.dart b/lib/widgets/video_controls/helpers/track_selection_helper.dart index fbbc4b79..7ac35e00 100644 --- a/lib/widgets/video_controls/helpers/track_selection_helper.dart +++ b/lib/widgets/video_controls/helpers/track_selection_helper.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:plezy/widgets/app_icon.dart'; import 'package:material_symbols_icons/symbols.dart'; +import '../../../i18n/strings.g.dart'; import '../../../mpv/mpv.dart'; import '../../../widgets/focusable_list_tile.dart'; @@ -8,11 +9,11 @@ class TrackSelectionHelper { /// Get the appropriate empty message based on track type static String getEmptyMessage() { if (T == SubtitleTrack) { - return 'No subtitles available'; + return t.videoControls.noSubtitlesAvailable; } else if (T == AudioTrack) { - return 'No audio tracks available'; + return t.videoControls.noAudioTracksAvailable; } - return 'No tracks available'; + return t.videoControls.noTracksAvailable; } static Widget buildEmptyState() { @@ -46,7 +47,7 @@ class TrackSelectionHelper { return _buildSelectableTile( context: context, key: key, - label: 'Off', + label: t.common.off, isSelected: isSelected, onTap: onTap, focusNode: focusNode, diff --git a/lib/widgets/video_controls/parts/navigation.dart b/lib/widgets/video_controls/parts/navigation.dart index 8a131927..3c0c6fe7 100644 --- a/lib/widgets/video_controls/parts/navigation.dart +++ b/lib/widgets/video_controls/parts/navigation.dart @@ -121,7 +121,7 @@ extension _PlexVideoControlsNavigationMethods on _PlexVideoControlsState { await widget.player.addSubtitleTrack( uri: newUrl, - title: newTrack.displayTitle ?? newTrack.language ?? 'Downloaded', + title: newTrack.displayTitle ?? newTrack.language ?? t.videoControls.downloadedSubtitle, language: newTrack.languageCode, select: true, ); diff --git a/lib/widgets/video_controls/sheets/subtitle_search_sheet.dart b/lib/widgets/video_controls/sheets/subtitle_search_sheet.dart index 555c5317..3ccb1eb6 100644 --- a/lib/widgets/video_controls/sheets/subtitle_search_sheet.dart +++ b/lib/widgets/video_controls/sheets/subtitle_search_sheet.dart @@ -270,7 +270,7 @@ class _SubtitleSearchSheetState extends State with Controll focusNode: _titleFocusNode, decoration: pillInputDecoration( context, - hintText: widget.mediaTitle ?? 'Title', + hintText: widget.mediaTitle ?? t.metadataEdit.title, prefixIcon: const Icon(Symbols.search_rounded, size: 20), ), onChanged: _onTitleChanged, @@ -347,7 +347,7 @@ class _SubtitleSearchSheetState extends State with Controll return FocusableListTile( focusNode: index == 0 ? _firstResultFocusNode : null, - title: Text(result.title ?? result.displayTitle ?? 'Unknown', maxLines: 1, overflow: .ellipsis), + title: Text(result.title ?? result.displayTitle ?? t.common.unknown, maxLines: 1, overflow: .ellipsis), subtitle: Text( result.displayTitle ?? '', maxLines: 1, diff --git a/lib/widgets/video_controls/sheets/video_settings_sheet.dart b/lib/widgets/video_controls/sheets/video_settings_sheet.dart index 7197eb68..eaedf00f 100644 --- a/lib/widgets/video_controls/sheets/video_settings_sheet.dart +++ b/lib/widgets/video_controls/sheets/video_settings_sheet.dart @@ -376,10 +376,10 @@ class _VideoSettingsSheetState extends State { String _formatDvConversionMode(String mode) { return switch (_normalizeDvConversionMode(mode)) { - 'disabled' => 'Native / Disabled', - 'dv81' => 'P7 → P8.1', - 'hevc_strip' => 'P7 → HEVC', - _ => 'Auto', + 'disabled' => t.settings.dvConversionNative, + 'dv81' => t.settings.dvConversionDv81, + 'hevc_strip' => t.settings.dvConversionHevcStrip, + _ => t.settings.dvConversionAuto, }; } @@ -570,7 +570,9 @@ class _VideoSettingsSheetState extends State { _SettingsMenuItem( icon: Symbols.auto_fix_high_rounded, title: t.shaders.title, - valueText: widget.shaderService!.currentPreset.name, + valueText: widget.shaderService!.currentPreset.id == ShaderPreset.none.id + ? t.common.off + : widget.shaderService!.currentPreset.name, isHighlighted: widget.shaderService!.currentPreset.isEnabled, onTap: () => _navigateTo(_SettingsView.shader), ), @@ -608,7 +610,7 @@ class _VideoSettingsSheetState extends State { if (_showDebugDvConversionMode) _SettingsMenuItem( icon: Symbols.hdr_strong_rounded, - title: 'DV Conversion Mode', + title: t.settings.dvConversionMode, valueText: _formatDvConversionMode(_dvConversionMode), isHighlighted: _dvConversionMode != 'auto', onTap: () => _navigateTo(_SettingsView.dvConversion), @@ -642,11 +644,15 @@ class _VideoSettingsSheetState extends State { } Widget _buildDvConversionView() { - const modes = [ - (value: 'auto', title: 'Auto', subtitle: 'Use device capability detection and normal fallback behavior'), - (value: 'disabled', title: 'Native / Disabled', subtitle: 'Force native DV7 and suppress DV conversion retry'), - (value: 'dv81', title: 'P7 → P8.1', subtitle: 'Force inline RPU conversion to Dolby Vision profile 8.1'), - (value: 'hevc_strip', title: 'P7 → HEVC', subtitle: 'Strip Dolby Vision RPU/EL layers and present plain HEVC'), + final modes = [ + (value: 'auto', title: t.settings.dvConversionAuto, subtitle: t.settings.dvConversionAutoDescription), + (value: 'disabled', title: t.settings.dvConversionNative, subtitle: t.settings.dvConversionNativeDescription), + (value: 'dv81', title: t.settings.dvConversionDv81, subtitle: t.settings.dvConversionDv81Description), + ( + value: 'hevc_strip', + title: t.settings.dvConversionHevcStrip, + subtitle: t.settings.dvConversionHevcStripDescription, + ), ]; final primary = Theme.of(context).colorScheme.primary; @@ -868,9 +874,10 @@ class _VideoSettingsSheetState extends State { final preset = presets[index]; final isSelected = preset.id == currentPreset.id; final isCustom = preset.type == ShaderPresetType.custom; + final presetName = preset.id == ShaderPreset.none.id ? t.common.off : preset.name; return FocusableListTile( - title: Text(preset.name, style: TextStyle(color: isSelected ? Colors.amber : null)), + title: Text(presetName, style: TextStyle(color: isSelected ? Colors.amber : null)), subtitle: _getShaderSubtitle(preset) != null ? Text(_getShaderSubtitle(preset)!, style: TextStyle(color: tokens(context).textMuted, fontSize: 12)) : null, diff --git a/lib/widgets/video_controls/widgets/performance_overlay/performance_overlay.dart b/lib/widgets/video_controls/widgets/performance_overlay/performance_overlay.dart index fe984c9d..cdf2ebad 100644 --- a/lib/widgets/video_controls/widgets/performance_overlay/performance_overlay.dart +++ b/lib/widgets/video_controls/widgets/performance_overlay/performance_overlay.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:material_symbols_icons/symbols.dart'; +import '../../../../i18n/strings.g.dart'; import '../../../../mpv/mpv.dart'; import '../../../../widgets/app_icon.dart'; import 'performance_stats.dart'; @@ -48,61 +49,64 @@ class _PlayerPerformanceOverlayState extends State { final isMpv = _stats.playerType == 'mpv'; final sections = [ - _buildSection(Symbols.videocam_rounded, 'Video', [ - _metric('Codec', _stats.videoCodec ?? 'N/A'), - _metric('Resolution', _stats.resolution), + _buildSection(Symbols.videocam_rounded, t.fileInfo.video, [ + _metric(t.fileInfo.codec, _stats.videoCodec ?? 'N/A'), + _metric(t.fileInfo.resolution, _stats.resolution), if (_stats.hasValidVideoFps) _metric('FPS', _stats.videoFpsFormatted), - if (_stats.hasValidVideoBitrate) _metric('Bitrate', _stats.videoBitrateFormatted), - _metric('Decoder', _stats.hwdecFormatted), - if (!isMpv && _stats.videoDecoderName != null) _metric('Raw Decoder', _stats.videoDecoderRaw), - if (!isMpv) _metric('Tunneling', _stats.tunneledPlaybackFormatted), - if (_stats.aspectName != null && _stats.aspectName!.isNotEmpty) _metric('Aspect', _stats.aspectName!), - if (_stats.rotate != null && _stats.rotate != 0) _metric('Rotation', _stats.rotateFormatted), - if (_stats.dvSourceProfile != null) _metric('DV Source', _stats.dvSourceProfileFormatted), - if (_stats.dvPlaybackPath != null) _metric('DV Path', _stats.dvPlaybackPathFormatted), - if (_stats.dvConversionActive) _metric('P7 Conv', _stats.dvConversionFormatted), + if (_stats.hasValidVideoBitrate) _metric(t.fileInfo.bitrate, _stats.videoBitrateFormatted), + _metric(t.performanceOverlay.decoder, _stats.hwdecFormatted), + if (!isMpv && _stats.videoDecoderName != null) _metric(t.performanceOverlay.rawDecoder, _stats.videoDecoderRaw), + if (!isMpv) _metric(t.performanceOverlay.tunneling, _stats.tunneledPlaybackFormatted), + if (_stats.aspectName != null && _stats.aspectName!.isNotEmpty) + _metric(t.performanceOverlay.aspect, _stats.aspectName!), + if (_stats.rotate != null && _stats.rotate != 0) _metric(t.performanceOverlay.rotation, _stats.rotateFormatted), + if (_stats.dvSourceProfile != null) _metric(t.performanceOverlay.dvSource, _stats.dvSourceProfileFormatted), + if (_stats.dvPlaybackPath != null) _metric(t.performanceOverlay.dvPath, _stats.dvPlaybackPathFormatted), + if (_stats.dvConversionActive) _metric(t.performanceOverlay.p7Conversion, _stats.dvConversionFormatted), ]), - _buildSection(Symbols.volume_up_rounded, 'Audio', [ - if (_stats.audioCodec != null) _metric('Codec', _stats.audioCodec!), - _metric('Sample Rate', _stats.sampleRateFormatted), - _metric('Channels', _stats.audioChannels ?? 'N/A'), - if (_stats.hasValidAudioBitrate) _metric('Bitrate', _stats.audioBitrateFormatted), - if (!isMpv && _stats.audioDecoderName != null) _metric('Decoder', _stats.audioDecoderFormatted), + _buildSection(Symbols.volume_up_rounded, t.fileInfo.audio, [ + if (_stats.audioCodec != null) _metric(t.fileInfo.codec, _stats.audioCodec!), + _metric(t.performanceOverlay.sampleRate, _stats.sampleRateFormatted), + _metric(t.fileInfo.channels, _stats.audioChannels ?? 'N/A'), + if (_stats.hasValidAudioBitrate) _metric(t.fileInfo.bitrate, _stats.audioBitrateFormatted), + if (!isMpv && _stats.audioDecoderName != null) + _metric(t.performanceOverlay.decoder, _stats.audioDecoderFormatted), ]), if (isMpv) - _buildSection(Symbols.palette_rounded, 'Color', [ - _metric('Pixel Fmt', _stats.pixelformat ?? 'N/A'), + _buildSection(Symbols.palette_rounded, t.performanceOverlay.color, [ + _metric(t.performanceOverlay.pixelFormat, _stats.pixelformat ?? 'N/A'), if (_stats.hwPixelformat != null && _stats.hwPixelformat != _stats.pixelformat) - _metric('HW Fmt', _stats.hwPixelformat!), - _metric('Matrix', _stats.colormatrix ?? 'N/A'), - _metric('Primaries', _stats.primaries ?? 'N/A'), - _metric('Transfer', _stats.gamma ?? 'N/A'), + _metric(t.performanceOverlay.hwFormat, _stats.hwPixelformat!), + _metric(t.performanceOverlay.matrix, _stats.colormatrix ?? 'N/A'), + _metric(t.performanceOverlay.primaries, _stats.primaries ?? 'N/A'), + _metric(t.performanceOverlay.transfer, _stats.gamma ?? 'N/A'), ]), - _buildSection(Symbols.speed_rounded, 'Performance', [ - if (isMpv) _metric('Render FPS', _stats.actualFpsFormatted), - if (isMpv) _metric('Display FPS', _stats.displayFpsFormatted), - if (isMpv) _metric('A/V Sync', _stats.avsyncFormatted), - _metric('Dropped', _stats.droppedFramesFormatted), - if (_stats.dvConversionActive) _metric('DV RPUs', _stats.dvRpuCountFormatted), - if (_stats.dvConversionActive) _metric('DV RPU Avg', _stats.dvAvgRpuConversionFormatted), - if (_stats.dvConversionActive) _metric('DV Sample Avg', _stats.dvAvgSampleProcessingFormatted), + _buildSection(Symbols.speed_rounded, t.performanceOverlay.performance, [ + if (isMpv) _metric(t.performanceOverlay.renderFps, _stats.actualFpsFormatted), + if (isMpv) _metric(t.performanceOverlay.displayFps, _stats.displayFpsFormatted), + if (isMpv) _metric(t.performanceOverlay.avSync, _stats.avsyncFormatted), + _metric(t.performanceOverlay.dropped, _stats.droppedFramesFormatted), + if (_stats.dvConversionActive) _metric(t.performanceOverlay.dvRpus, _stats.dvRpuCountFormatted), + if (_stats.dvConversionActive) _metric(t.performanceOverlay.dvRpuAverage, _stats.dvAvgRpuConversionFormatted), + if (_stats.dvConversionActive) + _metric(t.performanceOverlay.dvSampleAverage, _stats.dvAvgSampleProcessingFormatted), ]), if (_stats.hasHdrMetadata) _buildSection(Symbols.hdr_on_rounded, 'HDR', [ - if (_stats.maxLuma != null) _metric('Max Luma', _stats.maxLumaFormatted), - if (_stats.minLuma != null) _metric('Min Luma', _stats.minLumaFormatted), - if (_stats.maxCll != null) _metric('MaxCLL', _stats.maxCllFormatted), - if (_stats.maxFall != null) _metric('MaxFALL', _stats.maxFallFormatted), + if (_stats.maxLuma != null) _metric(t.performanceOverlay.maxLuma, _stats.maxLumaFormatted), + if (_stats.minLuma != null) _metric(t.performanceOverlay.minLuma, _stats.minLumaFormatted), + if (_stats.maxCll != null) _metric(t.performanceOverlay.maxCll, _stats.maxCllFormatted), + if (_stats.maxFall != null) _metric(t.performanceOverlay.maxFall, _stats.maxFallFormatted), ]), - _buildSection(Symbols.memory_rounded, 'Buffer', [ - _metric('Duration', _stats.cacheDurationFormatted), - if (isMpv) _metric('Cache Used', _stats.cacheUsedFormatted), - if (isMpv) _metric('Speed', _stats.cacheSpeedFormatted), + _buildSection(Symbols.memory_rounded, t.performanceOverlay.buffer, [ + _metric(t.fileInfo.duration, _stats.cacheDurationFormatted), + if (isMpv) _metric(t.performanceOverlay.cacheUsed, _stats.cacheUsedFormatted), + if (isMpv) _metric(t.performanceOverlay.speed, _stats.cacheSpeedFormatted), ]), - _buildSection(Symbols.apps_rounded, 'App', [ - _metric('Player', _stats.playerTypeFormatted), - _metric('Memory', _stats.appMemoryFormatted), - _metric('UI FPS', _stats.uiFpsFormatted), + _buildSection(Symbols.apps_rounded, t.performanceOverlay.app, [ + _metric(t.performanceOverlay.player, _stats.playerTypeFormatted), + _metric(t.performanceOverlay.memory, _stats.appMemoryFormatted), + _metric(t.performanceOverlay.uiFps, _stats.uiFpsFormatted), ]), ];