From 369c6279d6bf0669e424c9179cedd98d52c213b7 Mon Sep 17 00:00:00 2001 From: edde746 <86283021+edde746@users.noreply.github.com> Date: Mon, 10 Aug 2026 15:29:12 +0200 Subject: [PATCH] fix(i18n): translate the player, downloads and server-setup text left in English A Portuguese user reported "Skip Intro" rendering in English on Android TV. The locale files were not the problem - all 22 were structurally complete. skip_marker_button.dart simply never imported strings.g.dart and assigned 'Skip Intro' / 'Skip Credits' / 'Next Episode' as plain literals. An audit of lib/ found ~120 more sites in the same state, in four shapes that need different fixes: A literal in a file that never imported the i18n layer is the easy one - skip_marker_button, performance_stats, track_label_builder and codec_utils all render text with no `t` in the file at all. TrackLabelBuilder._compose now takes a fallbackLabel builder instead of an English fallbackPrefix, so the caller supplies t.audioTracks.track / t.videoControls.subtitleTrack and every unnamed audio and subtitle row in the track menus is localized. English reaching the user through an exception message is the widest one, and it needs care: MediaServerException.message feeds both toString() - logs and Sentry grouping - and verbatim UI display. Localizing it in place would make bug-report logs follow the user's locale and split one Sentry issue into 22. The MediaServer and Seerr families instead gain a nullable `display` alongside the English `message`, and the six screens that print these errors read `display ?? message`. PlaybackException keeps the opposite rule, because it already carries a PlaybackFailureReason for logic and classifyPlaybackFailure already builds it from t.messages: its stragglers are localized at the throw site. That also removes the literal "Exception: " prefix Live TV users saw on a tune failure, since PlaybackException.toString() returns the bare message. Localized parts hand-concatenated with bare English are the shape no search for Text('...') can find: '${t.common.pause} auto-scroll' on the home carousel, '${day} at ${time}' on the Live TV schedule row, and an actor-screen count that hand-rolled its plural as `n == 1 ? 'title' : 'titles'` - wrong for ru and pl regardless of translation, now a real Slang plural. Finally a literal assigned to provider state that a widget renders later: DownloadProgress.errorMessage, and the four background_downloader notification bodies, which sit inside a plugin config call where no widget-shaped search reaches them. Two things surfaced while converting. track_chapter_controls compared a track label against 'Audio Track N' to swap in a localized version; once the builder localized its own fallback that branch became unreachable, so it and the orphaned _joinTrackLabel are gone. And discovery_view's PeerError fallback arm looks like a leak but is not - its producers already localize, and a test says so - so it stays as it is. All 21 non-base locales are translated, including the 21 keys left empty by earlier commits that were falling back to English. No locale has an empty value. scripts/check_hardcoded_strings.py guards the three shapes a structural check can see, and runs in ci_checks.sh after translation hygiene. Its first draft passed its own tests while missing this very bug, because 'Skip Intro' is bound to a local rather than handed to Text(); the name-bound rule that closes that gap is restricted to phrase-shaped literals, or it cannot tell copy from the identifiers this codebase binds constantly ('cast_row', 'auto', 'liveTv'). It cannot see English inside a throw or assigned to a provider field - neither is distinguishable from a log message without dataflow analysis - and the docstring says so. label: and actionLabel: are deliberately unscanned: here they name a diagnostic operation, and a check that is chronically red is a check that gets switched off. One commit rather than one per area: the keys, the 22 locale files and the generated output are a single unit, and any partial split fails the repo's own unused-key scan on the way through. close #1856 --- lib/exceptions/media_server_exceptions.dart | 22 +- lib/i18n/az.i18n.json | 163 +++++-- lib/i18n/bg.i18n.json | 163 +++++-- lib/i18n/da.i18n.json | 163 +++++-- lib/i18n/de.i18n.json | 163 +++++-- lib/i18n/en.i18n.json | 125 +++++- lib/i18n/es.i18n.json | 163 +++++-- lib/i18n/fr.i18n.json | 163 +++++-- lib/i18n/hu.i18n.json | 163 +++++-- lib/i18n/it.i18n.json | 163 +++++-- lib/i18n/ja.i18n.json | 162 +++++-- lib/i18n/kk.i18n.json | 163 +++++-- lib/i18n/ko.i18n.json | 162 +++++-- lib/i18n/nb.i18n.json | 163 +++++-- lib/i18n/nl.i18n.json | 163 +++++-- lib/i18n/pl.i18n.json | 165 +++++-- lib/i18n/pt.i18n.json | 163 +++++-- lib/i18n/ru.i18n.json | 165 +++++-- lib/i18n/strings.g.dart | 2 +- lib/i18n/strings_az.g.dart | 229 +++++++++- lib/i18n/strings_bg.g.dart | 229 +++++++++- lib/i18n/strings_da.g.dart | 229 +++++++++- lib/i18n/strings_de.g.dart | 229 +++++++++- lib/i18n/strings_en.g.dart | 359 ++++++++++++++- lib/i18n/strings_es.g.dart | 229 +++++++++- lib/i18n/strings_fr.g.dart | 229 +++++++++- lib/i18n/strings_hu.g.dart | 229 +++++++++- lib/i18n/strings_it.g.dart | 229 +++++++++- lib/i18n/strings_ja.g.dart | 228 +++++++++- lib/i18n/strings_kk.g.dart | 229 +++++++++- lib/i18n/strings_ko.g.dart | 228 +++++++++- lib/i18n/strings_nb.g.dart | 229 +++++++++- lib/i18n/strings_nl.g.dart | 229 +++++++++- lib/i18n/strings_pl.g.dart | 231 +++++++++- lib/i18n/strings_pt.g.dart | 229 +++++++++- lib/i18n/strings_ru.g.dart | 231 +++++++++- lib/i18n/strings_sv.g.dart | 229 +++++++++- lib/i18n/strings_tr.g.dart | 229 +++++++++- lib/i18n/strings_uz.g.dart | 229 +++++++++- lib/i18n/strings_zh.g.dart | 228 +++++++++- lib/i18n/strings_zh_Hant.g.dart | 228 +++++++++- lib/i18n/sv.i18n.json | 163 +++++-- lib/i18n/tr.i18n.json | 163 +++++-- lib/i18n/uz.i18n.json | 163 +++++-- lib/i18n/zh-Hant.i18n.json | 162 +++++-- lib/i18n/zh.i18n.json | 162 +++++-- lib/main.dart | 2 +- lib/media/media_file_info.dart | 5 +- lib/providers/companion_remote_provider.dart | 2 +- lib/providers/download_provider.dart | 4 +- lib/providers/offline_watch_provider.dart | 2 +- lib/screens/actor_media_screen.dart | 2 +- lib/screens/auth/plex_pin_auth_flow.dart | 5 +- lib/screens/discover_screen.dart | 4 +- .../livetv/live_tv_show_schedule_screen.dart | 9 +- lib/screens/settings/add_jellyfin_screen.dart | 6 +- .../edit_jellyfin_connection_screen.dart | 2 +- .../settings/seerr_connect_screen.dart | 8 +- lib/screens/settings/settings_screen.dart | 2 +- .../parts/episode_navigation.dart | 9 +- lib/screens/video_player/parts/errors.dart | 4 +- .../video_player/parts/playback_start.dart | 8 +- .../widgets/player_prompt_overlays.dart | 2 +- .../companion_remote_peer_service.dart | 2 +- lib/services/download_manager_service.dart | 18 +- lib/services/jellyfin_auth_service.dart | 48 ++- .../jellyfin_client/parts/live_tv.dart | 2 +- .../jellyfin_client/parts/playback.dart | 2 +- lib/services/jellyfin_endpoint_discovery.dart | 60 ++- .../music/music_playback_service_impl.dart | 6 +- lib/services/music/music_source_resolver.dart | 6 +- .../playback_initialization_service.dart | 7 +- lib/services/plex_auth_service.dart | 7 +- lib/services/plex_client.dart | 13 +- lib/services/plex_mappers.dart | 3 +- lib/services/seerr/seerr_auth_service.dart | 36 +- lib/services/seerr/seerr_client.dart | 6 +- lib/services/seerr/seerr_exceptions.dart | 18 +- lib/services/settings_export_service.dart | 3 +- lib/services/track_manager.dart | 24 +- lib/utils/codec_utils.dart | 6 +- lib/utils/live_tv_grouping.dart | 3 +- lib/utils/track_label_builder.dart | 14 +- .../providers/watch_together_provider.dart | 3 +- lib/widgets/bottom_sheet_header.dart | 2 + lib/widgets/download_tree_view.dart | 8 +- lib/widgets/tv_color_picker.dart | 6 +- lib/widgets/tv_virtual_keyboard.dart | 2 +- .../sheets/video_settings_sheet.dart | 2 +- .../performance_overlay.dart | 16 +- .../performance_stats.dart | 85 ++-- .../widgets/skip_marker_button.dart | 7 +- .../widgets/track_chapter_controls.dart | 11 +- scripts/check_hardcoded_strings.py | 408 ++++++++++++++++++ scripts/ci_checks.sh | 21 +- scripts/hardcoded_strings_allowlist.json | 85 ++++ scripts/test_check_hardcoded_strings.py | 195 +++++++++ test/widgets/video_controls_test.dart | 17 +- 98 files changed, 8858 insertions(+), 1110 deletions(-) create mode 100755 scripts/check_hardcoded_strings.py create mode 100644 scripts/hardcoded_strings_allowlist.json create mode 100755 scripts/test_check_hardcoded_strings.py diff --git a/lib/exceptions/media_server_exceptions.dart b/lib/exceptions/media_server_exceptions.dart index 2316211b..6de973b1 100644 --- a/lib/exceptions/media_server_exceptions.dart +++ b/lib/exceptions/media_server_exceptions.dart @@ -7,9 +7,13 @@ import 'package:http/http.dart'; /// Jellyfin auth/HTTP layers throw subtypes from this hierarchy so consumers /// can catch with one filter and match exhaustively when they care which /// failure mode it is. +/// +/// [message] is English for stable logs and Sentry grouping. [display] is the +/// localized user-facing text when this failure is rendered in the UI. sealed class MediaServerException implements Exception { final String message; - const MediaServerException(this.message); + final String? display; + const MediaServerException(this.message, {this.display}); @override String toString() => '$runtimeType: $message'; @@ -19,7 +23,7 @@ sealed class MediaServerException implements Exception { /// look like the expected backend at all. Surfaces in onboarding probes /// (Jellyfin `/System/Info/Public`, Plex resource discovery). class MediaServerUrlException extends MediaServerException { - const MediaServerUrlException(super.message); + const MediaServerUrlException(super.message, {super.display}); } /// Authentication failed — bad password, expired token, disabled user, @@ -28,13 +32,13 @@ class MediaServerUrlException extends MediaServerException { /// during refresh). class MediaServerAuthException extends MediaServerException { final int? statusCode; - const MediaServerAuthException(super.message, {this.statusCode}); + const MediaServerAuthException(super.message, {this.statusCode, super.display}); } /// Auth polling reached a terminal server-side expiry/rejection state before /// the user completed the external sign-in flow. class MediaServerPinExpiredException extends MediaServerAuthException { - const MediaServerPinExpiredException() : super('PIN expired before sign-in'); + const MediaServerPinExpiredException({String? display}) : super('PIN expired before sign-in', display: display); } /// HTTP transport / non-2xx errors. Carries the status code (when known), @@ -50,8 +54,14 @@ class MediaServerHttpException extends MediaServerException { final dynamic responseData; final Uri? requestUri; - MediaServerHttpException({required this.type, String? message, this.statusCode, this.responseData, this.requestUri}) - : super(message ?? ''); + MediaServerHttpException({ + required this.type, + String? message, + String? display, + this.statusCode, + this.responseData, + this.requestUri, + }) : super(message ?? '', display: display); /// Map a caught exception to a [MediaServerHttpException]. factory MediaServerHttpException.from(Object error, {Uri? uri}) { diff --git a/lib/i18n/az.i18n.json b/lib/i18n/az.i18n.json index ac433bf9..8241f667 100644 --- a/lib/i18n/az.i18n.json +++ b/lib/i18n/az.i18n.json @@ -17,7 +17,8 @@ "quickConnectWaiting": "Təsdiq gözlənilir…", "quickConnectCancel": "Ləğv et", "quickConnectExpired": "Sürətli Qoşulmanın vaxtı bitdi. Təzədən cəhd edin.", - "localDataRecoveryRequired": "Plezy yerli daxil olma və gözləyən oxutma məlumatlarını təhlükəsiz bərpa edə bilmədi. Lütfən təzədən daxil olun." + "localDataRecoveryRequired": "Plezy yerli daxil olma və gözləyən oxutma məlumatlarını təhlükəsiz bərpa edə bilmədi. Lütfən təzədən daxil olun.", + "pinCheckRejected": "Plex PIN yoxlaması rədd edildi" }, "common": { "cancel": "Ləğv et", @@ -77,7 +78,10 @@ "trakt": "Trakt", "rottenTomatoesCritic": "Rotten Tomatoes tənqidçiləri", "rottenTomatoesAudience": "Rotten Tomatoes tamaşaçıları" - } + }, + "notAvailable": "N/A", + "url": "URL", + "letterKeys": "ABC" }, "screens": { "licenses": "Lisenziyalar", @@ -323,8 +327,8 @@ "showNavBarLabels": "Naviqasiya paneli yazılarını göstər", "showNavBarLabelsDescription": "Naviqasiya paneli ikonlarının altında mətni göstər", "startupSection": "Başlanğıc bölməsi", - "showExploreTab": "", - "showExploreTabDescription": "", + "showExploreTab": "Kəşf et nişanını göstər", + "showExploreTabDescription": "Plex Discover və qoşulmuş izləmə xidmətlərindəki məzmunla Kəşf et nişanını göstər", "liveTvDefaultFavorites": "Canlı TV-də sevimli kanalları defolt et", "liveTvDefaultFavoritesDescription": "Canlı TV açıldıqda yalnız sevimli kanalları göstər", "display": "Ekran", @@ -335,7 +339,8 @@ "player": "Oynadıcı", "subtitlesAndConfig": "Altyazılar və konfiqurasiya", "seekAndTiming": "Sarğı və vaxt tənzimləməsi", - "behavior": "Davranış" + "behavior": "Davranış", + "exportDialogTitle": "Plezy tənzimləmələrini ixrac et" }, "search": { "hint": "Kino, serial, musiqi axtar...", @@ -491,7 +496,9 @@ "flagExternal": "Xarici", "flagHearingImpaired": "Eşitmə qüsurlu üçün", "flagDub": "Dublyaj", - "flagOriginal": "Orijinal" + "flagOriginal": "Orijinal", + "channelsMono": "Mono", + "dolbyVisionProfile": "Profil ${profile}" }, "mediaMenu": { "markAsWatched": "Baxıldı olaraq işarələ", @@ -568,7 +575,12 @@ "alphabetNavigation": "Əlifba naviqasiyası", "alphabetScrollHint": "Hərflərə görə keçmək üçün yuxarı və ya aşağı sürüşdürün", "rowColumnPosition": "Sətir ${row} / ${rowCount}, sütun ${column} / ${columnCount}", - "rowPosition": "Sətir ${row} / ${rowCount}" + "rowPosition": "Sətir ${row} / ${rowCount}", + "autoScrollPlay": "Avtomatik sürüşdürməni başlat", + "autoScrollPause": "Avtomatik sürüşdürməyə fasilə ver", + "hueShort": "H", + "saturationShort": "S", + "valueShort": "V" }, "tooltips": { "shufflePlay": "Qarışıq oynat", @@ -666,7 +678,16 @@ "subtitleDownloaded": "Altyazı yükləndi", "subtitleDownloadedNotApplied": "Altyazı yükləndi, lakin seçilə bilmədi", "subtitleDownloadFailed": "Altyazı yüklənə bilmədi", - "searchLanguages": "Dillərdə axtar..." + "searchLanguages": "Dillərdə axtar...", + "skipIntro": "Girişi keç", + "skipCredits": "Titrləri keç", + "nextEpisode": "Növbəti seriya", + "subtitleTrack": "Zolaq ${n}", + "subtitleFile": "Altyazı ${name}", + "forcedTrack": "${label} (Məcburi)", + "osdSubtitlesOff": "Altyazı: Söndürülüb", + "osdSubtitles": "Altyazı: ${track}", + "osdAudio": "Səs: ${track}" }, "userStatus": {}, "messages": { @@ -722,12 +743,18 @@ "serverLimitBody": "Server xətası (HTTP 500). Məhdudiyyət bu seansı rədd etdi.", "mediaUnreadableTitle": "Fayl əlçatan deyil", "mediaUnreadableBody": "Server bu elementi tapdı, lakin onun faylını oxuya bilmədi (HTTP 404). Fayl yəqin ki, köçürülüb, silinib və ya onun saxlanma yeri oflayndır. Server sahibindən faylı yoxlamasını və kitabxananı yenidən skan etməsini xahiş edin.", - "serverBusyTitle": "", - "serverBusyBody": "", + "serverBusyTitle": "Yayım əlçatan deyil", + "serverBusyBody": "Server bu faylı yayımlamaqdan dəfələrlə imtina etdi (HTTP 503). Server yenidən başladılır və ya məşğul ola bilər, yaxud faylın yerləşdiyi yaddaş oflayn ola bilər. Bir az sonra təzədən cəhd edin — problem davam edərsə, server sahibindən serveri və faylın yerləşdiyi yaddaşı yoxlamasını istəyin.", "logsUploaded": "Jurnallar yükləndi", "logsUploadFailed": "Jurnallar yüklənə bilmədi", "logId": "Jurnal ID-si", - "burnedSubtitlesUseMenu": "" + "burnedSubtitlesUseMenu": "Altyazılar bu yayıma həkk edilib. Onları altyazı menyusundan dəyişin.", + "noVideoUrl": "Video URL-i mövcud deyil", + "playbackNoMediaSources": "Server oynadıla bilən media mənbəyi qaytarmadı", + "playbackDataNotPrepared": "Məlumatları hazır olmadan oynatma başladıldı", + "streamSelectionUnavailable": "Bu mənbə üçün yayım seçimi mövcud deyil", + "streamSelectionFailed": "Seçilmiş yayımları tətbiq etmək olmadı", + "serverUnavailableForProfile": "Aktiv profil üçün heç bir server mövcud deyil" }, "subtitlingStyling": { "text": "Mətn", @@ -746,8 +773,8 @@ "overrideStrip": "Formatlaşdırmanı sil", "positionTop": "Yuxarı", "positionBottom": "Aşağı", - "anchorToScreen": "", - "anchorToScreenDescription": "", + "anchorToScreen": "Ekrana bərkit", + "anchorToScreenDescription": "Mətn altyazılarını geniş ekranlı videonun altındakı qara zolaqlarda göstər", "bold": "Qalın", "italic": "Kursiv", "renderResolution": "Emal imkanı (Resolution)", @@ -835,7 +862,8 @@ "pinProtectionOptional": "PIN mühafizəsi (istəyə bağlı)", "pinExplain": "Profillər arası keçid üçün 4 rəqəmli PIN tələb olunur.", "continueButton": "Davam et", - "pinsDontMatch": "PIN-lər uyğun gəlmir" + "pinsDontMatch": "PIN-lər uyğun gəlmir", + "tokenIdentityMismatch": "Plex profil tokeni gözlənilməyən serveri müəyyən etdi" }, "connections": { "sectionTitle": "Qoşulmalar", @@ -872,7 +900,11 @@ "movie": "Kino", "tvShow": "TV Şou", "minutesLeft": "${minutes} dəq qaldı", - "moreLikeThis": "Buna bənzərlər" + "moreLikeThis": "Buna bənzərlər", + "titleCount": { + "one": "${n} başlıq", + "other": "${n} başlıq" + } }, "errors": { "searchFailed": "Axtarış uğursuz oldu: ${error}", @@ -1080,10 +1112,10 @@ "characters": "Personajlar", "addToWatchlist": "İzləmə siyahısına əlavə et", "removeFromWatchlist": "İzləmə siyahısından sil", - "addedToWatchlist": "", - "removedFromWatchlist": "", + "addedToWatchlist": "Baxış siyahısına əlavə edildi", + "removedFromWatchlist": "Baxış siyahısından silindi", "watchlistUpdateFailed": "İzləmə siyahısı yenilənə bilmədi", - "watchlistNoMatch": "", + "watchlistNoMatch": "Bu elementi heç bir baxış siyahısı ilə uyğunlaşdırmaq olmadı", "notInLibrary": "Kitabxananızda yoxdur", "inTheseLibraries": "Bu kitabxanalarda var", "checkingLibrary": "Kitabxananız yoxlanılır...", @@ -1253,9 +1285,9 @@ "watchChannel": "Kanala bax", "favorites": "Sevimlilər", "reorderFavorites": "Sevimliləri yenidən sırala", - "noFavoriteChannels": "", - "noFavoriteChannelsHint": "", - "showAllChannels": "", + "noFavoriteChannels": "Sevimli kanal yoxdur", + "noFavoriteChannelsHint": "Bütün kanalları göstərin, sonra kanalı sevimlilərə əlavə etmək üçün üzərinə uzun basın.", + "showAllChannels": "Bütün kanalları göstər", "favoritesLoadFailed": "Sevimlilər yüklənə bilmədi.", "favoritesUpdateFailed": "Sevimlilər yenilənə bilmədi.", "joinSession": "Davam edən seansa qoşul", @@ -1294,7 +1326,12 @@ "recordingRuleUpdated": "Yazma qaydası yeniləndi", "guideReloadRequested": "Bələdçi yenilənməsi tələb olundu", "rulesProcessRequested": "Qaydaların yenidən qiymətləndirilməsi tələb olundu", - "recordShow": "Şounu yaz" + "recordShow": "Şounu yaz", + "startingInMinutes": "${minutes} dəq sonra başlayır", + "dayAtTime": "${day}, saat ${time}", + "invalidPlaybackData": "${product} etibarsız Canlı TV oynatma məlumatı qaytardı", + "failedToStartChannel": "Canlı kanalı başlatmaq olmadı", + "failedToBuildStreamUrl": "Yayım URL-i yaratmaq olmadı" }, "collections": { "title": "Kolleksiyalar", @@ -1371,7 +1408,9 @@ "nextTrack": "Növbəti mahnı", "repeat": "Təkrarla", "repeatAll": "Hamısını təkrarla", - "repeatOne": "Birini təkrarla" + "repeatOne": "Birini təkrarla", + "instantMixNoServer": "Ani miks üçün heç bir server mövcud deyil", + "noAudioUrl": "${track} üçün səs URL-i mövcud deyil" }, "watchTogether": { "title": "Birlikdə İzlə", @@ -1438,7 +1477,8 @@ "renameRoom": "Otağın adını dəyişdir", "removeRoom": "Sil", "guestSwitchUnavailable": "Keçid etmək olmadı — eyniləşdirmə üçün server əlçatan deyil", - "guestSwitchFailed": "Keçid etmək olmadı — məzmun tapılmadı" + "guestSwitchFailed": "Keçid etmək olmadı — məzmun tapılmadı", + "defaultDisplayName": "İstifadəçi" }, "downloads": { "title": "Yükləmələr", @@ -1542,7 +1582,17 @@ "statusUnknown": "Hələ yoxlanılmayıb", "settingsUnavailable": "Bu cihazda sistem tənzimləmələri açıla bilmədi", "linkUnavailable": "Bu cihazda dontkillmyapp.com açıla bilmədi" - } + }, + "unknownShow": "Məlum olmayan serial", + "unknownSeason": "Məlum olmayan mövsüm", + "unknownAlbum": "Məlum olmayan albom", + "completedOfTotal": "${completed}/${total} tamamlandı", + "errorFileNotFound": "Fayl tapılmadı (404)", + "errorDownloadFailed": "Yükləmə uğursuz oldu", + "errorPostProcessing": "Sonrakı emal uğursuz oldu: ${error}", + "notificationDownloading": "Yüklənir...", + "notificationComplete": "Yükləmə tamamlandı", + "notificationPaused": "Yükləmə dayandırıldı" }, "shaders": { "title": "Şeyderlər", @@ -1633,7 +1683,8 @@ "failedToConnectAnyAddress": "Heç bir ünvana qoşuluna bilmədi", "connectionLostAfterAttempts": "${attempts} cəhddən sonra əlaqə kəsildi", "connectionLost": "Əlaqə kəsildi" - } + }, + "closedBeforeAuth": "Bağlantı autentifikasiyadan əvvəl bağlandı" }, "videoSettings": { "playbackSpeed": "Oynatma sürəti", @@ -1644,13 +1695,13 @@ "audioSync": "Səs sinxronizasiyası", "subtitleSync": "Altyazı sinxronizasiyası", "hdr": "HDR", - "hdrUnsupported": "", - "hdrToneMapping": "", - "hdrToneMappingCompositor": "", - "hdrToneMappingCompositorDescription": "", - "hdrToneMappingPlayer": "", - "hdrToneMappingPlayerDescription": "", - "hdrToneMappingFailed": "", + "hdrUnsupported": "HDR burada əlçatan deyil — bu masaüstü kompozitoru və ya video çıxışı onu ötürə bilmir.", + "hdrToneMapping": "HDR ton uyğunlaşdırması", + "hdrToneMappingCompositor": "Kompozitor", + "hdrToneMappingCompositorDescription": "Mənbənin HDR metaməlumatlarını dəyişmədən ötür və ton uyğunlaşdırmasını masaüstü kompozitoruna həvalə et.", + "hdrToneMappingPlayer": "Oynadıcı", + "hdrToneMappingPlayerDescription": "Oynadıcıda tonları ekranın pik parlaqlığına uyğunlaşdır, sonra nəticəni kompozitora bildir.", + "hdrToneMappingFailed": "HDR ton uyğunlaşdırmasını dəyişmək olmadı — əvvəlki rejim hələ də aktivdir.", "audioOutput": "Səs çıxışı", "performanceOverlay": "Məhsuldarlıq paneli", "audioOutputDolbyAtmos": "Dolby Atmos", @@ -1696,7 +1747,17 @@ "speed": "Sürət", "player": "Oynadıcı", "memory": "Yaddaş", - "uiFps": "Arayüz (UI) FPS-i" + "uiFps": "Arayüz (UI) FPS-i", + "fps": "FPS", + "decoderAndroidHw": "Android HW", + "decoderNvidiaHw": "NVIDIA HW", + "decoderQualcommHw": "Qualcomm HW", + "decoderMediatekHw": "MediaTek HW", + "decoderExynosHw": "Exynos HW", + "decoderSoftware": "Proqram təminatı", + "decoderHardware": "Aparat təminatı", + "tunnelingActive": "Aktiv", + "dvRpuFailed": "${converted} (${failures} uğursuz)" }, "externalPlayer": { "title": "Xarici oynadıcı", @@ -1854,7 +1915,17 @@ "statusAvailable": "Əlçatandır", "statusPartiallyAvailable": "Hissəvi əlçatandır", "statusRequested": "Sorğu göndərildi", - "statusProcessing": "Emal edilir" + "statusProcessing": "Emal edilir", + "couldNotReach": "${url} ünvanına çatmaq olmadı: ${error}", + "noInstanceAtUrl": "${url} ünvanında Seerr instansiyası yoxdur (HTTP ${status})", + "notInitialized": "Bu Seerr instansiyasının ilkin quraşdırılması tamamlanmayıb", + "noPlexTokenForReauth": "Yenidən daxil olmaq üçün Plex tokeni mövcud deyil", + "noStoredCredentials": "Yenidən daxil olmaq üçün yadda saxlanmış giriş məlumatları mövcud deyil", + "signInRejected": "Daxil olma rədd edildi", + "noSessionCookie": "Seerr sessiya kukisi yaratmadı", + "freshCookieRejected": "Seerr yeni sessiya kukisini rədd etdi", + "noUserInformation": "Seerr istifadəçi məlumatlarını qaytarmadı", + "sessionRejectedAfterReauth": "Yenidən daxil olduqdan sonra sessiya rədd edildi" }, "services": { "title": "Xidmətlər", @@ -1875,7 +1946,7 @@ }, "deviceCode": { "title": "Plezy-ni ${service} üzərində aktivləşdirin", - "instructions": "", + "instructions": "QR kodunu skan edin və ya aşağıdakı ünvana keçib bu kodu daxil edin:", "openToActivate": "Aktivləşdirmək üçün ${service} açın", "copyCode": "Aktivləşdirmə kodunu kopyala", "waitingForAuthorization": "Səlahiyyət gözlənilir…", @@ -1933,6 +2004,24 @@ "connectToMediaBrowserCardSubtitle": "Server URL-inizi, istifadəçi adınızı və şifrənizi daxil edin.", "connectToMediaBrowserCardSubtitleScoped": "${product} serverinizə daxil olun. ${name} ilə əlaqələndirilir.", "borrowFromAnotherProfile": "Başqa profildən götür", - "borrowFromAnotherProfileSubtitle": "Başqa profilin qoşulmasını yenidən istifadə edin." + "borrowFromAnotherProfileSubtitle": "Başqa profilin qoşulmasını yenidən istifadə edin.", + "invalidCredentials": "İstifadəçi adı və ya şifrə yanlışdır", + "authResponseNotJson": "Autentifikasiya cavabı etibarlı JSON deyildi", + "quickConnectRejected": "Quick Connect server tərəfindən rədd edildi", + "quickConnectNotJson": "Quick Connect cavabı etibarlı JSON deyildi", + "quickConnectMissingFields": "Quick Connect cavabında kod və ya məxfi açar yoxdur", + "quickConnectPollRejected": "Quick Connect sorğulaması server tərəfindən rədd edildi", + "serverTimedOut": "Server vaxtında cavab vermədi", + "responseNotJson": "Server cavabı etibarlı JSON deyildi", + "responseMissingIdentity": "Cavabda ID və ya server adı yoxdur — bu, ${product} serveridir?", + "probeFailed": "Serverə çatmaq olmadı: ${error}", + "enterAtLeastOneUrl": "Ən azı bir ${product} server URL-i daxil edin", + "noReachableServer": "Əlçatan ${product} serveri tapılmadı", + "urlsPointToDifferentServers": "Bu URL-lər fərqli ${product} serverlərinə aiddir", + "urlDoesNotMatchServer": "Bu URL ${product} serverinə uyğun gəlmir", + "redirectUnsupported": "Server dəstəklənməyən URL-ə yönləndirdi", + "redirectDifferentHost": "Server başqa hosta yönləndirdi. Son ${product} URL-ni birbaşa daxil edin.", + "redirectInsecure": "Server HTTPS-dən təhlükəsiz olmayan URL-ə yönləndirdi", + "redirectUnsupportedEnterFinal": "Server dəstəklənməyən URL-ə yönləndirdi. Son ${product} URL-ni birbaşa daxil edin." } } diff --git a/lib/i18n/bg.i18n.json b/lib/i18n/bg.i18n.json index 40f8bedc..9d298cec 100644 --- a/lib/i18n/bg.i18n.json +++ b/lib/i18n/bg.i18n.json @@ -17,7 +17,8 @@ "quickConnectWaiting": "Изчакване на одобрение…", "quickConnectCancel": "Отказ", "quickConnectExpired": "Quick Connect изтече. Опитайте отново.", - "localDataRecoveryRequired": "Plezy не успя безопасно да възстанови локалните данни за вход и несинхронизираните данни за възпроизвеждане. Моля, влезте отново." + "localDataRecoveryRequired": "Plezy не успя безопасно да възстанови локалните данни за вход и несинхронизираните данни за възпроизвеждане. Моля, влезте отново.", + "pinCheckRejected": "Проверката на PIN кода на Plex беше отхвърлена" }, "common": { "cancel": "Отказ", @@ -77,7 +78,10 @@ "trakt": "Trakt", "rottenTomatoesCritic": "Критиците на Rotten Tomatoes", "rottenTomatoesAudience": "Публиката на Rotten Tomatoes" - } + }, + "notAvailable": "Н/Д", + "url": "URL", + "letterKeys": "АБВ" }, "screens": { "licenses": "Лицензи", @@ -323,8 +327,8 @@ "showNavBarLabels": "Показвай етикети в навигационната лента", "showNavBarLabelsDescription": "Показвай текстови етикети под иконите в навигационната лента", "startupSection": "Начален раздел", - "showExploreTab": "", - "showExploreTabDescription": "", + "showExploreTab": "Показване на раздела „Открий“", + "showExploreTabDescription": "Показва раздела „Открий“ със съдържание от Plex Discover и свързаните тракери", "liveTvDefaultFavorites": "По подразбиране към любими канали", "liveTvDefaultFavoritesDescription": "Показвай само любими канали при отваряне на телевизия на живо", "display": "Дисплей", @@ -335,7 +339,8 @@ "player": "Плейър", "subtitlesAndConfig": "Субтитри и конфигурация", "seekAndTiming": "Търсене и време", - "behavior": "Поведение" + "behavior": "Поведение", + "exportDialogTitle": "Експортиране на настройките на Plezy" }, "search": { "hint": "Търсене на филми, сериали, музика...", @@ -491,7 +496,9 @@ "flagExternal": "Външен", "flagHearingImpaired": "За хора с увреден слух", "flagDub": "Дублаж", - "flagOriginal": "Оригинал" + "flagOriginal": "Оригинал", + "channelsMono": "Моно", + "dolbyVisionProfile": "Профил ${profile}" }, "mediaMenu": { "markAsWatched": "Маркирай като гледано", @@ -568,7 +575,12 @@ "alphabetNavigation": "Навигация по азбуката", "alphabetScrollHint": "Плъзни нагоре или надолу, за да преминеш към друга буква", "rowColumnPosition": "Ред ${row} от ${rowCount}, колона ${column} от ${columnCount}", - "rowPosition": "Ред ${row} от ${rowCount}" + "rowPosition": "Ред ${row} от ${rowCount}", + "autoScrollPlay": "Пусни автоматичното превъртане", + "autoScrollPause": "Пауза на автоматичното превъртане", + "hueShort": "H", + "saturationShort": "S", + "valueShort": "V" }, "tooltips": { "shufflePlay": "Разбъркано възпроизвеждане", @@ -666,7 +678,16 @@ "subtitleDownloaded": "Субтитърът е изтеглен", "subtitleDownloadedNotApplied": "Субтитрите са изтеглени, но не можаха да бъдат избрани", "subtitleDownloadFailed": "Неуспешно изтегляне на субтитър", - "searchLanguages": "Търсене на езици..." + "searchLanguages": "Търсене на езици...", + "skipIntro": "Пропусни интрото", + "skipCredits": "Пропусни надписите", + "nextEpisode": "Следващ епизод", + "subtitleTrack": "Пътечка ${n}", + "subtitleFile": "Субтитри ${name}", + "forcedTrack": "${label} (Принудителни)", + "osdSubtitlesOff": "Субтитри: изкл.", + "osdSubtitles": "Субтитри: ${track}", + "osdAudio": "Аудио: ${track}" }, "userStatus": {}, "messages": { @@ -722,12 +743,18 @@ "serverLimitBody": "Грешка на сървъра (HTTP 500). Вероятно лимит за пропускателна способност/транскодиране е отхвърлил тази сесия. Помолете собственика да го коригира.", "mediaUnreadableTitle": "Файлът е недостъпен", "mediaUnreadableBody": "Сървърът намери този елемент, но не можа да прочете файла му (HTTP 404). Файлът вероятно е бил преместен, изтрит или хранилището му е офлайн. Помолете собственика на сървъра да провери файла и да сканира отново библиотеката.", - "serverBusyTitle": "", - "serverBusyBody": "", + "serverBusyTitle": "Потокът не е наличен", + "serverBusyBody": "Сървърът многократно отказа да предава този файл поточно (HTTP 503). Възможно е да се рестартира, да е зает или хранилището на файла да е офлайн. Опитайте отново след малко — ако проблемът продължи, помолете собственика на сървъра да провери сървъра и хранилището на файла.", "logsUploaded": "Логовете са качени", "logsUploadFailed": "Неуспешно качване на логовете", "logId": "ID на лога", - "burnedSubtitlesUseMenu": "" + "burnedSubtitlesUseMenu": "Субтитрите са вградени в този поток. Променете ги от менюто за субтитри.", + "noVideoUrl": "Няма наличен URL за видеото", + "playbackNoMediaSources": "Сървърът не върна медийни източници, годни за възпроизвеждане", + "playbackDataNotPrepared": "Възпроизвеждането беше стартирано, преди данните за него да са готови", + "streamSelectionUnavailable": "Изборът на потоци не е наличен за този източник", + "streamSelectionFailed": "Избраните потоци не можаха да бъдат приложени", + "serverUnavailableForProfile": "Няма наличен сървър за активния профил" }, "subtitlingStyling": { "text": "Текст", @@ -746,8 +773,8 @@ "overrideStrip": "Премахване на стиловете", "positionTop": "Горе", "positionBottom": "Долу", - "anchorToScreen": "", - "anchorToScreenDescription": "", + "anchorToScreen": "Закрепване към екрана", + "anchorToScreenDescription": "Показва текстовите субтитри в черните ленти под широкоекранното видео", "bold": "Получер", "italic": "Курсив", "renderResolution": "Резолюция на изобразяване", @@ -835,7 +862,8 @@ "pinProtectionOptional": "PIN защита (по желание)", "pinExplain": "Изисква се 4-цифрен PIN за смяна на профили.", "continueButton": "Продължи", - "pinsDontMatch": "PIN кодовете не съвпадат" + "pinsDontMatch": "PIN кодовете не съвпадат", + "tokenIdentityMismatch": "Токенът на профила в Plex съответства на неочакван сървър" }, "connections": { "sectionTitle": "Връзки", @@ -872,7 +900,11 @@ "movie": "Филм", "tvShow": "ТВ сериал", "minutesLeft": "Остават ${minutes} мин", - "moreLikeThis": "Подобно на това" + "moreLikeThis": "Подобно на това", + "titleCount": { + "one": "${n} заглавие", + "other": "${n} заглавия" + } }, "errors": { "searchFailed": "Търсенето е неуспешно: ${error}", @@ -1080,10 +1112,10 @@ "characters": "Герои", "addToWatchlist": "Добави в списъка за гледане", "removeFromWatchlist": "Премахни от списъка за гледане", - "addedToWatchlist": "", - "removedFromWatchlist": "", + "addedToWatchlist": "Добавено към списъка за гледане", + "removedFromWatchlist": "Премахнато от списъка за гледане", "watchlistUpdateFailed": "Неуспешно обновяване на списъка за гледане", - "watchlistNoMatch": "", + "watchlistNoMatch": "Този елемент не можа да бъде съпоставен със списък за гледане", "notInLibrary": "Не е в твоята библиотека", "inTheseLibraries": "В тези библиотеки", "checkingLibrary": "Проверка на твоята библиотека...", @@ -1253,9 +1285,9 @@ "watchChannel": "Гледай канал", "favorites": "Любими", "reorderFavorites": "Пренареди любимите", - "noFavoriteChannels": "", - "noFavoriteChannelsHint": "", - "showAllChannels": "", + "noFavoriteChannels": "Няма любими канали", + "noFavoriteChannelsHint": "Покажете всички канали, след което натиснете и задръжте канал, за да го добавите към любимите си.", + "showAllChannels": "Покажи всички канали", "favoritesLoadFailed": "Любимите не можаха да се заредят. Проверете връзката си и опитайте отново.", "favoritesUpdateFailed": "Любимите не можаха да бъдат обновени. Проверете връзката си и опитайте отново.", "joinSession": "Присъедини се към текуща сесия", @@ -1294,7 +1326,12 @@ "recordingRuleUpdated": "Правилото за запис е обновено", "guideReloadRequested": "Заявено е опресняване на ТВ програмата", "rulesProcessRequested": "Заявена е преоценка на правилата", - "recordShow": "Запиши предаването" + "recordShow": "Запиши предаването", + "startingInMinutes": "Започва след ${minutes} мин", + "dayAtTime": "${day} в ${time}", + "invalidPlaybackData": "${product} върна невалидни данни за възпроизвеждане на телевизия на живо", + "failedToStartChannel": "Каналът на живо не можа да бъде пуснат", + "failedToBuildStreamUrl": "URL за потока не можа да бъде създаден" }, "collections": { "title": "Колекции", @@ -1371,7 +1408,9 @@ "nextTrack": "Следваща песен", "repeat": "Повтаряне", "repeatAll": "Повтаряне на всички", - "repeatOne": "Повтаряне на една" + "repeatOne": "Повтаряне на една", + "instantMixNoServer": "Няма наличен сървър за незабавен микс", + "noAudioUrl": "Няма наличен URL за аудиото на ${track}" }, "watchTogether": { "title": "Гледане заедно", @@ -1438,7 +1477,8 @@ "renameRoom": "Преименувай стая", "removeRoom": "Премахни", "guestSwitchUnavailable": "Превключването не е възможно — сървърът е недостъпен за синхронизация", - "guestSwitchFailed": "Превключването не е възможно — съдържанието не е намерено на този сървър" + "guestSwitchFailed": "Превключването не е възможно — съдържанието не е намерено на този сървър", + "defaultDisplayName": "Потребител" }, "downloads": { "title": "Изтегляния", @@ -1542,7 +1582,17 @@ "statusUnknown": "Все още не е проверено", "settingsUnavailable": "Системните настройки не можаха да се отворят на това устройство", "linkUnavailable": "dontkillmyapp.com не можа да се отвори на това устройство" - } + }, + "unknownShow": "Неизвестен сериал", + "unknownSeason": "Неизвестен сезон", + "unknownAlbum": "Неизвестен албум", + "completedOfTotal": "Завършени: ${completed}/${total}", + "errorFileNotFound": "Файлът не е намерен (404)", + "errorDownloadFailed": "Изтеглянето е неуспешно", + "errorPostProcessing": "Последващата обработка е неуспешна: ${error}", + "notificationDownloading": "Изтегляне...", + "notificationComplete": "Изтеглянето завърши", + "notificationPaused": "Изтеглянето е на пауза" }, "shaders": { "title": "Шейдъри", @@ -1633,7 +1683,8 @@ "failedToConnectAnyAddress": "Неуспешно свързване към който и да е адрес", "connectionLostAfterAttempts": "Връзката е загубена след ${attempts} опита", "connectionLost": "Връзката е загубена" - } + }, + "closedBeforeAuth": "Връзката беше затворена преди удостоверяването" }, "videoSettings": { "playbackSpeed": "Скорост на възпроизвеждане", @@ -1644,13 +1695,13 @@ "audioSync": "Синхронизация на аудио", "subtitleSync": "Синхронизация на субтитри", "hdr": "HDR", - "hdrUnsupported": "", - "hdrToneMapping": "", - "hdrToneMappingCompositor": "", - "hdrToneMappingCompositorDescription": "", - "hdrToneMappingPlayer": "", - "hdrToneMappingPlayerDescription": "", - "hdrToneMappingFailed": "", + "hdrUnsupported": "HDR не е наличен тук — този композитор на работния плот или видеоизходът не може да го предава.", + "hdrToneMapping": "Тонално преобразуване на HDR", + "hdrToneMappingCompositor": "Композитор", + "hdrToneMappingCompositorDescription": "Предава HDR метаданните на източника без промяна и оставя композитора на работния плот да извърши тоналното преобразуване.", + "hdrToneMappingPlayer": "Плейър", + "hdrToneMappingPlayerDescription": "Извършва тоналното преобразуване в плейъра според пиковата яркост на дисплея, след което указва резултата на композитора.", + "hdrToneMappingFailed": "Тоналното преобразуване на HDR не можа да бъде променено — предишният режим остава активен.", "audioOutput": "Аудио изход", "performanceOverlay": "Оверлей за производителност", "audioOutputDolbyAtmos": "Dolby Atmos", @@ -1696,7 +1747,17 @@ "speed": "Скорост", "player": "Плеър", "memory": "Памет", - "uiFps": "FPS на интерфейса" + "uiFps": "FPS на интерфейса", + "fps": "FPS", + "decoderAndroidHw": "Android HW", + "decoderNvidiaHw": "NVIDIA HW", + "decoderQualcommHw": "Qualcomm HW", + "decoderMediatekHw": "MediaTek HW", + "decoderExynosHw": "Exynos HW", + "decoderSoftware": "Софтуерен", + "decoderHardware": "Хардуерен", + "tunnelingActive": "Активно", + "dvRpuFailed": "${converted} (неуспешни: ${failures})" }, "externalPlayer": { "title": "Външен плеър", @@ -1854,7 +1915,17 @@ "statusAvailable": "Налично", "statusPartiallyAvailable": "Частично налично", "statusRequested": "Заявено", - "statusProcessing": "Обработва се" + "statusProcessing": "Обработва се", + "couldNotReach": "Неуспешна връзка с ${url}: ${error}", + "noInstanceAtUrl": "На ${url} няма инстанция на Seerr (HTTP ${status})", + "notInitialized": "Тази инстанция на Seerr не е завършила първоначалната настройка", + "noPlexTokenForReauth": "Няма наличен Plex токен за повторен вход", + "noStoredCredentials": "Няма запазени данни за повторен вход", + "signInRejected": "Входът беше отхвърлен", + "noSessionCookie": "Seerr не издаде бисквитка за сесията", + "freshCookieRejected": "Seerr отхвърли новата бисквитка за сесията", + "noUserInformation": "Seerr не върна информация за потребителя", + "sessionRejectedAfterReauth": "Сесията беше отхвърлена след повторния вход" }, "services": { "title": "Услуги", @@ -1875,7 +1946,7 @@ }, "deviceCode": { "title": "Активиране на Plezy в ${service}", - "instructions": "", + "instructions": "Сканирайте QR кода или посетете адреса по-долу и въведете този код:", "openToActivate": "Отворете ${service}, за да активирате", "copyCode": "Копирай кода за активиране", "waitingForAuthorization": "Изчакване на оторизация…", @@ -1933,6 +2004,24 @@ "connectToMediaBrowserCardSubtitle": "Въведете URL адреса на сървъра, потребителското име и паролата.", "connectToMediaBrowserCardSubtitleScoped": "Впишете се в своя ${product} сървър. Обвързва се с ${name}.", "borrowFromAnotherProfile": "Използвай от друг профил", - "borrowFromAnotherProfileSubtitle": "Използвай връзка от друг профил. PIN-защитените профили изискват PIN." + "borrowFromAnotherProfileSubtitle": "Използвай връзка от друг профил. PIN-защитените профили изискват PIN.", + "invalidCredentials": "Невалидно потребителско име или парола", + "authResponseNotJson": "Отговорът при удостоверяване не беше валиден JSON", + "quickConnectRejected": "Quick Connect беше отхвърлен от сървъра", + "quickConnectNotJson": "Отговорът на Quick Connect не беше валиден JSON", + "quickConnectMissingFields": "В отговора на Quick Connect липсва код или таен ключ", + "quickConnectPollRejected": "Запитването на Quick Connect беше отхвърлено от сървъра", + "serverTimedOut": "Сървърът не отговори навреме", + "responseNotJson": "Отговорът на сървъра не беше валиден JSON", + "responseMissingIdentity": "В отговора липсва ID или име на сървъра — това сървър на ${product} ли е?", + "probeFailed": "Сървърът не може да бъде достигнат: ${error}", + "enterAtLeastOneUrl": "Въведете поне един URL на сървър на ${product}", + "noReachableServer": "Не беше намерен достъпен сървър на ${product}", + "urlsPointToDifferentServers": "Тези URL адреси сочат към различни сървъри на ${product}", + "urlDoesNotMatchServer": "Този URL не съответства на сървъра на ${product}", + "redirectUnsupported": "Сървърът пренасочи към неподдържан URL", + "redirectDifferentHost": "Сървърът пренасочи към друг хост. Въведете директно крайния URL на ${product}.", + "redirectInsecure": "Сървърът пренасочи от HTTPS към незащитен URL", + "redirectUnsupportedEnterFinal": "Сървърът пренасочи към неподдържан URL. Въведете директно крайния URL на ${product}." } } diff --git a/lib/i18n/da.i18n.json b/lib/i18n/da.i18n.json index b1c9007e..37cc8f1e 100644 --- a/lib/i18n/da.i18n.json +++ b/lib/i18n/da.i18n.json @@ -17,7 +17,8 @@ "quickConnectWaiting": "Venter på godkendelse…", "quickConnectCancel": "Annuller", "quickConnectExpired": "Quick Connect er udløbet. Prøv igen.", - "localDataRecoveryRequired": "Plezy kunne ikke gendanne lokale loginoplysninger og ventende afspilningsdata på en sikker måde. Log ind igen." + "localDataRecoveryRequired": "Plezy kunne ikke gendanne lokale loginoplysninger og ventende afspilningsdata på en sikker måde. Log ind igen.", + "pinCheckRejected": "Plex PIN-kontrollen blev afvist" }, "common": { "cancel": "Annuller", @@ -77,7 +78,10 @@ "trakt": "Trakt", "rottenTomatoesCritic": "Rotten Tomatoes-anmeldere", "rottenTomatoesAudience": "Rotten Tomatoes-publikum" - } + }, + "notAvailable": "N/A", + "url": "URL", + "letterKeys": "ABC" }, "screens": { "licenses": "Licenser", @@ -323,8 +327,8 @@ "showNavBarLabels": "Vis tekst på navigationslinjen", "showNavBarLabelsDescription": "Vis tekst under ikonerne på navigationslinjen", "startupSection": "Startsektion", - "showExploreTab": "", - "showExploreTabDescription": "", + "showExploreTab": "Vis fanen Opdag", + "showExploreTabDescription": "Vis fanen Opdag med indhold fra Plex Discover og tilknyttede trackere", "liveTvDefaultFavorites": "Vis favoritkanaler som standard", "liveTvDefaultFavoritesDescription": "Vis kun favoritkanaler ved åbning af Live TV", "display": "Skærm", @@ -335,7 +339,8 @@ "player": "Afspiller", "subtitlesAndConfig": "Undertekster og konfiguration", "seekAndTiming": "Søgning og timing", - "behavior": "Adfærd" + "behavior": "Adfærd", + "exportDialogTitle": "Eksportér Plezy-indstillinger" }, "search": { "hint": "Søg film, serier, musik...", @@ -491,7 +496,9 @@ "flagExternal": "Ekstern", "flagHearingImpaired": "Hørehæmmede", "flagDub": "Dub", - "flagOriginal": "Original" + "flagOriginal": "Original", + "channelsMono": "Mono", + "dolbyVisionProfile": "Profil ${profile}" }, "mediaMenu": { "markAsWatched": "Markér som set", @@ -568,7 +575,12 @@ "alphabetNavigation": "Alfabetnavigation", "alphabetScrollHint": "Stryg op eller ned for at flytte ét bogstav", "rowColumnPosition": "Række ${row} af ${rowCount}, kolonne ${column} af ${columnCount}", - "rowPosition": "Række ${row} af ${rowCount}" + "rowPosition": "Række ${row} af ${rowCount}", + "autoScrollPlay": "Start automatisk rulning", + "autoScrollPause": "Sæt automatisk rulning på pause", + "hueShort": "H", + "saturationShort": "S", + "valueShort": "V" }, "tooltips": { "shufflePlay": "Afspil tilfældigt", @@ -666,7 +678,16 @@ "subtitleDownloaded": "Undertekst downloadet", "subtitleDownloadedNotApplied": "Underteksten blev downloadet, men kunne ikke vælges", "subtitleDownloadFailed": "Kunne ikke downloade undertekst", - "searchLanguages": "Søg sprog..." + "searchLanguages": "Søg sprog...", + "skipIntro": "Spring intro over", + "skipCredits": "Spring rulletekster over", + "nextEpisode": "Næste episode", + "subtitleTrack": "Spor ${n}", + "subtitleFile": "Undertekst ${name}", + "forcedTrack": "${label} (tvunget)", + "osdSubtitlesOff": "Undertekster: Fra", + "osdSubtitles": "Undertekster: ${track}", + "osdAudio": "Lyd: ${track}" }, "userStatus": {}, "messages": { @@ -722,12 +743,18 @@ "serverLimitBody": "Serverfejl (HTTP 500). En båndbredde- eller transkodningsgrænse afviste sandsynligvis sessionen. Bed ejeren om at justere den.", "mediaUnreadableTitle": "Fil utilgængelig", "mediaUnreadableBody": "Serveren fandt dette emne, men kunne ikke læse filen (HTTP 404). Filen er sandsynligvis flyttet, slettet, eller dens lager er offline. Bed serverejeren om at kontrollere filen og scanne biblioteket igen.", - "serverBusyTitle": "", - "serverBusyBody": "", + "serverBusyTitle": "Stream er ikke tilgængelig", + "serverBusyBody": "Serveren blev ved med at afvise at streame denne fil (HTTP 503). Den er muligvis ved at genstarte eller optaget, eller filens lager er muligvis offline. Prøv igen om et øjeblik – hvis det bliver ved med at ske, skal du bede serverejeren om at kontrollere serveren og filens lager.", "logsUploaded": "Logfilerne blev uploadet", "logsUploadFailed": "Logfilerne kunne ikke uploades", "logId": "Log-ID", - "burnedSubtitlesUseMenu": "" + "burnedSubtitlesUseMenu": "Underteksterne er indbrændt i denne stream. Skift dem i undertekstmenuen.", + "noVideoUrl": "Ingen video-URL er tilgængelig", + "playbackNoMediaSources": "Serveren returnerede ingen mediekilder, der kan afspilles", + "playbackDataNotPrepared": "Afspilningen blev startet, før dens data var klar", + "streamSelectionUnavailable": "Valg af stream er ikke tilgængeligt for denne kilde", + "streamSelectionFailed": "Kunne ikke anvende de valgte streams", + "serverUnavailableForProfile": "Ingen server er tilgængelig for den aktive profil" }, "subtitlingStyling": { "text": "Tekst", @@ -746,8 +773,8 @@ "overrideStrip": "Fjern formatering", "positionTop": "Øverst", "positionBottom": "Nederst", - "anchorToScreen": "", - "anchorToScreenDescription": "", + "anchorToScreen": "Fastgør til skærmen", + "anchorToScreenDescription": "Vis tekstundertekster i de sorte bjælker under video i bredformat", "bold": "Fed", "italic": "Kursiv", "renderResolution": "Gengivelsesopløsning", @@ -835,7 +862,8 @@ "pinProtectionOptional": "PIN-beskyttelse (valgfri)", "pinExplain": "Der kræves en 4-cifret PIN-kode for at skifte profil.", "continueButton": "Fortsæt", - "pinsDontMatch": "PIN-koderne matcher ikke" + "pinsDontMatch": "PIN-koderne matcher ikke", + "tokenIdentityMismatch": "Plex-profiltokenet blev knyttet til en uventet server" }, "connections": { "sectionTitle": "Forbindelser", @@ -872,7 +900,11 @@ "movie": "Film", "tvShow": "TV-serie", "minutesLeft": "${minutes} min tilbage", - "moreLikeThis": "Mere som dette" + "moreLikeThis": "Mere som dette", + "titleCount": { + "one": "${n} titel", + "other": "${n} titler" + } }, "errors": { "searchFailed": "Søgning mislykkedes: ${error}", @@ -1080,10 +1112,10 @@ "characters": "Figurer", "addToWatchlist": "Føj til ønskeliste", "removeFromWatchlist": "Fjern fra ønskeliste", - "addedToWatchlist": "", - "removedFromWatchlist": "", + "addedToWatchlist": "Føjet til overvågningslisten", + "removedFromWatchlist": "Fjernet fra overvågningslisten", "watchlistUpdateFailed": "Kunne ikke opdatere ønskelisten", - "watchlistNoMatch": "", + "watchlistNoMatch": "Kunne ikke knytte dette element til en overvågningsliste", "notInLibrary": "Ikke i dit bibliotek", "inTheseLibraries": "I disse biblioteker", "checkingLibrary": "Tjekker dit bibliotek...", @@ -1253,9 +1285,9 @@ "watchChannel": "Se kanal", "favorites": "Favoritter", "reorderFavorites": "Omarranger favoritter", - "noFavoriteChannels": "", - "noFavoriteChannelsHint": "", - "showAllChannels": "", + "noFavoriteChannels": "Ingen favoritkanaler", + "noFavoriteChannelsHint": "Vis alle kanaler, og tryk derefter længe på en kanal for at føje den til dine favoritter.", + "showAllChannels": "Vis alle kanaler", "favoritesLoadFailed": "Favoritter kunne ikke indlæses. Kontrollér forbindelsen, og prøv igen.", "favoritesUpdateFailed": "Favoritterne kunne ikke opdateres. Kontrollér forbindelsen, og prøv igen.", "joinSession": "Deltag i igangværende session", @@ -1294,7 +1326,12 @@ "recordingRuleUpdated": "Optagelsesregel opdateret", "guideReloadRequested": "Der er anmodet om en opdatering af guiden", "rulesProcessRequested": "Der er anmodet om en ny evaluering af reglerne", - "recordShow": "Optag program" + "recordShow": "Optag program", + "startingInMinutes": "Starter om ${minutes} min", + "dayAtTime": "${day} kl. ${time}", + "invalidPlaybackData": "${product} returnerede ugyldige afspilningsdata for Live TV", + "failedToStartChannel": "Kunne ikke starte livekanalen", + "failedToBuildStreamUrl": "Kunne ikke oprette stream-URL'en" }, "collections": { "title": "Samlinger", @@ -1371,7 +1408,9 @@ "nextTrack": "Næste nummer", "repeat": "Gentag", "repeatAll": "Gentag alle", - "repeatOne": "Gentag ét nummer" + "repeatOne": "Gentag ét nummer", + "instantMixNoServer": "Ingen server er tilgængelig til et øjeblikkeligt mix", + "noAudioUrl": "Ingen lyd-URL er tilgængelig for ${track}" }, "watchTogether": { "title": "Se sammen", @@ -1438,7 +1477,8 @@ "renameRoom": "Omdøb rum", "removeRoom": "Fjern", "guestSwitchUnavailable": "Kunne ikke skifte — server ikke tilgængelig for synkronisering", - "guestSwitchFailed": "Kunne ikke skifte — indhold blev ikke fundet på denne server" + "guestSwitchFailed": "Kunne ikke skifte — indhold blev ikke fundet på denne server", + "defaultDisplayName": "Bruger" }, "downloads": { "title": "Downloads", @@ -1542,7 +1582,17 @@ "statusUnknown": "Endnu ikke kontrolleret", "settingsUnavailable": "Kunne ikke åbne systemindstillingerne på denne enhed", "linkUnavailable": "Kunne ikke åbne dontkillmyapp.com på denne enhed" - } + }, + "unknownShow": "Ukendt serie", + "unknownSeason": "Ukendt sæson", + "unknownAlbum": "Ukendt album", + "completedOfTotal": "${completed}/${total} fuldført", + "errorFileNotFound": "Filen blev ikke fundet (404)", + "errorDownloadFailed": "Download mislykkedes", + "errorPostProcessing": "Efterbehandling mislykkedes: ${error}", + "notificationDownloading": "Downloader...", + "notificationComplete": "Download fuldført", + "notificationPaused": "Download sat på pause" }, "shaders": { "title": "Shadere", @@ -1633,7 +1683,8 @@ "failedToConnectAnyAddress": "Kunne ikke oprette forbindelse til nogen adresse", "connectionLostAfterAttempts": "Forbindelse mistet efter ${attempts} forsøg", "connectionLost": "Forbindelse mistet" - } + }, + "closedBeforeAuth": "Forbindelsen blev lukket før godkendelsen" }, "videoSettings": { "playbackSpeed": "Afspilningshastighed", @@ -1644,13 +1695,13 @@ "audioSync": "Lydsynkronisering", "subtitleSync": "Undertekstsynkronisering", "hdr": "HDR", - "hdrUnsupported": "", - "hdrToneMapping": "", - "hdrToneMappingCompositor": "", - "hdrToneMappingCompositorDescription": "", - "hdrToneMappingPlayer": "", - "hdrToneMappingPlayerDescription": "", - "hdrToneMappingFailed": "", + "hdrUnsupported": "HDR er ikke tilgængelig her – denne skrivebordskompositor eller videoudgang kan ikke håndtere det.", + "hdrToneMapping": "HDR-tonemapping", + "hdrToneMappingCompositor": "Kompositor", + "hdrToneMappingCompositorDescription": "Videregiv kildens HDR-metadata, og lad skrivebordskompositoren tonemappe dem.", + "hdrToneMappingPlayer": "Afspiller", + "hdrToneMappingPlayerDescription": "Tilpas til skærmens maksimale lysstyrke i afspilleren, og fortæl derefter kompositoren om resultatet.", + "hdrToneMappingFailed": "Kunne ikke ændre HDR-tonemapping – den tidligere tilstand er stadig aktiv.", "audioOutput": "Lydoutput", "performanceOverlay": "Ydelsesoverlay", "audioOutputDolbyAtmos": "Dolby Atmos", @@ -1696,7 +1747,17 @@ "speed": "Hastighed", "player": "Afspiller", "memory": "Hukommelse", - "uiFps": "UI-FPS" + "uiFps": "UI-FPS", + "fps": "FPS", + "decoderAndroidHw": "Android HW", + "decoderNvidiaHw": "NVIDIA HW", + "decoderQualcommHw": "Qualcomm HW", + "decoderMediatekHw": "MediaTek HW", + "decoderExynosHw": "Exynos HW", + "decoderSoftware": "Software", + "decoderHardware": "Hardware", + "tunnelingActive": "Aktiv", + "dvRpuFailed": "${converted} (${failures} mislykkedes)" }, "externalPlayer": { "title": "Ekstern afspiller", @@ -1854,7 +1915,17 @@ "statusAvailable": "Tilgængelig", "statusPartiallyAvailable": "Delvist tilgængelig", "statusRequested": "Anmodet", - "statusProcessing": "Behandler" + "statusProcessing": "Behandler", + "couldNotReach": "Kunne ikke nå ${url}: ${error}", + "noInstanceAtUrl": "Ingen Seerr-instans på ${url} (HTTP ${status})", + "notInitialized": "Denne Seerr-instans har ikke fuldført førstegangsopsætningen", + "noPlexTokenForReauth": "Intet Plex-token er tilgængeligt til at logge ind igen", + "noStoredCredentials": "Ingen gemte loginoplysninger er tilgængelige til at logge ind igen", + "signInRejected": "Login blev afvist", + "noSessionCookie": "Seerr udstedte ikke en sessionscookie", + "freshCookieRejected": "Seerr afviste den nye sessionscookie", + "noUserInformation": "Seerr returnerede ikke brugeroplysninger", + "sessionRejectedAfterReauth": "Sessionen blev afvist efter at være logget ind igen" }, "services": { "title": "Tjenester", @@ -1875,7 +1946,7 @@ }, "deviceCode": { "title": "Aktiver Plezy på ${service}", - "instructions": "", + "instructions": "Scan QR-koden, eller gå til adressen nedenfor, og indtast denne kode:", "openToActivate": "Åbn ${service} for at aktivere", "copyCode": "Kopiér aktiveringskode", "waitingForAuthorization": "Venter på godkendelse…", @@ -1933,6 +2004,24 @@ "connectToMediaBrowserCardSubtitle": "Indtast din server-URL, brugernavn og adgangskode.", "connectToMediaBrowserCardSubtitleScoped": "Log ind på din ${product}-server. Tilknyttes til ${name}.", "borrowFromAnotherProfile": "Lån fra en anden profil", - "borrowFromAnotherProfileSubtitle": "Genbrug en anden profils forbindelse. PIN-beskyttede profiler kræver en PIN." + "borrowFromAnotherProfileSubtitle": "Genbrug en anden profils forbindelse. PIN-beskyttede profiler kræver en PIN.", + "invalidCredentials": "Ugyldigt brugernavn eller ugyldig adgangskode", + "authResponseNotJson": "Godkendelsessvaret var ikke gyldig JSON", + "quickConnectRejected": "Quick Connect blev afvist af serveren", + "quickConnectNotJson": "Quick Connect-svaret var ikke gyldig JSON", + "quickConnectMissingFields": "Quick Connect-svaret mangler en kode eller hemmelighed", + "quickConnectPollRejected": "Quick Connect-polling blev afvist af serveren", + "serverTimedOut": "Serveren svarede ikke i tide", + "responseNotJson": "Serversvaret var ikke gyldig JSON", + "responseMissingIdentity": "Svaret mangler et ID eller servernavn – er dette en ${product}-server?", + "probeFailed": "Kunne ikke nå serveren: ${error}", + "enterAtLeastOneUrl": "Indtast mindst én URL til en ${product}-server", + "noReachableServer": "Der blev ikke fundet nogen ${product}-server, som kunne nås", + "urlsPointToDifferentServers": "Disse URL'er peger på forskellige ${product}-servere", + "urlDoesNotMatchServer": "Denne URL stemmer ikke overens med ${product}-serveren", + "redirectUnsupported": "Serveren videresendte til en URL, der ikke understøttes", + "redirectDifferentHost": "Serveren videresendte til en anden vært. Indtast den endelige ${product}-URL direkte.", + "redirectInsecure": "Serveren videresendte fra HTTPS til en usikker URL", + "redirectUnsupportedEnterFinal": "Serveren videresendte til en URL, der ikke understøttes. Indtast den endelige ${product}-URL direkte." } } diff --git a/lib/i18n/de.i18n.json b/lib/i18n/de.i18n.json index 515bfc54..b813d007 100644 --- a/lib/i18n/de.i18n.json +++ b/lib/i18n/de.i18n.json @@ -17,7 +17,8 @@ "quickConnectWaiting": "Warte auf Bestätigung…", "quickConnectCancel": "Abbrechen", "quickConnectExpired": "Quick Connect ist abgelaufen. Versuche es erneut.", - "localDataRecoveryRequired": "Plezy konnte lokale Anmeldedaten und ausstehende Wiedergabedaten nicht sicher wiederherstellen. Bitte melde dich erneut an." + "localDataRecoveryRequired": "Plezy konnte lokale Anmeldedaten und ausstehende Wiedergabedaten nicht sicher wiederherstellen. Bitte melde dich erneut an.", + "pinCheckRejected": "Die Plex-PIN-Prüfung wurde abgelehnt" }, "common": { "cancel": "Abbrechen", @@ -77,7 +78,10 @@ "trakt": "Trakt", "rottenTomatoesCritic": "Rotten-Tomatoes-Kritiker", "rottenTomatoesAudience": "Rotten-Tomatoes-Publikum" - } + }, + "notAvailable": "N. v.", + "url": "URL", + "letterKeys": "ABC" }, "screens": { "licenses": "Lizenzen", @@ -323,8 +327,8 @@ "showNavBarLabels": "Navigationsleisten-Beschriftungen anzeigen", "showNavBarLabelsDescription": "Textbeschriftungen unter den Symbolen der Navigationsleiste anzeigen", "startupSection": "Startbereich", - "showExploreTab": "", - "showExploreTabDescription": "", + "showExploreTab": "Tab „Entdecken“ anzeigen", + "showExploreTabDescription": "Zeigt den Tab „Entdecken“ mit Inhalten aus Plex Discover und verbundenen Trackern an", "liveTvDefaultFavorites": "Standardmäßig Favoritenkanäle", "liveTvDefaultFavoritesDescription": "Beim Öffnen von Live TV nur Favoritenkanäle anzeigen", "display": "Anzeige", @@ -335,7 +339,8 @@ "player": "Wiedergabe", "subtitlesAndConfig": "Untertitel und Konfiguration", "seekAndTiming": "Spulen & Timing", - "behavior": "Verhalten" + "behavior": "Verhalten", + "exportDialogTitle": "Plezy-Einstellungen exportieren" }, "search": { "hint": "Filme, Serien und Musik suchen …", @@ -491,7 +496,9 @@ "flagExternal": "Extern", "flagHearingImpaired": "Für Hörgeschädigte", "flagDub": "Dub", - "flagOriginal": "Original" + "flagOriginal": "Original", + "channelsMono": "Mono", + "dolbyVisionProfile": "Profil ${profile}" }, "mediaMenu": { "markAsWatched": "Als gesehen markieren", @@ -568,7 +575,12 @@ "alphabetNavigation": "Alphabetische Navigation", "alphabetScrollHint": "Nach oben oder unten wischen, um einen Buchstaben weiterzugehen", "rowColumnPosition": "Zeile ${row} von ${rowCount}, Spalte ${column} von ${columnCount}", - "rowPosition": "Zeile ${row} von ${rowCount}" + "rowPosition": "Zeile ${row} von ${rowCount}", + "autoScrollPlay": "Automatisches Scrollen starten", + "autoScrollPause": "Automatisches Scrollen pausieren", + "hueShort": "H", + "saturationShort": "S", + "valueShort": "V" }, "tooltips": { "shufflePlay": "Zufallswiedergabe", @@ -666,7 +678,16 @@ "subtitleDownloaded": "Untertitel heruntergeladen", "subtitleDownloadedNotApplied": "Der Untertitel wurde heruntergeladen, konnte aber nicht ausgewählt werden", "subtitleDownloadFailed": "Untertitel konnte nicht heruntergeladen werden", - "searchLanguages": "Sprachen suchen..." + "searchLanguages": "Sprachen suchen...", + "skipIntro": "Intro überspringen", + "skipCredits": "Abspann überspringen", + "nextEpisode": "Nächste Episode", + "subtitleTrack": "Spur ${n}", + "subtitleFile": "Untertitel ${name}", + "forcedTrack": "${label} (Erzwungen)", + "osdSubtitlesOff": "Untertitel: Aus", + "osdSubtitles": "Untertitel: ${track}", + "osdAudio": "Audio: ${track}" }, "userStatus": {}, "messages": { @@ -722,12 +743,18 @@ "serverLimitBody": "Serverfehler (HTTP 500). Vermutlich hat ein Bandbreiten- oder Transkodierungslimit diese Sitzung abgelehnt. Bitte den Besitzer, das Limit anzupassen.", "mediaUnreadableTitle": "Datei nicht verfügbar", "mediaUnreadableBody": "Der Server hat dieses Element gefunden, konnte seine Datei aber nicht lesen (HTTP 404). Die Datei wurde wahrscheinlich verschoben oder gelöscht, oder ihr Speicher ist offline. Bitte den Serverbesitzer, die Datei zu prüfen und die Mediathek neu zu scannen.", - "serverBusyTitle": "", - "serverBusyBody": "", + "serverBusyTitle": "Stream nicht verfügbar", + "serverBusyBody": "Der Server hat das Streamen dieser Datei wiederholt abgelehnt (HTTP 503). Möglicherweise wird er neu gestartet, ist ausgelastet oder der Speicherort der Datei ist offline. Versuche es gleich noch einmal. Falls das Problem weiterhin auftritt, bitte den Serverbetreiber, den Server und den Speicherort der Datei zu überprüfen.", "logsUploaded": "Protokolle hochgeladen", "logsUploadFailed": "Protokolle konnten nicht hochgeladen werden", "logId": "Protokoll-ID", - "burnedSubtitlesUseMenu": "" + "burnedSubtitlesUseMenu": "Die Untertitel sind in diesen Stream eingebrannt. Ändere sie über das Untertitelmenü.", + "noVideoUrl": "Keine Video-URL verfügbar", + "playbackNoMediaSources": "Der Server hat keine abspielbaren Medienquellen zurückgegeben", + "playbackDataNotPrepared": "Die Wiedergabe wurde gestartet, bevor die Daten bereit waren", + "streamSelectionUnavailable": "Die Streamauswahl ist für diese Quelle nicht verfügbar", + "streamSelectionFailed": "Die ausgewählten Streams konnten nicht angewendet werden", + "serverUnavailableForProfile": "Für das aktive Profil ist kein Server verfügbar" }, "subtitlingStyling": { "text": "Text", @@ -746,8 +773,8 @@ "overrideStrip": "Formatierung entfernen", "positionTop": "Oben", "positionBottom": "Unten", - "anchorToScreen": "", - "anchorToScreenDescription": "", + "anchorToScreen": "Am Bildschirm verankern", + "anchorToScreenDescription": "Textuntertitel in den schwarzen Balken unter Breitbildvideos anzeigen", "bold": "Fett", "italic": "Kursiv", "renderResolution": "Render-Auflösung", @@ -835,7 +862,8 @@ "pinProtectionOptional": "PIN-Schutz (optional)", "pinExplain": "4-stellige PIN zum Profilwechsel erforderlich.", "continueButton": "Weiter", - "pinsDontMatch": "PINs stimmen nicht überein" + "pinsDontMatch": "PINs stimmen nicht überein", + "tokenIdentityMismatch": "Das Plex-Profil-Token wurde einem unerwarteten Server zugeordnet" }, "connections": { "sectionTitle": "Verbindungen", @@ -872,7 +900,11 @@ "movie": "Film", "tvShow": "Serie", "minutesLeft": "Noch ${minutes} Min.", - "moreLikeThis": "Ähnliche Inhalte" + "moreLikeThis": "Ähnliche Inhalte", + "titleCount": { + "one": "${n} Titel", + "other": "${n} Titel" + } }, "errors": { "searchFailed": "Suche fehlgeschlagen: ${error}", @@ -1080,10 +1112,10 @@ "characters": "Charaktere", "addToWatchlist": "Zur Merkliste hinzufügen", "removeFromWatchlist": "Von Merkliste entfernen", - "addedToWatchlist": "", - "removedFromWatchlist": "", + "addedToWatchlist": "Zur Watchlist hinzugefügt", + "removedFromWatchlist": "Von der Watchlist entfernt", "watchlistUpdateFailed": "Merkliste konnte nicht aktualisiert werden", - "watchlistNoMatch": "", + "watchlistNoMatch": "Dieser Eintrag konnte keiner Watchlist zugeordnet werden", "notInLibrary": "Nicht in deiner Mediathek", "inTheseLibraries": "In diesen Mediatheken", "checkingLibrary": "Deine Mediathek wird überprüft …", @@ -1253,9 +1285,9 @@ "watchChannel": "Kanal ansehen", "favorites": "Favoriten", "reorderFavorites": "Favoriten sortieren", - "noFavoriteChannels": "", - "noFavoriteChannelsHint": "", - "showAllChannels": "", + "noFavoriteChannels": "Keine Lieblingssender", + "noFavoriteChannelsHint": "Zeige alle Sender an und halte dann einen Sender gedrückt, um ihn zu deinen Favoriten hinzuzufügen.", + "showAllChannels": "Alle Sender anzeigen", "favoritesLoadFailed": "Favoriten konnten nicht geladen werden. Überprüfe deine Verbindung und versuche es erneut.", "favoritesUpdateFailed": "Favoriten konnten nicht aktualisiert werden. Prüfe deine Verbindung und versuche es erneut.", "joinSession": "Aktueller Sitzung beitreten", @@ -1294,7 +1326,12 @@ "recordingRuleUpdated": "Aufnahmeregel aktualisiert", "guideReloadRequested": "Aktualisierung des TV-Programms angefordert", "rulesProcessRequested": "Regelauswertung angefordert", - "recordShow": "Sendung aufnehmen" + "recordShow": "Sendung aufnehmen", + "startingInMinutes": "Beginnt in ${minutes} Min.", + "dayAtTime": "${day} um ${time}", + "invalidPlaybackData": "${product} hat ungültige Live-TV-Wiedergabedaten zurückgegeben", + "failedToStartChannel": "Der Live-Sender konnte nicht gestartet werden", + "failedToBuildStreamUrl": "Die Stream-URL konnte nicht erstellt werden" }, "collections": { "title": "Sammlungen", @@ -1371,7 +1408,9 @@ "nextTrack": "Nächster Titel", "repeat": "Wiederholen", "repeatAll": "Alle wiederholen", - "repeatOne": "Titel wiederholen" + "repeatOne": "Titel wiederholen", + "instantMixNoServer": "Für einen Instant Mix ist kein Server verfügbar", + "noAudioUrl": "Für ${track} ist keine Audio-URL verfügbar" }, "watchTogether": { "title": "Gemeinsam Schauen", @@ -1438,7 +1477,8 @@ "renameRoom": "Raum umbenennen", "removeRoom": "Entfernen", "guestSwitchUnavailable": "Wechsel fehlgeschlagen — Server nicht für Synchronisierung verfügbar", - "guestSwitchFailed": "Wechsel fehlgeschlagen — Inhalt auf diesem Server nicht gefunden" + "guestSwitchFailed": "Wechsel fehlgeschlagen — Inhalt auf diesem Server nicht gefunden", + "defaultDisplayName": "Benutzer" }, "downloads": { "title": "Downloads", @@ -1542,7 +1582,17 @@ "statusUnknown": "Noch nicht geprüft", "settingsUnavailable": "Die Systemeinstellungen konnten auf diesem Gerät nicht geöffnet werden", "linkUnavailable": "dontkillmyapp.com konnte auf diesem Gerät nicht geöffnet werden" - } + }, + "unknownShow": "Unbekannte Serie", + "unknownSeason": "Unbekannte Staffel", + "unknownAlbum": "Unbekanntes Album", + "completedOfTotal": "${completed}/${total} abgeschlossen", + "errorFileNotFound": "Datei nicht gefunden (404)", + "errorDownloadFailed": "Download fehlgeschlagen", + "errorPostProcessing": "Nachbearbeitung fehlgeschlagen: ${error}", + "notificationDownloading": "Wird heruntergeladen …", + "notificationComplete": "Download abgeschlossen", + "notificationPaused": "Download pausiert" }, "shaders": { "title": "Shader", @@ -1633,7 +1683,8 @@ "failedToConnectAnyAddress": "Keine Verbindung zu einer Adresse möglich", "connectionLostAfterAttempts": "Verbindung nach ${attempts} Versuchen verloren", "connectionLost": "Verbindung verloren" - } + }, + "closedBeforeAuth": "Die Verbindung wurde vor der Authentifizierung geschlossen" }, "videoSettings": { "playbackSpeed": "Wiedergabegeschwindigkeit", @@ -1644,13 +1695,13 @@ "audioSync": "Audio-Synchronisation", "subtitleSync": "Untertitel-Synchronisation", "hdr": "HDR", - "hdrUnsupported": "", - "hdrToneMapping": "", - "hdrToneMappingCompositor": "", - "hdrToneMappingCompositorDescription": "", - "hdrToneMappingPlayer": "", - "hdrToneMappingPlayerDescription": "", - "hdrToneMappingFailed": "", + "hdrUnsupported": "HDR ist hier nicht verfügbar – dieser Desktop-Compositor oder Videoausgang kann es nicht übertragen.", + "hdrToneMapping": "HDR-Tone-Mapping", + "hdrToneMappingCompositor": "Compositor", + "hdrToneMappingCompositorDescription": "Die HDR-Metadaten der Quelle durchreichen und vom Desktop-Compositor anpassen lassen.", + "hdrToneMappingPlayer": "Player", + "hdrToneMappingPlayerDescription": "Im Player an die maximale Helligkeit des Displays anpassen und das Ergebnis anschließend an den Compositor melden.", + "hdrToneMappingFailed": "Das HDR-Tone-Mapping konnte nicht geändert werden – der vorherige Modus ist weiterhin aktiv.", "audioOutput": "Audioausgabe", "performanceOverlay": "Leistungsanzeige", "audioOutputDolbyAtmos": "Dolby Atmos", @@ -1696,7 +1747,17 @@ "speed": "Geschwindigkeit", "player": "Player", "memory": "Speicher", - "uiFps": "UI-FPS" + "uiFps": "UI-FPS", + "fps": "FPS", + "decoderAndroidHw": "Android HW", + "decoderNvidiaHw": "NVIDIA HW", + "decoderQualcommHw": "Qualcomm HW", + "decoderMediatekHw": "MediaTek HW", + "decoderExynosHw": "Exynos HW", + "decoderSoftware": "Software", + "decoderHardware": "Hardware", + "tunnelingActive": "Aktiv", + "dvRpuFailed": "${converted} (${failures} fehlgeschlagen)" }, "externalPlayer": { "title": "Externer Player", @@ -1854,7 +1915,17 @@ "statusAvailable": "Verfügbar", "statusPartiallyAvailable": "Teilweise verfügbar", "statusRequested": "Angefragt", - "statusProcessing": "Wird verarbeitet" + "statusProcessing": "Wird verarbeitet", + "couldNotReach": "${url} nicht erreichbar: ${error}", + "noInstanceAtUrl": "Keine Seerr-Instanz unter ${url} (HTTP ${status})", + "notInitialized": "Die Ersteinrichtung dieser Seerr-Instanz wurde noch nicht abgeschlossen", + "noPlexTokenForReauth": "Für die erneute Anmeldung ist kein Plex-Token verfügbar", + "noStoredCredentials": "Für die erneute Anmeldung sind keine gespeicherten Anmeldedaten verfügbar", + "signInRejected": "Die Anmeldung wurde abgelehnt", + "noSessionCookie": "Seerr hat kein Sitzungscookie ausgestellt", + "freshCookieRejected": "Seerr hat das neue Sitzungscookie abgelehnt", + "noUserInformation": "Seerr hat keine Benutzerinformationen zurückgegeben", + "sessionRejectedAfterReauth": "Die Sitzung wurde nach der erneuten Anmeldung abgelehnt" }, "services": { "title": "Dienste", @@ -1875,7 +1946,7 @@ }, "deviceCode": { "title": "Plezy auf ${service} aktivieren", - "instructions": "", + "instructions": "Scanne den QR-Code oder rufe die unten angegebene Adresse auf und gib diesen Code ein:", "openToActivate": "${service} zum Aktivieren öffnen", "copyCode": "Aktivierungscode kopieren", "waitingForAuthorization": "Warte auf Autorisierung…", @@ -1933,6 +2004,24 @@ "connectToMediaBrowserCardSubtitle": "Gib Server-URL, Benutzername und Passwort ein.", "connectToMediaBrowserCardSubtitleScoped": "Melde dich bei deinem ${product}-Server an. Wird mit ${name} verknüpft.", "borrowFromAnotherProfile": "Von einem anderen Profil ausleihen", - "borrowFromAnotherProfileSubtitle": "Verbindung eines anderen Profils wiederverwenden. PIN-geschützte Profile erfordern eine PIN." + "borrowFromAnotherProfileSubtitle": "Verbindung eines anderen Profils wiederverwenden. PIN-geschützte Profile erfordern eine PIN.", + "invalidCredentials": "Ungültiger Benutzername oder ungültiges Passwort", + "authResponseNotJson": "Die Authentifizierungsantwort war kein gültiges JSON", + "quickConnectRejected": "Quick Connect wurde vom Server abgelehnt", + "quickConnectNotJson": "Die Quick Connect-Antwort war kein gültiges JSON", + "quickConnectMissingFields": "In der Quick Connect-Antwort fehlt ein Code oder Geheimnis", + "quickConnectPollRejected": "Die Quick Connect-Abfrage wurde vom Server abgelehnt", + "serverTimedOut": "Der Server hat nicht rechtzeitig geantwortet", + "responseNotJson": "Die Serverantwort war kein gültiges JSON", + "responseMissingIdentity": "In der Antwort fehlt eine ID oder ein Servername – ist dies ein ${product}-Server?", + "probeFailed": "Server nicht erreichbar: ${error}", + "enterAtLeastOneUrl": "Gib mindestens eine URL eines ${product}-Servers ein", + "noReachableServer": "Es wurde kein erreichbarer ${product}-Server gefunden", + "urlsPointToDifferentServers": "Diese URLs verweisen auf verschiedene ${product}-Server", + "urlDoesNotMatchServer": "Diese URL gehört nicht zum ${product}-Server", + "redirectUnsupported": "Der Server hat zu einer nicht unterstützten URL weitergeleitet", + "redirectDifferentHost": "Der Server hat zu einem anderen Host weitergeleitet. Gib die endgültige ${product}-URL direkt ein.", + "redirectInsecure": "Der Server hat von HTTPS zu einer unsicheren URL weitergeleitet", + "redirectUnsupportedEnterFinal": "Der Server hat zu einer nicht unterstützten URL weitergeleitet. Gib die endgültige ${product}-URL direkt ein." } } diff --git a/lib/i18n/en.i18n.json b/lib/i18n/en.i18n.json index ff2db241..8ccc6e13 100644 --- a/lib/i18n/en.i18n.json +++ b/lib/i18n/en.i18n.json @@ -17,7 +17,8 @@ "quickConnectWaiting": "Waiting for approval…", "quickConnectCancel": "Cancel", "quickConnectExpired": "Quick Connect expired. Try again.", - "localDataRecoveryRequired": "Plezy could not safely recover local sign-in and pending playback data. Please sign in again." + "localDataRecoveryRequired": "Plezy could not safely recover local sign-in and pending playback data. Please sign in again.", + "pinCheckRejected": "The Plex PIN check was rejected" }, "common": { "cancel": "Cancel", @@ -77,7 +78,10 @@ "trakt": "Trakt", "rottenTomatoesCritic": "Rotten Tomatoes critics", "rottenTomatoesAudience": "Rotten Tomatoes audience" - } + }, + "notAvailable": "N/A", + "url": "URL", + "letterKeys": "ABC" }, "screens": { "licenses": "Licenses", @@ -335,7 +339,8 @@ "player": "Player", "subtitlesAndConfig": "Subtitles & Configuration", "seekAndTiming": "Seek & Timing", - "behavior": "Behavior" + "behavior": "Behavior", + "exportDialogTitle": "Export Plezy settings" }, "search": { "hint": "Search movies, shows, music...", @@ -491,7 +496,9 @@ "flagExternal": "External", "flagHearingImpaired": "Hearing impaired", "flagDub": "Dub", - "flagOriginal": "Original" + "flagOriginal": "Original", + "channelsMono": "Mono", + "dolbyVisionProfile": "Profile ${profile}" }, "mediaMenu": { "markAsWatched": "Mark as Watched", @@ -568,7 +575,12 @@ "alphabetNavigation": "Alphabet navigation", "alphabetScrollHint": "Swipe up or down to move by letter", "rowColumnPosition": "Row ${row} of ${rowCount}, column ${column} of ${columnCount}", - "rowPosition": "Row ${row} of ${rowCount}" + "rowPosition": "Row ${row} of ${rowCount}", + "autoScrollPlay": "Play auto-scroll", + "autoScrollPause": "Pause auto-scroll", + "hueShort": "H", + "saturationShort": "S", + "valueShort": "V" }, "tooltips": { "shufflePlay": "Shuffle play", @@ -666,7 +678,16 @@ "subtitleDownloaded": "Subtitle downloaded", "subtitleDownloadedNotApplied": "Subtitle downloaded, but it could not be selected", "subtitleDownloadFailed": "Failed to download subtitle", - "searchLanguages": "Search languages..." + "searchLanguages": "Search languages...", + "skipIntro": "Skip Intro", + "skipCredits": "Skip Credits", + "nextEpisode": "Next Episode", + "subtitleTrack": "Track ${n}", + "subtitleFile": "Subtitle ${name}", + "forcedTrack": "${label} (Forced)", + "osdSubtitlesOff": "Subtitles: Off", + "osdSubtitles": "Subtitles: ${track}", + "osdAudio": "Audio: ${track}" }, "userStatus": {}, "messages": { @@ -727,7 +748,13 @@ "logsUploaded": "Logs uploaded", "logsUploadFailed": "Failed to upload logs", "logId": "Log ID", - "burnedSubtitlesUseMenu": "Subtitles are burned into this stream. Change them from the subtitle menu." + "burnedSubtitlesUseMenu": "Subtitles are burned into this stream. Change them from the subtitle menu.", + "noVideoUrl": "No video URL available", + "playbackNoMediaSources": "The server returned no playable media sources", + "playbackDataNotPrepared": "Playback was started before its data was ready", + "streamSelectionUnavailable": "Stream selection is not available for this source", + "streamSelectionFailed": "Could not apply the selected streams", + "serverUnavailableForProfile": "No server is available for the active profile" }, "subtitlingStyling": { "text": "Text", @@ -835,7 +862,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", + "tokenIdentityMismatch": "The Plex profile token resolved to an unexpected server" }, "connections": { "sectionTitle": "Connections", @@ -872,7 +900,11 @@ "movie": "Movie", "tvShow": "TV Show", "minutesLeft": "${minutes} min left", - "moreLikeThis": "More Like This" + "moreLikeThis": "More Like This", + "titleCount": { + "one": "${n} title", + "other": "${n} titles" + } }, "errors": { "searchFailed": "Search failed: ${error}", @@ -1294,7 +1326,12 @@ "recordingRuleUpdated": "Recording rule updated", "guideReloadRequested": "Guide refresh requested", "rulesProcessRequested": "Rule re-evaluation requested", - "recordShow": "Record show" + "recordShow": "Record show", + "startingInMinutes": "Starting in ${minutes} min", + "dayAtTime": "${day} at ${time}", + "invalidPlaybackData": "${product} returned invalid Live TV playback data", + "failedToStartChannel": "Could not start the live channel", + "failedToBuildStreamUrl": "Could not build the stream URL" }, "collections": { "title": "Collections", @@ -1371,7 +1408,9 @@ "nextTrack": "Next track", "repeat": "Repeat", "repeatAll": "Repeat all", - "repeatOne": "Repeat one" + "repeatOne": "Repeat one", + "instantMixNoServer": "No server is available for an instant mix", + "noAudioUrl": "No audio URL is available for ${track}" }, "watchTogether": { "title": "Watch Together", @@ -1438,7 +1477,8 @@ "renameRoom": "Rename Room", "removeRoom": "Remove", "guestSwitchUnavailable": "Couldn't switch — server unavailable for sync", - "guestSwitchFailed": "Couldn't switch — content not found on this server" + "guestSwitchFailed": "Couldn't switch — content not found on this server", + "defaultDisplayName": "User" }, "downloads": { "title": "Downloads", @@ -1542,7 +1582,17 @@ "statusUnknown": "Not checked yet", "settingsUnavailable": "Couldn't open system settings on this device", "linkUnavailable": "Couldn't open dontkillmyapp.com on this device" - } + }, + "unknownShow": "Unknown Show", + "unknownSeason": "Unknown Season", + "unknownAlbum": "Unknown Album", + "completedOfTotal": "${completed}/${total} completed", + "errorFileNotFound": "File not found (404)", + "errorDownloadFailed": "Download failed", + "errorPostProcessing": "Post-processing failed: ${error}", + "notificationDownloading": "Downloading...", + "notificationComplete": "Download complete", + "notificationPaused": "Download paused" }, "shaders": { "title": "Shaders", @@ -1633,7 +1683,8 @@ "failedToConnectAnyAddress": "Failed to connect to any address", "connectionLostAfterAttempts": "Connection lost after ${attempts} attempts", "connectionLost": "Connection lost" - } + }, + "closedBeforeAuth": "The connection closed before authentication" }, "videoSettings": { "playbackSpeed": "Playback Speed", @@ -1650,7 +1701,7 @@ "hdrToneMappingCompositorDescription": "Pass the source's HDR metadata through and let the desktop compositor map it.", "hdrToneMappingPlayer": "Player", "hdrToneMappingPlayerDescription": "Map to the display's peak brightness in the player, then tell the compositor the result.", - "hdrToneMappingFailed": "Couldn't change HDR tone mapping \u2014 the previous mode is still active.", + "hdrToneMappingFailed": "Couldn't change HDR tone mapping — the previous mode is still active.", "audioOutput": "Audio Output", "performanceOverlay": "Performance Overlay", "audioOutputDolbyAtmos": "Dolby Atmos", @@ -1696,7 +1747,17 @@ "speed": "Speed", "player": "Player", "memory": "Memory", - "uiFps": "UI FPS" + "uiFps": "UI FPS", + "fps": "FPS", + "decoderAndroidHw": "Android HW", + "decoderNvidiaHw": "NVIDIA HW", + "decoderQualcommHw": "Qualcomm HW", + "decoderMediatekHw": "MediaTek HW", + "decoderExynosHw": "Exynos HW", + "decoderSoftware": "Software", + "decoderHardware": "Hardware", + "tunnelingActive": "Active", + "dvRpuFailed": "${converted} (${failures} failed)" }, "externalPlayer": { "title": "External Player", @@ -1854,7 +1915,17 @@ "statusAvailable": "Available", "statusPartiallyAvailable": "Partially available", "statusRequested": "Requested", - "statusProcessing": "Processing" + "statusProcessing": "Processing", + "couldNotReach": "Could not reach ${url}: ${error}", + "noInstanceAtUrl": "No Seerr instance at ${url} (HTTP ${status})", + "notInitialized": "This Seerr instance has not completed first-run setup", + "noPlexTokenForReauth": "No Plex token is available to sign in again", + "noStoredCredentials": "No stored credentials are available to sign in again", + "signInRejected": "Sign-in was rejected", + "noSessionCookie": "Seerr did not issue a session cookie", + "freshCookieRejected": "Seerr rejected the new session cookie", + "noUserInformation": "Seerr did not return user information", + "sessionRejectedAfterReauth": "The session was rejected after signing in again" }, "services": { "title": "Services", @@ -1933,6 +2004,24 @@ "connectToMediaBrowserCardSubtitle": "Enter your server URL, username, and password.", "connectToMediaBrowserCardSubtitleScoped": "Sign in to your ${product} server. Binds to ${name}.", "borrowFromAnotherProfile": "Borrow from another profile", - "borrowFromAnotherProfileSubtitle": "Reuse another profile's connection. PIN-protected profiles require a PIN." + "borrowFromAnotherProfileSubtitle": "Reuse another profile's connection. PIN-protected profiles require a PIN.", + "invalidCredentials": "Invalid username or password", + "authResponseNotJson": "The authentication response was not valid JSON", + "quickConnectRejected": "Quick Connect was rejected by the server", + "quickConnectNotJson": "The Quick Connect response was not valid JSON", + "quickConnectMissingFields": "The Quick Connect response is missing a code or secret", + "quickConnectPollRejected": "Quick Connect polling was rejected by the server", + "serverTimedOut": "The server did not respond in time", + "responseNotJson": "The server response was not valid JSON", + "responseMissingIdentity": "The response is missing an ID or server name — is this a ${product} server?", + "probeFailed": "Could not reach the server: ${error}", + "enterAtLeastOneUrl": "Enter at least one ${product} server URL", + "noReachableServer": "No reachable ${product} server was found", + "urlsPointToDifferentServers": "These URLs point to different ${product} servers", + "urlDoesNotMatchServer": "This URL does not match the ${product} server", + "redirectUnsupported": "The server redirected to an unsupported URL", + "redirectDifferentHost": "The server redirected to a different host. Enter the final ${product} URL directly.", + "redirectInsecure": "The server redirected from HTTPS to an insecure URL", + "redirectUnsupportedEnterFinal": "The server redirected to an unsupported URL. Enter the final ${product} URL directly." } } diff --git a/lib/i18n/es.i18n.json b/lib/i18n/es.i18n.json index ab6b3ace..e668c06a 100644 --- a/lib/i18n/es.i18n.json +++ b/lib/i18n/es.i18n.json @@ -17,7 +17,8 @@ "quickConnectWaiting": "Esperando aprobación…", "quickConnectCancel": "Cancelar", "quickConnectExpired": "Quick Connect caducó. Inténtalo de nuevo.", - "localDataRecoveryRequired": "Plezy no pudo recuperar de forma segura los datos locales de inicio de sesión ni la reproducción pendiente. Vuelve a iniciar sesión." + "localDataRecoveryRequired": "Plezy no pudo recuperar de forma segura los datos locales de inicio de sesión ni la reproducción pendiente. Vuelve a iniciar sesión.", + "pinCheckRejected": "La comprobación del PIN de Plex fue rechazada" }, "common": { "cancel": "Cancelar", @@ -77,7 +78,10 @@ "trakt": "Trakt", "rottenTomatoesCritic": "Críticos de Rotten Tomatoes", "rottenTomatoesAudience": "Público de Rotten Tomatoes" - } + }, + "notAvailable": "N/D", + "url": "URL", + "letterKeys": "ABC" }, "screens": { "licenses": "Licencias", @@ -323,8 +327,8 @@ "showNavBarLabels": "Mostrar etiquetas de la barra de navegación", "showNavBarLabelsDescription": "Mostrar etiquetas de texto bajo los iconos de la barra de navegación", "startupSection": "Sección de inicio", - "showExploreTab": "", - "showExploreTabDescription": "", + "showExploreTab": "Mostrar pestaña Explorar", + "showExploreTabDescription": "Muestra la pestaña Explorar con contenido de Plex Discover y servicios de seguimiento conectados", "liveTvDefaultFavorites": "Canales favoritos por defecto", "liveTvDefaultFavoritesDescription": "Mostrar solo canales favoritos al abrir TV en vivo", "display": "Pantalla", @@ -335,7 +339,8 @@ "player": "Reproductor", "subtitlesAndConfig": "Subtítulos y configuración", "seekAndTiming": "Desplazamiento y tiempos", - "behavior": "Comportamiento" + "behavior": "Comportamiento", + "exportDialogTitle": "Exportar ajustes de Plezy" }, "search": { "hint": "Buscar películas, series, música...", @@ -491,7 +496,9 @@ "flagExternal": "Externa", "flagHearingImpaired": "Para personas con discapacidad auditiva", "flagDub": "Doblaje", - "flagOriginal": "Original" + "flagOriginal": "Original", + "channelsMono": "Mono", + "dolbyVisionProfile": "Perfil ${profile}" }, "mediaMenu": { "markAsWatched": "Marcar como visto", @@ -568,7 +575,12 @@ "alphabetNavigation": "Navegación alfabética", "alphabetScrollHint": "Desliza hacia arriba o abajo para avanzar por letra", "rowColumnPosition": "Fila ${row} de ${rowCount}, columna ${column} de ${columnCount}", - "rowPosition": "Fila ${row} de ${rowCount}" + "rowPosition": "Fila ${row} de ${rowCount}", + "autoScrollPlay": "Iniciar desplazamiento automático", + "autoScrollPause": "Pausar desplazamiento automático", + "hueShort": "H", + "saturationShort": "S", + "valueShort": "V" }, "tooltips": { "shufflePlay": "Reproducción aleatoria", @@ -666,7 +678,16 @@ "subtitleDownloaded": "Subtítulo descargado", "subtitleDownloadedNotApplied": "El subtítulo se descargó, pero no se pudo seleccionar", "subtitleDownloadFailed": "Error al descargar subtítulo", - "searchLanguages": "Buscar idiomas..." + "searchLanguages": "Buscar idiomas...", + "skipIntro": "Saltar intro", + "skipCredits": "Saltar créditos", + "nextEpisode": "Episodio siguiente", + "subtitleTrack": "Pista ${n}", + "subtitleFile": "Subtítulo ${name}", + "forcedTrack": "${label} (Forzada)", + "osdSubtitlesOff": "Subtítulos: desactivados", + "osdSubtitles": "Subtítulos: ${track}", + "osdAudio": "Audio: ${track}" }, "userStatus": {}, "messages": { @@ -722,12 +743,18 @@ "serverLimitBody": "Error del servidor (HTTP 500). Un límite de ancho de banda/transcodificación probablemente rechazó esta sesión. Pide al propietario que lo ajuste.", "mediaUnreadableTitle": "Archivo no disponible", "mediaUnreadableBody": "El servidor encontró este elemento pero no pudo leer su archivo (HTTP 404). Es probable que el archivo se haya movido o eliminado, o que su almacenamiento esté sin conexión. Pide al propietario del servidor que revise el archivo y vuelva a escanear la biblioteca.", - "serverBusyTitle": "", - "serverBusyBody": "", + "serverBusyTitle": "Reproducción no disponible", + "serverBusyBody": "El servidor siguió rechazando la reproducción de este archivo (HTTP 503). Puede que se esté reiniciando, esté ocupado o que el almacenamiento del archivo no esté disponible. Inténtalo de nuevo dentro de un momento; si sigue ocurriendo, pide al propietario del servidor que revise el servidor y el almacenamiento del archivo.", "logsUploaded": "Registros subidos", "logsUploadFailed": "Error al subir registros", "logId": "ID de registro", - "burnedSubtitlesUseMenu": "" + "burnedSubtitlesUseMenu": "Los subtítulos están incrustados en esta transmisión. Cámbialos desde el menú de subtítulos.", + "noVideoUrl": "No hay ninguna URL de vídeo disponible", + "playbackNoMediaSources": "El servidor no devolvió ninguna fuente multimedia reproducible", + "playbackDataNotPrepared": "La reproducción se inició antes de que sus datos estuvieran listos", + "streamSelectionUnavailable": "La selección de flujos no está disponible para esta fuente", + "streamSelectionFailed": "No se pudieron aplicar los flujos seleccionados", + "serverUnavailableForProfile": "No hay ningún servidor disponible para el perfil activo" }, "subtitlingStyling": { "text": "Texto", @@ -746,8 +773,8 @@ "overrideStrip": "Quitar estilos", "positionTop": "Arriba", "positionBottom": "Abajo", - "anchorToScreen": "", - "anchorToScreenDescription": "", + "anchorToScreen": "Anclar a la pantalla", + "anchorToScreenDescription": "Muestra los subtítulos de texto en las barras negras situadas debajo del vídeo panorámico", "bold": "Negrita", "italic": "Cursiva", "renderResolution": "Resolución de renderizado", @@ -835,7 +862,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", + "tokenIdentityMismatch": "El token del perfil de Plex correspondía a un servidor inesperado" }, "connections": { "sectionTitle": "Conexiones", @@ -872,7 +900,11 @@ "movie": "Película", "tvShow": "Serie de TV", "minutesLeft": "quedan ${minutes} min", - "moreLikeThis": "Más contenido similar" + "moreLikeThis": "Más contenido similar", + "titleCount": { + "one": "${n} título", + "other": "${n} títulos" + } }, "errors": { "searchFailed": "Error en la búsqueda: ${error}", @@ -1080,10 +1112,10 @@ "characters": "Personajes", "addToWatchlist": "Añadir a la lista de seguimiento", "removeFromWatchlist": "Quitar de la lista de seguimiento", - "addedToWatchlist": "", - "removedFromWatchlist": "", + "addedToWatchlist": "Añadido a la lista de seguimiento", + "removedFromWatchlist": "Eliminado de la lista de seguimiento", "watchlistUpdateFailed": "No se pudo actualizar la lista de seguimiento", - "watchlistNoMatch": "", + "watchlistNoMatch": "No se pudo asociar este elemento con una lista de seguimiento", "notInLibrary": "No está en tu biblioteca", "inTheseLibraries": "En estas bibliotecas", "checkingLibrary": "Comprobando tu biblioteca...", @@ -1253,9 +1285,9 @@ "watchChannel": "Ver canal", "favorites": "Favoritos", "reorderFavorites": "Reordenar favoritos", - "noFavoriteChannels": "", - "noFavoriteChannelsHint": "", - "showAllChannels": "", + "noFavoriteChannels": "No hay canales favoritos", + "noFavoriteChannelsHint": "Muestra todos los canales y mantén pulsado uno para añadirlo a tus favoritos.", + "showAllChannels": "Mostrar todos los canales", "favoritesLoadFailed": "No se pudieron cargar los favoritos. Comprueba tu conexión e inténtalo de nuevo.", "favoritesUpdateFailed": "No se pudieron actualizar los favoritos. Comprueba tu conexión e inténtalo de nuevo.", "joinSession": "Unirse a sesión en curso", @@ -1294,7 +1326,12 @@ "recordingRuleUpdated": "Regla de grabación actualizada", "guideReloadRequested": "Solicitada actualización de la guía", "rulesProcessRequested": "Solicitada reevaluación de reglas", - "recordShow": "Grabar programa" + "recordShow": "Grabar programa", + "startingInMinutes": "Empieza en ${minutes} min", + "dayAtTime": "${day} a las ${time}", + "invalidPlaybackData": "${product} devolvió datos de reproducción de TV en vivo no válidos", + "failedToStartChannel": "No se pudo iniciar el canal en vivo", + "failedToBuildStreamUrl": "No se pudo generar la URL de transmisión" }, "collections": { "title": "Colecciones", @@ -1371,7 +1408,9 @@ "nextTrack": "Canción siguiente", "repeat": "Repetir", "repeatAll": "Repetir todo", - "repeatOne": "Repetir una" + "repeatOne": "Repetir una", + "instantMixNoServer": "No hay ningún servidor disponible para una mezcla instantánea", + "noAudioUrl": "No hay ninguna URL de audio disponible para ${track}" }, "watchTogether": { "title": "Ver juntos", @@ -1438,7 +1477,8 @@ "renameRoom": "Renombrar sala", "removeRoom": "Eliminar", "guestSwitchUnavailable": "No se pudo cambiar — servidor no disponible para sincronización", - "guestSwitchFailed": "No se pudo cambiar — contenido no encontrado en este servidor" + "guestSwitchFailed": "No se pudo cambiar — contenido no encontrado en este servidor", + "defaultDisplayName": "Usuario" }, "downloads": { "title": "Descargas", @@ -1542,7 +1582,17 @@ "statusUnknown": "Aún no se ha comprobado", "settingsUnavailable": "No se pudo abrir la configuración del sistema en este dispositivo", "linkUnavailable": "No se pudo abrir dontkillmyapp.com en este dispositivo" - } + }, + "unknownShow": "Serie desconocida", + "unknownSeason": "Temporada desconocida", + "unknownAlbum": "Álbum desconocido", + "completedOfTotal": "${completed}/${total} completadas", + "errorFileNotFound": "Archivo no encontrado (404)", + "errorDownloadFailed": "Error en la descarga", + "errorPostProcessing": "Error en el posprocesamiento: ${error}", + "notificationDownloading": "Descargando...", + "notificationComplete": "Descarga completada", + "notificationPaused": "Descarga pausada" }, "shaders": { "title": "Shaders", @@ -1633,7 +1683,8 @@ "failedToConnectAnyAddress": "No se pudo conectar a ninguna dirección", "connectionLostAfterAttempts": "Conexión perdida tras ${attempts} intentos", "connectionLost": "Conexión perdida" - } + }, + "closedBeforeAuth": "La conexión se cerró antes de la autenticación" }, "videoSettings": { "playbackSpeed": "Velocidad de reproducción", @@ -1644,13 +1695,13 @@ "audioSync": "Sincronización de audio", "subtitleSync": "Sincronización de subtítulos", "hdr": "HDR", - "hdrUnsupported": "", - "hdrToneMapping": "", - "hdrToneMappingCompositor": "", - "hdrToneMappingCompositorDescription": "", - "hdrToneMappingPlayer": "", - "hdrToneMappingPlayerDescription": "", - "hdrToneMappingFailed": "", + "hdrUnsupported": "HDR no está disponible aquí: este compositor de escritorio o esta salida de vídeo no pueden transmitirlo.", + "hdrToneMapping": "Mapeo de tonos HDR", + "hdrToneMappingCompositor": "Compositor", + "hdrToneMappingCompositorDescription": "Transmite los metadatos HDR de la fuente y deja que el compositor de escritorio haga el mapeo.", + "hdrToneMappingPlayer": "Reproductor", + "hdrToneMappingPlayerDescription": "Realiza en el reproductor el mapeo al brillo máximo de la pantalla y luego comunica el resultado al compositor.", + "hdrToneMappingFailed": "No se pudo cambiar el mapeo de tonos HDR; el modo anterior sigue activo.", "audioOutput": "Salida de audio", "performanceOverlay": "Indicador de rendimiento", "audioOutputDolbyAtmos": "Dolby Atmos", @@ -1696,7 +1747,17 @@ "speed": "Velocidad", "player": "Reproductor", "memory": "Memoria", - "uiFps": "FPS UI" + "uiFps": "FPS UI", + "fps": "FPS", + "decoderAndroidHw": "HW de Android", + "decoderNvidiaHw": "HW de NVIDIA", + "decoderQualcommHw": "HW de Qualcomm", + "decoderMediatekHw": "HW de MediaTek", + "decoderExynosHw": "HW de Exynos", + "decoderSoftware": "Software", + "decoderHardware": "Hardware", + "tunnelingActive": "Activo", + "dvRpuFailed": "${converted} (${failures} con error)" }, "externalPlayer": { "title": "Reproductor externo", @@ -1854,7 +1915,17 @@ "statusAvailable": "Disponible", "statusPartiallyAvailable": "Parcialmente disponible", "statusRequested": "Solicitado", - "statusProcessing": "Procesando" + "statusProcessing": "Procesando", + "couldNotReach": "No se pudo conectar con ${url}: ${error}", + "noInstanceAtUrl": "No hay ninguna instancia de Seerr en ${url} (HTTP ${status})", + "notInitialized": "Esta instancia de Seerr no ha completado la configuración inicial", + "noPlexTokenForReauth": "No hay ningún token de Plex disponible para volver a iniciar sesión", + "noStoredCredentials": "No hay credenciales guardadas disponibles para volver a iniciar sesión", + "signInRejected": "Se rechazó el inicio de sesión", + "noSessionCookie": "Seerr no proporcionó una cookie de sesión", + "freshCookieRejected": "Seerr rechazó la nueva cookie de sesión", + "noUserInformation": "Seerr no devolvió información del usuario", + "sessionRejectedAfterReauth": "La sesión fue rechazada después de volver a iniciar sesión" }, "services": { "title": "Servicios", @@ -1875,7 +1946,7 @@ }, "deviceCode": { "title": "Activar Plezy en ${service}", - "instructions": "", + "instructions": "Escanea el código QR o visita la dirección que aparece a continuación e introduce este código:", "openToActivate": "Abrir ${service} para activar", "copyCode": "Copiar código de activación", "waitingForAuthorization": "Esperando autorización…", @@ -1933,6 +2004,24 @@ "connectToMediaBrowserCardSubtitle": "Introduce la URL de tu servidor, el nombre de usuario y la contraseña.", "connectToMediaBrowserCardSubtitleScoped": "Inicia sesión en tu servidor ${product}. Se vincula a ${name}.", "borrowFromAnotherProfile": "Tomar prestado de otro perfil", - "borrowFromAnotherProfileSubtitle": "Reutiliza la conexión de otro perfil. Los perfiles protegidos con PIN requieren un PIN." + "borrowFromAnotherProfileSubtitle": "Reutiliza la conexión de otro perfil. Los perfiles protegidos con PIN requieren un PIN.", + "invalidCredentials": "Usuario o contraseña no válidos", + "authResponseNotJson": "La respuesta de autenticación no era un JSON válido", + "quickConnectRejected": "Quick Connect fue rechazado por el servidor", + "quickConnectNotJson": "La respuesta de Quick Connect no era un JSON válido", + "quickConnectMissingFields": "La respuesta de Quick Connect no incluye el código o el secreto", + "quickConnectPollRejected": "El servidor rechazó el sondeo de Quick Connect", + "serverTimedOut": "El servidor no respondió a tiempo", + "responseNotJson": "La respuesta del servidor no era un JSON válido", + "responseMissingIdentity": "A la respuesta le falta un ID o el nombre del servidor. ¿Es este un servidor ${product}?", + "probeFailed": "No se pudo conectar con el servidor: ${error}", + "enterAtLeastOneUrl": "Introduce al menos una URL de servidor ${product}", + "noReachableServer": "No se encontró ningún servidor ${product} accesible", + "urlsPointToDifferentServers": "Estas URL apuntan a servidores ${product} distintos", + "urlDoesNotMatchServer": "Esta URL no corresponde al servidor ${product}", + "redirectUnsupported": "El servidor redirigió a una URL no compatible", + "redirectDifferentHost": "El servidor redirigió a un host diferente. Introduce directamente la URL final de ${product}.", + "redirectInsecure": "El servidor redirigió de HTTPS a una URL no segura", + "redirectUnsupportedEnterFinal": "El servidor redirigió a una URL no compatible. Introduce directamente la URL final de ${product}." } } diff --git a/lib/i18n/fr.i18n.json b/lib/i18n/fr.i18n.json index 137a8015..9931126d 100644 --- a/lib/i18n/fr.i18n.json +++ b/lib/i18n/fr.i18n.json @@ -17,7 +17,8 @@ "quickConnectWaiting": "En attente d'approbation…", "quickConnectCancel": "Annuler", "quickConnectExpired": "Quick Connect a expiré. Réessayez.", - "localDataRecoveryRequired": "Plezy n’a pas pu récupérer en toute sécurité les données locales de connexion et de lecture en attente. Veuillez vous reconnecter." + "localDataRecoveryRequired": "Plezy n’a pas pu récupérer en toute sécurité les données locales de connexion et de lecture en attente. Veuillez vous reconnecter.", + "pinCheckRejected": "La vérification du code PIN Plex a été refusée" }, "common": { "cancel": "Annuler", @@ -77,7 +78,10 @@ "trakt": "Trakt", "rottenTomatoesCritic": "Critiques Rotten Tomatoes", "rottenTomatoesAudience": "Public Rotten Tomatoes" - } + }, + "notAvailable": "N/A", + "url": "URL", + "letterKeys": "ABC" }, "screens": { "licenses": "Licences", @@ -323,8 +327,8 @@ "showNavBarLabels": "Afficher les libellés de la barre de navigation", "showNavBarLabelsDescription": "Afficher les libellés sous les icônes de la barre de navigation", "startupSection": "Section de démarrage", - "showExploreTab": "", - "showExploreTabDescription": "", + "showExploreTab": "Afficher l’onglet Explorer", + "showExploreTabDescription": "Afficher l’onglet Explorer avec le contenu de Plex Discover et des services de suivi connectés", "liveTvDefaultFavorites": "Chaînes favorites par défaut", "liveTvDefaultFavoritesDescription": "Afficher uniquement les chaînes favorites à l'ouverture de la TV en direct", "display": "Affichage", @@ -335,7 +339,8 @@ "player": "Lecteur", "subtitlesAndConfig": "Sous-titres et configuration", "seekAndTiming": "Déplacement et minutage", - "behavior": "Comportement" + "behavior": "Comportement", + "exportDialogTitle": "Exporter les paramètres de Plezy" }, "search": { "hint": "Rechercher des films, des séries, de la musique...", @@ -491,7 +496,9 @@ "flagExternal": "Externe", "flagHearingImpaired": "Sourds et malentendants", "flagDub": "Doublage", - "flagOriginal": "Originale" + "flagOriginal": "Originale", + "channelsMono": "Mono", + "dolbyVisionProfile": "Profil ${profile}" }, "mediaMenu": { "markAsWatched": "Marquer comme vu", @@ -568,7 +575,12 @@ "alphabetNavigation": "Navigation alphabétique", "alphabetScrollHint": "Balayez vers le haut ou le bas pour changer de lettre", "rowColumnPosition": "Ligne ${row} sur ${rowCount}, colonne ${column} sur ${columnCount}", - "rowPosition": "Ligne ${row} sur ${rowCount}" + "rowPosition": "Ligne ${row} sur ${rowCount}", + "autoScrollPlay": "Lancer le défilement automatique", + "autoScrollPause": "Suspendre le défilement automatique", + "hueShort": "T", + "saturationShort": "S", + "valueShort": "V" }, "tooltips": { "shufflePlay": "Lecture aléatoire", @@ -666,7 +678,16 @@ "subtitleDownloaded": "Sous-titre téléchargé", "subtitleDownloadedNotApplied": "Le sous-titre a été téléchargé, mais n’a pas pu être sélectionné", "subtitleDownloadFailed": "Échec du téléchargement du sous-titre", - "searchLanguages": "Rechercher des langues..." + "searchLanguages": "Rechercher des langues...", + "skipIntro": "Passer l’intro", + "skipCredits": "Passer le générique", + "nextEpisode": "Épisode suivant", + "subtitleTrack": "Piste ${n}", + "subtitleFile": "Sous-titre ${name}", + "forcedTrack": "${label} (forcé)", + "osdSubtitlesOff": "Sous-titres : désactivés", + "osdSubtitles": "Sous-titres : ${track}", + "osdAudio": "Audio : ${track}" }, "userStatus": {}, "messages": { @@ -722,12 +743,18 @@ "serverLimitBody": "Erreur serveur (HTTP 500). Une limite de bande passante/transcodage a probablement rejeté cette session. Demandez au propriétaire de l'ajuster.", "mediaUnreadableTitle": "Fichier indisponible", "mediaUnreadableBody": "Le serveur a trouvé cet élément mais n'a pas pu lire son fichier (HTTP 404). Le fichier a probablement été déplacé, supprimé, ou son stockage est hors ligne. Demandez au propriétaire du serveur de vérifier le fichier et de relancer l'analyse de la bibliothèque.", - "serverBusyTitle": "", - "serverBusyBody": "", + "serverBusyTitle": "Flux indisponible", + "serverBusyBody": "Le serveur a refusé à plusieurs reprises de diffuser ce fichier (HTTP 503). Il est peut-être en cours de redémarrage ou occupé, ou le stockage du fichier est peut-être hors ligne. Réessayez dans un instant. Si le problème persiste, demandez au propriétaire du serveur de vérifier le serveur et le stockage du fichier.", "logsUploaded": "Journaux envoyés", "logsUploadFailed": "Échec de l’envoi des journaux", "logId": "Identifiant du journal", - "burnedSubtitlesUseMenu": "" + "burnedSubtitlesUseMenu": "Les sous-titres sont incrustés à l’image de ce flux. Modifiez-les depuis le menu des sous-titres.", + "noVideoUrl": "Aucune URL vidéo disponible", + "playbackNoMediaSources": "Le serveur n’a renvoyé aucune source multimédia lisible", + "playbackDataNotPrepared": "La lecture a été lancée avant que les données nécessaires soient prêtes", + "streamSelectionUnavailable": "La sélection des flux n’est pas disponible pour cette source", + "streamSelectionFailed": "Impossible d’appliquer les flux sélectionnés", + "serverUnavailableForProfile": "Aucun serveur n’est disponible pour le profil actif" }, "subtitlingStyling": { "text": "Texte", @@ -746,8 +773,8 @@ "overrideStrip": "Supprimer le style", "positionTop": "Haut", "positionBottom": "Bas", - "anchorToScreen": "", - "anchorToScreenDescription": "", + "anchorToScreen": "Ancrer à l’écran", + "anchorToScreenDescription": "Afficher les sous-titres textuels dans les bandes noires sous les vidéos en écran large", "bold": "Gras", "italic": "Italique", "renderResolution": "Résolution de rendu", @@ -835,7 +862,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", + "tokenIdentityMismatch": "Le jeton du profil Plex correspond à un serveur inattendu" }, "connections": { "sectionTitle": "Connexions", @@ -872,7 +900,11 @@ "movie": "Film", "tvShow": "Série TV", "minutesLeft": "${minutes} min restantes", - "moreLikeThis": "Plus de contenus similaires" + "moreLikeThis": "Plus de contenus similaires", + "titleCount": { + "one": "${n} titre", + "other": "${n} titres" + } }, "errors": { "searchFailed": "Échec de la recherche : ${error}", @@ -1080,10 +1112,10 @@ "characters": "Personnages", "addToWatchlist": "Ajouter à la liste de suivi", "removeFromWatchlist": "Retirer de la liste de suivi", - "addedToWatchlist": "", - "removedFromWatchlist": "", + "addedToWatchlist": "Ajouté à la liste de suivi", + "removedFromWatchlist": "Retiré de la liste de suivi", "watchlistUpdateFailed": "Impossible de mettre à jour la liste de suivi", - "watchlistNoMatch": "", + "watchlistNoMatch": "Impossible d’associer cet élément à une liste de suivi", "notInLibrary": "Absent de votre bibliothèque", "inTheseLibraries": "Dans ces bibliothèques", "checkingLibrary": "Vérification de votre bibliothèque...", @@ -1253,9 +1285,9 @@ "watchChannel": "Regarder la chaîne", "favorites": "Favoris", "reorderFavorites": "Réorganiser les favoris", - "noFavoriteChannels": "", - "noFavoriteChannelsHint": "", - "showAllChannels": "", + "noFavoriteChannels": "Aucune chaîne favorite", + "noFavoriteChannelsHint": "Affichez toutes les chaînes, puis appuyez longuement sur une chaîne pour l’ajouter à vos favoris.", + "showAllChannels": "Afficher toutes les chaînes", "favoritesLoadFailed": "Impossible de charger les favoris. Vérifiez votre connexion et réessayez.", "favoritesUpdateFailed": "Impossible de mettre à jour les favoris. Vérifiez votre connexion et réessayez.", "joinSession": "Rejoindre la session en cours", @@ -1294,7 +1326,12 @@ "recordingRuleUpdated": "Règle d'enregistrement mise à jour", "guideReloadRequested": "Mise à jour du guide demandée", "rulesProcessRequested": "Réévaluation des règles demandée", - "recordShow": "Enregistrer l'émission" + "recordShow": "Enregistrer l'émission", + "startingInMinutes": "Commence dans ${minutes} min", + "dayAtTime": "${day} à ${time}", + "invalidPlaybackData": "${product} a renvoyé des données de lecture de TV en direct non valides", + "failedToStartChannel": "Impossible de lancer la chaîne en direct", + "failedToBuildStreamUrl": "Impossible de générer l’URL du flux" }, "collections": { "title": "Collections", @@ -1371,7 +1408,9 @@ "nextTrack": "Titre suivant", "repeat": "Répéter", "repeatAll": "Tout répéter", - "repeatOne": "Répéter le titre" + "repeatOne": "Répéter le titre", + "instantMixNoServer": "Aucun serveur n’est disponible pour créer un mix instantané", + "noAudioUrl": "Aucune URL audio n’est disponible pour ${track}" }, "watchTogether": { "title": "Regarder ensemble", @@ -1438,7 +1477,8 @@ "renameRoom": "Renommer le salon", "removeRoom": "Supprimer", "guestSwitchUnavailable": "Impossible de changer — serveur indisponible pour la synchronisation", - "guestSwitchFailed": "Impossible de changer — contenu introuvable sur ce serveur" + "guestSwitchFailed": "Impossible de changer — contenu introuvable sur ce serveur", + "defaultDisplayName": "Utilisateur" }, "downloads": { "title": "Téléchargements", @@ -1542,7 +1582,17 @@ "statusUnknown": "Pas encore vérifié", "settingsUnavailable": "Impossible d’ouvrir les paramètres système sur cet appareil", "linkUnavailable": "Impossible d’ouvrir dontkillmyapp.com sur cet appareil" - } + }, + "unknownShow": "Série inconnue", + "unknownSeason": "Saison inconnue", + "unknownAlbum": "Album inconnu", + "completedOfTotal": "${completed}/${total} terminés", + "errorFileNotFound": "Fichier introuvable (404)", + "errorDownloadFailed": "Échec du téléchargement", + "errorPostProcessing": "Échec du post-traitement : ${error}", + "notificationDownloading": "Téléchargement...", + "notificationComplete": "Téléchargement terminé", + "notificationPaused": "Téléchargement en pause" }, "shaders": { "title": "Shaders", @@ -1633,7 +1683,8 @@ "failedToConnectAnyAddress": "Impossible de se connecter à une adresse", "connectionLostAfterAttempts": "Connexion perdue après ${attempts} tentatives", "connectionLost": "Connexion perdue" - } + }, + "closedBeforeAuth": "La connexion a été fermée avant l’authentification" }, "videoSettings": { "playbackSpeed": "Vitesse de lecture", @@ -1644,13 +1695,13 @@ "audioSync": "Synchronisation audio", "subtitleSync": "Synchronisation des sous-titres", "hdr": "HDR", - "hdrUnsupported": "", - "hdrToneMapping": "", - "hdrToneMappingCompositor": "", - "hdrToneMappingCompositorDescription": "", - "hdrToneMappingPlayer": "", - "hdrToneMappingPlayerDescription": "", - "hdrToneMappingFailed": "", + "hdrUnsupported": "Le HDR n’est pas disponible ici : ce compositeur de bureau ou cette sortie vidéo ne permet pas de le transmettre.", + "hdrToneMapping": "Mappage tonal HDR", + "hdrToneMappingCompositor": "Compositeur", + "hdrToneMappingCompositorDescription": "Transmettre les métadonnées HDR de la source et laisser le compositeur de bureau effectuer le mappage.", + "hdrToneMappingPlayer": "Lecteur", + "hdrToneMappingPlayerDescription": "Effectuer dans le lecteur le mappage selon la luminosité maximale de l’écran, puis indiquer le résultat au compositeur.", + "hdrToneMappingFailed": "Impossible de modifier le mappage tonal HDR : le mode précédent reste actif.", "audioOutput": "Sortie audio", "performanceOverlay": "Données de performance", "audioOutputDolbyAtmos": "Dolby Atmos", @@ -1696,7 +1747,17 @@ "speed": "Vitesse", "player": "Lecteur", "memory": "Mémoire", - "uiFps": "FPS UI" + "uiFps": "FPS UI", + "fps": "FPS", + "decoderAndroidHw": "Matériel Android", + "decoderNvidiaHw": "Matériel NVIDIA", + "decoderQualcommHw": "Matériel Qualcomm", + "decoderMediatekHw": "Matériel MediaTek", + "decoderExynosHw": "Matériel Exynos", + "decoderSoftware": "Logiciel", + "decoderHardware": "Matériel", + "tunnelingActive": "Actif", + "dvRpuFailed": "${converted} (${failures} échecs)" }, "externalPlayer": { "title": "Lecteur externe", @@ -1854,7 +1915,17 @@ "statusAvailable": "Disponible", "statusPartiallyAvailable": "Partiellement disponible", "statusRequested": "Demandé", - "statusProcessing": "En cours de traitement" + "statusProcessing": "En cours de traitement", + "couldNotReach": "Impossible de joindre ${url} : ${error}", + "noInstanceAtUrl": "Aucune instance Seerr à l’adresse ${url} (HTTP ${status})", + "notInitialized": "La configuration initiale de cette instance Seerr n’est pas terminée", + "noPlexTokenForReauth": "Aucun jeton Plex n’est disponible pour se reconnecter", + "noStoredCredentials": "Aucun identifiant enregistré n’est disponible pour se reconnecter", + "signInRejected": "La connexion a été refusée", + "noSessionCookie": "Seerr n’a pas fourni de cookie de session", + "freshCookieRejected": "Seerr a refusé le nouveau cookie de session", + "noUserInformation": "Seerr n’a renvoyé aucune information sur l’utilisateur", + "sessionRejectedAfterReauth": "La session a été refusée après la reconnexion" }, "services": { "title": "Services", @@ -1875,7 +1946,7 @@ }, "deviceCode": { "title": "Activer Plezy sur ${service}", - "instructions": "", + "instructions": "Scannez le code QR ou accédez à l’adresse ci-dessous et saisissez ce code :", "openToActivate": "Ouvrir ${service} pour activer", "copyCode": "Copier le code d'activation", "waitingForAuthorization": "En attente d'autorisation…", @@ -1933,6 +2004,24 @@ "connectToMediaBrowserCardSubtitle": "Saisissez l'URL de votre serveur, votre nom d'utilisateur et votre mot de passe.", "connectToMediaBrowserCardSubtitleScoped": "Connectez-vous à votre serveur ${product}. Sera associé à ${name}.", "borrowFromAnotherProfile": "Emprunter à un autre profil", - "borrowFromAnotherProfileSubtitle": "Réutiliser la connexion d'un autre profil. Les profils protégés par PIN exigent un PIN." + "borrowFromAnotherProfileSubtitle": "Réutiliser la connexion d'un autre profil. Les profils protégés par PIN exigent un PIN.", + "invalidCredentials": "Nom d’utilisateur ou mot de passe incorrect", + "authResponseNotJson": "La réponse d’authentification n’était pas au format JSON valide", + "quickConnectRejected": "Quick Connect a été refusé par le serveur", + "quickConnectNotJson": "La réponse de Quick Connect n’était pas au format JSON valide", + "quickConnectMissingFields": "Il manque un code ou un secret dans la réponse de Quick Connect", + "quickConnectPollRejected": "L’interrogation de Quick Connect a été refusée par le serveur", + "serverTimedOut": "Le serveur n’a pas répondu à temps", + "responseNotJson": "La réponse du serveur n’était pas au format JSON valide", + "responseMissingIdentity": "Il manque un identifiant ou un nom de serveur dans la réponse : s’agit-il d’un serveur ${product} ?", + "probeFailed": "Impossible de joindre le serveur : ${error}", + "enterAtLeastOneUrl": "Saisissez l’URL d’au moins un serveur ${product}", + "noReachableServer": "Aucun serveur ${product} joignable n’a été trouvé", + "urlsPointToDifferentServers": "Ces URL renvoient vers différents serveurs ${product}", + "urlDoesNotMatchServer": "Cette URL ne correspond pas au serveur ${product}", + "redirectUnsupported": "Le serveur a redirigé vers une URL non prise en charge", + "redirectDifferentHost": "Le serveur a redirigé vers un hôte différent. Saisissez directement l’URL finale du serveur ${product}.", + "redirectInsecure": "Le serveur a redirigé de HTTPS vers une URL non sécurisée", + "redirectUnsupportedEnterFinal": "Le serveur a redirigé vers une URL non prise en charge. Saisissez directement l’URL finale du serveur ${product}." } } diff --git a/lib/i18n/hu.i18n.json b/lib/i18n/hu.i18n.json index 2fafb10e..f34012e6 100644 --- a/lib/i18n/hu.i18n.json +++ b/lib/i18n/hu.i18n.json @@ -17,7 +17,8 @@ "quickConnectWaiting": "Várakozás a jóváhagyásra…", "quickConnectCancel": "Mégse", "quickConnectExpired": "A Quick Connect kód lejárt. Próbáld újra.", - "localDataRecoveryRequired": "A Plezy nem tudta biztonságosan helyreállítani a helyi bejelentkezés és a függőben lévő lejátszás adatait. Jelentkezz be újra." + "localDataRecoveryRequired": "A Plezy nem tudta biztonságosan helyreállítani a helyi bejelentkezés és a függőben lévő lejátszás adatait. Jelentkezz be újra.", + "pinCheckRejected": "A Plex PIN ellenőrzését elutasították" }, "common": { "cancel": "Mégse", @@ -77,7 +78,10 @@ "trakt": "Trakt", "rottenTomatoesCritic": "Rotten Tomatoes kritikusok", "rottenTomatoesAudience": "Rotten Tomatoes közönség" - } + }, + "notAvailable": "N/A", + "url": "URL", + "letterKeys": "ABC" }, "screens": { "licenses": "Licencek", @@ -323,8 +327,8 @@ "showNavBarLabels": "Navigációs sáv címkéinek megjelenítése", "showNavBarLabelsDescription": "Szöveges címkék megjelenítése a navigációs sáv ikonjai alatt", "startupSection": "Indítási oldal", - "showExploreTab": "", - "showExploreTabDescription": "", + "showExploreTab": "Felfedezés lap megjelenítése", + "showExploreTabDescription": "A Plex Discover és a csatlakoztatott követők tartalmait megjelenítő Felfedezés lap megjelenítése", "liveTvDefaultFavorites": "Kedvenc csatornák alapértelmezés szerint", "liveTvDefaultFavoritesDescription": "Csak a kedvenc csatornák megjelenítése az Élő TV megnyitásakor", "display": "Kijelző", @@ -335,7 +339,8 @@ "player": "Lejátszó", "subtitlesAndConfig": "Feliratok és konfiguráció", "seekAndTiming": "Tekerés és időzítés", - "behavior": "Viselkedés" + "behavior": "Viselkedés", + "exportDialogTitle": "Plezy-beállítások exportálása" }, "search": { "hint": "Keresés filmek, sorozatok és zenék között...", @@ -491,7 +496,9 @@ "flagExternal": "Külső", "flagHearingImpaired": "Nagyothallóknak", "flagDub": "Szinkron", - "flagOriginal": "Eredeti" + "flagOriginal": "Eredeti", + "channelsMono": "Monó", + "dolbyVisionProfile": "${profile} profil" }, "mediaMenu": { "markAsWatched": "Megjelölés megtekintettként", @@ -568,7 +575,12 @@ "alphabetNavigation": "Ábécé szerinti navigáció", "alphabetScrollHint": "A betűnkénti léptetéshez pöccints felfelé vagy lefelé", "rowColumnPosition": "${row}. sor a(z) ${rowCount} sorból, ${column}. oszlop a(z) ${columnCount} oszlopból", - "rowPosition": "${row}. sor a(z) ${rowCount} sorból" + "rowPosition": "${row}. sor a(z) ${rowCount} sorból", + "autoScrollPlay": "Automatikus görgetés indítása", + "autoScrollPause": "Automatikus görgetés szüneteltetése", + "hueShort": "H", + "saturationShort": "S", + "valueShort": "V" }, "tooltips": { "shufflePlay": "Véletlenszerű lejátszás", @@ -666,7 +678,16 @@ "subtitleDownloaded": "Felirat letöltve", "subtitleDownloadedNotApplied": "Felirat letöltve, de nem sikerült kiválasztani", "subtitleDownloadFailed": "Nem sikerült a felirat letöltése", - "searchLanguages": "Nyelvek keresése..." + "searchLanguages": "Nyelvek keresése...", + "skipIntro": "Főcím átugrása", + "skipCredits": "Stáblista átugrása", + "nextEpisode": "Következő epizód", + "subtitleTrack": "${n}. sáv", + "subtitleFile": "${name} felirat", + "forcedTrack": "${label} (kényszerített)", + "osdSubtitlesOff": "Feliratok: ki", + "osdSubtitles": "Feliratok: ${track}", + "osdAudio": "Hang: ${track}" }, "userStatus": {}, "messages": { @@ -722,12 +743,18 @@ "serverLimitBody": "Szerverhiba (HTTP 500). A munkamenetet valószínűleg egy sávszélességi vagy átkódolási korlát utasította el. Kérd meg a tulajdonost a korlát módosítására.", "mediaUnreadableTitle": "A fájl nem érhető el", "mediaUnreadableBody": "A szerver megtalálta ezt az elemet, de nem tudta beolvasni a fájlját (HTTP 404). A fájl valószínűleg áthelyezésre vagy törlésre került, vagy a tárhelye offline. Kérje meg a szerver tulajdonosát, hogy ellenőrizze a fájlt, és vizsgálja újra a könyvtárat.", - "serverBusyTitle": "", - "serverBusyBody": "", + "serverBusyTitle": "A stream nem érhető el", + "serverBusyBody": "A szerver ismételten megtagadta ennek a fájlnak a streamelését (HTTP 503). Lehet, hogy újraindul, túlterhelt, vagy a fájl tárhelye nem érhető el. Próbáld újra egy kis idő múlva – ha a probléma továbbra is fennáll, kérd meg a szerver tulajdonosát, hogy ellenőrizze a szervert és a fájl tárhelyét.", "logsUploaded": "Naplók feltöltve", "logsUploadFailed": "Nem sikerült a naplók feltöltése", "logId": "Naplóazonosító", - "burnedSubtitlesUseMenu": "" + "burnedSubtitlesUseMenu": "A feliratok bele vannak égetve ebbe a streambe. A feliratmenüben módosíthatod őket.", + "noVideoUrl": "Nem érhető el videó-URL", + "playbackNoMediaSources": "A szerver nem adott vissza lejátszható médiaforrást", + "playbackDataNotPrepared": "A lejátszás az adatok elkészülte előtt indult el", + "streamSelectionUnavailable": "Ehhez a forráshoz nem érhető el a streamek kiválasztása", + "streamSelectionFailed": "Nem sikerült alkalmazni a kiválasztott streameket", + "serverUnavailableForProfile": "Az aktív profilhoz nem érhető el szerver" }, "subtitlingStyling": { "text": "Szöveg", @@ -746,8 +773,8 @@ "overrideStrip": "Stílus eltávolítása", "positionTop": "Fent", "positionBottom": "Lent", - "anchorToScreen": "", - "anchorToScreenDescription": "", + "anchorToScreen": "Képernyőhöz rögzítés", + "anchorToScreenDescription": "A szöveges feliratok megjelenítése a szélesvásznú videó alatti fekete sávban", "bold": "Félkövér", "italic": "Dőlt", "renderResolution": "Renderelési felbontás", @@ -835,7 +862,8 @@ "pinProtectionOptional": "PIN-védelem (opcionális)", "pinExplain": "4 jegyű PIN-kód szükséges a profilváltáshoz.", "continueButton": "Folytatás", - "pinsDontMatch": "A PIN-kódok nem egyeznek" + "pinsDontMatch": "A PIN-kódok nem egyeznek", + "tokenIdentityMismatch": "A Plex-profil tokenje nem a várt szerverhez tartozik" }, "connections": { "sectionTitle": "Kapcsolatok", @@ -872,7 +900,11 @@ "movie": "Film", "tvShow": "TV-sorozat", "minutesLeft": "${minutes} perc van hátra", - "moreLikeThis": "Hasonló tartalmak" + "moreLikeThis": "Hasonló tartalmak", + "titleCount": { + "one": "${n} cím", + "other": "${n} cím" + } }, "errors": { "searchFailed": "Keresés sikertelen: ${error}", @@ -1080,10 +1112,10 @@ "characters": "Karakterek", "addToWatchlist": "Hozzáadás a Néznivalókhoz", "removeFromWatchlist": "Eltávolítás a Néznivalókból", - "addedToWatchlist": "", - "removedFromWatchlist": "", + "addedToWatchlist": "Hozzáadva a figyelőlistához", + "removedFromWatchlist": "Eltávolítva a figyelőlistáról", "watchlistUpdateFailed": "Nem sikerült a Néznivalók frissítése", - "watchlistNoMatch": "", + "watchlistNoMatch": "Nem sikerült ezt az elemet figyelőlistához társítani", "notInLibrary": "Nincs a könyvtáradban", "inTheseLibraries": "Ezekben a könyvtárakban", "checkingLibrary": "Könyvtár ellenőrzése...", @@ -1253,9 +1285,9 @@ "watchChannel": "Csatorna nézése", "favorites": "Kedvencek", "reorderFavorites": "Kedvencek rendezése", - "noFavoriteChannels": "", - "noFavoriteChannelsHint": "", - "showAllChannels": "", + "noFavoriteChannels": "Nincsenek kedvenc csatornák", + "noFavoriteChannelsHint": "Jelenítsd meg az összes csatornát, majd hosszan nyomj meg egy csatornát, hogy hozzáadd a kedvenceidhez.", + "showAllChannels": "Összes csatorna megjelenítése", "favoritesLoadFailed": "Nem sikerült a kedvencek betöltése. Ellenőrizd a kapcsolatot és próbáld újra.", "favoritesUpdateFailed": "Nem sikerült frissíteni a kedvenceket. Ellenőrizd a kapcsolatot, majd próbáld újra.", "joinSession": "Csatlakozás a folyamatban lévő adáshoz", @@ -1294,7 +1326,12 @@ "recordingRuleUpdated": "Felvételi szabály frissítve", "guideReloadRequested": "Műsorújság frissítése kérve", "rulesProcessRequested": "Szabályok újraértékelése kérve", - "recordShow": "Műsor rögzítése" + "recordShow": "Műsor rögzítése", + "startingInMinutes": "${minutes} perc múlva kezdődik", + "dayAtTime": "${day}, ${time}", + "invalidPlaybackData": "A(z) ${product} érvénytelen Élő TV-lejátszási adatokat adott vissza", + "failedToStartChannel": "Nem sikerült elindítani az élő csatornát", + "failedToBuildStreamUrl": "Nem sikerült összeállítani a stream URL-címét" }, "collections": { "title": "Gyűjtemények", @@ -1371,7 +1408,9 @@ "nextTrack": "Következő szám", "repeat": "Ismétlés", "repeatAll": "Összes ismétlése", - "repeatOne": "Egy szám ismétlése" + "repeatOne": "Egy szám ismétlése", + "instantMixNoServer": "Nem érhető el szerver az azonnali mixhez", + "noAudioUrl": "Nem érhető el hang-URL ehhez: ${track}" }, "watchTogether": { "title": "Watch Together (Közös nézés)", @@ -1438,7 +1477,8 @@ "renameRoom": "Szoba átnevezése", "removeRoom": "Eltávolítás", "guestSwitchUnavailable": "Nem sikerült a váltás — a szerver nem érhető el szinkronizáláshoz", - "guestSwitchFailed": "Nem sikerült a váltás — a tartalom nem található ezen a szerveren" + "guestSwitchFailed": "Nem sikerült a váltás — a tartalom nem található ezen a szerveren", + "defaultDisplayName": "Felhasználó" }, "downloads": { "title": "Letöltések", @@ -1542,7 +1582,17 @@ "statusUnknown": "Még nincs ellenőrizve", "settingsUnavailable": "Ezen az eszközön nem sikerült megnyitni a rendszerbeállításokat", "linkUnavailable": "Ezen az eszközön nem sikerült megnyitni a dontkillmyapp.com webhelyet" - } + }, + "unknownShow": "Ismeretlen sorozat", + "unknownSeason": "Ismeretlen évad", + "unknownAlbum": "Ismeretlen album", + "completedOfTotal": "${completed}/${total} kész", + "errorFileNotFound": "A fájl nem található (404)", + "errorDownloadFailed": "A letöltés nem sikerült", + "errorPostProcessing": "Az utófeldolgozás nem sikerült: ${error}", + "notificationDownloading": "Letöltés...", + "notificationComplete": "Letöltés kész", + "notificationPaused": "Letöltés szüneteltetve" }, "shaders": { "title": "Shaderek", @@ -1633,7 +1683,8 @@ "failedToConnectAnyAddress": "Egyetlen címhez sem sikerült csatlakozni", "connectionLostAfterAttempts": "A kapcsolat megszakadt ${attempts} próbálkozás után", "connectionLost": "A kapcsolat megszakadt" - } + }, + "closedBeforeAuth": "A kapcsolat a hitelesítés előtt megszakadt" }, "videoSettings": { "playbackSpeed": "Lejátszási sebesség", @@ -1644,13 +1695,13 @@ "audioSync": "Hang szinkronizálása", "subtitleSync": "Felirat szinkronizálása", "hdr": "HDR", - "hdrUnsupported": "", - "hdrToneMapping": "", - "hdrToneMappingCompositor": "", - "hdrToneMappingCompositorDescription": "", - "hdrToneMappingPlayer": "", - "hdrToneMappingPlayerDescription": "", - "hdrToneMappingFailed": "", + "hdrUnsupported": "A HDR itt nem érhető el – ez az asztali kompozitor vagy videókimenet nem képes továbbítani.", + "hdrToneMapping": "HDR-tónusleképezés", + "hdrToneMappingCompositor": "Kompozitor", + "hdrToneMappingCompositorDescription": "Továbbítja a forrás HDR-metaadatait, és az asztali kompozitorra bízza a tónusleképezést.", + "hdrToneMappingPlayer": "Lejátszó", + "hdrToneMappingPlayerDescription": "A lejátszóban a kijelző maximális fényerejéhez igazítja a képet, majd közli az eredményt a kompozitorral.", + "hdrToneMappingFailed": "Nem sikerült módosítani a HDR-tónusleképezést – továbbra is az előző mód aktív.", "audioOutput": "Hangkimenet", "performanceOverlay": "Teljesítményadatok", "audioOutputDolbyAtmos": "Dolby Atmos", @@ -1696,7 +1747,17 @@ "speed": "Sebesség", "player": "Lejátszó", "memory": "Memória", - "uiFps": "Felület-FPS" + "uiFps": "Felület-FPS", + "fps": "FPS", + "decoderAndroidHw": "Android HW", + "decoderNvidiaHw": "NVIDIA HW", + "decoderQualcommHw": "Qualcomm HW", + "decoderMediatekHw": "MediaTek HW", + "decoderExynosHw": "Exynos HW", + "decoderSoftware": "Szoftveres", + "decoderHardware": "Hardveres", + "tunnelingActive": "Aktív", + "dvRpuFailed": "${converted} (${failures} sikertelen)" }, "externalPlayer": { "title": "Külső lejátszó", @@ -1854,7 +1915,17 @@ "statusAvailable": "Elérhető", "statusPartiallyAvailable": "Részben elérhető", "statusRequested": "Igényelve", - "statusProcessing": "Feldolgozás alatt" + "statusProcessing": "Feldolgozás alatt", + "couldNotReach": "Nem sikerült elérni ezt: ${url}: ${error}", + "noInstanceAtUrl": "Nem található Seerr-példány ezen a címen: ${url} (HTTP ${status})", + "notInitialized": "Ennek a Seerr-példánynak a kezdeti beállítása még nem fejeződött be", + "noPlexTokenForReauth": "Nem áll rendelkezésre Plex-token az újbóli bejelentkezéshez", + "noStoredCredentials": "Nem állnak rendelkezésre mentett hitelesítő adatok az újbóli bejelentkezéshez", + "signInRejected": "A bejelentkezést elutasították", + "noSessionCookie": "A Seerr nem adott ki munkamenet-sütit", + "freshCookieRejected": "A Seerr elutasította az új munkamenet-sütit", + "noUserInformation": "A Seerr nem adott vissza felhasználói adatokat", + "sessionRejectedAfterReauth": "A munkamenetet az újbóli bejelentkezés után elutasították" }, "services": { "title": "Szolgáltatások", @@ -1875,7 +1946,7 @@ }, "deviceCode": { "title": "Plezy aktiválása a következőn: ${service}", - "instructions": "", + "instructions": "Olvasd be a QR-kódot, vagy nyisd meg az alábbi címet, és írd be ezt a kódot:", "openToActivate": "Nyisd meg a(z) ${service} oldalt az aktiváláshoz", "copyCode": "Aktiválási kód másolása", "waitingForAuthorization": "Várakozás az engedélyezésre…", @@ -1933,6 +2004,24 @@ "connectToMediaBrowserCardSubtitle": "Adja meg a szerver URL-jét, felhasználónevét és jelszavát.", "connectToMediaBrowserCardSubtitleScoped": "Jelentkezzen be a(z) ${product} szerverére. A(z) ${name} szolgáltatáshoz kötődik.", "borrowFromAnotherProfile": "Kapcsolat használata másik profilból", - "borrowFromAnotherProfileSubtitle": "Egy másik profil kapcsolatának használata. A PIN-kóddal védett profilokhoz PIN-kód szükséges." + "borrowFromAnotherProfileSubtitle": "Egy másik profil kapcsolatának használata. A PIN-kóddal védett profilokhoz PIN-kód szükséges.", + "invalidCredentials": "Érvénytelen felhasználónév vagy jelszó", + "authResponseNotJson": "A hitelesítési válasz nem érvényes JSON", + "quickConnectRejected": "A szerver elutasította a Quick Connect-kérést", + "quickConnectNotJson": "A Quick Connect válasza nem érvényes JSON", + "quickConnectMissingFields": "A Quick Connect válaszából hiányzik a kód vagy a titkos kulcs", + "quickConnectPollRejected": "A szerver elutasította a Quick Connect lekérdezését", + "serverTimedOut": "A szerver nem válaszolt időben", + "responseNotJson": "A szerver válasza nem érvényes JSON", + "responseMissingIdentity": "A válaszból hiányzik az azonosító vagy a szerver neve – ez valóban ${product}-szerver?", + "probeFailed": "Nem sikerült elérni a szervert: ${error}", + "enterAtLeastOneUrl": "Adj meg legalább egy ${product}-szerverhez tartozó URL-t", + "noReachableServer": "Nem található elérhető ${product}-szerver", + "urlsPointToDifferentServers": "Ezek az URL-ek különböző ${product}-szerverekre mutatnak", + "urlDoesNotMatchServer": "Ez az URL nem egyezik a(z) ${product}-szerverrel", + "redirectUnsupported": "A szerver nem támogatott URL-re irányított át", + "redirectDifferentHost": "A szerver egy másik gazdagépre irányított át. Add meg közvetlenül a végleges ${product} URL-t.", + "redirectInsecure": "A szerver HTTPS-ről nem biztonságos URL-re irányított át", + "redirectUnsupportedEnterFinal": "A szerver nem támogatott URL-re irányított át. Add meg közvetlenül a végleges ${product} URL-t." } } diff --git a/lib/i18n/it.i18n.json b/lib/i18n/it.i18n.json index 4f58aad3..13c99bc7 100644 --- a/lib/i18n/it.i18n.json +++ b/lib/i18n/it.i18n.json @@ -17,7 +17,8 @@ "quickConnectWaiting": "In attesa di approvazione…", "quickConnectCancel": "Annulla", "quickConnectExpired": "Quick Connect scaduto. Riprova.", - "localDataRecoveryRequired": "Plezy non è riuscito a recuperare in sicurezza i dati locali di accesso e delle riproduzioni in sospeso. Accedi di nuovo." + "localDataRecoveryRequired": "Plezy non è riuscito a recuperare in sicurezza i dati locali di accesso e delle riproduzioni in sospeso. Accedi di nuovo.", + "pinCheckRejected": "La verifica del PIN Plex è stata rifiutata" }, "common": { "cancel": "Annulla", @@ -77,7 +78,10 @@ "trakt": "Trakt", "rottenTomatoesCritic": "Critici di Rotten Tomatoes", "rottenTomatoesAudience": "Pubblico di Rotten Tomatoes" - } + }, + "notAvailable": "N/D", + "url": "URL", + "letterKeys": "ABC" }, "screens": { "licenses": "Licenze", @@ -323,8 +327,8 @@ "showNavBarLabels": "Mostra le etichette della barra di navigazione", "showNavBarLabelsDescription": "Mostra le etichette di testo sotto le icone della barra di navigazione", "startupSection": "Sezione di avvio", - "showExploreTab": "", - "showExploreTabDescription": "", + "showExploreTab": "Mostra la scheda Esplora", + "showExploreTabDescription": "Visualizza la scheda Esplora con contenuti di Esplora di Plex e dei tracker collegati", "liveTvDefaultFavorites": "Apri sui canali preferiti", "liveTvDefaultFavoritesDescription": "Mostra solo i canali preferiti quando apri la TV in diretta", "display": "Schermo", @@ -335,7 +339,8 @@ "player": "Lettore", "subtitlesAndConfig": "Sottotitoli e impostazioni", "seekAndTiming": "Avanzamento e tempi", - "behavior": "Comportamento" + "behavior": "Comportamento", + "exportDialogTitle": "Esporta le impostazioni di Plezy" }, "search": { "hint": "Cerca film, serie TV e musica...", @@ -491,7 +496,9 @@ "flagExternal": "Esterno", "flagHearingImpaired": "Non udenti", "flagDub": "Doppiato", - "flagOriginal": "Originale" + "flagOriginal": "Originale", + "channelsMono": "Mono", + "dolbyVisionProfile": "Profilo ${profile}" }, "mediaMenu": { "markAsWatched": "Segna come visto", @@ -568,7 +575,12 @@ "alphabetNavigation": "Navigazione alfabetica", "alphabetScrollHint": "Scorri verso l'alto o il basso per cambiare lettera", "rowColumnPosition": "Riga ${row} di ${rowCount}, colonna ${column} di ${columnCount}", - "rowPosition": "Riga ${row} di ${rowCount}" + "rowPosition": "Riga ${row} di ${rowCount}", + "autoScrollPlay": "Avvia scorrimento automatico", + "autoScrollPause": "Sospendi scorrimento automatico", + "hueShort": "T", + "saturationShort": "S", + "valueShort": "V" }, "tooltips": { "shufflePlay": "Riproduzione casuale", @@ -666,7 +678,16 @@ "subtitleDownloaded": "Sottotitolo scaricato", "subtitleDownloadedNotApplied": "Il sottotitolo è stato scaricato, ma non è stato possibile selezionarlo", "subtitleDownloadFailed": "Impossibile scaricare il sottotitolo", - "searchLanguages": "Cerca lingue..." + "searchLanguages": "Cerca lingue...", + "skipIntro": "Salta intro", + "skipCredits": "Salta titoli", + "nextEpisode": "Episodio successivo", + "subtitleTrack": "Traccia ${n}", + "subtitleFile": "Sottotitolo ${name}", + "forcedTrack": "${label} (Forzato)", + "osdSubtitlesOff": "Sottotitoli: Disattivati", + "osdSubtitles": "Sottotitoli: ${track}", + "osdAudio": "Audio: ${track}" }, "userStatus": {}, "messages": { @@ -722,12 +743,18 @@ "serverLimitBody": "Errore del server (HTTP 500). È probabile che un limite di banda o transcodifica abbia impedito questa sessione. Chiedi al proprietario di modificare il limite.", "mediaUnreadableTitle": "File non disponibile", "mediaUnreadableBody": "Il server ha trovato questo elemento ma non ha potuto leggere il suo file (HTTP 404). Il file è stato probabilmente spostato o eliminato, oppure il suo storage è offline. Chiedi al proprietario del server di controllare il file e di riscansionare la libreria.", - "serverBusyTitle": "", - "serverBusyBody": "", + "serverBusyTitle": "Streaming non disponibile", + "serverBusyBody": "Il server ha continuato a rifiutare la riproduzione in streaming di questo file (HTTP 503). Potrebbe essere in fase di riavvio, occupato oppure l'unità in cui si trova il file potrebbe essere offline. Riprova tra qualche istante. Se il problema persiste, chiedi al proprietario del server di controllare il server e l'unità di archiviazione del file.", "logsUploaded": "Log caricati", "logsUploadFailed": "Impossibile caricare i log", "logId": "ID log", - "burnedSubtitlesUseMenu": "" + "burnedSubtitlesUseMenu": "I sottotitoli sono incorporati in questo stream. Cambiali dal menu dei sottotitoli.", + "noVideoUrl": "Nessun URL video disponibile", + "playbackNoMediaSources": "Il server non ha restituito sorgenti multimediali riproducibili", + "playbackDataNotPrepared": "La riproduzione è stata avviata prima che i relativi dati fossero pronti", + "streamSelectionUnavailable": "La selezione dei flussi non è disponibile per questa sorgente", + "streamSelectionFailed": "Impossibile applicare i flussi selezionati", + "serverUnavailableForProfile": "Nessun server disponibile per il profilo attivo" }, "subtitlingStyling": { "text": "Testo", @@ -746,8 +773,8 @@ "overrideStrip": "Rimuovi stile", "positionTop": "In alto", "positionBottom": "In basso", - "anchorToScreen": "", - "anchorToScreenDescription": "", + "anchorToScreen": "Fissa allo schermo", + "anchorToScreenDescription": "Mostra i sottotitoli testuali nelle bande nere sotto i video in formato panoramico", "bold": "Grassetto", "italic": "Corsivo", "renderResolution": "Risoluzione di rendering", @@ -835,7 +862,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", + "tokenIdentityMismatch": "Il token del profilo Plex è stato associato a un server imprevisto" }, "connections": { "sectionTitle": "Connessioni", @@ -872,7 +900,11 @@ "movie": "Film", "tvShow": "Serie TV", "minutesLeft": "${minutes} minuti rimanenti", - "moreLikeThis": "Altri contenuti simili" + "moreLikeThis": "Altri contenuti simili", + "titleCount": { + "one": "${n} titolo", + "other": "${n} titoli" + } }, "errors": { "searchFailed": "Ricerca non riuscita: ${error}", @@ -1080,10 +1112,10 @@ "characters": "Personaggi", "addToWatchlist": "Aggiungi alla lista da guardare", "removeFromWatchlist": "Rimuovi dalla lista da guardare", - "addedToWatchlist": "", - "removedFromWatchlist": "", + "addedToWatchlist": "Aggiunto alla lista titoli", + "removedFromWatchlist": "Rimosso dalla lista titoli", "watchlistUpdateFailed": "Impossibile aggiornare la lista da guardare", - "watchlistNoMatch": "", + "watchlistNoMatch": "Impossibile associare questo elemento a una lista titoli", "notInLibrary": "Non è nella tua libreria", "inTheseLibraries": "In queste librerie", "checkingLibrary": "Ricerca nella tua libreria...", @@ -1253,9 +1285,9 @@ "watchChannel": "Guarda il canale", "favorites": "Preferiti", "reorderFavorites": "Riordina i preferiti", - "noFavoriteChannels": "", - "noFavoriteChannelsHint": "", - "showAllChannels": "", + "noFavoriteChannels": "Nessun canale preferito", + "noFavoriteChannelsHint": "Mostra tutti i canali, quindi tieni premuto un canale per aggiungerlo ai preferiti.", + "showAllChannels": "Mostra tutti i canali", "favoritesLoadFailed": "Impossibile caricare i preferiti. Controlla la connessione e riprova.", "favoritesUpdateFailed": "Impossibile aggiornare i preferiti. Controlla la connessione e riprova.", "joinSession": "Partecipa alla sessione in corso", @@ -1294,7 +1326,12 @@ "recordingRuleUpdated": "Regola di registrazione aggiornata", "guideReloadRequested": "Aggiornamento della guida richiesto", "rulesProcessRequested": "Rielaborazione delle regole richiesta", - "recordShow": "Registra programma" + "recordShow": "Registra programma", + "startingInMinutes": "Inizia tra ${minutes} min", + "dayAtTime": "${day} alle ${time}", + "invalidPlaybackData": "${product} ha restituito dati di riproduzione della TV in diretta non validi", + "failedToStartChannel": "Impossibile avviare il canale in diretta", + "failedToBuildStreamUrl": "Impossibile creare l'URL dello stream" }, "collections": { "title": "Raccolte", @@ -1371,7 +1408,9 @@ "nextTrack": "Brano successivo", "repeat": "Ripeti", "repeatAll": "Ripeti tutto", - "repeatOne": "Ripeti il brano" + "repeatOne": "Ripeti il brano", + "instantMixNoServer": "Nessun server disponibile per un mix istantaneo", + "noAudioUrl": "Nessun URL audio disponibile per ${track}" }, "watchTogether": { "title": "Guarda insieme", @@ -1438,7 +1477,8 @@ "renameRoom": "Rinomina stanza", "removeRoom": "Rimuovi", "guestSwitchUnavailable": "Impossibile cambiare — server non disponibile per la sincronizzazione", - "guestSwitchFailed": "Impossibile cambiare — contenuto non trovato su questo server" + "guestSwitchFailed": "Impossibile cambiare — contenuto non trovato su questo server", + "defaultDisplayName": "Utente" }, "downloads": { "title": "Download", @@ -1542,7 +1582,17 @@ "statusUnknown": "Non ancora verificato", "settingsUnavailable": "Impossibile aprire le impostazioni di sistema su questo dispositivo", "linkUnavailable": "Impossibile aprire dontkillmyapp.com su questo dispositivo" - } + }, + "unknownShow": "Serie sconosciuta", + "unknownSeason": "Stagione sconosciuta", + "unknownAlbum": "Album sconosciuto", + "completedOfTotal": "${completed}/${total} completati", + "errorFileNotFound": "File non trovato (404)", + "errorDownloadFailed": "Download non riuscito", + "errorPostProcessing": "Post-elaborazione non riuscita: ${error}", + "notificationDownloading": "Download in corso...", + "notificationComplete": "Download completato", + "notificationPaused": "Download in pausa" }, "shaders": { "title": "Shader", @@ -1633,7 +1683,8 @@ "failedToConnectAnyAddress": "Impossibile connettersi a qualsiasi indirizzo", "connectionLostAfterAttempts": "Connessione persa dopo ${attempts} tentativi", "connectionLost": "Connessione persa" - } + }, + "closedBeforeAuth": "La connessione si è chiusa prima dell'autenticazione" }, "videoSettings": { "playbackSpeed": "Velocità di riproduzione", @@ -1644,13 +1695,13 @@ "audioSync": "Sincronizzazione audio", "subtitleSync": "Sincronizzazione sottotitoli", "hdr": "HDR", - "hdrUnsupported": "", - "hdrToneMapping": "", - "hdrToneMappingCompositor": "", - "hdrToneMappingCompositorDescription": "", - "hdrToneMappingPlayer": "", - "hdrToneMappingPlayerDescription": "", - "hdrToneMappingFailed": "", + "hdrUnsupported": "HDR non è disponibile qui: questo compositore desktop o questa uscita video non possono gestirlo.", + "hdrToneMapping": "Mappatura dei toni HDR", + "hdrToneMappingCompositor": "Compositore", + "hdrToneMappingCompositorDescription": "Trasmette i metadati HDR della sorgente e lascia che il compositore desktop esegua la mappatura.", + "hdrToneMappingPlayer": "Lettore", + "hdrToneMappingPlayerDescription": "Esegue nel lettore la mappatura in base alla luminosità di picco dello schermo, quindi comunica il risultato al compositore.", + "hdrToneMappingFailed": "Impossibile modificare la mappatura dei toni HDR: la modalità precedente è ancora attiva.", "audioOutput": "Uscita audio", "performanceOverlay": "Overlay prestazioni", "audioOutputDolbyAtmos": "Dolby Atmos", @@ -1696,7 +1747,17 @@ "speed": "Velocità", "player": "Lettore", "memory": "Memoria", - "uiFps": "FPS UI" + "uiFps": "FPS UI", + "fps": "FPS", + "decoderAndroidHw": "Android HW", + "decoderNvidiaHw": "NVIDIA HW", + "decoderQualcommHw": "Qualcomm HW", + "decoderMediatekHw": "MediaTek HW", + "decoderExynosHw": "Exynos HW", + "decoderSoftware": "Software", + "decoderHardware": "Hardware", + "tunnelingActive": "Attivo", + "dvRpuFailed": "${converted} (${failures} errori)" }, "externalPlayer": { "title": "Lettore esterno", @@ -1854,7 +1915,17 @@ "statusAvailable": "Disponibile", "statusPartiallyAvailable": "Disponibile in parte", "statusRequested": "Richiesto", - "statusProcessing": "In elaborazione" + "statusProcessing": "In elaborazione", + "couldNotReach": "Impossibile raggiungere ${url}: ${error}", + "noInstanceAtUrl": "Nessuna istanza Seerr all'indirizzo ${url} (HTTP ${status})", + "notInitialized": "Questa istanza Seerr non ha completato la configurazione iniziale", + "noPlexTokenForReauth": "Nessun token Plex disponibile per effettuare nuovamente l'accesso", + "noStoredCredentials": "Nessuna credenziale salvata disponibile per effettuare nuovamente l'accesso", + "signInRejected": "L'accesso è stato rifiutato", + "noSessionCookie": "Seerr non ha generato un cookie di sessione", + "freshCookieRejected": "Seerr ha rifiutato il nuovo cookie di sessione", + "noUserInformation": "Seerr non ha restituito le informazioni sull'utente", + "sessionRejectedAfterReauth": "La sessione è stata rifiutata dopo aver effettuato nuovamente l'accesso" }, "services": { "title": "Servizi", @@ -1875,7 +1946,7 @@ }, "deviceCode": { "title": "Attiva Plezy su ${service}", - "instructions": "", + "instructions": "Scansiona il codice QR oppure visita l'indirizzo qui sotto e inserisci questo codice:", "openToActivate": "Apri ${service} per attivare", "copyCode": "Copia il codice di attivazione", "waitingForAuthorization": "In attesa di autorizzazione…", @@ -1933,6 +2004,24 @@ "connectToMediaBrowserCardSubtitle": "Inserisci l'URL del server, il nome utente e la password.", "connectToMediaBrowserCardSubtitleScoped": "Accedi al tuo server ${product}. Associato a ${name}.", "borrowFromAnotherProfile": "Prendi in prestito da un altro profilo", - "borrowFromAnotherProfileSubtitle": "Riutilizza la connessione di un altro profilo. I profili protetti da PIN richiedono un PIN." + "borrowFromAnotherProfileSubtitle": "Riutilizza la connessione di un altro profilo. I profili protetti da PIN richiedono un PIN.", + "invalidCredentials": "Nome utente o password non validi", + "authResponseNotJson": "La risposta di autenticazione non era un JSON valido", + "quickConnectRejected": "Quick Connect è stato rifiutato dal server", + "quickConnectNotJson": "La risposta di Quick Connect non era un JSON valido", + "quickConnectMissingFields": "Nella risposta di Quick Connect manca un codice o un segreto", + "quickConnectPollRejected": "Il polling di Quick Connect è stato rifiutato dal server", + "serverTimedOut": "Il server non ha risposto in tempo", + "responseNotJson": "La risposta del server non era un JSON valido", + "responseMissingIdentity": "Nella risposta manca un ID o il nome del server: è un server ${product}?", + "probeFailed": "Impossibile raggiungere il server: ${error}", + "enterAtLeastOneUrl": "Inserisci almeno un URL di un server ${product}", + "noReachableServer": "Non è stato trovato alcun server ${product} raggiungibile", + "urlsPointToDifferentServers": "Questi URL rimandano a server ${product} diversi", + "urlDoesNotMatchServer": "Questo URL non corrisponde al server ${product}", + "redirectUnsupported": "Il server ha reindirizzato a un URL non supportato", + "redirectDifferentHost": "Il server ha reindirizzato a un host diverso. Inserisci direttamente l'URL finale del server ${product}.", + "redirectInsecure": "Il server ha reindirizzato da HTTPS a un URL non sicuro", + "redirectUnsupportedEnterFinal": "Il server ha reindirizzato a un URL non supportato. Inserisci direttamente l'URL finale del server ${product}." } } diff --git a/lib/i18n/ja.i18n.json b/lib/i18n/ja.i18n.json index 7454f8f8..349ed9f5 100644 --- a/lib/i18n/ja.i18n.json +++ b/lib/i18n/ja.i18n.json @@ -17,7 +17,8 @@ "quickConnectWaiting": "承認を待っています…", "quickConnectCancel": "キャンセル", "quickConnectExpired": "Quick Connectの有効期限が切れました。もう一度お試しください。", - "localDataRecoveryRequired": "ローカルのサインイン情報と保留中の再生データを安全に復元できませんでした。もう一度サインインしてください。" + "localDataRecoveryRequired": "ローカルのサインイン情報と保留中の再生データを安全に復元できませんでした。もう一度サインインしてください。", + "pinCheckRejected": "Plex PINの確認が拒否されました" }, "common": { "cancel": "キャンセル", @@ -77,7 +78,10 @@ "trakt": "Trakt", "rottenTomatoesCritic": "Rotten Tomatoes 批評家", "rottenTomatoesAudience": "Rotten Tomatoes 観客" - } + }, + "notAvailable": "N/A", + "url": "URL", + "letterKeys": "ABC" }, "screens": { "licenses": "ライセンス", @@ -323,8 +327,8 @@ "showNavBarLabels": "ナビゲーションバーのラベルを表示", "showNavBarLabelsDescription": "ナビゲーションバーのアイコンの下にテキストラベルを表示", "startupSection": "起動時のセクション", - "showExploreTab": "", - "showExploreTabDescription": "", + "showExploreTab": "「探す」タブを表示", + "showExploreTabDescription": "Plex Discoverと接続済みのトラッカーのコンテンツを「探す」タブに表示します", "liveTvDefaultFavorites": "お気に入りチャンネルをデフォルトに", "liveTvDefaultFavoritesDescription": "ライブTVを開いたときにお気に入りチャンネルのみ表示", "display": "ディスプレイ", @@ -335,7 +339,8 @@ "player": "プレーヤー", "subtitlesAndConfig": "字幕と設定", "seekAndTiming": "シークとタイミング", - "behavior": "動作" + "behavior": "動作", + "exportDialogTitle": "Plezyの設定をエクスポート" }, "search": { "hint": "映画、番組、音楽を検索…", @@ -491,7 +496,9 @@ "flagExternal": "外部", "flagHearingImpaired": "聴覚障害者向け", "flagDub": "吹替", - "flagOriginal": "オリジナル" + "flagOriginal": "オリジナル", + "channelsMono": "モノラル", + "dolbyVisionProfile": "プロファイル${profile}" }, "mediaMenu": { "markAsWatched": "視聴済みにする", @@ -565,7 +572,12 @@ "alphabetNavigation": "アルファベットナビゲーション", "alphabetScrollHint": "上下にスワイプして文字ごとに移動", "rowColumnPosition": "${rowCount}行中${row}行、${columnCount}列中${column}列", - "rowPosition": "${rowCount}行中${row}行" + "rowPosition": "${rowCount}行中${row}行", + "autoScrollPlay": "自動スクロールを再生", + "autoScrollPause": "自動スクロールを一時停止", + "hueShort": "H", + "saturationShort": "S", + "valueShort": "V" }, "tooltips": { "shufflePlay": "シャッフル再生", @@ -663,7 +675,16 @@ "subtitleDownloaded": "字幕をダウンロードしました", "subtitleDownloadedNotApplied": "字幕はダウンロードされましたが、選択できませんでした", "subtitleDownloadFailed": "字幕のダウンロードに失敗しました", - "searchLanguages": "言語を検索…" + "searchLanguages": "言語を検索…", + "skipIntro": "イントロをスキップ", + "skipCredits": "クレジットをスキップ", + "nextEpisode": "次のエピソード", + "subtitleTrack": "トラック${n}", + "subtitleFile": "字幕${name}", + "forcedTrack": "${label}(強制)", + "osdSubtitlesOff": "字幕: オフ", + "osdSubtitles": "字幕: ${track}", + "osdAudio": "音声: ${track}" }, "userStatus": {}, "messages": { @@ -718,12 +739,18 @@ "serverLimitBody": "サーバーエラー(HTTP 500)。帯域幅/トランスコード制限により拒否された可能性があります。所有者に調整を依頼してください。", "mediaUnreadableTitle": "ファイルを利用できません", "mediaUnreadableBody": "サーバーはこのアイテムを見つけましたが、そのファイルを読み取れませんでした(HTTP 404)。ファイルが移動・削除されたか、ストレージがオフラインの可能性があります。サーバーの管理者にファイルの確認とライブラリの再スキャンを依頼してください。", - "serverBusyTitle": "", - "serverBusyBody": "", + "serverBusyTitle": "ストリームを利用できません", + "serverBusyBody": "サーバーがこのファイルのストリーミングを繰り返し拒否しました(HTTP 503)。サーバーが再起動中またはビジー状態か、ファイルのストレージがオフラインの可能性があります。しばらくしてからもう一度お試しください。問題が続く場合は、サーバーの所有者にサーバーとファイルのストレージを確認するよう依頼してください。", "logsUploaded": "ログをアップロードしました", "logsUploadFailed": "ログのアップロードに失敗しました", "logId": "ログID", - "burnedSubtitlesUseMenu": "" + "burnedSubtitlesUseMenu": "字幕はこのストリームに焼き付けられています。字幕メニューから変更してください。", + "noVideoUrl": "利用可能な動画URLがありません", + "playbackNoMediaSources": "サーバーから再生可能なメディアソースが返されませんでした", + "playbackDataNotPrepared": "再生データの準備が完了する前に再生が開始されました", + "streamSelectionUnavailable": "このソースではストリームを選択できません", + "streamSelectionFailed": "選択したストリームを適用できませんでした", + "serverUnavailableForProfile": "現在のプロフィールで利用可能なサーバーがありません" }, "subtitlingStyling": { "text": "テキスト", @@ -742,8 +769,8 @@ "overrideStrip": "スタイルを削除", "positionTop": "上", "positionBottom": "下", - "anchorToScreen": "", - "anchorToScreenDescription": "", + "anchorToScreen": "画面に固定", + "anchorToScreenDescription": "ワイドスクリーン映像の下にある黒帯にテキスト字幕を表示します", "bold": "太字", "italic": "斜体", "renderResolution": "レンダリング解像度", @@ -831,7 +858,8 @@ "pinProtectionOptional": "PIN保護(オプション)", "pinExplain": "プロフィール切り替えには4桁のPINが必要です。", "continueButton": "続ける", - "pinsDontMatch": "PINが一致しません" + "pinsDontMatch": "PINが一致しません", + "tokenIdentityMismatch": "Plexプロフィールのトークンから予期しないサーバーが特定されました" }, "connections": { "sectionTitle": "接続", @@ -868,7 +896,10 @@ "movie": "映画", "tvShow": "テレビ番組", "minutesLeft": "残り${minutes}分", - "moreLikeThis": "似ている作品" + "moreLikeThis": "似ている作品", + "titleCount": { + "other": "${n}作品" + } }, "errors": { "searchFailed": "検索に失敗しました: ${error}", @@ -1075,10 +1106,10 @@ "characters": "キャラクター", "addToWatchlist": "ウォッチリストに追加", "removeFromWatchlist": "ウォッチリストから削除", - "addedToWatchlist": "", - "removedFromWatchlist": "", + "addedToWatchlist": "ウォッチリストに追加しました", + "removedFromWatchlist": "ウォッチリストから削除しました", "watchlistUpdateFailed": "ウォッチリストを更新できませんでした", - "watchlistNoMatch": "", + "watchlistNoMatch": "このアイテムに一致するウォッチリスト項目が見つかりませんでした", "notInLibrary": "ライブラリにありません", "inTheseLibraries": "これらのライブラリにあります", "checkingLibrary": "ライブラリを確認中…", @@ -1245,9 +1276,9 @@ "watchChannel": "チャンネルを視聴", "favorites": "お気に入り", "reorderFavorites": "お気に入りを並べ替え", - "noFavoriteChannels": "", - "noFavoriteChannelsHint": "", - "showAllChannels": "", + "noFavoriteChannels": "お気に入りのチャンネルがありません", + "noFavoriteChannelsHint": "すべてのチャンネルを表示し、チャンネルを長押ししてお気に入りに追加してください。", + "showAllChannels": "すべてのチャンネルを表示", "favoritesLoadFailed": "お気に入りを読み込めませんでした。接続を確認してもう一度お試しください。", "favoritesUpdateFailed": "お気に入りを更新できませんでした。接続を確認してもう一度お試しください。", "joinSession": "進行中のセッションに参加", @@ -1286,7 +1317,12 @@ "recordingRuleUpdated": "録画ルールを更新しました", "guideReloadRequested": "番組表の更新をリクエストしました", "rulesProcessRequested": "録画ルールの再評価をリクエストしました", - "recordShow": "番組を録画" + "recordShow": "番組を録画", + "startingInMinutes": "${minutes}分後に開始", + "dayAtTime": "${day} ${time}", + "invalidPlaybackData": "${product}から無効なライブTV再生データが返されました", + "failedToStartChannel": "ライブチャンネルを開始できませんでした", + "failedToBuildStreamUrl": "ストリームURLを生成できませんでした" }, "collections": { "title": "コレクション", @@ -1362,7 +1398,9 @@ "nextTrack": "次の曲", "repeat": "リピート", "repeatAll": "全曲リピート", - "repeatOne": "1曲リピート" + "repeatOne": "1曲リピート", + "instantMixNoServer": "インスタントミックスに利用できるサーバーがありません", + "noAudioUrl": "${track}で利用可能な音声URLがありません" }, "watchTogether": { "title": "一緒に見る", @@ -1429,7 +1467,8 @@ "renameRoom": "ルーム名を変更", "removeRoom": "削除", "guestSwitchUnavailable": "切り替えられません — 同期に必要なサーバーを利用できません", - "guestSwitchFailed": "切り替えられません — このサーバーにコンテンツが見つかりません" + "guestSwitchFailed": "切り替えられません — このサーバーにコンテンツが見つかりません", + "defaultDisplayName": "ユーザー" }, "downloads": { "title": "ダウンロード", @@ -1533,7 +1572,17 @@ "statusUnknown": "未確認", "settingsUnavailable": "この端末ではシステム設定を開けませんでした", "linkUnavailable": "この端末ではdontkillmyapp.comを開けませんでした" - } + }, + "unknownShow": "不明な番組", + "unknownSeason": "不明なシーズン", + "unknownAlbum": "不明なアルバム", + "completedOfTotal": "${completed}/${total}完了", + "errorFileNotFound": "ファイルが見つかりません(404)", + "errorDownloadFailed": "ダウンロードに失敗しました", + "errorPostProcessing": "後処理に失敗しました: ${error}", + "notificationDownloading": "ダウンロード中…", + "notificationComplete": "ダウンロードが完了しました", + "notificationPaused": "ダウンロードを一時停止しました" }, "shaders": { "title": "シェーダー", @@ -1624,7 +1673,8 @@ "failedToConnectAnyAddress": "どのアドレスにも接続できませんでした", "connectionLostAfterAttempts": "${attempts}回試行後に接続が切断されました", "connectionLost": "接続が切断されました" - } + }, + "closedBeforeAuth": "認証前に接続が切断されました" }, "videoSettings": { "playbackSpeed": "再生速度", @@ -1635,13 +1685,13 @@ "audioSync": "音声同期", "subtitleSync": "字幕同期", "hdr": "HDR", - "hdrUnsupported": "", - "hdrToneMapping": "", - "hdrToneMappingCompositor": "", - "hdrToneMappingCompositorDescription": "", - "hdrToneMappingPlayer": "", - "hdrToneMappingPlayerDescription": "", - "hdrToneMappingFailed": "", + "hdrUnsupported": "ここではHDRを利用できません。このデスクトップコンポジターまたは映像出力はHDRに対応していません。", + "hdrToneMapping": "HDRトーンマッピング", + "hdrToneMappingCompositor": "コンポジター", + "hdrToneMappingCompositorDescription": "ソースのHDRメタデータをそのまま渡し、デスクトップコンポジターにマッピングさせます。", + "hdrToneMappingPlayer": "プレーヤー", + "hdrToneMappingPlayerDescription": "プレーヤーでディスプレイのピーク輝度に合わせてマッピングし、その結果をコンポジターに通知します。", + "hdrToneMappingFailed": "HDRトーンマッピングを変更できませんでした。以前のモードが引き続き有効です。", "audioOutput": "音声出力", "performanceOverlay": "パフォーマンスオーバーレイ", "audioOutputDolbyAtmos": "Dolby Atmos", @@ -1687,7 +1737,17 @@ "speed": "速度", "player": "プレーヤー", "memory": "メモリ", - "uiFps": "UI FPS" + "uiFps": "UI FPS", + "fps": "FPS", + "decoderAndroidHw": "Android HW", + "decoderNvidiaHw": "NVIDIA HW", + "decoderQualcommHw": "Qualcomm HW", + "decoderMediatekHw": "MediaTek HW", + "decoderExynosHw": "Exynos HW", + "decoderSoftware": "ソフトウェア", + "decoderHardware": "ハードウェア", + "tunnelingActive": "有効", + "dvRpuFailed": "${converted}(${failures}件失敗)" }, "externalPlayer": { "title": "外部プレーヤー", @@ -1845,7 +1905,17 @@ "statusAvailable": "利用可能", "statusPartiallyAvailable": "一部利用可能", "statusRequested": "リクエスト済み", - "statusProcessing": "処理中" + "statusProcessing": "処理中", + "couldNotReach": "${url}に接続できませんでした: ${error}", + "noInstanceAtUrl": "${url}にSeerrインスタンスがありません(HTTP ${status})", + "notInitialized": "このSeerrインスタンスでは初回セットアップが完了していません", + "noPlexTokenForReauth": "再サインインに使用できるPlexトークンがありません", + "noStoredCredentials": "再サインインに使用できる保存済みの認証情報がありません", + "signInRejected": "サインインが拒否されました", + "noSessionCookie": "Seerrからセッションクッキーが発行されませんでした", + "freshCookieRejected": "Seerrが新しいセッションクッキーを拒否しました", + "noUserInformation": "Seerrからユーザー情報が返されませんでした", + "sessionRejectedAfterReauth": "再サインイン後にセッションが拒否されました" }, "services": { "title": "サービス", @@ -1866,7 +1936,7 @@ }, "deviceCode": { "title": "${service} で Plezy を有効化", - "instructions": "", + "instructions": "QRコードをスキャンするか、以下のアドレスにアクセスしてこのコードを入力してください:", "openToActivate": "${service} を開いて有効化", "copyCode": "アクティベーションコードをコピー", "waitingForAuthorization": "認証を待っています…", @@ -1924,6 +1994,24 @@ "connectToMediaBrowserCardSubtitle": "サーバーのURL、ユーザー名、パスワードを入力してください。", "connectToMediaBrowserCardSubtitleScoped": "${product}サーバーにサインインします。「${name}」に紐付けられます。", "borrowFromAnotherProfile": "別のプロフィールの接続を利用", - "borrowFromAnotherProfileSubtitle": "別のプロフィールの接続を再利用します。PINで保護されたプロフィールにはPINが必要です。" + "borrowFromAnotherProfileSubtitle": "別のプロフィールの接続を再利用します。PINで保護されたプロフィールにはPINが必要です。", + "invalidCredentials": "ユーザー名またはパスワードが正しくありません", + "authResponseNotJson": "認証レスポンスが有効なJSONではありません", + "quickConnectRejected": "Quick Connectがサーバーに拒否されました", + "quickConnectNotJson": "Quick Connectのレスポンスが有効なJSONではありません", + "quickConnectMissingFields": "Quick Connectのレスポンスにコードまたはシークレットがありません", + "quickConnectPollRejected": "Quick Connectのポーリングがサーバーに拒否されました", + "serverTimedOut": "サーバーが時間内に応答しませんでした", + "responseNotJson": "サーバーのレスポンスが有効なJSONではありません", + "responseMissingIdentity": "レスポンスにIDまたはサーバー名がありません。これは${product}サーバーですか?", + "probeFailed": "サーバーに接続できませんでした: ${error}", + "enterAtLeastOneUrl": "${product}サーバーのURLを1つ以上入力してください", + "noReachableServer": "接続可能な${product}サーバーが見つかりませんでした", + "urlsPointToDifferentServers": "これらのURLは異なる${product}サーバーを指しています", + "urlDoesNotMatchServer": "このURLは${product}サーバーと一致しません", + "redirectUnsupported": "サーバーからサポートされていないURLにリダイレクトされました", + "redirectDifferentHost": "サーバーから別のホストにリダイレクトされました。最終的な${product}のURLを直接入力してください。", + "redirectInsecure": "サーバーからHTTPSではない安全でないURLにリダイレクトされました", + "redirectUnsupportedEnterFinal": "サーバーからサポートされていないURLにリダイレクトされました。最終的な${product}のURLを直接入力してください。" } } diff --git a/lib/i18n/kk.i18n.json b/lib/i18n/kk.i18n.json index b7d938ec..2ec47a90 100644 --- a/lib/i18n/kk.i18n.json +++ b/lib/i18n/kk.i18n.json @@ -17,7 +17,8 @@ "quickConnectWaiting": "Растау күтілуде…", "quickConnectCancel": "Бас тарту", "quickConnectExpired": "Жылдам қосылу мерзімі өтті. Қайтадан байқап көріңіз.", - "localDataRecoveryRequired": "Plezy жергілікті кіру мәліметтерін қалпына келтіре алмады. Қайтадан кіріңіз." + "localDataRecoveryRequired": "Plezy жергілікті кіру мәліметтерін қалпына келтіре алмады. Қайтадан кіріңіз.", + "pinCheckRejected": "Plex PIN кодын тексеру қабылданбады" }, "common": { "cancel": "Бас тарту", @@ -77,7 +78,10 @@ "trakt": "Trakt", "rottenTomatoesCritic": "Rotten Tomatoes сыншылары", "rottenTomatoesAudience": "Rotten Tomatoes көрермендері" - } + }, + "notAvailable": "N/A", + "url": "URL", + "letterKeys": "ABC" }, "screens": { "licenses": "Лицензиялар", @@ -323,8 +327,8 @@ "showNavBarLabels": "Навигация панелінің мәтіндерін көрсету", "showNavBarLabelsDescription": "Навигация белгішелерінің астында мәтінді көрсету", "startupSection": "Бастапқы бөлім", - "showExploreTab": "", - "showExploreTabDescription": "", + "showExploreTab": "«Шолу» қойындысын көрсету", + "showExploreTabDescription": "Plex шолуынан және қосылған трекерлерден алынған контенті бар «Шолу» қойындысын көрсету", "liveTvDefaultFavorites": "Тікелей TV-де таңдаулы арналарды әдепкі ету", "liveTvDefaultFavoritesDescription": "Тікелей TV ашылғанда тек таңдаулы арналарды көрсету", "display": "Дисплей", @@ -335,7 +339,8 @@ "player": "Ойнатқыш", "subtitlesAndConfig": "Субтитрлер мен конфигурация", "seekAndTiming": "Айналдыру және уақытты реттеу", - "behavior": "Мінез-құлық" + "behavior": "Мінез-құлық", + "exportDialogTitle": "Plezy параметрлерін экспорттау" }, "search": { "hint": "Фильмдер, сериалдар, музыка іздеу...", @@ -491,7 +496,9 @@ "flagExternal": "Сыртқы", "flagHearingImpaired": "Есту қабілеті бұзылғандар үшін", "flagDub": "Дубляж", - "flagOriginal": "Түпнұсқа" + "flagOriginal": "Түпнұсқа", + "channelsMono": "Моно", + "dolbyVisionProfile": "${profile} профилі" }, "mediaMenu": { "markAsWatched": "Көрілді деп белгілеу", @@ -568,7 +575,12 @@ "alphabetNavigation": "Алфавиттік навигация", "alphabetScrollHint": "Әріптер бойынша өту үшін жоғары немесе төмен сырғытыңыз", "rowColumnPosition": "Жол ${row} / ${rowCount}, баған ${column} / ${columnCount}", - "rowPosition": "Жол ${row} / ${rowCount}" + "rowPosition": "Жол ${row} / ${rowCount}", + "autoScrollPlay": "Автоайналдыруды бастау", + "autoScrollPause": "Автоайналдыруды кідірту", + "hueShort": "H", + "saturationShort": "S", + "valueShort": "V" }, "tooltips": { "shufflePlay": "Араластырып ойнату", @@ -666,7 +678,16 @@ "subtitleDownloaded": "Субтитр жүктелді", "subtitleDownloadedNotApplied": "Субтитр жүктелді, бірақ қолданылмады", "subtitleDownloadFailed": "Субтитрді жүктеу мүмкін болмады", - "searchLanguages": "Тілдерден іздеу..." + "searchLanguages": "Тілдерден іздеу...", + "skipIntro": "Кіріспені өткізу", + "skipCredits": "Титрлерді өткізу", + "nextEpisode": "Келесі бөлім", + "subtitleTrack": "Жол ${n}", + "subtitleFile": "Субтитр ${name}", + "forcedTrack": "${label} (Мәжбүрлі)", + "osdSubtitlesOff": "Субтитр: өшірулі", + "osdSubtitles": "Субтитр: ${track}", + "osdAudio": "Дыбыс: ${track}" }, "userStatus": {}, "messages": { @@ -722,12 +743,18 @@ "serverLimitBody": "Сервер қатесі (HTTP 500). Шектеу бұл сеансты қабылдамады.", "mediaUnreadableTitle": "Файл қолжетімсіз", "mediaUnreadableBody": "Сервер бұл элементті тапты, бірақ оның файлын оқи алмады (HTTP 404). Файл жылжытылған, өшірілген немесе оның сақтау орны қолжетімсіз болуы мүмкін. Сервер иесінен файлды тексеріп, кітапхананы қайта сканерлеуді сұраңыз.", - "serverBusyTitle": "", - "serverBusyBody": "", + "serverBusyTitle": "Ағын қолжетімсіз", + "serverBusyBody": "Сервер бұл файлды ағынмен жіберуден қайта-қайта бас тартты (HTTP 503). Ол қайта іске қосылып, бос емес болуы немесе файл сақталған қойма офлайн болуы мүмкін. Сәлден соң қайталап көріңіз — бұл жалғаса берсе, сервер иесінен серверді және файл қоймасын тексеруін сұраңыз.", "logsUploaded": "Журналдар жүктелді", "logsUploadFailed": "Журналдарды жүктеу мүмкін болмады", "logId": "Журнал ID-сі", - "burnedSubtitlesUseMenu": "" + "burnedSubtitlesUseMenu": "Субтитрлер бұл ағынға кіріктірілген. Оларды субтитр мәзірінен өзгертіңіз.", + "noVideoUrl": "Бейне URL-і қолжетімді емес", + "playbackNoMediaSources": "Сервер ойнатуға болатын медиа көздерін қайтармады", + "playbackDataNotPrepared": "Ойнату деректері дайын болмай тұрып басталды", + "streamSelectionUnavailable": "Бұл көз үшін ағынды таңдау қолжетімді емес", + "streamSelectionFailed": "Таңдалған ағындарды қолдану мүмкін болмады", + "serverUnavailableForProfile": "Белсенді профиль үшін қолжетімді сервер жоқ" }, "subtitlingStyling": { "text": "Мәтін", @@ -746,8 +773,8 @@ "overrideStrip": "Форматтауды жою", "positionTop": "Жоғары", "positionBottom": "Төмен", - "anchorToScreen": "", - "anchorToScreenDescription": "", + "anchorToScreen": "Экранға бекіту", + "anchorToScreenDescription": "Мәтіндік субтитрлерді кең экранды бейненің астындағы қара жолақтарда көрсету", "bold": "Қалың", "italic": "Көлбеу", "renderResolution": "Рендеринг ажыратымдылығы", @@ -835,7 +862,8 @@ "pinProtectionOptional": "PIN қорғанысы (қосымша)", "pinExplain": "Профильдер арасында ауысу үшін 4 таңбалы PIN код қажет.", "continueButton": "Жалғастыру", - "pinsDontMatch": "PIN кодтар сәйкес келмейді" + "pinsDontMatch": "PIN кодтар сәйкес келмейді", + "tokenIdentityMismatch": "Plex профилінің токені күтілмеген серверді анықтады" }, "connections": { "sectionTitle": "Қосылымдар", @@ -872,7 +900,11 @@ "movie": "Фильм", "tvShow": "TV Шоу", "minutesLeft": "${minutes} мин қалды", - "moreLikeThis": "Ұқсастар" + "moreLikeThis": "Ұқсастар", + "titleCount": { + "one": "${n} атау", + "other": "${n} атау" + } }, "errors": { "searchFailed": "Іздеу қатесі: ${error}", @@ -1080,10 +1112,10 @@ "characters": "Кейіпкерлер", "addToWatchlist": "Көру тізіміне қосу", "removeFromWatchlist": "Көру тізімінен өшіру", - "addedToWatchlist": "", - "removedFromWatchlist": "", + "addedToWatchlist": "Көру тізіміне қосылды", + "removedFromWatchlist": "Көру тізімінен алынды", "watchlistUpdateFailed": "Көру тізімін жаңарту мүмкін болмады", - "watchlistNoMatch": "", + "watchlistNoMatch": "Бұл элементті көру тізімімен сәйкестендіру мүмкін болмады", "notInLibrary": "Кітапханаңызда жоқ", "inTheseLibraries": "Осы кітапханаларда бар", "checkingLibrary": "Кітапхана тексерілуде...", @@ -1253,9 +1285,9 @@ "watchChannel": "Арнаны көру", "favorites": "Таңдаулылар", "reorderFavorites": "Таңдаулыларды қайта реттеу", - "noFavoriteChannels": "", - "noFavoriteChannelsHint": "", - "showAllChannels": "", + "noFavoriteChannels": "Таңдаулы арналар жоқ", + "noFavoriteChannelsHint": "Барлық арнаны көрсетіп, таңдаулыларға қосу үшін арнаны ұзақ басып тұрыңыз.", + "showAllChannels": "Барлық арнаны көрсету", "favoritesLoadFailed": "Таңдаулыларды жүктеу мүмкін болмады.", "favoritesUpdateFailed": "Таңдаулыларды жаңарту мүмкін болмады.", "joinSession": "Сеансқа қосылу", @@ -1294,7 +1326,12 @@ "recordingRuleUpdated": "Жазу ережесі жаңартылды", "guideReloadRequested": "Бағдарламаны жаңарту сұралды", "rulesProcessRequested": "Ережелерді қайта бағалау сұралды", - "recordShow": "Шоуды жазу" + "recordShow": "Шоуды жазу", + "startingInMinutes": "${minutes} мин кейін басталады", + "dayAtTime": "${day}, ${time}", + "invalidPlaybackData": "${product} жарамсыз тікелей TV ойнату деректерін қайтарды", + "failedToStartChannel": "Тікелей эфир арнасын іске қосу мүмкін болмады", + "failedToBuildStreamUrl": "Ағын URL-ін құру мүмкін болмады" }, "collections": { "title": "Топтамалар", @@ -1371,7 +1408,9 @@ "nextTrack": "Келесі ән", "repeat": "Қайталау", "repeatAll": "Барлығын қайталау", - "repeatOne": "Біреуін қайталау" + "repeatOne": "Біреуін қайталау", + "instantMixNoServer": "Жедел микс үшін қолжетімді сервер жоқ", + "noAudioUrl": "${track} үшін аудио URL-і қолжетімді емес" }, "watchTogether": { "title": "Бірге көру", @@ -1438,7 +1477,8 @@ "renameRoom": "Бөлме атын өзгерткіңіз келе ме?", "removeRoom": "Өшіру", "guestSwitchUnavailable": "Ауысу мүмкін болмады", - "guestSwitchFailed": "Ауысу мүмкін болмады — мазмұн табылмады" + "guestSwitchFailed": "Ауысу мүмкін болмады — мазмұн табылмады", + "defaultDisplayName": "Пайдаланушы" }, "downloads": { "title": "Жүктеулер", @@ -1542,7 +1582,17 @@ "statusUnknown": "Әлі тексерілмеген", "settingsUnavailable": "Бұл құрылғыда жүйе баптаулары ашылмады", "linkUnavailable": "Бұл құрылғыда dontkillmyapp.com ашылмады" - } + }, + "unknownShow": "Белгісіз телешоу", + "unknownSeason": "Белгісіз маусым", + "unknownAlbum": "Белгісіз альбом", + "completedOfTotal": "${completed}/${total} аяқталды", + "errorFileNotFound": "Файл табылмады (404)", + "errorDownloadFailed": "Жүктеу сәтсіз аяқталды", + "errorPostProcessing": "Кейінгі өңдеу сәтсіз аяқталды: ${error}", + "notificationDownloading": "Жүктелуде...", + "notificationComplete": "Жүктеу аяқталды", + "notificationPaused": "Жүктеу кідіртілді" }, "shaders": { "title": "Шейдерлер", @@ -1633,7 +1683,8 @@ "failedToConnectAnyAddress": "Ешбір мекенжайға қосылу мүмкін болмады", "connectionLostAfterAttempts": "${attempts} әрекеттен кейін байланыс үзілді", "connectionLost": "Байланыс үзілді" - } + }, + "closedBeforeAuth": "Аутентификациядан бұрын байланыс жабылды" }, "videoSettings": { "playbackSpeed": "Ойнату жылдамдығы", @@ -1644,13 +1695,13 @@ "audioSync": "Аудио синхрондау", "subtitleSync": "Субтитр синхрондау", "hdr": "HDR", - "hdrUnsupported": "", - "hdrToneMapping": "", - "hdrToneMappingCompositor": "", - "hdrToneMappingCompositorDescription": "", - "hdrToneMappingPlayer": "", - "hdrToneMappingPlayerDescription": "", - "hdrToneMappingFailed": "", + "hdrUnsupported": "HDR мұнда қолжетімді емес — бұл жұмыс үстелі композиторы немесе бейне шығысы оны өткізе алмайды.", + "hdrToneMapping": "HDR тондарын түрлендіру", + "hdrToneMappingCompositor": "Композитор", + "hdrToneMappingCompositorDescription": "Дереккөздің HDR метадеректерін өзгеріссіз өткізіп, оларды жұмыс үстелі композиторына түрлендіруге мүмкіндік беру.", + "hdrToneMappingPlayer": "Ойнатқыш", + "hdrToneMappingPlayerDescription": "Ойнатқышта дисплейдің ең жоғары жарықтығына сәйкестендіріп, нәтижені композиторға хабарлау.", + "hdrToneMappingFailed": "HDR тондарын түрлендіруді өзгерту мүмкін болмады — алдыңғы режим әлі де белсенді.", "audioOutput": "Аудио шығысы", "performanceOverlay": "Өнімділік панелі", "audioOutputDolbyAtmos": "Dolby Atmos", @@ -1696,7 +1747,17 @@ "speed": "Жылдамдық", "player": "Ойнатқыш", "memory": "Жады", - "uiFps": "Интерфейс (UI) FPS" + "uiFps": "Интерфейс (UI) FPS", + "fps": "FPS", + "decoderAndroidHw": "Android HW", + "decoderNvidiaHw": "NVIDIA HW", + "decoderQualcommHw": "Qualcomm HW", + "decoderMediatekHw": "MediaTek HW", + "decoderExynosHw": "Exynos HW", + "decoderSoftware": "Бағдарламалық", + "decoderHardware": "Аппараттық", + "tunnelingActive": "Белсенді", + "dvRpuFailed": "${converted} (${failures} сәтсіз аяқталды)" }, "externalPlayer": { "title": "Сыртқы ойнатқыш", @@ -1854,7 +1915,17 @@ "statusAvailable": "Қолжетімді", "statusPartiallyAvailable": "Жартылай қолжетімді", "statusRequested": "Сұралды", - "statusProcessing": "Өңделуде" + "statusProcessing": "Өңделуде", + "couldNotReach": "${url} мекенжайына қосылу мүмкін болмады: ${error}", + "noInstanceAtUrl": "${url} мекенжайында Seerr данасы жоқ (HTTP ${status})", + "notInitialized": "Бұл Seerr данасының бастапқы баптауы аяқталмаған", + "noPlexTokenForReauth": "Қайта кіру үшін Plex токені қолжетімді емес", + "noStoredCredentials": "Қайта кіру үшін сақталған тіркелгі деректері жоқ", + "signInRejected": "Кіру қабылданбады", + "noSessionCookie": "Seerr сеанс cookie файлын бермеді", + "freshCookieRejected": "Seerr жаңа сеанс cookie файлын қабылдамады", + "noUserInformation": "Seerr пайдаланушы туралы мәліметтерді қайтармады", + "sessionRejectedAfterReauth": "Қайта кіргеннен кейін сеанс қабылданбады" }, "services": { "title": "Қызметтер", @@ -1875,7 +1946,7 @@ }, "deviceCode": { "title": "Plezy-ді ${service} қызметінде белсендіру", - "instructions": "", + "instructions": "QR кодын сканерлеңіз немесе төмендегі мекенжайға өтіп, мына кодты енгізіңіз:", "openToActivate": "Белсендіру үшін ${service} ашу", "copyCode": "Белсендіру кодын көшіру", "waitingForAuthorization": "Авторизация күтілуде…", @@ -1933,6 +2004,24 @@ "connectToMediaBrowserCardSubtitle": "Сервер URL мекенжайын, пайдаланушы атын және құпия сөзді енгізіңіз.", "connectToMediaBrowserCardSubtitleScoped": "${product} серверіне кіріңіз. ${name} тіркелгісіне байланыстырылады.", "borrowFromAnotherProfile": "Басқа профильден алу", - "borrowFromAnotherProfileSubtitle": "Басқа профильдің қосылымын қайта пайдалану." + "borrowFromAnotherProfileSubtitle": "Басқа профильдің қосылымын қайта пайдалану.", + "invalidCredentials": "Пайдаланушы аты немесе құпия сөз қате", + "authResponseNotJson": "Аутентификация жауабы жарамды JSON болмады", + "quickConnectRejected": "Сервер Quick Connect сұрауын қабылдамады", + "quickConnectNotJson": "Quick Connect жауабы жарамды JSON болмады", + "quickConnectMissingFields": "Quick Connect жауабында код немесе құпия кілт жоқ", + "quickConnectPollRejected": "Сервер Quick Connect сұрауын тексеруді қабылдамады", + "serverTimedOut": "Сервер уақытында жауап бермеді", + "responseNotJson": "Сервер жауабы жарамды JSON болмады", + "responseMissingIdentity": "Жауапта ID немесе сервер атауы жоқ — бұл ${product} сервері ме?", + "probeFailed": "Серверге қосылу мүмкін болмады: ${error}", + "enterAtLeastOneUrl": "Кемінде бір ${product} серверінің URL-ін енгізіңіз", + "noReachableServer": "Қолжетімді ${product} сервері табылмады", + "urlsPointToDifferentServers": "Бұл URL-дер әртүрлі ${product} серверлеріне бағыттайды", + "urlDoesNotMatchServer": "Бұл URL ${product} серверіне сәйкес келмейді", + "redirectUnsupported": "Сервер қолдау көрсетілмейтін URL-ге қайта бағыттады", + "redirectDifferentHost": "Сервер басқа хостқа қайта бағыттады. Соңғы ${product} URL-ін тікелей енгізіңіз.", + "redirectInsecure": "Сервер HTTPS мекенжайынан қауіпсіз емес URL-ге қайта бағыттады", + "redirectUnsupportedEnterFinal": "Сервер қолдау көрсетілмейтін URL-ге қайта бағыттады. Соңғы ${product} URL-ін тікелей енгізіңіз." } } diff --git a/lib/i18n/ko.i18n.json b/lib/i18n/ko.i18n.json index b19de5e3..27935ac8 100644 --- a/lib/i18n/ko.i18n.json +++ b/lib/i18n/ko.i18n.json @@ -17,7 +17,8 @@ "quickConnectWaiting": "승인 대기 중…", "quickConnectCancel": "취소", "quickConnectExpired": "Quick Connect가 만료되었습니다. 다시 시도하세요.", - "localDataRecoveryRequired": "Plezy에서 로컬 로그인 정보와 대기 중인 재생 데이터를 안전하게 복구하지 못했습니다. 다시 로그인해 주세요." + "localDataRecoveryRequired": "Plezy에서 로컬 로그인 정보와 대기 중인 재생 데이터를 안전하게 복구하지 못했습니다. 다시 로그인해 주세요.", + "pinCheckRejected": "Plex PIN 확인이 거부되었습니다" }, "common": { "cancel": "취소", @@ -77,7 +78,10 @@ "trakt": "Trakt", "rottenTomatoesCritic": "Rotten Tomatoes 평론가", "rottenTomatoesAudience": "Rotten Tomatoes 관객" - } + }, + "notAvailable": "N/A", + "url": "URL", + "letterKeys": "ABC" }, "screens": { "licenses": "라이선스", @@ -323,8 +327,8 @@ "showNavBarLabels": "내비게이션 바 라벨 표시", "showNavBarLabelsDescription": "내비게이션 바 아이콘 아래에 텍스트 라벨을 표시합니다", "startupSection": "시작 섹션", - "showExploreTab": "", - "showExploreTabDescription": "", + "showExploreTab": "둘러보기 탭 표시", + "showExploreTabDescription": "Plex Discover와 연결된 트래커의 콘텐츠가 포함된 둘러보기 탭을 표시합니다", "liveTvDefaultFavorites": "즐겨찾기 채널 기본 설정", "liveTvDefaultFavoritesDescription": "라이브 TV를 열 때 즐겨찾기 채널만 표시", "display": "디스플레이", @@ -335,7 +339,8 @@ "player": "플레이어", "subtitlesAndConfig": "자막 및 구성", "seekAndTiming": "탐색 및 타이밍", - "behavior": "동작" + "behavior": "동작", + "exportDialogTitle": "Plezy 설정 내보내기" }, "search": { "hint": "영화, 시리즈, 음악 등을 검색하세요...", @@ -491,7 +496,9 @@ "flagExternal": "외부", "flagHearingImpaired": "청각 장애인용", "flagDub": "더빙", - "flagOriginal": "원본" + "flagOriginal": "원본", + "channelsMono": "모노", + "dolbyVisionProfile": "프로파일 ${profile}" }, "mediaMenu": { "markAsWatched": "시청 완료로 표시", @@ -565,7 +572,12 @@ "alphabetNavigation": "알파벳 탐색", "alphabetScrollHint": "위아래로 스와이프하여 글자별로 이동", "rowColumnPosition": "${rowCount}행 중 ${row}행, ${columnCount}열 중 ${column}열", - "rowPosition": "${rowCount}행 중 ${row}행" + "rowPosition": "${rowCount}행 중 ${row}행", + "autoScrollPlay": "자동 스크롤 재생", + "autoScrollPause": "자동 스크롤 일시정지", + "hueShort": "H", + "saturationShort": "S", + "valueShort": "V" }, "tooltips": { "shufflePlay": "무작위 재생", @@ -663,7 +675,16 @@ "subtitleDownloaded": "자막이 다운로드되었습니다", "subtitleDownloadedNotApplied": "자막을 다운로드했지만 선택할 수 없습니다", "subtitleDownloadFailed": "자막 다운로드에 실패했습니다", - "searchLanguages": "언어 검색..." + "searchLanguages": "언어 검색...", + "skipIntro": "인트로 건너뛰기", + "skipCredits": "크레딧 건너뛰기", + "nextEpisode": "다음 에피소드", + "subtitleTrack": "트랙 ${n}", + "subtitleFile": "자막 ${name}", + "forcedTrack": "${label} (강제)", + "osdSubtitlesOff": "자막: 꺼짐", + "osdSubtitles": "자막: ${track}", + "osdAudio": "오디오: ${track}" }, "userStatus": {}, "messages": { @@ -718,12 +739,18 @@ "serverLimitBody": "서버 오류(HTTP 500). 대역폭/트랜스코딩 제한으로 세션이 거부된 것 같습니다. 소유자에게 조정을 요청하세요.", "mediaUnreadableTitle": "파일을 사용할 수 없음", "mediaUnreadableBody": "서버에서 이 항목을 찾았지만 파일을 읽을 수 없습니다(HTTP 404). 파일이 이동되거나 삭제되었거나 저장소가 오프라인 상태일 수 있습니다. 서버 관리자에게 파일 확인과 라이브러리 재스캔을 요청하세요.", - "serverBusyTitle": "", - "serverBusyBody": "", + "serverBusyTitle": "스트림을 사용할 수 없음", + "serverBusyBody": "서버에서 이 파일의 스트리밍을 계속 거부했습니다(HTTP 503). 서버가 다시 시작 중이거나 사용량이 많을 수 있으며, 파일이 저장된 저장소가 오프라인일 수도 있습니다. 잠시 후 다시 시도하세요. 문제가 계속되면 서버 소유자에게 서버와 파일 저장소를 확인해 달라고 요청하세요.", "logsUploaded": "로그 업로드 완료", "logsUploadFailed": "로그 업로드 실패", "logId": "로그 ID", - "burnedSubtitlesUseMenu": "" + "burnedSubtitlesUseMenu": "자막이 이 스트림에 입혀져 있습니다. 자막 메뉴에서 변경하세요.", + "noVideoUrl": "사용 가능한 비디오 URL이 없습니다", + "playbackNoMediaSources": "서버에서 재생 가능한 미디어 소스를 반환하지 않았습니다", + "playbackDataNotPrepared": "재생 데이터가 준비되기 전에 재생이 시작되었습니다", + "streamSelectionUnavailable": "이 소스에서는 스트림을 선택할 수 없습니다", + "streamSelectionFailed": "선택한 스트림을 적용할 수 없습니다", + "serverUnavailableForProfile": "활성 프로필에 사용할 수 있는 서버가 없습니다" }, "subtitlingStyling": { "text": "텍스트", @@ -742,8 +769,8 @@ "overrideStrip": "스타일 제거", "positionTop": "위", "positionBottom": "아래", - "anchorToScreen": "", - "anchorToScreenDescription": "", + "anchorToScreen": "화면에 고정", + "anchorToScreenDescription": "와이드스크린 비디오 아래의 검은 여백에 텍스트 자막을 표시합니다", "bold": "굵게", "italic": "기울임꼴", "renderResolution": "렌더링 해상도", @@ -831,7 +858,8 @@ "pinProtectionOptional": "PIN 보호 (선택 사항)", "pinExplain": "프로필 전환에는 4자리 PIN이 필요합니다.", "continueButton": "계속", - "pinsDontMatch": "PIN이 일치하지 않습니다" + "pinsDontMatch": "PIN이 일치하지 않습니다", + "tokenIdentityMismatch": "Plex 프로필 토큰이 예상과 다른 서버로 확인되었습니다" }, "connections": { "sectionTitle": "연결", @@ -868,7 +896,10 @@ "movie": "영화", "tvShow": "TV 시리즈", "minutesLeft": "${minutes}분 남음", - "moreLikeThis": "비슷한 콘텐츠" + "moreLikeThis": "비슷한 콘텐츠", + "titleCount": { + "other": "${n}개 타이틀" + } }, "errors": { "searchFailed": "검색 실패: ${error}", @@ -1075,10 +1106,10 @@ "characters": "캐릭터", "addToWatchlist": "관심 목록에 추가", "removeFromWatchlist": "관심 목록에서 제거", - "addedToWatchlist": "", - "removedFromWatchlist": "", + "addedToWatchlist": "관심 목록에 추가했습니다", + "removedFromWatchlist": "관심 목록에서 삭제했습니다", "watchlistUpdateFailed": "관심 목록을 업데이트하지 못했습니다", - "watchlistNoMatch": "", + "watchlistNoMatch": "이 항목을 관심 목록과 연결할 수 없습니다", "notInLibrary": "라이브러리에 없음", "inTheseLibraries": "이 라이브러리에 있음", "checkingLibrary": "라이브러리 확인 중...", @@ -1245,9 +1276,9 @@ "watchChannel": "채널 시청", "favorites": "즐겨찾기", "reorderFavorites": "즐겨찾기 순서 변경", - "noFavoriteChannels": "", - "noFavoriteChannelsHint": "", - "showAllChannels": "", + "noFavoriteChannels": "즐겨찾기 채널 없음", + "noFavoriteChannelsHint": "모든 채널을 표시한 다음 채널을 길게 눌러 즐겨찾기에 추가하세요.", + "showAllChannels": "모든 채널 표시", "favoritesLoadFailed": "즐겨찾기를 불러올 수 없습니다. 연결을 확인하고 다시 시도하세요.", "favoritesUpdateFailed": "즐겨찾기를 업데이트할 수 없습니다. 연결을 확인하고 다시 시도하세요.", "joinSession": "진행 중인 세션 참여", @@ -1286,7 +1317,12 @@ "recordingRuleUpdated": "녹화 규칙 업데이트됨", "guideReloadRequested": "가이드 새로고침 요청됨", "rulesProcessRequested": "규칙 재평가 요청됨", - "recordShow": "프로그램 녹화" + "recordShow": "프로그램 녹화", + "startingInMinutes": "${minutes}분 후 시작", + "dayAtTime": "${day} ${time}", + "invalidPlaybackData": "${product}에서 잘못된 실시간 TV 재생 데이터를 반환했습니다", + "failedToStartChannel": "실시간 채널을 시작할 수 없습니다", + "failedToBuildStreamUrl": "스트림 URL을 생성할 수 없습니다" }, "collections": { "title": "컬렉션", @@ -1362,7 +1398,9 @@ "nextTrack": "다음 곡", "repeat": "반복", "repeatAll": "전체 반복", - "repeatOne": "한 곡 반복" + "repeatOne": "한 곡 반복", + "instantMixNoServer": "즉석 믹스에 사용할 수 있는 서버가 없습니다", + "noAudioUrl": "${track}에 사용할 수 있는 오디오 URL이 없습니다" }, "watchTogether": { "title": "함께 보기", @@ -1429,7 +1467,8 @@ "renameRoom": "방 이름 변경", "removeRoom": "제거", "guestSwitchUnavailable": "전환할 수 없음 — 동기화 서버를 사용할 수 없습니다", - "guestSwitchFailed": "전환할 수 없음 — 이 서버에서 콘텐츠를 찾을 수 없습니다" + "guestSwitchFailed": "전환할 수 없음 — 이 서버에서 콘텐츠를 찾을 수 없습니다", + "defaultDisplayName": "사용자" }, "downloads": { "title": "다운로드", @@ -1533,7 +1572,17 @@ "statusUnknown": "아직 확인하지 않음", "settingsUnavailable": "이 기기에서 시스템 설정을 열 수 없습니다", "linkUnavailable": "이 기기에서 dontkillmyapp.com을 열 수 없습니다" - } + }, + "unknownShow": "알 수 없는 프로그램", + "unknownSeason": "알 수 없는 시즌", + "unknownAlbum": "알 수 없는 앨범", + "completedOfTotal": "${completed}/${total} 완료", + "errorFileNotFound": "파일을 찾을 수 없음(404)", + "errorDownloadFailed": "다운로드 실패", + "errorPostProcessing": "후처리 실패: ${error}", + "notificationDownloading": "다운로드 중...", + "notificationComplete": "다운로드 완료", + "notificationPaused": "다운로드 일시 중지" }, "shaders": { "title": "셰이더", @@ -1624,7 +1673,8 @@ "failedToConnectAnyAddress": "어떤 주소에도 연결하지 못했습니다", "connectionLostAfterAttempts": "${attempts}회 시도 후 연결이 끊어졌습니다", "connectionLost": "연결이 끊어졌습니다" - } + }, + "closedBeforeAuth": "인증 전에 연결이 종료되었습니다" }, "videoSettings": { "playbackSpeed": "재생 속도", @@ -1635,13 +1685,13 @@ "audioSync": "오디오 동기화", "subtitleSync": "자막 동기화", "hdr": "HDR", - "hdrUnsupported": "", - "hdrToneMapping": "", - "hdrToneMappingCompositor": "", - "hdrToneMappingCompositorDescription": "", - "hdrToneMappingPlayer": "", - "hdrToneMappingPlayerDescription": "", - "hdrToneMappingFailed": "", + "hdrUnsupported": "여기서는 HDR을 사용할 수 없습니다. 이 데스크톱 컴포지터 또는 비디오 출력에서 HDR을 전달할 수 없습니다.", + "hdrToneMapping": "HDR 톤 매핑", + "hdrToneMappingCompositor": "컴포지터", + "hdrToneMappingCompositorDescription": "소스의 HDR 메타데이터를 그대로 전달하고 데스크톱 컴포지터에서 매핑하도록 합니다.", + "hdrToneMappingPlayer": "플레이어", + "hdrToneMappingPlayerDescription": "플레이어에서 디스플레이의 최대 밝기에 맞게 매핑한 다음 그 결과를 컴포지터에 전달합니다.", + "hdrToneMappingFailed": "HDR 톤 매핑을 변경할 수 없습니다. 이전 모드가 계속 적용됩니다.", "audioOutput": "오디오 출력", "performanceOverlay": "성능 오버레이", "audioOutputDolbyAtmos": "Dolby Atmos", @@ -1687,7 +1737,17 @@ "speed": "속도", "player": "플레이어", "memory": "메모리", - "uiFps": "UI FPS" + "uiFps": "UI FPS", + "fps": "FPS", + "decoderAndroidHw": "Android HW", + "decoderNvidiaHw": "NVIDIA HW", + "decoderQualcommHw": "Qualcomm HW", + "decoderMediatekHw": "MediaTek HW", + "decoderExynosHw": "Exynos HW", + "decoderSoftware": "소프트웨어", + "decoderHardware": "하드웨어", + "tunnelingActive": "활성", + "dvRpuFailed": "${converted} (${failures}개 실패)" }, "externalPlayer": { "title": "외부 플레이어", @@ -1845,7 +1905,17 @@ "statusAvailable": "사용 가능", "statusPartiallyAvailable": "일부 사용 가능", "statusRequested": "요청됨", - "statusProcessing": "처리 중" + "statusProcessing": "처리 중", + "couldNotReach": "${url}에 연결할 수 없습니다: ${error}", + "noInstanceAtUrl": "${url}에 Seerr 인스턴스가 없습니다(HTTP ${status})", + "notInitialized": "이 Seerr 인스턴스는 최초 실행 설정을 완료하지 않았습니다", + "noPlexTokenForReauth": "다시 로그인하는 데 사용할 수 있는 Plex 토큰이 없습니다", + "noStoredCredentials": "다시 로그인하는 데 사용할 수 있는 저장된 인증 정보가 없습니다", + "signInRejected": "로그인이 거부되었습니다", + "noSessionCookie": "Seerr에서 세션 쿠키를 발급하지 않았습니다", + "freshCookieRejected": "Seerr에서 새 세션 쿠키를 거부했습니다", + "noUserInformation": "Seerr에서 사용자 정보를 반환하지 않았습니다", + "sessionRejectedAfterReauth": "다시 로그인한 후 세션이 거부되었습니다" }, "services": { "title": "서비스", @@ -1866,7 +1936,7 @@ }, "deviceCode": { "title": "${service}에서 Plezy 활성화", - "instructions": "", + "instructions": "QR 코드를 스캔하거나 아래 주소로 이동하여 이 코드를 입력하세요:", "openToActivate": "활성화하려면 ${service} 열기", "copyCode": "활성화 코드 복사", "waitingForAuthorization": "인증을 기다리는 중…", @@ -1924,6 +1994,24 @@ "connectToMediaBrowserCardSubtitle": "서버 URL, 사용자 이름, 비밀번호를 입력하세요.", "connectToMediaBrowserCardSubtitleScoped": "${product} 서버에 로그인하세요. ${name}에 연결됩니다.", "borrowFromAnotherProfile": "다른 프로필에서 빌리기", - "borrowFromAnotherProfileSubtitle": "다른 프로필의 연결을 재사용합니다. PIN으로 보호된 프로필에는 PIN이 필요합니다." + "borrowFromAnotherProfileSubtitle": "다른 프로필의 연결을 재사용합니다. PIN으로 보호된 프로필에는 PIN이 필요합니다.", + "invalidCredentials": "사용자 이름 또는 비밀번호가 올바르지 않습니다", + "authResponseNotJson": "인증 응답이 유효한 JSON이 아닙니다", + "quickConnectRejected": "서버에서 Quick Connect를 거부했습니다", + "quickConnectNotJson": "Quick Connect 응답이 유효한 JSON이 아닙니다", + "quickConnectMissingFields": "Quick Connect 응답에 코드 또는 비밀 키가 없습니다", + "quickConnectPollRejected": "서버에서 Quick Connect 폴링을 거부했습니다", + "serverTimedOut": "서버가 제시간에 응답하지 않았습니다", + "responseNotJson": "서버 응답이 유효한 JSON이 아닙니다", + "responseMissingIdentity": "응답에 ID 또는 서버 이름이 없습니다. 이 서버가 ${product} 서버인가요?", + "probeFailed": "서버에 연결할 수 없습니다: ${error}", + "enterAtLeastOneUrl": "${product} 서버 URL을 하나 이상 입력하세요", + "noReachableServer": "연결 가능한 ${product} 서버를 찾을 수 없습니다", + "urlsPointToDifferentServers": "이 URL들은 서로 다른 ${product} 서버를 가리킵니다", + "urlDoesNotMatchServer": "이 URL은 ${product} 서버와 일치하지 않습니다", + "redirectUnsupported": "서버가 지원되지 않는 URL로 리디렉션했습니다", + "redirectDifferentHost": "서버가 다른 호스트로 리디렉션했습니다. 최종 ${product} URL을 직접 입력하세요.", + "redirectInsecure": "서버가 HTTPS에서 안전하지 않은 URL로 리디렉션했습니다", + "redirectUnsupportedEnterFinal": "서버가 지원되지 않는 URL로 리디렉션했습니다. 최종 ${product} URL을 직접 입력하세요." } } diff --git a/lib/i18n/nb.i18n.json b/lib/i18n/nb.i18n.json index 6961287d..fefa6ecd 100644 --- a/lib/i18n/nb.i18n.json +++ b/lib/i18n/nb.i18n.json @@ -17,7 +17,8 @@ "quickConnectWaiting": "Venter på godkjenning…", "quickConnectCancel": "Avbryt", "quickConnectExpired": "Quick Connect er utløpt. Prøv igjen.", - "localDataRecoveryRequired": "Plezy kunne ikke gjenopprette lokale innloggingsdata og ventende avspillingsdata på en sikker måte. Logg inn på nytt." + "localDataRecoveryRequired": "Plezy kunne ikke gjenopprette lokale innloggingsdata og ventende avspillingsdata på en sikker måte. Logg inn på nytt.", + "pinCheckRejected": "Kontrollen av Plex-PIN-koden ble avvist" }, "common": { "cancel": "Avbryt", @@ -77,7 +78,10 @@ "trakt": "Trakt", "rottenTomatoesCritic": "Rotten Tomatoes-kritikere", "rottenTomatoesAudience": "Rotten Tomatoes-publikum" - } + }, + "notAvailable": "I/T", + "url": "URL", + "letterKeys": "ABC" }, "screens": { "licenses": "Lisenser", @@ -323,8 +327,8 @@ "showNavBarLabels": "Vis etiketter i navigasjonsfeltet", "showNavBarLabelsDescription": "Vis tekstetiketter under ikonene i navigasjonsfeltet", "startupSection": "Startseksjon", - "showExploreTab": "", - "showExploreTabDescription": "", + "showExploreTab": "Vis Oppdag-fanen", + "showExploreTabDescription": "Vis Oppdag-fanen med innhold fra Plex Discover og tilkoblede sporingstjenester", "liveTvDefaultFavorites": "Vis favorittkanaler som standard", "liveTvDefaultFavoritesDescription": "Vis bare favorittkanaler når du åpner Direkte-TV", "display": "Skjerm", @@ -335,7 +339,8 @@ "player": "Spiller", "subtitlesAndConfig": "Undertekster og konfigurasjon", "seekAndTiming": "Spoling og tidsinnstillinger", - "behavior": "Oppførsel" + "behavior": "Oppførsel", + "exportDialogTitle": "Eksporter Plezy-innstillinger" }, "search": { "hint": "Søk i filmer, serier, musikk...", @@ -491,7 +496,9 @@ "flagExternal": "Ekstern", "flagHearingImpaired": "Hørselshemmet", "flagDub": "Dub", - "flagOriginal": "Original" + "flagOriginal": "Original", + "channelsMono": "Mono", + "dolbyVisionProfile": "Profil ${profile}" }, "mediaMenu": { "markAsWatched": "Merk som sett", @@ -568,7 +575,12 @@ "alphabetNavigation": "Alfabetisk navigasjon", "alphabetScrollHint": "Sveip opp eller ned for å gå én bokstav om gangen", "rowColumnPosition": "Rad ${row} av ${rowCount}, kolonne ${column} av ${columnCount}", - "rowPosition": "Rad ${row} av ${rowCount}" + "rowPosition": "Rad ${row} av ${rowCount}", + "autoScrollPlay": "Start automatisk rulling", + "autoScrollPause": "Sett automatisk rulling på pause", + "hueShort": "H", + "saturationShort": "S", + "valueShort": "V" }, "tooltips": { "shufflePlay": "Tilfeldig avspilling", @@ -666,7 +678,16 @@ "subtitleDownloaded": "Undertekst lastet ned", "subtitleDownloadedNotApplied": "Underteksten ble lastet ned, men kunne ikke velges", "subtitleDownloadFailed": "Kunne ikke laste ned undertekst", - "searchLanguages": "Søk etter språk..." + "searchLanguages": "Søk etter språk...", + "skipIntro": "Hopp over intro", + "skipCredits": "Hopp over rulletekst", + "nextEpisode": "Neste episode", + "subtitleTrack": "Spor ${n}", + "subtitleFile": "Undertekst ${name}", + "forcedTrack": "${label} (tvunget)", + "osdSubtitlesOff": "Undertekster: Av", + "osdSubtitles": "Undertekster: ${track}", + "osdAudio": "Lyd: ${track}" }, "userStatus": {}, "messages": { @@ -722,12 +743,18 @@ "serverLimitBody": "Serverfeil (HTTP 500). En båndbredde-/transkodingsgrense avviste trolig økten. Be eieren justere den.", "mediaUnreadableTitle": "Fil utilgjengelig", "mediaUnreadableBody": "Serveren fant dette elementet, men kunne ikke lese filen (HTTP 404). Filen er sannsynligvis flyttet, slettet, eller lagringen er frakoblet. Be serverens eier om å sjekke filen og skanne biblioteket på nytt.", - "serverBusyTitle": "", - "serverBusyBody": "", + "serverBusyTitle": "Strømmen er utilgjengelig", + "serverBusyBody": "Serveren fortsatte å nekte å strømme denne filen (HTTP 503). Den kan være i ferd med å starte på nytt eller være opptatt, eller lagringsstedet til filen kan være frakoblet. Prøv igjen om litt – hvis det fortsetter å skje, kan du be eieren av serveren om å kontrollere serveren og lagringsstedet til filen.", "logsUploaded": "Logger lastet opp", "logsUploadFailed": "Kunne ikke laste opp logger", "logId": "Logg-ID", - "burnedSubtitlesUseMenu": "" + "burnedSubtitlesUseMenu": "Undertekstene er brent inn i denne strømmen. Endre dem fra undertekstmenyen.", + "noVideoUrl": "Ingen video-URL er tilgjengelig", + "playbackNoMediaSources": "Serveren returnerte ingen avspillbare mediekilder", + "playbackDataNotPrepared": "Avspillingen ble startet før dataene var klare", + "streamSelectionUnavailable": "Valg av strømmer er ikke tilgjengelig for denne kilden", + "streamSelectionFailed": "Kunne ikke bruke de valgte strømmene", + "serverUnavailableForProfile": "Ingen server er tilgjengelig for den aktive profilen" }, "subtitlingStyling": { "text": "Tekst", @@ -746,8 +773,8 @@ "overrideStrip": "Fjern formatering", "positionTop": "Øverst", "positionBottom": "Nederst", - "anchorToScreen": "", - "anchorToScreenDescription": "", + "anchorToScreen": "Forankre til skjermen", + "anchorToScreenDescription": "Vis tekstundertekster i de svarte feltene under video i bredformat", "bold": "Fet", "italic": "Kursiv", "renderResolution": "Gjengivelsesoppløsning", @@ -835,7 +862,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", + "tokenIdentityMismatch": "Plex-profiltokenet ble knyttet til en uventet server" }, "connections": { "sectionTitle": "Tilkoblinger", @@ -872,7 +900,11 @@ "movie": "Film", "tvShow": "TV-serie", "minutesLeft": "${minutes} min igjen", - "moreLikeThis": "Mer som dette" + "moreLikeThis": "Mer som dette", + "titleCount": { + "one": "${n} tittel", + "other": "${n} titler" + } }, "errors": { "searchFailed": "Søk mislyktes: ${error}", @@ -1080,10 +1112,10 @@ "characters": "Figurer", "addToWatchlist": "Legg til i ønskeliste", "removeFromWatchlist": "Fjern fra ønskeliste", - "addedToWatchlist": "", - "removedFromWatchlist": "", + "addedToWatchlist": "Lagt til i overvåkningslisten", + "removedFromWatchlist": "Fjernet fra overvåkningslisten", "watchlistUpdateFailed": "Kunne ikke oppdatere ønskelisten", - "watchlistNoMatch": "", + "watchlistNoMatch": "Kunne ikke koble dette elementet til en overvåkningsliste", "notInLibrary": "Ikke i biblioteket ditt", "inTheseLibraries": "I disse bibliotekene", "checkingLibrary": "Sjekker biblioteket ditt...", @@ -1253,9 +1285,9 @@ "watchChannel": "Se kanal", "favorites": "Favoritter", "reorderFavorites": "Endre rekkefølge på favoritter", - "noFavoriteChannels": "", - "noFavoriteChannelsHint": "", - "showAllChannels": "", + "noFavoriteChannels": "Ingen favorittkanaler", + "noFavoriteChannelsHint": "Vis alle kanaler, og trykk deretter lenge på en kanal for å legge den til i favorittene dine.", + "showAllChannels": "Vis alle kanaler", "favoritesLoadFailed": "Kunne ikke laste inn favoritter. Kontroller tilkoblingen og prøv på nytt.", "favoritesUpdateFailed": "Kunne ikke oppdatere favorittene. Kontroller tilkoblingen og prøv på nytt.", "joinSession": "Bli med i pågående økt", @@ -1294,7 +1326,12 @@ "recordingRuleUpdated": "Opptaksregel oppdatert", "guideReloadRequested": "Oppdatering av programguiden er forespurt", "rulesProcessRequested": "Ny vurdering av reglene er forespurt", - "recordShow": "Ta opp program" + "recordShow": "Ta opp program", + "startingInMinutes": "Starter om ${minutes} min", + "dayAtTime": "${day} kl. ${time}", + "invalidPlaybackData": "${product} returnerte ugyldige avspillingsdata for direkte-TV", + "failedToStartChannel": "Kunne ikke starte direktekanalen", + "failedToBuildStreamUrl": "Kunne ikke opprette strømme-URL-en" }, "collections": { "title": "Samlinger", @@ -1371,7 +1408,9 @@ "nextTrack": "Neste spor", "repeat": "Gjenta", "repeatAll": "Gjenta alle", - "repeatOne": "Gjenta ett spor" + "repeatOne": "Gjenta ett spor", + "instantMixNoServer": "Ingen server er tilgjengelig for en hurtigmiks", + "noAudioUrl": "Ingen lyd-URL er tilgjengelig for ${track}" }, "watchTogether": { "title": "Se sammen", @@ -1438,7 +1477,8 @@ "renameRoom": "Gi nytt navn til rom", "removeRoom": "Fjern", "guestSwitchUnavailable": "Kunne ikke bytte — server ikke tilgjengelig for synkronisering", - "guestSwitchFailed": "Kunne ikke bytte — innhold ble ikke funnet på denne serveren" + "guestSwitchFailed": "Kunne ikke bytte — innhold ble ikke funnet på denne serveren", + "defaultDisplayName": "Bruker" }, "downloads": { "title": "Nedlastinger", @@ -1542,7 +1582,17 @@ "statusUnknown": "Ikke sjekket ennå", "settingsUnavailable": "Kunne ikke åpne systeminnstillingene på denne enheten", "linkUnavailable": "Kunne ikke åpne dontkillmyapp.com på denne enheten" - } + }, + "unknownShow": "Ukjent serie", + "unknownSeason": "Ukjent sesong", + "unknownAlbum": "Ukjent album", + "completedOfTotal": "${completed}/${total} fullført", + "errorFileNotFound": "Filen ble ikke funnet (404)", + "errorDownloadFailed": "Nedlastingen mislyktes", + "errorPostProcessing": "Etterbehandlingen mislyktes: ${error}", + "notificationDownloading": "Laster ned...", + "notificationComplete": "Nedlastingen er fullført", + "notificationPaused": "Nedlastingen er satt på pause" }, "shaders": { "title": "Shadere", @@ -1633,7 +1683,8 @@ "failedToConnectAnyAddress": "Kunne ikke koble til noen adresse", "connectionLostAfterAttempts": "Tilkobling mistet etter ${attempts} forsøk", "connectionLost": "Tilkobling mistet" - } + }, + "closedBeforeAuth": "Tilkoblingen ble lukket før autentisering" }, "videoSettings": { "playbackSpeed": "Avspillingshastighet", @@ -1644,13 +1695,13 @@ "audioSync": "Lydsynkronisering", "subtitleSync": "Undertekstsynkronisering", "hdr": "HDR", - "hdrUnsupported": "", - "hdrToneMapping": "", - "hdrToneMappingCompositor": "", - "hdrToneMappingCompositorDescription": "", - "hdrToneMappingPlayer": "", - "hdrToneMappingPlayerDescription": "", - "hdrToneMappingFailed": "", + "hdrUnsupported": "HDR er ikke tilgjengelig her – denne skrivebordskompositoren eller videoutgangen kan ikke overføre HDR.", + "hdrToneMapping": "HDR-tonekartlegging", + "hdrToneMappingCompositor": "Kompositor", + "hdrToneMappingCompositorDescription": "Send kildens HDR-metadata videre, og la skrivebordskompositoren utføre tonekartleggingen.", + "hdrToneMappingPlayer": "Spiller", + "hdrToneMappingPlayerDescription": "Tilpass til skjermens maksimale lysstyrke i spilleren, og send deretter resultatet til kompositoren.", + "hdrToneMappingFailed": "Kunne ikke endre HDR-tonekartleggingen – den forrige modusen er fortsatt aktiv.", "audioOutput": "Lydutgang", "performanceOverlay": "Ytelsesoverlegg", "audioOutputDolbyAtmos": "Dolby Atmos", @@ -1696,7 +1747,17 @@ "speed": "Hastighet", "player": "Spiller", "memory": "Minne", - "uiFps": "UI FPS" + "uiFps": "UI FPS", + "fps": "FPS", + "decoderAndroidHw": "Android-maskinvare", + "decoderNvidiaHw": "NVIDIA-maskinvare", + "decoderQualcommHw": "Qualcomm-maskinvare", + "decoderMediatekHw": "MediaTek-maskinvare", + "decoderExynosHw": "Exynos-maskinvare", + "decoderSoftware": "Programvare", + "decoderHardware": "Maskinvare", + "tunnelingActive": "Aktiv", + "dvRpuFailed": "${converted} (${failures} mislyktes)" }, "externalPlayer": { "title": "Ekstern spiller", @@ -1854,7 +1915,17 @@ "statusAvailable": "Tilgjengelig", "statusPartiallyAvailable": "Delvis tilgjengelig", "statusRequested": "Forespurt", - "statusProcessing": "Behandler" + "statusProcessing": "Behandler", + "couldNotReach": "Kunne ikke nå ${url}: ${error}", + "noInstanceAtUrl": "Ingen Seerr-instans på ${url} (HTTP ${status})", + "notInitialized": "Denne Seerr-instansen har ikke fullført førstegangsoppsettet", + "noPlexTokenForReauth": "Ingen Plex-token er tilgjengelig for å logge inn på nytt", + "noStoredCredentials": "Ingen lagret påloggingsinformasjon er tilgjengelig for å logge inn på nytt", + "signInRejected": "Innloggingen ble avvist", + "noSessionCookie": "Seerr utstedte ingen øktinformasjonskapsel", + "freshCookieRejected": "Seerr avviste den nye øktinformasjonskapselen", + "noUserInformation": "Seerr returnerte ingen brukerinformasjon", + "sessionRejectedAfterReauth": "Økten ble avvist etter ny innlogging" }, "services": { "title": "Tjenester", @@ -1875,7 +1946,7 @@ }, "deviceCode": { "title": "Aktiver Plezy på ${service}", - "instructions": "", + "instructions": "Skann QR-koden, eller gå til adressen nedenfor og skriv inn denne koden:", "openToActivate": "Åpne ${service} for å aktivere", "copyCode": "Kopier aktiveringskode", "waitingForAuthorization": "Venter på godkjenning…", @@ -1933,6 +2004,24 @@ "connectToMediaBrowserCardSubtitle": "Skriv inn server-URL-en, brukernavnet og passordet ditt.", "connectToMediaBrowserCardSubtitleScoped": "Logg på ${product}-serveren din. Knyttes til ${name}.", "borrowFromAnotherProfile": "Lån fra en annen profil", - "borrowFromAnotherProfileSubtitle": "Gjenbruk en annen profils tilkobling. PIN-beskyttede profiler krever PIN." + "borrowFromAnotherProfileSubtitle": "Gjenbruk en annen profils tilkobling. PIN-beskyttede profiler krever PIN.", + "invalidCredentials": "Ugyldig brukernavn eller passord", + "authResponseNotJson": "Autentiseringssvaret var ikke gyldig JSON", + "quickConnectRejected": "Quick Connect ble avvist av serveren", + "quickConnectNotJson": "Quick Connect-svaret var ikke gyldig JSON", + "quickConnectMissingFields": "Quick Connect-svaret mangler en kode eller hemmelighet", + "quickConnectPollRejected": "Quick Connect-spørringen ble avvist av serveren", + "serverTimedOut": "Serveren svarte ikke i tide", + "responseNotJson": "Serversvaret var ikke gyldig JSON", + "responseMissingIdentity": "Svaret mangler en ID eller et servernavn – er dette en ${product}-server?", + "probeFailed": "Kunne ikke nå serveren: ${error}", + "enterAtLeastOneUrl": "Angi minst én URL til en ${product}-server", + "noReachableServer": "Fant ingen tilgjengelig ${product}-server", + "urlsPointToDifferentServers": "Disse URL-ene peker til forskjellige ${product}-servere", + "urlDoesNotMatchServer": "Denne URL-en samsvarer ikke med ${product}-serveren", + "redirectUnsupported": "Serveren omdirigerte til en URL som ikke støttes", + "redirectDifferentHost": "Serveren omdirigerte til en annen vert. Angi den endelige ${product}-URL-en direkte.", + "redirectInsecure": "Serveren omdirigerte fra HTTPS til en usikker URL", + "redirectUnsupportedEnterFinal": "Serveren omdirigerte til en URL som ikke støttes. Angi den endelige ${product}-URL-en direkte." } } diff --git a/lib/i18n/nl.i18n.json b/lib/i18n/nl.i18n.json index 2c177b01..d3dd06ba 100644 --- a/lib/i18n/nl.i18n.json +++ b/lib/i18n/nl.i18n.json @@ -17,7 +17,8 @@ "quickConnectWaiting": "Wachten op goedkeuring…", "quickConnectCancel": "Annuleren", "quickConnectExpired": "Quick Connect is verlopen. Probeer opnieuw.", - "localDataRecoveryRequired": "Plezy kon lokale aanmeldings- en openstaande afspeelgegevens niet veilig herstellen. Meld je opnieuw aan." + "localDataRecoveryRequired": "Plezy kon lokale aanmeldings- en openstaande afspeelgegevens niet veilig herstellen. Meld je opnieuw aan.", + "pinCheckRejected": "De controle van de Plex-pincode is geweigerd" }, "common": { "cancel": "Annuleren", @@ -77,7 +78,10 @@ "trakt": "Trakt", "rottenTomatoesCritic": "Rotten Tomatoes-critici", "rottenTomatoesAudience": "Rotten Tomatoes-publiek" - } + }, + "notAvailable": "N/A", + "url": "URL", + "letterKeys": "ABC" }, "screens": { "licenses": "Licenties", @@ -323,8 +327,8 @@ "showNavBarLabels": "Labels op navigatiebalk tonen", "showNavBarLabelsDescription": "Tekstlabels onder de pictogrammen op de navigatiebalk weergeven", "startupSection": "Opstartsectie", - "showExploreTab": "", - "showExploreTabDescription": "", + "showExploreTab": "Tabblad Ontdekken tonen", + "showExploreTabDescription": "Toon het tabblad Ontdekken met content uit Plex Discover en gekoppelde trackers", "liveTvDefaultFavorites": "Standaard favoriete zenders", "liveTvDefaultFavoritesDescription": "Toon alleen favoriete zenders bij het openen van Live TV", "display": "Weergave", @@ -335,7 +339,8 @@ "player": "Speler", "subtitlesAndConfig": "Ondertitels en instellingen", "seekAndTiming": "Spoelen en timing", - "behavior": "Gedrag" + "behavior": "Gedrag", + "exportDialogTitle": "Plezy-instellingen exporteren" }, "search": { "hint": "Zoek films, series, muziek...", @@ -491,7 +496,9 @@ "flagExternal": "Extern", "flagHearingImpaired": "Slechthorend", "flagDub": "Nasynchronisatie", - "flagOriginal": "Origineel" + "flagOriginal": "Origineel", + "channelsMono": "Mono", + "dolbyVisionProfile": "Profiel ${profile}" }, "mediaMenu": { "markAsWatched": "Als bekeken markeren", @@ -568,7 +575,12 @@ "alphabetNavigation": "Alfabetische navigatie", "alphabetScrollHint": "Veeg omhoog of omlaag om per letter te bewegen", "rowColumnPosition": "Rij ${row} van ${rowCount}, kolom ${column} van ${columnCount}", - "rowPosition": "Rij ${row} van ${rowCount}" + "rowPosition": "Rij ${row} van ${rowCount}", + "autoScrollPlay": "Automatisch scrollen starten", + "autoScrollPause": "Automatisch scrollen pauzeren", + "hueShort": "H", + "saturationShort": "S", + "valueShort": "V" }, "tooltips": { "shufflePlay": "Willekeurig afspelen", @@ -666,7 +678,16 @@ "subtitleDownloaded": "Ondertitel gedownload", "subtitleDownloadedNotApplied": "De ondertiteling is gedownload, maar kon niet worden geselecteerd", "subtitleDownloadFailed": "Ondertitel downloaden mislukt", - "searchLanguages": "Talen zoeken..." + "searchLanguages": "Talen zoeken...", + "skipIntro": "Intro overslaan", + "skipCredits": "Aftiteling overslaan", + "nextEpisode": "Volgende aflevering", + "subtitleTrack": "Spoor ${n}", + "subtitleFile": "Ondertitel ${name}", + "forcedTrack": "${label} (Geforceerd)", + "osdSubtitlesOff": "Ondertitels: uit", + "osdSubtitles": "Ondertitels: ${track}", + "osdAudio": "Audio: ${track}" }, "userStatus": {}, "messages": { @@ -722,12 +743,18 @@ "serverLimitBody": "Serverfout (HTTP 500). Waarschijnlijk weigerde een bandbreedte-/transcodeerlimiet deze sessie. Vraag de eigenaar dit aan te passen.", "mediaUnreadableTitle": "Bestand niet beschikbaar", "mediaUnreadableBody": "De server heeft dit item gevonden maar kon het bestand niet lezen (HTTP 404). Het bestand is waarschijnlijk verplaatst of verwijderd, of de opslag is offline. Vraag de serverbeheerder om het bestand te controleren en de bibliotheek opnieuw te scannen.", - "serverBusyTitle": "", - "serverBusyBody": "", + "serverBusyTitle": "Stream niet beschikbaar", + "serverBusyBody": "De server bleef weigeren dit bestand te streamen (HTTP 503). Mogelijk wordt de server opnieuw opgestart, is deze bezet of is de opslag van het bestand offline. Probeer het over een moment opnieuw — als dit blijft gebeuren, vraag dan de servereigenaar om de server en de opslag van het bestand te controleren.", "logsUploaded": "Logbestanden geüpload", "logsUploadFailed": "Uploaden van logbestanden mislukt", "logId": "Logboek-ID", - "burnedSubtitlesUseMenu": "" + "burnedSubtitlesUseMenu": "De ondertitels zijn in deze stream ingebrand. Wijzig ze via het ondertitelmenu.", + "noVideoUrl": "Geen video-URL beschikbaar", + "playbackNoMediaSources": "De server heeft geen afspeelbare mediabronnen geretourneerd", + "playbackDataNotPrepared": "Het afspelen is gestart voordat de gegevens gereed waren", + "streamSelectionUnavailable": "Streamselectie is niet beschikbaar voor deze bron", + "streamSelectionFailed": "Kon de geselecteerde streams niet toepassen", + "serverUnavailableForProfile": "Er is geen server beschikbaar voor het actieve profiel" }, "subtitlingStyling": { "text": "Tekst", @@ -746,8 +773,8 @@ "overrideStrip": "Opmaak verwijderen", "positionTop": "Bovenaan", "positionBottom": "Onderaan", - "anchorToScreen": "", - "anchorToScreenDescription": "", + "anchorToScreen": "Aan scherm verankeren", + "anchorToScreenDescription": "Toon tekstondertitels in de zwarte balken onder breedbeeldvideo", "bold": "Vet", "italic": "Cursief", "renderResolution": "Renderresolutie", @@ -835,7 +862,8 @@ "pinProtectionOptional": "Pincodebeveiliging (optioneel)", "pinExplain": "Een viercijferige pincode is vereist om van profiel te wisselen.", "continueButton": "Doorgaan", - "pinsDontMatch": "De pincodes komen niet overeen" + "pinsDontMatch": "De pincodes komen niet overeen", + "tokenIdentityMismatch": "Het token van het Plex-profiel bleek bij een onverwachte server te horen" }, "connections": { "sectionTitle": "Verbindingen", @@ -872,7 +900,11 @@ "movie": "Film", "tvShow": "Tv-serie", "minutesLeft": "nog ${minutes} min", - "moreLikeThis": "Meer zoals dit" + "moreLikeThis": "Meer zoals dit", + "titleCount": { + "one": "${n} titel", + "other": "${n} titels" + } }, "errors": { "searchFailed": "Zoeken mislukt: ${error}", @@ -1080,10 +1112,10 @@ "characters": "Personages", "addToWatchlist": "Toevoegen aan kijklijst", "removeFromWatchlist": "Verwijderen uit kijklijst", - "addedToWatchlist": "", - "removedFromWatchlist": "", + "addedToWatchlist": "Aan kijklijst toegevoegd", + "removedFromWatchlist": "Uit kijklijst verwijderd", "watchlistUpdateFailed": "Kon kijklijst niet bijwerken", - "watchlistNoMatch": "", + "watchlistNoMatch": "Kon dit item niet aan een kijklijst koppelen", "notInLibrary": "Niet in je bibliotheek", "inTheseLibraries": "In deze bibliotheken", "checkingLibrary": "Je bibliotheek controleren...", @@ -1253,9 +1285,9 @@ "watchChannel": "Kanaal bekijken", "favorites": "Favorieten", "reorderFavorites": "Favorieten herordenen", - "noFavoriteChannels": "", - "noFavoriteChannelsHint": "", - "showAllChannels": "", + "noFavoriteChannels": "Geen favoriete zenders", + "noFavoriteChannelsHint": "Toon alle zenders en houd daarna een zender ingedrukt om deze aan je favorieten toe te voegen.", + "showAllChannels": "Alle zenders tonen", "favoritesLoadFailed": "Favorieten konden niet worden geladen. Controleer je verbinding en probeer het opnieuw.", "favoritesUpdateFailed": "Favorieten konden niet worden bijgewerkt. Controleer je verbinding en probeer het opnieuw.", "joinSession": "Deelnemen aan lopende sessie", @@ -1294,7 +1326,12 @@ "recordingRuleUpdated": "Opnameregel bijgewerkt", "guideReloadRequested": "Vernieuwing van de gids aangevraagd", "rulesProcessRequested": "Nieuwe evaluatie van regels aangevraagd", - "recordShow": "Programma opnemen" + "recordShow": "Programma opnemen", + "startingInMinutes": "Begint over ${minutes} min", + "dayAtTime": "${day} om ${time}", + "invalidPlaybackData": "${product} heeft ongeldige afspeelgegevens voor Live-tv geretourneerd", + "failedToStartChannel": "Kon de livezender niet starten", + "failedToBuildStreamUrl": "Kon de stream-URL niet samenstellen" }, "collections": { "title": "Collecties", @@ -1371,7 +1408,9 @@ "nextTrack": "Volgend nummer", "repeat": "Herhalen", "repeatAll": "Alles herhalen", - "repeatOne": "Eén herhalen" + "repeatOne": "Eén herhalen", + "instantMixNoServer": "Er is geen server beschikbaar voor een instantmix", + "noAudioUrl": "Er is geen audio-URL beschikbaar voor ${track}" }, "watchTogether": { "title": "Samen kijken", @@ -1438,7 +1477,8 @@ "renameRoom": "Kamer hernoemen", "removeRoom": "Verwijderen", "guestSwitchUnavailable": "Kon niet schakelen — server niet beschikbaar voor synchronisatie", - "guestSwitchFailed": "Kon niet schakelen — inhoud niet gevonden op deze server" + "guestSwitchFailed": "Kon niet schakelen — inhoud niet gevonden op deze server", + "defaultDisplayName": "Gebruiker" }, "downloads": { "title": "Downloads", @@ -1542,7 +1582,17 @@ "statusUnknown": "Nog niet gecontroleerd", "settingsUnavailable": "Kan de systeeminstellingen niet openen op dit apparaat", "linkUnavailable": "Kan dontkillmyapp.com niet openen op dit apparaat" - } + }, + "unknownShow": "Onbekende serie", + "unknownSeason": "Onbekend seizoen", + "unknownAlbum": "Onbekend album", + "completedOfTotal": "${completed}/${total} voltooid", + "errorFileNotFound": "Bestand niet gevonden (404)", + "errorDownloadFailed": "Download mislukt", + "errorPostProcessing": "Nabewerking mislukt: ${error}", + "notificationDownloading": "Downloaden...", + "notificationComplete": "Download voltooid", + "notificationPaused": "Download gepauzeerd" }, "shaders": { "title": "Shaders", @@ -1633,7 +1683,8 @@ "failedToConnectAnyAddress": "Er kon met geen enkel adres verbinding worden gemaakt", "connectionLostAfterAttempts": "Verbinding verbroken na ${attempts} pogingen", "connectionLost": "Verbinding verloren" - } + }, + "closedBeforeAuth": "De verbinding is vóór de authenticatie gesloten" }, "videoSettings": { "playbackSpeed": "Afspeelsnelheid", @@ -1644,13 +1695,13 @@ "audioSync": "Audiosynchronisatie", "subtitleSync": "Ondertitelsynchronisatie", "hdr": "HDR", - "hdrUnsupported": "", - "hdrToneMapping": "", - "hdrToneMappingCompositor": "", - "hdrToneMappingCompositorDescription": "", - "hdrToneMappingPlayer": "", - "hdrToneMappingPlayerDescription": "", - "hdrToneMappingFailed": "", + "hdrUnsupported": "HDR is hier niet beschikbaar — deze desktopcompositor of video-uitvoer kan HDR niet doorgeven.", + "hdrToneMapping": "HDR-tonemapping", + "hdrToneMappingCompositor": "Compositor", + "hdrToneMappingCompositorDescription": "Geef de HDR-metadata van de bron ongewijzigd door en laat de desktopcompositor de mapping uitvoeren.", + "hdrToneMappingPlayer": "Speler", + "hdrToneMappingPlayerDescription": "Laat de speler de mapping naar de piekhelderheid van het scherm uitvoeren en geef het resultaat vervolgens door aan de compositor.", + "hdrToneMappingFailed": "Kon HDR-tonemapping niet wijzigen — de vorige modus is nog actief.", "audioOutput": "Audio-uitvoer", "performanceOverlay": "Prestatie-overlay", "audioOutputDolbyAtmos": "Dolby Atmos", @@ -1696,7 +1747,17 @@ "speed": "Snelheid", "player": "Speler", "memory": "Geheugen", - "uiFps": "UI FPS" + "uiFps": "UI FPS", + "fps": "FPS", + "decoderAndroidHw": "Android HW", + "decoderNvidiaHw": "NVIDIA HW", + "decoderQualcommHw": "Qualcomm HW", + "decoderMediatekHw": "MediaTek HW", + "decoderExynosHw": "Exynos HW", + "decoderSoftware": "Software", + "decoderHardware": "Hardware", + "tunnelingActive": "Actief", + "dvRpuFailed": "${converted} (${failures} mislukt)" }, "externalPlayer": { "title": "Externe speler", @@ -1854,7 +1915,17 @@ "statusAvailable": "Beschikbaar", "statusPartiallyAvailable": "Gedeeltelijk beschikbaar", "statusRequested": "Aangevraagd", - "statusProcessing": "Verwerken" + "statusProcessing": "Verwerken", + "couldNotReach": "Kon ${url} niet bereiken: ${error}", + "noInstanceAtUrl": "Geen Seerr-instantie op ${url} (HTTP ${status})", + "notInitialized": "De eerste configuratie van deze Seerr-instantie is niet voltooid", + "noPlexTokenForReauth": "Er is geen Plex-token beschikbaar om opnieuw in te loggen", + "noStoredCredentials": "Er zijn geen opgeslagen inloggegevens beschikbaar om opnieuw in te loggen", + "signInRejected": "Inloggen is geweigerd", + "noSessionCookie": "Seerr heeft geen sessiecookie verstrekt", + "freshCookieRejected": "Seerr heeft de nieuwe sessiecookie geweigerd", + "noUserInformation": "Seerr heeft geen gebruikersgegevens geretourneerd", + "sessionRejectedAfterReauth": "De sessie is na het opnieuw inloggen geweigerd" }, "services": { "title": "Diensten", @@ -1875,7 +1946,7 @@ }, "deviceCode": { "title": "Plezy activeren op ${service}", - "instructions": "", + "instructions": "Scan de QR-code of ga naar het onderstaande adres en voer deze code in:", "openToActivate": "Open ${service} om te activeren", "copyCode": "Activeringscode kopiëren", "waitingForAuthorization": "Wachten op autorisatie…", @@ -1933,6 +2004,24 @@ "connectToMediaBrowserCardSubtitle": "Voer je server-URL, gebruikersnaam en wachtwoord in.", "connectToMediaBrowserCardSubtitleScoped": "Meld je aan bij je ${product}-server. Wordt gekoppeld aan ${name}.", "borrowFromAnotherProfile": "Van een ander profiel lenen", - "borrowFromAnotherProfileSubtitle": "Hergebruik de verbinding van een ander profiel. Voor profielen met pincodebeveiliging is een pincode vereist." + "borrowFromAnotherProfileSubtitle": "Hergebruik de verbinding van een ander profiel. Voor profielen met pincodebeveiliging is een pincode vereist.", + "invalidCredentials": "Ongeldige gebruikersnaam of ongeldig wachtwoord", + "authResponseNotJson": "Het authenticatieantwoord was geen geldige JSON", + "quickConnectRejected": "Quick Connect is door de server geweigerd", + "quickConnectNotJson": "Het Quick Connect-antwoord was geen geldige JSON", + "quickConnectMissingFields": "In het Quick Connect-antwoord ontbreekt een code of geheim", + "quickConnectPollRejected": "Quick Connect-polling is door de server geweigerd", + "serverTimedOut": "De server heeft niet op tijd gereageerd", + "responseNotJson": "Het serverantwoord was geen geldige JSON", + "responseMissingIdentity": "In het antwoord ontbreekt een ID of servernaam — is dit een ${product}-server?", + "probeFailed": "Kon de server niet bereiken: ${error}", + "enterAtLeastOneUrl": "Voer ten minste één URL van een ${product}-server in", + "noReachableServer": "Er is geen bereikbare ${product}-server gevonden", + "urlsPointToDifferentServers": "Deze URL's verwijzen naar verschillende ${product}-servers", + "urlDoesNotMatchServer": "Deze URL komt niet overeen met de ${product}-server", + "redirectUnsupported": "De server heeft doorgestuurd naar een niet-ondersteunde URL", + "redirectDifferentHost": "De server heeft doorgestuurd naar een andere host. Voer de uiteindelijke ${product}-URL rechtstreeks in.", + "redirectInsecure": "De server heeft van HTTPS doorgestuurd naar een onbeveiligde URL", + "redirectUnsupportedEnterFinal": "De server heeft doorgestuurd naar een niet-ondersteunde URL. Voer de uiteindelijke ${product}-URL rechtstreeks in." } } diff --git a/lib/i18n/pl.i18n.json b/lib/i18n/pl.i18n.json index 26113796..727c5619 100644 --- a/lib/i18n/pl.i18n.json +++ b/lib/i18n/pl.i18n.json @@ -17,7 +17,8 @@ "quickConnectWaiting": "Oczekiwanie na zatwierdzenie…", "quickConnectCancel": "Anuluj", "quickConnectExpired": "Quick Connect wygasł. Spróbuj ponownie.", - "localDataRecoveryRequired": "Plezy nie mogło bezpiecznie odzyskać lokalnych danych logowania ani oczekujących danych odtwarzania. Zaloguj się ponownie." + "localDataRecoveryRequired": "Plezy nie mogło bezpiecznie odzyskać lokalnych danych logowania ani oczekujących danych odtwarzania. Zaloguj się ponownie.", + "pinCheckRejected": "Sprawdzenie kodu PIN Plex zostało odrzucone" }, "common": { "cancel": "Anuluj", @@ -77,7 +78,10 @@ "trakt": "Trakt", "rottenTomatoesCritic": "Krytycy Rotten Tomatoes", "rottenTomatoesAudience": "Widzowie Rotten Tomatoes" - } + }, + "notAvailable": "N/D", + "url": "URL", + "letterKeys": "ABC" }, "screens": { "licenses": "Licencje", @@ -323,8 +327,8 @@ "showNavBarLabels": "Pokaż etykiety paska nawigacji", "showNavBarLabelsDescription": "Wyświetl tekstowe etykiety pod ikonami paska nawigacji", "startupSection": "Sekcja startowa", - "showExploreTab": "", - "showExploreTabDescription": "", + "showExploreTab": "Pokaż kartę Odkryj", + "showExploreTabDescription": "Wyświetlaj kartę Odkryj z treściami z Plex Discover i połączonych serwisów śledzących", "liveTvDefaultFavorites": "Domyślnie ulubione kanały", "liveTvDefaultFavoritesDescription": "Pokaż tylko ulubione kanały po otwarciu telewizji na żywo", "display": "Ekran", @@ -335,7 +339,8 @@ "player": "Odtwarzacz", "subtitlesAndConfig": "Napisy i konfiguracja", "seekAndTiming": "Przewijanie i czas", - "behavior": "Zachowanie" + "behavior": "Zachowanie", + "exportDialogTitle": "Eksport ustawień Plezy" }, "search": { "hint": "Szukaj filmów, seriali, muzyki...", @@ -491,7 +496,9 @@ "flagExternal": "Zewnętrzne", "flagHearingImpaired": "Dla niesłyszących", "flagDub": "Dubbing", - "flagOriginal": "Oryginalna" + "flagOriginal": "Oryginalna", + "channelsMono": "Mono", + "dolbyVisionProfile": "Profil ${profile}" }, "mediaMenu": { "markAsWatched": "Oznacz jako obejrzane", @@ -574,7 +581,12 @@ "alphabetNavigation": "Nawigacja alfabetyczna", "alphabetScrollHint": "Przesuń w górę lub w dół, aby przejść o literę", "rowColumnPosition": "Wiersz ${row} z ${rowCount}, kolumna ${column} z ${columnCount}", - "rowPosition": "Wiersz ${row} z ${rowCount}" + "rowPosition": "Wiersz ${row} z ${rowCount}", + "autoScrollPlay": "Uruchom automatyczne przewijanie", + "autoScrollPause": "Wstrzymaj automatyczne przewijanie", + "hueShort": "H", + "saturationShort": "S", + "valueShort": "V" }, "tooltips": { "shufflePlay": "Odtwarzanie losowe", @@ -672,7 +684,16 @@ "subtitleDownloaded": "Napisy pobrane", "subtitleDownloadedNotApplied": "Napisy zostały pobrane, ale nie można ich było wybrać", "subtitleDownloadFailed": "Nie udało się pobrać napisów", - "searchLanguages": "Szukaj języków..." + "searchLanguages": "Szukaj języków...", + "skipIntro": "Pomiń intro", + "skipCredits": "Pomiń napisy końcowe", + "nextEpisode": "Następny odcinek", + "subtitleTrack": "Ścieżka ${n}", + "subtitleFile": "Napisy ${name}", + "forcedTrack": "${label} (wymuszone)", + "osdSubtitlesOff": "Napisy: wył.", + "osdSubtitles": "Napisy: ${track}", + "osdAudio": "Audio: ${track}" }, "userStatus": {}, "messages": { @@ -730,12 +751,18 @@ "serverLimitBody": "Błąd serwera (HTTP 500). Limit przepustowości/transkodowania prawdopodobnie odrzucił tę sesję. Poproś właściciela o zmianę.", "mediaUnreadableTitle": "Plik niedostępny", "mediaUnreadableBody": "Serwer znalazł ten element, ale nie mógł odczytać jego pliku (HTTP 404). Plik został prawdopodobnie przeniesiony, usunięty albo jego pamięć masowa jest niedostępna. Poproś właściciela serwera o sprawdzenie pliku i ponowne przeskanowanie biblioteki.", - "serverBusyTitle": "", - "serverBusyBody": "", + "serverBusyTitle": "Strumień niedostępny", + "serverBusyBody": "Serwer wielokrotnie odmawiał strumieniowania tego pliku (HTTP 503). Być może jest ponownie uruchamiany lub zajęty albo magazyn danych zawierający plik jest offline. Spróbuj ponownie za chwilę — jeśli problem będzie się powtarzać, poproś właściciela serwera o sprawdzenie serwera i magazynu danych zawierającego plik.", "logsUploaded": "Logi przesłane", "logsUploadFailed": "Nie udało się przesłać logów", "logId": "ID logu", - "burnedSubtitlesUseMenu": "" + "burnedSubtitlesUseMenu": "Napisy są wtopione w ten strumień. Zmień je w menu napisów.", + "noVideoUrl": "Brak dostępnego adresu URL wideo", + "playbackNoMediaSources": "Serwer nie zwrócił żadnych możliwych do odtworzenia źródeł multimediów", + "playbackDataNotPrepared": "Odtwarzanie rozpoczęło się, zanim dane były gotowe", + "streamSelectionUnavailable": "Wybór strumieni nie jest dostępny dla tego źródła", + "streamSelectionFailed": "Nie udało się zastosować wybranych strumieni", + "serverUnavailableForProfile": "Brak dostępnego serwera dla aktywnego profilu" }, "subtitlingStyling": { "text": "Tekst", @@ -754,8 +781,8 @@ "overrideStrip": "Usuń style", "positionTop": "Góra", "positionBottom": "Dół", - "anchorToScreen": "", - "anchorToScreenDescription": "", + "anchorToScreen": "Zakotwicz na ekranie", + "anchorToScreenDescription": "Wyświetlaj napisy tekstowe na czarnych pasach poniżej obrazu panoramicznego", "bold": "Pogrubienie", "italic": "Kursywa", "renderResolution": "Rozdzielczość renderowania", @@ -843,7 +870,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ą", + "tokenIdentityMismatch": "Token profilu Plex został powiązany z nieoczekiwanym serwerem" }, "connections": { "sectionTitle": "Połączenia", @@ -880,7 +908,13 @@ "movie": "Film", "tvShow": "Serial TV", "minutesLeft": "Pozostało ${minutes} min", - "moreLikeThis": "Więcej podobnych" + "moreLikeThis": "Więcej podobnych", + "titleCount": { + "one": "${n} tytuł", + "few": "${n} tytuły", + "many": "${n} tytułów", + "other": "${n} tytułu" + } }, "errors": { "searchFailed": "Wyszukiwanie nie powiodło się: ${error}", @@ -1090,10 +1124,10 @@ "characters": "Postacie", "addToWatchlist": "Dodaj do listy do obejrzenia", "removeFromWatchlist": "Usuń z listy do obejrzenia", - "addedToWatchlist": "", - "removedFromWatchlist": "", + "addedToWatchlist": "Dodano do listy do obejrzenia", + "removedFromWatchlist": "Usunięto z listy do obejrzenia", "watchlistUpdateFailed": "Nie udało się zaktualizować listy do obejrzenia", - "watchlistNoMatch": "", + "watchlistNoMatch": "Nie udało się dopasować tej pozycji do listy do obejrzenia", "notInLibrary": "Nie ma tego w Twojej bibliotece", "inTheseLibraries": "W tych bibliotekach", "checkingLibrary": "Sprawdzanie Twojej biblioteki...", @@ -1269,9 +1303,9 @@ "watchChannel": "Oglądaj kanał", "favorites": "Ulubione", "reorderFavorites": "Zmień kolejność ulubionych", - "noFavoriteChannels": "", - "noFavoriteChannelsHint": "", - "showAllChannels": "", + "noFavoriteChannels": "Brak ulubionych kanałów", + "noFavoriteChannelsHint": "Pokaż wszystkie kanały, a następnie naciśnij i przytrzymaj kanał, aby dodać go do ulubionych.", + "showAllChannels": "Pokaż wszystkie kanały", "favoritesLoadFailed": "Nie udało się wczytać ulubionych. Sprawdź połączenie i spróbuj ponownie.", "favoritesUpdateFailed": "Nie udało się zaktualizować ulubionych. Sprawdź połączenie i spróbuj ponownie.", "joinSession": "Dołącz do trwającej sesji", @@ -1310,7 +1344,12 @@ "recordingRuleUpdated": "Reguła nagrywania zaktualizowana", "guideReloadRequested": "Zażądano odświeżenia przewodnika", "rulesProcessRequested": "Zażądano ponownej oceny reguł", - "recordShow": "Nagraj program" + "recordShow": "Nagraj program", + "startingInMinutes": "Rozpocznie się za ${minutes} min", + "dayAtTime": "${day} o ${time}", + "invalidPlaybackData": "${product} zwrócił nieprawidłowe dane odtwarzania TV na żywo", + "failedToStartChannel": "Nie udało się uruchomić kanału na żywo", + "failedToBuildStreamUrl": "Nie udało się utworzyć adresu URL strumienia" }, "collections": { "title": "Kolekcje", @@ -1389,7 +1428,9 @@ "nextTrack": "Następny utwór", "repeat": "Powtarzaj", "repeatAll": "Powtarzaj wszystko", - "repeatOne": "Powtarzaj jeden" + "repeatOne": "Powtarzaj jeden", + "instantMixNoServer": "Brak dostępnego serwera dla szybkiego miksu", + "noAudioUrl": "Brak dostępnego adresu URL audio dla utworu ${track}" }, "watchTogether": { "title": "Oglądaj razem", @@ -1456,7 +1497,8 @@ "renameRoom": "Zmień nazwę pokoju", "removeRoom": "Usuń", "guestSwitchUnavailable": "Nie można przełączyć — serwer niedostępny do synchronizacji", - "guestSwitchFailed": "Nie można przełączyć — nie znaleziono treści na tym serwerze" + "guestSwitchFailed": "Nie można przełączyć — nie znaleziono treści na tym serwerze", + "defaultDisplayName": "Użytkownik" }, "downloads": { "title": "Pobrania", @@ -1560,7 +1602,17 @@ "statusUnknown": "Jeszcze nie sprawdzono", "settingsUnavailable": "Nie udało się otworzyć ustawień systemowych na tym urządzeniu", "linkUnavailable": "Nie udało się otworzyć dontkillmyapp.com na tym urządzeniu" - } + }, + "unknownShow": "Nieznany serial", + "unknownSeason": "Nieznany sezon", + "unknownAlbum": "Nieznany album", + "completedOfTotal": "Ukończono ${completed}/${total}", + "errorFileNotFound": "Nie znaleziono pliku (404)", + "errorDownloadFailed": "Pobieranie nie powiodło się", + "errorPostProcessing": "Przetwarzanie końcowe nie powiodło się: ${error}", + "notificationDownloading": "Pobieranie...", + "notificationComplete": "Pobieranie zakończone", + "notificationPaused": "Pobieranie wstrzymane" }, "shaders": { "title": "Shadery", @@ -1651,7 +1703,8 @@ "failedToConnectAnyAddress": "Nie udało się połączyć z żadnym adresem", "connectionLostAfterAttempts": "Połączenie utracone po ${attempts} próbach", "connectionLost": "Połączenie utracone" - } + }, + "closedBeforeAuth": "Połączenie zostało zamknięte przed uwierzytelnieniem" }, "videoSettings": { "playbackSpeed": "Prędkość odtwarzania", @@ -1662,13 +1715,13 @@ "audioSync": "Synchronizacja audio", "subtitleSync": "Synchronizacja napisów", "hdr": "HDR", - "hdrUnsupported": "", - "hdrToneMapping": "", - "hdrToneMappingCompositor": "", - "hdrToneMappingCompositorDescription": "", - "hdrToneMappingPlayer": "", - "hdrToneMappingPlayerDescription": "", - "hdrToneMappingFailed": "", + "hdrUnsupported": "HDR nie jest tutaj dostępny — ten kompozytor pulpitu lub wyjście wideo nie może go przesyłać.", + "hdrToneMapping": "Mapowanie tonów HDR", + "hdrToneMappingCompositor": "Kompozytor", + "hdrToneMappingCompositorDescription": "Przekazuj metadane HDR źródła bez zmian i pozwól kompozytorowi pulpitu je zmapować.", + "hdrToneMappingPlayer": "Odtwarzacz", + "hdrToneMappingPlayerDescription": "Mapuj w odtwarzaczu do szczytowej jasności wyświetlacza, a następnie przekaż kompozytorowi informację o wyniku.", + "hdrToneMappingFailed": "Nie udało się zmienić mapowania tonów HDR — poprzedni tryb nadal jest aktywny.", "audioOutput": "Wyjście audio", "performanceOverlay": "Nakładka wydajności", "audioOutputDolbyAtmos": "Dolby Atmos", @@ -1714,7 +1767,17 @@ "speed": "Szybkość", "player": "Odtwarzacz", "memory": "Pamięć", - "uiFps": "UI FPS" + "uiFps": "UI FPS", + "fps": "FPS", + "decoderAndroidHw": "Android (sprzętowy)", + "decoderNvidiaHw": "NVIDIA (sprzętowy)", + "decoderQualcommHw": "Qualcomm (sprzętowy)", + "decoderMediatekHw": "MediaTek (sprzętowy)", + "decoderExynosHw": "Exynos (sprzętowy)", + "decoderSoftware": "Programowy", + "decoderHardware": "Sprzętowy", + "tunnelingActive": "Aktywne", + "dvRpuFailed": "${converted} (niepowodzenia: ${failures})" }, "externalPlayer": { "title": "Zewnętrzny odtwarzacz", @@ -1872,7 +1935,17 @@ "statusAvailable": "Dostępne", "statusPartiallyAvailable": "Częściowo dostępne", "statusRequested": "Zamówione", - "statusProcessing": "Przetwarzanie" + "statusProcessing": "Przetwarzanie", + "couldNotReach": "Nie udało się połączyć z ${url}: ${error}", + "noInstanceAtUrl": "Pod adresem ${url} nie ma instancji Seerr (HTTP ${status})", + "notInitialized": "Ta instancja Seerr nie ukończyła konfiguracji początkowej", + "noPlexTokenForReauth": "Brak tokenu Plex umożliwiającego ponowne zalogowanie", + "noStoredCredentials": "Brak zapisanych danych logowania umożliwiających ponowne zalogowanie", + "signInRejected": "Logowanie zostało odrzucone", + "noSessionCookie": "Seerr nie utworzył pliku cookie sesji", + "freshCookieRejected": "Seerr odrzucił nowy plik cookie sesji", + "noUserInformation": "Seerr nie zwrócił informacji o użytkowniku", + "sessionRejectedAfterReauth": "Sesja została odrzucona po ponownym zalogowaniu" }, "services": { "title": "Usługi", @@ -1893,7 +1966,7 @@ }, "deviceCode": { "title": "Aktywuj Plezy w ${service}", - "instructions": "", + "instructions": "Zeskanuj kod QR albo przejdź pod poniższy adres i wprowadź ten kod:", "openToActivate": "Otwórz ${service}, aby aktywować", "copyCode": "Skopiuj kod aktywacyjny", "waitingForAuthorization": "Oczekiwanie na autoryzację…", @@ -1951,6 +2024,24 @@ "connectToMediaBrowserCardSubtitle": "Podaj adres URL serwera, nazwę użytkownika i hasło.", "connectToMediaBrowserCardSubtitleScoped": "Zaloguj się do serwera ${product}. Powiązane z ${name}.", "borrowFromAnotherProfile": "Pożycz z innego profilu", - "borrowFromAnotherProfileSubtitle": "Użyj połączenia innego profilu. Profile chronione PIN-em wymagają podania PIN-u." + "borrowFromAnotherProfileSubtitle": "Użyj połączenia innego profilu. Profile chronione PIN-em wymagają podania PIN-u.", + "invalidCredentials": "Nieprawidłowa nazwa użytkownika lub hasło", + "authResponseNotJson": "Odpowiedź uwierzytelniania ma nieprawidłowy format JSON", + "quickConnectRejected": "Quick Connect został odrzucony przez serwer", + "quickConnectNotJson": "Odpowiedź Quick Connect ma nieprawidłowy format JSON", + "quickConnectMissingFields": "W odpowiedzi Quick Connect brakuje kodu lub sekretu", + "quickConnectPollRejected": "Odpytywanie Quick Connect zostało odrzucone przez serwer", + "serverTimedOut": "Serwer nie odpowiedział w wymaganym czasie", + "responseNotJson": "Odpowiedź serwera ma nieprawidłowy format JSON", + "responseMissingIdentity": "W odpowiedzi brakuje identyfikatora lub nazwy serwera — czy to serwer ${product}?", + "probeFailed": "Nie udało się połączyć z serwerem: ${error}", + "enterAtLeastOneUrl": "Wprowadź co najmniej jeden adres URL serwera ${product}", + "noReachableServer": "Nie znaleziono żadnego osiągalnego serwera ${product}", + "urlsPointToDifferentServers": "Te adresy URL wskazują różne serwery ${product}", + "urlDoesNotMatchServer": "Ten adres URL nie odpowiada serwerowi ${product}", + "redirectUnsupported": "Serwer przekierował do nieobsługiwanego adresu URL", + "redirectDifferentHost": "Serwer przekierował do innego hosta. Wprowadź bezpośrednio docelowy adres URL serwera ${product}.", + "redirectInsecure": "Serwer przekierował z HTTPS do niezabezpieczonego adresu URL", + "redirectUnsupportedEnterFinal": "Serwer przekierował do nieobsługiwanego adresu URL. Wprowadź bezpośrednio docelowy adres URL serwera ${product}." } } diff --git a/lib/i18n/pt.i18n.json b/lib/i18n/pt.i18n.json index 4071489c..8c4c4065 100644 --- a/lib/i18n/pt.i18n.json +++ b/lib/i18n/pt.i18n.json @@ -17,7 +17,8 @@ "quickConnectWaiting": "Aguardando aprovação…", "quickConnectCancel": "Cancelar", "quickConnectExpired": "Quick Connect expirou. Tente novamente.", - "localDataRecoveryRequired": "O Plezy não conseguiu recuperar com segurança os dados locais de acesso e de reproduções pendentes. Entre novamente." + "localDataRecoveryRequired": "O Plezy não conseguiu recuperar com segurança os dados locais de acesso e de reproduções pendentes. Entre novamente.", + "pinCheckRejected": "A verificação do PIN do Plex foi rejeitada" }, "common": { "cancel": "Cancelar", @@ -77,7 +78,10 @@ "trakt": "Trakt", "rottenTomatoesCritic": "Críticos do Rotten Tomatoes", "rottenTomatoesAudience": "Público do Rotten Tomatoes" - } + }, + "notAvailable": "N/D", + "url": "URL", + "letterKeys": "ABC" }, "screens": { "licenses": "Licenças", @@ -323,8 +327,8 @@ "showNavBarLabels": "Mostrar Rótulos da Barra de Navegação", "showNavBarLabelsDescription": "Exibir rótulos de texto sob os ícones da barra de navegação", "startupSection": "Seção inicial", - "showExploreTab": "", - "showExploreTabDescription": "", + "showExploreTab": "Mostrar aba Explorar", + "showExploreTabDescription": "Exibir a aba Explorar com conteúdo do Plex Discover e dos rastreadores conectados", "liveTvDefaultFavorites": "Canais favoritos por padrão", "liveTvDefaultFavoritesDescription": "Mostrar apenas os canais favoritos ao abrir a TV ao vivo", "display": "Tela", @@ -335,7 +339,8 @@ "player": "Reprodutor", "subtitlesAndConfig": "Legendas e configuração", "seekAndTiming": "Busca e tempo", - "behavior": "Comportamento" + "behavior": "Comportamento", + "exportDialogTitle": "Exportar configurações do Plezy" }, "search": { "hint": "Buscar filmes, séries, músicas...", @@ -491,7 +496,9 @@ "flagExternal": "Externa", "flagHearingImpaired": "Deficiência auditiva", "flagDub": "Dublada", - "flagOriginal": "Original" + "flagOriginal": "Original", + "channelsMono": "Mono", + "dolbyVisionProfile": "Perfil ${profile}" }, "mediaMenu": { "markAsWatched": "Marcar como Assistido", @@ -568,7 +575,12 @@ "alphabetNavigation": "Navegação alfabética", "alphabetScrollHint": "Deslize para cima ou para baixo para avançar por letra", "rowColumnPosition": "Linha ${row} de ${rowCount}, coluna ${column} de ${columnCount}", - "rowPosition": "Linha ${row} de ${rowCount}" + "rowPosition": "Linha ${row} de ${rowCount}", + "autoScrollPlay": "Iniciar rolagem automática", + "autoScrollPause": "Pausar rolagem automática", + "hueShort": "M", + "saturationShort": "S", + "valueShort": "V" }, "tooltips": { "shufflePlay": "Reprodução aleatória", @@ -666,7 +678,16 @@ "subtitleDownloaded": "Legenda baixada", "subtitleDownloadedNotApplied": "A legenda foi baixada, mas não foi possível selecioná-la", "subtitleDownloadFailed": "Falha ao baixar legenda", - "searchLanguages": "Pesquisar idiomas..." + "searchLanguages": "Pesquisar idiomas...", + "skipIntro": "Pular abertura", + "skipCredits": "Pular créditos", + "nextEpisode": "Próximo episódio", + "subtitleTrack": "Faixa ${n}", + "subtitleFile": "Legenda ${name}", + "forcedTrack": "${label} (Forçada)", + "osdSubtitlesOff": "Legendas: desativadas", + "osdSubtitles": "Legendas: ${track}", + "osdAudio": "Áudio: ${track}" }, "userStatus": {}, "messages": { @@ -722,12 +743,18 @@ "serverLimitBody": "Erro do servidor (HTTP 500). Um limite de largura de banda ou transcodificação provavelmente rejeitou esta sessão. Peça ao proprietário do servidor para ajustá-lo.", "mediaUnreadableTitle": "Arquivo indisponível", "mediaUnreadableBody": "O servidor encontrou este item, mas não conseguiu ler o arquivo (HTTP 404). O arquivo provavelmente foi movido, excluído ou o armazenamento está offline. Peça ao responsável pelo servidor para verificar o arquivo e reexaminar a biblioteca.", - "serverBusyTitle": "", - "serverBusyBody": "", + "serverBusyTitle": "Transmissão indisponível", + "serverBusyBody": "O servidor continuou se recusando a transmitir este arquivo (HTTP 503). Ele pode estar reiniciando ou ocupado, ou o armazenamento do arquivo pode estar offline. Tente novamente em instantes — se isso continuar acontecendo, peça ao proprietário do servidor para verificar o servidor e o armazenamento do arquivo.", "logsUploaded": "Logs enviados", "logsUploadFailed": "Falha ao enviar logs", "logId": "ID do log", - "burnedSubtitlesUseMenu": "" + "burnedSubtitlesUseMenu": "As legendas estão incorporadas a esta transmissão. Altere-as no menu de legendas.", + "noVideoUrl": "Nenhuma URL de vídeo disponível", + "playbackNoMediaSources": "O servidor não retornou nenhuma fonte de mídia reproduzível", + "playbackDataNotPrepared": "A reprodução foi iniciada antes que os dados estivessem prontos", + "streamSelectionUnavailable": "A seleção de fluxos não está disponível para esta fonte", + "streamSelectionFailed": "Não foi possível aplicar os fluxos selecionados", + "serverUnavailableForProfile": "Nenhum servidor está disponível para o perfil ativo" }, "subtitlingStyling": { "text": "Texto", @@ -746,8 +773,8 @@ "overrideStrip": "Remover estilo", "positionTop": "Superior", "positionBottom": "Inferior", - "anchorToScreen": "", - "anchorToScreenDescription": "", + "anchorToScreen": "Ancorar à tela", + "anchorToScreenDescription": "Exibir as legendas de texto nas faixas pretas abaixo de vídeos em tela ampla", "bold": "Negrito", "italic": "Itálico", "renderResolution": "Resolução de renderização", @@ -835,7 +862,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", + "tokenIdentityMismatch": "O token do perfil do Plex foi associado a um servidor inesperado" }, "connections": { "sectionTitle": "Conexões", @@ -872,7 +900,11 @@ "movie": "Filme", "tvShow": "Série de TV", "minutesLeft": "${minutes} min restantes", - "moreLikeThis": "Títulos semelhantes" + "moreLikeThis": "Títulos semelhantes", + "titleCount": { + "one": "${n} título", + "other": "${n} títulos" + } }, "errors": { "searchFailed": "Falha na busca: ${error}", @@ -1080,10 +1112,10 @@ "characters": "Personagens", "addToWatchlist": "Adicionar à lista para assistir", "removeFromWatchlist": "Remover da lista para assistir", - "addedToWatchlist": "", - "removedFromWatchlist": "", + "addedToWatchlist": "Adicionado à lista de interesses", + "removedFromWatchlist": "Removido da lista de interesses", "watchlistUpdateFailed": "Não foi possível atualizar a lista para assistir", - "watchlistNoMatch": "", + "watchlistNoMatch": "Não foi possível associar este item a uma lista de interesses", "notInLibrary": "Não está na sua biblioteca", "inTheseLibraries": "Nestas bibliotecas", "checkingLibrary": "Verificando sua biblioteca...", @@ -1253,9 +1285,9 @@ "watchChannel": "Assistir ao canal", "favorites": "Favoritos", "reorderFavorites": "Reordenar favoritos", - "noFavoriteChannels": "", - "noFavoriteChannelsHint": "", - "showAllChannels": "", + "noFavoriteChannels": "Nenhum canal favorito", + "noFavoriteChannelsHint": "Mostre todos os canais e mantenha um canal pressionado para adicioná-lo aos favoritos.", + "showAllChannels": "Mostrar todos os canais", "favoritesLoadFailed": "Não foi possível carregar os favoritos. Verifique sua conexão e tente novamente.", "favoritesUpdateFailed": "Não foi possível atualizar os favoritos. Verifique sua conexão e tente novamente.", "joinSession": "Entrar na sessão em andamento", @@ -1294,7 +1326,12 @@ "recordingRuleUpdated": "Regra de gravação atualizada", "guideReloadRequested": "Atualização do guia solicitada", "rulesProcessRequested": "Reavaliação de regras solicitada", - "recordShow": "Gravar programa" + "recordShow": "Gravar programa", + "startingInMinutes": "Começa em ${minutes} min", + "dayAtTime": "${day} às ${time}", + "invalidPlaybackData": "${product} retornou dados inválidos de reprodução de TV ao Vivo", + "failedToStartChannel": "Não foi possível iniciar o canal ao vivo", + "failedToBuildStreamUrl": "Não foi possível gerar a URL da transmissão" }, "collections": { "title": "Coleções", @@ -1371,7 +1408,9 @@ "nextTrack": "Próxima faixa", "repeat": "Repetir", "repeatAll": "Repetir tudo", - "repeatOne": "Repetir uma faixa" + "repeatOne": "Repetir uma faixa", + "instantMixNoServer": "Nenhum servidor está disponível para uma mistura instantânea", + "noAudioUrl": "Nenhuma URL de áudio está disponível para ${track}" }, "watchTogether": { "title": "Assistir Juntos", @@ -1438,7 +1477,8 @@ "renameRoom": "Renomear sala", "removeRoom": "Remover", "guestSwitchUnavailable": "Não foi possível trocar — servidor indisponível para sincronização", - "guestSwitchFailed": "Não foi possível trocar — conteúdo não encontrado neste servidor" + "guestSwitchFailed": "Não foi possível trocar — conteúdo não encontrado neste servidor", + "defaultDisplayName": "Usuário" }, "downloads": { "title": "Downloads", @@ -1542,7 +1582,17 @@ "statusUnknown": "Ainda não verificado", "settingsUnavailable": "Não foi possível abrir as configurações do sistema neste dispositivo", "linkUnavailable": "Não foi possível abrir dontkillmyapp.com neste dispositivo" - } + }, + "unknownShow": "Série desconhecida", + "unknownSeason": "Temporada desconhecida", + "unknownAlbum": "Álbum desconhecido", + "completedOfTotal": "${completed}/${total} concluídos", + "errorFileNotFound": "Arquivo não encontrado (404)", + "errorDownloadFailed": "Falha no download", + "errorPostProcessing": "Falha no pós-processamento: ${error}", + "notificationDownloading": "Baixando...", + "notificationComplete": "Download concluído", + "notificationPaused": "Download pausado" }, "shaders": { "title": "Shaders", @@ -1633,7 +1683,8 @@ "failedToConnectAnyAddress": "Falha ao conectar a qualquer endereço", "connectionLostAfterAttempts": "Conexão perdida após ${attempts} tentativas", "connectionLost": "Conexão perdida" - } + }, + "closedBeforeAuth": "A conexão foi encerrada antes da autenticação" }, "videoSettings": { "playbackSpeed": "Velocidade de Reprodução", @@ -1644,13 +1695,13 @@ "audioSync": "Sincronia de áudio", "subtitleSync": "Sincronia de legendas", "hdr": "HDR", - "hdrUnsupported": "", - "hdrToneMapping": "", - "hdrToneMappingCompositor": "", - "hdrToneMappingCompositorDescription": "", - "hdrToneMappingPlayer": "", - "hdrToneMappingPlayerDescription": "", - "hdrToneMappingFailed": "", + "hdrUnsupported": "O HDR não está disponível aqui — este compositor da área de trabalho ou esta saída de vídeo não é compatível com ele.", + "hdrToneMapping": "Mapeamento de tons HDR", + "hdrToneMappingCompositor": "Compositor", + "hdrToneMappingCompositorDescription": "Repassar os metadados HDR da fonte e deixar que o compositor da área de trabalho faça o mapeamento.", + "hdrToneMappingPlayer": "Reprodutor", + "hdrToneMappingPlayerDescription": "Mapear para o brilho máximo da tela no reprodutor e informar o resultado ao compositor.", + "hdrToneMappingFailed": "Não foi possível alterar o mapeamento de tons HDR — o modo anterior continua ativo.", "audioOutput": "Saída de áudio", "performanceOverlay": "Painel de desempenho", "audioOutputDolbyAtmos": "Dolby Atmos", @@ -1696,7 +1747,17 @@ "speed": "Velocidade", "player": "Reprodutor", "memory": "Memória", - "uiFps": "UI FPS" + "uiFps": "UI FPS", + "fps": "FPS", + "decoderAndroidHw": "Android HW", + "decoderNvidiaHw": "NVIDIA HW", + "decoderQualcommHw": "Qualcomm HW", + "decoderMediatekHw": "MediaTek HW", + "decoderExynosHw": "Exynos HW", + "decoderSoftware": "Software", + "decoderHardware": "Hardware", + "tunnelingActive": "Ativo", + "dvRpuFailed": "${converted} (${failures} com falha)" }, "externalPlayer": { "title": "Reprodutor externo", @@ -1854,7 +1915,17 @@ "statusAvailable": "Disponível", "statusPartiallyAvailable": "Parcialmente disponível", "statusRequested": "Solicitado", - "statusProcessing": "Processando" + "statusProcessing": "Processando", + "couldNotReach": "Não foi possível acessar ${url}: ${error}", + "noInstanceAtUrl": "Nenhuma instância do Seerr em ${url} (HTTP ${status})", + "notInitialized": "Esta instância do Seerr não concluiu a configuração inicial", + "noPlexTokenForReauth": "Nenhum token do Plex está disponível para entrar novamente", + "noStoredCredentials": "Nenhuma credencial armazenada está disponível para entrar novamente", + "signInRejected": "A entrada foi rejeitada", + "noSessionCookie": "O Seerr não forneceu um cookie de sessão", + "freshCookieRejected": "O Seerr rejeitou o novo cookie de sessão", + "noUserInformation": "O Seerr não retornou informações do usuário", + "sessionRejectedAfterReauth": "A sessão foi rejeitada após entrar novamente" }, "services": { "title": "Serviços", @@ -1875,7 +1946,7 @@ }, "deviceCode": { "title": "Ativar o Plezy no ${service}", - "instructions": "", + "instructions": "Leia o código QR ou acesse o endereço abaixo e insira este código:", "openToActivate": "Abrir ${service} para ativar", "copyCode": "Copiar código de ativação", "waitingForAuthorization": "Aguardando autorização…", @@ -1933,6 +2004,24 @@ "connectToMediaBrowserCardSubtitle": "Digite a URL do servidor, o nome de usuário e a senha.", "connectToMediaBrowserCardSubtitleScoped": "Entre no seu servidor ${product}. Vinculado a ${name}.", "borrowFromAnotherProfile": "Pegar emprestado de outro perfil", - "borrowFromAnotherProfileSubtitle": "Reutilize a conexão de outro perfil. Perfis protegidos por PIN exigem PIN." + "borrowFromAnotherProfileSubtitle": "Reutilize a conexão de outro perfil. Perfis protegidos por PIN exigem PIN.", + "invalidCredentials": "Usuário ou senha inválidos", + "authResponseNotJson": "A resposta de autenticação não era um JSON válido", + "quickConnectRejected": "O Quick Connect foi rejeitado pelo servidor", + "quickConnectNotJson": "A resposta do Quick Connect não era um JSON válido", + "quickConnectMissingFields": "A resposta do Quick Connect não contém um código ou segredo", + "quickConnectPollRejected": "A consulta do Quick Connect foi rejeitada pelo servidor", + "serverTimedOut": "O servidor não respondeu a tempo", + "responseNotJson": "A resposta do servidor não era um JSON válido", + "responseMissingIdentity": "A resposta não contém um ID ou nome de servidor — este é um servidor ${product}?", + "probeFailed": "Não foi possível conectar ao servidor: ${error}", + "enterAtLeastOneUrl": "Insira pelo menos uma URL de servidor ${product}", + "noReachableServer": "Nenhum servidor ${product} acessível foi encontrado", + "urlsPointToDifferentServers": "Estas URLs apontam para servidores ${product} diferentes", + "urlDoesNotMatchServer": "Esta URL não corresponde ao servidor ${product}", + "redirectUnsupported": "O servidor redirecionou para uma URL não compatível", + "redirectDifferentHost": "O servidor redirecionou para outro host. Insira diretamente a URL final do ${product}.", + "redirectInsecure": "O servidor redirecionou de HTTPS para uma URL insegura", + "redirectUnsupportedEnterFinal": "O servidor redirecionou para uma URL não compatível. Insira diretamente a URL final do ${product}." } } diff --git a/lib/i18n/ru.i18n.json b/lib/i18n/ru.i18n.json index 83e7892f..7586a390 100644 --- a/lib/i18n/ru.i18n.json +++ b/lib/i18n/ru.i18n.json @@ -17,7 +17,8 @@ "quickConnectWaiting": "Ожидание подтверждения…", "quickConnectCancel": "Отмена", "quickConnectExpired": "Срок действия Quick Connect истёк. Попробуйте снова.", - "localDataRecoveryRequired": "Plezy не удалось безопасно восстановить данные локального входа и несинхронизированные данные о воспроизведении. Войдите снова." + "localDataRecoveryRequired": "Plezy не удалось безопасно восстановить данные локального входа и несинхронизированные данные о воспроизведении. Войдите снова.", + "pinCheckRejected": "Проверка PIN-кода Plex была отклонена" }, "common": { "cancel": "Отмена", @@ -77,7 +78,10 @@ "trakt": "Trakt", "rottenTomatoesCritic": "Критики Rotten Tomatoes", "rottenTomatoesAudience": "Зрители Rotten Tomatoes" - } + }, + "notAvailable": "Н/Д", + "url": "URL", + "letterKeys": "АБВ" }, "screens": { "licenses": "Лицензии", @@ -323,8 +327,8 @@ "showNavBarLabels": "Показывать подписи панели навигации", "showNavBarLabelsDescription": "Отображать текстовые подписи под иконками панели навигации", "startupSection": "Начальный раздел", - "showExploreTab": "", - "showExploreTabDescription": "", + "showExploreTab": "Показывать вкладку «Обзор»", + "showExploreTabDescription": "Показывать вкладку «Обзор» с контентом из Plex Discover и подключённых трекеров", "liveTvDefaultFavorites": "Избранные каналы по умолчанию", "liveTvDefaultFavoritesDescription": "Показывать только избранные каналы при открытии ТВ", "display": "Экран", @@ -335,7 +339,8 @@ "player": "Плеер", "subtitlesAndConfig": "Субтитры и конфигурация", "seekAndTiming": "Перемотка и время", - "behavior": "Поведение" + "behavior": "Поведение", + "exportDialogTitle": "Экспорт настроек Plezy" }, "search": { "hint": "Поиск фильмов, сериалов, музыки...", @@ -491,7 +496,9 @@ "flagExternal": "Внешняя", "flagHearingImpaired": "Для слабослышащих", "flagDub": "Дубляж", - "flagOriginal": "Оригинал" + "flagOriginal": "Оригинал", + "channelsMono": "Моно", + "dolbyVisionProfile": "Профиль ${profile}" }, "mediaMenu": { "markAsWatched": "Отметить как просмотренное", @@ -574,7 +581,12 @@ "alphabetNavigation": "Навигация по алфавиту", "alphabetScrollHint": "Проведите вверх или вниз для перехода по буквам", "rowColumnPosition": "Строка ${row} из ${rowCount}, столбец ${column} из ${columnCount}", - "rowPosition": "Строка ${row} из ${rowCount}" + "rowPosition": "Строка ${row} из ${rowCount}", + "autoScrollPlay": "Запустить автопрокрутку", + "autoScrollPause": "Приостановить автопрокрутку", + "hueShort": "H", + "saturationShort": "S", + "valueShort": "V" }, "tooltips": { "shufflePlay": "Случайное воспроизведение", @@ -672,7 +684,16 @@ "subtitleDownloaded": "Субтитры загружены", "subtitleDownloadedNotApplied": "Субтитры загружены, но их не удалось выбрать", "subtitleDownloadFailed": "Не удалось загрузить субтитры", - "searchLanguages": "Поиск языков..." + "searchLanguages": "Поиск языков...", + "skipIntro": "Пропустить заставку", + "skipCredits": "Пропустить титры", + "nextEpisode": "Следующий эпизод", + "subtitleTrack": "Дорожка ${n}", + "subtitleFile": "Субтитры ${name}", + "forcedTrack": "${label} (принудительная)", + "osdSubtitlesOff": "Субтитры: выкл.", + "osdSubtitles": "Субтитры: ${track}", + "osdAudio": "Аудио: ${track}" }, "userStatus": {}, "messages": { @@ -730,12 +751,18 @@ "serverLimitBody": "Ошибка сервера (HTTP 500). Лимит пропускной способности/транскодирования, вероятно, отклонил сессию. Попросите владельца изменить настройки.", "mediaUnreadableTitle": "Файл недоступен", "mediaUnreadableBody": "Сервер нашёл этот элемент, но не смог прочитать его файл (HTTP 404). Вероятно, файл был перемещён, удалён или его хранилище недоступно. Попросите владельца сервера проверить файл и пересканировать библиотеку.", - "serverBusyTitle": "", - "serverBusyBody": "", + "serverBusyTitle": "Поток недоступен", + "serverBusyBody": "Сервер продолжает отклонять запросы на потоковую передачу этого файла (HTTP 503). Возможно, он перезапускается, перегружен или хранилище с файлом недоступно. Повторите попытку через некоторое время. Если это продолжает происходить, попросите владельца сервера проверить сервер и хранилище с файлом.", "logsUploaded": "Логи загружены", "logsUploadFailed": "Не удалось загрузить логи", "logId": "ID лога", - "burnedSubtitlesUseMenu": "" + "burnedSubtitlesUseMenu": "Субтитры встроены в этот поток. Изменить их можно в меню субтитров.", + "noVideoUrl": "URL видео недоступен", + "playbackNoMediaSources": "Сервер не вернул пригодных для воспроизведения медиаисточников", + "playbackDataNotPrepared": "Воспроизведение началось до того, как данные были готовы", + "streamSelectionUnavailable": "Выбор потоков недоступен для этого источника", + "streamSelectionFailed": "Не удалось применить выбранные потоки", + "serverUnavailableForProfile": "Для активного профиля нет доступных серверов" }, "subtitlingStyling": { "text": "Текст", @@ -754,8 +781,8 @@ "overrideStrip": "Удалить стили", "positionTop": "Сверху", "positionBottom": "Снизу", - "anchorToScreen": "", - "anchorToScreenDescription": "", + "anchorToScreen": "Привязка к экрану", + "anchorToScreenDescription": "Показывать текстовые субтитры в чёрных полосах под широкоформатным видео", "bold": "Жирный", "italic": "Курсив", "renderResolution": "Разрешение отрисовки", @@ -843,7 +870,8 @@ "pinProtectionOptional": "Защита PIN-кодом (необязательно)", "pinExplain": "Для переключения профилей нужен 4-значный PIN.", "continueButton": "Продолжить", - "pinsDontMatch": "PIN-коды не совпадают" + "pinsDontMatch": "PIN-коды не совпадают", + "tokenIdentityMismatch": "Токен профиля Plex указал на неожиданный сервер" }, "connections": { "sectionTitle": "Подключения", @@ -880,7 +908,13 @@ "movie": "Фильм", "tvShow": "Сериал", "minutesLeft": "Осталось ${minutes} мин", - "moreLikeThis": "Похожее" + "moreLikeThis": "Похожее", + "titleCount": { + "one": "${n} название", + "few": "${n} названия", + "many": "${n} названий", + "other": "${n} названия" + } }, "errors": { "searchFailed": "Ошибка поиска: ${error}", @@ -1090,10 +1124,10 @@ "characters": "Персонажи", "addToWatchlist": "Добавить в список для просмотра", "removeFromWatchlist": "Удалить из списка для просмотра", - "addedToWatchlist": "", - "removedFromWatchlist": "", + "addedToWatchlist": "Добавлено в список просмотра", + "removedFromWatchlist": "Удалено из списка просмотра", "watchlistUpdateFailed": "Не удалось обновить список для просмотра", - "watchlistNoMatch": "", + "watchlistNoMatch": "Не удалось сопоставить этот элемент со списком просмотра", "notInLibrary": "Нет в вашей библиотеке", "inTheseLibraries": "В этих библиотеках", "checkingLibrary": "Проверка вашей библиотеки...", @@ -1269,9 +1303,9 @@ "watchChannel": "Смотреть канал", "favorites": "Избранное", "reorderFavorites": "Изменить порядок избранного", - "noFavoriteChannels": "", - "noFavoriteChannelsHint": "", - "showAllChannels": "", + "noFavoriteChannels": "Нет избранных каналов", + "noFavoriteChannelsHint": "Покажите все каналы, затем нажмите и удерживайте канал, чтобы добавить его в избранное.", + "showAllChannels": "Показать все каналы", "favoritesLoadFailed": "Не удалось загрузить избранное. Проверьте подключение и повторите попытку.", "favoritesUpdateFailed": "Не удалось обновить избранное. Проверьте подключение и повторите попытку.", "joinSession": "Присоединиться к текущему сеансу", @@ -1310,7 +1344,12 @@ "recordingRuleUpdated": "Правило записи обновлено", "guideReloadRequested": "Запрошено обновление гайда", "rulesProcessRequested": "Запрошен пересчёт правил", - "recordShow": "Записать передачу" + "recordShow": "Записать передачу", + "startingInMinutes": "Начало через ${minutes} мин", + "dayAtTime": "${day} в ${time}", + "invalidPlaybackData": "${product} вернул некорректные данные для воспроизведения ТВ в прямом эфире", + "failedToStartChannel": "Не удалось запустить канал в прямом эфире", + "failedToBuildStreamUrl": "Не удалось сформировать URL потока" }, "collections": { "title": "Коллекции", @@ -1389,7 +1428,9 @@ "nextTrack": "Следующий трек", "repeat": "Повтор", "repeatAll": "Повторять все", - "repeatOne": "Повторять один" + "repeatOne": "Повторять один", + "instantMixNoServer": "Нет доступного сервера для мгновенного микса", + "noAudioUrl": "Для трека ${track} нет доступного URL аудио" }, "watchTogether": { "title": "Смотреть вместе", @@ -1456,7 +1497,8 @@ "renameRoom": "Переименовать комнату", "removeRoom": "Удалить", "guestSwitchUnavailable": "Не удалось переключиться — сервер недоступен для синхронизации", - "guestSwitchFailed": "Не удалось переключиться — содержимое не найдено на этом сервере" + "guestSwitchFailed": "Не удалось переключиться — содержимое не найдено на этом сервере", + "defaultDisplayName": "Пользователь" }, "downloads": { "title": "Загрузки", @@ -1560,7 +1602,17 @@ "statusUnknown": "Ещё не проверено", "settingsUnavailable": "Не удалось открыть системные настройки на этом устройстве", "linkUnavailable": "Не удалось открыть dontkillmyapp.com на этом устройстве" - } + }, + "unknownShow": "Неизвестный сериал", + "unknownSeason": "Неизвестный сезон", + "unknownAlbum": "Неизвестный альбом", + "completedOfTotal": "Завершено: ${completed}/${total}", + "errorFileNotFound": "Файл не найден (404)", + "errorDownloadFailed": "Не удалось выполнить загрузку", + "errorPostProcessing": "Не удалось выполнить постобработку: ${error}", + "notificationDownloading": "Загрузка...", + "notificationComplete": "Загрузка завершена", + "notificationPaused": "Загрузка приостановлена" }, "shaders": { "title": "Шейдеры", @@ -1651,7 +1703,8 @@ "failedToConnectAnyAddress": "Не удалось подключиться ни к одному адресу", "connectionLostAfterAttempts": "Соединение потеряно после ${attempts} попыток", "connectionLost": "Соединение потеряно" - } + }, + "closedBeforeAuth": "Соединение было закрыто до аутентификации" }, "videoSettings": { "playbackSpeed": "Скорость воспроизведения", @@ -1662,13 +1715,13 @@ "audioSync": "Синхронизация аудио", "subtitleSync": "Синхронизация субтитров", "hdr": "HDR", - "hdrUnsupported": "", - "hdrToneMapping": "", - "hdrToneMappingCompositor": "", - "hdrToneMappingCompositorDescription": "", - "hdrToneMappingPlayer": "", - "hdrToneMappingPlayerDescription": "", - "hdrToneMappingFailed": "", + "hdrUnsupported": "HDR здесь недоступен: этот композитор рабочего стола или видеовыход не поддерживает его передачу.", + "hdrToneMapping": "Тональное отображение HDR", + "hdrToneMappingCompositor": "Композитор", + "hdrToneMappingCompositorDescription": "Передавать метаданные HDR источника без изменений, чтобы тональное отображение выполнял композитор рабочего стола.", + "hdrToneMappingPlayer": "Проигрыватель", + "hdrToneMappingPlayerDescription": "Выполнять тональное отображение в проигрывателе с учётом пиковой яркости дисплея, а затем передавать результат композитору.", + "hdrToneMappingFailed": "Не удалось изменить тональное отображение HDR — предыдущий режим по-прежнему активен.", "audioOutput": "Аудиовыход", "performanceOverlay": "Оверлей производительности", "audioOutputDolbyAtmos": "Dolby Atmos", @@ -1714,7 +1767,17 @@ "speed": "Скорость", "player": "Плеер", "memory": "Память", - "uiFps": "UI FPS" + "uiFps": "UI FPS", + "fps": "FPS", + "decoderAndroidHw": "Android, аппаратный", + "decoderNvidiaHw": "NVIDIA, аппаратный", + "decoderQualcommHw": "Qualcomm, аппаратный", + "decoderMediatekHw": "MediaTek, аппаратный", + "decoderExynosHw": "Exynos, аппаратный", + "decoderSoftware": "Программный", + "decoderHardware": "Аппаратный", + "tunnelingActive": "Активно", + "dvRpuFailed": "${converted} (ошибок: ${failures})" }, "externalPlayer": { "title": "Внешний плеер", @@ -1872,7 +1935,17 @@ "statusAvailable": "Доступно", "statusPartiallyAvailable": "Частично доступно", "statusRequested": "Запрошено", - "statusProcessing": "Обработка" + "statusProcessing": "Обработка", + "couldNotReach": "Не удалось связаться с ${url}: ${error}", + "noInstanceAtUrl": "По адресу ${url} нет экземпляра Seerr (HTTP ${status})", + "notInitialized": "Первоначальная настройка этого экземпляра Seerr не завершена", + "noPlexTokenForReauth": "Нет токена Plex для повторного входа", + "noStoredCredentials": "Нет сохранённых учётных данных для повторного входа", + "signInRejected": "Вход был отклонён", + "noSessionCookie": "Seerr не выдал cookie-файл сеанса", + "freshCookieRejected": "Seerr отклонил новый cookie-файл сеанса", + "noUserInformation": "Seerr не вернул сведения о пользователе", + "sessionRejectedAfterReauth": "Сеанс был отклонён после повторного входа" }, "services": { "title": "Сервисы", @@ -1893,7 +1966,7 @@ }, "deviceCode": { "title": "Активируйте Plezy в ${service}", - "instructions": "", + "instructions": "Отсканируйте QR-код или перейдите по адресу ниже и введите этот код:", "openToActivate": "Открыть ${service} для активации", "copyCode": "Скопировать код активации", "waitingForAuthorization": "Ожидание авторизации…", @@ -1951,6 +2024,24 @@ "connectToMediaBrowserCardSubtitle": "Введите URL сервера, имя пользователя и пароль.", "connectToMediaBrowserCardSubtitleScoped": "Войдите на свой сервер ${product}. Будет привязано к ${name}.", "borrowFromAnotherProfile": "Использовать подключение другого профиля", - "borrowFromAnotherProfileSubtitle": "Повторно используйте подключение другого профиля. Для защищённых профилей потребуется PIN." + "borrowFromAnotherProfileSubtitle": "Повторно используйте подключение другого профиля. Для защищённых профилей потребуется PIN.", + "invalidCredentials": "Неверное имя пользователя или пароль", + "authResponseNotJson": "Ответ аутентификации не является допустимым JSON", + "quickConnectRejected": "Quick Connect был отклонён сервером", + "quickConnectNotJson": "Ответ Quick Connect не является допустимым JSON", + "quickConnectMissingFields": "В ответе Quick Connect отсутствует код или секрет", + "quickConnectPollRejected": "Опрос Quick Connect был отклонён сервером", + "serverTimedOut": "Сервер не ответил вовремя", + "responseNotJson": "Ответ сервера не является допустимым JSON", + "responseMissingIdentity": "В ответе отсутствует идентификатор или имя сервера. Это точно сервер ${product}?", + "probeFailed": "Не удалось связаться с сервером: ${error}", + "enterAtLeastOneUrl": "Введите хотя бы один URL сервера ${product}", + "noReachableServer": "Не найдено ни одного доступного сервера ${product}", + "urlsPointToDifferentServers": "Эти URL указывают на разные серверы ${product}", + "urlDoesNotMatchServer": "Этот URL не соответствует серверу ${product}", + "redirectUnsupported": "Сервер перенаправил на неподдерживаемый URL", + "redirectDifferentHost": "Сервер перенаправил на другой хост. Введите конечный URL ${product} напрямую.", + "redirectInsecure": "Сервер перенаправил с HTTPS на небезопасный URL", + "redirectUnsupportedEnterFinal": "Сервер перенаправил на неподдерживаемый URL. Введите конечный URL ${product} напрямую." } } diff --git a/lib/i18n/strings.g.dart b/lib/i18n/strings.g.dart index 2204ad32..4b0cd1ef 100644 --- a/lib/i18n/strings.g.dart +++ b/lib/i18n/strings.g.dart @@ -4,7 +4,7 @@ /// To regenerate, run: `dart run slang` /// /// Locales: 22 -/// Strings: 38345 (1742 per locale) +/// Strings: 40700 (1850 per locale) // coverage:ignore-file // ignore_for_file: type=lint, unused_import diff --git a/lib/i18n/strings_az.g.dart b/lib/i18n/strings_az.g.dart index 3704b169..a971c79d 100644 --- a/lib/i18n/strings_az.g.dart +++ b/lib/i18n/strings_az.g.dart @@ -123,6 +123,7 @@ class _Translations$auth$az extends Translations$auth$en { @override String get quickConnectCancel => 'Ləğv et'; @override String get quickConnectExpired => 'Sürətli Qoşulmanın vaxtı bitdi. Təzədən cəhd edin.'; @override String get localDataRecoveryRequired => 'Plezy yerli daxil olma və gözləyən oxutma məlumatlarını təhlükəsiz bərpa edə bilmədi. Lütfən təzədən daxil olun.'; + @override String get pinCheckRejected => 'Plex PIN yoxlaması rədd edildi'; } // Path: common @@ -178,6 +179,9 @@ class _Translations$common$az extends Translations$common$en { @override String get exitFullscreen => 'Tam ekrandan çıx'; @override String get pressBackAgainToExit => 'Çıxmaq üçün geri düyməsinə bir daha basın'; @override late final _Translations$common$ratingSource$az ratingSource = _Translations$common$ratingSource$az._(_root); + @override String get notAvailable => 'N/A'; + @override String get url => 'URL'; + @override String get letterKeys => 'ABC'; } // Path: screens @@ -444,6 +448,8 @@ class _Translations$settings$az extends Translations$settings$en { @override String get showNavBarLabels => 'Naviqasiya paneli yazılarını göstər'; @override String get showNavBarLabelsDescription => 'Naviqasiya paneli ikonlarının altında mətni göstər'; @override String get startupSection => 'Başlanğıc bölməsi'; + @override String get showExploreTab => 'Kəşf et nişanını göstər'; + @override String get showExploreTabDescription => 'Plex Discover və qoşulmuş izləmə xidmətlərindəki məzmunla Kəşf et nişanını göstər'; @override String get liveTvDefaultFavorites => 'Canlı TV-də sevimli kanalları defolt et'; @override String get liveTvDefaultFavoritesDescription => 'Canlı TV açıldıqda yalnız sevimli kanalları göstər'; @override String get display => 'Ekran'; @@ -455,6 +461,7 @@ class _Translations$settings$az extends Translations$settings$en { @override String get subtitlesAndConfig => 'Altyazılar və konfiqurasiya'; @override String get seekAndTiming => 'Sarğı və vaxt tənzimləməsi'; @override String get behavior => 'Davranış'; + @override String get exportDialogTitle => 'Plezy tənzimləmələrini ixrac et'; } // Path: search @@ -606,6 +613,8 @@ class _Translations$fileInfo$az extends Translations$fileInfo$en { @override String get flagHearingImpaired => 'Eşitmə qüsurlu üçün'; @override String get flagDub => 'Dublyaj'; @override String get flagOriginal => 'Orijinal'; + @override String get channelsMono => 'Mono'; + @override String dolbyVisionProfile({required Object profile}) => 'Profil ${profile}'; } // Path: mediaMenu @@ -704,6 +713,11 @@ class _Translations$accessibility$az extends Translations$accessibility$en { @override String get alphabetScrollHint => 'Hərflərə görə keçmək üçün yuxarı və ya aşağı sürüşdürün'; @override String rowColumnPosition({required Object row, required Object rowCount, required Object column, required Object columnCount}) => 'Sətir ${row} / ${rowCount}, sütun ${column} / ${columnCount}'; @override String rowPosition({required Object row, required Object rowCount}) => 'Sətir ${row} / ${rowCount}'; + @override String get autoScrollPlay => 'Avtomatik sürüşdürməni başlat'; + @override String get autoScrollPause => 'Avtomatik sürüşdürməyə fasilə ver'; + @override String get hueShort => 'H'; + @override String get saturationShort => 'S'; + @override String get valueShort => 'V'; } // Path: tooltips @@ -815,6 +829,15 @@ class _Translations$videoControls$az extends Translations$videoControls$en { @override String get subtitleDownloadedNotApplied => 'Altyazı yükləndi, lakin seçilə bilmədi'; @override String get subtitleDownloadFailed => 'Altyazı yüklənə bilmədi'; @override String get searchLanguages => 'Dillərdə axtar...'; + @override String get skipIntro => 'Girişi keç'; + @override String get skipCredits => 'Titrləri keç'; + @override String get nextEpisode => 'Növbəti seriya'; + @override String subtitleTrack({required Object n}) => 'Zolaq ${n}'; + @override String subtitleFile({required Object name}) => 'Altyazı ${name}'; + @override String forcedTrack({required Object label}) => '${label} (Məcburi)'; + @override String get osdSubtitlesOff => 'Altyazı: Söndürülüb'; + @override String osdSubtitles({required Object track}) => 'Altyazı: ${track}'; + @override String osdAudio({required Object track}) => 'Səs: ${track}'; } // Path: messages @@ -876,9 +899,18 @@ class _Translations$messages$az extends Translations$messages$en { @override String get serverLimitBody => 'Server xətası (HTTP 500). Məhdudiyyət bu seansı rədd etdi.'; @override String get mediaUnreadableTitle => 'Fayl əlçatan deyil'; @override String get mediaUnreadableBody => 'Server bu elementi tapdı, lakin onun faylını oxuya bilmədi (HTTP 404). Fayl yəqin ki, köçürülüb, silinib və ya onun saxlanma yeri oflayndır. Server sahibindən faylı yoxlamasını və kitabxananı yenidən skan etməsini xahiş edin.'; + @override String get serverBusyTitle => 'Yayım əlçatan deyil'; + @override String get serverBusyBody => 'Server bu faylı yayımlamaqdan dəfələrlə imtina etdi (HTTP 503). Server yenidən başladılır və ya məşğul ola bilər, yaxud faylın yerləşdiyi yaddaş oflayn ola bilər. Bir az sonra təzədən cəhd edin — problem davam edərsə, server sahibindən serveri və faylın yerləşdiyi yaddaşı yoxlamasını istəyin.'; @override String get logsUploaded => 'Jurnallar yükləndi'; @override String get logsUploadFailed => 'Jurnallar yüklənə bilmədi'; @override String get logId => 'Jurnal ID-si'; + @override String get burnedSubtitlesUseMenu => 'Altyazılar bu yayıma həkk edilib. Onları altyazı menyusundan dəyişin.'; + @override String get noVideoUrl => 'Video URL-i mövcud deyil'; + @override String get playbackNoMediaSources => 'Server oynadıla bilən media mənbəyi qaytarmadı'; + @override String get playbackDataNotPrepared => 'Məlumatları hazır olmadan oynatma başladıldı'; + @override String get streamSelectionUnavailable => 'Bu mənbə üçün yayım seçimi mövcud deyil'; + @override String get streamSelectionFailed => 'Seçilmiş yayımları tətbiq etmək olmadı'; + @override String get serverUnavailableForProfile => 'Aktiv profil üçün heç bir server mövcud deyil'; } // Path: subtitlingStyling @@ -904,6 +936,8 @@ class _Translations$subtitlingStyling$az extends Translations$subtitlingStyling$ @override String get overrideStrip => 'Formatlaşdırmanı sil'; @override String get positionTop => 'Yuxarı'; @override String get positionBottom => 'Aşağı'; + @override String get anchorToScreen => 'Ekrana bərkit'; + @override String get anchorToScreenDescription => 'Mətn altyazılarını geniş ekranlı videonun altındakı qara zolaqlarda göstər'; @override String get bold => 'Qalın'; @override String get italic => 'Kursiv'; @override String get renderResolution => 'Emal imkanı (Resolution)'; @@ -1013,6 +1047,7 @@ class _Translations$profiles$az extends Translations$profiles$en { @override String get pinExplain => 'Profillər arası keçid üçün 4 rəqəmli PIN tələb olunur.'; @override String get continueButton => 'Davam et'; @override String get pinsDontMatch => 'PIN-lər uyğun gəlmir'; + @override String get tokenIdentityMismatch => 'Plex profil tokeni gözlənilməyən serveri müəyyən etdi'; } // Path: connections @@ -1064,6 +1099,10 @@ class _Translations$discover$az extends Translations$discover$en { @override String get tvShow => 'TV Şou'; @override String minutesLeft({required Object minutes}) => '${minutes} dəq qaldı'; @override String get moreLikeThis => 'Buna bənzərlər'; + @override String titleCount({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('az'))(n, + one: '${n} başlıq', + other: '${n} başlıq', + ); } // Path: errors @@ -1276,7 +1315,10 @@ class _Translations$explore$az extends Translations$explore$en { @override String get characters => 'Personajlar'; @override String get addToWatchlist => 'İzləmə siyahısına əlavə et'; @override String get removeFromWatchlist => 'İzləmə siyahısından sil'; + @override String get addedToWatchlist => 'Baxış siyahısına əlavə edildi'; + @override String get removedFromWatchlist => 'Baxış siyahısından silindi'; @override String get watchlistUpdateFailed => 'İzləmə siyahısı yenilənə bilmədi'; + @override String get watchlistNoMatch => 'Bu elementi heç bir baxış siyahısı ilə uyğunlaşdırmaq olmadı'; @override String get notInLibrary => 'Kitabxananızda yoxdur'; @override String get inTheseLibraries => 'Bu kitabxanalarda var'; @override String get checkingLibrary => 'Kitabxananız yoxlanılır...'; @@ -1337,6 +1379,9 @@ class _Translations$liveTv$az extends Translations$liveTv$en { @override String get watchChannel => 'Kanala bax'; @override String get favorites => 'Sevimlilər'; @override String get reorderFavorites => 'Sevimliləri yenidən sırala'; + @override String get noFavoriteChannels => 'Sevimli kanal yoxdur'; + @override String get noFavoriteChannelsHint => 'Bütün kanalları göstərin, sonra kanalı sevimlilərə əlavə etmək üçün üzərinə uzun basın.'; + @override String get showAllChannels => 'Bütün kanalları göstər'; @override String get favoritesLoadFailed => 'Sevimlilər yüklənə bilmədi.'; @override String get favoritesUpdateFailed => 'Sevimlilər yenilənə bilmədi.'; @override String get joinSession => 'Davam edən seansa qoşul'; @@ -1376,6 +1421,11 @@ class _Translations$liveTv$az extends Translations$liveTv$en { @override String get guideReloadRequested => 'Bələdçi yenilənməsi tələb olundu'; @override String get rulesProcessRequested => 'Qaydaların yenidən qiymətləndirilməsi tələb olundu'; @override String get recordShow => 'Şounu yaz'; + @override String startingInMinutes({required Object minutes}) => '${minutes} dəq sonra başlayır'; + @override String dayAtTime({required Object day, required Object time}) => '${day}, saat ${time}'; + @override String invalidPlaybackData({required Object product}) => '${product} etibarsız Canlı TV oynatma məlumatı qaytardı'; + @override String get failedToStartChannel => 'Canlı kanalı başlatmaq olmadı'; + @override String get failedToBuildStreamUrl => 'Yayım URL-i yaratmaq olmadı'; } // Path: collections @@ -1474,6 +1524,8 @@ class _Translations$music$az extends Translations$music$en { @override String get repeat => 'Təkrarla'; @override String get repeatAll => 'Hamısını təkrarla'; @override String get repeatOne => 'Birini təkrarla'; + @override String get instantMixNoServer => 'Ani miks üçün heç bir server mövcud deyil'; + @override String noAudioUrl({required Object track}) => '${track} üçün səs URL-i mövcud deyil'; } // Path: watchTogether @@ -1548,6 +1600,7 @@ class _Translations$watchTogether$az extends Translations$watchTogether$en { @override String get removeRoom => 'Sil'; @override String get guestSwitchUnavailable => 'Keçid etmək olmadı — eyniləşdirmə üçün server əlçatan deyil'; @override String get guestSwitchFailed => 'Keçid etmək olmadı — məzmun tapılmadı'; + @override String get defaultDisplayName => 'İstifadəçi'; } // Path: downloads @@ -1632,6 +1685,16 @@ class _Translations$downloads$az extends Translations$downloads$en { @override String get syncRuleUnknownServer => 'Bilinməyən server'; @override String get syncRuleListCreated => 'Eyniləşdirmə qaydası yaradıldı'; @override late final _Translations$downloads$backgroundWarning$az backgroundWarning = _Translations$downloads$backgroundWarning$az._(_root); + @override String get unknownShow => 'Məlum olmayan serial'; + @override String get unknownSeason => 'Məlum olmayan mövsüm'; + @override String get unknownAlbum => 'Məlum olmayan albom'; + @override String completedOfTotal({required Object completed, required Object total}) => '${completed}/${total} tamamlandı'; + @override String get errorFileNotFound => 'Fayl tapılmadı (404)'; + @override String get errorDownloadFailed => 'Yükləmə uğursuz oldu'; + @override String errorPostProcessing({required Object error}) => 'Sonrakı emal uğursuz oldu: ${error}'; + @override String get notificationDownloading => 'Yüklənir...'; + @override String get notificationComplete => 'Yükləmə tamamlandı'; + @override String get notificationPaused => 'Yükləmə dayandırıldı'; } // Path: shaders @@ -1672,6 +1735,7 @@ class _Translations$companionRemote$az extends Translations$companionRemote$en { @override late final _Translations$companionRemote$pairing$az pairing = _Translations$companionRemote$pairing$az._(_root); @override late final _Translations$companionRemote$remote$az remote = _Translations$companionRemote$remote$az._(_root); @override late final _Translations$companionRemote$errors$az errors = _Translations$companionRemote$errors$az._(_root); + @override String get closedBeforeAuth => 'Bağlantı autentifikasiyadan əvvəl bağlandı'; } // Path: videoSettings @@ -1689,6 +1753,13 @@ class _Translations$videoSettings$az extends Translations$videoSettings$en { @override String get audioSync => 'Səs sinxronizasiyası'; @override String get subtitleSync => 'Altyazı sinxronizasiyası'; @override String get hdr => 'HDR'; + @override String get hdrUnsupported => 'HDR burada əlçatan deyil — bu masaüstü kompozitoru və ya video çıxışı onu ötürə bilmir.'; + @override String get hdrToneMapping => 'HDR ton uyğunlaşdırması'; + @override String get hdrToneMappingCompositor => 'Kompozitor'; + @override String get hdrToneMappingCompositorDescription => 'Mənbənin HDR metaməlumatlarını dəyişmədən ötür və ton uyğunlaşdırmasını masaüstü kompozitoruna həvalə et.'; + @override String get hdrToneMappingPlayer => 'Oynadıcı'; + @override String get hdrToneMappingPlayerDescription => 'Oynadıcıda tonları ekranın pik parlaqlığına uyğunlaşdır, sonra nəticəni kompozitora bildir.'; + @override String get hdrToneMappingFailed => 'HDR ton uyğunlaşdırmasını dəyişmək olmadı — əvvəlki rejim hələ də aktivdir.'; @override String get audioOutput => 'Səs çıxışı'; @override String get performanceOverlay => 'Məhsuldarlıq paneli'; @override String get audioOutputDolbyAtmos => 'Dolby Atmos'; @@ -1742,6 +1813,16 @@ class _Translations$performanceOverlay$az extends Translations$performanceOverla @override String get player => 'Oynadıcı'; @override String get memory => 'Yaddaş'; @override String get uiFps => 'Arayüz (UI) FPS-i'; + @override String get fps => 'FPS'; + @override String get decoderAndroidHw => 'Android HW'; + @override String get decoderNvidiaHw => 'NVIDIA HW'; + @override String get decoderQualcommHw => 'Qualcomm HW'; + @override String get decoderMediatekHw => 'MediaTek HW'; + @override String get decoderExynosHw => 'Exynos HW'; + @override String get decoderSoftware => 'Proqram təminatı'; + @override String get decoderHardware => 'Aparat təminatı'; + @override String get tunnelingActive => 'Aktiv'; + @override String dvRpuFailed({required Object converted, required Object failures}) => '${converted} (${failures} uğursuz)'; } // Path: externalPlayer @@ -1942,6 +2023,16 @@ class _Translations$seerr$az extends Translations$seerr$en { @override String get statusPartiallyAvailable => 'Hissəvi əlçatandır'; @override String get statusRequested => 'Sorğu göndərildi'; @override String get statusProcessing => 'Emal edilir'; + @override String couldNotReach({required Object url, required Object error}) => '${url} ünvanına çatmaq olmadı: ${error}'; + @override String noInstanceAtUrl({required Object url, required Object status}) => '${url} ünvanında Seerr instansiyası yoxdur (HTTP ${status})'; + @override String get notInitialized => 'Bu Seerr instansiyasının ilkin quraşdırılması tamamlanmayıb'; + @override String get noPlexTokenForReauth => 'Yenidən daxil olmaq üçün Plex tokeni mövcud deyil'; + @override String get noStoredCredentials => 'Yenidən daxil olmaq üçün yadda saxlanmış giriş məlumatları mövcud deyil'; + @override String get signInRejected => 'Daxil olma rədd edildi'; + @override String get noSessionCookie => 'Seerr sessiya kukisi yaratmadı'; + @override String get freshCookieRejected => 'Seerr yeni sessiya kukisini rədd etdi'; + @override String get noUserInformation => 'Seerr istifadəçi məlumatlarını qaytarmadı'; + @override String get sessionRejectedAfterReauth => 'Yenidən daxil olduqdan sonra sessiya rədd edildi'; } // Path: services @@ -2002,6 +2093,24 @@ class _Translations$addServer$az extends Translations$addServer$en { @override String connectToMediaBrowserCardSubtitleScoped({required Object product, required Object name}) => '${product} serverinizə daxil olun. ${name} ilə əlaqələndirilir.'; @override String get borrowFromAnotherProfile => 'Başqa profildən götür'; @override String get borrowFromAnotherProfileSubtitle => 'Başqa profilin qoşulmasını yenidən istifadə edin.'; + @override String get invalidCredentials => 'İstifadəçi adı və ya şifrə yanlışdır'; + @override String get authResponseNotJson => 'Autentifikasiya cavabı etibarlı JSON deyildi'; + @override String get quickConnectRejected => 'Quick Connect server tərəfindən rədd edildi'; + @override String get quickConnectNotJson => 'Quick Connect cavabı etibarlı JSON deyildi'; + @override String get quickConnectMissingFields => 'Quick Connect cavabında kod və ya məxfi açar yoxdur'; + @override String get quickConnectPollRejected => 'Quick Connect sorğulaması server tərəfindən rədd edildi'; + @override String get serverTimedOut => 'Server vaxtında cavab vermədi'; + @override String get responseNotJson => 'Server cavabı etibarlı JSON deyildi'; + @override String responseMissingIdentity({required Object product}) => 'Cavabda ID və ya server adı yoxdur — bu, ${product} serveridir?'; + @override String probeFailed({required Object error}) => 'Serverə çatmaq olmadı: ${error}'; + @override String enterAtLeastOneUrl({required Object product}) => 'Ən azı bir ${product} server URL-i daxil edin'; + @override String noReachableServer({required Object product}) => 'Əlçatan ${product} serveri tapılmadı'; + @override String urlsPointToDifferentServers({required Object product}) => 'Bu URL-lər fərqli ${product} serverlərinə aiddir'; + @override String urlDoesNotMatchServer({required Object product}) => 'Bu URL ${product} serverinə uyğun gəlmir'; + @override String get redirectUnsupported => 'Server dəstəklənməyən URL-ə yönləndirdi'; + @override String redirectDifferentHost({required Object product}) => 'Server başqa hosta yönləndirdi. Son ${product} URL-ni birbaşa daxil edin.'; + @override String get redirectInsecure => 'Server HTTPS-dən təhlükəsiz olmayan URL-ə yönləndirdi'; + @override String redirectUnsupportedEnterFinal({required Object product}) => 'Server dəstəklənməyən URL-ə yönləndirdi. Son ${product} URL-ni birbaşa daxil edin.'; } // Path: common.ratingSource @@ -2521,6 +2630,7 @@ class _Translations$services$deviceCode$az extends Translations$services$deviceC // Translations @override String title({required Object service}) => 'Plezy-ni ${service} üzərində aktivləşdirin'; + @override String get instructions => 'QR kodunu skan edin və ya aşağıdakı ünvana keçib bu kodu daxil edin:'; @override String openToActivate({required Object service}) => 'Aktivləşdirmək üçün ${service} açın'; @override String get copyCode => 'Aktivləşdirmə kodunu kopyala'; @override String get waitingForAuthorization => 'Səlahiyyət gözlənilir…'; @@ -2595,6 +2705,7 @@ extension on TranslationsAz { 'auth.quickConnectCancel' => 'Ləğv et', 'auth.quickConnectExpired' => 'Sürətli Qoşulmanın vaxtı bitdi. Təzədən cəhd edin.', 'auth.localDataRecoveryRequired' => 'Plezy yerli daxil olma və gözləyən oxutma məlumatlarını təhlükəsiz bərpa edə bilmədi. Lütfən təzədən daxil olun.', + 'auth.pinCheckRejected' => 'Plex PIN yoxlaması rədd edildi', 'common.cancel' => 'Ləğv et', 'common.save' => 'Yadda saxla', 'common.close' => 'Bağla', @@ -2651,6 +2762,9 @@ extension on TranslationsAz { 'common.ratingSource.trakt' => 'Trakt', 'common.ratingSource.rottenTomatoesCritic' => 'Rotten Tomatoes tənqidçiləri', 'common.ratingSource.rottenTomatoesAudience' => 'Rotten Tomatoes tamaşaçıları', + 'common.notAvailable' => 'N/A', + 'common.url' => 'URL', + 'common.letterKeys' => 'ABC', 'screens.licenses' => 'Lisenziyalar', 'screens.switchProfile' => 'Profili dəyiş', 'screens.subtitleStyling' => 'Altyazı tənzimləmələri', @@ -2890,6 +3004,8 @@ extension on TranslationsAz { 'settings.showNavBarLabels' => 'Naviqasiya paneli yazılarını göstər', 'settings.showNavBarLabelsDescription' => 'Naviqasiya paneli ikonlarının altında mətni göstər', 'settings.startupSection' => 'Başlanğıc bölməsi', + 'settings.showExploreTab' => 'Kəşf et nişanını göstər', + 'settings.showExploreTabDescription' => 'Plex Discover və qoşulmuş izləmə xidmətlərindəki məzmunla Kəşf et nişanını göstər', 'settings.liveTvDefaultFavorites' => 'Canlı TV-də sevimli kanalları defolt et', 'settings.liveTvDefaultFavoritesDescription' => 'Canlı TV açıldıqda yalnız sevimli kanalları göstər', 'settings.display' => 'Ekran', @@ -2901,6 +3017,7 @@ extension on TranslationsAz { 'settings.subtitlesAndConfig' => 'Altyazılar və konfiqurasiya', 'settings.seekAndTiming' => 'Sarğı və vaxt tənzimləməsi', 'settings.behavior' => 'Davranış', + 'settings.exportDialogTitle' => 'Plezy tənzimləmələrini ixrac et', 'search.hint' => 'Kino, serial, musiqi axtar...', 'search.tryDifferentTerm' => 'Fərqli axtarış sözü cəhd edin', 'search.searchYourMedia' => 'Mediyanızda axtarın', @@ -3049,6 +3166,8 @@ extension on TranslationsAz { 'fileInfo.flagHearingImpaired' => 'Eşitmə qüsurlu üçün', 'fileInfo.flagDub' => 'Dublyaj', 'fileInfo.flagOriginal' => 'Orijinal', + 'fileInfo.channelsMono' => 'Mono', + 'fileInfo.dolbyVisionProfile' => ({required Object profile}) => 'Profil ${profile}', 'mediaMenu.markAsWatched' => 'Baxıldı olaraq işarələ', 'mediaMenu.markAsUnwatched' => 'Baxılmadı olaraq işarələ', 'mediaMenu.removeFromContinueWatching' => 'İzləməyə davam et-dən sil', @@ -3082,6 +3201,8 @@ extension on TranslationsAz { 'mediaMenu.rate' => 'Qiymətləndir', 'mediaMenu.playFromBeginning' => 'Əvvəldən oynat', 'mediaMenu.playVersion' => 'Versiyanı oynat...', + _ => null, + } ?? switch (path) { 'rateSheet.title' => 'Qiymətləndir', 'rateSheet.server' => 'Server', 'rateSheet.favorite' => 'Sevimli', @@ -3091,8 +3212,6 @@ extension on TranslationsAz { 'rateSheet.noConnectedServices' => 'Orada qiymətləndirmək üçün Tənzimləmələrdən xidmət qoşun.', 'accessibility.mediaCardMovie' => ({required Object title}) => '${title}, kino', 'accessibility.mediaCardShow' => ({required Object title}) => '${title}, TV şou', - _ => null, - } ?? switch (path) { 'accessibility.mediaCardEpisode' => ({required Object title, required Object episodeInfo}) => '${title}, ${episodeInfo}', 'accessibility.mediaCardSeason' => ({required Object title, required Object seasonInfo}) => '${title}, ${seasonInfo}', 'accessibility.mediaCardWatched' => 'baxılıb', @@ -3113,6 +3232,11 @@ extension on TranslationsAz { 'accessibility.alphabetScrollHint' => 'Hərflərə görə keçmək üçün yuxarı və ya aşağı sürüşdürün', 'accessibility.rowColumnPosition' => ({required Object row, required Object rowCount, required Object column, required Object columnCount}) => 'Sətir ${row} / ${rowCount}, sütun ${column} / ${columnCount}', 'accessibility.rowPosition' => ({required Object row, required Object rowCount}) => 'Sətir ${row} / ${rowCount}', + 'accessibility.autoScrollPlay' => 'Avtomatik sürüşdürməni başlat', + 'accessibility.autoScrollPause' => 'Avtomatik sürüşdürməyə fasilə ver', + 'accessibility.hueShort' => 'H', + 'accessibility.saturationShort' => 'S', + 'accessibility.valueShort' => 'V', 'tooltips.shufflePlay' => 'Qarışıq oynat', 'tooltips.playTrailer' => 'Treyleri oynat', 'tooltips.markAsWatched' => 'Baxıldı olaraq işarələ', @@ -3203,6 +3327,15 @@ extension on TranslationsAz { 'videoControls.subtitleDownloadedNotApplied' => 'Altyazı yükləndi, lakin seçilə bilmədi', 'videoControls.subtitleDownloadFailed' => 'Altyazı yüklənə bilmədi', 'videoControls.searchLanguages' => 'Dillərdə axtar...', + 'videoControls.skipIntro' => 'Girişi keç', + 'videoControls.skipCredits' => 'Titrləri keç', + 'videoControls.nextEpisode' => 'Növbəti seriya', + 'videoControls.subtitleTrack' => ({required Object n}) => 'Zolaq ${n}', + 'videoControls.subtitleFile' => ({required Object name}) => 'Altyazı ${name}', + 'videoControls.forcedTrack' => ({required Object label}) => '${label} (Məcburi)', + 'videoControls.osdSubtitlesOff' => 'Altyazı: Söndürülüb', + 'videoControls.osdSubtitles' => ({required Object track}) => 'Altyazı: ${track}', + 'videoControls.osdAudio' => ({required Object track}) => 'Səs: ${track}', 'messages.markedAsWatched' => 'Baxıldı olaraq işarələndi', 'messages.markedAsUnwatched' => 'Baxılmadı olaraq işarələndi', 'messages.markedAsWatchedOffline' => 'Baxıldı olaraq işarələndi (onlayn olduqda eyniləşdiriləcək)', @@ -3252,9 +3385,18 @@ extension on TranslationsAz { 'messages.serverLimitBody' => 'Server xətası (HTTP 500). Məhdudiyyət bu seansı rədd etdi.', 'messages.mediaUnreadableTitle' => 'Fayl əlçatan deyil', 'messages.mediaUnreadableBody' => 'Server bu elementi tapdı, lakin onun faylını oxuya bilmədi (HTTP 404). Fayl yəqin ki, köçürülüb, silinib və ya onun saxlanma yeri oflayndır. Server sahibindən faylı yoxlamasını və kitabxananı yenidən skan etməsini xahiş edin.', + 'messages.serverBusyTitle' => 'Yayım əlçatan deyil', + 'messages.serverBusyBody' => 'Server bu faylı yayımlamaqdan dəfələrlə imtina etdi (HTTP 503). Server yenidən başladılır və ya məşğul ola bilər, yaxud faylın yerləşdiyi yaddaş oflayn ola bilər. Bir az sonra təzədən cəhd edin — problem davam edərsə, server sahibindən serveri və faylın yerləşdiyi yaddaşı yoxlamasını istəyin.', 'messages.logsUploaded' => 'Jurnallar yükləndi', 'messages.logsUploadFailed' => 'Jurnallar yüklənə bilmədi', 'messages.logId' => 'Jurnal ID-si', + 'messages.burnedSubtitlesUseMenu' => 'Altyazılar bu yayıma həkk edilib. Onları altyazı menyusundan dəyişin.', + 'messages.noVideoUrl' => 'Video URL-i mövcud deyil', + 'messages.playbackNoMediaSources' => 'Server oynadıla bilən media mənbəyi qaytarmadı', + 'messages.playbackDataNotPrepared' => 'Məlumatları hazır olmadan oynatma başladıldı', + 'messages.streamSelectionUnavailable' => 'Bu mənbə üçün yayım seçimi mövcud deyil', + 'messages.streamSelectionFailed' => 'Seçilmiş yayımları tətbiq etmək olmadı', + 'messages.serverUnavailableForProfile' => 'Aktiv profil üçün heç bir server mövcud deyil', 'subtitlingStyling.text' => 'Mətn', 'subtitlingStyling.border' => 'Haşiyə', 'subtitlingStyling.background' => 'Arxa fon', @@ -3271,6 +3413,8 @@ extension on TranslationsAz { 'subtitlingStyling.overrideStrip' => 'Formatlaşdırmanı sil', 'subtitlingStyling.positionTop' => 'Yuxarı', 'subtitlingStyling.positionBottom' => 'Aşağı', + 'subtitlingStyling.anchorToScreen' => 'Ekrana bərkit', + 'subtitlingStyling.anchorToScreenDescription' => 'Mətn altyazılarını geniş ekranlı videonun altındakı qara zolaqlarda göstər', 'subtitlingStyling.bold' => 'Qalın', 'subtitlingStyling.italic' => 'Kursiv', 'subtitlingStyling.renderResolution' => 'Emal imkanı (Resolution)', @@ -3353,6 +3497,7 @@ extension on TranslationsAz { 'profiles.pinExplain' => 'Profillər arası keçid üçün 4 rəqəmli PIN tələb olunur.', 'profiles.continueButton' => 'Davam et', 'profiles.pinsDontMatch' => 'PIN-lər uyğun gəlmir', + 'profiles.tokenIdentityMismatch' => 'Plex profil tokeni gözlənilməyən serveri müəyyən etdi', 'connections.sectionTitle' => 'Qoşulmalar', 'connections.addConnection' => 'Qoşulma əlavə et', 'connections.addConnectionSubtitleNoProfile' => 'Plex ilə daxil olun və ya Jellyfin serverinə qoşulun', @@ -3386,6 +3531,7 @@ extension on TranslationsAz { 'discover.tvShow' => 'TV Şou', 'discover.minutesLeft' => ({required Object minutes}) => '${minutes} dəq qaldı', 'discover.moreLikeThis' => 'Buna bənzərlər', + 'discover.titleCount' => ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('az'))(n, one: '${n} başlıq', other: '${n} başlıq', ), 'errors.searchFailed' => ({required Object error}) => 'Axtarış uğursuz oldu: ${error}', 'errors.searchUnavailable' => 'Axtarış heç bir media serverinə çata bilmədi.', 'errors.connectionTimeout' => ({required Object context}) => '${context} yüklənərkən vaxt bitdi', @@ -3558,7 +3704,10 @@ extension on TranslationsAz { 'explore.characters' => 'Personajlar', 'explore.addToWatchlist' => 'İzləmə siyahısına əlavə et', 'explore.removeFromWatchlist' => 'İzləmə siyahısından sil', + 'explore.addedToWatchlist' => 'Baxış siyahısına əlavə edildi', + 'explore.removedFromWatchlist' => 'Baxış siyahısından silindi', 'explore.watchlistUpdateFailed' => 'İzləmə siyahısı yenilənə bilmədi', + 'explore.watchlistNoMatch' => 'Bu elementi heç bir baxış siyahısı ilə uyğunlaşdırmaq olmadı', 'explore.notInLibrary' => 'Kitabxananızda yoxdur', 'explore.inTheseLibraries' => 'Bu kitabxanalarda var', 'explore.checkingLibrary' => 'Kitabxananız yoxlanılır...', @@ -3566,6 +3715,8 @@ extension on TranslationsAz { 'explore.emptyMessage' => ({required Object source}) => '${source} mənbəsindən olan sətirlər burada görünəcək.', 'explore.searchHint' => ({required Object source}) => '${source} daxilində axtar', 'explore.searchEmpty' => ({required Object query}) => '"${query}" üçün nəticə tapılmadı', + _ => null, + } ?? switch (path) { 'explore.searchPrompt' => ({required Object source}) => '${source} vasitəsilə kino və seriallar axtarın.', 'explore.searchFailed' => 'Axtarış uğursuz oldu. Bağlantınızı yoxlayın.', 'explore.badge.rankPopular' => ({required Object n}) => '#${n} populyar', @@ -3605,8 +3756,6 @@ extension on TranslationsAz { 'explore.stats.completed' => ({required Object n}) => '${n} tamamladı', 'explore.stats.onHold' => ({required Object n}) => '${n} fasilədə', 'explore.stats.dropped' => ({required Object n}) => '${n} izləməyi dayandırdı', - _ => null, - } ?? switch (path) { 'explore.season.winter' => 'Qış', 'explore.season.spring' => 'Yaz', 'explore.season.summer' => 'Yay', @@ -3703,6 +3852,9 @@ extension on TranslationsAz { 'liveTv.watchChannel' => 'Kanala bax', 'liveTv.favorites' => 'Sevimlilər', 'liveTv.reorderFavorites' => 'Sevimliləri yenidən sırala', + 'liveTv.noFavoriteChannels' => 'Sevimli kanal yoxdur', + 'liveTv.noFavoriteChannelsHint' => 'Bütün kanalları göstərin, sonra kanalı sevimlilərə əlavə etmək üçün üzərinə uzun basın.', + 'liveTv.showAllChannels' => 'Bütün kanalları göstər', 'liveTv.favoritesLoadFailed' => 'Sevimlilər yüklənə bilmədi.', 'liveTv.favoritesUpdateFailed' => 'Sevimlilər yenilənə bilmədi.', 'liveTv.joinSession' => 'Davam edən seansa qoşul', @@ -3742,6 +3894,11 @@ extension on TranslationsAz { 'liveTv.guideReloadRequested' => 'Bələdçi yenilənməsi tələb olundu', 'liveTv.rulesProcessRequested' => 'Qaydaların yenidən qiymətləndirilməsi tələb olundu', 'liveTv.recordShow' => 'Şounu yaz', + 'liveTv.startingInMinutes' => ({required Object minutes}) => '${minutes} dəq sonra başlayır', + 'liveTv.dayAtTime' => ({required Object day, required Object time}) => '${day}, saat ${time}', + 'liveTv.invalidPlaybackData' => ({required Object product}) => '${product} etibarsız Canlı TV oynatma məlumatı qaytardı', + 'liveTv.failedToStartChannel' => 'Canlı kanalı başlatmaq olmadı', + 'liveTv.failedToBuildStreamUrl' => 'Yayım URL-i yaratmaq olmadı', 'collections.title' => 'Kolleksiyalar', 'collections.collection' => 'Kolleksiya', 'collections.empty' => 'Kolleksiya boşdur', @@ -3810,6 +3967,8 @@ extension on TranslationsAz { 'music.repeat' => 'Təkrarla', 'music.repeatAll' => 'Hamısını təkrarla', 'music.repeatOne' => 'Birini təkrarla', + 'music.instantMixNoServer' => 'Ani miks üçün heç bir server mövcud deyil', + 'music.noAudioUrl' => ({required Object track}) => '${track} üçün səs URL-i mövcud deyil', 'watchTogether.title' => 'Birlikdə İzlə', 'watchTogether.description' => 'Dostlarınız və ailənizlə eyni vaxtda baxın', 'watchTogether.createSession' => 'Seans yarat', @@ -3875,6 +4034,7 @@ extension on TranslationsAz { 'watchTogether.removeRoom' => 'Sil', 'watchTogether.guestSwitchUnavailable' => 'Keçid etmək olmadı — eyniləşdirmə üçün server əlçatan deyil', 'watchTogether.guestSwitchFailed' => 'Keçid etmək olmadı — məzmun tapılmadı', + 'watchTogether.defaultDisplayName' => 'İstifadəçi', 'downloads.title' => 'Yükləmələr', 'downloads.manage' => 'İdarə et', 'downloads.tvShows' => 'TV Şoular', @@ -3975,6 +4135,16 @@ extension on TranslationsAz { 'downloads.backgroundWarning.statusUnknown' => 'Hələ yoxlanılmayıb', 'downloads.backgroundWarning.settingsUnavailable' => 'Bu cihazda sistem tənzimləmələri açıla bilmədi', 'downloads.backgroundWarning.linkUnavailable' => 'Bu cihazda dontkillmyapp.com açıla bilmədi', + 'downloads.unknownShow' => 'Məlum olmayan serial', + 'downloads.unknownSeason' => 'Məlum olmayan mövsüm', + 'downloads.unknownAlbum' => 'Məlum olmayan albom', + 'downloads.completedOfTotal' => ({required Object completed, required Object total}) => '${completed}/${total} tamamlandı', + 'downloads.errorFileNotFound' => 'Fayl tapılmadı (404)', + 'downloads.errorDownloadFailed' => 'Yükləmə uğursuz oldu', + 'downloads.errorPostProcessing' => ({required Object error}) => 'Sonrakı emal uğursuz oldu: ${error}', + 'downloads.notificationDownloading' => 'Yüklənir...', + 'downloads.notificationComplete' => 'Yükləmə tamamlandı', + 'downloads.notificationPaused' => 'Yükləmə dayandırıldı', 'shaders.title' => 'Şeyderlər', 'shaders.noShaderDescription' => 'Video təkmilləşdirməsi yoxdur', 'shaders.nvscalerDescription' => 'Daha kəskin video üçün NVIDIA miqyaslaması', @@ -4054,14 +4224,24 @@ extension on TranslationsAz { 'companionRemote.errors.failedToConnectAnyAddress' => 'Heç bir ünvana qoşuluna bilmədi', 'companionRemote.errors.connectionLostAfterAttempts' => ({required Object attempts}) => '${attempts} cəhddən sonra əlaqə kəsildi', 'companionRemote.errors.connectionLost' => 'Əlaqə kəsildi', + 'companionRemote.closedBeforeAuth' => 'Bağlantı autentifikasiyadan əvvəl bağlandı', 'videoSettings.playbackSpeed' => 'Oynatma sürəti', 'videoSettings.normalSpeed' => 'Normal', 'videoSettings.sleepTimerActive' => ({required Object duration}) => 'Aktivdir (${duration})', 'videoSettings.zoom' => 'Miqyas', + _ => null, + } ?? switch (path) { 'videoSettings.sleepTimer' => 'Yuxu taymeri', 'videoSettings.audioSync' => 'Səs sinxronizasiyası', 'videoSettings.subtitleSync' => 'Altyazı sinxronizasiyası', 'videoSettings.hdr' => 'HDR', + 'videoSettings.hdrUnsupported' => 'HDR burada əlçatan deyil — bu masaüstü kompozitoru və ya video çıxışı onu ötürə bilmir.', + 'videoSettings.hdrToneMapping' => 'HDR ton uyğunlaşdırması', + 'videoSettings.hdrToneMappingCompositor' => 'Kompozitor', + 'videoSettings.hdrToneMappingCompositorDescription' => 'Mənbənin HDR metaməlumatlarını dəyişmədən ötür və ton uyğunlaşdırmasını masaüstü kompozitoruna həvalə et.', + 'videoSettings.hdrToneMappingPlayer' => 'Oynadıcı', + 'videoSettings.hdrToneMappingPlayerDescription' => 'Oynadıcıda tonları ekranın pik parlaqlığına uyğunlaşdır, sonra nəticəni kompozitora bildir.', + 'videoSettings.hdrToneMappingFailed' => 'HDR ton uyğunlaşdırmasını dəyişmək olmadı — əvvəlki rejim hələ də aktivdir.', 'videoSettings.audioOutput' => 'Səs çıxışı', 'videoSettings.performanceOverlay' => 'Məhsuldarlıq paneli', 'videoSettings.audioOutputDolbyAtmos' => 'Dolby Atmos', @@ -4106,6 +4286,16 @@ extension on TranslationsAz { 'performanceOverlay.player' => 'Oynadıcı', 'performanceOverlay.memory' => 'Yaddaş', 'performanceOverlay.uiFps' => 'Arayüz (UI) FPS-i', + 'performanceOverlay.fps' => 'FPS', + 'performanceOverlay.decoderAndroidHw' => 'Android HW', + 'performanceOverlay.decoderNvidiaHw' => 'NVIDIA HW', + 'performanceOverlay.decoderQualcommHw' => 'Qualcomm HW', + 'performanceOverlay.decoderMediatekHw' => 'MediaTek HW', + 'performanceOverlay.decoderExynosHw' => 'Exynos HW', + 'performanceOverlay.decoderSoftware' => 'Proqram təminatı', + 'performanceOverlay.decoderHardware' => 'Aparat təminatı', + 'performanceOverlay.tunnelingActive' => 'Aktiv', + 'performanceOverlay.dvRpuFailed' => ({required Object converted, required Object failures}) => '${converted} (${failures} uğursuz)', 'externalPlayer.title' => 'Xarici oynadıcı', 'externalPlayer.useExternalPlayer' => 'Xarici oynadıcı istifadə et', 'externalPlayer.useExternalPlayerDescription' => 'Videoları başqa tətbiqdə açın', @@ -4119,8 +4309,6 @@ extension on TranslationsAz { 'externalPlayer.playerPackage' => 'Paket adı', 'externalPlayer.playerUrlScheme' => 'URL sxemi', 'externalPlayer.off' => 'Söndürülüb', - _ => null, - } ?? switch (path) { 'externalPlayer.launchFailed' => 'Xarici oynadıcı açıla bilmədi', 'externalPlayer.appNotInstalled' => ({required Object name}) => '${name} quraşdırılmayıb', 'externalPlayer.playInExternalPlayer' => 'Xarici oynadıcıda oynat', @@ -4254,6 +4442,16 @@ extension on TranslationsAz { 'seerr.statusPartiallyAvailable' => 'Hissəvi əlçatandır', 'seerr.statusRequested' => 'Sorğu göndərildi', 'seerr.statusProcessing' => 'Emal edilir', + 'seerr.couldNotReach' => ({required Object url, required Object error}) => '${url} ünvanına çatmaq olmadı: ${error}', + 'seerr.noInstanceAtUrl' => ({required Object url, required Object status}) => '${url} ünvanında Seerr instansiyası yoxdur (HTTP ${status})', + 'seerr.notInitialized' => 'Bu Seerr instansiyasının ilkin quraşdırılması tamamlanmayıb', + 'seerr.noPlexTokenForReauth' => 'Yenidən daxil olmaq üçün Plex tokeni mövcud deyil', + 'seerr.noStoredCredentials' => 'Yenidən daxil olmaq üçün yadda saxlanmış giriş məlumatları mövcud deyil', + 'seerr.signInRejected' => 'Daxil olma rədd edildi', + 'seerr.noSessionCookie' => 'Seerr sessiya kukisi yaratmadı', + 'seerr.freshCookieRejected' => 'Seerr yeni sessiya kukisini rədd etdi', + 'seerr.noUserInformation' => 'Seerr istifadəçi məlumatlarını qaytarmadı', + 'seerr.sessionRejectedAfterReauth' => 'Yenidən daxil olduqdan sonra sessiya rədd edildi', 'services.title' => 'Xidmətlər', 'services.hubSubtitle' => 'İzləmə tərəqqisini eyniləşdirin və yeni başlıqlar sorğulayın.', 'services.notConnected' => 'Qoşulmayıb', @@ -4269,6 +4467,7 @@ extension on TranslationsAz { 'services.names.seerr' => 'Seerr', 'services.names.mdblist' => 'MDBList', 'services.deviceCode.title' => ({required Object service}) => 'Plezy-ni ${service} üzərində aktivləşdirin', + 'services.deviceCode.instructions' => 'QR kodunu skan edin və ya aşağıdakı ünvana keçib bu kodu daxil edin:', 'services.deviceCode.openToActivate' => ({required Object service}) => 'Aktivləşdirmək üçün ${service} açın', 'services.deviceCode.copyCode' => 'Aktivləşdirmə kodunu kopyala', 'services.deviceCode.waitingForAuthorization' => 'Səlahiyyət gözlənilir…', @@ -4318,6 +4517,24 @@ extension on TranslationsAz { 'addServer.connectToMediaBrowserCardSubtitleScoped' => ({required Object product, required Object name}) => '${product} serverinizə daxil olun. ${name} ilə əlaqələndirilir.', 'addServer.borrowFromAnotherProfile' => 'Başqa profildən götür', 'addServer.borrowFromAnotherProfileSubtitle' => 'Başqa profilin qoşulmasını yenidən istifadə edin.', + 'addServer.invalidCredentials' => 'İstifadəçi adı və ya şifrə yanlışdır', + 'addServer.authResponseNotJson' => 'Autentifikasiya cavabı etibarlı JSON deyildi', + 'addServer.quickConnectRejected' => 'Quick Connect server tərəfindən rədd edildi', + 'addServer.quickConnectNotJson' => 'Quick Connect cavabı etibarlı JSON deyildi', + 'addServer.quickConnectMissingFields' => 'Quick Connect cavabında kod və ya məxfi açar yoxdur', + 'addServer.quickConnectPollRejected' => 'Quick Connect sorğulaması server tərəfindən rədd edildi', + 'addServer.serverTimedOut' => 'Server vaxtında cavab vermədi', + 'addServer.responseNotJson' => 'Server cavabı etibarlı JSON deyildi', + 'addServer.responseMissingIdentity' => ({required Object product}) => 'Cavabda ID və ya server adı yoxdur — bu, ${product} serveridir?', + 'addServer.probeFailed' => ({required Object error}) => 'Serverə çatmaq olmadı: ${error}', + 'addServer.enterAtLeastOneUrl' => ({required Object product}) => 'Ən azı bir ${product} server URL-i daxil edin', + 'addServer.noReachableServer' => ({required Object product}) => 'Əlçatan ${product} serveri tapılmadı', + 'addServer.urlsPointToDifferentServers' => ({required Object product}) => 'Bu URL-lər fərqli ${product} serverlərinə aiddir', + 'addServer.urlDoesNotMatchServer' => ({required Object product}) => 'Bu URL ${product} serverinə uyğun gəlmir', + 'addServer.redirectUnsupported' => 'Server dəstəklənməyən URL-ə yönləndirdi', + 'addServer.redirectDifferentHost' => ({required Object product}) => 'Server başqa hosta yönləndirdi. Son ${product} URL-ni birbaşa daxil edin.', + 'addServer.redirectInsecure' => 'Server HTTPS-dən təhlükəsiz olmayan URL-ə yönləndirdi', + 'addServer.redirectUnsupportedEnterFinal' => ({required Object product}) => 'Server dəstəklənməyən URL-ə yönləndirdi. Son ${product} URL-ni birbaşa daxil edin.', _ => null, }; } diff --git a/lib/i18n/strings_bg.g.dart b/lib/i18n/strings_bg.g.dart index 91476a12..0b358922 100644 --- a/lib/i18n/strings_bg.g.dart +++ b/lib/i18n/strings_bg.g.dart @@ -123,6 +123,7 @@ class _Translations$auth$bg extends Translations$auth$en { @override String get quickConnectCancel => 'Отказ'; @override String get quickConnectExpired => 'Quick Connect изтече. Опитайте отново.'; @override String get localDataRecoveryRequired => 'Plezy не успя безопасно да възстанови локалните данни за вход и несинхронизираните данни за възпроизвеждане. Моля, влезте отново.'; + @override String get pinCheckRejected => 'Проверката на PIN кода на Plex беше отхвърлена'; } // Path: common @@ -178,6 +179,9 @@ class _Translations$common$bg extends Translations$common$en { @override String get exitFullscreen => 'Изход от цял екран'; @override String get pressBackAgainToExit => 'Натиснете Назад отново, за да излезете'; @override late final _Translations$common$ratingSource$bg ratingSource = _Translations$common$ratingSource$bg._(_root); + @override String get notAvailable => 'Н/Д'; + @override String get url => 'URL'; + @override String get letterKeys => 'АБВ'; } // Path: screens @@ -444,6 +448,8 @@ class _Translations$settings$bg extends Translations$settings$en { @override String get showNavBarLabels => 'Показвай етикети в навигационната лента'; @override String get showNavBarLabelsDescription => 'Показвай текстови етикети под иконите в навигационната лента'; @override String get startupSection => 'Начален раздел'; + @override String get showExploreTab => 'Показване на раздела „Открий“'; + @override String get showExploreTabDescription => 'Показва раздела „Открий“ със съдържание от Plex Discover и свързаните тракери'; @override String get liveTvDefaultFavorites => 'По подразбиране към любими канали'; @override String get liveTvDefaultFavoritesDescription => 'Показвай само любими канали при отваряне на телевизия на живо'; @override String get display => 'Дисплей'; @@ -455,6 +461,7 @@ class _Translations$settings$bg extends Translations$settings$en { @override String get subtitlesAndConfig => 'Субтитри и конфигурация'; @override String get seekAndTiming => 'Търсене и време'; @override String get behavior => 'Поведение'; + @override String get exportDialogTitle => 'Експортиране на настройките на Plezy'; } // Path: search @@ -606,6 +613,8 @@ class _Translations$fileInfo$bg extends Translations$fileInfo$en { @override String get flagHearingImpaired => 'За хора с увреден слух'; @override String get flagDub => 'Дублаж'; @override String get flagOriginal => 'Оригинал'; + @override String get channelsMono => 'Моно'; + @override String dolbyVisionProfile({required Object profile}) => 'Профил ${profile}'; } // Path: mediaMenu @@ -704,6 +713,11 @@ class _Translations$accessibility$bg extends Translations$accessibility$en { @override String get alphabetScrollHint => 'Плъзни нагоре или надолу, за да преминеш към друга буква'; @override String rowColumnPosition({required Object row, required Object rowCount, required Object column, required Object columnCount}) => 'Ред ${row} от ${rowCount}, колона ${column} от ${columnCount}'; @override String rowPosition({required Object row, required Object rowCount}) => 'Ред ${row} от ${rowCount}'; + @override String get autoScrollPlay => 'Пусни автоматичното превъртане'; + @override String get autoScrollPause => 'Пауза на автоматичното превъртане'; + @override String get hueShort => 'H'; + @override String get saturationShort => 'S'; + @override String get valueShort => 'V'; } // Path: tooltips @@ -815,6 +829,15 @@ class _Translations$videoControls$bg extends Translations$videoControls$en { @override String get subtitleDownloadedNotApplied => 'Субтитрите са изтеглени, но не можаха да бъдат избрани'; @override String get subtitleDownloadFailed => 'Неуспешно изтегляне на субтитър'; @override String get searchLanguages => 'Търсене на езици...'; + @override String get skipIntro => 'Пропусни интрото'; + @override String get skipCredits => 'Пропусни надписите'; + @override String get nextEpisode => 'Следващ епизод'; + @override String subtitleTrack({required Object n}) => 'Пътечка ${n}'; + @override String subtitleFile({required Object name}) => 'Субтитри ${name}'; + @override String forcedTrack({required Object label}) => '${label} (Принудителни)'; + @override String get osdSubtitlesOff => 'Субтитри: изкл.'; + @override String osdSubtitles({required Object track}) => 'Субтитри: ${track}'; + @override String osdAudio({required Object track}) => 'Аудио: ${track}'; } // Path: messages @@ -876,9 +899,18 @@ class _Translations$messages$bg extends Translations$messages$en { @override String get serverLimitBody => 'Грешка на сървъра (HTTP 500). Вероятно лимит за пропускателна способност/транскодиране е отхвърлил тази сесия. Помолете собственика да го коригира.'; @override String get mediaUnreadableTitle => 'Файлът е недостъпен'; @override String get mediaUnreadableBody => 'Сървърът намери този елемент, но не можа да прочете файла му (HTTP 404). Файлът вероятно е бил преместен, изтрит или хранилището му е офлайн. Помолете собственика на сървъра да провери файла и да сканира отново библиотеката.'; + @override String get serverBusyTitle => 'Потокът не е наличен'; + @override String get serverBusyBody => 'Сървърът многократно отказа да предава този файл поточно (HTTP 503). Възможно е да се рестартира, да е зает или хранилището на файла да е офлайн. Опитайте отново след малко — ако проблемът продължи, помолете собственика на сървъра да провери сървъра и хранилището на файла.'; @override String get logsUploaded => 'Логовете са качени'; @override String get logsUploadFailed => 'Неуспешно качване на логовете'; @override String get logId => 'ID на лога'; + @override String get burnedSubtitlesUseMenu => 'Субтитрите са вградени в този поток. Променете ги от менюто за субтитри.'; + @override String get noVideoUrl => 'Няма наличен URL за видеото'; + @override String get playbackNoMediaSources => 'Сървърът не върна медийни източници, годни за възпроизвеждане'; + @override String get playbackDataNotPrepared => 'Възпроизвеждането беше стартирано, преди данните за него да са готови'; + @override String get streamSelectionUnavailable => 'Изборът на потоци не е наличен за този източник'; + @override String get streamSelectionFailed => 'Избраните потоци не можаха да бъдат приложени'; + @override String get serverUnavailableForProfile => 'Няма наличен сървър за активния профил'; } // Path: subtitlingStyling @@ -904,6 +936,8 @@ class _Translations$subtitlingStyling$bg extends Translations$subtitlingStyling$ @override String get overrideStrip => 'Премахване на стиловете'; @override String get positionTop => 'Горе'; @override String get positionBottom => 'Долу'; + @override String get anchorToScreen => 'Закрепване към екрана'; + @override String get anchorToScreenDescription => 'Показва текстовите субтитри в черните ленти под широкоекранното видео'; @override String get bold => 'Получер'; @override String get italic => 'Курсив'; @override String get renderResolution => 'Резолюция на изобразяване'; @@ -1013,6 +1047,7 @@ class _Translations$profiles$bg extends Translations$profiles$en { @override String get pinExplain => 'Изисква се 4-цифрен PIN за смяна на профили.'; @override String get continueButton => 'Продължи'; @override String get pinsDontMatch => 'PIN кодовете не съвпадат'; + @override String get tokenIdentityMismatch => 'Токенът на профила в Plex съответства на неочакван сървър'; } // Path: connections @@ -1064,6 +1099,10 @@ class _Translations$discover$bg extends Translations$discover$en { @override String get tvShow => 'ТВ сериал'; @override String minutesLeft({required Object minutes}) => 'Остават ${minutes} мин'; @override String get moreLikeThis => 'Подобно на това'; + @override String titleCount({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('bg'))(n, + one: '${n} заглавие', + other: '${n} заглавия', + ); } // Path: errors @@ -1276,7 +1315,10 @@ class _Translations$explore$bg extends Translations$explore$en { @override String get characters => 'Герои'; @override String get addToWatchlist => 'Добави в списъка за гледане'; @override String get removeFromWatchlist => 'Премахни от списъка за гледане'; + @override String get addedToWatchlist => 'Добавено към списъка за гледане'; + @override String get removedFromWatchlist => 'Премахнато от списъка за гледане'; @override String get watchlistUpdateFailed => 'Неуспешно обновяване на списъка за гледане'; + @override String get watchlistNoMatch => 'Този елемент не можа да бъде съпоставен със списък за гледане'; @override String get notInLibrary => 'Не е в твоята библиотека'; @override String get inTheseLibraries => 'В тези библиотеки'; @override String get checkingLibrary => 'Проверка на твоята библиотека...'; @@ -1337,6 +1379,9 @@ class _Translations$liveTv$bg extends Translations$liveTv$en { @override String get watchChannel => 'Гледай канал'; @override String get favorites => 'Любими'; @override String get reorderFavorites => 'Пренареди любимите'; + @override String get noFavoriteChannels => 'Няма любими канали'; + @override String get noFavoriteChannelsHint => 'Покажете всички канали, след което натиснете и задръжте канал, за да го добавите към любимите си.'; + @override String get showAllChannels => 'Покажи всички канали'; @override String get favoritesLoadFailed => 'Любимите не можаха да се заредят. Проверете връзката си и опитайте отново.'; @override String get favoritesUpdateFailed => 'Любимите не можаха да бъдат обновени. Проверете връзката си и опитайте отново.'; @override String get joinSession => 'Присъедини се към текуща сесия'; @@ -1376,6 +1421,11 @@ class _Translations$liveTv$bg extends Translations$liveTv$en { @override String get guideReloadRequested => 'Заявено е опресняване на ТВ програмата'; @override String get rulesProcessRequested => 'Заявена е преоценка на правилата'; @override String get recordShow => 'Запиши предаването'; + @override String startingInMinutes({required Object minutes}) => 'Започва след ${minutes} мин'; + @override String dayAtTime({required Object day, required Object time}) => '${day} в ${time}'; + @override String invalidPlaybackData({required Object product}) => '${product} върна невалидни данни за възпроизвеждане на телевизия на живо'; + @override String get failedToStartChannel => 'Каналът на живо не можа да бъде пуснат'; + @override String get failedToBuildStreamUrl => 'URL за потока не можа да бъде създаден'; } // Path: collections @@ -1474,6 +1524,8 @@ class _Translations$music$bg extends Translations$music$en { @override String get repeat => 'Повтаряне'; @override String get repeatAll => 'Повтаряне на всички'; @override String get repeatOne => 'Повтаряне на една'; + @override String get instantMixNoServer => 'Няма наличен сървър за незабавен микс'; + @override String noAudioUrl({required Object track}) => 'Няма наличен URL за аудиото на ${track}'; } // Path: watchTogether @@ -1548,6 +1600,7 @@ class _Translations$watchTogether$bg extends Translations$watchTogether$en { @override String get removeRoom => 'Премахни'; @override String get guestSwitchUnavailable => 'Превключването не е възможно — сървърът е недостъпен за синхронизация'; @override String get guestSwitchFailed => 'Превключването не е възможно — съдържанието не е намерено на този сървър'; + @override String get defaultDisplayName => 'Потребител'; } // Path: downloads @@ -1632,6 +1685,16 @@ class _Translations$downloads$bg extends Translations$downloads$en { @override String get syncRuleUnknownServer => 'Неизвестен сървър'; @override String get syncRuleListCreated => 'Правилото за синхронизация е създадено'; @override late final _Translations$downloads$backgroundWarning$bg backgroundWarning = _Translations$downloads$backgroundWarning$bg._(_root); + @override String get unknownShow => 'Неизвестен сериал'; + @override String get unknownSeason => 'Неизвестен сезон'; + @override String get unknownAlbum => 'Неизвестен албум'; + @override String completedOfTotal({required Object completed, required Object total}) => 'Завършени: ${completed}/${total}'; + @override String get errorFileNotFound => 'Файлът не е намерен (404)'; + @override String get errorDownloadFailed => 'Изтеглянето е неуспешно'; + @override String errorPostProcessing({required Object error}) => 'Последващата обработка е неуспешна: ${error}'; + @override String get notificationDownloading => 'Изтегляне...'; + @override String get notificationComplete => 'Изтеглянето завърши'; + @override String get notificationPaused => 'Изтеглянето е на пауза'; } // Path: shaders @@ -1672,6 +1735,7 @@ class _Translations$companionRemote$bg extends Translations$companionRemote$en { @override late final _Translations$companionRemote$pairing$bg pairing = _Translations$companionRemote$pairing$bg._(_root); @override late final _Translations$companionRemote$remote$bg remote = _Translations$companionRemote$remote$bg._(_root); @override late final _Translations$companionRemote$errors$bg errors = _Translations$companionRemote$errors$bg._(_root); + @override String get closedBeforeAuth => 'Връзката беше затворена преди удостоверяването'; } // Path: videoSettings @@ -1689,6 +1753,13 @@ class _Translations$videoSettings$bg extends Translations$videoSettings$en { @override String get audioSync => 'Синхронизация на аудио'; @override String get subtitleSync => 'Синхронизация на субтитри'; @override String get hdr => 'HDR'; + @override String get hdrUnsupported => 'HDR не е наличен тук — този композитор на работния плот или видеоизходът не може да го предава.'; + @override String get hdrToneMapping => 'Тонално преобразуване на HDR'; + @override String get hdrToneMappingCompositor => 'Композитор'; + @override String get hdrToneMappingCompositorDescription => 'Предава HDR метаданните на източника без промяна и оставя композитора на работния плот да извърши тоналното преобразуване.'; + @override String get hdrToneMappingPlayer => 'Плейър'; + @override String get hdrToneMappingPlayerDescription => 'Извършва тоналното преобразуване в плейъра според пиковата яркост на дисплея, след което указва резултата на композитора.'; + @override String get hdrToneMappingFailed => 'Тоналното преобразуване на HDR не можа да бъде променено — предишният режим остава активен.'; @override String get audioOutput => 'Аудио изход'; @override String get performanceOverlay => 'Оверлей за производителност'; @override String get audioOutputDolbyAtmos => 'Dolby Atmos'; @@ -1742,6 +1813,16 @@ class _Translations$performanceOverlay$bg extends Translations$performanceOverla @override String get player => 'Плеър'; @override String get memory => 'Памет'; @override String get uiFps => 'FPS на интерфейса'; + @override String get fps => 'FPS'; + @override String get decoderAndroidHw => 'Android HW'; + @override String get decoderNvidiaHw => 'NVIDIA HW'; + @override String get decoderQualcommHw => 'Qualcomm HW'; + @override String get decoderMediatekHw => 'MediaTek HW'; + @override String get decoderExynosHw => 'Exynos HW'; + @override String get decoderSoftware => 'Софтуерен'; + @override String get decoderHardware => 'Хардуерен'; + @override String get tunnelingActive => 'Активно'; + @override String dvRpuFailed({required Object converted, required Object failures}) => '${converted} (неуспешни: ${failures})'; } // Path: externalPlayer @@ -1942,6 +2023,16 @@ class _Translations$seerr$bg extends Translations$seerr$en { @override String get statusPartiallyAvailable => 'Частично налично'; @override String get statusRequested => 'Заявено'; @override String get statusProcessing => 'Обработва се'; + @override String couldNotReach({required Object url, required Object error}) => 'Неуспешна връзка с ${url}: ${error}'; + @override String noInstanceAtUrl({required Object url, required Object status}) => 'На ${url} няма инстанция на Seerr (HTTP ${status})'; + @override String get notInitialized => 'Тази инстанция на Seerr не е завършила първоначалната настройка'; + @override String get noPlexTokenForReauth => 'Няма наличен Plex токен за повторен вход'; + @override String get noStoredCredentials => 'Няма запазени данни за повторен вход'; + @override String get signInRejected => 'Входът беше отхвърлен'; + @override String get noSessionCookie => 'Seerr не издаде бисквитка за сесията'; + @override String get freshCookieRejected => 'Seerr отхвърли новата бисквитка за сесията'; + @override String get noUserInformation => 'Seerr не върна информация за потребителя'; + @override String get sessionRejectedAfterReauth => 'Сесията беше отхвърлена след повторния вход'; } // Path: services @@ -2002,6 +2093,24 @@ class _Translations$addServer$bg extends Translations$addServer$en { @override String connectToMediaBrowserCardSubtitleScoped({required Object product, required Object name}) => 'Впишете се в своя ${product} сървър. Обвързва се с ${name}.'; @override String get borrowFromAnotherProfile => 'Използвай от друг профил'; @override String get borrowFromAnotherProfileSubtitle => 'Използвай връзка от друг профил. PIN-защитените профили изискват PIN.'; + @override String get invalidCredentials => 'Невалидно потребителско име или парола'; + @override String get authResponseNotJson => 'Отговорът при удостоверяване не беше валиден JSON'; + @override String get quickConnectRejected => 'Quick Connect беше отхвърлен от сървъра'; + @override String get quickConnectNotJson => 'Отговорът на Quick Connect не беше валиден JSON'; + @override String get quickConnectMissingFields => 'В отговора на Quick Connect липсва код или таен ключ'; + @override String get quickConnectPollRejected => 'Запитването на Quick Connect беше отхвърлено от сървъра'; + @override String get serverTimedOut => 'Сървърът не отговори навреме'; + @override String get responseNotJson => 'Отговорът на сървъра не беше валиден JSON'; + @override String responseMissingIdentity({required Object product}) => 'В отговора липсва ID или име на сървъра — това сървър на ${product} ли е?'; + @override String probeFailed({required Object error}) => 'Сървърът не може да бъде достигнат: ${error}'; + @override String enterAtLeastOneUrl({required Object product}) => 'Въведете поне един URL на сървър на ${product}'; + @override String noReachableServer({required Object product}) => 'Не беше намерен достъпен сървър на ${product}'; + @override String urlsPointToDifferentServers({required Object product}) => 'Тези URL адреси сочат към различни сървъри на ${product}'; + @override String urlDoesNotMatchServer({required Object product}) => 'Този URL не съответства на сървъра на ${product}'; + @override String get redirectUnsupported => 'Сървърът пренасочи към неподдържан URL'; + @override String redirectDifferentHost({required Object product}) => 'Сървърът пренасочи към друг хост. Въведете директно крайния URL на ${product}.'; + @override String get redirectInsecure => 'Сървърът пренасочи от HTTPS към незащитен URL'; + @override String redirectUnsupportedEnterFinal({required Object product}) => 'Сървърът пренасочи към неподдържан URL. Въведете директно крайния URL на ${product}.'; } // Path: common.ratingSource @@ -2521,6 +2630,7 @@ class _Translations$services$deviceCode$bg extends Translations$services$deviceC // Translations @override String title({required Object service}) => 'Активиране на Plezy в ${service}'; + @override String get instructions => 'Сканирайте QR кода или посетете адреса по-долу и въведете този код:'; @override String openToActivate({required Object service}) => 'Отворете ${service}, за да активирате'; @override String get copyCode => 'Копирай кода за активиране'; @override String get waitingForAuthorization => 'Изчакване на оторизация…'; @@ -2595,6 +2705,7 @@ extension on TranslationsBg { 'auth.quickConnectCancel' => 'Отказ', 'auth.quickConnectExpired' => 'Quick Connect изтече. Опитайте отново.', 'auth.localDataRecoveryRequired' => 'Plezy не успя безопасно да възстанови локалните данни за вход и несинхронизираните данни за възпроизвеждане. Моля, влезте отново.', + 'auth.pinCheckRejected' => 'Проверката на PIN кода на Plex беше отхвърлена', 'common.cancel' => 'Отказ', 'common.save' => 'Запази', 'common.close' => 'Затвори', @@ -2651,6 +2762,9 @@ extension on TranslationsBg { 'common.ratingSource.trakt' => 'Trakt', 'common.ratingSource.rottenTomatoesCritic' => 'Критиците на Rotten Tomatoes', 'common.ratingSource.rottenTomatoesAudience' => 'Публиката на Rotten Tomatoes', + 'common.notAvailable' => 'Н/Д', + 'common.url' => 'URL', + 'common.letterKeys' => 'АБВ', 'screens.licenses' => 'Лицензи', 'screens.switchProfile' => 'Смяна на профил', 'screens.subtitleStyling' => 'Стил на субтитрите', @@ -2890,6 +3004,8 @@ extension on TranslationsBg { 'settings.showNavBarLabels' => 'Показвай етикети в навигационната лента', 'settings.showNavBarLabelsDescription' => 'Показвай текстови етикети под иконите в навигационната лента', 'settings.startupSection' => 'Начален раздел', + 'settings.showExploreTab' => 'Показване на раздела „Открий“', + 'settings.showExploreTabDescription' => 'Показва раздела „Открий“ със съдържание от Plex Discover и свързаните тракери', 'settings.liveTvDefaultFavorites' => 'По подразбиране към любими канали', 'settings.liveTvDefaultFavoritesDescription' => 'Показвай само любими канали при отваряне на телевизия на живо', 'settings.display' => 'Дисплей', @@ -2901,6 +3017,7 @@ extension on TranslationsBg { 'settings.subtitlesAndConfig' => 'Субтитри и конфигурация', 'settings.seekAndTiming' => 'Търсене и време', 'settings.behavior' => 'Поведение', + 'settings.exportDialogTitle' => 'Експортиране на настройките на Plezy', 'search.hint' => 'Търсене на филми, сериали, музика...', 'search.tryDifferentTerm' => 'Опитайте с различна дума за търсене', 'search.searchYourMedia' => 'Търсете в медийното си съдържание', @@ -3049,6 +3166,8 @@ extension on TranslationsBg { 'fileInfo.flagHearingImpaired' => 'За хора с увреден слух', 'fileInfo.flagDub' => 'Дублаж', 'fileInfo.flagOriginal' => 'Оригинал', + 'fileInfo.channelsMono' => 'Моно', + 'fileInfo.dolbyVisionProfile' => ({required Object profile}) => 'Профил ${profile}', 'mediaMenu.markAsWatched' => 'Маркирай като гледано', 'mediaMenu.markAsUnwatched' => 'Маркирай като негледано', 'mediaMenu.removeFromContinueWatching' => 'Премахни от продължаване на гледането', @@ -3082,6 +3201,8 @@ extension on TranslationsBg { 'mediaMenu.rate' => 'Оцени', 'mediaMenu.playFromBeginning' => 'Пусни от началото', 'mediaMenu.playVersion' => 'Пусни версия...', + _ => null, + } ?? switch (path) { 'rateSheet.title' => 'Оцени', 'rateSheet.server' => 'Сървър', 'rateSheet.favorite' => 'Добави в любими', @@ -3091,8 +3212,6 @@ extension on TranslationsBg { 'rateSheet.noConnectedServices' => 'Свържи услуга от настройките, за да оценяваш и в нея.', 'accessibility.mediaCardMovie' => ({required Object title}) => '${title}, филм', 'accessibility.mediaCardShow' => ({required Object title}) => '${title}, ТВ сериал', - _ => null, - } ?? switch (path) { 'accessibility.mediaCardEpisode' => ({required Object title, required Object episodeInfo}) => '${title}, ${episodeInfo}', 'accessibility.mediaCardSeason' => ({required Object title, required Object seasonInfo}) => '${title}, ${seasonInfo}', 'accessibility.mediaCardWatched' => 'гледано', @@ -3113,6 +3232,11 @@ extension on TranslationsBg { 'accessibility.alphabetScrollHint' => 'Плъзни нагоре или надолу, за да преминеш към друга буква', 'accessibility.rowColumnPosition' => ({required Object row, required Object rowCount, required Object column, required Object columnCount}) => 'Ред ${row} от ${rowCount}, колона ${column} от ${columnCount}', 'accessibility.rowPosition' => ({required Object row, required Object rowCount}) => 'Ред ${row} от ${rowCount}', + 'accessibility.autoScrollPlay' => 'Пусни автоматичното превъртане', + 'accessibility.autoScrollPause' => 'Пауза на автоматичното превъртане', + 'accessibility.hueShort' => 'H', + 'accessibility.saturationShort' => 'S', + 'accessibility.valueShort' => 'V', 'tooltips.shufflePlay' => 'Разбъркано възпроизвеждане', 'tooltips.playTrailer' => 'Пусни трейлър', 'tooltips.markAsWatched' => 'Маркирай като гледано', @@ -3203,6 +3327,15 @@ extension on TranslationsBg { 'videoControls.subtitleDownloadedNotApplied' => 'Субтитрите са изтеглени, но не можаха да бъдат избрани', 'videoControls.subtitleDownloadFailed' => 'Неуспешно изтегляне на субтитър', 'videoControls.searchLanguages' => 'Търсене на езици...', + 'videoControls.skipIntro' => 'Пропусни интрото', + 'videoControls.skipCredits' => 'Пропусни надписите', + 'videoControls.nextEpisode' => 'Следващ епизод', + 'videoControls.subtitleTrack' => ({required Object n}) => 'Пътечка ${n}', + 'videoControls.subtitleFile' => ({required Object name}) => 'Субтитри ${name}', + 'videoControls.forcedTrack' => ({required Object label}) => '${label} (Принудителни)', + 'videoControls.osdSubtitlesOff' => 'Субтитри: изкл.', + 'videoControls.osdSubtitles' => ({required Object track}) => 'Субтитри: ${track}', + 'videoControls.osdAudio' => ({required Object track}) => 'Аудио: ${track}', 'messages.markedAsWatched' => 'Маркирано като гледано', 'messages.markedAsUnwatched' => 'Маркирано като негледано', 'messages.markedAsWatchedOffline' => 'Маркирано като гледано (ще се синхронизира, когато сте онлайн)', @@ -3252,9 +3385,18 @@ extension on TranslationsBg { 'messages.serverLimitBody' => 'Грешка на сървъра (HTTP 500). Вероятно лимит за пропускателна способност/транскодиране е отхвърлил тази сесия. Помолете собственика да го коригира.', 'messages.mediaUnreadableTitle' => 'Файлът е недостъпен', 'messages.mediaUnreadableBody' => 'Сървърът намери този елемент, но не можа да прочете файла му (HTTP 404). Файлът вероятно е бил преместен, изтрит или хранилището му е офлайн. Помолете собственика на сървъра да провери файла и да сканира отново библиотеката.', + 'messages.serverBusyTitle' => 'Потокът не е наличен', + 'messages.serverBusyBody' => 'Сървърът многократно отказа да предава този файл поточно (HTTP 503). Възможно е да се рестартира, да е зает или хранилището на файла да е офлайн. Опитайте отново след малко — ако проблемът продължи, помолете собственика на сървъра да провери сървъра и хранилището на файла.', 'messages.logsUploaded' => 'Логовете са качени', 'messages.logsUploadFailed' => 'Неуспешно качване на логовете', 'messages.logId' => 'ID на лога', + 'messages.burnedSubtitlesUseMenu' => 'Субтитрите са вградени в този поток. Променете ги от менюто за субтитри.', + 'messages.noVideoUrl' => 'Няма наличен URL за видеото', + 'messages.playbackNoMediaSources' => 'Сървърът не върна медийни източници, годни за възпроизвеждане', + 'messages.playbackDataNotPrepared' => 'Възпроизвеждането беше стартирано, преди данните за него да са готови', + 'messages.streamSelectionUnavailable' => 'Изборът на потоци не е наличен за този източник', + 'messages.streamSelectionFailed' => 'Избраните потоци не можаха да бъдат приложени', + 'messages.serverUnavailableForProfile' => 'Няма наличен сървър за активния профил', 'subtitlingStyling.text' => 'Текст', 'subtitlingStyling.border' => 'Контур', 'subtitlingStyling.background' => 'Фон', @@ -3271,6 +3413,8 @@ extension on TranslationsBg { 'subtitlingStyling.overrideStrip' => 'Премахване на стиловете', 'subtitlingStyling.positionTop' => 'Горе', 'subtitlingStyling.positionBottom' => 'Долу', + 'subtitlingStyling.anchorToScreen' => 'Закрепване към екрана', + 'subtitlingStyling.anchorToScreenDescription' => 'Показва текстовите субтитри в черните ленти под широкоекранното видео', 'subtitlingStyling.bold' => 'Получер', 'subtitlingStyling.italic' => 'Курсив', 'subtitlingStyling.renderResolution' => 'Резолюция на изобразяване', @@ -3353,6 +3497,7 @@ extension on TranslationsBg { 'profiles.pinExplain' => 'Изисква се 4-цифрен PIN за смяна на профили.', 'profiles.continueButton' => 'Продължи', 'profiles.pinsDontMatch' => 'PIN кодовете не съвпадат', + 'profiles.tokenIdentityMismatch' => 'Токенът на профила в Plex съответства на неочакван сървър', 'connections.sectionTitle' => 'Връзки', 'connections.addConnection' => 'Добави връзка', 'connections.addConnectionSubtitleNoProfile' => 'Влезте с Plex или свържете Jellyfin сървър', @@ -3386,6 +3531,7 @@ extension on TranslationsBg { 'discover.tvShow' => 'ТВ сериал', 'discover.minutesLeft' => ({required Object minutes}) => 'Остават ${minutes} мин', 'discover.moreLikeThis' => 'Подобно на това', + 'discover.titleCount' => ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('bg'))(n, one: '${n} заглавие', other: '${n} заглавия', ), 'errors.searchFailed' => ({required Object error}) => 'Търсенето е неуспешно: ${error}', 'errors.searchUnavailable' => 'Търсенето не можа да достигне до нито един медиен сървър.', 'errors.connectionTimeout' => ({required Object context}) => 'Изтече времето за връзка при зареждане на ${context}', @@ -3558,7 +3704,10 @@ extension on TranslationsBg { 'explore.characters' => 'Герои', 'explore.addToWatchlist' => 'Добави в списъка за гледане', 'explore.removeFromWatchlist' => 'Премахни от списъка за гледане', + 'explore.addedToWatchlist' => 'Добавено към списъка за гледане', + 'explore.removedFromWatchlist' => 'Премахнато от списъка за гледане', 'explore.watchlistUpdateFailed' => 'Неуспешно обновяване на списъка за гледане', + 'explore.watchlistNoMatch' => 'Този елемент не можа да бъде съпоставен със списък за гледане', 'explore.notInLibrary' => 'Не е в твоята библиотека', 'explore.inTheseLibraries' => 'В тези библиотеки', 'explore.checkingLibrary' => 'Проверка на твоята библиотека...', @@ -3566,6 +3715,8 @@ extension on TranslationsBg { 'explore.emptyMessage' => ({required Object source}) => 'Редовете от ${source} ще се появят тук, когато има съдържание.', 'explore.searchHint' => ({required Object source}) => 'Търсене в ${source}', 'explore.searchEmpty' => ({required Object query}) => 'Няма резултати за "${query}"', + _ => null, + } ?? switch (path) { 'explore.searchPrompt' => ({required Object source}) => 'Търси филми и сериали в ${source}.', 'explore.searchFailed' => 'Търсенето се провали. Провери връзката си и опитай отново.', 'explore.badge.rankPopular' => ({required Object n}) => '#${n} популярен', @@ -3605,8 +3756,6 @@ extension on TranslationsBg { 'explore.stats.completed' => ({required Object n}) => '${n} завършили', 'explore.stats.onHold' => ({required Object n}) => '${n} на пауза', 'explore.stats.dropped' => ({required Object n}) => '${n} изоставили', - _ => null, - } ?? switch (path) { 'explore.season.winter' => 'Зима', 'explore.season.spring' => 'Пролет', 'explore.season.summer' => 'Лято', @@ -3703,6 +3852,9 @@ extension on TranslationsBg { 'liveTv.watchChannel' => 'Гледай канал', 'liveTv.favorites' => 'Любими', 'liveTv.reorderFavorites' => 'Пренареди любимите', + 'liveTv.noFavoriteChannels' => 'Няма любими канали', + 'liveTv.noFavoriteChannelsHint' => 'Покажете всички канали, след което натиснете и задръжте канал, за да го добавите към любимите си.', + 'liveTv.showAllChannels' => 'Покажи всички канали', 'liveTv.favoritesLoadFailed' => 'Любимите не можаха да се заредят. Проверете връзката си и опитайте отново.', 'liveTv.favoritesUpdateFailed' => 'Любимите не можаха да бъдат обновени. Проверете връзката си и опитайте отново.', 'liveTv.joinSession' => 'Присъедини се към текуща сесия', @@ -3742,6 +3894,11 @@ extension on TranslationsBg { 'liveTv.guideReloadRequested' => 'Заявено е опресняване на ТВ програмата', 'liveTv.rulesProcessRequested' => 'Заявена е преоценка на правилата', 'liveTv.recordShow' => 'Запиши предаването', + 'liveTv.startingInMinutes' => ({required Object minutes}) => 'Започва след ${minutes} мин', + 'liveTv.dayAtTime' => ({required Object day, required Object time}) => '${day} в ${time}', + 'liveTv.invalidPlaybackData' => ({required Object product}) => '${product} върна невалидни данни за възпроизвеждане на телевизия на живо', + 'liveTv.failedToStartChannel' => 'Каналът на живо не можа да бъде пуснат', + 'liveTv.failedToBuildStreamUrl' => 'URL за потока не можа да бъде създаден', 'collections.title' => 'Колекции', 'collections.collection' => 'Колекция', 'collections.empty' => 'Колекцията е празна', @@ -3810,6 +3967,8 @@ extension on TranslationsBg { 'music.repeat' => 'Повтаряне', 'music.repeatAll' => 'Повтаряне на всички', 'music.repeatOne' => 'Повтаряне на една', + 'music.instantMixNoServer' => 'Няма наличен сървър за незабавен микс', + 'music.noAudioUrl' => ({required Object track}) => 'Няма наличен URL за аудиото на ${track}', 'watchTogether.title' => 'Гледане заедно', 'watchTogether.description' => 'Гледайте съдържание синхронизирано с приятели и семейство', 'watchTogether.createSession' => 'Създай сесия', @@ -3875,6 +4034,7 @@ extension on TranslationsBg { 'watchTogether.removeRoom' => 'Премахни', 'watchTogether.guestSwitchUnavailable' => 'Превключването не е възможно — сървърът е недостъпен за синхронизация', 'watchTogether.guestSwitchFailed' => 'Превключването не е възможно — съдържанието не е намерено на този сървър', + 'watchTogether.defaultDisplayName' => 'Потребител', 'downloads.title' => 'Изтегляния', 'downloads.manage' => 'Управление', 'downloads.tvShows' => 'ТВ сериали', @@ -3975,6 +4135,16 @@ extension on TranslationsBg { 'downloads.backgroundWarning.statusUnknown' => 'Все още не е проверено', 'downloads.backgroundWarning.settingsUnavailable' => 'Системните настройки не можаха да се отворят на това устройство', 'downloads.backgroundWarning.linkUnavailable' => 'dontkillmyapp.com не можа да се отвори на това устройство', + 'downloads.unknownShow' => 'Неизвестен сериал', + 'downloads.unknownSeason' => 'Неизвестен сезон', + 'downloads.unknownAlbum' => 'Неизвестен албум', + 'downloads.completedOfTotal' => ({required Object completed, required Object total}) => 'Завършени: ${completed}/${total}', + 'downloads.errorFileNotFound' => 'Файлът не е намерен (404)', + 'downloads.errorDownloadFailed' => 'Изтеглянето е неуспешно', + 'downloads.errorPostProcessing' => ({required Object error}) => 'Последващата обработка е неуспешна: ${error}', + 'downloads.notificationDownloading' => 'Изтегляне...', + 'downloads.notificationComplete' => 'Изтеглянето завърши', + 'downloads.notificationPaused' => 'Изтеглянето е на пауза', 'shaders.title' => 'Шейдъри', 'shaders.noShaderDescription' => 'Без видео подобрение', 'shaders.nvscalerDescription' => 'Мащабиране на изображението чрез NVIDIA за по-рязко видео', @@ -4054,14 +4224,24 @@ extension on TranslationsBg { 'companionRemote.errors.failedToConnectAnyAddress' => 'Неуспешно свързване към който и да е адрес', 'companionRemote.errors.connectionLostAfterAttempts' => ({required Object attempts}) => 'Връзката е загубена след ${attempts} опита', 'companionRemote.errors.connectionLost' => 'Връзката е загубена', + 'companionRemote.closedBeforeAuth' => 'Връзката беше затворена преди удостоверяването', 'videoSettings.playbackSpeed' => 'Скорост на възпроизвеждане', 'videoSettings.normalSpeed' => 'Нормална', 'videoSettings.sleepTimerActive' => ({required Object duration}) => 'Активен (${duration})', 'videoSettings.zoom' => 'Мащаб', + _ => null, + } ?? switch (path) { 'videoSettings.sleepTimer' => 'Таймер за заспиване', 'videoSettings.audioSync' => 'Синхронизация на аудио', 'videoSettings.subtitleSync' => 'Синхронизация на субтитри', 'videoSettings.hdr' => 'HDR', + 'videoSettings.hdrUnsupported' => 'HDR не е наличен тук — този композитор на работния плот или видеоизходът не може да го предава.', + 'videoSettings.hdrToneMapping' => 'Тонално преобразуване на HDR', + 'videoSettings.hdrToneMappingCompositor' => 'Композитор', + 'videoSettings.hdrToneMappingCompositorDescription' => 'Предава HDR метаданните на източника без промяна и оставя композитора на работния плот да извърши тоналното преобразуване.', + 'videoSettings.hdrToneMappingPlayer' => 'Плейър', + 'videoSettings.hdrToneMappingPlayerDescription' => 'Извършва тоналното преобразуване в плейъра според пиковата яркост на дисплея, след което указва резултата на композитора.', + 'videoSettings.hdrToneMappingFailed' => 'Тоналното преобразуване на HDR не можа да бъде променено — предишният режим остава активен.', 'videoSettings.audioOutput' => 'Аудио изход', 'videoSettings.performanceOverlay' => 'Оверлей за производителност', 'videoSettings.audioOutputDolbyAtmos' => 'Dolby Atmos', @@ -4106,6 +4286,16 @@ extension on TranslationsBg { 'performanceOverlay.player' => 'Плеър', 'performanceOverlay.memory' => 'Памет', 'performanceOverlay.uiFps' => 'FPS на интерфейса', + 'performanceOverlay.fps' => 'FPS', + 'performanceOverlay.decoderAndroidHw' => 'Android HW', + 'performanceOverlay.decoderNvidiaHw' => 'NVIDIA HW', + 'performanceOverlay.decoderQualcommHw' => 'Qualcomm HW', + 'performanceOverlay.decoderMediatekHw' => 'MediaTek HW', + 'performanceOverlay.decoderExynosHw' => 'Exynos HW', + 'performanceOverlay.decoderSoftware' => 'Софтуерен', + 'performanceOverlay.decoderHardware' => 'Хардуерен', + 'performanceOverlay.tunnelingActive' => 'Активно', + 'performanceOverlay.dvRpuFailed' => ({required Object converted, required Object failures}) => '${converted} (неуспешни: ${failures})', 'externalPlayer.title' => 'Външен плеър', 'externalPlayer.useExternalPlayer' => 'Използвай външен плеър', 'externalPlayer.useExternalPlayerDescription' => 'Отваряй видеата в друго приложение', @@ -4119,8 +4309,6 @@ extension on TranslationsBg { 'externalPlayer.playerPackage' => 'Име на пакет', 'externalPlayer.playerUrlScheme' => 'URL схема', 'externalPlayer.off' => 'Изключено', - _ => null, - } ?? switch (path) { 'externalPlayer.launchFailed' => 'Неуспешно отваряне на външен плеър', 'externalPlayer.appNotInstalled' => ({required Object name}) => '${name} не е инсталиран', 'externalPlayer.playInExternalPlayer' => 'Пусни във външен плеър', @@ -4254,6 +4442,16 @@ extension on TranslationsBg { 'seerr.statusPartiallyAvailable' => 'Частично налично', 'seerr.statusRequested' => 'Заявено', 'seerr.statusProcessing' => 'Обработва се', + 'seerr.couldNotReach' => ({required Object url, required Object error}) => 'Неуспешна връзка с ${url}: ${error}', + 'seerr.noInstanceAtUrl' => ({required Object url, required Object status}) => 'На ${url} няма инстанция на Seerr (HTTP ${status})', + 'seerr.notInitialized' => 'Тази инстанция на Seerr не е завършила първоначалната настройка', + 'seerr.noPlexTokenForReauth' => 'Няма наличен Plex токен за повторен вход', + 'seerr.noStoredCredentials' => 'Няма запазени данни за повторен вход', + 'seerr.signInRejected' => 'Входът беше отхвърлен', + 'seerr.noSessionCookie' => 'Seerr не издаде бисквитка за сесията', + 'seerr.freshCookieRejected' => 'Seerr отхвърли новата бисквитка за сесията', + 'seerr.noUserInformation' => 'Seerr не върна информация за потребителя', + 'seerr.sessionRejectedAfterReauth' => 'Сесията беше отхвърлена след повторния вход', 'services.title' => 'Услуги', 'services.hubSubtitle' => 'Синхронизирай прогреса на гледане и заявявай нови заглавия.', 'services.notConnected' => 'Няма връзка', @@ -4269,6 +4467,7 @@ extension on TranslationsBg { 'services.names.seerr' => 'Seerr', 'services.names.mdblist' => 'MDBList', 'services.deviceCode.title' => ({required Object service}) => 'Активиране на Plezy в ${service}', + 'services.deviceCode.instructions' => 'Сканирайте QR кода или посетете адреса по-долу и въведете този код:', 'services.deviceCode.openToActivate' => ({required Object service}) => 'Отворете ${service}, за да активирате', 'services.deviceCode.copyCode' => 'Копирай кода за активиране', 'services.deviceCode.waitingForAuthorization' => 'Изчакване на оторизация…', @@ -4318,6 +4517,24 @@ extension on TranslationsBg { 'addServer.connectToMediaBrowserCardSubtitleScoped' => ({required Object product, required Object name}) => 'Впишете се в своя ${product} сървър. Обвързва се с ${name}.', 'addServer.borrowFromAnotherProfile' => 'Използвай от друг профил', 'addServer.borrowFromAnotherProfileSubtitle' => 'Използвай връзка от друг профил. PIN-защитените профили изискват PIN.', + 'addServer.invalidCredentials' => 'Невалидно потребителско име или парола', + 'addServer.authResponseNotJson' => 'Отговорът при удостоверяване не беше валиден JSON', + 'addServer.quickConnectRejected' => 'Quick Connect беше отхвърлен от сървъра', + 'addServer.quickConnectNotJson' => 'Отговорът на Quick Connect не беше валиден JSON', + 'addServer.quickConnectMissingFields' => 'В отговора на Quick Connect липсва код или таен ключ', + 'addServer.quickConnectPollRejected' => 'Запитването на Quick Connect беше отхвърлено от сървъра', + 'addServer.serverTimedOut' => 'Сървърът не отговори навреме', + 'addServer.responseNotJson' => 'Отговорът на сървъра не беше валиден JSON', + 'addServer.responseMissingIdentity' => ({required Object product}) => 'В отговора липсва ID или име на сървъра — това сървър на ${product} ли е?', + 'addServer.probeFailed' => ({required Object error}) => 'Сървърът не може да бъде достигнат: ${error}', + 'addServer.enterAtLeastOneUrl' => ({required Object product}) => 'Въведете поне един URL на сървър на ${product}', + 'addServer.noReachableServer' => ({required Object product}) => 'Не беше намерен достъпен сървър на ${product}', + 'addServer.urlsPointToDifferentServers' => ({required Object product}) => 'Тези URL адреси сочат към различни сървъри на ${product}', + 'addServer.urlDoesNotMatchServer' => ({required Object product}) => 'Този URL не съответства на сървъра на ${product}', + 'addServer.redirectUnsupported' => 'Сървърът пренасочи към неподдържан URL', + 'addServer.redirectDifferentHost' => ({required Object product}) => 'Сървърът пренасочи към друг хост. Въведете директно крайния URL на ${product}.', + 'addServer.redirectInsecure' => 'Сървърът пренасочи от HTTPS към незащитен URL', + 'addServer.redirectUnsupportedEnterFinal' => ({required Object product}) => 'Сървърът пренасочи към неподдържан URL. Въведете директно крайния URL на ${product}.', _ => null, }; } diff --git a/lib/i18n/strings_da.g.dart b/lib/i18n/strings_da.g.dart index 5617920a..9d00f258 100644 --- a/lib/i18n/strings_da.g.dart +++ b/lib/i18n/strings_da.g.dart @@ -123,6 +123,7 @@ class _Translations$auth$da extends Translations$auth$en { @override String get quickConnectCancel => 'Annuller'; @override String get quickConnectExpired => 'Quick Connect er udløbet. Prøv igen.'; @override String get localDataRecoveryRequired => 'Plezy kunne ikke gendanne lokale loginoplysninger og ventende afspilningsdata på en sikker måde. Log ind igen.'; + @override String get pinCheckRejected => 'Plex PIN-kontrollen blev afvist'; } // Path: common @@ -178,6 +179,9 @@ class _Translations$common$da extends Translations$common$en { @override String get exitFullscreen => 'Forlad fuldskærm'; @override String get pressBackAgainToExit => 'Tryk på tilbage igen for at afslutte'; @override late final _Translations$common$ratingSource$da ratingSource = _Translations$common$ratingSource$da._(_root); + @override String get notAvailable => 'N/A'; + @override String get url => 'URL'; + @override String get letterKeys => 'ABC'; } // Path: screens @@ -444,6 +448,8 @@ class _Translations$settings$da extends Translations$settings$en { @override String get showNavBarLabels => 'Vis tekst på navigationslinjen'; @override String get showNavBarLabelsDescription => 'Vis tekst under ikonerne på navigationslinjen'; @override String get startupSection => 'Startsektion'; + @override String get showExploreTab => 'Vis fanen Opdag'; + @override String get showExploreTabDescription => 'Vis fanen Opdag med indhold fra Plex Discover og tilknyttede trackere'; @override String get liveTvDefaultFavorites => 'Vis favoritkanaler som standard'; @override String get liveTvDefaultFavoritesDescription => 'Vis kun favoritkanaler ved åbning af Live TV'; @override String get display => 'Skærm'; @@ -455,6 +461,7 @@ class _Translations$settings$da extends Translations$settings$en { @override String get subtitlesAndConfig => 'Undertekster og konfiguration'; @override String get seekAndTiming => 'Søgning og timing'; @override String get behavior => 'Adfærd'; + @override String get exportDialogTitle => 'Eksportér Plezy-indstillinger'; } // Path: search @@ -606,6 +613,8 @@ class _Translations$fileInfo$da extends Translations$fileInfo$en { @override String get flagHearingImpaired => 'Hørehæmmede'; @override String get flagDub => 'Dub'; @override String get flagOriginal => 'Original'; + @override String get channelsMono => 'Mono'; + @override String dolbyVisionProfile({required Object profile}) => 'Profil ${profile}'; } // Path: mediaMenu @@ -704,6 +713,11 @@ class _Translations$accessibility$da extends Translations$accessibility$en { @override String get alphabetScrollHint => 'Stryg op eller ned for at flytte ét bogstav'; @override String rowColumnPosition({required Object row, required Object rowCount, required Object column, required Object columnCount}) => 'Række ${row} af ${rowCount}, kolonne ${column} af ${columnCount}'; @override String rowPosition({required Object row, required Object rowCount}) => 'Række ${row} af ${rowCount}'; + @override String get autoScrollPlay => 'Start automatisk rulning'; + @override String get autoScrollPause => 'Sæt automatisk rulning på pause'; + @override String get hueShort => 'H'; + @override String get saturationShort => 'S'; + @override String get valueShort => 'V'; } // Path: tooltips @@ -815,6 +829,15 @@ class _Translations$videoControls$da extends Translations$videoControls$en { @override String get subtitleDownloadedNotApplied => 'Underteksten blev downloadet, men kunne ikke vælges'; @override String get subtitleDownloadFailed => 'Kunne ikke downloade undertekst'; @override String get searchLanguages => 'Søg sprog...'; + @override String get skipIntro => 'Spring intro over'; + @override String get skipCredits => 'Spring rulletekster over'; + @override String get nextEpisode => 'Næste episode'; + @override String subtitleTrack({required Object n}) => 'Spor ${n}'; + @override String subtitleFile({required Object name}) => 'Undertekst ${name}'; + @override String forcedTrack({required Object label}) => '${label} (tvunget)'; + @override String get osdSubtitlesOff => 'Undertekster: Fra'; + @override String osdSubtitles({required Object track}) => 'Undertekster: ${track}'; + @override String osdAudio({required Object track}) => 'Lyd: ${track}'; } // Path: messages @@ -876,9 +899,18 @@ class _Translations$messages$da extends Translations$messages$en { @override String get serverLimitBody => 'Serverfejl (HTTP 500). En båndbredde- eller transkodningsgrænse afviste sandsynligvis sessionen. Bed ejeren om at justere den.'; @override String get mediaUnreadableTitle => 'Fil utilgængelig'; @override String get mediaUnreadableBody => 'Serveren fandt dette emne, men kunne ikke læse filen (HTTP 404). Filen er sandsynligvis flyttet, slettet, eller dens lager er offline. Bed serverejeren om at kontrollere filen og scanne biblioteket igen.'; + @override String get serverBusyTitle => 'Stream er ikke tilgængelig'; + @override String get serverBusyBody => 'Serveren blev ved med at afvise at streame denne fil (HTTP 503). Den er muligvis ved at genstarte eller optaget, eller filens lager er muligvis offline. Prøv igen om et øjeblik – hvis det bliver ved med at ske, skal du bede serverejeren om at kontrollere serveren og filens lager.'; @override String get logsUploaded => 'Logfilerne blev uploadet'; @override String get logsUploadFailed => 'Logfilerne kunne ikke uploades'; @override String get logId => 'Log-ID'; + @override String get burnedSubtitlesUseMenu => 'Underteksterne er indbrændt i denne stream. Skift dem i undertekstmenuen.'; + @override String get noVideoUrl => 'Ingen video-URL er tilgængelig'; + @override String get playbackNoMediaSources => 'Serveren returnerede ingen mediekilder, der kan afspilles'; + @override String get playbackDataNotPrepared => 'Afspilningen blev startet, før dens data var klar'; + @override String get streamSelectionUnavailable => 'Valg af stream er ikke tilgængeligt for denne kilde'; + @override String get streamSelectionFailed => 'Kunne ikke anvende de valgte streams'; + @override String get serverUnavailableForProfile => 'Ingen server er tilgængelig for den aktive profil'; } // Path: subtitlingStyling @@ -904,6 +936,8 @@ class _Translations$subtitlingStyling$da extends Translations$subtitlingStyling$ @override String get overrideStrip => 'Fjern formatering'; @override String get positionTop => 'Øverst'; @override String get positionBottom => 'Nederst'; + @override String get anchorToScreen => 'Fastgør til skærmen'; + @override String get anchorToScreenDescription => 'Vis tekstundertekster i de sorte bjælker under video i bredformat'; @override String get bold => 'Fed'; @override String get italic => 'Kursiv'; @override String get renderResolution => 'Gengivelsesopløsning'; @@ -1013,6 +1047,7 @@ class _Translations$profiles$da extends Translations$profiles$en { @override String get pinExplain => 'Der kræves en 4-cifret PIN-kode for at skifte profil.'; @override String get continueButton => 'Fortsæt'; @override String get pinsDontMatch => 'PIN-koderne matcher ikke'; + @override String get tokenIdentityMismatch => 'Plex-profiltokenet blev knyttet til en uventet server'; } // Path: connections @@ -1064,6 +1099,10 @@ class _Translations$discover$da extends Translations$discover$en { @override String get tvShow => 'TV-serie'; @override String minutesLeft({required Object minutes}) => '${minutes} min tilbage'; @override String get moreLikeThis => 'Mere som dette'; + @override String titleCount({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('da'))(n, + one: '${n} titel', + other: '${n} titler', + ); } // Path: errors @@ -1276,7 +1315,10 @@ class _Translations$explore$da extends Translations$explore$en { @override String get characters => 'Figurer'; @override String get addToWatchlist => 'Føj til ønskeliste'; @override String get removeFromWatchlist => 'Fjern fra ønskeliste'; + @override String get addedToWatchlist => 'Føjet til overvågningslisten'; + @override String get removedFromWatchlist => 'Fjernet fra overvågningslisten'; @override String get watchlistUpdateFailed => 'Kunne ikke opdatere ønskelisten'; + @override String get watchlistNoMatch => 'Kunne ikke knytte dette element til en overvågningsliste'; @override String get notInLibrary => 'Ikke i dit bibliotek'; @override String get inTheseLibraries => 'I disse biblioteker'; @override String get checkingLibrary => 'Tjekker dit bibliotek...'; @@ -1337,6 +1379,9 @@ class _Translations$liveTv$da extends Translations$liveTv$en { @override String get watchChannel => 'Se kanal'; @override String get favorites => 'Favoritter'; @override String get reorderFavorites => 'Omarranger favoritter'; + @override String get noFavoriteChannels => 'Ingen favoritkanaler'; + @override String get noFavoriteChannelsHint => 'Vis alle kanaler, og tryk derefter længe på en kanal for at føje den til dine favoritter.'; + @override String get showAllChannels => 'Vis alle kanaler'; @override String get favoritesLoadFailed => 'Favoritter kunne ikke indlæses. Kontrollér forbindelsen, og prøv igen.'; @override String get favoritesUpdateFailed => 'Favoritterne kunne ikke opdateres. Kontrollér forbindelsen, og prøv igen.'; @override String get joinSession => 'Deltag i igangværende session'; @@ -1376,6 +1421,11 @@ class _Translations$liveTv$da extends Translations$liveTv$en { @override String get guideReloadRequested => 'Der er anmodet om en opdatering af guiden'; @override String get rulesProcessRequested => 'Der er anmodet om en ny evaluering af reglerne'; @override String get recordShow => 'Optag program'; + @override String startingInMinutes({required Object minutes}) => 'Starter om ${minutes} min'; + @override String dayAtTime({required Object day, required Object time}) => '${day} kl. ${time}'; + @override String invalidPlaybackData({required Object product}) => '${product} returnerede ugyldige afspilningsdata for Live TV'; + @override String get failedToStartChannel => 'Kunne ikke starte livekanalen'; + @override String get failedToBuildStreamUrl => 'Kunne ikke oprette stream-URL\'en'; } // Path: collections @@ -1474,6 +1524,8 @@ class _Translations$music$da extends Translations$music$en { @override String get repeat => 'Gentag'; @override String get repeatAll => 'Gentag alle'; @override String get repeatOne => 'Gentag ét nummer'; + @override String get instantMixNoServer => 'Ingen server er tilgængelig til et øjeblikkeligt mix'; + @override String noAudioUrl({required Object track}) => 'Ingen lyd-URL er tilgængelig for ${track}'; } // Path: watchTogether @@ -1548,6 +1600,7 @@ class _Translations$watchTogether$da extends Translations$watchTogether$en { @override String get removeRoom => 'Fjern'; @override String get guestSwitchUnavailable => 'Kunne ikke skifte — server ikke tilgængelig for synkronisering'; @override String get guestSwitchFailed => 'Kunne ikke skifte — indhold blev ikke fundet på denne server'; + @override String get defaultDisplayName => 'Bruger'; } // Path: downloads @@ -1632,6 +1685,16 @@ class _Translations$downloads$da extends Translations$downloads$en { @override String get syncRuleUnknownServer => 'Ukendt server'; @override String get syncRuleListCreated => 'Synkroniseringsregel oprettet'; @override late final _Translations$downloads$backgroundWarning$da backgroundWarning = _Translations$downloads$backgroundWarning$da._(_root); + @override String get unknownShow => 'Ukendt serie'; + @override String get unknownSeason => 'Ukendt sæson'; + @override String get unknownAlbum => 'Ukendt album'; + @override String completedOfTotal({required Object completed, required Object total}) => '${completed}/${total} fuldført'; + @override String get errorFileNotFound => 'Filen blev ikke fundet (404)'; + @override String get errorDownloadFailed => 'Download mislykkedes'; + @override String errorPostProcessing({required Object error}) => 'Efterbehandling mislykkedes: ${error}'; + @override String get notificationDownloading => 'Downloader...'; + @override String get notificationComplete => 'Download fuldført'; + @override String get notificationPaused => 'Download sat på pause'; } // Path: shaders @@ -1672,6 +1735,7 @@ class _Translations$companionRemote$da extends Translations$companionRemote$en { @override late final _Translations$companionRemote$pairing$da pairing = _Translations$companionRemote$pairing$da._(_root); @override late final _Translations$companionRemote$remote$da remote = _Translations$companionRemote$remote$da._(_root); @override late final _Translations$companionRemote$errors$da errors = _Translations$companionRemote$errors$da._(_root); + @override String get closedBeforeAuth => 'Forbindelsen blev lukket før godkendelsen'; } // Path: videoSettings @@ -1689,6 +1753,13 @@ class _Translations$videoSettings$da extends Translations$videoSettings$en { @override String get audioSync => 'Lydsynkronisering'; @override String get subtitleSync => 'Undertekstsynkronisering'; @override String get hdr => 'HDR'; + @override String get hdrUnsupported => 'HDR er ikke tilgængelig her – denne skrivebordskompositor eller videoudgang kan ikke håndtere det.'; + @override String get hdrToneMapping => 'HDR-tonemapping'; + @override String get hdrToneMappingCompositor => 'Kompositor'; + @override String get hdrToneMappingCompositorDescription => 'Videregiv kildens HDR-metadata, og lad skrivebordskompositoren tonemappe dem.'; + @override String get hdrToneMappingPlayer => 'Afspiller'; + @override String get hdrToneMappingPlayerDescription => 'Tilpas til skærmens maksimale lysstyrke i afspilleren, og fortæl derefter kompositoren om resultatet.'; + @override String get hdrToneMappingFailed => 'Kunne ikke ændre HDR-tonemapping – den tidligere tilstand er stadig aktiv.'; @override String get audioOutput => 'Lydoutput'; @override String get performanceOverlay => 'Ydelsesoverlay'; @override String get audioOutputDolbyAtmos => 'Dolby Atmos'; @@ -1742,6 +1813,16 @@ class _Translations$performanceOverlay$da extends Translations$performanceOverla @override String get player => 'Afspiller'; @override String get memory => 'Hukommelse'; @override String get uiFps => 'UI-FPS'; + @override String get fps => 'FPS'; + @override String get decoderAndroidHw => 'Android HW'; + @override String get decoderNvidiaHw => 'NVIDIA HW'; + @override String get decoderQualcommHw => 'Qualcomm HW'; + @override String get decoderMediatekHw => 'MediaTek HW'; + @override String get decoderExynosHw => 'Exynos HW'; + @override String get decoderSoftware => 'Software'; + @override String get decoderHardware => 'Hardware'; + @override String get tunnelingActive => 'Aktiv'; + @override String dvRpuFailed({required Object converted, required Object failures}) => '${converted} (${failures} mislykkedes)'; } // Path: externalPlayer @@ -1942,6 +2023,16 @@ class _Translations$seerr$da extends Translations$seerr$en { @override String get statusPartiallyAvailable => 'Delvist tilgængelig'; @override String get statusRequested => 'Anmodet'; @override String get statusProcessing => 'Behandler'; + @override String couldNotReach({required Object url, required Object error}) => 'Kunne ikke nå ${url}: ${error}'; + @override String noInstanceAtUrl({required Object url, required Object status}) => 'Ingen Seerr-instans på ${url} (HTTP ${status})'; + @override String get notInitialized => 'Denne Seerr-instans har ikke fuldført førstegangsopsætningen'; + @override String get noPlexTokenForReauth => 'Intet Plex-token er tilgængeligt til at logge ind igen'; + @override String get noStoredCredentials => 'Ingen gemte loginoplysninger er tilgængelige til at logge ind igen'; + @override String get signInRejected => 'Login blev afvist'; + @override String get noSessionCookie => 'Seerr udstedte ikke en sessionscookie'; + @override String get freshCookieRejected => 'Seerr afviste den nye sessionscookie'; + @override String get noUserInformation => 'Seerr returnerede ikke brugeroplysninger'; + @override String get sessionRejectedAfterReauth => 'Sessionen blev afvist efter at være logget ind igen'; } // Path: services @@ -2002,6 +2093,24 @@ class _Translations$addServer$da extends Translations$addServer$en { @override String connectToMediaBrowserCardSubtitleScoped({required Object product, required Object name}) => 'Log ind på din ${product}-server. Tilknyttes til ${name}.'; @override String get borrowFromAnotherProfile => 'Lån fra en anden profil'; @override String get borrowFromAnotherProfileSubtitle => 'Genbrug en anden profils forbindelse. PIN-beskyttede profiler kræver en PIN.'; + @override String get invalidCredentials => 'Ugyldigt brugernavn eller ugyldig adgangskode'; + @override String get authResponseNotJson => 'Godkendelsessvaret var ikke gyldig JSON'; + @override String get quickConnectRejected => 'Quick Connect blev afvist af serveren'; + @override String get quickConnectNotJson => 'Quick Connect-svaret var ikke gyldig JSON'; + @override String get quickConnectMissingFields => 'Quick Connect-svaret mangler en kode eller hemmelighed'; + @override String get quickConnectPollRejected => 'Quick Connect-polling blev afvist af serveren'; + @override String get serverTimedOut => 'Serveren svarede ikke i tide'; + @override String get responseNotJson => 'Serversvaret var ikke gyldig JSON'; + @override String responseMissingIdentity({required Object product}) => 'Svaret mangler et ID eller servernavn – er dette en ${product}-server?'; + @override String probeFailed({required Object error}) => 'Kunne ikke nå serveren: ${error}'; + @override String enterAtLeastOneUrl({required Object product}) => 'Indtast mindst én URL til en ${product}-server'; + @override String noReachableServer({required Object product}) => 'Der blev ikke fundet nogen ${product}-server, som kunne nås'; + @override String urlsPointToDifferentServers({required Object product}) => 'Disse URL\'er peger på forskellige ${product}-servere'; + @override String urlDoesNotMatchServer({required Object product}) => 'Denne URL stemmer ikke overens med ${product}-serveren'; + @override String get redirectUnsupported => 'Serveren videresendte til en URL, der ikke understøttes'; + @override String redirectDifferentHost({required Object product}) => 'Serveren videresendte til en anden vært. Indtast den endelige ${product}-URL direkte.'; + @override String get redirectInsecure => 'Serveren videresendte fra HTTPS til en usikker URL'; + @override String redirectUnsupportedEnterFinal({required Object product}) => 'Serveren videresendte til en URL, der ikke understøttes. Indtast den endelige ${product}-URL direkte.'; } // Path: common.ratingSource @@ -2521,6 +2630,7 @@ class _Translations$services$deviceCode$da extends Translations$services$deviceC // Translations @override String title({required Object service}) => 'Aktiver Plezy på ${service}'; + @override String get instructions => 'Scan QR-koden, eller gå til adressen nedenfor, og indtast denne kode:'; @override String openToActivate({required Object service}) => 'Åbn ${service} for at aktivere'; @override String get copyCode => 'Kopiér aktiveringskode'; @override String get waitingForAuthorization => 'Venter på godkendelse…'; @@ -2595,6 +2705,7 @@ extension on TranslationsDa { 'auth.quickConnectCancel' => 'Annuller', 'auth.quickConnectExpired' => 'Quick Connect er udløbet. Prøv igen.', 'auth.localDataRecoveryRequired' => 'Plezy kunne ikke gendanne lokale loginoplysninger og ventende afspilningsdata på en sikker måde. Log ind igen.', + 'auth.pinCheckRejected' => 'Plex PIN-kontrollen blev afvist', 'common.cancel' => 'Annuller', 'common.save' => 'Gem', 'common.close' => 'Luk', @@ -2651,6 +2762,9 @@ extension on TranslationsDa { 'common.ratingSource.trakt' => 'Trakt', 'common.ratingSource.rottenTomatoesCritic' => 'Rotten Tomatoes-anmeldere', 'common.ratingSource.rottenTomatoesAudience' => 'Rotten Tomatoes-publikum', + 'common.notAvailable' => 'N/A', + 'common.url' => 'URL', + 'common.letterKeys' => 'ABC', 'screens.licenses' => 'Licenser', 'screens.switchProfile' => 'Skift profil', 'screens.subtitleStyling' => 'Undertekststil', @@ -2890,6 +3004,8 @@ extension on TranslationsDa { 'settings.showNavBarLabels' => 'Vis tekst på navigationslinjen', 'settings.showNavBarLabelsDescription' => 'Vis tekst under ikonerne på navigationslinjen', 'settings.startupSection' => 'Startsektion', + 'settings.showExploreTab' => 'Vis fanen Opdag', + 'settings.showExploreTabDescription' => 'Vis fanen Opdag med indhold fra Plex Discover og tilknyttede trackere', 'settings.liveTvDefaultFavorites' => 'Vis favoritkanaler som standard', 'settings.liveTvDefaultFavoritesDescription' => 'Vis kun favoritkanaler ved åbning af Live TV', 'settings.display' => 'Skærm', @@ -2901,6 +3017,7 @@ extension on TranslationsDa { 'settings.subtitlesAndConfig' => 'Undertekster og konfiguration', 'settings.seekAndTiming' => 'Søgning og timing', 'settings.behavior' => 'Adfærd', + 'settings.exportDialogTitle' => 'Eksportér Plezy-indstillinger', 'search.hint' => 'Søg film, serier, musik...', 'search.tryDifferentTerm' => 'Prøv en anden søgning', 'search.searchYourMedia' => 'Søg i dine medier', @@ -3049,6 +3166,8 @@ extension on TranslationsDa { 'fileInfo.flagHearingImpaired' => 'Hørehæmmede', 'fileInfo.flagDub' => 'Dub', 'fileInfo.flagOriginal' => 'Original', + 'fileInfo.channelsMono' => 'Mono', + 'fileInfo.dolbyVisionProfile' => ({required Object profile}) => 'Profil ${profile}', 'mediaMenu.markAsWatched' => 'Markér som set', 'mediaMenu.markAsUnwatched' => 'Markér som uset', 'mediaMenu.removeFromContinueWatching' => 'Fjern fra Fortsæt med at se', @@ -3082,6 +3201,8 @@ extension on TranslationsDa { 'mediaMenu.rate' => 'Bedøm', 'mediaMenu.playFromBeginning' => 'Afspil fra begyndelsen', 'mediaMenu.playVersion' => 'Afspil version...', + _ => null, + } ?? switch (path) { 'rateSheet.title' => 'Bedøm', 'rateSheet.server' => 'Server', 'rateSheet.favorite' => 'Favorit', @@ -3091,8 +3212,6 @@ extension on TranslationsDa { 'rateSheet.noConnectedServices' => 'Forbind en tjeneste under Indstillinger for at bedømme via den.', 'accessibility.mediaCardMovie' => ({required Object title}) => '${title}, film', 'accessibility.mediaCardShow' => ({required Object title}) => '${title}, TV-serie', - _ => null, - } ?? switch (path) { 'accessibility.mediaCardEpisode' => ({required Object title, required Object episodeInfo}) => '${title}, ${episodeInfo}', 'accessibility.mediaCardSeason' => ({required Object title, required Object seasonInfo}) => '${title}, ${seasonInfo}', 'accessibility.mediaCardWatched' => 'set', @@ -3113,6 +3232,11 @@ extension on TranslationsDa { 'accessibility.alphabetScrollHint' => 'Stryg op eller ned for at flytte ét bogstav', 'accessibility.rowColumnPosition' => ({required Object row, required Object rowCount, required Object column, required Object columnCount}) => 'Række ${row} af ${rowCount}, kolonne ${column} af ${columnCount}', 'accessibility.rowPosition' => ({required Object row, required Object rowCount}) => 'Række ${row} af ${rowCount}', + 'accessibility.autoScrollPlay' => 'Start automatisk rulning', + 'accessibility.autoScrollPause' => 'Sæt automatisk rulning på pause', + 'accessibility.hueShort' => 'H', + 'accessibility.saturationShort' => 'S', + 'accessibility.valueShort' => 'V', 'tooltips.shufflePlay' => 'Afspil tilfældigt', 'tooltips.playTrailer' => 'Afspil trailer', 'tooltips.markAsWatched' => 'Markér som set', @@ -3203,6 +3327,15 @@ extension on TranslationsDa { 'videoControls.subtitleDownloadedNotApplied' => 'Underteksten blev downloadet, men kunne ikke vælges', 'videoControls.subtitleDownloadFailed' => 'Kunne ikke downloade undertekst', 'videoControls.searchLanguages' => 'Søg sprog...', + 'videoControls.skipIntro' => 'Spring intro over', + 'videoControls.skipCredits' => 'Spring rulletekster over', + 'videoControls.nextEpisode' => 'Næste episode', + 'videoControls.subtitleTrack' => ({required Object n}) => 'Spor ${n}', + 'videoControls.subtitleFile' => ({required Object name}) => 'Undertekst ${name}', + 'videoControls.forcedTrack' => ({required Object label}) => '${label} (tvunget)', + 'videoControls.osdSubtitlesOff' => 'Undertekster: Fra', + 'videoControls.osdSubtitles' => ({required Object track}) => 'Undertekster: ${track}', + 'videoControls.osdAudio' => ({required Object track}) => 'Lyd: ${track}', 'messages.markedAsWatched' => 'Markeret som set', 'messages.markedAsUnwatched' => 'Markeret som uset', 'messages.markedAsWatchedOffline' => 'Markeret som set (synkroniseres online)', @@ -3252,9 +3385,18 @@ extension on TranslationsDa { 'messages.serverLimitBody' => 'Serverfejl (HTTP 500). En båndbredde- eller transkodningsgrænse afviste sandsynligvis sessionen. Bed ejeren om at justere den.', 'messages.mediaUnreadableTitle' => 'Fil utilgængelig', 'messages.mediaUnreadableBody' => 'Serveren fandt dette emne, men kunne ikke læse filen (HTTP 404). Filen er sandsynligvis flyttet, slettet, eller dens lager er offline. Bed serverejeren om at kontrollere filen og scanne biblioteket igen.', + 'messages.serverBusyTitle' => 'Stream er ikke tilgængelig', + 'messages.serverBusyBody' => 'Serveren blev ved med at afvise at streame denne fil (HTTP 503). Den er muligvis ved at genstarte eller optaget, eller filens lager er muligvis offline. Prøv igen om et øjeblik – hvis det bliver ved med at ske, skal du bede serverejeren om at kontrollere serveren og filens lager.', 'messages.logsUploaded' => 'Logfilerne blev uploadet', 'messages.logsUploadFailed' => 'Logfilerne kunne ikke uploades', 'messages.logId' => 'Log-ID', + 'messages.burnedSubtitlesUseMenu' => 'Underteksterne er indbrændt i denne stream. Skift dem i undertekstmenuen.', + 'messages.noVideoUrl' => 'Ingen video-URL er tilgængelig', + 'messages.playbackNoMediaSources' => 'Serveren returnerede ingen mediekilder, der kan afspilles', + 'messages.playbackDataNotPrepared' => 'Afspilningen blev startet, før dens data var klar', + 'messages.streamSelectionUnavailable' => 'Valg af stream er ikke tilgængeligt for denne kilde', + 'messages.streamSelectionFailed' => 'Kunne ikke anvende de valgte streams', + 'messages.serverUnavailableForProfile' => 'Ingen server er tilgængelig for den aktive profil', 'subtitlingStyling.text' => 'Tekst', 'subtitlingStyling.border' => 'Kant', 'subtitlingStyling.background' => 'Baggrund', @@ -3271,6 +3413,8 @@ extension on TranslationsDa { 'subtitlingStyling.overrideStrip' => 'Fjern formatering', 'subtitlingStyling.positionTop' => 'Øverst', 'subtitlingStyling.positionBottom' => 'Nederst', + 'subtitlingStyling.anchorToScreen' => 'Fastgør til skærmen', + 'subtitlingStyling.anchorToScreenDescription' => 'Vis tekstundertekster i de sorte bjælker under video i bredformat', 'subtitlingStyling.bold' => 'Fed', 'subtitlingStyling.italic' => 'Kursiv', 'subtitlingStyling.renderResolution' => 'Gengivelsesopløsning', @@ -3353,6 +3497,7 @@ extension on TranslationsDa { 'profiles.pinExplain' => 'Der kræves en 4-cifret PIN-kode for at skifte profil.', 'profiles.continueButton' => 'Fortsæt', 'profiles.pinsDontMatch' => 'PIN-koderne matcher ikke', + 'profiles.tokenIdentityMismatch' => 'Plex-profiltokenet blev knyttet til en uventet server', 'connections.sectionTitle' => 'Forbindelser', 'connections.addConnection' => 'Tilføj forbindelse', 'connections.addConnectionSubtitleNoProfile' => 'Log ind med Plex eller forbind til en Jellyfin-server', @@ -3386,6 +3531,7 @@ extension on TranslationsDa { 'discover.tvShow' => 'TV-serie', 'discover.minutesLeft' => ({required Object minutes}) => '${minutes} min tilbage', 'discover.moreLikeThis' => 'Mere som dette', + 'discover.titleCount' => ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('da'))(n, one: '${n} titel', other: '${n} titler', ), 'errors.searchFailed' => ({required Object error}) => 'Søgning mislykkedes: ${error}', 'errors.searchUnavailable' => 'Søgningen kunne ikke nå nogen medieserver.', 'errors.connectionTimeout' => ({required Object context}) => 'Forbindelsen fik timeout under indlæsning af ${context}', @@ -3558,7 +3704,10 @@ extension on TranslationsDa { 'explore.characters' => 'Figurer', 'explore.addToWatchlist' => 'Føj til ønskeliste', 'explore.removeFromWatchlist' => 'Fjern fra ønskeliste', + 'explore.addedToWatchlist' => 'Føjet til overvågningslisten', + 'explore.removedFromWatchlist' => 'Fjernet fra overvågningslisten', 'explore.watchlistUpdateFailed' => 'Kunne ikke opdatere ønskelisten', + 'explore.watchlistNoMatch' => 'Kunne ikke knytte dette element til en overvågningsliste', 'explore.notInLibrary' => 'Ikke i dit bibliotek', 'explore.inTheseLibraries' => 'I disse biblioteker', 'explore.checkingLibrary' => 'Tjekker dit bibliotek...', @@ -3566,6 +3715,8 @@ extension on TranslationsDa { 'explore.emptyMessage' => ({required Object source}) => 'Indholdsrækker fra ${source} vises her, når de har indhold.', 'explore.searchHint' => ({required Object source}) => 'Søg i ${source}', 'explore.searchEmpty' => ({required Object query}) => 'Ingen resultater for "${query}"', + _ => null, + } ?? switch (path) { 'explore.searchPrompt' => ({required Object source}) => 'Søg efter film og serier på ${source}.', 'explore.searchFailed' => 'Søgningen mislykkedes. Tjek din forbindelse, og prøv igen.', 'explore.badge.rankPopular' => ({required Object n}) => '#${n} populær', @@ -3605,8 +3756,6 @@ extension on TranslationsDa { 'explore.stats.completed' => ({required Object n}) => '${n} færdigset', 'explore.stats.onHold' => ({required Object n}) => '${n} på pause', 'explore.stats.dropped' => ({required Object n}) => '${n} droppede', - _ => null, - } ?? switch (path) { 'explore.season.winter' => 'Vinter', 'explore.season.spring' => 'Forår', 'explore.season.summer' => 'Sommer', @@ -3703,6 +3852,9 @@ extension on TranslationsDa { 'liveTv.watchChannel' => 'Se kanal', 'liveTv.favorites' => 'Favoritter', 'liveTv.reorderFavorites' => 'Omarranger favoritter', + 'liveTv.noFavoriteChannels' => 'Ingen favoritkanaler', + 'liveTv.noFavoriteChannelsHint' => 'Vis alle kanaler, og tryk derefter længe på en kanal for at føje den til dine favoritter.', + 'liveTv.showAllChannels' => 'Vis alle kanaler', 'liveTv.favoritesLoadFailed' => 'Favoritter kunne ikke indlæses. Kontrollér forbindelsen, og prøv igen.', 'liveTv.favoritesUpdateFailed' => 'Favoritterne kunne ikke opdateres. Kontrollér forbindelsen, og prøv igen.', 'liveTv.joinSession' => 'Deltag i igangværende session', @@ -3742,6 +3894,11 @@ extension on TranslationsDa { 'liveTv.guideReloadRequested' => 'Der er anmodet om en opdatering af guiden', 'liveTv.rulesProcessRequested' => 'Der er anmodet om en ny evaluering af reglerne', 'liveTv.recordShow' => 'Optag program', + 'liveTv.startingInMinutes' => ({required Object minutes}) => 'Starter om ${minutes} min', + 'liveTv.dayAtTime' => ({required Object day, required Object time}) => '${day} kl. ${time}', + 'liveTv.invalidPlaybackData' => ({required Object product}) => '${product} returnerede ugyldige afspilningsdata for Live TV', + 'liveTv.failedToStartChannel' => 'Kunne ikke starte livekanalen', + 'liveTv.failedToBuildStreamUrl' => 'Kunne ikke oprette stream-URL\'en', 'collections.title' => 'Samlinger', 'collections.collection' => 'Samling', 'collections.empty' => 'Samlingen er tom', @@ -3810,6 +3967,8 @@ extension on TranslationsDa { 'music.repeat' => 'Gentag', 'music.repeatAll' => 'Gentag alle', 'music.repeatOne' => 'Gentag ét nummer', + 'music.instantMixNoServer' => 'Ingen server er tilgængelig til et øjeblikkeligt mix', + 'music.noAudioUrl' => ({required Object track}) => 'Ingen lyd-URL er tilgængelig for ${track}', 'watchTogether.title' => 'Se sammen', 'watchTogether.description' => 'Se indhold synkroniseret med venner og familie', 'watchTogether.createSession' => 'Opret session', @@ -3875,6 +4034,7 @@ extension on TranslationsDa { 'watchTogether.removeRoom' => 'Fjern', 'watchTogether.guestSwitchUnavailable' => 'Kunne ikke skifte — server ikke tilgængelig for synkronisering', 'watchTogether.guestSwitchFailed' => 'Kunne ikke skifte — indhold blev ikke fundet på denne server', + 'watchTogether.defaultDisplayName' => 'Bruger', 'downloads.title' => 'Downloads', 'downloads.manage' => 'Administrer', 'downloads.tvShows' => 'TV-serier', @@ -3975,6 +4135,16 @@ extension on TranslationsDa { 'downloads.backgroundWarning.statusUnknown' => 'Endnu ikke kontrolleret', 'downloads.backgroundWarning.settingsUnavailable' => 'Kunne ikke åbne systemindstillingerne på denne enhed', 'downloads.backgroundWarning.linkUnavailable' => 'Kunne ikke åbne dontkillmyapp.com på denne enhed', + 'downloads.unknownShow' => 'Ukendt serie', + 'downloads.unknownSeason' => 'Ukendt sæson', + 'downloads.unknownAlbum' => 'Ukendt album', + 'downloads.completedOfTotal' => ({required Object completed, required Object total}) => '${completed}/${total} fuldført', + 'downloads.errorFileNotFound' => 'Filen blev ikke fundet (404)', + 'downloads.errorDownloadFailed' => 'Download mislykkedes', + 'downloads.errorPostProcessing' => ({required Object error}) => 'Efterbehandling mislykkedes: ${error}', + 'downloads.notificationDownloading' => 'Downloader...', + 'downloads.notificationComplete' => 'Download fuldført', + 'downloads.notificationPaused' => 'Download sat på pause', 'shaders.title' => 'Shadere', 'shaders.noShaderDescription' => 'Ingen videoforbedring', 'shaders.nvscalerDescription' => 'NVIDIA-billedskalering for skarpere video', @@ -4054,14 +4224,24 @@ extension on TranslationsDa { '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', + 'companionRemote.closedBeforeAuth' => 'Forbindelsen blev lukket før godkendelsen', 'videoSettings.playbackSpeed' => 'Afspilningshastighed', 'videoSettings.normalSpeed' => 'Normal', 'videoSettings.sleepTimerActive' => ({required Object duration}) => 'Aktiv (${duration})', 'videoSettings.zoom' => 'Zoom', + _ => null, + } ?? switch (path) { 'videoSettings.sleepTimer' => 'Sove-timer', 'videoSettings.audioSync' => 'Lydsynkronisering', 'videoSettings.subtitleSync' => 'Undertekstsynkronisering', 'videoSettings.hdr' => 'HDR', + 'videoSettings.hdrUnsupported' => 'HDR er ikke tilgængelig her – denne skrivebordskompositor eller videoudgang kan ikke håndtere det.', + 'videoSettings.hdrToneMapping' => 'HDR-tonemapping', + 'videoSettings.hdrToneMappingCompositor' => 'Kompositor', + 'videoSettings.hdrToneMappingCompositorDescription' => 'Videregiv kildens HDR-metadata, og lad skrivebordskompositoren tonemappe dem.', + 'videoSettings.hdrToneMappingPlayer' => 'Afspiller', + 'videoSettings.hdrToneMappingPlayerDescription' => 'Tilpas til skærmens maksimale lysstyrke i afspilleren, og fortæl derefter kompositoren om resultatet.', + 'videoSettings.hdrToneMappingFailed' => 'Kunne ikke ændre HDR-tonemapping – den tidligere tilstand er stadig aktiv.', 'videoSettings.audioOutput' => 'Lydoutput', 'videoSettings.performanceOverlay' => 'Ydelsesoverlay', 'videoSettings.audioOutputDolbyAtmos' => 'Dolby Atmos', @@ -4106,6 +4286,16 @@ extension on TranslationsDa { 'performanceOverlay.player' => 'Afspiller', 'performanceOverlay.memory' => 'Hukommelse', 'performanceOverlay.uiFps' => 'UI-FPS', + 'performanceOverlay.fps' => 'FPS', + 'performanceOverlay.decoderAndroidHw' => 'Android HW', + 'performanceOverlay.decoderNvidiaHw' => 'NVIDIA HW', + 'performanceOverlay.decoderQualcommHw' => 'Qualcomm HW', + 'performanceOverlay.decoderMediatekHw' => 'MediaTek HW', + 'performanceOverlay.decoderExynosHw' => 'Exynos HW', + 'performanceOverlay.decoderSoftware' => 'Software', + 'performanceOverlay.decoderHardware' => 'Hardware', + 'performanceOverlay.tunnelingActive' => 'Aktiv', + 'performanceOverlay.dvRpuFailed' => ({required Object converted, required Object failures}) => '${converted} (${failures} mislykkedes)', 'externalPlayer.title' => 'Ekstern afspiller', 'externalPlayer.useExternalPlayer' => 'Brug ekstern afspiller', 'externalPlayer.useExternalPlayerDescription' => 'Åbn videoer i en anden app', @@ -4119,8 +4309,6 @@ extension on TranslationsDa { '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', @@ -4254,6 +4442,16 @@ extension on TranslationsDa { 'seerr.statusPartiallyAvailable' => 'Delvist tilgængelig', 'seerr.statusRequested' => 'Anmodet', 'seerr.statusProcessing' => 'Behandler', + 'seerr.couldNotReach' => ({required Object url, required Object error}) => 'Kunne ikke nå ${url}: ${error}', + 'seerr.noInstanceAtUrl' => ({required Object url, required Object status}) => 'Ingen Seerr-instans på ${url} (HTTP ${status})', + 'seerr.notInitialized' => 'Denne Seerr-instans har ikke fuldført førstegangsopsætningen', + 'seerr.noPlexTokenForReauth' => 'Intet Plex-token er tilgængeligt til at logge ind igen', + 'seerr.noStoredCredentials' => 'Ingen gemte loginoplysninger er tilgængelige til at logge ind igen', + 'seerr.signInRejected' => 'Login blev afvist', + 'seerr.noSessionCookie' => 'Seerr udstedte ikke en sessionscookie', + 'seerr.freshCookieRejected' => 'Seerr afviste den nye sessionscookie', + 'seerr.noUserInformation' => 'Seerr returnerede ikke brugeroplysninger', + 'seerr.sessionRejectedAfterReauth' => 'Sessionen blev afvist efter at være logget ind igen', 'services.title' => 'Tjenester', 'services.hubSubtitle' => 'Synkroniser dit visningsfremskridt, og anmod om nye titler.', 'services.notConnected' => 'Ikke forbundet', @@ -4269,6 +4467,7 @@ extension on TranslationsDa { 'services.names.seerr' => 'Seerr', 'services.names.mdblist' => 'MDBList', 'services.deviceCode.title' => ({required Object service}) => 'Aktiver Plezy på ${service}', + 'services.deviceCode.instructions' => 'Scan QR-koden, eller gå til adressen nedenfor, og indtast denne kode:', 'services.deviceCode.openToActivate' => ({required Object service}) => 'Åbn ${service} for at aktivere', 'services.deviceCode.copyCode' => 'Kopiér aktiveringskode', 'services.deviceCode.waitingForAuthorization' => 'Venter på godkendelse…', @@ -4318,6 +4517,24 @@ extension on TranslationsDa { 'addServer.connectToMediaBrowserCardSubtitleScoped' => ({required Object product, required Object name}) => 'Log ind på din ${product}-server. Tilknyttes til ${name}.', 'addServer.borrowFromAnotherProfile' => 'Lån fra en anden profil', 'addServer.borrowFromAnotherProfileSubtitle' => 'Genbrug en anden profils forbindelse. PIN-beskyttede profiler kræver en PIN.', + 'addServer.invalidCredentials' => 'Ugyldigt brugernavn eller ugyldig adgangskode', + 'addServer.authResponseNotJson' => 'Godkendelsessvaret var ikke gyldig JSON', + 'addServer.quickConnectRejected' => 'Quick Connect blev afvist af serveren', + 'addServer.quickConnectNotJson' => 'Quick Connect-svaret var ikke gyldig JSON', + 'addServer.quickConnectMissingFields' => 'Quick Connect-svaret mangler en kode eller hemmelighed', + 'addServer.quickConnectPollRejected' => 'Quick Connect-polling blev afvist af serveren', + 'addServer.serverTimedOut' => 'Serveren svarede ikke i tide', + 'addServer.responseNotJson' => 'Serversvaret var ikke gyldig JSON', + 'addServer.responseMissingIdentity' => ({required Object product}) => 'Svaret mangler et ID eller servernavn – er dette en ${product}-server?', + 'addServer.probeFailed' => ({required Object error}) => 'Kunne ikke nå serveren: ${error}', + 'addServer.enterAtLeastOneUrl' => ({required Object product}) => 'Indtast mindst én URL til en ${product}-server', + 'addServer.noReachableServer' => ({required Object product}) => 'Der blev ikke fundet nogen ${product}-server, som kunne nås', + 'addServer.urlsPointToDifferentServers' => ({required Object product}) => 'Disse URL\'er peger på forskellige ${product}-servere', + 'addServer.urlDoesNotMatchServer' => ({required Object product}) => 'Denne URL stemmer ikke overens med ${product}-serveren', + 'addServer.redirectUnsupported' => 'Serveren videresendte til en URL, der ikke understøttes', + 'addServer.redirectDifferentHost' => ({required Object product}) => 'Serveren videresendte til en anden vært. Indtast den endelige ${product}-URL direkte.', + 'addServer.redirectInsecure' => 'Serveren videresendte fra HTTPS til en usikker URL', + 'addServer.redirectUnsupportedEnterFinal' => ({required Object product}) => 'Serveren videresendte til en URL, der ikke understøttes. Indtast den endelige ${product}-URL direkte.', _ => null, }; } diff --git a/lib/i18n/strings_de.g.dart b/lib/i18n/strings_de.g.dart index 3a54457a..68304dbd 100644 --- a/lib/i18n/strings_de.g.dart +++ b/lib/i18n/strings_de.g.dart @@ -123,6 +123,7 @@ class _Translations$auth$de extends Translations$auth$en { @override String get quickConnectCancel => 'Abbrechen'; @override String get quickConnectExpired => 'Quick Connect ist abgelaufen. Versuche es erneut.'; @override String get localDataRecoveryRequired => 'Plezy konnte lokale Anmeldedaten und ausstehende Wiedergabedaten nicht sicher wiederherstellen. Bitte melde dich erneut an.'; + @override String get pinCheckRejected => 'Die Plex-PIN-Prüfung wurde abgelehnt'; } // Path: common @@ -178,6 +179,9 @@ class _Translations$common$de extends Translations$common$en { @override String get exitFullscreen => 'Vollbild verlassen'; @override String get pressBackAgainToExit => 'Zum Beenden erneut Zurück drücken'; @override late final _Translations$common$ratingSource$de ratingSource = _Translations$common$ratingSource$de._(_root); + @override String get notAvailable => 'N. v.'; + @override String get url => 'URL'; + @override String get letterKeys => 'ABC'; } // Path: screens @@ -444,6 +448,8 @@ class _Translations$settings$de extends Translations$settings$en { @override String get showNavBarLabels => 'Navigationsleisten-Beschriftungen anzeigen'; @override String get showNavBarLabelsDescription => 'Textbeschriftungen unter den Symbolen der Navigationsleiste anzeigen'; @override String get startupSection => 'Startbereich'; + @override String get showExploreTab => 'Tab „Entdecken“ anzeigen'; + @override String get showExploreTabDescription => 'Zeigt den Tab „Entdecken“ mit Inhalten aus Plex Discover und verbundenen Trackern an'; @override String get liveTvDefaultFavorites => 'Standardmäßig Favoritenkanäle'; @override String get liveTvDefaultFavoritesDescription => 'Beim Öffnen von Live TV nur Favoritenkanäle anzeigen'; @override String get display => 'Anzeige'; @@ -455,6 +461,7 @@ class _Translations$settings$de extends Translations$settings$en { @override String get subtitlesAndConfig => 'Untertitel und Konfiguration'; @override String get seekAndTiming => 'Spulen & Timing'; @override String get behavior => 'Verhalten'; + @override String get exportDialogTitle => 'Plezy-Einstellungen exportieren'; } // Path: search @@ -606,6 +613,8 @@ class _Translations$fileInfo$de extends Translations$fileInfo$en { @override String get flagHearingImpaired => 'Für Hörgeschädigte'; @override String get flagDub => 'Dub'; @override String get flagOriginal => 'Original'; + @override String get channelsMono => 'Mono'; + @override String dolbyVisionProfile({required Object profile}) => 'Profil ${profile}'; } // Path: mediaMenu @@ -704,6 +713,11 @@ class _Translations$accessibility$de extends Translations$accessibility$en { @override String get alphabetScrollHint => 'Nach oben oder unten wischen, um einen Buchstaben weiterzugehen'; @override String rowColumnPosition({required Object row, required Object rowCount, required Object column, required Object columnCount}) => 'Zeile ${row} von ${rowCount}, Spalte ${column} von ${columnCount}'; @override String rowPosition({required Object row, required Object rowCount}) => 'Zeile ${row} von ${rowCount}'; + @override String get autoScrollPlay => 'Automatisches Scrollen starten'; + @override String get autoScrollPause => 'Automatisches Scrollen pausieren'; + @override String get hueShort => 'H'; + @override String get saturationShort => 'S'; + @override String get valueShort => 'V'; } // Path: tooltips @@ -815,6 +829,15 @@ class _Translations$videoControls$de extends Translations$videoControls$en { @override String get subtitleDownloadedNotApplied => 'Der Untertitel wurde heruntergeladen, konnte aber nicht ausgewählt werden'; @override String get subtitleDownloadFailed => 'Untertitel konnte nicht heruntergeladen werden'; @override String get searchLanguages => 'Sprachen suchen...'; + @override String get skipIntro => 'Intro überspringen'; + @override String get skipCredits => 'Abspann überspringen'; + @override String get nextEpisode => 'Nächste Episode'; + @override String subtitleTrack({required Object n}) => 'Spur ${n}'; + @override String subtitleFile({required Object name}) => 'Untertitel ${name}'; + @override String forcedTrack({required Object label}) => '${label} (Erzwungen)'; + @override String get osdSubtitlesOff => 'Untertitel: Aus'; + @override String osdSubtitles({required Object track}) => 'Untertitel: ${track}'; + @override String osdAudio({required Object track}) => 'Audio: ${track}'; } // Path: messages @@ -876,9 +899,18 @@ class _Translations$messages$de extends Translations$messages$en { @override String get serverLimitBody => 'Serverfehler (HTTP 500). Vermutlich hat ein Bandbreiten- oder Transkodierungslimit diese Sitzung abgelehnt. Bitte den Besitzer, das Limit anzupassen.'; @override String get mediaUnreadableTitle => 'Datei nicht verfügbar'; @override String get mediaUnreadableBody => 'Der Server hat dieses Element gefunden, konnte seine Datei aber nicht lesen (HTTP 404). Die Datei wurde wahrscheinlich verschoben oder gelöscht, oder ihr Speicher ist offline. Bitte den Serverbesitzer, die Datei zu prüfen und die Mediathek neu zu scannen.'; + @override String get serverBusyTitle => 'Stream nicht verfügbar'; + @override String get serverBusyBody => 'Der Server hat das Streamen dieser Datei wiederholt abgelehnt (HTTP 503). Möglicherweise wird er neu gestartet, ist ausgelastet oder der Speicherort der Datei ist offline. Versuche es gleich noch einmal. Falls das Problem weiterhin auftritt, bitte den Serverbetreiber, den Server und den Speicherort der Datei zu überprüfen.'; @override String get logsUploaded => 'Protokolle hochgeladen'; @override String get logsUploadFailed => 'Protokolle konnten nicht hochgeladen werden'; @override String get logId => 'Protokoll-ID'; + @override String get burnedSubtitlesUseMenu => 'Die Untertitel sind in diesen Stream eingebrannt. Ändere sie über das Untertitelmenü.'; + @override String get noVideoUrl => 'Keine Video-URL verfügbar'; + @override String get playbackNoMediaSources => 'Der Server hat keine abspielbaren Medienquellen zurückgegeben'; + @override String get playbackDataNotPrepared => 'Die Wiedergabe wurde gestartet, bevor die Daten bereit waren'; + @override String get streamSelectionUnavailable => 'Die Streamauswahl ist für diese Quelle nicht verfügbar'; + @override String get streamSelectionFailed => 'Die ausgewählten Streams konnten nicht angewendet werden'; + @override String get serverUnavailableForProfile => 'Für das aktive Profil ist kein Server verfügbar'; } // Path: subtitlingStyling @@ -904,6 +936,8 @@ class _Translations$subtitlingStyling$de extends Translations$subtitlingStyling$ @override String get overrideStrip => 'Formatierung entfernen'; @override String get positionTop => 'Oben'; @override String get positionBottom => 'Unten'; + @override String get anchorToScreen => 'Am Bildschirm verankern'; + @override String get anchorToScreenDescription => 'Textuntertitel in den schwarzen Balken unter Breitbildvideos anzeigen'; @override String get bold => 'Fett'; @override String get italic => 'Kursiv'; @override String get renderResolution => 'Render-Auflösung'; @@ -1013,6 +1047,7 @@ class _Translations$profiles$de extends Translations$profiles$en { @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 tokenIdentityMismatch => 'Das Plex-Profil-Token wurde einem unerwarteten Server zugeordnet'; } // Path: connections @@ -1064,6 +1099,10 @@ class _Translations$discover$de extends Translations$discover$en { @override String get tvShow => 'Serie'; @override String minutesLeft({required Object minutes}) => 'Noch ${minutes} Min.'; @override String get moreLikeThis => 'Ähnliche Inhalte'; + @override String titleCount({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('de'))(n, + one: '${n} Titel', + other: '${n} Titel', + ); } // Path: errors @@ -1276,7 +1315,10 @@ class _Translations$explore$de extends Translations$explore$en { @override String get characters => 'Charaktere'; @override String get addToWatchlist => 'Zur Merkliste hinzufügen'; @override String get removeFromWatchlist => 'Von Merkliste entfernen'; + @override String get addedToWatchlist => 'Zur Watchlist hinzugefügt'; + @override String get removedFromWatchlist => 'Von der Watchlist entfernt'; @override String get watchlistUpdateFailed => 'Merkliste konnte nicht aktualisiert werden'; + @override String get watchlistNoMatch => 'Dieser Eintrag konnte keiner Watchlist zugeordnet werden'; @override String get notInLibrary => 'Nicht in deiner Mediathek'; @override String get inTheseLibraries => 'In diesen Mediatheken'; @override String get checkingLibrary => 'Deine Mediathek wird überprüft …'; @@ -1337,6 +1379,9 @@ class _Translations$liveTv$de extends Translations$liveTv$en { @override String get watchChannel => 'Kanal ansehen'; @override String get favorites => 'Favoriten'; @override String get reorderFavorites => 'Favoriten sortieren'; + @override String get noFavoriteChannels => 'Keine Lieblingssender'; + @override String get noFavoriteChannelsHint => 'Zeige alle Sender an und halte dann einen Sender gedrückt, um ihn zu deinen Favoriten hinzuzufügen.'; + @override String get showAllChannels => 'Alle Sender anzeigen'; @override String get favoritesLoadFailed => 'Favoriten konnten nicht geladen werden. Überprüfe deine Verbindung und versuche es erneut.'; @override String get favoritesUpdateFailed => 'Favoriten konnten nicht aktualisiert werden. Prüfe deine Verbindung und versuche es erneut.'; @override String get joinSession => 'Aktueller Sitzung beitreten'; @@ -1376,6 +1421,11 @@ class _Translations$liveTv$de extends Translations$liveTv$en { @override String get guideReloadRequested => 'Aktualisierung des TV-Programms angefordert'; @override String get rulesProcessRequested => 'Regelauswertung angefordert'; @override String get recordShow => 'Sendung aufnehmen'; + @override String startingInMinutes({required Object minutes}) => 'Beginnt in ${minutes} Min.'; + @override String dayAtTime({required Object day, required Object time}) => '${day} um ${time}'; + @override String invalidPlaybackData({required Object product}) => '${product} hat ungültige Live-TV-Wiedergabedaten zurückgegeben'; + @override String get failedToStartChannel => 'Der Live-Sender konnte nicht gestartet werden'; + @override String get failedToBuildStreamUrl => 'Die Stream-URL konnte nicht erstellt werden'; } // Path: collections @@ -1474,6 +1524,8 @@ class _Translations$music$de extends Translations$music$en { @override String get repeat => 'Wiederholen'; @override String get repeatAll => 'Alle wiederholen'; @override String get repeatOne => 'Titel wiederholen'; + @override String get instantMixNoServer => 'Für einen Instant Mix ist kein Server verfügbar'; + @override String noAudioUrl({required Object track}) => 'Für ${track} ist keine Audio-URL verfügbar'; } // Path: watchTogether @@ -1548,6 +1600,7 @@ class _Translations$watchTogether$de extends Translations$watchTogether$en { @override String get removeRoom => 'Entfernen'; @override String get guestSwitchUnavailable => 'Wechsel fehlgeschlagen — Server nicht für Synchronisierung verfügbar'; @override String get guestSwitchFailed => 'Wechsel fehlgeschlagen — Inhalt auf diesem Server nicht gefunden'; + @override String get defaultDisplayName => 'Benutzer'; } // Path: downloads @@ -1632,6 +1685,16 @@ class _Translations$downloads$de extends Translations$downloads$en { @override String get syncRuleUnknownServer => 'Unbekannter Server'; @override String get syncRuleListCreated => 'Synchronisierungsregel erstellt'; @override late final _Translations$downloads$backgroundWarning$de backgroundWarning = _Translations$downloads$backgroundWarning$de._(_root); + @override String get unknownShow => 'Unbekannte Serie'; + @override String get unknownSeason => 'Unbekannte Staffel'; + @override String get unknownAlbum => 'Unbekanntes Album'; + @override String completedOfTotal({required Object completed, required Object total}) => '${completed}/${total} abgeschlossen'; + @override String get errorFileNotFound => 'Datei nicht gefunden (404)'; + @override String get errorDownloadFailed => 'Download fehlgeschlagen'; + @override String errorPostProcessing({required Object error}) => 'Nachbearbeitung fehlgeschlagen: ${error}'; + @override String get notificationDownloading => 'Wird heruntergeladen …'; + @override String get notificationComplete => 'Download abgeschlossen'; + @override String get notificationPaused => 'Download pausiert'; } // Path: shaders @@ -1672,6 +1735,7 @@ class _Translations$companionRemote$de extends Translations$companionRemote$en { @override late final _Translations$companionRemote$pairing$de pairing = _Translations$companionRemote$pairing$de._(_root); @override late final _Translations$companionRemote$remote$de remote = _Translations$companionRemote$remote$de._(_root); @override late final _Translations$companionRemote$errors$de errors = _Translations$companionRemote$errors$de._(_root); + @override String get closedBeforeAuth => 'Die Verbindung wurde vor der Authentifizierung geschlossen'; } // Path: videoSettings @@ -1689,6 +1753,13 @@ class _Translations$videoSettings$de extends Translations$videoSettings$en { @override String get audioSync => 'Audio-Synchronisation'; @override String get subtitleSync => 'Untertitel-Synchronisation'; @override String get hdr => 'HDR'; + @override String get hdrUnsupported => 'HDR ist hier nicht verfügbar – dieser Desktop-Compositor oder Videoausgang kann es nicht übertragen.'; + @override String get hdrToneMapping => 'HDR-Tone-Mapping'; + @override String get hdrToneMappingCompositor => 'Compositor'; + @override String get hdrToneMappingCompositorDescription => 'Die HDR-Metadaten der Quelle durchreichen und vom Desktop-Compositor anpassen lassen.'; + @override String get hdrToneMappingPlayer => 'Player'; + @override String get hdrToneMappingPlayerDescription => 'Im Player an die maximale Helligkeit des Displays anpassen und das Ergebnis anschließend an den Compositor melden.'; + @override String get hdrToneMappingFailed => 'Das HDR-Tone-Mapping konnte nicht geändert werden – der vorherige Modus ist weiterhin aktiv.'; @override String get audioOutput => 'Audioausgabe'; @override String get performanceOverlay => 'Leistungsanzeige'; @override String get audioOutputDolbyAtmos => 'Dolby Atmos'; @@ -1742,6 +1813,16 @@ class _Translations$performanceOverlay$de extends Translations$performanceOverla @override String get player => 'Player'; @override String get memory => 'Speicher'; @override String get uiFps => 'UI-FPS'; + @override String get fps => 'FPS'; + @override String get decoderAndroidHw => 'Android HW'; + @override String get decoderNvidiaHw => 'NVIDIA HW'; + @override String get decoderQualcommHw => 'Qualcomm HW'; + @override String get decoderMediatekHw => 'MediaTek HW'; + @override String get decoderExynosHw => 'Exynos HW'; + @override String get decoderSoftware => 'Software'; + @override String get decoderHardware => 'Hardware'; + @override String get tunnelingActive => 'Aktiv'; + @override String dvRpuFailed({required Object converted, required Object failures}) => '${converted} (${failures} fehlgeschlagen)'; } // Path: externalPlayer @@ -1942,6 +2023,16 @@ class _Translations$seerr$de extends Translations$seerr$en { @override String get statusPartiallyAvailable => 'Teilweise verfügbar'; @override String get statusRequested => 'Angefragt'; @override String get statusProcessing => 'Wird verarbeitet'; + @override String couldNotReach({required Object url, required Object error}) => '${url} nicht erreichbar: ${error}'; + @override String noInstanceAtUrl({required Object url, required Object status}) => 'Keine Seerr-Instanz unter ${url} (HTTP ${status})'; + @override String get notInitialized => 'Die Ersteinrichtung dieser Seerr-Instanz wurde noch nicht abgeschlossen'; + @override String get noPlexTokenForReauth => 'Für die erneute Anmeldung ist kein Plex-Token verfügbar'; + @override String get noStoredCredentials => 'Für die erneute Anmeldung sind keine gespeicherten Anmeldedaten verfügbar'; + @override String get signInRejected => 'Die Anmeldung wurde abgelehnt'; + @override String get noSessionCookie => 'Seerr hat kein Sitzungscookie ausgestellt'; + @override String get freshCookieRejected => 'Seerr hat das neue Sitzungscookie abgelehnt'; + @override String get noUserInformation => 'Seerr hat keine Benutzerinformationen zurückgegeben'; + @override String get sessionRejectedAfterReauth => 'Die Sitzung wurde nach der erneuten Anmeldung abgelehnt'; } // Path: services @@ -2002,6 +2093,24 @@ class _Translations$addServer$de extends Translations$addServer$en { @override String connectToMediaBrowserCardSubtitleScoped({required Object product, required Object name}) => 'Melde dich bei deinem ${product}-Server an. Wird mit ${name} verknüpft.'; @override String get borrowFromAnotherProfile => 'Von einem anderen Profil ausleihen'; @override String get borrowFromAnotherProfileSubtitle => 'Verbindung eines anderen Profils wiederverwenden. PIN-geschützte Profile erfordern eine PIN.'; + @override String get invalidCredentials => 'Ungültiger Benutzername oder ungültiges Passwort'; + @override String get authResponseNotJson => 'Die Authentifizierungsantwort war kein gültiges JSON'; + @override String get quickConnectRejected => 'Quick Connect wurde vom Server abgelehnt'; + @override String get quickConnectNotJson => 'Die Quick Connect-Antwort war kein gültiges JSON'; + @override String get quickConnectMissingFields => 'In der Quick Connect-Antwort fehlt ein Code oder Geheimnis'; + @override String get quickConnectPollRejected => 'Die Quick Connect-Abfrage wurde vom Server abgelehnt'; + @override String get serverTimedOut => 'Der Server hat nicht rechtzeitig geantwortet'; + @override String get responseNotJson => 'Die Serverantwort war kein gültiges JSON'; + @override String responseMissingIdentity({required Object product}) => 'In der Antwort fehlt eine ID oder ein Servername – ist dies ein ${product}-Server?'; + @override String probeFailed({required Object error}) => 'Server nicht erreichbar: ${error}'; + @override String enterAtLeastOneUrl({required Object product}) => 'Gib mindestens eine URL eines ${product}-Servers ein'; + @override String noReachableServer({required Object product}) => 'Es wurde kein erreichbarer ${product}-Server gefunden'; + @override String urlsPointToDifferentServers({required Object product}) => 'Diese URLs verweisen auf verschiedene ${product}-Server'; + @override String urlDoesNotMatchServer({required Object product}) => 'Diese URL gehört nicht zum ${product}-Server'; + @override String get redirectUnsupported => 'Der Server hat zu einer nicht unterstützten URL weitergeleitet'; + @override String redirectDifferentHost({required Object product}) => 'Der Server hat zu einem anderen Host weitergeleitet. Gib die endgültige ${product}-URL direkt ein.'; + @override String get redirectInsecure => 'Der Server hat von HTTPS zu einer unsicheren URL weitergeleitet'; + @override String redirectUnsupportedEnterFinal({required Object product}) => 'Der Server hat zu einer nicht unterstützten URL weitergeleitet. Gib die endgültige ${product}-URL direkt ein.'; } // Path: common.ratingSource @@ -2521,6 +2630,7 @@ class _Translations$services$deviceCode$de extends Translations$services$deviceC // Translations @override String title({required Object service}) => 'Plezy auf ${service} aktivieren'; + @override String get instructions => 'Scanne den QR-Code oder rufe die unten angegebene Adresse auf und gib diesen Code ein:'; @override String openToActivate({required Object service}) => '${service} zum Aktivieren öffnen'; @override String get copyCode => 'Aktivierungscode kopieren'; @override String get waitingForAuthorization => 'Warte auf Autorisierung…'; @@ -2595,6 +2705,7 @@ extension on TranslationsDe { 'auth.quickConnectCancel' => 'Abbrechen', 'auth.quickConnectExpired' => 'Quick Connect ist abgelaufen. Versuche es erneut.', 'auth.localDataRecoveryRequired' => 'Plezy konnte lokale Anmeldedaten und ausstehende Wiedergabedaten nicht sicher wiederherstellen. Bitte melde dich erneut an.', + 'auth.pinCheckRejected' => 'Die Plex-PIN-Prüfung wurde abgelehnt', 'common.cancel' => 'Abbrechen', 'common.save' => 'Speichern', 'common.close' => 'Schließen', @@ -2651,6 +2762,9 @@ extension on TranslationsDe { 'common.ratingSource.trakt' => 'Trakt', 'common.ratingSource.rottenTomatoesCritic' => 'Rotten-Tomatoes-Kritiker', 'common.ratingSource.rottenTomatoesAudience' => 'Rotten-Tomatoes-Publikum', + 'common.notAvailable' => 'N. v.', + 'common.url' => 'URL', + 'common.letterKeys' => 'ABC', 'screens.licenses' => 'Lizenzen', 'screens.switchProfile' => 'Profil wechseln', 'screens.subtitleStyling' => 'Untertitel-Stil', @@ -2890,6 +3004,8 @@ extension on TranslationsDe { 'settings.showNavBarLabels' => 'Navigationsleisten-Beschriftungen anzeigen', 'settings.showNavBarLabelsDescription' => 'Textbeschriftungen unter den Symbolen der Navigationsleiste anzeigen', 'settings.startupSection' => 'Startbereich', + 'settings.showExploreTab' => 'Tab „Entdecken“ anzeigen', + 'settings.showExploreTabDescription' => 'Zeigt den Tab „Entdecken“ mit Inhalten aus Plex Discover und verbundenen Trackern an', 'settings.liveTvDefaultFavorites' => 'Standardmäßig Favoritenkanäle', 'settings.liveTvDefaultFavoritesDescription' => 'Beim Öffnen von Live TV nur Favoritenkanäle anzeigen', 'settings.display' => 'Anzeige', @@ -2901,6 +3017,7 @@ extension on TranslationsDe { 'settings.subtitlesAndConfig' => 'Untertitel und Konfiguration', 'settings.seekAndTiming' => 'Spulen & Timing', 'settings.behavior' => 'Verhalten', + 'settings.exportDialogTitle' => 'Plezy-Einstellungen exportieren', 'search.hint' => 'Filme, Serien und Musik suchen …', 'search.tryDifferentTerm' => 'Anderen Suchbegriff versuchen', 'search.searchYourMedia' => 'In den eigenen Medien suchen', @@ -3049,6 +3166,8 @@ extension on TranslationsDe { 'fileInfo.flagHearingImpaired' => 'Für Hörgeschädigte', 'fileInfo.flagDub' => 'Dub', 'fileInfo.flagOriginal' => 'Original', + 'fileInfo.channelsMono' => 'Mono', + 'fileInfo.dolbyVisionProfile' => ({required Object profile}) => 'Profil ${profile}', 'mediaMenu.markAsWatched' => 'Als gesehen markieren', 'mediaMenu.markAsUnwatched' => 'Als ungesehen markieren', 'mediaMenu.removeFromContinueWatching' => 'Aus ‚Weiterschauen‘ entfernen', @@ -3082,6 +3201,8 @@ extension on TranslationsDe { 'mediaMenu.rate' => 'Bewerten', 'mediaMenu.playFromBeginning' => 'Von Anfang an abspielen', 'mediaMenu.playVersion' => 'Version abspielen …', + _ => null, + } ?? switch (path) { 'rateSheet.title' => 'Bewerten', 'rateSheet.server' => 'Server', 'rateSheet.favorite' => 'Favorit', @@ -3091,8 +3212,6 @@ extension on TranslationsDe { 'rateSheet.noConnectedServices' => 'Verbinde einen Dienst in den Einstellungen, um dort zu bewerten.', 'accessibility.mediaCardMovie' => ({required Object title}) => '${title}, Film', 'accessibility.mediaCardShow' => ({required Object title}) => '${title}, Serie', - _ => null, - } ?? switch (path) { 'accessibility.mediaCardEpisode' => ({required Object title, required Object episodeInfo}) => '${title}, ${episodeInfo}', 'accessibility.mediaCardSeason' => ({required Object title, required Object seasonInfo}) => '${title}, ${seasonInfo}', 'accessibility.mediaCardWatched' => 'gesehen', @@ -3113,6 +3232,11 @@ extension on TranslationsDe { 'accessibility.alphabetScrollHint' => 'Nach oben oder unten wischen, um einen Buchstaben weiterzugehen', 'accessibility.rowColumnPosition' => ({required Object row, required Object rowCount, required Object column, required Object columnCount}) => 'Zeile ${row} von ${rowCount}, Spalte ${column} von ${columnCount}', 'accessibility.rowPosition' => ({required Object row, required Object rowCount}) => 'Zeile ${row} von ${rowCount}', + 'accessibility.autoScrollPlay' => 'Automatisches Scrollen starten', + 'accessibility.autoScrollPause' => 'Automatisches Scrollen pausieren', + 'accessibility.hueShort' => 'H', + 'accessibility.saturationShort' => 'S', + 'accessibility.valueShort' => 'V', 'tooltips.shufflePlay' => 'Zufallswiedergabe', 'tooltips.playTrailer' => 'Trailer abspielen', 'tooltips.markAsWatched' => 'Als gesehen markieren', @@ -3203,6 +3327,15 @@ extension on TranslationsDe { 'videoControls.subtitleDownloadedNotApplied' => 'Der Untertitel wurde heruntergeladen, konnte aber nicht ausgewählt werden', 'videoControls.subtitleDownloadFailed' => 'Untertitel konnte nicht heruntergeladen werden', 'videoControls.searchLanguages' => 'Sprachen suchen...', + 'videoControls.skipIntro' => 'Intro überspringen', + 'videoControls.skipCredits' => 'Abspann überspringen', + 'videoControls.nextEpisode' => 'Nächste Episode', + 'videoControls.subtitleTrack' => ({required Object n}) => 'Spur ${n}', + 'videoControls.subtitleFile' => ({required Object name}) => 'Untertitel ${name}', + 'videoControls.forcedTrack' => ({required Object label}) => '${label} (Erzwungen)', + 'videoControls.osdSubtitlesOff' => 'Untertitel: Aus', + 'videoControls.osdSubtitles' => ({required Object track}) => 'Untertitel: ${track}', + 'videoControls.osdAudio' => ({required Object track}) => 'Audio: ${track}', 'messages.markedAsWatched' => 'Als gesehen markiert', 'messages.markedAsUnwatched' => 'Als ungesehen markiert', 'messages.markedAsWatchedOffline' => 'Als gesehen markiert (wird synchronisiert, wenn online)', @@ -3252,9 +3385,18 @@ extension on TranslationsDe { 'messages.serverLimitBody' => 'Serverfehler (HTTP 500). Vermutlich hat ein Bandbreiten- oder Transkodierungslimit diese Sitzung abgelehnt. Bitte den Besitzer, das Limit anzupassen.', 'messages.mediaUnreadableTitle' => 'Datei nicht verfügbar', 'messages.mediaUnreadableBody' => 'Der Server hat dieses Element gefunden, konnte seine Datei aber nicht lesen (HTTP 404). Die Datei wurde wahrscheinlich verschoben oder gelöscht, oder ihr Speicher ist offline. Bitte den Serverbesitzer, die Datei zu prüfen und die Mediathek neu zu scannen.', + 'messages.serverBusyTitle' => 'Stream nicht verfügbar', + 'messages.serverBusyBody' => 'Der Server hat das Streamen dieser Datei wiederholt abgelehnt (HTTP 503). Möglicherweise wird er neu gestartet, ist ausgelastet oder der Speicherort der Datei ist offline. Versuche es gleich noch einmal. Falls das Problem weiterhin auftritt, bitte den Serverbetreiber, den Server und den Speicherort der Datei zu überprüfen.', 'messages.logsUploaded' => 'Protokolle hochgeladen', 'messages.logsUploadFailed' => 'Protokolle konnten nicht hochgeladen werden', 'messages.logId' => 'Protokoll-ID', + 'messages.burnedSubtitlesUseMenu' => 'Die Untertitel sind in diesen Stream eingebrannt. Ändere sie über das Untertitelmenü.', + 'messages.noVideoUrl' => 'Keine Video-URL verfügbar', + 'messages.playbackNoMediaSources' => 'Der Server hat keine abspielbaren Medienquellen zurückgegeben', + 'messages.playbackDataNotPrepared' => 'Die Wiedergabe wurde gestartet, bevor die Daten bereit waren', + 'messages.streamSelectionUnavailable' => 'Die Streamauswahl ist für diese Quelle nicht verfügbar', + 'messages.streamSelectionFailed' => 'Die ausgewählten Streams konnten nicht angewendet werden', + 'messages.serverUnavailableForProfile' => 'Für das aktive Profil ist kein Server verfügbar', 'subtitlingStyling.text' => 'Text', 'subtitlingStyling.border' => 'Rahmen', 'subtitlingStyling.background' => 'Hintergrund', @@ -3271,6 +3413,8 @@ extension on TranslationsDe { 'subtitlingStyling.overrideStrip' => 'Formatierung entfernen', 'subtitlingStyling.positionTop' => 'Oben', 'subtitlingStyling.positionBottom' => 'Unten', + 'subtitlingStyling.anchorToScreen' => 'Am Bildschirm verankern', + 'subtitlingStyling.anchorToScreenDescription' => 'Textuntertitel in den schwarzen Balken unter Breitbildvideos anzeigen', 'subtitlingStyling.bold' => 'Fett', 'subtitlingStyling.italic' => 'Kursiv', 'subtitlingStyling.renderResolution' => 'Render-Auflösung', @@ -3353,6 +3497,7 @@ extension on TranslationsDe { 'profiles.pinExplain' => '4-stellige PIN zum Profilwechsel erforderlich.', 'profiles.continueButton' => 'Weiter', 'profiles.pinsDontMatch' => 'PINs stimmen nicht überein', + 'profiles.tokenIdentityMismatch' => 'Das Plex-Profil-Token wurde einem unerwarteten Server zugeordnet', 'connections.sectionTitle' => 'Verbindungen', 'connections.addConnection' => 'Verbindung hinzufügen', 'connections.addConnectionSubtitleNoProfile' => 'Mit Plex anmelden oder mit einem Jellyfin-Server verbinden', @@ -3386,6 +3531,7 @@ extension on TranslationsDe { 'discover.tvShow' => 'Serie', 'discover.minutesLeft' => ({required Object minutes}) => 'Noch ${minutes} Min.', 'discover.moreLikeThis' => 'Ähnliche Inhalte', + 'discover.titleCount' => ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('de'))(n, one: '${n} Titel', other: '${n} Titel', ), 'errors.searchFailed' => ({required Object error}) => 'Suche fehlgeschlagen: ${error}', 'errors.searchUnavailable' => 'Die Suche konnte keinen Medienserver erreichen.', 'errors.connectionTimeout' => ({required Object context}) => 'Zeitüberschreitung beim Laden von ${context}', @@ -3558,7 +3704,10 @@ extension on TranslationsDe { 'explore.characters' => 'Charaktere', 'explore.addToWatchlist' => 'Zur Merkliste hinzufügen', 'explore.removeFromWatchlist' => 'Von Merkliste entfernen', + 'explore.addedToWatchlist' => 'Zur Watchlist hinzugefügt', + 'explore.removedFromWatchlist' => 'Von der Watchlist entfernt', 'explore.watchlistUpdateFailed' => 'Merkliste konnte nicht aktualisiert werden', + 'explore.watchlistNoMatch' => 'Dieser Eintrag konnte keiner Watchlist zugeordnet werden', 'explore.notInLibrary' => 'Nicht in deiner Mediathek', 'explore.inTheseLibraries' => 'In diesen Mediatheken', 'explore.checkingLibrary' => 'Deine Mediathek wird überprüft …', @@ -3566,6 +3715,8 @@ extension on TranslationsDe { 'explore.emptyMessage' => ({required Object source}) => 'Zeilen aus ${source} erscheinen hier, sobald sie Inhalte enthalten.', 'explore.searchHint' => ({required Object source}) => '${source} durchsuchen', 'explore.searchEmpty' => ({required Object query}) => 'Keine Ergebnisse für „${query}“', + _ => null, + } ?? switch (path) { 'explore.searchPrompt' => ({required Object source}) => 'Suche nach Filmen und Serien auf ${source}.', 'explore.searchFailed' => 'Suche fehlgeschlagen. Prüfe deine Verbindung und versuche es erneut.', 'explore.badge.rankPopular' => ({required Object n}) => '#${n} beliebt', @@ -3605,8 +3756,6 @@ extension on TranslationsDe { 'explore.stats.completed' => ({required Object n}) => '${n} abgeschlossen', 'explore.stats.onHold' => ({required Object n}) => '${n} pausiert', 'explore.stats.dropped' => ({required Object n}) => '${n} abgebrochen', - _ => null, - } ?? switch (path) { 'explore.season.winter' => 'Winter', 'explore.season.spring' => 'Frühling', 'explore.season.summer' => 'Sommer', @@ -3703,6 +3852,9 @@ extension on TranslationsDe { 'liveTv.watchChannel' => 'Kanal ansehen', 'liveTv.favorites' => 'Favoriten', 'liveTv.reorderFavorites' => 'Favoriten sortieren', + 'liveTv.noFavoriteChannels' => 'Keine Lieblingssender', + 'liveTv.noFavoriteChannelsHint' => 'Zeige alle Sender an und halte dann einen Sender gedrückt, um ihn zu deinen Favoriten hinzuzufügen.', + 'liveTv.showAllChannels' => 'Alle Sender anzeigen', 'liveTv.favoritesLoadFailed' => 'Favoriten konnten nicht geladen werden. Überprüfe deine Verbindung und versuche es erneut.', 'liveTv.favoritesUpdateFailed' => 'Favoriten konnten nicht aktualisiert werden. Prüfe deine Verbindung und versuche es erneut.', 'liveTv.joinSession' => 'Aktueller Sitzung beitreten', @@ -3742,6 +3894,11 @@ extension on TranslationsDe { 'liveTv.guideReloadRequested' => 'Aktualisierung des TV-Programms angefordert', 'liveTv.rulesProcessRequested' => 'Regelauswertung angefordert', 'liveTv.recordShow' => 'Sendung aufnehmen', + 'liveTv.startingInMinutes' => ({required Object minutes}) => 'Beginnt in ${minutes} Min.', + 'liveTv.dayAtTime' => ({required Object day, required Object time}) => '${day} um ${time}', + 'liveTv.invalidPlaybackData' => ({required Object product}) => '${product} hat ungültige Live-TV-Wiedergabedaten zurückgegeben', + 'liveTv.failedToStartChannel' => 'Der Live-Sender konnte nicht gestartet werden', + 'liveTv.failedToBuildStreamUrl' => 'Die Stream-URL konnte nicht erstellt werden', 'collections.title' => 'Sammlungen', 'collections.collection' => 'Sammlung', 'collections.empty' => 'Sammlung ist leer', @@ -3810,6 +3967,8 @@ extension on TranslationsDe { 'music.repeat' => 'Wiederholen', 'music.repeatAll' => 'Alle wiederholen', 'music.repeatOne' => 'Titel wiederholen', + 'music.instantMixNoServer' => 'Für einen Instant Mix ist kein Server verfügbar', + 'music.noAudioUrl' => ({required Object track}) => 'Für ${track} ist keine Audio-URL verfügbar', 'watchTogether.title' => 'Gemeinsam Schauen', 'watchTogether.description' => 'Inhalte synchron mit Freunden und Familie schauen', 'watchTogether.createSession' => 'Sitzung erstellen', @@ -3875,6 +4034,7 @@ extension on TranslationsDe { 'watchTogether.removeRoom' => 'Entfernen', 'watchTogether.guestSwitchUnavailable' => 'Wechsel fehlgeschlagen — Server nicht für Synchronisierung verfügbar', 'watchTogether.guestSwitchFailed' => 'Wechsel fehlgeschlagen — Inhalt auf diesem Server nicht gefunden', + 'watchTogether.defaultDisplayName' => 'Benutzer', 'downloads.title' => 'Downloads', 'downloads.manage' => 'Verwalten', 'downloads.tvShows' => 'Serien', @@ -3975,6 +4135,16 @@ extension on TranslationsDe { 'downloads.backgroundWarning.statusUnknown' => 'Noch nicht geprüft', 'downloads.backgroundWarning.settingsUnavailable' => 'Die Systemeinstellungen konnten auf diesem Gerät nicht geöffnet werden', 'downloads.backgroundWarning.linkUnavailable' => 'dontkillmyapp.com konnte auf diesem Gerät nicht geöffnet werden', + 'downloads.unknownShow' => 'Unbekannte Serie', + 'downloads.unknownSeason' => 'Unbekannte Staffel', + 'downloads.unknownAlbum' => 'Unbekanntes Album', + 'downloads.completedOfTotal' => ({required Object completed, required Object total}) => '${completed}/${total} abgeschlossen', + 'downloads.errorFileNotFound' => 'Datei nicht gefunden (404)', + 'downloads.errorDownloadFailed' => 'Download fehlgeschlagen', + 'downloads.errorPostProcessing' => ({required Object error}) => 'Nachbearbeitung fehlgeschlagen: ${error}', + 'downloads.notificationDownloading' => 'Wird heruntergeladen …', + 'downloads.notificationComplete' => 'Download abgeschlossen', + 'downloads.notificationPaused' => 'Download pausiert', 'shaders.title' => 'Shader', 'shaders.noShaderDescription' => 'Keine Videoverbesserung', 'shaders.nvscalerDescription' => 'NVIDIA-Bildskalierung für schärferes Video', @@ -4054,14 +4224,24 @@ extension on TranslationsDe { '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', + 'companionRemote.closedBeforeAuth' => 'Die Verbindung wurde vor der Authentifizierung geschlossen', 'videoSettings.playbackSpeed' => 'Wiedergabegeschwindigkeit', 'videoSettings.normalSpeed' => 'Normal', 'videoSettings.sleepTimerActive' => ({required Object duration}) => 'Aktiv (${duration})', 'videoSettings.zoom' => 'Zoom', + _ => null, + } ?? switch (path) { 'videoSettings.sleepTimer' => 'Schlaftimer', 'videoSettings.audioSync' => 'Audio-Synchronisation', 'videoSettings.subtitleSync' => 'Untertitel-Synchronisation', 'videoSettings.hdr' => 'HDR', + 'videoSettings.hdrUnsupported' => 'HDR ist hier nicht verfügbar – dieser Desktop-Compositor oder Videoausgang kann es nicht übertragen.', + 'videoSettings.hdrToneMapping' => 'HDR-Tone-Mapping', + 'videoSettings.hdrToneMappingCompositor' => 'Compositor', + 'videoSettings.hdrToneMappingCompositorDescription' => 'Die HDR-Metadaten der Quelle durchreichen und vom Desktop-Compositor anpassen lassen.', + 'videoSettings.hdrToneMappingPlayer' => 'Player', + 'videoSettings.hdrToneMappingPlayerDescription' => 'Im Player an die maximale Helligkeit des Displays anpassen und das Ergebnis anschließend an den Compositor melden.', + 'videoSettings.hdrToneMappingFailed' => 'Das HDR-Tone-Mapping konnte nicht geändert werden – der vorherige Modus ist weiterhin aktiv.', 'videoSettings.audioOutput' => 'Audioausgabe', 'videoSettings.performanceOverlay' => 'Leistungsanzeige', 'videoSettings.audioOutputDolbyAtmos' => 'Dolby Atmos', @@ -4106,6 +4286,16 @@ extension on TranslationsDe { 'performanceOverlay.player' => 'Player', 'performanceOverlay.memory' => 'Speicher', 'performanceOverlay.uiFps' => 'UI-FPS', + 'performanceOverlay.fps' => 'FPS', + 'performanceOverlay.decoderAndroidHw' => 'Android HW', + 'performanceOverlay.decoderNvidiaHw' => 'NVIDIA HW', + 'performanceOverlay.decoderQualcommHw' => 'Qualcomm HW', + 'performanceOverlay.decoderMediatekHw' => 'MediaTek HW', + 'performanceOverlay.decoderExynosHw' => 'Exynos HW', + 'performanceOverlay.decoderSoftware' => 'Software', + 'performanceOverlay.decoderHardware' => 'Hardware', + 'performanceOverlay.tunnelingActive' => 'Aktiv', + 'performanceOverlay.dvRpuFailed' => ({required Object converted, required Object failures}) => '${converted} (${failures} fehlgeschlagen)', 'externalPlayer.title' => 'Externer Player', 'externalPlayer.useExternalPlayer' => 'Externen Player verwenden', 'externalPlayer.useExternalPlayerDescription' => 'Videos in einer anderen App öffnen', @@ -4119,8 +4309,6 @@ extension on TranslationsDe { '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', @@ -4254,6 +4442,16 @@ extension on TranslationsDe { 'seerr.statusPartiallyAvailable' => 'Teilweise verfügbar', 'seerr.statusRequested' => 'Angefragt', 'seerr.statusProcessing' => 'Wird verarbeitet', + 'seerr.couldNotReach' => ({required Object url, required Object error}) => '${url} nicht erreichbar: ${error}', + 'seerr.noInstanceAtUrl' => ({required Object url, required Object status}) => 'Keine Seerr-Instanz unter ${url} (HTTP ${status})', + 'seerr.notInitialized' => 'Die Ersteinrichtung dieser Seerr-Instanz wurde noch nicht abgeschlossen', + 'seerr.noPlexTokenForReauth' => 'Für die erneute Anmeldung ist kein Plex-Token verfügbar', + 'seerr.noStoredCredentials' => 'Für die erneute Anmeldung sind keine gespeicherten Anmeldedaten verfügbar', + 'seerr.signInRejected' => 'Die Anmeldung wurde abgelehnt', + 'seerr.noSessionCookie' => 'Seerr hat kein Sitzungscookie ausgestellt', + 'seerr.freshCookieRejected' => 'Seerr hat das neue Sitzungscookie abgelehnt', + 'seerr.noUserInformation' => 'Seerr hat keine Benutzerinformationen zurückgegeben', + 'seerr.sessionRejectedAfterReauth' => 'Die Sitzung wurde nach der erneuten Anmeldung abgelehnt', 'services.title' => 'Dienste', 'services.hubSubtitle' => 'Wiedergabefortschritt synchronisieren und neue Titel anfragen.', 'services.notConnected' => 'Nicht verbunden', @@ -4269,6 +4467,7 @@ extension on TranslationsDe { 'services.names.seerr' => 'Seerr', 'services.names.mdblist' => 'MDBList', 'services.deviceCode.title' => ({required Object service}) => 'Plezy auf ${service} aktivieren', + 'services.deviceCode.instructions' => 'Scanne den QR-Code oder rufe die unten angegebene Adresse auf und gib diesen Code ein:', 'services.deviceCode.openToActivate' => ({required Object service}) => '${service} zum Aktivieren öffnen', 'services.deviceCode.copyCode' => 'Aktivierungscode kopieren', 'services.deviceCode.waitingForAuthorization' => 'Warte auf Autorisierung…', @@ -4318,6 +4517,24 @@ extension on TranslationsDe { 'addServer.connectToMediaBrowserCardSubtitleScoped' => ({required Object product, required Object name}) => 'Melde dich bei deinem ${product}-Server an. Wird mit ${name} verknüpft.', 'addServer.borrowFromAnotherProfile' => 'Von einem anderen Profil ausleihen', 'addServer.borrowFromAnotherProfileSubtitle' => 'Verbindung eines anderen Profils wiederverwenden. PIN-geschützte Profile erfordern eine PIN.', + 'addServer.invalidCredentials' => 'Ungültiger Benutzername oder ungültiges Passwort', + 'addServer.authResponseNotJson' => 'Die Authentifizierungsantwort war kein gültiges JSON', + 'addServer.quickConnectRejected' => 'Quick Connect wurde vom Server abgelehnt', + 'addServer.quickConnectNotJson' => 'Die Quick Connect-Antwort war kein gültiges JSON', + 'addServer.quickConnectMissingFields' => 'In der Quick Connect-Antwort fehlt ein Code oder Geheimnis', + 'addServer.quickConnectPollRejected' => 'Die Quick Connect-Abfrage wurde vom Server abgelehnt', + 'addServer.serverTimedOut' => 'Der Server hat nicht rechtzeitig geantwortet', + 'addServer.responseNotJson' => 'Die Serverantwort war kein gültiges JSON', + 'addServer.responseMissingIdentity' => ({required Object product}) => 'In der Antwort fehlt eine ID oder ein Servername – ist dies ein ${product}-Server?', + 'addServer.probeFailed' => ({required Object error}) => 'Server nicht erreichbar: ${error}', + 'addServer.enterAtLeastOneUrl' => ({required Object product}) => 'Gib mindestens eine URL eines ${product}-Servers ein', + 'addServer.noReachableServer' => ({required Object product}) => 'Es wurde kein erreichbarer ${product}-Server gefunden', + 'addServer.urlsPointToDifferentServers' => ({required Object product}) => 'Diese URLs verweisen auf verschiedene ${product}-Server', + 'addServer.urlDoesNotMatchServer' => ({required Object product}) => 'Diese URL gehört nicht zum ${product}-Server', + 'addServer.redirectUnsupported' => 'Der Server hat zu einer nicht unterstützten URL weitergeleitet', + 'addServer.redirectDifferentHost' => ({required Object product}) => 'Der Server hat zu einem anderen Host weitergeleitet. Gib die endgültige ${product}-URL direkt ein.', + 'addServer.redirectInsecure' => 'Der Server hat von HTTPS zu einer unsicheren URL weitergeleitet', + 'addServer.redirectUnsupportedEnterFinal' => ({required Object product}) => 'Der Server hat zu einer nicht unterstützten URL weitergeleitet. Gib die endgültige ${product}-URL direkt ein.', _ => null, }; } diff --git a/lib/i18n/strings_en.g.dart b/lib/i18n/strings_en.g.dart index d460dfe4..0a7fb52e 100644 --- a/lib/i18n/strings_en.g.dart +++ b/lib/i18n/strings_en.g.dart @@ -156,6 +156,9 @@ class Translations$auth$en { /// en: 'Plezy could not safely recover local sign-in and pending playback data. Please sign in again.' String get localDataRecoveryRequired => 'Plezy could not safely recover local sign-in and pending playback data. Please sign in again.'; + + /// en: 'The Plex PIN check was rejected' + String get pinCheckRejected => 'The Plex PIN check was rejected'; } // Path: common @@ -302,6 +305,15 @@ class Translations$common$en { String get pressBackAgainToExit => 'Press back again to exit'; late final Translations$common$ratingSource$en ratingSource = Translations$common$ratingSource$en.internal(_root); + + /// en: 'N/A' + String get notAvailable => 'N/A'; + + /// en: 'URL' + String get url => 'URL'; + + /// en: 'ABC' + String get letterKeys => 'ABC'; } // Path: screens @@ -1085,6 +1097,9 @@ class Translations$settings$en { /// en: 'Behavior' String get behavior => 'Behavior'; + + /// en: 'Export Plezy settings' + String get exportDialogTitle => 'Export Plezy settings'; } // Path: search @@ -1483,6 +1498,12 @@ class Translations$fileInfo$en { /// en: 'Original' String get flagOriginal => 'Original'; + + /// en: 'Mono' + String get channelsMono => 'Mono'; + + /// en: 'Profile ${profile}' + String dolbyVisionProfile({required Object profile}) => 'Profile ${profile}'; } // Path: mediaMenu @@ -1705,6 +1726,21 @@ class Translations$accessibility$en { /// en: 'Row ${row} of ${rowCount}' String rowPosition({required Object row, required Object rowCount}) => 'Row ${row} of ${rowCount}'; + + /// en: 'Play auto-scroll' + String get autoScrollPlay => 'Play auto-scroll'; + + /// en: 'Pause auto-scroll' + String get autoScrollPause => 'Pause auto-scroll'; + + /// en: 'H' + String get hueShort => 'H'; + + /// en: 'S' + String get saturationShort => 'S'; + + /// en: 'V' + String get valueShort => 'V'; } // Path: tooltips @@ -1983,6 +2019,33 @@ class Translations$videoControls$en { /// en: 'Search languages...' String get searchLanguages => 'Search languages...'; + + /// en: 'Skip Intro' + String get skipIntro => 'Skip Intro'; + + /// en: 'Skip Credits' + String get skipCredits => 'Skip Credits'; + + /// en: 'Next Episode' + String get nextEpisode => 'Next Episode'; + + /// en: 'Track ${n}' + String subtitleTrack({required Object n}) => 'Track ${n}'; + + /// en: 'Subtitle ${name}' + String subtitleFile({required Object name}) => 'Subtitle ${name}'; + + /// en: '${label} (Forced)' + String forcedTrack({required Object label}) => '${label} (Forced)'; + + /// en: 'Subtitles: Off' + String get osdSubtitlesOff => 'Subtitles: Off'; + + /// en: 'Subtitles: ${track}' + String osdSubtitles({required Object track}) => 'Subtitles: ${track}'; + + /// en: 'Audio: ${track}' + String osdAudio({required Object track}) => 'Audio: ${track}'; } // Path: messages @@ -2160,6 +2223,24 @@ class Translations$messages$en { /// en: 'Subtitles are burned into this stream. Change them from the subtitle menu.' String get burnedSubtitlesUseMenu => 'Subtitles are burned into this stream. Change them from the subtitle menu.'; + + /// en: 'No video URL available' + String get noVideoUrl => 'No video URL available'; + + /// en: 'The server returned no playable media sources' + String get playbackNoMediaSources => 'The server returned no playable media sources'; + + /// en: 'Playback was started before its data was ready' + String get playbackDataNotPrepared => 'Playback was started before its data was ready'; + + /// en: 'Stream selection is not available for this source' + String get streamSelectionUnavailable => 'Stream selection is not available for this source'; + + /// en: 'Could not apply the selected streams' + String get streamSelectionFailed => 'Could not apply the selected streams'; + + /// en: 'No server is available for the active profile' + String get serverUnavailableForProfile => 'No server is available for the active profile'; } // Path: subtitlingStyling @@ -2496,6 +2577,9 @@ class Translations$profiles$en { /// en: 'PINs don't match' String get pinsDontMatch => 'PINs don\'t match'; + + /// en: 'The Plex profile token resolved to an unexpected server' + String get tokenIdentityMismatch => 'The Plex profile token resolved to an unexpected server'; } // Path: connections @@ -2613,6 +2697,12 @@ class Translations$discover$en { /// en: 'More Like This' String get moreLikeThis => 'More Like This'; + + /// en: '(one) {${n} title} (other) {${n} titles}' + String titleCount({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('en'))(n, + one: '${n} title', + other: '${n} titles', + ); } // Path: errors @@ -3333,6 +3423,21 @@ class Translations$liveTv$en { /// en: 'Record show' String get recordShow => 'Record show'; + + /// en: 'Starting in ${minutes} min' + String startingInMinutes({required Object minutes}) => 'Starting in ${minutes} min'; + + /// en: '${day} at ${time}' + String dayAtTime({required Object day, required Object time}) => '${day} at ${time}'; + + /// en: '${product} returned invalid Live TV playback data' + String invalidPlaybackData({required Object product}) => '${product} returned invalid Live TV playback data'; + + /// en: 'Could not start the live channel' + String get failedToStartChannel => 'Could not start the live channel'; + + /// en: 'Could not build the stream URL' + String get failedToBuildStreamUrl => 'Could not build the stream URL'; } // Path: collections @@ -3567,6 +3672,12 @@ class Translations$music$en { /// en: 'Repeat one' String get repeatOne => 'Repeat one'; + + /// en: 'No server is available for an instant mix' + String get instantMixNoServer => 'No server is available for an instant mix'; + + /// en: 'No audio URL is available for ${track}' + String noAudioUrl({required Object track}) => 'No audio URL is available for ${track}'; } // Path: watchTogether @@ -3771,6 +3882,9 @@ class Translations$watchTogether$en { /// en: 'Couldn't switch — content not found on this server' String get guestSwitchFailed => 'Couldn\'t switch — content not found on this server'; + + /// en: 'User' + String get defaultDisplayName => 'User'; } // Path: downloads @@ -4004,6 +4118,36 @@ class Translations$downloads$en { String get syncRuleListCreated => 'Sync rule created'; late final Translations$downloads$backgroundWarning$en backgroundWarning = Translations$downloads$backgroundWarning$en.internal(_root); + + /// en: 'Unknown Show' + String get unknownShow => 'Unknown Show'; + + /// en: 'Unknown Season' + String get unknownSeason => 'Unknown Season'; + + /// en: 'Unknown Album' + String get unknownAlbum => 'Unknown Album'; + + /// en: '${completed}/${total} completed' + String completedOfTotal({required Object completed, required Object total}) => '${completed}/${total} completed'; + + /// en: 'File not found (404)' + String get errorFileNotFound => 'File not found (404)'; + + /// en: 'Download failed' + String get errorDownloadFailed => 'Download failed'; + + /// en: 'Post-processing failed: ${error}' + String errorPostProcessing({required Object error}) => 'Post-processing failed: ${error}'; + + /// en: 'Downloading...' + String get notificationDownloading => 'Downloading...'; + + /// en: 'Download complete' + String get notificationComplete => 'Download complete'; + + /// en: 'Download paused' + String get notificationPaused => 'Download paused'; } // Path: shaders @@ -4081,6 +4225,9 @@ class Translations$companionRemote$en { late final Translations$companionRemote$pairing$en pairing = Translations$companionRemote$pairing$en.internal(_root); late final Translations$companionRemote$remote$en remote = Translations$companionRemote$remote$en.internal(_root); late final Translations$companionRemote$errors$en errors = Translations$companionRemote$errors$en.internal(_root); + + /// en: 'The connection closed before authentication' + String get closedBeforeAuth => 'The connection closed before authentication'; } // Path: videoSettings @@ -4276,6 +4423,36 @@ class Translations$performanceOverlay$en { /// en: 'UI FPS' String get uiFps => 'UI FPS'; + + /// en: 'FPS' + String get fps => 'FPS'; + + /// en: 'Android HW' + String get decoderAndroidHw => 'Android HW'; + + /// en: 'NVIDIA HW' + String get decoderNvidiaHw => 'NVIDIA HW'; + + /// en: 'Qualcomm HW' + String get decoderQualcommHw => 'Qualcomm HW'; + + /// en: 'MediaTek HW' + String get decoderMediatekHw => 'MediaTek HW'; + + /// en: 'Exynos HW' + String get decoderExynosHw => 'Exynos HW'; + + /// en: 'Software' + String get decoderSoftware => 'Software'; + + /// en: 'Hardware' + String get decoderHardware => 'Hardware'; + + /// en: 'Active' + String get tunnelingActive => 'Active'; + + /// en: '${converted} (${failures} failed)' + String dvRpuFailed({required Object converted, required Object failures}) => '${converted} (${failures} failed)'; } // Path: externalPlayer @@ -4768,6 +4945,36 @@ class Translations$seerr$en { /// en: 'Processing' String get statusProcessing => 'Processing'; + + /// en: 'Could not reach ${url}: ${error}' + String couldNotReach({required Object url, required Object error}) => 'Could not reach ${url}: ${error}'; + + /// en: 'No Seerr instance at ${url} (HTTP ${status})' + String noInstanceAtUrl({required Object url, required Object status}) => 'No Seerr instance at ${url} (HTTP ${status})'; + + /// en: 'This Seerr instance has not completed first-run setup' + String get notInitialized => 'This Seerr instance has not completed first-run setup'; + + /// en: 'No Plex token is available to sign in again' + String get noPlexTokenForReauth => 'No Plex token is available to sign in again'; + + /// en: 'No stored credentials are available to sign in again' + String get noStoredCredentials => 'No stored credentials are available to sign in again'; + + /// en: 'Sign-in was rejected' + String get signInRejected => 'Sign-in was rejected'; + + /// en: 'Seerr did not issue a session cookie' + String get noSessionCookie => 'Seerr did not issue a session cookie'; + + /// en: 'Seerr rejected the new session cookie' + String get freshCookieRejected => 'Seerr rejected the new session cookie'; + + /// en: 'Seerr did not return user information' + String get noUserInformation => 'Seerr did not return user information'; + + /// en: 'The session was rejected after signing in again' + String get sessionRejectedAfterReauth => 'The session was rejected after signing in again'; } // Path: services @@ -4903,6 +5110,60 @@ class Translations$addServer$en { /// en: 'Reuse another profile's connection. PIN-protected profiles require a PIN.' String get borrowFromAnotherProfileSubtitle => 'Reuse another profile\'s connection. PIN-protected profiles require a PIN.'; + + /// en: 'Invalid username or password' + String get invalidCredentials => 'Invalid username or password'; + + /// en: 'The authentication response was not valid JSON' + String get authResponseNotJson => 'The authentication response was not valid JSON'; + + /// en: 'Quick Connect was rejected by the server' + String get quickConnectRejected => 'Quick Connect was rejected by the server'; + + /// en: 'The Quick Connect response was not valid JSON' + String get quickConnectNotJson => 'The Quick Connect response was not valid JSON'; + + /// en: 'The Quick Connect response is missing a code or secret' + String get quickConnectMissingFields => 'The Quick Connect response is missing a code or secret'; + + /// en: 'Quick Connect polling was rejected by the server' + String get quickConnectPollRejected => 'Quick Connect polling was rejected by the server'; + + /// en: 'The server did not respond in time' + String get serverTimedOut => 'The server did not respond in time'; + + /// en: 'The server response was not valid JSON' + String get responseNotJson => 'The server response was not valid JSON'; + + /// en: 'The response is missing an ID or server name — is this a ${product} server?' + String responseMissingIdentity({required Object product}) => 'The response is missing an ID or server name — is this a ${product} server?'; + + /// en: 'Could not reach the server: ${error}' + String probeFailed({required Object error}) => 'Could not reach the server: ${error}'; + + /// en: 'Enter at least one ${product} server URL' + String enterAtLeastOneUrl({required Object product}) => 'Enter at least one ${product} server URL'; + + /// en: 'No reachable ${product} server was found' + String noReachableServer({required Object product}) => 'No reachable ${product} server was found'; + + /// en: 'These URLs point to different ${product} servers' + String urlsPointToDifferentServers({required Object product}) => 'These URLs point to different ${product} servers'; + + /// en: 'This URL does not match the ${product} server' + String urlDoesNotMatchServer({required Object product}) => 'This URL does not match the ${product} server'; + + /// en: 'The server redirected to an unsupported URL' + String get redirectUnsupported => 'The server redirected to an unsupported URL'; + + /// en: 'The server redirected to a different host. Enter the final ${product} URL directly.' + String redirectDifferentHost({required Object product}) => 'The server redirected to a different host. Enter the final ${product} URL directly.'; + + /// en: 'The server redirected from HTTPS to an insecure URL' + String get redirectInsecure => 'The server redirected from HTTPS to an insecure URL'; + + /// en: 'The server redirected to an unsupported URL. Enter the final ${product} URL directly.' + String redirectUnsupportedEnterFinal({required Object product}) => 'The server redirected to an unsupported URL. Enter the final ${product} URL directly.'; } // Path: common.ratingSource @@ -6135,6 +6396,7 @@ extension on Translations { 'auth.quickConnectCancel' => 'Cancel', 'auth.quickConnectExpired' => 'Quick Connect expired. Try again.', 'auth.localDataRecoveryRequired' => 'Plezy could not safely recover local sign-in and pending playback data. Please sign in again.', + 'auth.pinCheckRejected' => 'The Plex PIN check was rejected', 'common.cancel' => 'Cancel', 'common.save' => 'Save', 'common.close' => 'Close', @@ -6191,6 +6453,9 @@ extension on Translations { 'common.ratingSource.trakt' => 'Trakt', 'common.ratingSource.rottenTomatoesCritic' => 'Rotten Tomatoes critics', 'common.ratingSource.rottenTomatoesAudience' => 'Rotten Tomatoes audience', + 'common.notAvailable' => 'N/A', + 'common.url' => 'URL', + 'common.letterKeys' => 'ABC', 'screens.licenses' => 'Licenses', 'screens.switchProfile' => 'Switch Profile', 'screens.subtitleStyling' => 'Subtitle Styling', @@ -6443,6 +6708,7 @@ extension on Translations { 'settings.subtitlesAndConfig' => 'Subtitles & Configuration', 'settings.seekAndTiming' => 'Seek & Timing', 'settings.behavior' => 'Behavior', + 'settings.exportDialogTitle' => 'Export Plezy settings', 'search.hint' => 'Search movies, shows, music...', 'search.tryDifferentTerm' => 'Try a different search term', 'search.searchYourMedia' => 'Search your media', @@ -6591,6 +6857,8 @@ extension on Translations { 'fileInfo.flagHearingImpaired' => 'Hearing impaired', 'fileInfo.flagDub' => 'Dub', 'fileInfo.flagOriginal' => 'Original', + 'fileInfo.channelsMono' => 'Mono', + 'fileInfo.dolbyVisionProfile' => ({required Object profile}) => 'Profile ${profile}', 'mediaMenu.markAsWatched' => 'Mark as Watched', 'mediaMenu.markAsUnwatched' => 'Mark as Unwatched', 'mediaMenu.removeFromContinueWatching' => 'Remove from Continue Watching', @@ -6624,6 +6892,8 @@ extension on Translations { 'mediaMenu.rate' => 'Rate', 'mediaMenu.playFromBeginning' => 'Play from Beginning', 'mediaMenu.playVersion' => 'Play Version...', + _ => null, + } ?? switch (path) { 'rateSheet.title' => 'Rate', 'rateSheet.server' => 'Server', 'rateSheet.favorite' => 'Favorite', @@ -6631,8 +6901,6 @@ extension on Translations { 'rateSheet.saved' => 'Saved', 'rateSheet.notAvailable' => 'No match found', 'rateSheet.noConnectedServices' => 'Connect a service in Settings to rate there.', - _ => null, - } ?? switch (path) { 'accessibility.mediaCardMovie' => ({required Object title}) => '${title}, movie', 'accessibility.mediaCardShow' => ({required Object title}) => '${title}, TV show', 'accessibility.mediaCardEpisode' => ({required Object title, required Object episodeInfo}) => '${title}, ${episodeInfo}', @@ -6655,6 +6923,11 @@ extension on Translations { 'accessibility.alphabetScrollHint' => 'Swipe up or down to move by letter', 'accessibility.rowColumnPosition' => ({required Object row, required Object rowCount, required Object column, required Object columnCount}) => 'Row ${row} of ${rowCount}, column ${column} of ${columnCount}', 'accessibility.rowPosition' => ({required Object row, required Object rowCount}) => 'Row ${row} of ${rowCount}', + 'accessibility.autoScrollPlay' => 'Play auto-scroll', + 'accessibility.autoScrollPause' => 'Pause auto-scroll', + 'accessibility.hueShort' => 'H', + 'accessibility.saturationShort' => 'S', + 'accessibility.valueShort' => 'V', 'tooltips.shufflePlay' => 'Shuffle play', 'tooltips.playTrailer' => 'Play trailer', 'tooltips.markAsWatched' => 'Mark as watched', @@ -6745,6 +7018,15 @@ extension on Translations { 'videoControls.subtitleDownloadedNotApplied' => 'Subtitle downloaded, but it could not be selected', 'videoControls.subtitleDownloadFailed' => 'Failed to download subtitle', 'videoControls.searchLanguages' => 'Search languages...', + 'videoControls.skipIntro' => 'Skip Intro', + 'videoControls.skipCredits' => 'Skip Credits', + 'videoControls.nextEpisode' => 'Next Episode', + 'videoControls.subtitleTrack' => ({required Object n}) => 'Track ${n}', + 'videoControls.subtitleFile' => ({required Object name}) => 'Subtitle ${name}', + 'videoControls.forcedTrack' => ({required Object label}) => '${label} (Forced)', + 'videoControls.osdSubtitlesOff' => 'Subtitles: Off', + 'videoControls.osdSubtitles' => ({required Object track}) => 'Subtitles: ${track}', + 'videoControls.osdAudio' => ({required Object track}) => 'Audio: ${track}', 'messages.markedAsWatched' => 'Marked as watched', 'messages.markedAsUnwatched' => 'Marked as unwatched', 'messages.markedAsWatchedOffline' => 'Marked as watched (will sync when online)', @@ -6800,6 +7082,12 @@ extension on Translations { 'messages.logsUploadFailed' => 'Failed to upload logs', 'messages.logId' => 'Log ID', 'messages.burnedSubtitlesUseMenu' => 'Subtitles are burned into this stream. Change them from the subtitle menu.', + 'messages.noVideoUrl' => 'No video URL available', + 'messages.playbackNoMediaSources' => 'The server returned no playable media sources', + 'messages.playbackDataNotPrepared' => 'Playback was started before its data was ready', + 'messages.streamSelectionUnavailable' => 'Stream selection is not available for this source', + 'messages.streamSelectionFailed' => 'Could not apply the selected streams', + 'messages.serverUnavailableForProfile' => 'No server is available for the active profile', 'subtitlingStyling.text' => 'Text', 'subtitlingStyling.border' => 'Border', 'subtitlingStyling.background' => 'Background', @@ -6900,6 +7188,7 @@ extension on Translations { 'profiles.pinExplain' => '4-digit PIN required to switch profiles.', 'profiles.continueButton' => 'Continue', 'profiles.pinsDontMatch' => 'PINs don\'t match', + 'profiles.tokenIdentityMismatch' => 'The Plex profile token resolved to an unexpected server', 'connections.sectionTitle' => 'Connections', 'connections.addConnection' => 'Add connection', 'connections.addConnectionSubtitleNoProfile' => 'Sign in with Plex or connect a Jellyfin or Emby server', @@ -6933,6 +7222,7 @@ extension on Translations { 'discover.tvShow' => 'TV Show', 'discover.minutesLeft' => ({required Object minutes}) => '${minutes} min left', 'discover.moreLikeThis' => 'More Like This', + 'discover.titleCount' => ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('en'))(n, one: '${n} title', other: '${n} titles', ), 'errors.searchFailed' => ({required Object error}) => 'Search failed: ${error}', 'errors.searchUnavailable' => 'Search could not reach any media server.', 'errors.connectionTimeout' => ({required Object context}) => 'Connection timeout while loading ${context}', @@ -7116,6 +7406,8 @@ extension on Translations { 'explore.emptyMessage' => ({required Object source}) => 'Rows from ${source} will appear here once they have content.', 'explore.searchHint' => ({required Object source}) => 'Search ${source}', 'explore.searchEmpty' => ({required Object query}) => 'No results for "${query}"', + _ => null, + } ?? switch (path) { 'explore.searchPrompt' => ({required Object source}) => 'Search for movies and shows on ${source}.', 'explore.searchFailed' => 'Search failed. Check your connection and try again.', 'explore.badge.rankPopular' => ({required Object n}) => '#${n} popular', @@ -7145,8 +7437,6 @@ extension on Translations { 'explore.stats.viewersWeek' => ({required Object n}) => '${n} watched this week', 'explore.stats.viewersMonth' => ({required Object n}) => '${n} watched this month', 'explore.stats.viewersYear' => ({required Object n}) => '${n} watched this year', - _ => null, - } ?? switch (path) { 'explore.stats.viewersAllTime' => ({required Object n}) => '${n} viewers', 'explore.stats.planning' => ({required Object n}) => '${n} planning to watch', 'explore.stats.favorited' => ({required Object n}) => '${n} favorites', @@ -7295,6 +7585,11 @@ extension on Translations { 'liveTv.guideReloadRequested' => 'Guide refresh requested', 'liveTv.rulesProcessRequested' => 'Rule re-evaluation requested', 'liveTv.recordShow' => 'Record show', + 'liveTv.startingInMinutes' => ({required Object minutes}) => 'Starting in ${minutes} min', + 'liveTv.dayAtTime' => ({required Object day, required Object time}) => '${day} at ${time}', + 'liveTv.invalidPlaybackData' => ({required Object product}) => '${product} returned invalid Live TV playback data', + 'liveTv.failedToStartChannel' => 'Could not start the live channel', + 'liveTv.failedToBuildStreamUrl' => 'Could not build the stream URL', 'collections.title' => 'Collections', 'collections.collection' => 'Collection', 'collections.empty' => 'Collection is empty', @@ -7363,6 +7658,8 @@ extension on Translations { 'music.repeat' => 'Repeat', 'music.repeatAll' => 'Repeat all', 'music.repeatOne' => 'Repeat one', + 'music.instantMixNoServer' => 'No server is available for an instant mix', + 'music.noAudioUrl' => ({required Object track}) => 'No audio URL is available for ${track}', 'watchTogether.title' => 'Watch Together', 'watchTogether.description' => 'Watch content in sync with friends and family', 'watchTogether.createSession' => 'Create Session', @@ -7428,6 +7725,7 @@ extension on Translations { 'watchTogether.removeRoom' => 'Remove', 'watchTogether.guestSwitchUnavailable' => 'Couldn\'t switch — server unavailable for sync', 'watchTogether.guestSwitchFailed' => 'Couldn\'t switch — content not found on this server', + 'watchTogether.defaultDisplayName' => 'User', 'downloads.title' => 'Downloads', 'downloads.manage' => 'Manage', 'downloads.tvShows' => 'TV Shows', @@ -7528,6 +7826,16 @@ extension on Translations { 'downloads.backgroundWarning.statusUnknown' => 'Not checked yet', 'downloads.backgroundWarning.settingsUnavailable' => 'Couldn\'t open system settings on this device', 'downloads.backgroundWarning.linkUnavailable' => 'Couldn\'t open dontkillmyapp.com on this device', + 'downloads.unknownShow' => 'Unknown Show', + 'downloads.unknownSeason' => 'Unknown Season', + 'downloads.unknownAlbum' => 'Unknown Album', + 'downloads.completedOfTotal' => ({required Object completed, required Object total}) => '${completed}/${total} completed', + 'downloads.errorFileNotFound' => 'File not found (404)', + 'downloads.errorDownloadFailed' => 'Download failed', + 'downloads.errorPostProcessing' => ({required Object error}) => 'Post-processing failed: ${error}', + 'downloads.notificationDownloading' => 'Downloading...', + 'downloads.notificationComplete' => 'Download complete', + 'downloads.notificationPaused' => 'Download paused', 'shaders.title' => 'Shaders', 'shaders.noShaderDescription' => 'No video enhancement', 'shaders.nvscalerDescription' => 'NVIDIA image scaling for sharper video', @@ -7607,10 +7915,13 @@ extension on Translations { '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', + 'companionRemote.closedBeforeAuth' => 'The connection closed before authentication', 'videoSettings.playbackSpeed' => 'Playback Speed', 'videoSettings.normalSpeed' => 'Normal', 'videoSettings.sleepTimerActive' => ({required Object duration}) => 'Active (${duration})', 'videoSettings.zoom' => 'Zoom', + _ => null, + } ?? switch (path) { 'videoSettings.sleepTimer' => 'Sleep Timer', 'videoSettings.audioSync' => 'Audio Sync', 'videoSettings.subtitleSync' => 'Subtitle Sync', @@ -7659,8 +7970,6 @@ extension on Translations { 'performanceOverlay.maxLuma' => 'Max Luma', 'performanceOverlay.minLuma' => 'Min Luma', 'performanceOverlay.maxCll' => 'MaxCLL', - _ => null, - } ?? switch (path) { 'performanceOverlay.maxFall' => 'MaxFALL', 'performanceOverlay.cacheUsed' => 'Cache Used', 'performanceOverlay.cacheLimit' => 'Cache Limit', @@ -7668,6 +7977,16 @@ extension on Translations { 'performanceOverlay.player' => 'Player', 'performanceOverlay.memory' => 'Memory', 'performanceOverlay.uiFps' => 'UI FPS', + 'performanceOverlay.fps' => 'FPS', + 'performanceOverlay.decoderAndroidHw' => 'Android HW', + 'performanceOverlay.decoderNvidiaHw' => 'NVIDIA HW', + 'performanceOverlay.decoderQualcommHw' => 'Qualcomm HW', + 'performanceOverlay.decoderMediatekHw' => 'MediaTek HW', + 'performanceOverlay.decoderExynosHw' => 'Exynos HW', + 'performanceOverlay.decoderSoftware' => 'Software', + 'performanceOverlay.decoderHardware' => 'Hardware', + 'performanceOverlay.tunnelingActive' => 'Active', + 'performanceOverlay.dvRpuFailed' => ({required Object converted, required Object failures}) => '${converted} (${failures} failed)', 'externalPlayer.title' => 'External Player', 'externalPlayer.useExternalPlayer' => 'Use External Player', 'externalPlayer.useExternalPlayerDescription' => 'Open videos in another app', @@ -7814,6 +8133,16 @@ extension on Translations { 'seerr.statusPartiallyAvailable' => 'Partially available', 'seerr.statusRequested' => 'Requested', 'seerr.statusProcessing' => 'Processing', + 'seerr.couldNotReach' => ({required Object url, required Object error}) => 'Could not reach ${url}: ${error}', + 'seerr.noInstanceAtUrl' => ({required Object url, required Object status}) => 'No Seerr instance at ${url} (HTTP ${status})', + 'seerr.notInitialized' => 'This Seerr instance has not completed first-run setup', + 'seerr.noPlexTokenForReauth' => 'No Plex token is available to sign in again', + 'seerr.noStoredCredentials' => 'No stored credentials are available to sign in again', + 'seerr.signInRejected' => 'Sign-in was rejected', + 'seerr.noSessionCookie' => 'Seerr did not issue a session cookie', + 'seerr.freshCookieRejected' => 'Seerr rejected the new session cookie', + 'seerr.noUserInformation' => 'Seerr did not return user information', + 'seerr.sessionRejectedAfterReauth' => 'The session was rejected after signing in again', 'services.title' => 'Services', 'services.hubSubtitle' => 'Sync watch progress and request new titles.', 'services.notConnected' => 'Not connected', @@ -7879,6 +8208,24 @@ extension on Translations { 'addServer.connectToMediaBrowserCardSubtitleScoped' => ({required Object product, required Object name}) => 'Sign in to your ${product} server. Binds to ${name}.', 'addServer.borrowFromAnotherProfile' => 'Borrow from another profile', 'addServer.borrowFromAnotherProfileSubtitle' => 'Reuse another profile\'s connection. PIN-protected profiles require a PIN.', + 'addServer.invalidCredentials' => 'Invalid username or password', + 'addServer.authResponseNotJson' => 'The authentication response was not valid JSON', + 'addServer.quickConnectRejected' => 'Quick Connect was rejected by the server', + 'addServer.quickConnectNotJson' => 'The Quick Connect response was not valid JSON', + 'addServer.quickConnectMissingFields' => 'The Quick Connect response is missing a code or secret', + 'addServer.quickConnectPollRejected' => 'Quick Connect polling was rejected by the server', + 'addServer.serverTimedOut' => 'The server did not respond in time', + 'addServer.responseNotJson' => 'The server response was not valid JSON', + 'addServer.responseMissingIdentity' => ({required Object product}) => 'The response is missing an ID or server name — is this a ${product} server?', + 'addServer.probeFailed' => ({required Object error}) => 'Could not reach the server: ${error}', + 'addServer.enterAtLeastOneUrl' => ({required Object product}) => 'Enter at least one ${product} server URL', + 'addServer.noReachableServer' => ({required Object product}) => 'No reachable ${product} server was found', + 'addServer.urlsPointToDifferentServers' => ({required Object product}) => 'These URLs point to different ${product} servers', + 'addServer.urlDoesNotMatchServer' => ({required Object product}) => 'This URL does not match the ${product} server', + 'addServer.redirectUnsupported' => 'The server redirected to an unsupported URL', + 'addServer.redirectDifferentHost' => ({required Object product}) => 'The server redirected to a different host. Enter the final ${product} URL directly.', + 'addServer.redirectInsecure' => 'The server redirected from HTTPS to an insecure URL', + 'addServer.redirectUnsupportedEnterFinal' => ({required Object product}) => 'The server redirected to an unsupported URL. Enter the final ${product} URL directly.', _ => null, }; } diff --git a/lib/i18n/strings_es.g.dart b/lib/i18n/strings_es.g.dart index 7412063b..f7142f59 100644 --- a/lib/i18n/strings_es.g.dart +++ b/lib/i18n/strings_es.g.dart @@ -123,6 +123,7 @@ class _Translations$auth$es extends Translations$auth$en { @override String get quickConnectCancel => 'Cancelar'; @override String get quickConnectExpired => 'Quick Connect caducó. Inténtalo de nuevo.'; @override String get localDataRecoveryRequired => 'Plezy no pudo recuperar de forma segura los datos locales de inicio de sesión ni la reproducción pendiente. Vuelve a iniciar sesión.'; + @override String get pinCheckRejected => 'La comprobación del PIN de Plex fue rechazada'; } // Path: common @@ -178,6 +179,9 @@ class _Translations$common$es extends Translations$common$en { @override String get exitFullscreen => 'Salir de pantalla completa'; @override String get pressBackAgainToExit => 'Pulsa Atrás de nuevo para salir'; @override late final _Translations$common$ratingSource$es ratingSource = _Translations$common$ratingSource$es._(_root); + @override String get notAvailable => 'N/D'; + @override String get url => 'URL'; + @override String get letterKeys => 'ABC'; } // Path: screens @@ -444,6 +448,8 @@ class _Translations$settings$es extends Translations$settings$en { @override String get showNavBarLabels => 'Mostrar etiquetas de la barra de navegación'; @override String get showNavBarLabelsDescription => 'Mostrar etiquetas de texto bajo los iconos de la barra de navegación'; @override String get startupSection => 'Sección de inicio'; + @override String get showExploreTab => 'Mostrar pestaña Explorar'; + @override String get showExploreTabDescription => 'Muestra la pestaña Explorar con contenido de Plex Discover y servicios de seguimiento conectados'; @override String get liveTvDefaultFavorites => 'Canales favoritos por defecto'; @override String get liveTvDefaultFavoritesDescription => 'Mostrar solo canales favoritos al abrir TV en vivo'; @override String get display => 'Pantalla'; @@ -455,6 +461,7 @@ class _Translations$settings$es extends Translations$settings$en { @override String get subtitlesAndConfig => 'Subtítulos y configuración'; @override String get seekAndTiming => 'Desplazamiento y tiempos'; @override String get behavior => 'Comportamiento'; + @override String get exportDialogTitle => 'Exportar ajustes de Plezy'; } // Path: search @@ -606,6 +613,8 @@ class _Translations$fileInfo$es extends Translations$fileInfo$en { @override String get flagHearingImpaired => 'Para personas con discapacidad auditiva'; @override String get flagDub => 'Doblaje'; @override String get flagOriginal => 'Original'; + @override String get channelsMono => 'Mono'; + @override String dolbyVisionProfile({required Object profile}) => 'Perfil ${profile}'; } // Path: mediaMenu @@ -704,6 +713,11 @@ class _Translations$accessibility$es extends Translations$accessibility$en { @override String get alphabetScrollHint => 'Desliza hacia arriba o abajo para avanzar por letra'; @override String rowColumnPosition({required Object row, required Object rowCount, required Object column, required Object columnCount}) => 'Fila ${row} de ${rowCount}, columna ${column} de ${columnCount}'; @override String rowPosition({required Object row, required Object rowCount}) => 'Fila ${row} de ${rowCount}'; + @override String get autoScrollPlay => 'Iniciar desplazamiento automático'; + @override String get autoScrollPause => 'Pausar desplazamiento automático'; + @override String get hueShort => 'H'; + @override String get saturationShort => 'S'; + @override String get valueShort => 'V'; } // Path: tooltips @@ -815,6 +829,15 @@ class _Translations$videoControls$es extends Translations$videoControls$en { @override String get subtitleDownloadedNotApplied => 'El subtítulo se descargó, pero no se pudo seleccionar'; @override String get subtitleDownloadFailed => 'Error al descargar subtítulo'; @override String get searchLanguages => 'Buscar idiomas...'; + @override String get skipIntro => 'Saltar intro'; + @override String get skipCredits => 'Saltar créditos'; + @override String get nextEpisode => 'Episodio siguiente'; + @override String subtitleTrack({required Object n}) => 'Pista ${n}'; + @override String subtitleFile({required Object name}) => 'Subtítulo ${name}'; + @override String forcedTrack({required Object label}) => '${label} (Forzada)'; + @override String get osdSubtitlesOff => 'Subtítulos: desactivados'; + @override String osdSubtitles({required Object track}) => 'Subtítulos: ${track}'; + @override String osdAudio({required Object track}) => 'Audio: ${track}'; } // Path: messages @@ -876,9 +899,18 @@ class _Translations$messages$es extends Translations$messages$en { @override String get serverLimitBody => 'Error del servidor (HTTP 500). Un límite de ancho de banda/transcodificación probablemente rechazó esta sesión. Pide al propietario que lo ajuste.'; @override String get mediaUnreadableTitle => 'Archivo no disponible'; @override String get mediaUnreadableBody => 'El servidor encontró este elemento pero no pudo leer su archivo (HTTP 404). Es probable que el archivo se haya movido o eliminado, o que su almacenamiento esté sin conexión. Pide al propietario del servidor que revise el archivo y vuelva a escanear la biblioteca.'; + @override String get serverBusyTitle => 'Reproducción no disponible'; + @override String get serverBusyBody => 'El servidor siguió rechazando la reproducción de este archivo (HTTP 503). Puede que se esté reiniciando, esté ocupado o que el almacenamiento del archivo no esté disponible. Inténtalo de nuevo dentro de un momento; si sigue ocurriendo, pide al propietario del servidor que revise el servidor y el almacenamiento del archivo.'; @override String get logsUploaded => 'Registros subidos'; @override String get logsUploadFailed => 'Error al subir registros'; @override String get logId => 'ID de registro'; + @override String get burnedSubtitlesUseMenu => 'Los subtítulos están incrustados en esta transmisión. Cámbialos desde el menú de subtítulos.'; + @override String get noVideoUrl => 'No hay ninguna URL de vídeo disponible'; + @override String get playbackNoMediaSources => 'El servidor no devolvió ninguna fuente multimedia reproducible'; + @override String get playbackDataNotPrepared => 'La reproducción se inició antes de que sus datos estuvieran listos'; + @override String get streamSelectionUnavailable => 'La selección de flujos no está disponible para esta fuente'; + @override String get streamSelectionFailed => 'No se pudieron aplicar los flujos seleccionados'; + @override String get serverUnavailableForProfile => 'No hay ningún servidor disponible para el perfil activo'; } // Path: subtitlingStyling @@ -904,6 +936,8 @@ class _Translations$subtitlingStyling$es extends Translations$subtitlingStyling$ @override String get overrideStrip => 'Quitar estilos'; @override String get positionTop => 'Arriba'; @override String get positionBottom => 'Abajo'; + @override String get anchorToScreen => 'Anclar a la pantalla'; + @override String get anchorToScreenDescription => 'Muestra los subtítulos de texto en las barras negras situadas debajo del vídeo panorámico'; @override String get bold => 'Negrita'; @override String get italic => 'Cursiva'; @override String get renderResolution => 'Resolución de renderizado'; @@ -1013,6 +1047,7 @@ class _Translations$profiles$es extends Translations$profiles$en { @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 tokenIdentityMismatch => 'El token del perfil de Plex correspondía a un servidor inesperado'; } // Path: connections @@ -1064,6 +1099,10 @@ class _Translations$discover$es extends Translations$discover$en { @override String get tvShow => 'Serie de TV'; @override String minutesLeft({required Object minutes}) => 'quedan ${minutes} min'; @override String get moreLikeThis => 'Más contenido similar'; + @override String titleCount({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('es'))(n, + one: '${n} título', + other: '${n} títulos', + ); } // Path: errors @@ -1276,7 +1315,10 @@ class _Translations$explore$es extends Translations$explore$en { @override String get characters => 'Personajes'; @override String get addToWatchlist => 'Añadir a la lista de seguimiento'; @override String get removeFromWatchlist => 'Quitar de la lista de seguimiento'; + @override String get addedToWatchlist => 'Añadido a la lista de seguimiento'; + @override String get removedFromWatchlist => 'Eliminado de la lista de seguimiento'; @override String get watchlistUpdateFailed => 'No se pudo actualizar la lista de seguimiento'; + @override String get watchlistNoMatch => 'No se pudo asociar este elemento con una lista de seguimiento'; @override String get notInLibrary => 'No está en tu biblioteca'; @override String get inTheseLibraries => 'En estas bibliotecas'; @override String get checkingLibrary => 'Comprobando tu biblioteca...'; @@ -1337,6 +1379,9 @@ class _Translations$liveTv$es extends Translations$liveTv$en { @override String get watchChannel => 'Ver canal'; @override String get favorites => 'Favoritos'; @override String get reorderFavorites => 'Reordenar favoritos'; + @override String get noFavoriteChannels => 'No hay canales favoritos'; + @override String get noFavoriteChannelsHint => 'Muestra todos los canales y mantén pulsado uno para añadirlo a tus favoritos.'; + @override String get showAllChannels => 'Mostrar todos los canales'; @override String get favoritesLoadFailed => 'No se pudieron cargar los favoritos. Comprueba tu conexión e inténtalo de nuevo.'; @override String get favoritesUpdateFailed => 'No se pudieron actualizar los favoritos. Comprueba tu conexión e inténtalo de nuevo.'; @override String get joinSession => 'Unirse a sesión en curso'; @@ -1376,6 +1421,11 @@ class _Translations$liveTv$es extends Translations$liveTv$en { @override String get guideReloadRequested => 'Solicitada actualización de la guía'; @override String get rulesProcessRequested => 'Solicitada reevaluación de reglas'; @override String get recordShow => 'Grabar programa'; + @override String startingInMinutes({required Object minutes}) => 'Empieza en ${minutes} min'; + @override String dayAtTime({required Object day, required Object time}) => '${day} a las ${time}'; + @override String invalidPlaybackData({required Object product}) => '${product} devolvió datos de reproducción de TV en vivo no válidos'; + @override String get failedToStartChannel => 'No se pudo iniciar el canal en vivo'; + @override String get failedToBuildStreamUrl => 'No se pudo generar la URL de transmisión'; } // Path: collections @@ -1474,6 +1524,8 @@ class _Translations$music$es extends Translations$music$en { @override String get repeat => 'Repetir'; @override String get repeatAll => 'Repetir todo'; @override String get repeatOne => 'Repetir una'; + @override String get instantMixNoServer => 'No hay ningún servidor disponible para una mezcla instantánea'; + @override String noAudioUrl({required Object track}) => 'No hay ninguna URL de audio disponible para ${track}'; } // Path: watchTogether @@ -1548,6 +1600,7 @@ class _Translations$watchTogether$es extends Translations$watchTogether$en { @override String get removeRoom => 'Eliminar'; @override String get guestSwitchUnavailable => 'No se pudo cambiar — servidor no disponible para sincronización'; @override String get guestSwitchFailed => 'No se pudo cambiar — contenido no encontrado en este servidor'; + @override String get defaultDisplayName => 'Usuario'; } // Path: downloads @@ -1632,6 +1685,16 @@ class _Translations$downloads$es extends Translations$downloads$en { @override String get syncRuleUnknownServer => 'Servidor desconocido'; @override String get syncRuleListCreated => 'Regla de sincronización creada'; @override late final _Translations$downloads$backgroundWarning$es backgroundWarning = _Translations$downloads$backgroundWarning$es._(_root); + @override String get unknownShow => 'Serie desconocida'; + @override String get unknownSeason => 'Temporada desconocida'; + @override String get unknownAlbum => 'Álbum desconocido'; + @override String completedOfTotal({required Object completed, required Object total}) => '${completed}/${total} completadas'; + @override String get errorFileNotFound => 'Archivo no encontrado (404)'; + @override String get errorDownloadFailed => 'Error en la descarga'; + @override String errorPostProcessing({required Object error}) => 'Error en el posprocesamiento: ${error}'; + @override String get notificationDownloading => 'Descargando...'; + @override String get notificationComplete => 'Descarga completada'; + @override String get notificationPaused => 'Descarga pausada'; } // Path: shaders @@ -1672,6 +1735,7 @@ class _Translations$companionRemote$es extends Translations$companionRemote$en { @override late final _Translations$companionRemote$pairing$es pairing = _Translations$companionRemote$pairing$es._(_root); @override late final _Translations$companionRemote$remote$es remote = _Translations$companionRemote$remote$es._(_root); @override late final _Translations$companionRemote$errors$es errors = _Translations$companionRemote$errors$es._(_root); + @override String get closedBeforeAuth => 'La conexión se cerró antes de la autenticación'; } // Path: videoSettings @@ -1689,6 +1753,13 @@ class _Translations$videoSettings$es extends Translations$videoSettings$en { @override String get audioSync => 'Sincronización de audio'; @override String get subtitleSync => 'Sincronización de subtítulos'; @override String get hdr => 'HDR'; + @override String get hdrUnsupported => 'HDR no está disponible aquí: este compositor de escritorio o esta salida de vídeo no pueden transmitirlo.'; + @override String get hdrToneMapping => 'Mapeo de tonos HDR'; + @override String get hdrToneMappingCompositor => 'Compositor'; + @override String get hdrToneMappingCompositorDescription => 'Transmite los metadatos HDR de la fuente y deja que el compositor de escritorio haga el mapeo.'; + @override String get hdrToneMappingPlayer => 'Reproductor'; + @override String get hdrToneMappingPlayerDescription => 'Realiza en el reproductor el mapeo al brillo máximo de la pantalla y luego comunica el resultado al compositor.'; + @override String get hdrToneMappingFailed => 'No se pudo cambiar el mapeo de tonos HDR; el modo anterior sigue activo.'; @override String get audioOutput => 'Salida de audio'; @override String get performanceOverlay => 'Indicador de rendimiento'; @override String get audioOutputDolbyAtmos => 'Dolby Atmos'; @@ -1742,6 +1813,16 @@ class _Translations$performanceOverlay$es extends Translations$performanceOverla @override String get player => 'Reproductor'; @override String get memory => 'Memoria'; @override String get uiFps => 'FPS UI'; + @override String get fps => 'FPS'; + @override String get decoderAndroidHw => 'HW de Android'; + @override String get decoderNvidiaHw => 'HW de NVIDIA'; + @override String get decoderQualcommHw => 'HW de Qualcomm'; + @override String get decoderMediatekHw => 'HW de MediaTek'; + @override String get decoderExynosHw => 'HW de Exynos'; + @override String get decoderSoftware => 'Software'; + @override String get decoderHardware => 'Hardware'; + @override String get tunnelingActive => 'Activo'; + @override String dvRpuFailed({required Object converted, required Object failures}) => '${converted} (${failures} con error)'; } // Path: externalPlayer @@ -1942,6 +2023,16 @@ class _Translations$seerr$es extends Translations$seerr$en { @override String get statusPartiallyAvailable => 'Parcialmente disponible'; @override String get statusRequested => 'Solicitado'; @override String get statusProcessing => 'Procesando'; + @override String couldNotReach({required Object url, required Object error}) => 'No se pudo conectar con ${url}: ${error}'; + @override String noInstanceAtUrl({required Object url, required Object status}) => 'No hay ninguna instancia de Seerr en ${url} (HTTP ${status})'; + @override String get notInitialized => 'Esta instancia de Seerr no ha completado la configuración inicial'; + @override String get noPlexTokenForReauth => 'No hay ningún token de Plex disponible para volver a iniciar sesión'; + @override String get noStoredCredentials => 'No hay credenciales guardadas disponibles para volver a iniciar sesión'; + @override String get signInRejected => 'Se rechazó el inicio de sesión'; + @override String get noSessionCookie => 'Seerr no proporcionó una cookie de sesión'; + @override String get freshCookieRejected => 'Seerr rechazó la nueva cookie de sesión'; + @override String get noUserInformation => 'Seerr no devolvió información del usuario'; + @override String get sessionRejectedAfterReauth => 'La sesión fue rechazada después de volver a iniciar sesión'; } // Path: services @@ -2002,6 +2093,24 @@ class _Translations$addServer$es extends Translations$addServer$en { @override String connectToMediaBrowserCardSubtitleScoped({required Object product, required Object name}) => 'Inicia sesión en tu servidor ${product}. Se vincula a ${name}.'; @override String get borrowFromAnotherProfile => 'Tomar prestado de otro perfil'; @override String get borrowFromAnotherProfileSubtitle => 'Reutiliza la conexión de otro perfil. Los perfiles protegidos con PIN requieren un PIN.'; + @override String get invalidCredentials => 'Usuario o contraseña no válidos'; + @override String get authResponseNotJson => 'La respuesta de autenticación no era un JSON válido'; + @override String get quickConnectRejected => 'Quick Connect fue rechazado por el servidor'; + @override String get quickConnectNotJson => 'La respuesta de Quick Connect no era un JSON válido'; + @override String get quickConnectMissingFields => 'La respuesta de Quick Connect no incluye el código o el secreto'; + @override String get quickConnectPollRejected => 'El servidor rechazó el sondeo de Quick Connect'; + @override String get serverTimedOut => 'El servidor no respondió a tiempo'; + @override String get responseNotJson => 'La respuesta del servidor no era un JSON válido'; + @override String responseMissingIdentity({required Object product}) => 'A la respuesta le falta un ID o el nombre del servidor. ¿Es este un servidor ${product}?'; + @override String probeFailed({required Object error}) => 'No se pudo conectar con el servidor: ${error}'; + @override String enterAtLeastOneUrl({required Object product}) => 'Introduce al menos una URL de servidor ${product}'; + @override String noReachableServer({required Object product}) => 'No se encontró ningún servidor ${product} accesible'; + @override String urlsPointToDifferentServers({required Object product}) => 'Estas URL apuntan a servidores ${product} distintos'; + @override String urlDoesNotMatchServer({required Object product}) => 'Esta URL no corresponde al servidor ${product}'; + @override String get redirectUnsupported => 'El servidor redirigió a una URL no compatible'; + @override String redirectDifferentHost({required Object product}) => 'El servidor redirigió a un host diferente. Introduce directamente la URL final de ${product}.'; + @override String get redirectInsecure => 'El servidor redirigió de HTTPS a una URL no segura'; + @override String redirectUnsupportedEnterFinal({required Object product}) => 'El servidor redirigió a una URL no compatible. Introduce directamente la URL final de ${product}.'; } // Path: common.ratingSource @@ -2521,6 +2630,7 @@ class _Translations$services$deviceCode$es extends Translations$services$deviceC // Translations @override String title({required Object service}) => 'Activar Plezy en ${service}'; + @override String get instructions => 'Escanea el código QR o visita la dirección que aparece a continuación e introduce este código:'; @override String openToActivate({required Object service}) => 'Abrir ${service} para activar'; @override String get copyCode => 'Copiar código de activación'; @override String get waitingForAuthorization => 'Esperando autorización…'; @@ -2595,6 +2705,7 @@ extension on TranslationsEs { 'auth.quickConnectCancel' => 'Cancelar', 'auth.quickConnectExpired' => 'Quick Connect caducó. Inténtalo de nuevo.', 'auth.localDataRecoveryRequired' => 'Plezy no pudo recuperar de forma segura los datos locales de inicio de sesión ni la reproducción pendiente. Vuelve a iniciar sesión.', + 'auth.pinCheckRejected' => 'La comprobación del PIN de Plex fue rechazada', 'common.cancel' => 'Cancelar', 'common.save' => 'Guardar', 'common.close' => 'Cerrar', @@ -2651,6 +2762,9 @@ extension on TranslationsEs { 'common.ratingSource.trakt' => 'Trakt', 'common.ratingSource.rottenTomatoesCritic' => 'Críticos de Rotten Tomatoes', 'common.ratingSource.rottenTomatoesAudience' => 'Público de Rotten Tomatoes', + 'common.notAvailable' => 'N/D', + 'common.url' => 'URL', + 'common.letterKeys' => 'ABC', 'screens.licenses' => 'Licencias', 'screens.switchProfile' => 'Cambiar perfil', 'screens.subtitleStyling' => 'Estilo de subtítulos', @@ -2890,6 +3004,8 @@ extension on TranslationsEs { 'settings.showNavBarLabels' => 'Mostrar etiquetas de la barra de navegación', 'settings.showNavBarLabelsDescription' => 'Mostrar etiquetas de texto bajo los iconos de la barra de navegación', 'settings.startupSection' => 'Sección de inicio', + 'settings.showExploreTab' => 'Mostrar pestaña Explorar', + 'settings.showExploreTabDescription' => 'Muestra la pestaña Explorar con contenido de Plex Discover y servicios de seguimiento conectados', 'settings.liveTvDefaultFavorites' => 'Canales favoritos por defecto', 'settings.liveTvDefaultFavoritesDescription' => 'Mostrar solo canales favoritos al abrir TV en vivo', 'settings.display' => 'Pantalla', @@ -2901,6 +3017,7 @@ extension on TranslationsEs { 'settings.subtitlesAndConfig' => 'Subtítulos y configuración', 'settings.seekAndTiming' => 'Desplazamiento y tiempos', 'settings.behavior' => 'Comportamiento', + 'settings.exportDialogTitle' => 'Exportar ajustes de Plezy', 'search.hint' => 'Buscar películas, series, música...', 'search.tryDifferentTerm' => 'Prueba con un término de búsqueda diferente', 'search.searchYourMedia' => 'Busca en tu contenido', @@ -3049,6 +3166,8 @@ extension on TranslationsEs { 'fileInfo.flagHearingImpaired' => 'Para personas con discapacidad auditiva', 'fileInfo.flagDub' => 'Doblaje', 'fileInfo.flagOriginal' => 'Original', + 'fileInfo.channelsMono' => 'Mono', + 'fileInfo.dolbyVisionProfile' => ({required Object profile}) => 'Perfil ${profile}', 'mediaMenu.markAsWatched' => 'Marcar como visto', 'mediaMenu.markAsUnwatched' => 'Marcar como no visto', 'mediaMenu.removeFromContinueWatching' => 'Eliminar de Seguir viendo', @@ -3082,6 +3201,8 @@ extension on TranslationsEs { 'mediaMenu.rate' => 'Calificar', 'mediaMenu.playFromBeginning' => 'Reproducir desde el inicio', 'mediaMenu.playVersion' => 'Reproducir versión...', + _ => null, + } ?? switch (path) { 'rateSheet.title' => 'Calificar', 'rateSheet.server' => 'Servidor', 'rateSheet.favorite' => 'Favorito', @@ -3091,8 +3212,6 @@ extension on TranslationsEs { 'rateSheet.noConnectedServices' => 'Conecta un servicio en Configuración para valorar el contenido en él.', 'accessibility.mediaCardMovie' => ({required Object title}) => '${title}, película', 'accessibility.mediaCardShow' => ({required Object title}) => '${title}, serie de TV', - _ => null, - } ?? switch (path) { 'accessibility.mediaCardEpisode' => ({required Object title, required Object episodeInfo}) => '${title}, ${episodeInfo}', 'accessibility.mediaCardSeason' => ({required Object title, required Object seasonInfo}) => '${title}, ${seasonInfo}', 'accessibility.mediaCardWatched' => 'visto', @@ -3113,6 +3232,11 @@ extension on TranslationsEs { 'accessibility.alphabetScrollHint' => 'Desliza hacia arriba o abajo para avanzar por letra', 'accessibility.rowColumnPosition' => ({required Object row, required Object rowCount, required Object column, required Object columnCount}) => 'Fila ${row} de ${rowCount}, columna ${column} de ${columnCount}', 'accessibility.rowPosition' => ({required Object row, required Object rowCount}) => 'Fila ${row} de ${rowCount}', + 'accessibility.autoScrollPlay' => 'Iniciar desplazamiento automático', + 'accessibility.autoScrollPause' => 'Pausar desplazamiento automático', + 'accessibility.hueShort' => 'H', + 'accessibility.saturationShort' => 'S', + 'accessibility.valueShort' => 'V', 'tooltips.shufflePlay' => 'Reproducción aleatoria', 'tooltips.playTrailer' => 'Reproducir tráiler', 'tooltips.markAsWatched' => 'Marcar como visto', @@ -3203,6 +3327,15 @@ extension on TranslationsEs { 'videoControls.subtitleDownloadedNotApplied' => 'El subtítulo se descargó, pero no se pudo seleccionar', 'videoControls.subtitleDownloadFailed' => 'Error al descargar subtítulo', 'videoControls.searchLanguages' => 'Buscar idiomas...', + 'videoControls.skipIntro' => 'Saltar intro', + 'videoControls.skipCredits' => 'Saltar créditos', + 'videoControls.nextEpisode' => 'Episodio siguiente', + 'videoControls.subtitleTrack' => ({required Object n}) => 'Pista ${n}', + 'videoControls.subtitleFile' => ({required Object name}) => 'Subtítulo ${name}', + 'videoControls.forcedTrack' => ({required Object label}) => '${label} (Forzada)', + 'videoControls.osdSubtitlesOff' => 'Subtítulos: desactivados', + 'videoControls.osdSubtitles' => ({required Object track}) => 'Subtítulos: ${track}', + 'videoControls.osdAudio' => ({required Object track}) => 'Audio: ${track}', 'messages.markedAsWatched' => 'Marcado como visto', 'messages.markedAsUnwatched' => 'Marcado como no visto', 'messages.markedAsWatchedOffline' => 'Marcado como visto (se sincronizará al estar en línea)', @@ -3252,9 +3385,18 @@ extension on TranslationsEs { 'messages.serverLimitBody' => 'Error del servidor (HTTP 500). Un límite de ancho de banda/transcodificación probablemente rechazó esta sesión. Pide al propietario que lo ajuste.', 'messages.mediaUnreadableTitle' => 'Archivo no disponible', 'messages.mediaUnreadableBody' => 'El servidor encontró este elemento pero no pudo leer su archivo (HTTP 404). Es probable que el archivo se haya movido o eliminado, o que su almacenamiento esté sin conexión. Pide al propietario del servidor que revise el archivo y vuelva a escanear la biblioteca.', + 'messages.serverBusyTitle' => 'Reproducción no disponible', + 'messages.serverBusyBody' => 'El servidor siguió rechazando la reproducción de este archivo (HTTP 503). Puede que se esté reiniciando, esté ocupado o que el almacenamiento del archivo no esté disponible. Inténtalo de nuevo dentro de un momento; si sigue ocurriendo, pide al propietario del servidor que revise el servidor y el almacenamiento del archivo.', 'messages.logsUploaded' => 'Registros subidos', 'messages.logsUploadFailed' => 'Error al subir registros', 'messages.logId' => 'ID de registro', + 'messages.burnedSubtitlesUseMenu' => 'Los subtítulos están incrustados en esta transmisión. Cámbialos desde el menú de subtítulos.', + 'messages.noVideoUrl' => 'No hay ninguna URL de vídeo disponible', + 'messages.playbackNoMediaSources' => 'El servidor no devolvió ninguna fuente multimedia reproducible', + 'messages.playbackDataNotPrepared' => 'La reproducción se inició antes de que sus datos estuvieran listos', + 'messages.streamSelectionUnavailable' => 'La selección de flujos no está disponible para esta fuente', + 'messages.streamSelectionFailed' => 'No se pudieron aplicar los flujos seleccionados', + 'messages.serverUnavailableForProfile' => 'No hay ningún servidor disponible para el perfil activo', 'subtitlingStyling.text' => 'Texto', 'subtitlingStyling.border' => 'Borde', 'subtitlingStyling.background' => 'Fondo', @@ -3271,6 +3413,8 @@ extension on TranslationsEs { 'subtitlingStyling.overrideStrip' => 'Quitar estilos', 'subtitlingStyling.positionTop' => 'Arriba', 'subtitlingStyling.positionBottom' => 'Abajo', + 'subtitlingStyling.anchorToScreen' => 'Anclar a la pantalla', + 'subtitlingStyling.anchorToScreenDescription' => 'Muestra los subtítulos de texto en las barras negras situadas debajo del vídeo panorámico', 'subtitlingStyling.bold' => 'Negrita', 'subtitlingStyling.italic' => 'Cursiva', 'subtitlingStyling.renderResolution' => 'Resolución de renderizado', @@ -3353,6 +3497,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.tokenIdentityMismatch' => 'El token del perfil de Plex correspondía a un servidor inesperado', 'connections.sectionTitle' => 'Conexiones', 'connections.addConnection' => 'Añadir conexión', 'connections.addConnectionSubtitleNoProfile' => 'Inicia sesión con Plex o conecta un servidor de Jellyfin', @@ -3386,6 +3531,7 @@ extension on TranslationsEs { 'discover.tvShow' => 'Serie de TV', 'discover.minutesLeft' => ({required Object minutes}) => 'quedan ${minutes} min', 'discover.moreLikeThis' => 'Más contenido similar', + 'discover.titleCount' => ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('es'))(n, one: '${n} título', other: '${n} títulos', ), 'errors.searchFailed' => ({required Object error}) => 'Error en la búsqueda: ${error}', 'errors.searchUnavailable' => 'La búsqueda no pudo alcanzar ningún servidor de medios.', 'errors.connectionTimeout' => ({required Object context}) => 'Tiempo de conexión agotado al cargar ${context}', @@ -3558,7 +3704,10 @@ extension on TranslationsEs { 'explore.characters' => 'Personajes', 'explore.addToWatchlist' => 'Añadir a la lista de seguimiento', 'explore.removeFromWatchlist' => 'Quitar de la lista de seguimiento', + 'explore.addedToWatchlist' => 'Añadido a la lista de seguimiento', + 'explore.removedFromWatchlist' => 'Eliminado de la lista de seguimiento', 'explore.watchlistUpdateFailed' => 'No se pudo actualizar la lista de seguimiento', + 'explore.watchlistNoMatch' => 'No se pudo asociar este elemento con una lista de seguimiento', 'explore.notInLibrary' => 'No está en tu biblioteca', 'explore.inTheseLibraries' => 'En estas bibliotecas', 'explore.checkingLibrary' => 'Comprobando tu biblioteca...', @@ -3566,6 +3715,8 @@ extension on TranslationsEs { 'explore.emptyMessage' => ({required Object source}) => 'Las filas de ${source} aparecerán aquí cuando tengan contenido.', 'explore.searchHint' => ({required Object source}) => 'Buscar en ${source}', 'explore.searchEmpty' => ({required Object query}) => 'Sin resultados para "${query}"', + _ => null, + } ?? switch (path) { 'explore.searchPrompt' => ({required Object source}) => 'Busca películas y series en ${source}.', 'explore.searchFailed' => 'La búsqueda falló. Comprueba tu conexión e inténtalo de nuevo.', 'explore.badge.rankPopular' => ({required Object n}) => '#${n} popular', @@ -3605,8 +3756,6 @@ extension on TranslationsEs { 'explore.stats.completed' => ({required Object n}) => '${n} lo completaron', 'explore.stats.onHold' => ({required Object n}) => '${n} en pausa', 'explore.stats.dropped' => ({required Object n}) => '${n} lo abandonaron', - _ => null, - } ?? switch (path) { 'explore.season.winter' => 'Invierno', 'explore.season.spring' => 'Primavera', 'explore.season.summer' => 'Verano', @@ -3703,6 +3852,9 @@ extension on TranslationsEs { 'liveTv.watchChannel' => 'Ver canal', 'liveTv.favorites' => 'Favoritos', 'liveTv.reorderFavorites' => 'Reordenar favoritos', + 'liveTv.noFavoriteChannels' => 'No hay canales favoritos', + 'liveTv.noFavoriteChannelsHint' => 'Muestra todos los canales y mantén pulsado uno para añadirlo a tus favoritos.', + 'liveTv.showAllChannels' => 'Mostrar todos los canales', 'liveTv.favoritesLoadFailed' => 'No se pudieron cargar los favoritos. Comprueba tu conexión e inténtalo de nuevo.', 'liveTv.favoritesUpdateFailed' => 'No se pudieron actualizar los favoritos. Comprueba tu conexión e inténtalo de nuevo.', 'liveTv.joinSession' => 'Unirse a sesión en curso', @@ -3742,6 +3894,11 @@ extension on TranslationsEs { 'liveTv.guideReloadRequested' => 'Solicitada actualización de la guía', 'liveTv.rulesProcessRequested' => 'Solicitada reevaluación de reglas', 'liveTv.recordShow' => 'Grabar programa', + 'liveTv.startingInMinutes' => ({required Object minutes}) => 'Empieza en ${minutes} min', + 'liveTv.dayAtTime' => ({required Object day, required Object time}) => '${day} a las ${time}', + 'liveTv.invalidPlaybackData' => ({required Object product}) => '${product} devolvió datos de reproducción de TV en vivo no válidos', + 'liveTv.failedToStartChannel' => 'No se pudo iniciar el canal en vivo', + 'liveTv.failedToBuildStreamUrl' => 'No se pudo generar la URL de transmisión', 'collections.title' => 'Colecciones', 'collections.collection' => 'Colección', 'collections.empty' => 'La colección está vacía', @@ -3810,6 +3967,8 @@ extension on TranslationsEs { 'music.repeat' => 'Repetir', 'music.repeatAll' => 'Repetir todo', 'music.repeatOne' => 'Repetir una', + 'music.instantMixNoServer' => 'No hay ningún servidor disponible para una mezcla instantánea', + 'music.noAudioUrl' => ({required Object track}) => 'No hay ninguna URL de audio disponible para ${track}', 'watchTogether.title' => 'Ver juntos', 'watchTogether.description' => 'Mira contenido sincronizado con amigos y familiares', 'watchTogether.createSession' => 'Crear sesión', @@ -3875,6 +4034,7 @@ extension on TranslationsEs { 'watchTogether.removeRoom' => 'Eliminar', 'watchTogether.guestSwitchUnavailable' => 'No se pudo cambiar — servidor no disponible para sincronización', 'watchTogether.guestSwitchFailed' => 'No se pudo cambiar — contenido no encontrado en este servidor', + 'watchTogether.defaultDisplayName' => 'Usuario', 'downloads.title' => 'Descargas', 'downloads.manage' => 'Gestionar', 'downloads.tvShows' => 'Series de TV', @@ -3975,6 +4135,16 @@ extension on TranslationsEs { 'downloads.backgroundWarning.statusUnknown' => 'Aún no se ha comprobado', 'downloads.backgroundWarning.settingsUnavailable' => 'No se pudo abrir la configuración del sistema en este dispositivo', 'downloads.backgroundWarning.linkUnavailable' => 'No se pudo abrir dontkillmyapp.com en este dispositivo', + 'downloads.unknownShow' => 'Serie desconocida', + 'downloads.unknownSeason' => 'Temporada desconocida', + 'downloads.unknownAlbum' => 'Álbum desconocido', + 'downloads.completedOfTotal' => ({required Object completed, required Object total}) => '${completed}/${total} completadas', + 'downloads.errorFileNotFound' => 'Archivo no encontrado (404)', + 'downloads.errorDownloadFailed' => 'Error en la descarga', + 'downloads.errorPostProcessing' => ({required Object error}) => 'Error en el posprocesamiento: ${error}', + 'downloads.notificationDownloading' => 'Descargando...', + 'downloads.notificationComplete' => 'Descarga completada', + 'downloads.notificationPaused' => 'Descarga pausada', 'shaders.title' => 'Shaders', 'shaders.noShaderDescription' => 'Sin mejora de video', 'shaders.nvscalerDescription' => 'Escalado de imagen NVIDIA para un video más nítido', @@ -4054,14 +4224,24 @@ extension on TranslationsEs { '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', + 'companionRemote.closedBeforeAuth' => 'La conexión se cerró antes de la autenticación', 'videoSettings.playbackSpeed' => 'Velocidad de reproducción', 'videoSettings.normalSpeed' => 'Normal', 'videoSettings.sleepTimerActive' => ({required Object duration}) => 'Activo (${duration})', 'videoSettings.zoom' => 'Zoom', + _ => null, + } ?? switch (path) { 'videoSettings.sleepTimer' => 'Temporizador de apagado', 'videoSettings.audioSync' => 'Sincronización de audio', 'videoSettings.subtitleSync' => 'Sincronización de subtítulos', 'videoSettings.hdr' => 'HDR', + 'videoSettings.hdrUnsupported' => 'HDR no está disponible aquí: este compositor de escritorio o esta salida de vídeo no pueden transmitirlo.', + 'videoSettings.hdrToneMapping' => 'Mapeo de tonos HDR', + 'videoSettings.hdrToneMappingCompositor' => 'Compositor', + 'videoSettings.hdrToneMappingCompositorDescription' => 'Transmite los metadatos HDR de la fuente y deja que el compositor de escritorio haga el mapeo.', + 'videoSettings.hdrToneMappingPlayer' => 'Reproductor', + 'videoSettings.hdrToneMappingPlayerDescription' => 'Realiza en el reproductor el mapeo al brillo máximo de la pantalla y luego comunica el resultado al compositor.', + 'videoSettings.hdrToneMappingFailed' => 'No se pudo cambiar el mapeo de tonos HDR; el modo anterior sigue activo.', 'videoSettings.audioOutput' => 'Salida de audio', 'videoSettings.performanceOverlay' => 'Indicador de rendimiento', 'videoSettings.audioOutputDolbyAtmos' => 'Dolby Atmos', @@ -4106,6 +4286,16 @@ extension on TranslationsEs { 'performanceOverlay.player' => 'Reproductor', 'performanceOverlay.memory' => 'Memoria', 'performanceOverlay.uiFps' => 'FPS UI', + 'performanceOverlay.fps' => 'FPS', + 'performanceOverlay.decoderAndroidHw' => 'HW de Android', + 'performanceOverlay.decoderNvidiaHw' => 'HW de NVIDIA', + 'performanceOverlay.decoderQualcommHw' => 'HW de Qualcomm', + 'performanceOverlay.decoderMediatekHw' => 'HW de MediaTek', + 'performanceOverlay.decoderExynosHw' => 'HW de Exynos', + 'performanceOverlay.decoderSoftware' => 'Software', + 'performanceOverlay.decoderHardware' => 'Hardware', + 'performanceOverlay.tunnelingActive' => 'Activo', + 'performanceOverlay.dvRpuFailed' => ({required Object converted, required Object failures}) => '${converted} (${failures} con error)', 'externalPlayer.title' => 'Reproductor externo', 'externalPlayer.useExternalPlayer' => 'Usar reproductor externo', 'externalPlayer.useExternalPlayerDescription' => 'Abrir videos en otra aplicación', @@ -4119,8 +4309,6 @@ extension on TranslationsEs { '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', @@ -4254,6 +4442,16 @@ extension on TranslationsEs { 'seerr.statusPartiallyAvailable' => 'Parcialmente disponible', 'seerr.statusRequested' => 'Solicitado', 'seerr.statusProcessing' => 'Procesando', + 'seerr.couldNotReach' => ({required Object url, required Object error}) => 'No se pudo conectar con ${url}: ${error}', + 'seerr.noInstanceAtUrl' => ({required Object url, required Object status}) => 'No hay ninguna instancia de Seerr en ${url} (HTTP ${status})', + 'seerr.notInitialized' => 'Esta instancia de Seerr no ha completado la configuración inicial', + 'seerr.noPlexTokenForReauth' => 'No hay ningún token de Plex disponible para volver a iniciar sesión', + 'seerr.noStoredCredentials' => 'No hay credenciales guardadas disponibles para volver a iniciar sesión', + 'seerr.signInRejected' => 'Se rechazó el inicio de sesión', + 'seerr.noSessionCookie' => 'Seerr no proporcionó una cookie de sesión', + 'seerr.freshCookieRejected' => 'Seerr rechazó la nueva cookie de sesión', + 'seerr.noUserInformation' => 'Seerr no devolvió información del usuario', + 'seerr.sessionRejectedAfterReauth' => 'La sesión fue rechazada después de volver a iniciar sesión', 'services.title' => 'Servicios', 'services.hubSubtitle' => 'Sincroniza tu progreso de visualización y solicita nuevos títulos.', 'services.notConnected' => 'No conectado', @@ -4269,6 +4467,7 @@ extension on TranslationsEs { 'services.names.seerr' => 'Seerr', 'services.names.mdblist' => 'MDBList', 'services.deviceCode.title' => ({required Object service}) => 'Activar Plezy en ${service}', + 'services.deviceCode.instructions' => 'Escanea el código QR o visita la dirección que aparece a continuación e introduce este código:', 'services.deviceCode.openToActivate' => ({required Object service}) => 'Abrir ${service} para activar', 'services.deviceCode.copyCode' => 'Copiar código de activación', 'services.deviceCode.waitingForAuthorization' => 'Esperando autorización…', @@ -4318,6 +4517,24 @@ extension on TranslationsEs { 'addServer.connectToMediaBrowserCardSubtitleScoped' => ({required Object product, required Object name}) => 'Inicia sesión en tu servidor ${product}. Se vincula a ${name}.', 'addServer.borrowFromAnotherProfile' => 'Tomar prestado de otro perfil', 'addServer.borrowFromAnotherProfileSubtitle' => 'Reutiliza la conexión de otro perfil. Los perfiles protegidos con PIN requieren un PIN.', + 'addServer.invalidCredentials' => 'Usuario o contraseña no válidos', + 'addServer.authResponseNotJson' => 'La respuesta de autenticación no era un JSON válido', + 'addServer.quickConnectRejected' => 'Quick Connect fue rechazado por el servidor', + 'addServer.quickConnectNotJson' => 'La respuesta de Quick Connect no era un JSON válido', + 'addServer.quickConnectMissingFields' => 'La respuesta de Quick Connect no incluye el código o el secreto', + 'addServer.quickConnectPollRejected' => 'El servidor rechazó el sondeo de Quick Connect', + 'addServer.serverTimedOut' => 'El servidor no respondió a tiempo', + 'addServer.responseNotJson' => 'La respuesta del servidor no era un JSON válido', + 'addServer.responseMissingIdentity' => ({required Object product}) => 'A la respuesta le falta un ID o el nombre del servidor. ¿Es este un servidor ${product}?', + 'addServer.probeFailed' => ({required Object error}) => 'No se pudo conectar con el servidor: ${error}', + 'addServer.enterAtLeastOneUrl' => ({required Object product}) => 'Introduce al menos una URL de servidor ${product}', + 'addServer.noReachableServer' => ({required Object product}) => 'No se encontró ningún servidor ${product} accesible', + 'addServer.urlsPointToDifferentServers' => ({required Object product}) => 'Estas URL apuntan a servidores ${product} distintos', + 'addServer.urlDoesNotMatchServer' => ({required Object product}) => 'Esta URL no corresponde al servidor ${product}', + 'addServer.redirectUnsupported' => 'El servidor redirigió a una URL no compatible', + 'addServer.redirectDifferentHost' => ({required Object product}) => 'El servidor redirigió a un host diferente. Introduce directamente la URL final de ${product}.', + 'addServer.redirectInsecure' => 'El servidor redirigió de HTTPS a una URL no segura', + 'addServer.redirectUnsupportedEnterFinal' => ({required Object product}) => 'El servidor redirigió a una URL no compatible. Introduce directamente la URL final de ${product}.', _ => null, }; } diff --git a/lib/i18n/strings_fr.g.dart b/lib/i18n/strings_fr.g.dart index b89bfd9c..0b775eda 100644 --- a/lib/i18n/strings_fr.g.dart +++ b/lib/i18n/strings_fr.g.dart @@ -123,6 +123,7 @@ class _Translations$auth$fr extends Translations$auth$en { @override String get quickConnectCancel => 'Annuler'; @override String get quickConnectExpired => 'Quick Connect a expiré. Réessayez.'; @override String get localDataRecoveryRequired => 'Plezy n’a pas pu récupérer en toute sécurité les données locales de connexion et de lecture en attente. Veuillez vous reconnecter.'; + @override String get pinCheckRejected => 'La vérification du code PIN Plex a été refusée'; } // Path: common @@ -178,6 +179,9 @@ class _Translations$common$fr extends Translations$common$en { @override String get exitFullscreen => 'Quitter le plein écran'; @override String get pressBackAgainToExit => 'Appuyez à nouveau sur retour pour quitter'; @override late final _Translations$common$ratingSource$fr ratingSource = _Translations$common$ratingSource$fr._(_root); + @override String get notAvailable => 'N/A'; + @override String get url => 'URL'; + @override String get letterKeys => 'ABC'; } // Path: screens @@ -444,6 +448,8 @@ class _Translations$settings$fr extends Translations$settings$en { @override String get showNavBarLabels => 'Afficher les libellés de la barre de navigation'; @override String get showNavBarLabelsDescription => 'Afficher les libellés sous les icônes de la barre de navigation'; @override String get startupSection => 'Section de démarrage'; + @override String get showExploreTab => 'Afficher l’onglet Explorer'; + @override String get showExploreTabDescription => 'Afficher l’onglet Explorer avec le contenu de Plex Discover et des services de suivi connectés'; @override String get liveTvDefaultFavorites => 'Chaînes favorites par défaut'; @override String get liveTvDefaultFavoritesDescription => 'Afficher uniquement les chaînes favorites à l\'ouverture de la TV en direct'; @override String get display => 'Affichage'; @@ -455,6 +461,7 @@ class _Translations$settings$fr extends Translations$settings$en { @override String get subtitlesAndConfig => 'Sous-titres et configuration'; @override String get seekAndTiming => 'Déplacement et minutage'; @override String get behavior => 'Comportement'; + @override String get exportDialogTitle => 'Exporter les paramètres de Plezy'; } // Path: search @@ -606,6 +613,8 @@ class _Translations$fileInfo$fr extends Translations$fileInfo$en { @override String get flagHearingImpaired => 'Sourds et malentendants'; @override String get flagDub => 'Doublage'; @override String get flagOriginal => 'Originale'; + @override String get channelsMono => 'Mono'; + @override String dolbyVisionProfile({required Object profile}) => 'Profil ${profile}'; } // Path: mediaMenu @@ -704,6 +713,11 @@ class _Translations$accessibility$fr extends Translations$accessibility$en { @override String get alphabetScrollHint => 'Balayez vers le haut ou le bas pour changer de lettre'; @override String rowColumnPosition({required Object row, required Object rowCount, required Object column, required Object columnCount}) => 'Ligne ${row} sur ${rowCount}, colonne ${column} sur ${columnCount}'; @override String rowPosition({required Object row, required Object rowCount}) => 'Ligne ${row} sur ${rowCount}'; + @override String get autoScrollPlay => 'Lancer le défilement automatique'; + @override String get autoScrollPause => 'Suspendre le défilement automatique'; + @override String get hueShort => 'T'; + @override String get saturationShort => 'S'; + @override String get valueShort => 'V'; } // Path: tooltips @@ -815,6 +829,15 @@ class _Translations$videoControls$fr extends Translations$videoControls$en { @override String get subtitleDownloadedNotApplied => 'Le sous-titre a été téléchargé, mais n’a pas pu être sélectionné'; @override String get subtitleDownloadFailed => 'Échec du téléchargement du sous-titre'; @override String get searchLanguages => 'Rechercher des langues...'; + @override String get skipIntro => 'Passer l’intro'; + @override String get skipCredits => 'Passer le générique'; + @override String get nextEpisode => 'Épisode suivant'; + @override String subtitleTrack({required Object n}) => 'Piste ${n}'; + @override String subtitleFile({required Object name}) => 'Sous-titre ${name}'; + @override String forcedTrack({required Object label}) => '${label} (forcé)'; + @override String get osdSubtitlesOff => 'Sous-titres : désactivés'; + @override String osdSubtitles({required Object track}) => 'Sous-titres : ${track}'; + @override String osdAudio({required Object track}) => 'Audio : ${track}'; } // Path: messages @@ -876,9 +899,18 @@ class _Translations$messages$fr extends Translations$messages$en { @override String get serverLimitBody => 'Erreur serveur (HTTP 500). Une limite de bande passante/transcodage a probablement rejeté cette session. Demandez au propriétaire de l\'ajuster.'; @override String get mediaUnreadableTitle => 'Fichier indisponible'; @override String get mediaUnreadableBody => 'Le serveur a trouvé cet élément mais n\'a pas pu lire son fichier (HTTP 404). Le fichier a probablement été déplacé, supprimé, ou son stockage est hors ligne. Demandez au propriétaire du serveur de vérifier le fichier et de relancer l\'analyse de la bibliothèque.'; + @override String get serverBusyTitle => 'Flux indisponible'; + @override String get serverBusyBody => 'Le serveur a refusé à plusieurs reprises de diffuser ce fichier (HTTP 503). Il est peut-être en cours de redémarrage ou occupé, ou le stockage du fichier est peut-être hors ligne. Réessayez dans un instant. Si le problème persiste, demandez au propriétaire du serveur de vérifier le serveur et le stockage du fichier.'; @override String get logsUploaded => 'Journaux envoyés'; @override String get logsUploadFailed => 'Échec de l’envoi des journaux'; @override String get logId => 'Identifiant du journal'; + @override String get burnedSubtitlesUseMenu => 'Les sous-titres sont incrustés à l’image de ce flux. Modifiez-les depuis le menu des sous-titres.'; + @override String get noVideoUrl => 'Aucune URL vidéo disponible'; + @override String get playbackNoMediaSources => 'Le serveur n’a renvoyé aucune source multimédia lisible'; + @override String get playbackDataNotPrepared => 'La lecture a été lancée avant que les données nécessaires soient prêtes'; + @override String get streamSelectionUnavailable => 'La sélection des flux n’est pas disponible pour cette source'; + @override String get streamSelectionFailed => 'Impossible d’appliquer les flux sélectionnés'; + @override String get serverUnavailableForProfile => 'Aucun serveur n’est disponible pour le profil actif'; } // Path: subtitlingStyling @@ -904,6 +936,8 @@ class _Translations$subtitlingStyling$fr extends Translations$subtitlingStyling$ @override String get overrideStrip => 'Supprimer le style'; @override String get positionTop => 'Haut'; @override String get positionBottom => 'Bas'; + @override String get anchorToScreen => 'Ancrer à l’écran'; + @override String get anchorToScreenDescription => 'Afficher les sous-titres textuels dans les bandes noires sous les vidéos en écran large'; @override String get bold => 'Gras'; @override String get italic => 'Italique'; @override String get renderResolution => 'Résolution de rendu'; @@ -1013,6 +1047,7 @@ class _Translations$profiles$fr extends Translations$profiles$en { @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 tokenIdentityMismatch => 'Le jeton du profil Plex correspond à un serveur inattendu'; } // Path: connections @@ -1064,6 +1099,10 @@ class _Translations$discover$fr extends Translations$discover$en { @override String get tvShow => 'Série TV'; @override String minutesLeft({required Object minutes}) => '${minutes} min restantes'; @override String get moreLikeThis => 'Plus de contenus similaires'; + @override String titleCount({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('fr'))(n, + one: '${n} titre', + other: '${n} titres', + ); } // Path: errors @@ -1276,7 +1315,10 @@ class _Translations$explore$fr extends Translations$explore$en { @override String get characters => 'Personnages'; @override String get addToWatchlist => 'Ajouter à la liste de suivi'; @override String get removeFromWatchlist => 'Retirer de la liste de suivi'; + @override String get addedToWatchlist => 'Ajouté à la liste de suivi'; + @override String get removedFromWatchlist => 'Retiré de la liste de suivi'; @override String get watchlistUpdateFailed => 'Impossible de mettre à jour la liste de suivi'; + @override String get watchlistNoMatch => 'Impossible d’associer cet élément à une liste de suivi'; @override String get notInLibrary => 'Absent de votre bibliothèque'; @override String get inTheseLibraries => 'Dans ces bibliothèques'; @override String get checkingLibrary => 'Vérification de votre bibliothèque...'; @@ -1337,6 +1379,9 @@ class _Translations$liveTv$fr extends Translations$liveTv$en { @override String get watchChannel => 'Regarder la chaîne'; @override String get favorites => 'Favoris'; @override String get reorderFavorites => 'Réorganiser les favoris'; + @override String get noFavoriteChannels => 'Aucune chaîne favorite'; + @override String get noFavoriteChannelsHint => 'Affichez toutes les chaînes, puis appuyez longuement sur une chaîne pour l’ajouter à vos favoris.'; + @override String get showAllChannels => 'Afficher toutes les chaînes'; @override String get favoritesLoadFailed => 'Impossible de charger les favoris. Vérifiez votre connexion et réessayez.'; @override String get favoritesUpdateFailed => 'Impossible de mettre à jour les favoris. Vérifiez votre connexion et réessayez.'; @override String get joinSession => 'Rejoindre la session en cours'; @@ -1376,6 +1421,11 @@ class _Translations$liveTv$fr extends Translations$liveTv$en { @override String get guideReloadRequested => 'Mise à jour du guide demandée'; @override String get rulesProcessRequested => 'Réévaluation des règles demandée'; @override String get recordShow => 'Enregistrer l\'émission'; + @override String startingInMinutes({required Object minutes}) => 'Commence dans ${minutes} min'; + @override String dayAtTime({required Object day, required Object time}) => '${day} à ${time}'; + @override String invalidPlaybackData({required Object product}) => '${product} a renvoyé des données de lecture de TV en direct non valides'; + @override String get failedToStartChannel => 'Impossible de lancer la chaîne en direct'; + @override String get failedToBuildStreamUrl => 'Impossible de générer l’URL du flux'; } // Path: collections @@ -1474,6 +1524,8 @@ class _Translations$music$fr extends Translations$music$en { @override String get repeat => 'Répéter'; @override String get repeatAll => 'Tout répéter'; @override String get repeatOne => 'Répéter le titre'; + @override String get instantMixNoServer => 'Aucun serveur n’est disponible pour créer un mix instantané'; + @override String noAudioUrl({required Object track}) => 'Aucune URL audio n’est disponible pour ${track}'; } // Path: watchTogether @@ -1548,6 +1600,7 @@ class _Translations$watchTogether$fr extends Translations$watchTogether$en { @override String get removeRoom => 'Supprimer'; @override String get guestSwitchUnavailable => 'Impossible de changer — serveur indisponible pour la synchronisation'; @override String get guestSwitchFailed => 'Impossible de changer — contenu introuvable sur ce serveur'; + @override String get defaultDisplayName => 'Utilisateur'; } // Path: downloads @@ -1632,6 +1685,16 @@ class _Translations$downloads$fr extends Translations$downloads$en { @override String get syncRuleUnknownServer => 'Serveur inconnu'; @override String get syncRuleListCreated => 'Règle de synchronisation créée'; @override late final _Translations$downloads$backgroundWarning$fr backgroundWarning = _Translations$downloads$backgroundWarning$fr._(_root); + @override String get unknownShow => 'Série inconnue'; + @override String get unknownSeason => 'Saison inconnue'; + @override String get unknownAlbum => 'Album inconnu'; + @override String completedOfTotal({required Object completed, required Object total}) => '${completed}/${total} terminés'; + @override String get errorFileNotFound => 'Fichier introuvable (404)'; + @override String get errorDownloadFailed => 'Échec du téléchargement'; + @override String errorPostProcessing({required Object error}) => 'Échec du post-traitement : ${error}'; + @override String get notificationDownloading => 'Téléchargement...'; + @override String get notificationComplete => 'Téléchargement terminé'; + @override String get notificationPaused => 'Téléchargement en pause'; } // Path: shaders @@ -1672,6 +1735,7 @@ class _Translations$companionRemote$fr extends Translations$companionRemote$en { @override late final _Translations$companionRemote$pairing$fr pairing = _Translations$companionRemote$pairing$fr._(_root); @override late final _Translations$companionRemote$remote$fr remote = _Translations$companionRemote$remote$fr._(_root); @override late final _Translations$companionRemote$errors$fr errors = _Translations$companionRemote$errors$fr._(_root); + @override String get closedBeforeAuth => 'La connexion a été fermée avant l’authentification'; } // Path: videoSettings @@ -1689,6 +1753,13 @@ class _Translations$videoSettings$fr extends Translations$videoSettings$en { @override String get audioSync => 'Synchronisation audio'; @override String get subtitleSync => 'Synchronisation des sous-titres'; @override String get hdr => 'HDR'; + @override String get hdrUnsupported => 'Le HDR n’est pas disponible ici : ce compositeur de bureau ou cette sortie vidéo ne permet pas de le transmettre.'; + @override String get hdrToneMapping => 'Mappage tonal HDR'; + @override String get hdrToneMappingCompositor => 'Compositeur'; + @override String get hdrToneMappingCompositorDescription => 'Transmettre les métadonnées HDR de la source et laisser le compositeur de bureau effectuer le mappage.'; + @override String get hdrToneMappingPlayer => 'Lecteur'; + @override String get hdrToneMappingPlayerDescription => 'Effectuer dans le lecteur le mappage selon la luminosité maximale de l’écran, puis indiquer le résultat au compositeur.'; + @override String get hdrToneMappingFailed => 'Impossible de modifier le mappage tonal HDR : le mode précédent reste actif.'; @override String get audioOutput => 'Sortie audio'; @override String get performanceOverlay => 'Données de performance'; @override String get audioOutputDolbyAtmos => 'Dolby Atmos'; @@ -1742,6 +1813,16 @@ class _Translations$performanceOverlay$fr extends Translations$performanceOverla @override String get player => 'Lecteur'; @override String get memory => 'Mémoire'; @override String get uiFps => 'FPS UI'; + @override String get fps => 'FPS'; + @override String get decoderAndroidHw => 'Matériel Android'; + @override String get decoderNvidiaHw => 'Matériel NVIDIA'; + @override String get decoderQualcommHw => 'Matériel Qualcomm'; + @override String get decoderMediatekHw => 'Matériel MediaTek'; + @override String get decoderExynosHw => 'Matériel Exynos'; + @override String get decoderSoftware => 'Logiciel'; + @override String get decoderHardware => 'Matériel'; + @override String get tunnelingActive => 'Actif'; + @override String dvRpuFailed({required Object converted, required Object failures}) => '${converted} (${failures} échecs)'; } // Path: externalPlayer @@ -1942,6 +2023,16 @@ class _Translations$seerr$fr extends Translations$seerr$en { @override String get statusPartiallyAvailable => 'Partiellement disponible'; @override String get statusRequested => 'Demandé'; @override String get statusProcessing => 'En cours de traitement'; + @override String couldNotReach({required Object url, required Object error}) => 'Impossible de joindre ${url} : ${error}'; + @override String noInstanceAtUrl({required Object url, required Object status}) => 'Aucune instance Seerr à l’adresse ${url} (HTTP ${status})'; + @override String get notInitialized => 'La configuration initiale de cette instance Seerr n’est pas terminée'; + @override String get noPlexTokenForReauth => 'Aucun jeton Plex n’est disponible pour se reconnecter'; + @override String get noStoredCredentials => 'Aucun identifiant enregistré n’est disponible pour se reconnecter'; + @override String get signInRejected => 'La connexion a été refusée'; + @override String get noSessionCookie => 'Seerr n’a pas fourni de cookie de session'; + @override String get freshCookieRejected => 'Seerr a refusé le nouveau cookie de session'; + @override String get noUserInformation => 'Seerr n’a renvoyé aucune information sur l’utilisateur'; + @override String get sessionRejectedAfterReauth => 'La session a été refusée après la reconnexion'; } // Path: services @@ -2002,6 +2093,24 @@ class _Translations$addServer$fr extends Translations$addServer$en { @override String connectToMediaBrowserCardSubtitleScoped({required Object product, required Object name}) => 'Connectez-vous à votre serveur ${product}. Sera associé à ${name}.'; @override String get borrowFromAnotherProfile => 'Emprunter à un autre profil'; @override String get borrowFromAnotherProfileSubtitle => 'Réutiliser la connexion d\'un autre profil. Les profils protégés par PIN exigent un PIN.'; + @override String get invalidCredentials => 'Nom d’utilisateur ou mot de passe incorrect'; + @override String get authResponseNotJson => 'La réponse d’authentification n’était pas au format JSON valide'; + @override String get quickConnectRejected => 'Quick Connect a été refusé par le serveur'; + @override String get quickConnectNotJson => 'La réponse de Quick Connect n’était pas au format JSON valide'; + @override String get quickConnectMissingFields => 'Il manque un code ou un secret dans la réponse de Quick Connect'; + @override String get quickConnectPollRejected => 'L’interrogation de Quick Connect a été refusée par le serveur'; + @override String get serverTimedOut => 'Le serveur n’a pas répondu à temps'; + @override String get responseNotJson => 'La réponse du serveur n’était pas au format JSON valide'; + @override String responseMissingIdentity({required Object product}) => 'Il manque un identifiant ou un nom de serveur dans la réponse : s’agit-il d’un serveur ${product} ?'; + @override String probeFailed({required Object error}) => 'Impossible de joindre le serveur : ${error}'; + @override String enterAtLeastOneUrl({required Object product}) => 'Saisissez l’URL d’au moins un serveur ${product}'; + @override String noReachableServer({required Object product}) => 'Aucun serveur ${product} joignable n’a été trouvé'; + @override String urlsPointToDifferentServers({required Object product}) => 'Ces URL renvoient vers différents serveurs ${product}'; + @override String urlDoesNotMatchServer({required Object product}) => 'Cette URL ne correspond pas au serveur ${product}'; + @override String get redirectUnsupported => 'Le serveur a redirigé vers une URL non prise en charge'; + @override String redirectDifferentHost({required Object product}) => 'Le serveur a redirigé vers un hôte différent. Saisissez directement l’URL finale du serveur ${product}.'; + @override String get redirectInsecure => 'Le serveur a redirigé de HTTPS vers une URL non sécurisée'; + @override String redirectUnsupportedEnterFinal({required Object product}) => 'Le serveur a redirigé vers une URL non prise en charge. Saisissez directement l’URL finale du serveur ${product}.'; } // Path: common.ratingSource @@ -2521,6 +2630,7 @@ class _Translations$services$deviceCode$fr extends Translations$services$deviceC // Translations @override String title({required Object service}) => 'Activer Plezy sur ${service}'; + @override String get instructions => 'Scannez le code QR ou accédez à l’adresse ci-dessous et saisissez ce code :'; @override String openToActivate({required Object service}) => 'Ouvrir ${service} pour activer'; @override String get copyCode => 'Copier le code d\'activation'; @override String get waitingForAuthorization => 'En attente d\'autorisation…'; @@ -2595,6 +2705,7 @@ extension on TranslationsFr { 'auth.quickConnectCancel' => 'Annuler', 'auth.quickConnectExpired' => 'Quick Connect a expiré. Réessayez.', 'auth.localDataRecoveryRequired' => 'Plezy n’a pas pu récupérer en toute sécurité les données locales de connexion et de lecture en attente. Veuillez vous reconnecter.', + 'auth.pinCheckRejected' => 'La vérification du code PIN Plex a été refusée', 'common.cancel' => 'Annuler', 'common.save' => 'Enregistrer', 'common.close' => 'Fermer', @@ -2651,6 +2762,9 @@ extension on TranslationsFr { 'common.ratingSource.trakt' => 'Trakt', 'common.ratingSource.rottenTomatoesCritic' => 'Critiques Rotten Tomatoes', 'common.ratingSource.rottenTomatoesAudience' => 'Public Rotten Tomatoes', + 'common.notAvailable' => 'N/A', + 'common.url' => 'URL', + 'common.letterKeys' => 'ABC', 'screens.licenses' => 'Licences', 'screens.switchProfile' => 'Changer de profil', 'screens.subtitleStyling' => 'Configuration des sous-titres', @@ -2890,6 +3004,8 @@ extension on TranslationsFr { 'settings.showNavBarLabels' => 'Afficher les libellés de la barre de navigation', 'settings.showNavBarLabelsDescription' => 'Afficher les libellés sous les icônes de la barre de navigation', 'settings.startupSection' => 'Section de démarrage', + 'settings.showExploreTab' => 'Afficher l’onglet Explorer', + 'settings.showExploreTabDescription' => 'Afficher l’onglet Explorer avec le contenu de Plex Discover et des services de suivi connectés', 'settings.liveTvDefaultFavorites' => 'Chaînes favorites par défaut', 'settings.liveTvDefaultFavoritesDescription' => 'Afficher uniquement les chaînes favorites à l\'ouverture de la TV en direct', 'settings.display' => 'Affichage', @@ -2901,6 +3017,7 @@ extension on TranslationsFr { 'settings.subtitlesAndConfig' => 'Sous-titres et configuration', 'settings.seekAndTiming' => 'Déplacement et minutage', 'settings.behavior' => 'Comportement', + 'settings.exportDialogTitle' => 'Exporter les paramètres de Plezy', 'search.hint' => 'Rechercher des films, des séries, de la musique...', 'search.tryDifferentTerm' => 'Essayez un autre terme de recherche', 'search.searchYourMedia' => 'Rechercher dans vos médias', @@ -3049,6 +3166,8 @@ extension on TranslationsFr { 'fileInfo.flagHearingImpaired' => 'Sourds et malentendants', 'fileInfo.flagDub' => 'Doublage', 'fileInfo.flagOriginal' => 'Originale', + 'fileInfo.channelsMono' => 'Mono', + 'fileInfo.dolbyVisionProfile' => ({required Object profile}) => 'Profil ${profile}', 'mediaMenu.markAsWatched' => 'Marquer comme vu', 'mediaMenu.markAsUnwatched' => 'Marquer comme non visionné', 'mediaMenu.removeFromContinueWatching' => 'Supprimer de la liste "Continuer à regarder"', @@ -3082,6 +3201,8 @@ extension on TranslationsFr { 'mediaMenu.rate' => 'Noter', 'mediaMenu.playFromBeginning' => 'Lire depuis le début', 'mediaMenu.playVersion' => 'Lire la version...', + _ => null, + } ?? switch (path) { 'rateSheet.title' => 'Noter', 'rateSheet.server' => 'Serveur', 'rateSheet.favorite' => 'Favori', @@ -3091,8 +3212,6 @@ extension on TranslationsFr { 'rateSheet.noConnectedServices' => 'Connectez un service dans les paramètres pour pouvoir y attribuer une note.', 'accessibility.mediaCardMovie' => ({required Object title}) => '${title}, film', 'accessibility.mediaCardShow' => ({required Object title}) => '${title}, série TV', - _ => null, - } ?? switch (path) { 'accessibility.mediaCardEpisode' => ({required Object title, required Object episodeInfo}) => '${title}, ${episodeInfo}', 'accessibility.mediaCardSeason' => ({required Object title, required Object seasonInfo}) => '${title}, ${seasonInfo}', 'accessibility.mediaCardWatched' => 'visionné', @@ -3113,6 +3232,11 @@ extension on TranslationsFr { 'accessibility.alphabetScrollHint' => 'Balayez vers le haut ou le bas pour changer de lettre', 'accessibility.rowColumnPosition' => ({required Object row, required Object rowCount, required Object column, required Object columnCount}) => 'Ligne ${row} sur ${rowCount}, colonne ${column} sur ${columnCount}', 'accessibility.rowPosition' => ({required Object row, required Object rowCount}) => 'Ligne ${row} sur ${rowCount}', + 'accessibility.autoScrollPlay' => 'Lancer le défilement automatique', + 'accessibility.autoScrollPause' => 'Suspendre le défilement automatique', + 'accessibility.hueShort' => 'T', + 'accessibility.saturationShort' => 'S', + 'accessibility.valueShort' => 'V', 'tooltips.shufflePlay' => 'Lecture aléatoire', 'tooltips.playTrailer' => 'Lire la bande-annonce', 'tooltips.markAsWatched' => 'Marquer comme vu', @@ -3203,6 +3327,15 @@ extension on TranslationsFr { 'videoControls.subtitleDownloadedNotApplied' => 'Le sous-titre a été téléchargé, mais n’a pas pu être sélectionné', 'videoControls.subtitleDownloadFailed' => 'Échec du téléchargement du sous-titre', 'videoControls.searchLanguages' => 'Rechercher des langues...', + 'videoControls.skipIntro' => 'Passer l’intro', + 'videoControls.skipCredits' => 'Passer le générique', + 'videoControls.nextEpisode' => 'Épisode suivant', + 'videoControls.subtitleTrack' => ({required Object n}) => 'Piste ${n}', + 'videoControls.subtitleFile' => ({required Object name}) => 'Sous-titre ${name}', + 'videoControls.forcedTrack' => ({required Object label}) => '${label} (forcé)', + 'videoControls.osdSubtitlesOff' => 'Sous-titres : désactivés', + 'videoControls.osdSubtitles' => ({required Object track}) => 'Sous-titres : ${track}', + 'videoControls.osdAudio' => ({required Object track}) => 'Audio : ${track}', 'messages.markedAsWatched' => 'Marqué comme vu', 'messages.markedAsUnwatched' => 'Marqué comme non vu', 'messages.markedAsWatchedOffline' => 'Marqué comme vu (se synchronisera lorsque vous serez en ligne)', @@ -3252,9 +3385,18 @@ extension on TranslationsFr { 'messages.serverLimitBody' => 'Erreur serveur (HTTP 500). Une limite de bande passante/transcodage a probablement rejeté cette session. Demandez au propriétaire de l\'ajuster.', 'messages.mediaUnreadableTitle' => 'Fichier indisponible', 'messages.mediaUnreadableBody' => 'Le serveur a trouvé cet élément mais n\'a pas pu lire son fichier (HTTP 404). Le fichier a probablement été déplacé, supprimé, ou son stockage est hors ligne. Demandez au propriétaire du serveur de vérifier le fichier et de relancer l\'analyse de la bibliothèque.', + 'messages.serverBusyTitle' => 'Flux indisponible', + 'messages.serverBusyBody' => 'Le serveur a refusé à plusieurs reprises de diffuser ce fichier (HTTP 503). Il est peut-être en cours de redémarrage ou occupé, ou le stockage du fichier est peut-être hors ligne. Réessayez dans un instant. Si le problème persiste, demandez au propriétaire du serveur de vérifier le serveur et le stockage du fichier.', 'messages.logsUploaded' => 'Journaux envoyés', 'messages.logsUploadFailed' => 'Échec de l’envoi des journaux', 'messages.logId' => 'Identifiant du journal', + 'messages.burnedSubtitlesUseMenu' => 'Les sous-titres sont incrustés à l’image de ce flux. Modifiez-les depuis le menu des sous-titres.', + 'messages.noVideoUrl' => 'Aucune URL vidéo disponible', + 'messages.playbackNoMediaSources' => 'Le serveur n’a renvoyé aucune source multimédia lisible', + 'messages.playbackDataNotPrepared' => 'La lecture a été lancée avant que les données nécessaires soient prêtes', + 'messages.streamSelectionUnavailable' => 'La sélection des flux n’est pas disponible pour cette source', + 'messages.streamSelectionFailed' => 'Impossible d’appliquer les flux sélectionnés', + 'messages.serverUnavailableForProfile' => 'Aucun serveur n’est disponible pour le profil actif', 'subtitlingStyling.text' => 'Texte', 'subtitlingStyling.border' => 'Bordure', 'subtitlingStyling.background' => 'Arrière-plan', @@ -3271,6 +3413,8 @@ extension on TranslationsFr { 'subtitlingStyling.overrideStrip' => 'Supprimer le style', 'subtitlingStyling.positionTop' => 'Haut', 'subtitlingStyling.positionBottom' => 'Bas', + 'subtitlingStyling.anchorToScreen' => 'Ancrer à l’écran', + 'subtitlingStyling.anchorToScreenDescription' => 'Afficher les sous-titres textuels dans les bandes noires sous les vidéos en écran large', 'subtitlingStyling.bold' => 'Gras', 'subtitlingStyling.italic' => 'Italique', 'subtitlingStyling.renderResolution' => 'Résolution de rendu', @@ -3353,6 +3497,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.tokenIdentityMismatch' => 'Le jeton du profil Plex correspond à un serveur inattendu', 'connections.sectionTitle' => 'Connexions', 'connections.addConnection' => 'Ajouter une connexion', 'connections.addConnectionSubtitleNoProfile' => 'Connectez-vous avec Plex ou connectez un serveur Jellyfin', @@ -3386,6 +3531,7 @@ extension on TranslationsFr { 'discover.tvShow' => 'Série TV', 'discover.minutesLeft' => ({required Object minutes}) => '${minutes} min restantes', 'discover.moreLikeThis' => 'Plus de contenus similaires', + 'discover.titleCount' => ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('fr'))(n, one: '${n} titre', other: '${n} titres', ), 'errors.searchFailed' => ({required Object error}) => 'Échec de la recherche : ${error}', 'errors.searchUnavailable' => 'La recherche n\'a pu atteindre aucun serveur multimédia.', 'errors.connectionTimeout' => ({required Object context}) => 'Délai d\'attente de connexion dépassé pendant le chargement ${context}', @@ -3558,7 +3704,10 @@ extension on TranslationsFr { 'explore.characters' => 'Personnages', 'explore.addToWatchlist' => 'Ajouter à la liste de suivi', 'explore.removeFromWatchlist' => 'Retirer de la liste de suivi', + 'explore.addedToWatchlist' => 'Ajouté à la liste de suivi', + 'explore.removedFromWatchlist' => 'Retiré de la liste de suivi', 'explore.watchlistUpdateFailed' => 'Impossible de mettre à jour la liste de suivi', + 'explore.watchlistNoMatch' => 'Impossible d’associer cet élément à une liste de suivi', 'explore.notInLibrary' => 'Absent de votre bibliothèque', 'explore.inTheseLibraries' => 'Dans ces bibliothèques', 'explore.checkingLibrary' => 'Vérification de votre bibliothèque...', @@ -3566,6 +3715,8 @@ extension on TranslationsFr { 'explore.emptyMessage' => ({required Object source}) => 'Les lignes de ${source} apparaîtront ici dès qu’elles contiendront des éléments.', 'explore.searchHint' => ({required Object source}) => 'Rechercher dans ${source}', 'explore.searchEmpty' => ({required Object query}) => 'Aucun résultat pour "${query}"', + _ => null, + } ?? switch (path) { 'explore.searchPrompt' => ({required Object source}) => 'Recherchez des films et des séries sur ${source}.', 'explore.searchFailed' => 'Échec de la recherche. Vérifiez votre connexion et réessayez.', 'explore.badge.rankPopular' => ({required Object n}) => '#${n} populaire', @@ -3605,8 +3756,6 @@ extension on TranslationsFr { 'explore.stats.completed' => ({required Object n}) => '${n} l\'ont terminé', 'explore.stats.onHold' => ({required Object n}) => '${n} en pause', 'explore.stats.dropped' => ({required Object n}) => '${n} ont abandonné', - _ => null, - } ?? switch (path) { 'explore.season.winter' => 'Hiver', 'explore.season.spring' => 'Printemps', 'explore.season.summer' => 'Été', @@ -3703,6 +3852,9 @@ extension on TranslationsFr { 'liveTv.watchChannel' => 'Regarder la chaîne', 'liveTv.favorites' => 'Favoris', 'liveTv.reorderFavorites' => 'Réorganiser les favoris', + 'liveTv.noFavoriteChannels' => 'Aucune chaîne favorite', + 'liveTv.noFavoriteChannelsHint' => 'Affichez toutes les chaînes, puis appuyez longuement sur une chaîne pour l’ajouter à vos favoris.', + 'liveTv.showAllChannels' => 'Afficher toutes les chaînes', 'liveTv.favoritesLoadFailed' => 'Impossible de charger les favoris. Vérifiez votre connexion et réessayez.', 'liveTv.favoritesUpdateFailed' => 'Impossible de mettre à jour les favoris. Vérifiez votre connexion et réessayez.', 'liveTv.joinSession' => 'Rejoindre la session en cours', @@ -3742,6 +3894,11 @@ extension on TranslationsFr { 'liveTv.guideReloadRequested' => 'Mise à jour du guide demandée', 'liveTv.rulesProcessRequested' => 'Réévaluation des règles demandée', 'liveTv.recordShow' => 'Enregistrer l\'émission', + 'liveTv.startingInMinutes' => ({required Object minutes}) => 'Commence dans ${minutes} min', + 'liveTv.dayAtTime' => ({required Object day, required Object time}) => '${day} à ${time}', + 'liveTv.invalidPlaybackData' => ({required Object product}) => '${product} a renvoyé des données de lecture de TV en direct non valides', + 'liveTv.failedToStartChannel' => 'Impossible de lancer la chaîne en direct', + 'liveTv.failedToBuildStreamUrl' => 'Impossible de générer l’URL du flux', 'collections.title' => 'Collections', 'collections.collection' => 'Collection', 'collections.empty' => 'La collection est vide', @@ -3810,6 +3967,8 @@ extension on TranslationsFr { 'music.repeat' => 'Répéter', 'music.repeatAll' => 'Tout répéter', 'music.repeatOne' => 'Répéter le titre', + 'music.instantMixNoServer' => 'Aucun serveur n’est disponible pour créer un mix instantané', + 'music.noAudioUrl' => ({required Object track}) => 'Aucune URL audio n’est disponible pour ${track}', 'watchTogether.title' => 'Regarder ensemble', 'watchTogether.description' => 'Regarder du contenu en synchronisation avec vos proches', 'watchTogether.createSession' => 'Créer une session', @@ -3875,6 +4034,7 @@ extension on TranslationsFr { 'watchTogether.removeRoom' => 'Supprimer', 'watchTogether.guestSwitchUnavailable' => 'Impossible de changer — serveur indisponible pour la synchronisation', 'watchTogether.guestSwitchFailed' => 'Impossible de changer — contenu introuvable sur ce serveur', + 'watchTogether.defaultDisplayName' => 'Utilisateur', 'downloads.title' => 'Téléchargements', 'downloads.manage' => 'Gérer', 'downloads.tvShows' => 'Séries TV', @@ -3975,6 +4135,16 @@ extension on TranslationsFr { 'downloads.backgroundWarning.statusUnknown' => 'Pas encore vérifié', 'downloads.backgroundWarning.settingsUnavailable' => 'Impossible d’ouvrir les paramètres système sur cet appareil', 'downloads.backgroundWarning.linkUnavailable' => 'Impossible d’ouvrir dontkillmyapp.com sur cet appareil', + 'downloads.unknownShow' => 'Série inconnue', + 'downloads.unknownSeason' => 'Saison inconnue', + 'downloads.unknownAlbum' => 'Album inconnu', + 'downloads.completedOfTotal' => ({required Object completed, required Object total}) => '${completed}/${total} terminés', + 'downloads.errorFileNotFound' => 'Fichier introuvable (404)', + 'downloads.errorDownloadFailed' => 'Échec du téléchargement', + 'downloads.errorPostProcessing' => ({required Object error}) => 'Échec du post-traitement : ${error}', + 'downloads.notificationDownloading' => 'Téléchargement...', + 'downloads.notificationComplete' => 'Téléchargement terminé', + 'downloads.notificationPaused' => 'Téléchargement en pause', 'shaders.title' => 'Shaders', 'shaders.noShaderDescription' => 'Aucune amélioration vidéo', 'shaders.nvscalerDescription' => 'Mise à l\'échelle NVIDIA pour une vidéo plus nette', @@ -4054,14 +4224,24 @@ extension on TranslationsFr { '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', + 'companionRemote.closedBeforeAuth' => 'La connexion a été fermée avant l’authentification', 'videoSettings.playbackSpeed' => 'Vitesse de lecture', 'videoSettings.normalSpeed' => 'Normale', 'videoSettings.sleepTimerActive' => ({required Object duration}) => 'Actif (${duration})', 'videoSettings.zoom' => 'Zoom', + _ => null, + } ?? switch (path) { 'videoSettings.sleepTimer' => 'Minuterie de mise en veille', 'videoSettings.audioSync' => 'Synchronisation audio', 'videoSettings.subtitleSync' => 'Synchronisation des sous-titres', 'videoSettings.hdr' => 'HDR', + 'videoSettings.hdrUnsupported' => 'Le HDR n’est pas disponible ici : ce compositeur de bureau ou cette sortie vidéo ne permet pas de le transmettre.', + 'videoSettings.hdrToneMapping' => 'Mappage tonal HDR', + 'videoSettings.hdrToneMappingCompositor' => 'Compositeur', + 'videoSettings.hdrToneMappingCompositorDescription' => 'Transmettre les métadonnées HDR de la source et laisser le compositeur de bureau effectuer le mappage.', + 'videoSettings.hdrToneMappingPlayer' => 'Lecteur', + 'videoSettings.hdrToneMappingPlayerDescription' => 'Effectuer dans le lecteur le mappage selon la luminosité maximale de l’écran, puis indiquer le résultat au compositeur.', + 'videoSettings.hdrToneMappingFailed' => 'Impossible de modifier le mappage tonal HDR : le mode précédent reste actif.', 'videoSettings.audioOutput' => 'Sortie audio', 'videoSettings.performanceOverlay' => 'Données de performance', 'videoSettings.audioOutputDolbyAtmos' => 'Dolby Atmos', @@ -4106,6 +4286,16 @@ extension on TranslationsFr { 'performanceOverlay.player' => 'Lecteur', 'performanceOverlay.memory' => 'Mémoire', 'performanceOverlay.uiFps' => 'FPS UI', + 'performanceOverlay.fps' => 'FPS', + 'performanceOverlay.decoderAndroidHw' => 'Matériel Android', + 'performanceOverlay.decoderNvidiaHw' => 'Matériel NVIDIA', + 'performanceOverlay.decoderQualcommHw' => 'Matériel Qualcomm', + 'performanceOverlay.decoderMediatekHw' => 'Matériel MediaTek', + 'performanceOverlay.decoderExynosHw' => 'Matériel Exynos', + 'performanceOverlay.decoderSoftware' => 'Logiciel', + 'performanceOverlay.decoderHardware' => 'Matériel', + 'performanceOverlay.tunnelingActive' => 'Actif', + 'performanceOverlay.dvRpuFailed' => ({required Object converted, required Object failures}) => '${converted} (${failures} échecs)', 'externalPlayer.title' => 'Lecteur externe', 'externalPlayer.useExternalPlayer' => 'Utiliser un lecteur externe', 'externalPlayer.useExternalPlayerDescription' => 'Ouvrir les vidéos dans une autre application', @@ -4119,8 +4309,6 @@ extension on TranslationsFr { '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', @@ -4254,6 +4442,16 @@ extension on TranslationsFr { 'seerr.statusPartiallyAvailable' => 'Partiellement disponible', 'seerr.statusRequested' => 'Demandé', 'seerr.statusProcessing' => 'En cours de traitement', + 'seerr.couldNotReach' => ({required Object url, required Object error}) => 'Impossible de joindre ${url} : ${error}', + 'seerr.noInstanceAtUrl' => ({required Object url, required Object status}) => 'Aucune instance Seerr à l’adresse ${url} (HTTP ${status})', + 'seerr.notInitialized' => 'La configuration initiale de cette instance Seerr n’est pas terminée', + 'seerr.noPlexTokenForReauth' => 'Aucun jeton Plex n’est disponible pour se reconnecter', + 'seerr.noStoredCredentials' => 'Aucun identifiant enregistré n’est disponible pour se reconnecter', + 'seerr.signInRejected' => 'La connexion a été refusée', + 'seerr.noSessionCookie' => 'Seerr n’a pas fourni de cookie de session', + 'seerr.freshCookieRejected' => 'Seerr a refusé le nouveau cookie de session', + 'seerr.noUserInformation' => 'Seerr n’a renvoyé aucune information sur l’utilisateur', + 'seerr.sessionRejectedAfterReauth' => 'La session a été refusée après la reconnexion', 'services.title' => 'Services', 'services.hubSubtitle' => 'Synchronisez votre progression et demandez de nouveaux titres.', 'services.notConnected' => 'Non connecté', @@ -4269,6 +4467,7 @@ extension on TranslationsFr { 'services.names.seerr' => 'Seerr', 'services.names.mdblist' => 'MDBList', 'services.deviceCode.title' => ({required Object service}) => 'Activer Plezy sur ${service}', + 'services.deviceCode.instructions' => 'Scannez le code QR ou accédez à l’adresse ci-dessous et saisissez ce code :', 'services.deviceCode.openToActivate' => ({required Object service}) => 'Ouvrir ${service} pour activer', 'services.deviceCode.copyCode' => 'Copier le code d\'activation', 'services.deviceCode.waitingForAuthorization' => 'En attente d\'autorisation…', @@ -4318,6 +4517,24 @@ extension on TranslationsFr { 'addServer.connectToMediaBrowserCardSubtitleScoped' => ({required Object product, required Object name}) => 'Connectez-vous à votre serveur ${product}. Sera associé à ${name}.', 'addServer.borrowFromAnotherProfile' => 'Emprunter à un autre profil', 'addServer.borrowFromAnotherProfileSubtitle' => 'Réutiliser la connexion d\'un autre profil. Les profils protégés par PIN exigent un PIN.', + 'addServer.invalidCredentials' => 'Nom d’utilisateur ou mot de passe incorrect', + 'addServer.authResponseNotJson' => 'La réponse d’authentification n’était pas au format JSON valide', + 'addServer.quickConnectRejected' => 'Quick Connect a été refusé par le serveur', + 'addServer.quickConnectNotJson' => 'La réponse de Quick Connect n’était pas au format JSON valide', + 'addServer.quickConnectMissingFields' => 'Il manque un code ou un secret dans la réponse de Quick Connect', + 'addServer.quickConnectPollRejected' => 'L’interrogation de Quick Connect a été refusée par le serveur', + 'addServer.serverTimedOut' => 'Le serveur n’a pas répondu à temps', + 'addServer.responseNotJson' => 'La réponse du serveur n’était pas au format JSON valide', + 'addServer.responseMissingIdentity' => ({required Object product}) => 'Il manque un identifiant ou un nom de serveur dans la réponse : s’agit-il d’un serveur ${product} ?', + 'addServer.probeFailed' => ({required Object error}) => 'Impossible de joindre le serveur : ${error}', + 'addServer.enterAtLeastOneUrl' => ({required Object product}) => 'Saisissez l’URL d’au moins un serveur ${product}', + 'addServer.noReachableServer' => ({required Object product}) => 'Aucun serveur ${product} joignable n’a été trouvé', + 'addServer.urlsPointToDifferentServers' => ({required Object product}) => 'Ces URL renvoient vers différents serveurs ${product}', + 'addServer.urlDoesNotMatchServer' => ({required Object product}) => 'Cette URL ne correspond pas au serveur ${product}', + 'addServer.redirectUnsupported' => 'Le serveur a redirigé vers une URL non prise en charge', + 'addServer.redirectDifferentHost' => ({required Object product}) => 'Le serveur a redirigé vers un hôte différent. Saisissez directement l’URL finale du serveur ${product}.', + 'addServer.redirectInsecure' => 'Le serveur a redirigé de HTTPS vers une URL non sécurisée', + 'addServer.redirectUnsupportedEnterFinal' => ({required Object product}) => 'Le serveur a redirigé vers une URL non prise en charge. Saisissez directement l’URL finale du serveur ${product}.', _ => null, }; } diff --git a/lib/i18n/strings_hu.g.dart b/lib/i18n/strings_hu.g.dart index 56cb8686..207dd7d3 100644 --- a/lib/i18n/strings_hu.g.dart +++ b/lib/i18n/strings_hu.g.dart @@ -123,6 +123,7 @@ class _Translations$auth$hu extends Translations$auth$en { @override String get quickConnectCancel => 'Mégse'; @override String get quickConnectExpired => 'A Quick Connect kód lejárt. Próbáld újra.'; @override String get localDataRecoveryRequired => 'A Plezy nem tudta biztonságosan helyreállítani a helyi bejelentkezés és a függőben lévő lejátszás adatait. Jelentkezz be újra.'; + @override String get pinCheckRejected => 'A Plex PIN ellenőrzését elutasították'; } // Path: common @@ -178,6 +179,9 @@ class _Translations$common$hu extends Translations$common$en { @override String get exitFullscreen => 'Kilépés a teljes képernyőből'; @override String get pressBackAgainToExit => 'A kilépéshez nyomd meg újra a Vissza gombot'; @override late final _Translations$common$ratingSource$hu ratingSource = _Translations$common$ratingSource$hu._(_root); + @override String get notAvailable => 'N/A'; + @override String get url => 'URL'; + @override String get letterKeys => 'ABC'; } // Path: screens @@ -444,6 +448,8 @@ class _Translations$settings$hu extends Translations$settings$en { @override String get showNavBarLabels => 'Navigációs sáv címkéinek megjelenítése'; @override String get showNavBarLabelsDescription => 'Szöveges címkék megjelenítése a navigációs sáv ikonjai alatt'; @override String get startupSection => 'Indítási oldal'; + @override String get showExploreTab => 'Felfedezés lap megjelenítése'; + @override String get showExploreTabDescription => 'A Plex Discover és a csatlakoztatott követők tartalmait megjelenítő Felfedezés lap megjelenítése'; @override String get liveTvDefaultFavorites => 'Kedvenc csatornák alapértelmezés szerint'; @override String get liveTvDefaultFavoritesDescription => 'Csak a kedvenc csatornák megjelenítése az Élő TV megnyitásakor'; @override String get display => 'Kijelző'; @@ -455,6 +461,7 @@ class _Translations$settings$hu extends Translations$settings$en { @override String get subtitlesAndConfig => 'Feliratok és konfiguráció'; @override String get seekAndTiming => 'Tekerés és időzítés'; @override String get behavior => 'Viselkedés'; + @override String get exportDialogTitle => 'Plezy-beállítások exportálása'; } // Path: search @@ -606,6 +613,8 @@ class _Translations$fileInfo$hu extends Translations$fileInfo$en { @override String get flagHearingImpaired => 'Nagyothallóknak'; @override String get flagDub => 'Szinkron'; @override String get flagOriginal => 'Eredeti'; + @override String get channelsMono => 'Monó'; + @override String dolbyVisionProfile({required Object profile}) => '${profile} profil'; } // Path: mediaMenu @@ -704,6 +713,11 @@ class _Translations$accessibility$hu extends Translations$accessibility$en { @override String get alphabetScrollHint => 'A betűnkénti léptetéshez pöccints felfelé vagy lefelé'; @override String rowColumnPosition({required Object row, required Object rowCount, required Object column, required Object columnCount}) => '${row}. sor a(z) ${rowCount} sorból, ${column}. oszlop a(z) ${columnCount} oszlopból'; @override String rowPosition({required Object row, required Object rowCount}) => '${row}. sor a(z) ${rowCount} sorból'; + @override String get autoScrollPlay => 'Automatikus görgetés indítása'; + @override String get autoScrollPause => 'Automatikus görgetés szüneteltetése'; + @override String get hueShort => 'H'; + @override String get saturationShort => 'S'; + @override String get valueShort => 'V'; } // Path: tooltips @@ -815,6 +829,15 @@ class _Translations$videoControls$hu extends Translations$videoControls$en { @override String get subtitleDownloadedNotApplied => 'Felirat letöltve, de nem sikerült kiválasztani'; @override String get subtitleDownloadFailed => 'Nem sikerült a felirat letöltése'; @override String get searchLanguages => 'Nyelvek keresése...'; + @override String get skipIntro => 'Főcím átugrása'; + @override String get skipCredits => 'Stáblista átugrása'; + @override String get nextEpisode => 'Következő epizód'; + @override String subtitleTrack({required Object n}) => '${n}. sáv'; + @override String subtitleFile({required Object name}) => '${name} felirat'; + @override String forcedTrack({required Object label}) => '${label} (kényszerített)'; + @override String get osdSubtitlesOff => 'Feliratok: ki'; + @override String osdSubtitles({required Object track}) => 'Feliratok: ${track}'; + @override String osdAudio({required Object track}) => 'Hang: ${track}'; } // Path: messages @@ -876,9 +899,18 @@ class _Translations$messages$hu extends Translations$messages$en { @override String get serverLimitBody => 'Szerverhiba (HTTP 500). A munkamenetet valószínűleg egy sávszélességi vagy átkódolási korlát utasította el. Kérd meg a tulajdonost a korlát módosítására.'; @override String get mediaUnreadableTitle => 'A fájl nem érhető el'; @override String get mediaUnreadableBody => 'A szerver megtalálta ezt az elemet, de nem tudta beolvasni a fájlját (HTTP 404). A fájl valószínűleg áthelyezésre vagy törlésre került, vagy a tárhelye offline. Kérje meg a szerver tulajdonosát, hogy ellenőrizze a fájlt, és vizsgálja újra a könyvtárat.'; + @override String get serverBusyTitle => 'A stream nem érhető el'; + @override String get serverBusyBody => 'A szerver ismételten megtagadta ennek a fájlnak a streamelését (HTTP 503). Lehet, hogy újraindul, túlterhelt, vagy a fájl tárhelye nem érhető el. Próbáld újra egy kis idő múlva – ha a probléma továbbra is fennáll, kérd meg a szerver tulajdonosát, hogy ellenőrizze a szervert és a fájl tárhelyét.'; @override String get logsUploaded => 'Naplók feltöltve'; @override String get logsUploadFailed => 'Nem sikerült a naplók feltöltése'; @override String get logId => 'Naplóazonosító'; + @override String get burnedSubtitlesUseMenu => 'A feliratok bele vannak égetve ebbe a streambe. A feliratmenüben módosíthatod őket.'; + @override String get noVideoUrl => 'Nem érhető el videó-URL'; + @override String get playbackNoMediaSources => 'A szerver nem adott vissza lejátszható médiaforrást'; + @override String get playbackDataNotPrepared => 'A lejátszás az adatok elkészülte előtt indult el'; + @override String get streamSelectionUnavailable => 'Ehhez a forráshoz nem érhető el a streamek kiválasztása'; + @override String get streamSelectionFailed => 'Nem sikerült alkalmazni a kiválasztott streameket'; + @override String get serverUnavailableForProfile => 'Az aktív profilhoz nem érhető el szerver'; } // Path: subtitlingStyling @@ -904,6 +936,8 @@ class _Translations$subtitlingStyling$hu extends Translations$subtitlingStyling$ @override String get overrideStrip => 'Stílus eltávolítása'; @override String get positionTop => 'Fent'; @override String get positionBottom => 'Lent'; + @override String get anchorToScreen => 'Képernyőhöz rögzítés'; + @override String get anchorToScreenDescription => 'A szöveges feliratok megjelenítése a szélesvásznú videó alatti fekete sávban'; @override String get bold => 'Félkövér'; @override String get italic => 'Dőlt'; @override String get renderResolution => 'Renderelési felbontás'; @@ -1013,6 +1047,7 @@ class _Translations$profiles$hu extends Translations$profiles$en { @override String get pinExplain => '4 jegyű PIN-kód szükséges a profilváltáshoz.'; @override String get continueButton => 'Folytatás'; @override String get pinsDontMatch => 'A PIN-kódok nem egyeznek'; + @override String get tokenIdentityMismatch => 'A Plex-profil tokenje nem a várt szerverhez tartozik'; } // Path: connections @@ -1064,6 +1099,10 @@ class _Translations$discover$hu extends Translations$discover$en { @override String get tvShow => 'TV-sorozat'; @override String minutesLeft({required Object minutes}) => '${minutes} perc van hátra'; @override String get moreLikeThis => 'Hasonló tartalmak'; + @override String titleCount({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('hu'))(n, + one: '${n} cím', + other: '${n} cím', + ); } // Path: errors @@ -1276,7 +1315,10 @@ class _Translations$explore$hu extends Translations$explore$en { @override String get characters => 'Karakterek'; @override String get addToWatchlist => 'Hozzáadás a Néznivalókhoz'; @override String get removeFromWatchlist => 'Eltávolítás a Néznivalókból'; + @override String get addedToWatchlist => 'Hozzáadva a figyelőlistához'; + @override String get removedFromWatchlist => 'Eltávolítva a figyelőlistáról'; @override String get watchlistUpdateFailed => 'Nem sikerült a Néznivalók frissítése'; + @override String get watchlistNoMatch => 'Nem sikerült ezt az elemet figyelőlistához társítani'; @override String get notInLibrary => 'Nincs a könyvtáradban'; @override String get inTheseLibraries => 'Ezekben a könyvtárakban'; @override String get checkingLibrary => 'Könyvtár ellenőrzése...'; @@ -1337,6 +1379,9 @@ class _Translations$liveTv$hu extends Translations$liveTv$en { @override String get watchChannel => 'Csatorna nézése'; @override String get favorites => 'Kedvencek'; @override String get reorderFavorites => 'Kedvencek rendezése'; + @override String get noFavoriteChannels => 'Nincsenek kedvenc csatornák'; + @override String get noFavoriteChannelsHint => 'Jelenítsd meg az összes csatornát, majd hosszan nyomj meg egy csatornát, hogy hozzáadd a kedvenceidhez.'; + @override String get showAllChannels => 'Összes csatorna megjelenítése'; @override String get favoritesLoadFailed => 'Nem sikerült a kedvencek betöltése. Ellenőrizd a kapcsolatot és próbáld újra.'; @override String get favoritesUpdateFailed => 'Nem sikerült frissíteni a kedvenceket. Ellenőrizd a kapcsolatot, majd próbáld újra.'; @override String get joinSession => 'Csatlakozás a folyamatban lévő adáshoz'; @@ -1376,6 +1421,11 @@ class _Translations$liveTv$hu extends Translations$liveTv$en { @override String get guideReloadRequested => 'Műsorújság frissítése kérve'; @override String get rulesProcessRequested => 'Szabályok újraértékelése kérve'; @override String get recordShow => 'Műsor rögzítése'; + @override String startingInMinutes({required Object minutes}) => '${minutes} perc múlva kezdődik'; + @override String dayAtTime({required Object day, required Object time}) => '${day}, ${time}'; + @override String invalidPlaybackData({required Object product}) => 'A(z) ${product} érvénytelen Élő TV-lejátszási adatokat adott vissza'; + @override String get failedToStartChannel => 'Nem sikerült elindítani az élő csatornát'; + @override String get failedToBuildStreamUrl => 'Nem sikerült összeállítani a stream URL-címét'; } // Path: collections @@ -1474,6 +1524,8 @@ class _Translations$music$hu extends Translations$music$en { @override String get repeat => 'Ismétlés'; @override String get repeatAll => 'Összes ismétlése'; @override String get repeatOne => 'Egy szám ismétlése'; + @override String get instantMixNoServer => 'Nem érhető el szerver az azonnali mixhez'; + @override String noAudioUrl({required Object track}) => 'Nem érhető el hang-URL ehhez: ${track}'; } // Path: watchTogether @@ -1548,6 +1600,7 @@ class _Translations$watchTogether$hu extends Translations$watchTogether$en { @override String get removeRoom => 'Eltávolítás'; @override String get guestSwitchUnavailable => 'Nem sikerült a váltás — a szerver nem érhető el szinkronizáláshoz'; @override String get guestSwitchFailed => 'Nem sikerült a váltás — a tartalom nem található ezen a szerveren'; + @override String get defaultDisplayName => 'Felhasználó'; } // Path: downloads @@ -1632,6 +1685,16 @@ class _Translations$downloads$hu extends Translations$downloads$en { @override String get syncRuleUnknownServer => 'Ismeretlen szerver'; @override String get syncRuleListCreated => 'Szinkronizálási szabály létrehozva'; @override late final _Translations$downloads$backgroundWarning$hu backgroundWarning = _Translations$downloads$backgroundWarning$hu._(_root); + @override String get unknownShow => 'Ismeretlen sorozat'; + @override String get unknownSeason => 'Ismeretlen évad'; + @override String get unknownAlbum => 'Ismeretlen album'; + @override String completedOfTotal({required Object completed, required Object total}) => '${completed}/${total} kész'; + @override String get errorFileNotFound => 'A fájl nem található (404)'; + @override String get errorDownloadFailed => 'A letöltés nem sikerült'; + @override String errorPostProcessing({required Object error}) => 'Az utófeldolgozás nem sikerült: ${error}'; + @override String get notificationDownloading => 'Letöltés...'; + @override String get notificationComplete => 'Letöltés kész'; + @override String get notificationPaused => 'Letöltés szüneteltetve'; } // Path: shaders @@ -1672,6 +1735,7 @@ class _Translations$companionRemote$hu extends Translations$companionRemote$en { @override late final _Translations$companionRemote$pairing$hu pairing = _Translations$companionRemote$pairing$hu._(_root); @override late final _Translations$companionRemote$remote$hu remote = _Translations$companionRemote$remote$hu._(_root); @override late final _Translations$companionRemote$errors$hu errors = _Translations$companionRemote$errors$hu._(_root); + @override String get closedBeforeAuth => 'A kapcsolat a hitelesítés előtt megszakadt'; } // Path: videoSettings @@ -1689,6 +1753,13 @@ class _Translations$videoSettings$hu extends Translations$videoSettings$en { @override String get audioSync => 'Hang szinkronizálása'; @override String get subtitleSync => 'Felirat szinkronizálása'; @override String get hdr => 'HDR'; + @override String get hdrUnsupported => 'A HDR itt nem érhető el – ez az asztali kompozitor vagy videókimenet nem képes továbbítani.'; + @override String get hdrToneMapping => 'HDR-tónusleképezés'; + @override String get hdrToneMappingCompositor => 'Kompozitor'; + @override String get hdrToneMappingCompositorDescription => 'Továbbítja a forrás HDR-metaadatait, és az asztali kompozitorra bízza a tónusleképezést.'; + @override String get hdrToneMappingPlayer => 'Lejátszó'; + @override String get hdrToneMappingPlayerDescription => 'A lejátszóban a kijelző maximális fényerejéhez igazítja a képet, majd közli az eredményt a kompozitorral.'; + @override String get hdrToneMappingFailed => 'Nem sikerült módosítani a HDR-tónusleképezést – továbbra is az előző mód aktív.'; @override String get audioOutput => 'Hangkimenet'; @override String get performanceOverlay => 'Teljesítményadatok'; @override String get audioOutputDolbyAtmos => 'Dolby Atmos'; @@ -1742,6 +1813,16 @@ class _Translations$performanceOverlay$hu extends Translations$performanceOverla @override String get player => 'Lejátszó'; @override String get memory => 'Memória'; @override String get uiFps => 'Felület-FPS'; + @override String get fps => 'FPS'; + @override String get decoderAndroidHw => 'Android HW'; + @override String get decoderNvidiaHw => 'NVIDIA HW'; + @override String get decoderQualcommHw => 'Qualcomm HW'; + @override String get decoderMediatekHw => 'MediaTek HW'; + @override String get decoderExynosHw => 'Exynos HW'; + @override String get decoderSoftware => 'Szoftveres'; + @override String get decoderHardware => 'Hardveres'; + @override String get tunnelingActive => 'Aktív'; + @override String dvRpuFailed({required Object converted, required Object failures}) => '${converted} (${failures} sikertelen)'; } // Path: externalPlayer @@ -1942,6 +2023,16 @@ class _Translations$seerr$hu extends Translations$seerr$en { @override String get statusPartiallyAvailable => 'Részben elérhető'; @override String get statusRequested => 'Igényelve'; @override String get statusProcessing => 'Feldolgozás alatt'; + @override String couldNotReach({required Object url, required Object error}) => 'Nem sikerült elérni ezt: ${url}: ${error}'; + @override String noInstanceAtUrl({required Object url, required Object status}) => 'Nem található Seerr-példány ezen a címen: ${url} (HTTP ${status})'; + @override String get notInitialized => 'Ennek a Seerr-példánynak a kezdeti beállítása még nem fejeződött be'; + @override String get noPlexTokenForReauth => 'Nem áll rendelkezésre Plex-token az újbóli bejelentkezéshez'; + @override String get noStoredCredentials => 'Nem állnak rendelkezésre mentett hitelesítő adatok az újbóli bejelentkezéshez'; + @override String get signInRejected => 'A bejelentkezést elutasították'; + @override String get noSessionCookie => 'A Seerr nem adott ki munkamenet-sütit'; + @override String get freshCookieRejected => 'A Seerr elutasította az új munkamenet-sütit'; + @override String get noUserInformation => 'A Seerr nem adott vissza felhasználói adatokat'; + @override String get sessionRejectedAfterReauth => 'A munkamenetet az újbóli bejelentkezés után elutasították'; } // Path: services @@ -2002,6 +2093,24 @@ class _Translations$addServer$hu extends Translations$addServer$en { @override String connectToMediaBrowserCardSubtitleScoped({required Object product, required Object name}) => 'Jelentkezzen be a(z) ${product} szerverére. A(z) ${name} szolgáltatáshoz kötődik.'; @override String get borrowFromAnotherProfile => 'Kapcsolat használata másik profilból'; @override String get borrowFromAnotherProfileSubtitle => 'Egy másik profil kapcsolatának használata. A PIN-kóddal védett profilokhoz PIN-kód szükséges.'; + @override String get invalidCredentials => 'Érvénytelen felhasználónév vagy jelszó'; + @override String get authResponseNotJson => 'A hitelesítési válasz nem érvényes JSON'; + @override String get quickConnectRejected => 'A szerver elutasította a Quick Connect-kérést'; + @override String get quickConnectNotJson => 'A Quick Connect válasza nem érvényes JSON'; + @override String get quickConnectMissingFields => 'A Quick Connect válaszából hiányzik a kód vagy a titkos kulcs'; + @override String get quickConnectPollRejected => 'A szerver elutasította a Quick Connect lekérdezését'; + @override String get serverTimedOut => 'A szerver nem válaszolt időben'; + @override String get responseNotJson => 'A szerver válasza nem érvényes JSON'; + @override String responseMissingIdentity({required Object product}) => 'A válaszból hiányzik az azonosító vagy a szerver neve – ez valóban ${product}-szerver?'; + @override String probeFailed({required Object error}) => 'Nem sikerült elérni a szervert: ${error}'; + @override String enterAtLeastOneUrl({required Object product}) => 'Adj meg legalább egy ${product}-szerverhez tartozó URL-t'; + @override String noReachableServer({required Object product}) => 'Nem található elérhető ${product}-szerver'; + @override String urlsPointToDifferentServers({required Object product}) => 'Ezek az URL-ek különböző ${product}-szerverekre mutatnak'; + @override String urlDoesNotMatchServer({required Object product}) => 'Ez az URL nem egyezik a(z) ${product}-szerverrel'; + @override String get redirectUnsupported => 'A szerver nem támogatott URL-re irányított át'; + @override String redirectDifferentHost({required Object product}) => 'A szerver egy másik gazdagépre irányított át. Add meg közvetlenül a végleges ${product} URL-t.'; + @override String get redirectInsecure => 'A szerver HTTPS-ről nem biztonságos URL-re irányított át'; + @override String redirectUnsupportedEnterFinal({required Object product}) => 'A szerver nem támogatott URL-re irányított át. Add meg közvetlenül a végleges ${product} URL-t.'; } // Path: common.ratingSource @@ -2521,6 +2630,7 @@ class _Translations$services$deviceCode$hu extends Translations$services$deviceC // Translations @override String title({required Object service}) => 'Plezy aktiválása a következőn: ${service}'; + @override String get instructions => 'Olvasd be a QR-kódot, vagy nyisd meg az alábbi címet, és írd be ezt a kódot:'; @override String openToActivate({required Object service}) => 'Nyisd meg a(z) ${service} oldalt az aktiváláshoz'; @override String get copyCode => 'Aktiválási kód másolása'; @override String get waitingForAuthorization => 'Várakozás az engedélyezésre…'; @@ -2595,6 +2705,7 @@ extension on TranslationsHu { 'auth.quickConnectCancel' => 'Mégse', 'auth.quickConnectExpired' => 'A Quick Connect kód lejárt. Próbáld újra.', 'auth.localDataRecoveryRequired' => 'A Plezy nem tudta biztonságosan helyreállítani a helyi bejelentkezés és a függőben lévő lejátszás adatait. Jelentkezz be újra.', + 'auth.pinCheckRejected' => 'A Plex PIN ellenőrzését elutasították', 'common.cancel' => 'Mégse', 'common.save' => 'Mentés', 'common.close' => 'Bezárás', @@ -2651,6 +2762,9 @@ extension on TranslationsHu { 'common.ratingSource.trakt' => 'Trakt', 'common.ratingSource.rottenTomatoesCritic' => 'Rotten Tomatoes kritikusok', 'common.ratingSource.rottenTomatoesAudience' => 'Rotten Tomatoes közönség', + 'common.notAvailable' => 'N/A', + 'common.url' => 'URL', + 'common.letterKeys' => 'ABC', 'screens.licenses' => 'Licencek', 'screens.switchProfile' => 'Profilváltás', 'screens.subtitleStyling' => 'Feliratok stílusa', @@ -2890,6 +3004,8 @@ extension on TranslationsHu { 'settings.showNavBarLabels' => 'Navigációs sáv címkéinek megjelenítése', 'settings.showNavBarLabelsDescription' => 'Szöveges címkék megjelenítése a navigációs sáv ikonjai alatt', 'settings.startupSection' => 'Indítási oldal', + 'settings.showExploreTab' => 'Felfedezés lap megjelenítése', + 'settings.showExploreTabDescription' => 'A Plex Discover és a csatlakoztatott követők tartalmait megjelenítő Felfedezés lap megjelenítése', 'settings.liveTvDefaultFavorites' => 'Kedvenc csatornák alapértelmezés szerint', 'settings.liveTvDefaultFavoritesDescription' => 'Csak a kedvenc csatornák megjelenítése az Élő TV megnyitásakor', 'settings.display' => 'Kijelző', @@ -2901,6 +3017,7 @@ extension on TranslationsHu { 'settings.subtitlesAndConfig' => 'Feliratok és konfiguráció', 'settings.seekAndTiming' => 'Tekerés és időzítés', 'settings.behavior' => 'Viselkedés', + 'settings.exportDialogTitle' => 'Plezy-beállítások exportálása', 'search.hint' => 'Keresés filmek, sorozatok és zenék között...', 'search.tryDifferentTerm' => 'Próbálj másik keresési kifejezést', 'search.searchYourMedia' => 'Keresés a saját médiatartalmak között', @@ -3049,6 +3166,8 @@ extension on TranslationsHu { 'fileInfo.flagHearingImpaired' => 'Nagyothallóknak', 'fileInfo.flagDub' => 'Szinkron', 'fileInfo.flagOriginal' => 'Eredeti', + 'fileInfo.channelsMono' => 'Monó', + 'fileInfo.dolbyVisionProfile' => ({required Object profile}) => '${profile} profil', 'mediaMenu.markAsWatched' => 'Megjelölés megtekintettként', 'mediaMenu.markAsUnwatched' => 'Megjelölés nem megtekintettként', 'mediaMenu.removeFromContinueWatching' => 'Eltávolítás a folytatásból', @@ -3082,6 +3201,8 @@ extension on TranslationsHu { 'mediaMenu.rate' => 'Értékelés', 'mediaMenu.playFromBeginning' => 'Lejátszás az elejétől', 'mediaMenu.playVersion' => 'Verzió lejátszása...', + _ => null, + } ?? switch (path) { 'rateSheet.title' => 'Értékelés', 'rateSheet.server' => 'Szerver', 'rateSheet.favorite' => 'Kedvenc', @@ -3091,8 +3212,6 @@ extension on TranslationsHu { 'rateSheet.noConnectedServices' => 'Az értékeléshez csatlakoztass egy szolgáltatást a Beállításokban.', 'accessibility.mediaCardMovie' => ({required Object title}) => '${title}, film', 'accessibility.mediaCardShow' => ({required Object title}) => '${title}, TV-sorozat', - _ => null, - } ?? switch (path) { 'accessibility.mediaCardEpisode' => ({required Object title, required Object episodeInfo}) => '${title}, ${episodeInfo}', 'accessibility.mediaCardSeason' => ({required Object title, required Object seasonInfo}) => '${title}, ${seasonInfo}', 'accessibility.mediaCardWatched' => 'megtekintve', @@ -3113,6 +3232,11 @@ extension on TranslationsHu { 'accessibility.alphabetScrollHint' => 'A betűnkénti léptetéshez pöccints felfelé vagy lefelé', 'accessibility.rowColumnPosition' => ({required Object row, required Object rowCount, required Object column, required Object columnCount}) => '${row}. sor a(z) ${rowCount} sorból, ${column}. oszlop a(z) ${columnCount} oszlopból', 'accessibility.rowPosition' => ({required Object row, required Object rowCount}) => '${row}. sor a(z) ${rowCount} sorból', + 'accessibility.autoScrollPlay' => 'Automatikus görgetés indítása', + 'accessibility.autoScrollPause' => 'Automatikus görgetés szüneteltetése', + 'accessibility.hueShort' => 'H', + 'accessibility.saturationShort' => 'S', + 'accessibility.valueShort' => 'V', 'tooltips.shufflePlay' => 'Véletlenszerű lejátszás', 'tooltips.playTrailer' => 'Előzetes lejátszása', 'tooltips.markAsWatched' => 'Megjelölés megtekintettként', @@ -3203,6 +3327,15 @@ extension on TranslationsHu { 'videoControls.subtitleDownloadedNotApplied' => 'Felirat letöltve, de nem sikerült kiválasztani', 'videoControls.subtitleDownloadFailed' => 'Nem sikerült a felirat letöltése', 'videoControls.searchLanguages' => 'Nyelvek keresése...', + 'videoControls.skipIntro' => 'Főcím átugrása', + 'videoControls.skipCredits' => 'Stáblista átugrása', + 'videoControls.nextEpisode' => 'Következő epizód', + 'videoControls.subtitleTrack' => ({required Object n}) => '${n}. sáv', + 'videoControls.subtitleFile' => ({required Object name}) => '${name} felirat', + 'videoControls.forcedTrack' => ({required Object label}) => '${label} (kényszerített)', + 'videoControls.osdSubtitlesOff' => 'Feliratok: ki', + 'videoControls.osdSubtitles' => ({required Object track}) => 'Feliratok: ${track}', + 'videoControls.osdAudio' => ({required Object track}) => 'Hang: ${track}', 'messages.markedAsWatched' => 'Megjelölve megtekintettként', 'messages.markedAsUnwatched' => 'Megjelölve nem megtekintettként', 'messages.markedAsWatchedOffline' => 'Megjelölve megtekintettként (szinkronizálás online állapotban)', @@ -3252,9 +3385,18 @@ extension on TranslationsHu { 'messages.serverLimitBody' => 'Szerverhiba (HTTP 500). A munkamenetet valószínűleg egy sávszélességi vagy átkódolási korlát utasította el. Kérd meg a tulajdonost a korlát módosítására.', 'messages.mediaUnreadableTitle' => 'A fájl nem érhető el', 'messages.mediaUnreadableBody' => 'A szerver megtalálta ezt az elemet, de nem tudta beolvasni a fájlját (HTTP 404). A fájl valószínűleg áthelyezésre vagy törlésre került, vagy a tárhelye offline. Kérje meg a szerver tulajdonosát, hogy ellenőrizze a fájlt, és vizsgálja újra a könyvtárat.', + 'messages.serverBusyTitle' => 'A stream nem érhető el', + 'messages.serverBusyBody' => 'A szerver ismételten megtagadta ennek a fájlnak a streamelését (HTTP 503). Lehet, hogy újraindul, túlterhelt, vagy a fájl tárhelye nem érhető el. Próbáld újra egy kis idő múlva – ha a probléma továbbra is fennáll, kérd meg a szerver tulajdonosát, hogy ellenőrizze a szervert és a fájl tárhelyét.', 'messages.logsUploaded' => 'Naplók feltöltve', 'messages.logsUploadFailed' => 'Nem sikerült a naplók feltöltése', 'messages.logId' => 'Naplóazonosító', + 'messages.burnedSubtitlesUseMenu' => 'A feliratok bele vannak égetve ebbe a streambe. A feliratmenüben módosíthatod őket.', + 'messages.noVideoUrl' => 'Nem érhető el videó-URL', + 'messages.playbackNoMediaSources' => 'A szerver nem adott vissza lejátszható médiaforrást', + 'messages.playbackDataNotPrepared' => 'A lejátszás az adatok elkészülte előtt indult el', + 'messages.streamSelectionUnavailable' => 'Ehhez a forráshoz nem érhető el a streamek kiválasztása', + 'messages.streamSelectionFailed' => 'Nem sikerült alkalmazni a kiválasztott streameket', + 'messages.serverUnavailableForProfile' => 'Az aktív profilhoz nem érhető el szerver', 'subtitlingStyling.text' => 'Szöveg', 'subtitlingStyling.border' => 'Keret', 'subtitlingStyling.background' => 'Háttér', @@ -3271,6 +3413,8 @@ extension on TranslationsHu { 'subtitlingStyling.overrideStrip' => 'Stílus eltávolítása', 'subtitlingStyling.positionTop' => 'Fent', 'subtitlingStyling.positionBottom' => 'Lent', + 'subtitlingStyling.anchorToScreen' => 'Képernyőhöz rögzítés', + 'subtitlingStyling.anchorToScreenDescription' => 'A szöveges feliratok megjelenítése a szélesvásznú videó alatti fekete sávban', 'subtitlingStyling.bold' => 'Félkövér', 'subtitlingStyling.italic' => 'Dőlt', 'subtitlingStyling.renderResolution' => 'Renderelési felbontás', @@ -3353,6 +3497,7 @@ extension on TranslationsHu { 'profiles.pinExplain' => '4 jegyű PIN-kód szükséges a profilváltáshoz.', 'profiles.continueButton' => 'Folytatás', 'profiles.pinsDontMatch' => 'A PIN-kódok nem egyeznek', + 'profiles.tokenIdentityMismatch' => 'A Plex-profil tokenje nem a várt szerverhez tartozik', 'connections.sectionTitle' => 'Kapcsolatok', 'connections.addConnection' => 'Kapcsolat hozzáadása', 'connections.addConnectionSubtitleNoProfile' => 'Jelentkezz be Plexszel, vagy csatlakoztass egy Jellyfin-szervert', @@ -3386,6 +3531,7 @@ extension on TranslationsHu { 'discover.tvShow' => 'TV-sorozat', 'discover.minutesLeft' => ({required Object minutes}) => '${minutes} perc van hátra', 'discover.moreLikeThis' => 'Hasonló tartalmak', + 'discover.titleCount' => ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('hu'))(n, one: '${n} cím', other: '${n} cím', ), 'errors.searchFailed' => ({required Object error}) => 'Keresés sikertelen: ${error}', 'errors.searchUnavailable' => 'A keresés egyetlen médiaszervert sem tudott elérni.', 'errors.connectionTimeout' => ({required Object context}) => 'Hálózati időtúllépés a következő betöltésekor: ${context}', @@ -3558,7 +3704,10 @@ extension on TranslationsHu { 'explore.characters' => 'Karakterek', 'explore.addToWatchlist' => 'Hozzáadás a Néznivalókhoz', 'explore.removeFromWatchlist' => 'Eltávolítás a Néznivalókból', + 'explore.addedToWatchlist' => 'Hozzáadva a figyelőlistához', + 'explore.removedFromWatchlist' => 'Eltávolítva a figyelőlistáról', 'explore.watchlistUpdateFailed' => 'Nem sikerült a Néznivalók frissítése', + 'explore.watchlistNoMatch' => 'Nem sikerült ezt az elemet figyelőlistához társítani', 'explore.notInLibrary' => 'Nincs a könyvtáradban', 'explore.inTheseLibraries' => 'Ezekben a könyvtárakban', 'explore.checkingLibrary' => 'Könyvtár ellenőrzése...', @@ -3566,6 +3715,8 @@ extension on TranslationsHu { 'explore.emptyMessage' => ({required Object source}) => 'A(z) ${source} forrásból származó sorok itt fognak megjelenni, amint van tartalmuk.', 'explore.searchHint' => ({required Object source}) => 'Keresés itt: ${source}', 'explore.searchEmpty' => ({required Object query}) => 'Nincs találat a következőre: "${query}"', + _ => null, + } ?? switch (path) { 'explore.searchPrompt' => ({required Object source}) => 'Filmek és sorozatok keresése a következőn: ${source}.', 'explore.searchFailed' => 'A keresés nem sikerült. Ellenőrizd a kapcsolatot és próbáld újra.', 'explore.badge.rankPopular' => ({required Object n}) => '#${n} népszerű', @@ -3605,8 +3756,6 @@ extension on TranslationsHu { 'explore.stats.completed' => ({required Object n}) => '${n} befejezte', 'explore.stats.onHold' => ({required Object n}) => '${n} szünetelteti', 'explore.stats.dropped' => ({required Object n}) => '${n} felhagyott vele', - _ => null, - } ?? switch (path) { 'explore.season.winter' => 'Tél', 'explore.season.spring' => 'Tavasz', 'explore.season.summer' => 'Nyár', @@ -3703,6 +3852,9 @@ extension on TranslationsHu { 'liveTv.watchChannel' => 'Csatorna nézése', 'liveTv.favorites' => 'Kedvencek', 'liveTv.reorderFavorites' => 'Kedvencek rendezése', + 'liveTv.noFavoriteChannels' => 'Nincsenek kedvenc csatornák', + 'liveTv.noFavoriteChannelsHint' => 'Jelenítsd meg az összes csatornát, majd hosszan nyomj meg egy csatornát, hogy hozzáadd a kedvenceidhez.', + 'liveTv.showAllChannels' => 'Összes csatorna megjelenítése', 'liveTv.favoritesLoadFailed' => 'Nem sikerült a kedvencek betöltése. Ellenőrizd a kapcsolatot és próbáld újra.', 'liveTv.favoritesUpdateFailed' => 'Nem sikerült frissíteni a kedvenceket. Ellenőrizd a kapcsolatot, majd próbáld újra.', 'liveTv.joinSession' => 'Csatlakozás a folyamatban lévő adáshoz', @@ -3742,6 +3894,11 @@ extension on TranslationsHu { 'liveTv.guideReloadRequested' => 'Műsorújság frissítése kérve', 'liveTv.rulesProcessRequested' => 'Szabályok újraértékelése kérve', 'liveTv.recordShow' => 'Műsor rögzítése', + 'liveTv.startingInMinutes' => ({required Object minutes}) => '${minutes} perc múlva kezdődik', + 'liveTv.dayAtTime' => ({required Object day, required Object time}) => '${day}, ${time}', + 'liveTv.invalidPlaybackData' => ({required Object product}) => 'A(z) ${product} érvénytelen Élő TV-lejátszási adatokat adott vissza', + 'liveTv.failedToStartChannel' => 'Nem sikerült elindítani az élő csatornát', + 'liveTv.failedToBuildStreamUrl' => 'Nem sikerült összeállítani a stream URL-címét', 'collections.title' => 'Gyűjtemények', 'collections.collection' => 'Gyűjtemény', 'collections.empty' => 'A gyűjtemény üres', @@ -3810,6 +3967,8 @@ extension on TranslationsHu { 'music.repeat' => 'Ismétlés', 'music.repeatAll' => 'Összes ismétlése', 'music.repeatOne' => 'Egy szám ismétlése', + 'music.instantMixNoServer' => 'Nem érhető el szerver az azonnali mixhez', + 'music.noAudioUrl' => ({required Object track}) => 'Nem érhető el hang-URL ehhez: ${track}', 'watchTogether.title' => 'Watch Together (Közös nézés)', 'watchTogether.description' => 'Nézz tartalmat szinkronban barátaiddal és családoddal', 'watchTogether.createSession' => 'Munkamenet létrehozása', @@ -3875,6 +4034,7 @@ extension on TranslationsHu { 'watchTogether.removeRoom' => 'Eltávolítás', 'watchTogether.guestSwitchUnavailable' => 'Nem sikerült a váltás — a szerver nem érhető el szinkronizáláshoz', 'watchTogether.guestSwitchFailed' => 'Nem sikerült a váltás — a tartalom nem található ezen a szerveren', + 'watchTogether.defaultDisplayName' => 'Felhasználó', 'downloads.title' => 'Letöltések', 'downloads.manage' => 'Kezelés', 'downloads.tvShows' => 'TV-sorozatok', @@ -3975,6 +4135,16 @@ extension on TranslationsHu { 'downloads.backgroundWarning.statusUnknown' => 'Még nincs ellenőrizve', 'downloads.backgroundWarning.settingsUnavailable' => 'Ezen az eszközön nem sikerült megnyitni a rendszerbeállításokat', 'downloads.backgroundWarning.linkUnavailable' => 'Ezen az eszközön nem sikerült megnyitni a dontkillmyapp.com webhelyet', + 'downloads.unknownShow' => 'Ismeretlen sorozat', + 'downloads.unknownSeason' => 'Ismeretlen évad', + 'downloads.unknownAlbum' => 'Ismeretlen album', + 'downloads.completedOfTotal' => ({required Object completed, required Object total}) => '${completed}/${total} kész', + 'downloads.errorFileNotFound' => 'A fájl nem található (404)', + 'downloads.errorDownloadFailed' => 'A letöltés nem sikerült', + 'downloads.errorPostProcessing' => ({required Object error}) => 'Az utófeldolgozás nem sikerült: ${error}', + 'downloads.notificationDownloading' => 'Letöltés...', + 'downloads.notificationComplete' => 'Letöltés kész', + 'downloads.notificationPaused' => 'Letöltés szüneteltetve', 'shaders.title' => 'Shaderek', 'shaders.noShaderDescription' => 'Nincs videójavítás', 'shaders.nvscalerDescription' => 'NVIDIA képskálázás az élesebb videóért', @@ -4054,14 +4224,24 @@ extension on TranslationsHu { 'companionRemote.errors.failedToConnectAnyAddress' => 'Egyetlen címhez sem sikerült csatlakozni', 'companionRemote.errors.connectionLostAfterAttempts' => ({required Object attempts}) => 'A kapcsolat megszakadt ${attempts} próbálkozás után', 'companionRemote.errors.connectionLost' => 'A kapcsolat megszakadt', + 'companionRemote.closedBeforeAuth' => 'A kapcsolat a hitelesítés előtt megszakadt', 'videoSettings.playbackSpeed' => 'Lejátszási sebesség', 'videoSettings.normalSpeed' => 'Normál', 'videoSettings.sleepTimerActive' => ({required Object duration}) => 'Aktív (${duration})', 'videoSettings.zoom' => 'Nagyítás', + _ => null, + } ?? switch (path) { 'videoSettings.sleepTimer' => 'Elalvási időzítő', 'videoSettings.audioSync' => 'Hang szinkronizálása', 'videoSettings.subtitleSync' => 'Felirat szinkronizálása', 'videoSettings.hdr' => 'HDR', + 'videoSettings.hdrUnsupported' => 'A HDR itt nem érhető el – ez az asztali kompozitor vagy videókimenet nem képes továbbítani.', + 'videoSettings.hdrToneMapping' => 'HDR-tónusleképezés', + 'videoSettings.hdrToneMappingCompositor' => 'Kompozitor', + 'videoSettings.hdrToneMappingCompositorDescription' => 'Továbbítja a forrás HDR-metaadatait, és az asztali kompozitorra bízza a tónusleképezést.', + 'videoSettings.hdrToneMappingPlayer' => 'Lejátszó', + 'videoSettings.hdrToneMappingPlayerDescription' => 'A lejátszóban a kijelző maximális fényerejéhez igazítja a képet, majd közli az eredményt a kompozitorral.', + 'videoSettings.hdrToneMappingFailed' => 'Nem sikerült módosítani a HDR-tónusleképezést – továbbra is az előző mód aktív.', 'videoSettings.audioOutput' => 'Hangkimenet', 'videoSettings.performanceOverlay' => 'Teljesítményadatok', 'videoSettings.audioOutputDolbyAtmos' => 'Dolby Atmos', @@ -4106,6 +4286,16 @@ extension on TranslationsHu { 'performanceOverlay.player' => 'Lejátszó', 'performanceOverlay.memory' => 'Memória', 'performanceOverlay.uiFps' => 'Felület-FPS', + 'performanceOverlay.fps' => 'FPS', + 'performanceOverlay.decoderAndroidHw' => 'Android HW', + 'performanceOverlay.decoderNvidiaHw' => 'NVIDIA HW', + 'performanceOverlay.decoderQualcommHw' => 'Qualcomm HW', + 'performanceOverlay.decoderMediatekHw' => 'MediaTek HW', + 'performanceOverlay.decoderExynosHw' => 'Exynos HW', + 'performanceOverlay.decoderSoftware' => 'Szoftveres', + 'performanceOverlay.decoderHardware' => 'Hardveres', + 'performanceOverlay.tunnelingActive' => 'Aktív', + 'performanceOverlay.dvRpuFailed' => ({required Object converted, required Object failures}) => '${converted} (${failures} sikertelen)', 'externalPlayer.title' => 'Külső lejátszó', 'externalPlayer.useExternalPlayer' => 'Külső lejátszó használata', 'externalPlayer.useExternalPlayerDescription' => 'Videók megnyitása egy másik alkalmazásban', @@ -4119,8 +4309,6 @@ extension on TranslationsHu { 'externalPlayer.playerPackage' => 'Csomagnév', 'externalPlayer.playerUrlScheme' => 'URL-séma', 'externalPlayer.off' => 'Ki', - _ => null, - } ?? switch (path) { 'externalPlayer.launchFailed' => 'Nem sikerült megnyitni a külső lejátszót', 'externalPlayer.appNotInstalled' => ({required Object name}) => 'A(z) ${name} nincs telepítve', 'externalPlayer.playInExternalPlayer' => 'Lejátszás külső lejátszóban', @@ -4254,6 +4442,16 @@ extension on TranslationsHu { 'seerr.statusPartiallyAvailable' => 'Részben elérhető', 'seerr.statusRequested' => 'Igényelve', 'seerr.statusProcessing' => 'Feldolgozás alatt', + 'seerr.couldNotReach' => ({required Object url, required Object error}) => 'Nem sikerült elérni ezt: ${url}: ${error}', + 'seerr.noInstanceAtUrl' => ({required Object url, required Object status}) => 'Nem található Seerr-példány ezen a címen: ${url} (HTTP ${status})', + 'seerr.notInitialized' => 'Ennek a Seerr-példánynak a kezdeti beállítása még nem fejeződött be', + 'seerr.noPlexTokenForReauth' => 'Nem áll rendelkezésre Plex-token az újbóli bejelentkezéshez', + 'seerr.noStoredCredentials' => 'Nem állnak rendelkezésre mentett hitelesítő adatok az újbóli bejelentkezéshez', + 'seerr.signInRejected' => 'A bejelentkezést elutasították', + 'seerr.noSessionCookie' => 'A Seerr nem adott ki munkamenet-sütit', + 'seerr.freshCookieRejected' => 'A Seerr elutasította az új munkamenet-sütit', + 'seerr.noUserInformation' => 'A Seerr nem adott vissza felhasználói adatokat', + 'seerr.sessionRejectedAfterReauth' => 'A munkamenetet az újbóli bejelentkezés után elutasították', 'services.title' => 'Szolgáltatások', 'services.hubSubtitle' => 'Megtekintési haladás szinkronizálása és új tartalmak igénylése.', 'services.notConnected' => 'Nincs csatlakoztatva', @@ -4269,6 +4467,7 @@ extension on TranslationsHu { 'services.names.seerr' => 'Seerr', 'services.names.mdblist' => 'MDBList', 'services.deviceCode.title' => ({required Object service}) => 'Plezy aktiválása a következőn: ${service}', + 'services.deviceCode.instructions' => 'Olvasd be a QR-kódot, vagy nyisd meg az alábbi címet, és írd be ezt a kódot:', 'services.deviceCode.openToActivate' => ({required Object service}) => 'Nyisd meg a(z) ${service} oldalt az aktiváláshoz', 'services.deviceCode.copyCode' => 'Aktiválási kód másolása', 'services.deviceCode.waitingForAuthorization' => 'Várakozás az engedélyezésre…', @@ -4318,6 +4517,24 @@ extension on TranslationsHu { 'addServer.connectToMediaBrowserCardSubtitleScoped' => ({required Object product, required Object name}) => 'Jelentkezzen be a(z) ${product} szerverére. A(z) ${name} szolgáltatáshoz kötődik.', 'addServer.borrowFromAnotherProfile' => 'Kapcsolat használata másik profilból', 'addServer.borrowFromAnotherProfileSubtitle' => 'Egy másik profil kapcsolatának használata. A PIN-kóddal védett profilokhoz PIN-kód szükséges.', + 'addServer.invalidCredentials' => 'Érvénytelen felhasználónév vagy jelszó', + 'addServer.authResponseNotJson' => 'A hitelesítési válasz nem érvényes JSON', + 'addServer.quickConnectRejected' => 'A szerver elutasította a Quick Connect-kérést', + 'addServer.quickConnectNotJson' => 'A Quick Connect válasza nem érvényes JSON', + 'addServer.quickConnectMissingFields' => 'A Quick Connect válaszából hiányzik a kód vagy a titkos kulcs', + 'addServer.quickConnectPollRejected' => 'A szerver elutasította a Quick Connect lekérdezését', + 'addServer.serverTimedOut' => 'A szerver nem válaszolt időben', + 'addServer.responseNotJson' => 'A szerver válasza nem érvényes JSON', + 'addServer.responseMissingIdentity' => ({required Object product}) => 'A válaszból hiányzik az azonosító vagy a szerver neve – ez valóban ${product}-szerver?', + 'addServer.probeFailed' => ({required Object error}) => 'Nem sikerült elérni a szervert: ${error}', + 'addServer.enterAtLeastOneUrl' => ({required Object product}) => 'Adj meg legalább egy ${product}-szerverhez tartozó URL-t', + 'addServer.noReachableServer' => ({required Object product}) => 'Nem található elérhető ${product}-szerver', + 'addServer.urlsPointToDifferentServers' => ({required Object product}) => 'Ezek az URL-ek különböző ${product}-szerverekre mutatnak', + 'addServer.urlDoesNotMatchServer' => ({required Object product}) => 'Ez az URL nem egyezik a(z) ${product}-szerverrel', + 'addServer.redirectUnsupported' => 'A szerver nem támogatott URL-re irányított át', + 'addServer.redirectDifferentHost' => ({required Object product}) => 'A szerver egy másik gazdagépre irányított át. Add meg közvetlenül a végleges ${product} URL-t.', + 'addServer.redirectInsecure' => 'A szerver HTTPS-ről nem biztonságos URL-re irányított át', + 'addServer.redirectUnsupportedEnterFinal' => ({required Object product}) => 'A szerver nem támogatott URL-re irányított át. Add meg közvetlenül a végleges ${product} URL-t.', _ => null, }; } diff --git a/lib/i18n/strings_it.g.dart b/lib/i18n/strings_it.g.dart index dfdeeb97..aa7a4228 100644 --- a/lib/i18n/strings_it.g.dart +++ b/lib/i18n/strings_it.g.dart @@ -123,6 +123,7 @@ class _Translations$auth$it extends Translations$auth$en { @override String get quickConnectCancel => 'Annulla'; @override String get quickConnectExpired => 'Quick Connect scaduto. Riprova.'; @override String get localDataRecoveryRequired => 'Plezy non è riuscito a recuperare in sicurezza i dati locali di accesso e delle riproduzioni in sospeso. Accedi di nuovo.'; + @override String get pinCheckRejected => 'La verifica del PIN Plex è stata rifiutata'; } // Path: common @@ -178,6 +179,9 @@ class _Translations$common$it extends Translations$common$en { @override String get exitFullscreen => 'Esci dalla modalità a schermo intero'; @override String get pressBackAgainToExit => 'Premi di nuovo Indietro per uscire'; @override late final _Translations$common$ratingSource$it ratingSource = _Translations$common$ratingSource$it._(_root); + @override String get notAvailable => 'N/D'; + @override String get url => 'URL'; + @override String get letterKeys => 'ABC'; } // Path: screens @@ -444,6 +448,8 @@ class _Translations$settings$it extends Translations$settings$en { @override String get showNavBarLabels => 'Mostra le etichette della barra di navigazione'; @override String get showNavBarLabelsDescription => 'Mostra le etichette di testo sotto le icone della barra di navigazione'; @override String get startupSection => 'Sezione di avvio'; + @override String get showExploreTab => 'Mostra la scheda Esplora'; + @override String get showExploreTabDescription => 'Visualizza la scheda Esplora con contenuti di Esplora di Plex e dei tracker collegati'; @override String get liveTvDefaultFavorites => 'Apri sui canali preferiti'; @override String get liveTvDefaultFavoritesDescription => 'Mostra solo i canali preferiti quando apri la TV in diretta'; @override String get display => 'Schermo'; @@ -455,6 +461,7 @@ class _Translations$settings$it extends Translations$settings$en { @override String get subtitlesAndConfig => 'Sottotitoli e impostazioni'; @override String get seekAndTiming => 'Avanzamento e tempi'; @override String get behavior => 'Comportamento'; + @override String get exportDialogTitle => 'Esporta le impostazioni di Plezy'; } // Path: search @@ -606,6 +613,8 @@ class _Translations$fileInfo$it extends Translations$fileInfo$en { @override String get flagHearingImpaired => 'Non udenti'; @override String get flagDub => 'Doppiato'; @override String get flagOriginal => 'Originale'; + @override String get channelsMono => 'Mono'; + @override String dolbyVisionProfile({required Object profile}) => 'Profilo ${profile}'; } // Path: mediaMenu @@ -704,6 +713,11 @@ class _Translations$accessibility$it extends Translations$accessibility$en { @override String get alphabetScrollHint => 'Scorri verso l\'alto o il basso per cambiare lettera'; @override String rowColumnPosition({required Object row, required Object rowCount, required Object column, required Object columnCount}) => 'Riga ${row} di ${rowCount}, colonna ${column} di ${columnCount}'; @override String rowPosition({required Object row, required Object rowCount}) => 'Riga ${row} di ${rowCount}'; + @override String get autoScrollPlay => 'Avvia scorrimento automatico'; + @override String get autoScrollPause => 'Sospendi scorrimento automatico'; + @override String get hueShort => 'T'; + @override String get saturationShort => 'S'; + @override String get valueShort => 'V'; } // Path: tooltips @@ -815,6 +829,15 @@ class _Translations$videoControls$it extends Translations$videoControls$en { @override String get subtitleDownloadedNotApplied => 'Il sottotitolo è stato scaricato, ma non è stato possibile selezionarlo'; @override String get subtitleDownloadFailed => 'Impossibile scaricare il sottotitolo'; @override String get searchLanguages => 'Cerca lingue...'; + @override String get skipIntro => 'Salta intro'; + @override String get skipCredits => 'Salta titoli'; + @override String get nextEpisode => 'Episodio successivo'; + @override String subtitleTrack({required Object n}) => 'Traccia ${n}'; + @override String subtitleFile({required Object name}) => 'Sottotitolo ${name}'; + @override String forcedTrack({required Object label}) => '${label} (Forzato)'; + @override String get osdSubtitlesOff => 'Sottotitoli: Disattivati'; + @override String osdSubtitles({required Object track}) => 'Sottotitoli: ${track}'; + @override String osdAudio({required Object track}) => 'Audio: ${track}'; } // Path: messages @@ -876,9 +899,18 @@ class _Translations$messages$it extends Translations$messages$en { @override String get serverLimitBody => 'Errore del server (HTTP 500). È probabile che un limite di banda o transcodifica abbia impedito questa sessione. Chiedi al proprietario di modificare il limite.'; @override String get mediaUnreadableTitle => 'File non disponibile'; @override String get mediaUnreadableBody => 'Il server ha trovato questo elemento ma non ha potuto leggere il suo file (HTTP 404). Il file è stato probabilmente spostato o eliminato, oppure il suo storage è offline. Chiedi al proprietario del server di controllare il file e di riscansionare la libreria.'; + @override String get serverBusyTitle => 'Streaming non disponibile'; + @override String get serverBusyBody => 'Il server ha continuato a rifiutare la riproduzione in streaming di questo file (HTTP 503). Potrebbe essere in fase di riavvio, occupato oppure l\'unità in cui si trova il file potrebbe essere offline. Riprova tra qualche istante. Se il problema persiste, chiedi al proprietario del server di controllare il server e l\'unità di archiviazione del file.'; @override String get logsUploaded => 'Log caricati'; @override String get logsUploadFailed => 'Impossibile caricare i log'; @override String get logId => 'ID log'; + @override String get burnedSubtitlesUseMenu => 'I sottotitoli sono incorporati in questo stream. Cambiali dal menu dei sottotitoli.'; + @override String get noVideoUrl => 'Nessun URL video disponibile'; + @override String get playbackNoMediaSources => 'Il server non ha restituito sorgenti multimediali riproducibili'; + @override String get playbackDataNotPrepared => 'La riproduzione è stata avviata prima che i relativi dati fossero pronti'; + @override String get streamSelectionUnavailable => 'La selezione dei flussi non è disponibile per questa sorgente'; + @override String get streamSelectionFailed => 'Impossibile applicare i flussi selezionati'; + @override String get serverUnavailableForProfile => 'Nessun server disponibile per il profilo attivo'; } // Path: subtitlingStyling @@ -904,6 +936,8 @@ class _Translations$subtitlingStyling$it extends Translations$subtitlingStyling$ @override String get overrideStrip => 'Rimuovi stile'; @override String get positionTop => 'In alto'; @override String get positionBottom => 'In basso'; + @override String get anchorToScreen => 'Fissa allo schermo'; + @override String get anchorToScreenDescription => 'Mostra i sottotitoli testuali nelle bande nere sotto i video in formato panoramico'; @override String get bold => 'Grassetto'; @override String get italic => 'Corsivo'; @override String get renderResolution => 'Risoluzione di rendering'; @@ -1013,6 +1047,7 @@ class _Translations$profiles$it extends Translations$profiles$en { @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 tokenIdentityMismatch => 'Il token del profilo Plex è stato associato a un server imprevisto'; } // Path: connections @@ -1064,6 +1099,10 @@ class _Translations$discover$it extends Translations$discover$en { @override String get tvShow => 'Serie TV'; @override String minutesLeft({required Object minutes}) => '${minutes} minuti rimanenti'; @override String get moreLikeThis => 'Altri contenuti simili'; + @override String titleCount({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('it'))(n, + one: '${n} titolo', + other: '${n} titoli', + ); } // Path: errors @@ -1276,7 +1315,10 @@ class _Translations$explore$it extends Translations$explore$en { @override String get characters => 'Personaggi'; @override String get addToWatchlist => 'Aggiungi alla lista da guardare'; @override String get removeFromWatchlist => 'Rimuovi dalla lista da guardare'; + @override String get addedToWatchlist => 'Aggiunto alla lista titoli'; + @override String get removedFromWatchlist => 'Rimosso dalla lista titoli'; @override String get watchlistUpdateFailed => 'Impossibile aggiornare la lista da guardare'; + @override String get watchlistNoMatch => 'Impossibile associare questo elemento a una lista titoli'; @override String get notInLibrary => 'Non è nella tua libreria'; @override String get inTheseLibraries => 'In queste librerie'; @override String get checkingLibrary => 'Ricerca nella tua libreria...'; @@ -1337,6 +1379,9 @@ class _Translations$liveTv$it extends Translations$liveTv$en { @override String get watchChannel => 'Guarda il canale'; @override String get favorites => 'Preferiti'; @override String get reorderFavorites => 'Riordina i preferiti'; + @override String get noFavoriteChannels => 'Nessun canale preferito'; + @override String get noFavoriteChannelsHint => 'Mostra tutti i canali, quindi tieni premuto un canale per aggiungerlo ai preferiti.'; + @override String get showAllChannels => 'Mostra tutti i canali'; @override String get favoritesLoadFailed => 'Impossibile caricare i preferiti. Controlla la connessione e riprova.'; @override String get favoritesUpdateFailed => 'Impossibile aggiornare i preferiti. Controlla la connessione e riprova.'; @override String get joinSession => 'Partecipa alla sessione in corso'; @@ -1376,6 +1421,11 @@ class _Translations$liveTv$it extends Translations$liveTv$en { @override String get guideReloadRequested => 'Aggiornamento della guida richiesto'; @override String get rulesProcessRequested => 'Rielaborazione delle regole richiesta'; @override String get recordShow => 'Registra programma'; + @override String startingInMinutes({required Object minutes}) => 'Inizia tra ${minutes} min'; + @override String dayAtTime({required Object day, required Object time}) => '${day} alle ${time}'; + @override String invalidPlaybackData({required Object product}) => '${product} ha restituito dati di riproduzione della TV in diretta non validi'; + @override String get failedToStartChannel => 'Impossibile avviare il canale in diretta'; + @override String get failedToBuildStreamUrl => 'Impossibile creare l\'URL dello stream'; } // Path: collections @@ -1474,6 +1524,8 @@ class _Translations$music$it extends Translations$music$en { @override String get repeat => 'Ripeti'; @override String get repeatAll => 'Ripeti tutto'; @override String get repeatOne => 'Ripeti il brano'; + @override String get instantMixNoServer => 'Nessun server disponibile per un mix istantaneo'; + @override String noAudioUrl({required Object track}) => 'Nessun URL audio disponibile per ${track}'; } // Path: watchTogether @@ -1548,6 +1600,7 @@ class _Translations$watchTogether$it extends Translations$watchTogether$en { @override String get removeRoom => 'Rimuovi'; @override String get guestSwitchUnavailable => 'Impossibile cambiare — server non disponibile per la sincronizzazione'; @override String get guestSwitchFailed => 'Impossibile cambiare — contenuto non trovato su questo server'; + @override String get defaultDisplayName => 'Utente'; } // Path: downloads @@ -1632,6 +1685,16 @@ class _Translations$downloads$it extends Translations$downloads$en { @override String get syncRuleUnknownServer => 'Server sconosciuto'; @override String get syncRuleListCreated => 'Regola di sincronizzazione creata'; @override late final _Translations$downloads$backgroundWarning$it backgroundWarning = _Translations$downloads$backgroundWarning$it._(_root); + @override String get unknownShow => 'Serie sconosciuta'; + @override String get unknownSeason => 'Stagione sconosciuta'; + @override String get unknownAlbum => 'Album sconosciuto'; + @override String completedOfTotal({required Object completed, required Object total}) => '${completed}/${total} completati'; + @override String get errorFileNotFound => 'File non trovato (404)'; + @override String get errorDownloadFailed => 'Download non riuscito'; + @override String errorPostProcessing({required Object error}) => 'Post-elaborazione non riuscita: ${error}'; + @override String get notificationDownloading => 'Download in corso...'; + @override String get notificationComplete => 'Download completato'; + @override String get notificationPaused => 'Download in pausa'; } // Path: shaders @@ -1672,6 +1735,7 @@ class _Translations$companionRemote$it extends Translations$companionRemote$en { @override late final _Translations$companionRemote$pairing$it pairing = _Translations$companionRemote$pairing$it._(_root); @override late final _Translations$companionRemote$remote$it remote = _Translations$companionRemote$remote$it._(_root); @override late final _Translations$companionRemote$errors$it errors = _Translations$companionRemote$errors$it._(_root); + @override String get closedBeforeAuth => 'La connessione si è chiusa prima dell\'autenticazione'; } // Path: videoSettings @@ -1689,6 +1753,13 @@ class _Translations$videoSettings$it extends Translations$videoSettings$en { @override String get audioSync => 'Sincronizzazione audio'; @override String get subtitleSync => 'Sincronizzazione sottotitoli'; @override String get hdr => 'HDR'; + @override String get hdrUnsupported => 'HDR non è disponibile qui: questo compositore desktop o questa uscita video non possono gestirlo.'; + @override String get hdrToneMapping => 'Mappatura dei toni HDR'; + @override String get hdrToneMappingCompositor => 'Compositore'; + @override String get hdrToneMappingCompositorDescription => 'Trasmette i metadati HDR della sorgente e lascia che il compositore desktop esegua la mappatura.'; + @override String get hdrToneMappingPlayer => 'Lettore'; + @override String get hdrToneMappingPlayerDescription => 'Esegue nel lettore la mappatura in base alla luminosità di picco dello schermo, quindi comunica il risultato al compositore.'; + @override String get hdrToneMappingFailed => 'Impossibile modificare la mappatura dei toni HDR: la modalità precedente è ancora attiva.'; @override String get audioOutput => 'Uscita audio'; @override String get performanceOverlay => 'Overlay prestazioni'; @override String get audioOutputDolbyAtmos => 'Dolby Atmos'; @@ -1742,6 +1813,16 @@ class _Translations$performanceOverlay$it extends Translations$performanceOverla @override String get player => 'Lettore'; @override String get memory => 'Memoria'; @override String get uiFps => 'FPS UI'; + @override String get fps => 'FPS'; + @override String get decoderAndroidHw => 'Android HW'; + @override String get decoderNvidiaHw => 'NVIDIA HW'; + @override String get decoderQualcommHw => 'Qualcomm HW'; + @override String get decoderMediatekHw => 'MediaTek HW'; + @override String get decoderExynosHw => 'Exynos HW'; + @override String get decoderSoftware => 'Software'; + @override String get decoderHardware => 'Hardware'; + @override String get tunnelingActive => 'Attivo'; + @override String dvRpuFailed({required Object converted, required Object failures}) => '${converted} (${failures} errori)'; } // Path: externalPlayer @@ -1942,6 +2023,16 @@ class _Translations$seerr$it extends Translations$seerr$en { @override String get statusPartiallyAvailable => 'Disponibile in parte'; @override String get statusRequested => 'Richiesto'; @override String get statusProcessing => 'In elaborazione'; + @override String couldNotReach({required Object url, required Object error}) => 'Impossibile raggiungere ${url}: ${error}'; + @override String noInstanceAtUrl({required Object url, required Object status}) => 'Nessuna istanza Seerr all\'indirizzo ${url} (HTTP ${status})'; + @override String get notInitialized => 'Questa istanza Seerr non ha completato la configurazione iniziale'; + @override String get noPlexTokenForReauth => 'Nessun token Plex disponibile per effettuare nuovamente l\'accesso'; + @override String get noStoredCredentials => 'Nessuna credenziale salvata disponibile per effettuare nuovamente l\'accesso'; + @override String get signInRejected => 'L\'accesso è stato rifiutato'; + @override String get noSessionCookie => 'Seerr non ha generato un cookie di sessione'; + @override String get freshCookieRejected => 'Seerr ha rifiutato il nuovo cookie di sessione'; + @override String get noUserInformation => 'Seerr non ha restituito le informazioni sull\'utente'; + @override String get sessionRejectedAfterReauth => 'La sessione è stata rifiutata dopo aver effettuato nuovamente l\'accesso'; } // Path: services @@ -2002,6 +2093,24 @@ class _Translations$addServer$it extends Translations$addServer$en { @override String connectToMediaBrowserCardSubtitleScoped({required Object product, required Object name}) => 'Accedi al tuo server ${product}. Associato a ${name}.'; @override String get borrowFromAnotherProfile => 'Prendi in prestito da un altro profilo'; @override String get borrowFromAnotherProfileSubtitle => 'Riutilizza la connessione di un altro profilo. I profili protetti da PIN richiedono un PIN.'; + @override String get invalidCredentials => 'Nome utente o password non validi'; + @override String get authResponseNotJson => 'La risposta di autenticazione non era un JSON valido'; + @override String get quickConnectRejected => 'Quick Connect è stato rifiutato dal server'; + @override String get quickConnectNotJson => 'La risposta di Quick Connect non era un JSON valido'; + @override String get quickConnectMissingFields => 'Nella risposta di Quick Connect manca un codice o un segreto'; + @override String get quickConnectPollRejected => 'Il polling di Quick Connect è stato rifiutato dal server'; + @override String get serverTimedOut => 'Il server non ha risposto in tempo'; + @override String get responseNotJson => 'La risposta del server non era un JSON valido'; + @override String responseMissingIdentity({required Object product}) => 'Nella risposta manca un ID o il nome del server: è un server ${product}?'; + @override String probeFailed({required Object error}) => 'Impossibile raggiungere il server: ${error}'; + @override String enterAtLeastOneUrl({required Object product}) => 'Inserisci almeno un URL di un server ${product}'; + @override String noReachableServer({required Object product}) => 'Non è stato trovato alcun server ${product} raggiungibile'; + @override String urlsPointToDifferentServers({required Object product}) => 'Questi URL rimandano a server ${product} diversi'; + @override String urlDoesNotMatchServer({required Object product}) => 'Questo URL non corrisponde al server ${product}'; + @override String get redirectUnsupported => 'Il server ha reindirizzato a un URL non supportato'; + @override String redirectDifferentHost({required Object product}) => 'Il server ha reindirizzato a un host diverso. Inserisci direttamente l\'URL finale del server ${product}.'; + @override String get redirectInsecure => 'Il server ha reindirizzato da HTTPS a un URL non sicuro'; + @override String redirectUnsupportedEnterFinal({required Object product}) => 'Il server ha reindirizzato a un URL non supportato. Inserisci direttamente l\'URL finale del server ${product}.'; } // Path: common.ratingSource @@ -2521,6 +2630,7 @@ class _Translations$services$deviceCode$it extends Translations$services$deviceC // Translations @override String title({required Object service}) => 'Attiva Plezy su ${service}'; + @override String get instructions => 'Scansiona il codice QR oppure visita l\'indirizzo qui sotto e inserisci questo codice:'; @override String openToActivate({required Object service}) => 'Apri ${service} per attivare'; @override String get copyCode => 'Copia il codice di attivazione'; @override String get waitingForAuthorization => 'In attesa di autorizzazione…'; @@ -2595,6 +2705,7 @@ extension on TranslationsIt { 'auth.quickConnectCancel' => 'Annulla', 'auth.quickConnectExpired' => 'Quick Connect scaduto. Riprova.', 'auth.localDataRecoveryRequired' => 'Plezy non è riuscito a recuperare in sicurezza i dati locali di accesso e delle riproduzioni in sospeso. Accedi di nuovo.', + 'auth.pinCheckRejected' => 'La verifica del PIN Plex è stata rifiutata', 'common.cancel' => 'Annulla', 'common.save' => 'Salva', 'common.close' => 'Chiudi', @@ -2651,6 +2762,9 @@ extension on TranslationsIt { 'common.ratingSource.trakt' => 'Trakt', 'common.ratingSource.rottenTomatoesCritic' => 'Critici di Rotten Tomatoes', 'common.ratingSource.rottenTomatoesAudience' => 'Pubblico di Rotten Tomatoes', + 'common.notAvailable' => 'N/D', + 'common.url' => 'URL', + 'common.letterKeys' => 'ABC', 'screens.licenses' => 'Licenze', 'screens.switchProfile' => 'Cambia profilo', 'screens.subtitleStyling' => 'Stile sottotitoli', @@ -2890,6 +3004,8 @@ extension on TranslationsIt { 'settings.showNavBarLabels' => 'Mostra le etichette della barra di navigazione', 'settings.showNavBarLabelsDescription' => 'Mostra le etichette di testo sotto le icone della barra di navigazione', 'settings.startupSection' => 'Sezione di avvio', + 'settings.showExploreTab' => 'Mostra la scheda Esplora', + 'settings.showExploreTabDescription' => 'Visualizza la scheda Esplora con contenuti di Esplora di Plex e dei tracker collegati', 'settings.liveTvDefaultFavorites' => 'Apri sui canali preferiti', 'settings.liveTvDefaultFavoritesDescription' => 'Mostra solo i canali preferiti quando apri la TV in diretta', 'settings.display' => 'Schermo', @@ -2901,6 +3017,7 @@ extension on TranslationsIt { 'settings.subtitlesAndConfig' => 'Sottotitoli e impostazioni', 'settings.seekAndTiming' => 'Avanzamento e tempi', 'settings.behavior' => 'Comportamento', + 'settings.exportDialogTitle' => 'Esporta le impostazioni di Plezy', 'search.hint' => 'Cerca film, serie TV e musica...', 'search.tryDifferentTerm' => 'Prova altri termini di ricerca', 'search.searchYourMedia' => 'Cerca nei tuoi media', @@ -3049,6 +3166,8 @@ extension on TranslationsIt { 'fileInfo.flagHearingImpaired' => 'Non udenti', 'fileInfo.flagDub' => 'Doppiato', 'fileInfo.flagOriginal' => 'Originale', + 'fileInfo.channelsMono' => 'Mono', + 'fileInfo.dolbyVisionProfile' => ({required Object profile}) => 'Profilo ${profile}', 'mediaMenu.markAsWatched' => 'Segna come visto', 'mediaMenu.markAsUnwatched' => 'Segna come non visto', 'mediaMenu.removeFromContinueWatching' => 'Rimuovi da Continua a guardare', @@ -3082,6 +3201,8 @@ extension on TranslationsIt { 'mediaMenu.rate' => 'Valuta', 'mediaMenu.playFromBeginning' => 'Riproduci dall\'inizio', 'mediaMenu.playVersion' => 'Riproduci versione...', + _ => null, + } ?? switch (path) { 'rateSheet.title' => 'Valuta', 'rateSheet.server' => 'Server', 'rateSheet.favorite' => 'Preferito', @@ -3091,8 +3212,6 @@ extension on TranslationsIt { 'rateSheet.noConnectedServices' => 'Collega un servizio nelle Impostazioni per assegnare valutazioni anche su quel servizio.', 'accessibility.mediaCardMovie' => ({required Object title}) => '${title}, film', 'accessibility.mediaCardShow' => ({required Object title}) => '${title}, serie TV', - _ => null, - } ?? switch (path) { 'accessibility.mediaCardEpisode' => ({required Object title, required Object episodeInfo}) => '${title}, ${episodeInfo}', 'accessibility.mediaCardSeason' => ({required Object title, required Object seasonInfo}) => '${title}, ${seasonInfo}', 'accessibility.mediaCardWatched' => 'visto', @@ -3113,6 +3232,11 @@ extension on TranslationsIt { 'accessibility.alphabetScrollHint' => 'Scorri verso l\'alto o il basso per cambiare lettera', 'accessibility.rowColumnPosition' => ({required Object row, required Object rowCount, required Object column, required Object columnCount}) => 'Riga ${row} di ${rowCount}, colonna ${column} di ${columnCount}', 'accessibility.rowPosition' => ({required Object row, required Object rowCount}) => 'Riga ${row} di ${rowCount}', + 'accessibility.autoScrollPlay' => 'Avvia scorrimento automatico', + 'accessibility.autoScrollPause' => 'Sospendi scorrimento automatico', + 'accessibility.hueShort' => 'T', + 'accessibility.saturationShort' => 'S', + 'accessibility.valueShort' => 'V', 'tooltips.shufflePlay' => 'Riproduzione casuale', 'tooltips.playTrailer' => 'Riproduci trailer', 'tooltips.markAsWatched' => 'Segna come visto', @@ -3203,6 +3327,15 @@ extension on TranslationsIt { 'videoControls.subtitleDownloadedNotApplied' => 'Il sottotitolo è stato scaricato, ma non è stato possibile selezionarlo', 'videoControls.subtitleDownloadFailed' => 'Impossibile scaricare il sottotitolo', 'videoControls.searchLanguages' => 'Cerca lingue...', + 'videoControls.skipIntro' => 'Salta intro', + 'videoControls.skipCredits' => 'Salta titoli', + 'videoControls.nextEpisode' => 'Episodio successivo', + 'videoControls.subtitleTrack' => ({required Object n}) => 'Traccia ${n}', + 'videoControls.subtitleFile' => ({required Object name}) => 'Sottotitolo ${name}', + 'videoControls.forcedTrack' => ({required Object label}) => '${label} (Forzato)', + 'videoControls.osdSubtitlesOff' => 'Sottotitoli: Disattivati', + 'videoControls.osdSubtitles' => ({required Object track}) => 'Sottotitoli: ${track}', + 'videoControls.osdAudio' => ({required Object track}) => 'Audio: ${track}', 'messages.markedAsWatched' => 'Segnato come visto', 'messages.markedAsUnwatched' => 'Segnato come non visto', 'messages.markedAsWatchedOffline' => 'Segnato come visto (verrà sincronizzato quando torni online)', @@ -3252,9 +3385,18 @@ extension on TranslationsIt { 'messages.serverLimitBody' => 'Errore del server (HTTP 500). È probabile che un limite di banda o transcodifica abbia impedito questa sessione. Chiedi al proprietario di modificare il limite.', 'messages.mediaUnreadableTitle' => 'File non disponibile', 'messages.mediaUnreadableBody' => 'Il server ha trovato questo elemento ma non ha potuto leggere il suo file (HTTP 404). Il file è stato probabilmente spostato o eliminato, oppure il suo storage è offline. Chiedi al proprietario del server di controllare il file e di riscansionare la libreria.', + 'messages.serverBusyTitle' => 'Streaming non disponibile', + 'messages.serverBusyBody' => 'Il server ha continuato a rifiutare la riproduzione in streaming di questo file (HTTP 503). Potrebbe essere in fase di riavvio, occupato oppure l\'unità in cui si trova il file potrebbe essere offline. Riprova tra qualche istante. Se il problema persiste, chiedi al proprietario del server di controllare il server e l\'unità di archiviazione del file.', 'messages.logsUploaded' => 'Log caricati', 'messages.logsUploadFailed' => 'Impossibile caricare i log', 'messages.logId' => 'ID log', + 'messages.burnedSubtitlesUseMenu' => 'I sottotitoli sono incorporati in questo stream. Cambiali dal menu dei sottotitoli.', + 'messages.noVideoUrl' => 'Nessun URL video disponibile', + 'messages.playbackNoMediaSources' => 'Il server non ha restituito sorgenti multimediali riproducibili', + 'messages.playbackDataNotPrepared' => 'La riproduzione è stata avviata prima che i relativi dati fossero pronti', + 'messages.streamSelectionUnavailable' => 'La selezione dei flussi non è disponibile per questa sorgente', + 'messages.streamSelectionFailed' => 'Impossibile applicare i flussi selezionati', + 'messages.serverUnavailableForProfile' => 'Nessun server disponibile per il profilo attivo', 'subtitlingStyling.text' => 'Testo', 'subtitlingStyling.border' => 'Bordo', 'subtitlingStyling.background' => 'Sfondo', @@ -3271,6 +3413,8 @@ extension on TranslationsIt { 'subtitlingStyling.overrideStrip' => 'Rimuovi stile', 'subtitlingStyling.positionTop' => 'In alto', 'subtitlingStyling.positionBottom' => 'In basso', + 'subtitlingStyling.anchorToScreen' => 'Fissa allo schermo', + 'subtitlingStyling.anchorToScreenDescription' => 'Mostra i sottotitoli testuali nelle bande nere sotto i video in formato panoramico', 'subtitlingStyling.bold' => 'Grassetto', 'subtitlingStyling.italic' => 'Corsivo', 'subtitlingStyling.renderResolution' => 'Risoluzione di rendering', @@ -3353,6 +3497,7 @@ extension on TranslationsIt { 'profiles.pinExplain' => 'PIN a 4 cifre richiesto per cambiare profilo.', 'profiles.continueButton' => 'Continua', 'profiles.pinsDontMatch' => 'I PIN non corrispondono', + 'profiles.tokenIdentityMismatch' => 'Il token del profilo Plex è stato associato a un server imprevisto', 'connections.sectionTitle' => 'Connessioni', 'connections.addConnection' => 'Aggiungi connessione', 'connections.addConnectionSubtitleNoProfile' => 'Accedi con Plex o collega un server Jellyfin', @@ -3386,6 +3531,7 @@ extension on TranslationsIt { 'discover.tvShow' => 'Serie TV', 'discover.minutesLeft' => ({required Object minutes}) => '${minutes} minuti rimanenti', 'discover.moreLikeThis' => 'Altri contenuti simili', + 'discover.titleCount' => ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('it'))(n, one: '${n} titolo', other: '${n} titoli', ), 'errors.searchFailed' => ({required Object error}) => 'Ricerca non riuscita: ${error}', 'errors.searchUnavailable' => 'La ricerca non ha potuto raggiungere alcun server multimediale.', 'errors.connectionTimeout' => ({required Object context}) => 'Tempo scaduto per la connessione durante il caricamento di ${context}', @@ -3558,7 +3704,10 @@ extension on TranslationsIt { 'explore.characters' => 'Personaggi', 'explore.addToWatchlist' => 'Aggiungi alla lista da guardare', 'explore.removeFromWatchlist' => 'Rimuovi dalla lista da guardare', + 'explore.addedToWatchlist' => 'Aggiunto alla lista titoli', + 'explore.removedFromWatchlist' => 'Rimosso dalla lista titoli', 'explore.watchlistUpdateFailed' => 'Impossibile aggiornare la lista da guardare', + 'explore.watchlistNoMatch' => 'Impossibile associare questo elemento a una lista titoli', 'explore.notInLibrary' => 'Non è nella tua libreria', 'explore.inTheseLibraries' => 'In queste librerie', 'explore.checkingLibrary' => 'Ricerca nella tua libreria...', @@ -3566,6 +3715,8 @@ extension on TranslationsIt { 'explore.emptyMessage' => ({required Object source}) => 'Le sezioni di ${source} appariranno qui quando saranno disponibili dei contenuti.', 'explore.searchHint' => ({required Object source}) => 'Cerca su ${source}', 'explore.searchEmpty' => ({required Object query}) => 'Nessun risultato per "${query}"', + _ => null, + } ?? switch (path) { 'explore.searchPrompt' => ({required Object source}) => 'Cerca film e serie TV su ${source}.', 'explore.searchFailed' => 'Ricerca fallita. Controlla la connessione e riprova.', 'explore.badge.rankPopular' => ({required Object n}) => '#${n} popolari', @@ -3605,8 +3756,6 @@ extension on TranslationsIt { 'explore.stats.completed' => ({required Object n}) => '${n} completati', 'explore.stats.onHold' => ({required Object n}) => '${n} in pausa', 'explore.stats.dropped' => ({required Object n}) => '${n} abbandonati', - _ => null, - } ?? switch (path) { 'explore.season.winter' => 'Inverno', 'explore.season.spring' => 'Primavera', 'explore.season.summer' => 'Estate', @@ -3703,6 +3852,9 @@ extension on TranslationsIt { 'liveTv.watchChannel' => 'Guarda il canale', 'liveTv.favorites' => 'Preferiti', 'liveTv.reorderFavorites' => 'Riordina i preferiti', + 'liveTv.noFavoriteChannels' => 'Nessun canale preferito', + 'liveTv.noFavoriteChannelsHint' => 'Mostra tutti i canali, quindi tieni premuto un canale per aggiungerlo ai preferiti.', + 'liveTv.showAllChannels' => 'Mostra tutti i canali', 'liveTv.favoritesLoadFailed' => 'Impossibile caricare i preferiti. Controlla la connessione e riprova.', 'liveTv.favoritesUpdateFailed' => 'Impossibile aggiornare i preferiti. Controlla la connessione e riprova.', 'liveTv.joinSession' => 'Partecipa alla sessione in corso', @@ -3742,6 +3894,11 @@ extension on TranslationsIt { 'liveTv.guideReloadRequested' => 'Aggiornamento della guida richiesto', 'liveTv.rulesProcessRequested' => 'Rielaborazione delle regole richiesta', 'liveTv.recordShow' => 'Registra programma', + 'liveTv.startingInMinutes' => ({required Object minutes}) => 'Inizia tra ${minutes} min', + 'liveTv.dayAtTime' => ({required Object day, required Object time}) => '${day} alle ${time}', + 'liveTv.invalidPlaybackData' => ({required Object product}) => '${product} ha restituito dati di riproduzione della TV in diretta non validi', + 'liveTv.failedToStartChannel' => 'Impossibile avviare il canale in diretta', + 'liveTv.failedToBuildStreamUrl' => 'Impossibile creare l\'URL dello stream', 'collections.title' => 'Raccolte', 'collections.collection' => 'Raccolta', 'collections.empty' => 'La raccolta è vuota', @@ -3810,6 +3967,8 @@ extension on TranslationsIt { 'music.repeat' => 'Ripeti', 'music.repeatAll' => 'Ripeti tutto', 'music.repeatOne' => 'Ripeti il brano', + 'music.instantMixNoServer' => 'Nessun server disponibile per un mix istantaneo', + 'music.noAudioUrl' => ({required Object track}) => 'Nessun URL audio disponibile per ${track}', 'watchTogether.title' => 'Guarda insieme', 'watchTogether.description' => 'Guarda contenuti in sincronia con amici e familiari', 'watchTogether.createSession' => 'Crea sessione', @@ -3875,6 +4034,7 @@ extension on TranslationsIt { 'watchTogether.removeRoom' => 'Rimuovi', 'watchTogether.guestSwitchUnavailable' => 'Impossibile cambiare — server non disponibile per la sincronizzazione', 'watchTogether.guestSwitchFailed' => 'Impossibile cambiare — contenuto non trovato su questo server', + 'watchTogether.defaultDisplayName' => 'Utente', 'downloads.title' => 'Download', 'downloads.manage' => 'Gestisci', 'downloads.tvShows' => 'Serie TV', @@ -3975,6 +4135,16 @@ extension on TranslationsIt { 'downloads.backgroundWarning.statusUnknown' => 'Non ancora verificato', 'downloads.backgroundWarning.settingsUnavailable' => 'Impossibile aprire le impostazioni di sistema su questo dispositivo', 'downloads.backgroundWarning.linkUnavailable' => 'Impossibile aprire dontkillmyapp.com su questo dispositivo', + 'downloads.unknownShow' => 'Serie sconosciuta', + 'downloads.unknownSeason' => 'Stagione sconosciuta', + 'downloads.unknownAlbum' => 'Album sconosciuto', + 'downloads.completedOfTotal' => ({required Object completed, required Object total}) => '${completed}/${total} completati', + 'downloads.errorFileNotFound' => 'File non trovato (404)', + 'downloads.errorDownloadFailed' => 'Download non riuscito', + 'downloads.errorPostProcessing' => ({required Object error}) => 'Post-elaborazione non riuscita: ${error}', + 'downloads.notificationDownloading' => 'Download in corso...', + 'downloads.notificationComplete' => 'Download completato', + 'downloads.notificationPaused' => 'Download in pausa', 'shaders.title' => 'Shader', 'shaders.noShaderDescription' => 'Nessun miglioramento video', 'shaders.nvscalerDescription' => 'Ridimensionamento NVIDIA per video più nitido', @@ -4054,14 +4224,24 @@ extension on TranslationsIt { 'companionRemote.errors.failedToConnectAnyAddress' => 'Impossibile connettersi a qualsiasi indirizzo', 'companionRemote.errors.connectionLostAfterAttempts' => ({required Object attempts}) => 'Connessione persa dopo ${attempts} tentativi', 'companionRemote.errors.connectionLost' => 'Connessione persa', + 'companionRemote.closedBeforeAuth' => 'La connessione si è chiusa prima dell\'autenticazione', 'videoSettings.playbackSpeed' => 'Velocità di riproduzione', 'videoSettings.normalSpeed' => 'Normale', 'videoSettings.sleepTimerActive' => ({required Object duration}) => 'Attivo (${duration})', 'videoSettings.zoom' => 'Zoom', + _ => null, + } ?? switch (path) { 'videoSettings.sleepTimer' => 'Timer di spegnimento', 'videoSettings.audioSync' => 'Sincronizzazione audio', 'videoSettings.subtitleSync' => 'Sincronizzazione sottotitoli', 'videoSettings.hdr' => 'HDR', + 'videoSettings.hdrUnsupported' => 'HDR non è disponibile qui: questo compositore desktop o questa uscita video non possono gestirlo.', + 'videoSettings.hdrToneMapping' => 'Mappatura dei toni HDR', + 'videoSettings.hdrToneMappingCompositor' => 'Compositore', + 'videoSettings.hdrToneMappingCompositorDescription' => 'Trasmette i metadati HDR della sorgente e lascia che il compositore desktop esegua la mappatura.', + 'videoSettings.hdrToneMappingPlayer' => 'Lettore', + 'videoSettings.hdrToneMappingPlayerDescription' => 'Esegue nel lettore la mappatura in base alla luminosità di picco dello schermo, quindi comunica il risultato al compositore.', + 'videoSettings.hdrToneMappingFailed' => 'Impossibile modificare la mappatura dei toni HDR: la modalità precedente è ancora attiva.', 'videoSettings.audioOutput' => 'Uscita audio', 'videoSettings.performanceOverlay' => 'Overlay prestazioni', 'videoSettings.audioOutputDolbyAtmos' => 'Dolby Atmos', @@ -4106,6 +4286,16 @@ extension on TranslationsIt { 'performanceOverlay.player' => 'Lettore', 'performanceOverlay.memory' => 'Memoria', 'performanceOverlay.uiFps' => 'FPS UI', + 'performanceOverlay.fps' => 'FPS', + 'performanceOverlay.decoderAndroidHw' => 'Android HW', + 'performanceOverlay.decoderNvidiaHw' => 'NVIDIA HW', + 'performanceOverlay.decoderQualcommHw' => 'Qualcomm HW', + 'performanceOverlay.decoderMediatekHw' => 'MediaTek HW', + 'performanceOverlay.decoderExynosHw' => 'Exynos HW', + 'performanceOverlay.decoderSoftware' => 'Software', + 'performanceOverlay.decoderHardware' => 'Hardware', + 'performanceOverlay.tunnelingActive' => 'Attivo', + 'performanceOverlay.dvRpuFailed' => ({required Object converted, required Object failures}) => '${converted} (${failures} errori)', 'externalPlayer.title' => 'Lettore esterno', 'externalPlayer.useExternalPlayer' => 'Usa un lettore esterno', 'externalPlayer.useExternalPlayerDescription' => 'Apri i video in un\'altra app', @@ -4119,8 +4309,6 @@ extension on TranslationsIt { '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 nel lettore esterno', @@ -4254,6 +4442,16 @@ extension on TranslationsIt { 'seerr.statusPartiallyAvailable' => 'Disponibile in parte', 'seerr.statusRequested' => 'Richiesto', 'seerr.statusProcessing' => 'In elaborazione', + 'seerr.couldNotReach' => ({required Object url, required Object error}) => 'Impossibile raggiungere ${url}: ${error}', + 'seerr.noInstanceAtUrl' => ({required Object url, required Object status}) => 'Nessuna istanza Seerr all\'indirizzo ${url} (HTTP ${status})', + 'seerr.notInitialized' => 'Questa istanza Seerr non ha completato la configurazione iniziale', + 'seerr.noPlexTokenForReauth' => 'Nessun token Plex disponibile per effettuare nuovamente l\'accesso', + 'seerr.noStoredCredentials' => 'Nessuna credenziale salvata disponibile per effettuare nuovamente l\'accesso', + 'seerr.signInRejected' => 'L\'accesso è stato rifiutato', + 'seerr.noSessionCookie' => 'Seerr non ha generato un cookie di sessione', + 'seerr.freshCookieRejected' => 'Seerr ha rifiutato il nuovo cookie di sessione', + 'seerr.noUserInformation' => 'Seerr non ha restituito le informazioni sull\'utente', + 'seerr.sessionRejectedAfterReauth' => 'La sessione è stata rifiutata dopo aver effettuato nuovamente l\'accesso', 'services.title' => 'Servizi', 'services.hubSubtitle' => 'Sincronizza i progressi di visione e richiedi nuovi titoli.', 'services.notConnected' => 'Non connesso', @@ -4269,6 +4467,7 @@ extension on TranslationsIt { 'services.names.seerr' => 'Seerr', 'services.names.mdblist' => 'MDBList', 'services.deviceCode.title' => ({required Object service}) => 'Attiva Plezy su ${service}', + 'services.deviceCode.instructions' => 'Scansiona il codice QR oppure visita l\'indirizzo qui sotto e inserisci questo codice:', 'services.deviceCode.openToActivate' => ({required Object service}) => 'Apri ${service} per attivare', 'services.deviceCode.copyCode' => 'Copia il codice di attivazione', 'services.deviceCode.waitingForAuthorization' => 'In attesa di autorizzazione…', @@ -4318,6 +4517,24 @@ extension on TranslationsIt { 'addServer.connectToMediaBrowserCardSubtitleScoped' => ({required Object product, required Object name}) => 'Accedi al tuo server ${product}. Associato a ${name}.', 'addServer.borrowFromAnotherProfile' => 'Prendi in prestito da un altro profilo', 'addServer.borrowFromAnotherProfileSubtitle' => 'Riutilizza la connessione di un altro profilo. I profili protetti da PIN richiedono un PIN.', + 'addServer.invalidCredentials' => 'Nome utente o password non validi', + 'addServer.authResponseNotJson' => 'La risposta di autenticazione non era un JSON valido', + 'addServer.quickConnectRejected' => 'Quick Connect è stato rifiutato dal server', + 'addServer.quickConnectNotJson' => 'La risposta di Quick Connect non era un JSON valido', + 'addServer.quickConnectMissingFields' => 'Nella risposta di Quick Connect manca un codice o un segreto', + 'addServer.quickConnectPollRejected' => 'Il polling di Quick Connect è stato rifiutato dal server', + 'addServer.serverTimedOut' => 'Il server non ha risposto in tempo', + 'addServer.responseNotJson' => 'La risposta del server non era un JSON valido', + 'addServer.responseMissingIdentity' => ({required Object product}) => 'Nella risposta manca un ID o il nome del server: è un server ${product}?', + 'addServer.probeFailed' => ({required Object error}) => 'Impossibile raggiungere il server: ${error}', + 'addServer.enterAtLeastOneUrl' => ({required Object product}) => 'Inserisci almeno un URL di un server ${product}', + 'addServer.noReachableServer' => ({required Object product}) => 'Non è stato trovato alcun server ${product} raggiungibile', + 'addServer.urlsPointToDifferentServers' => ({required Object product}) => 'Questi URL rimandano a server ${product} diversi', + 'addServer.urlDoesNotMatchServer' => ({required Object product}) => 'Questo URL non corrisponde al server ${product}', + 'addServer.redirectUnsupported' => 'Il server ha reindirizzato a un URL non supportato', + 'addServer.redirectDifferentHost' => ({required Object product}) => 'Il server ha reindirizzato a un host diverso. Inserisci direttamente l\'URL finale del server ${product}.', + 'addServer.redirectInsecure' => 'Il server ha reindirizzato da HTTPS a un URL non sicuro', + 'addServer.redirectUnsupportedEnterFinal' => ({required Object product}) => 'Il server ha reindirizzato a un URL non supportato. Inserisci direttamente l\'URL finale del server ${product}.', _ => null, }; } diff --git a/lib/i18n/strings_ja.g.dart b/lib/i18n/strings_ja.g.dart index 96ad955e..1a72b82a 100644 --- a/lib/i18n/strings_ja.g.dart +++ b/lib/i18n/strings_ja.g.dart @@ -123,6 +123,7 @@ class _Translations$auth$ja extends Translations$auth$en { @override String get quickConnectCancel => 'キャンセル'; @override String get quickConnectExpired => 'Quick Connectの有効期限が切れました。もう一度お試しください。'; @override String get localDataRecoveryRequired => 'ローカルのサインイン情報と保留中の再生データを安全に復元できませんでした。もう一度サインインしてください。'; + @override String get pinCheckRejected => 'Plex PINの確認が拒否されました'; } // Path: common @@ -178,6 +179,9 @@ class _Translations$common$ja extends Translations$common$en { @override String get exitFullscreen => 'フルスクリーンを終了'; @override String get pressBackAgainToExit => 'もう一度押すと終了します'; @override late final _Translations$common$ratingSource$ja ratingSource = _Translations$common$ratingSource$ja._(_root); + @override String get notAvailable => 'N/A'; + @override String get url => 'URL'; + @override String get letterKeys => 'ABC'; } // Path: screens @@ -444,6 +448,8 @@ class _Translations$settings$ja extends Translations$settings$en { @override String get showNavBarLabels => 'ナビゲーションバーのラベルを表示'; @override String get showNavBarLabelsDescription => 'ナビゲーションバーのアイコンの下にテキストラベルを表示'; @override String get startupSection => '起動時のセクション'; + @override String get showExploreTab => '「探す」タブを表示'; + @override String get showExploreTabDescription => 'Plex Discoverと接続済みのトラッカーのコンテンツを「探す」タブに表示します'; @override String get liveTvDefaultFavorites => 'お気に入りチャンネルをデフォルトに'; @override String get liveTvDefaultFavoritesDescription => 'ライブTVを開いたときにお気に入りチャンネルのみ表示'; @override String get display => 'ディスプレイ'; @@ -455,6 +461,7 @@ class _Translations$settings$ja extends Translations$settings$en { @override String get subtitlesAndConfig => '字幕と設定'; @override String get seekAndTiming => 'シークとタイミング'; @override String get behavior => '動作'; + @override String get exportDialogTitle => 'Plezyの設定をエクスポート'; } // Path: search @@ -606,6 +613,8 @@ class _Translations$fileInfo$ja extends Translations$fileInfo$en { @override String get flagHearingImpaired => '聴覚障害者向け'; @override String get flagDub => '吹替'; @override String get flagOriginal => 'オリジナル'; + @override String get channelsMono => 'モノラル'; + @override String dolbyVisionProfile({required Object profile}) => 'プロファイル${profile}'; } // Path: mediaMenu @@ -701,6 +710,11 @@ class _Translations$accessibility$ja extends Translations$accessibility$en { @override String get alphabetScrollHint => '上下にスワイプして文字ごとに移動'; @override String rowColumnPosition({required Object rowCount, required Object row, required Object columnCount, required Object column}) => '${rowCount}行中${row}行、${columnCount}列中${column}列'; @override String rowPosition({required Object rowCount, required Object row}) => '${rowCount}行中${row}行'; + @override String get autoScrollPlay => '自動スクロールを再生'; + @override String get autoScrollPause => '自動スクロールを一時停止'; + @override String get hueShort => 'H'; + @override String get saturationShort => 'S'; + @override String get valueShort => 'V'; } // Path: tooltips @@ -812,6 +826,15 @@ class _Translations$videoControls$ja extends Translations$videoControls$en { @override String get subtitleDownloadedNotApplied => '字幕はダウンロードされましたが、選択できませんでした'; @override String get subtitleDownloadFailed => '字幕のダウンロードに失敗しました'; @override String get searchLanguages => '言語を検索…'; + @override String get skipIntro => 'イントロをスキップ'; + @override String get skipCredits => 'クレジットをスキップ'; + @override String get nextEpisode => '次のエピソード'; + @override String subtitleTrack({required Object n}) => 'トラック${n}'; + @override String subtitleFile({required Object name}) => '字幕${name}'; + @override String forcedTrack({required Object label}) => '${label}(強制)'; + @override String get osdSubtitlesOff => '字幕: オフ'; + @override String osdSubtitles({required Object track}) => '字幕: ${track}'; + @override String osdAudio({required Object track}) => '音声: ${track}'; } // Path: messages @@ -872,9 +895,18 @@ class _Translations$messages$ja extends Translations$messages$en { @override String get serverLimitBody => 'サーバーエラー(HTTP 500)。帯域幅/トランスコード制限により拒否された可能性があります。所有者に調整を依頼してください。'; @override String get mediaUnreadableTitle => 'ファイルを利用できません'; @override String get mediaUnreadableBody => 'サーバーはこのアイテムを見つけましたが、そのファイルを読み取れませんでした(HTTP 404)。ファイルが移動・削除されたか、ストレージがオフラインの可能性があります。サーバーの管理者にファイルの確認とライブラリの再スキャンを依頼してください。'; + @override String get serverBusyTitle => 'ストリームを利用できません'; + @override String get serverBusyBody => 'サーバーがこのファイルのストリーミングを繰り返し拒否しました(HTTP 503)。サーバーが再起動中またはビジー状態か、ファイルのストレージがオフラインの可能性があります。しばらくしてからもう一度お試しください。問題が続く場合は、サーバーの所有者にサーバーとファイルのストレージを確認するよう依頼してください。'; @override String get logsUploaded => 'ログをアップロードしました'; @override String get logsUploadFailed => 'ログのアップロードに失敗しました'; @override String get logId => 'ログID'; + @override String get burnedSubtitlesUseMenu => '字幕はこのストリームに焼き付けられています。字幕メニューから変更してください。'; + @override String get noVideoUrl => '利用可能な動画URLがありません'; + @override String get playbackNoMediaSources => 'サーバーから再生可能なメディアソースが返されませんでした'; + @override String get playbackDataNotPrepared => '再生データの準備が完了する前に再生が開始されました'; + @override String get streamSelectionUnavailable => 'このソースではストリームを選択できません'; + @override String get streamSelectionFailed => '選択したストリームを適用できませんでした'; + @override String get serverUnavailableForProfile => '現在のプロフィールで利用可能なサーバーがありません'; } // Path: subtitlingStyling @@ -900,6 +932,8 @@ class _Translations$subtitlingStyling$ja extends Translations$subtitlingStyling$ @override String get overrideStrip => 'スタイルを削除'; @override String get positionTop => '上'; @override String get positionBottom => '下'; + @override String get anchorToScreen => '画面に固定'; + @override String get anchorToScreenDescription => 'ワイドスクリーン映像の下にある黒帯にテキスト字幕を表示します'; @override String get bold => '太字'; @override String get italic => '斜体'; @override String get renderResolution => 'レンダリング解像度'; @@ -1009,6 +1043,7 @@ class _Translations$profiles$ja extends Translations$profiles$en { @override String get pinExplain => 'プロフィール切り替えには4桁のPINが必要です。'; @override String get continueButton => '続ける'; @override String get pinsDontMatch => 'PINが一致しません'; + @override String get tokenIdentityMismatch => 'Plexプロフィールのトークンから予期しないサーバーが特定されました'; } // Path: connections @@ -1060,6 +1095,9 @@ class _Translations$discover$ja extends Translations$discover$en { @override String get tvShow => 'テレビ番組'; @override String minutesLeft({required Object minutes}) => '残り${minutes}分'; @override String get moreLikeThis => '似ている作品'; + @override String titleCount({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('ja'))(n, + other: '${n}作品', + ); } // Path: errors @@ -1271,7 +1309,10 @@ class _Translations$explore$ja extends Translations$explore$en { @override String get characters => 'キャラクター'; @override String get addToWatchlist => 'ウォッチリストに追加'; @override String get removeFromWatchlist => 'ウォッチリストから削除'; + @override String get addedToWatchlist => 'ウォッチリストに追加しました'; + @override String get removedFromWatchlist => 'ウォッチリストから削除しました'; @override String get watchlistUpdateFailed => 'ウォッチリストを更新できませんでした'; + @override String get watchlistNoMatch => 'このアイテムに一致するウォッチリスト項目が見つかりませんでした'; @override String get notInLibrary => 'ライブラリにありません'; @override String get inTheseLibraries => 'これらのライブラリにあります'; @override String get checkingLibrary => 'ライブラリを確認中…'; @@ -1331,6 +1372,9 @@ class _Translations$liveTv$ja extends Translations$liveTv$en { @override String get watchChannel => 'チャンネルを視聴'; @override String get favorites => 'お気に入り'; @override String get reorderFavorites => 'お気に入りを並べ替え'; + @override String get noFavoriteChannels => 'お気に入りのチャンネルがありません'; + @override String get noFavoriteChannelsHint => 'すべてのチャンネルを表示し、チャンネルを長押ししてお気に入りに追加してください。'; + @override String get showAllChannels => 'すべてのチャンネルを表示'; @override String get favoritesLoadFailed => 'お気に入りを読み込めませんでした。接続を確認してもう一度お試しください。'; @override String get favoritesUpdateFailed => 'お気に入りを更新できませんでした。接続を確認してもう一度お試しください。'; @override String get joinSession => '進行中のセッションに参加'; @@ -1370,6 +1414,11 @@ class _Translations$liveTv$ja extends Translations$liveTv$en { @override String get guideReloadRequested => '番組表の更新をリクエストしました'; @override String get rulesProcessRequested => '録画ルールの再評価をリクエストしました'; @override String get recordShow => '番組を録画'; + @override String startingInMinutes({required Object minutes}) => '${minutes}分後に開始'; + @override String dayAtTime({required Object day, required Object time}) => '${day} ${time}'; + @override String invalidPlaybackData({required Object product}) => '${product}から無効なライブTV再生データが返されました'; + @override String get failedToStartChannel => 'ライブチャンネルを開始できませんでした'; + @override String get failedToBuildStreamUrl => 'ストリームURLを生成できませんでした'; } // Path: collections @@ -1467,6 +1516,8 @@ class _Translations$music$ja extends Translations$music$en { @override String get repeat => 'リピート'; @override String get repeatAll => '全曲リピート'; @override String get repeatOne => '1曲リピート'; + @override String get instantMixNoServer => 'インスタントミックスに利用できるサーバーがありません'; + @override String noAudioUrl({required Object track}) => '${track}で利用可能な音声URLがありません'; } // Path: watchTogether @@ -1541,6 +1592,7 @@ class _Translations$watchTogether$ja extends Translations$watchTogether$en { @override String get removeRoom => '削除'; @override String get guestSwitchUnavailable => '切り替えられません — 同期に必要なサーバーを利用できません'; @override String get guestSwitchFailed => '切り替えられません — このサーバーにコンテンツが見つかりません'; + @override String get defaultDisplayName => 'ユーザー'; } // Path: downloads @@ -1625,6 +1677,16 @@ class _Translations$downloads$ja extends Translations$downloads$en { @override String get syncRuleUnknownServer => '不明なサーバー'; @override String get syncRuleListCreated => '同期ルールを作成しました'; @override late final _Translations$downloads$backgroundWarning$ja backgroundWarning = _Translations$downloads$backgroundWarning$ja._(_root); + @override String get unknownShow => '不明な番組'; + @override String get unknownSeason => '不明なシーズン'; + @override String get unknownAlbum => '不明なアルバム'; + @override String completedOfTotal({required Object completed, required Object total}) => '${completed}/${total}完了'; + @override String get errorFileNotFound => 'ファイルが見つかりません(404)'; + @override String get errorDownloadFailed => 'ダウンロードに失敗しました'; + @override String errorPostProcessing({required Object error}) => '後処理に失敗しました: ${error}'; + @override String get notificationDownloading => 'ダウンロード中…'; + @override String get notificationComplete => 'ダウンロードが完了しました'; + @override String get notificationPaused => 'ダウンロードを一時停止しました'; } // Path: shaders @@ -1665,6 +1727,7 @@ class _Translations$companionRemote$ja extends Translations$companionRemote$en { @override late final _Translations$companionRemote$pairing$ja pairing = _Translations$companionRemote$pairing$ja._(_root); @override late final _Translations$companionRemote$remote$ja remote = _Translations$companionRemote$remote$ja._(_root); @override late final _Translations$companionRemote$errors$ja errors = _Translations$companionRemote$errors$ja._(_root); + @override String get closedBeforeAuth => '認証前に接続が切断されました'; } // Path: videoSettings @@ -1682,6 +1745,13 @@ class _Translations$videoSettings$ja extends Translations$videoSettings$en { @override String get audioSync => '音声同期'; @override String get subtitleSync => '字幕同期'; @override String get hdr => 'HDR'; + @override String get hdrUnsupported => 'ここではHDRを利用できません。このデスクトップコンポジターまたは映像出力はHDRに対応していません。'; + @override String get hdrToneMapping => 'HDRトーンマッピング'; + @override String get hdrToneMappingCompositor => 'コンポジター'; + @override String get hdrToneMappingCompositorDescription => 'ソースのHDRメタデータをそのまま渡し、デスクトップコンポジターにマッピングさせます。'; + @override String get hdrToneMappingPlayer => 'プレーヤー'; + @override String get hdrToneMappingPlayerDescription => 'プレーヤーでディスプレイのピーク輝度に合わせてマッピングし、その結果をコンポジターに通知します。'; + @override String get hdrToneMappingFailed => 'HDRトーンマッピングを変更できませんでした。以前のモードが引き続き有効です。'; @override String get audioOutput => '音声出力'; @override String get performanceOverlay => 'パフォーマンスオーバーレイ'; @override String get audioOutputDolbyAtmos => 'Dolby Atmos'; @@ -1735,6 +1805,16 @@ class _Translations$performanceOverlay$ja extends Translations$performanceOverla @override String get player => 'プレーヤー'; @override String get memory => 'メモリ'; @override String get uiFps => 'UI FPS'; + @override String get fps => 'FPS'; + @override String get decoderAndroidHw => 'Android HW'; + @override String get decoderNvidiaHw => 'NVIDIA HW'; + @override String get decoderQualcommHw => 'Qualcomm HW'; + @override String get decoderMediatekHw => 'MediaTek HW'; + @override String get decoderExynosHw => 'Exynos HW'; + @override String get decoderSoftware => 'ソフトウェア'; + @override String get decoderHardware => 'ハードウェア'; + @override String get tunnelingActive => '有効'; + @override String dvRpuFailed({required Object converted, required Object failures}) => '${converted}(${failures}件失敗)'; } // Path: externalPlayer @@ -1935,6 +2015,16 @@ class _Translations$seerr$ja extends Translations$seerr$en { @override String get statusPartiallyAvailable => '一部利用可能'; @override String get statusRequested => 'リクエスト済み'; @override String get statusProcessing => '処理中'; + @override String couldNotReach({required Object url, required Object error}) => '${url}に接続できませんでした: ${error}'; + @override String noInstanceAtUrl({required Object url, required Object status}) => '${url}にSeerrインスタンスがありません(HTTP ${status})'; + @override String get notInitialized => 'このSeerrインスタンスでは初回セットアップが完了していません'; + @override String get noPlexTokenForReauth => '再サインインに使用できるPlexトークンがありません'; + @override String get noStoredCredentials => '再サインインに使用できる保存済みの認証情報がありません'; + @override String get signInRejected => 'サインインが拒否されました'; + @override String get noSessionCookie => 'Seerrからセッションクッキーが発行されませんでした'; + @override String get freshCookieRejected => 'Seerrが新しいセッションクッキーを拒否しました'; + @override String get noUserInformation => 'Seerrからユーザー情報が返されませんでした'; + @override String get sessionRejectedAfterReauth => '再サインイン後にセッションが拒否されました'; } // Path: services @@ -1995,6 +2085,24 @@ class _Translations$addServer$ja extends Translations$addServer$en { @override String connectToMediaBrowserCardSubtitleScoped({required Object product, required Object name}) => '${product}サーバーにサインインします。「${name}」に紐付けられます。'; @override String get borrowFromAnotherProfile => '別のプロフィールの接続を利用'; @override String get borrowFromAnotherProfileSubtitle => '別のプロフィールの接続を再利用します。PINで保護されたプロフィールにはPINが必要です。'; + @override String get invalidCredentials => 'ユーザー名またはパスワードが正しくありません'; + @override String get authResponseNotJson => '認証レスポンスが有効なJSONではありません'; + @override String get quickConnectRejected => 'Quick Connectがサーバーに拒否されました'; + @override String get quickConnectNotJson => 'Quick Connectのレスポンスが有効なJSONではありません'; + @override String get quickConnectMissingFields => 'Quick Connectのレスポンスにコードまたはシークレットがありません'; + @override String get quickConnectPollRejected => 'Quick Connectのポーリングがサーバーに拒否されました'; + @override String get serverTimedOut => 'サーバーが時間内に応答しませんでした'; + @override String get responseNotJson => 'サーバーのレスポンスが有効なJSONではありません'; + @override String responseMissingIdentity({required Object product}) => 'レスポンスにIDまたはサーバー名がありません。これは${product}サーバーですか?'; + @override String probeFailed({required Object error}) => 'サーバーに接続できませんでした: ${error}'; + @override String enterAtLeastOneUrl({required Object product}) => '${product}サーバーのURLを1つ以上入力してください'; + @override String noReachableServer({required Object product}) => '接続可能な${product}サーバーが見つかりませんでした'; + @override String urlsPointToDifferentServers({required Object product}) => 'これらのURLは異なる${product}サーバーを指しています'; + @override String urlDoesNotMatchServer({required Object product}) => 'このURLは${product}サーバーと一致しません'; + @override String get redirectUnsupported => 'サーバーからサポートされていないURLにリダイレクトされました'; + @override String redirectDifferentHost({required Object product}) => 'サーバーから別のホストにリダイレクトされました。最終的な${product}のURLを直接入力してください。'; + @override String get redirectInsecure => 'サーバーからHTTPSではない安全でないURLにリダイレクトされました'; + @override String redirectUnsupportedEnterFinal({required Object product}) => 'サーバーからサポートされていないURLにリダイレクトされました。最終的な${product}のURLを直接入力してください。'; } // Path: common.ratingSource @@ -2512,6 +2620,7 @@ class _Translations$services$deviceCode$ja extends Translations$services$deviceC // Translations @override String title({required Object service}) => '${service} で Plezy を有効化'; + @override String get instructions => 'QRコードをスキャンするか、以下のアドレスにアクセスしてこのコードを入力してください:'; @override String openToActivate({required Object service}) => '${service} を開いて有効化'; @override String get copyCode => 'アクティベーションコードをコピー'; @override String get waitingForAuthorization => '認証を待っています…'; @@ -2586,6 +2695,7 @@ extension on TranslationsJa { 'auth.quickConnectCancel' => 'キャンセル', 'auth.quickConnectExpired' => 'Quick Connectの有効期限が切れました。もう一度お試しください。', 'auth.localDataRecoveryRequired' => 'ローカルのサインイン情報と保留中の再生データを安全に復元できませんでした。もう一度サインインしてください。', + 'auth.pinCheckRejected' => 'Plex PINの確認が拒否されました', 'common.cancel' => 'キャンセル', 'common.save' => '保存', 'common.close' => '閉じる', @@ -2642,6 +2752,9 @@ extension on TranslationsJa { 'common.ratingSource.trakt' => 'Trakt', 'common.ratingSource.rottenTomatoesCritic' => 'Rotten Tomatoes 批評家', 'common.ratingSource.rottenTomatoesAudience' => 'Rotten Tomatoes 観客', + 'common.notAvailable' => 'N/A', + 'common.url' => 'URL', + 'common.letterKeys' => 'ABC', 'screens.licenses' => 'ライセンス', 'screens.switchProfile' => 'プロフィール切替', 'screens.subtitleStyling' => '字幕スタイル', @@ -2881,6 +2994,8 @@ extension on TranslationsJa { 'settings.showNavBarLabels' => 'ナビゲーションバーのラベルを表示', 'settings.showNavBarLabelsDescription' => 'ナビゲーションバーのアイコンの下にテキストラベルを表示', 'settings.startupSection' => '起動時のセクション', + 'settings.showExploreTab' => '「探す」タブを表示', + 'settings.showExploreTabDescription' => 'Plex Discoverと接続済みのトラッカーのコンテンツを「探す」タブに表示します', 'settings.liveTvDefaultFavorites' => 'お気に入りチャンネルをデフォルトに', 'settings.liveTvDefaultFavoritesDescription' => 'ライブTVを開いたときにお気に入りチャンネルのみ表示', 'settings.display' => 'ディスプレイ', @@ -2892,6 +3007,7 @@ extension on TranslationsJa { 'settings.subtitlesAndConfig' => '字幕と設定', 'settings.seekAndTiming' => 'シークとタイミング', 'settings.behavior' => '動作', + 'settings.exportDialogTitle' => 'Plezyの設定をエクスポート', 'search.hint' => '映画、番組、音楽を検索…', 'search.tryDifferentTerm' => '別の検索語をお試しください', 'search.searchYourMedia' => 'メディアを検索', @@ -3040,6 +3156,8 @@ extension on TranslationsJa { 'fileInfo.flagHearingImpaired' => '聴覚障害者向け', 'fileInfo.flagDub' => '吹替', 'fileInfo.flagOriginal' => 'オリジナル', + 'fileInfo.channelsMono' => 'モノラル', + 'fileInfo.dolbyVisionProfile' => ({required Object profile}) => 'プロファイル${profile}', 'mediaMenu.markAsWatched' => '視聴済みにする', 'mediaMenu.markAsUnwatched' => '未視聴にする', 'mediaMenu.removeFromContinueWatching' => '視聴中から削除', @@ -3073,6 +3191,8 @@ extension on TranslationsJa { 'mediaMenu.rate' => '評価', 'mediaMenu.playFromBeginning' => '最初から再生', 'mediaMenu.playVersion' => 'バージョンを選んで再生…', + _ => null, + } ?? switch (path) { 'rateSheet.title' => '評価', 'rateSheet.server' => 'サーバー', 'rateSheet.favorite' => 'お気に入り', @@ -3082,8 +3202,6 @@ extension on TranslationsJa { 'rateSheet.noConnectedServices' => '評価するには、設定でサービスを接続してください。', 'accessibility.mediaCardMovie' => ({required Object title}) => '${title}、映画', 'accessibility.mediaCardShow' => ({required Object title}) => '${title}、テレビ番組', - _ => null, - } ?? switch (path) { 'accessibility.mediaCardEpisode' => ({required Object title, required Object episodeInfo}) => '${title}、${episodeInfo}', 'accessibility.mediaCardSeason' => ({required Object title, required Object seasonInfo}) => '${title}、${seasonInfo}', 'accessibility.mediaCardWatched' => '視聴済み', @@ -3104,6 +3222,11 @@ extension on TranslationsJa { 'accessibility.alphabetScrollHint' => '上下にスワイプして文字ごとに移動', 'accessibility.rowColumnPosition' => ({required Object rowCount, required Object row, required Object columnCount, required Object column}) => '${rowCount}行中${row}行、${columnCount}列中${column}列', 'accessibility.rowPosition' => ({required Object rowCount, required Object row}) => '${rowCount}行中${row}行', + 'accessibility.autoScrollPlay' => '自動スクロールを再生', + 'accessibility.autoScrollPause' => '自動スクロールを一時停止', + 'accessibility.hueShort' => 'H', + 'accessibility.saturationShort' => 'S', + 'accessibility.valueShort' => 'V', 'tooltips.shufflePlay' => 'シャッフル再生', 'tooltips.playTrailer' => '予告編を再生', 'tooltips.markAsWatched' => '視聴済みにする', @@ -3194,6 +3317,15 @@ extension on TranslationsJa { 'videoControls.subtitleDownloadedNotApplied' => '字幕はダウンロードされましたが、選択できませんでした', 'videoControls.subtitleDownloadFailed' => '字幕のダウンロードに失敗しました', 'videoControls.searchLanguages' => '言語を検索…', + 'videoControls.skipIntro' => 'イントロをスキップ', + 'videoControls.skipCredits' => 'クレジットをスキップ', + 'videoControls.nextEpisode' => '次のエピソード', + 'videoControls.subtitleTrack' => ({required Object n}) => 'トラック${n}', + 'videoControls.subtitleFile' => ({required Object name}) => '字幕${name}', + 'videoControls.forcedTrack' => ({required Object label}) => '${label}(強制)', + 'videoControls.osdSubtitlesOff' => '字幕: オフ', + 'videoControls.osdSubtitles' => ({required Object track}) => '字幕: ${track}', + 'videoControls.osdAudio' => ({required Object track}) => '音声: ${track}', 'messages.markedAsWatched' => '視聴済みにしました', 'messages.markedAsUnwatched' => '未視聴にしました', 'messages.markedAsWatchedOffline' => '視聴済みにしました(オンライン時に同期)', @@ -3243,9 +3375,18 @@ extension on TranslationsJa { 'messages.serverLimitBody' => 'サーバーエラー(HTTP 500)。帯域幅/トランスコード制限により拒否された可能性があります。所有者に調整を依頼してください。', 'messages.mediaUnreadableTitle' => 'ファイルを利用できません', 'messages.mediaUnreadableBody' => 'サーバーはこのアイテムを見つけましたが、そのファイルを読み取れませんでした(HTTP 404)。ファイルが移動・削除されたか、ストレージがオフラインの可能性があります。サーバーの管理者にファイルの確認とライブラリの再スキャンを依頼してください。', + 'messages.serverBusyTitle' => 'ストリームを利用できません', + 'messages.serverBusyBody' => 'サーバーがこのファイルのストリーミングを繰り返し拒否しました(HTTP 503)。サーバーが再起動中またはビジー状態か、ファイルのストレージがオフラインの可能性があります。しばらくしてからもう一度お試しください。問題が続く場合は、サーバーの所有者にサーバーとファイルのストレージを確認するよう依頼してください。', 'messages.logsUploaded' => 'ログをアップロードしました', 'messages.logsUploadFailed' => 'ログのアップロードに失敗しました', 'messages.logId' => 'ログID', + 'messages.burnedSubtitlesUseMenu' => '字幕はこのストリームに焼き付けられています。字幕メニューから変更してください。', + 'messages.noVideoUrl' => '利用可能な動画URLがありません', + 'messages.playbackNoMediaSources' => 'サーバーから再生可能なメディアソースが返されませんでした', + 'messages.playbackDataNotPrepared' => '再生データの準備が完了する前に再生が開始されました', + 'messages.streamSelectionUnavailable' => 'このソースではストリームを選択できません', + 'messages.streamSelectionFailed' => '選択したストリームを適用できませんでした', + 'messages.serverUnavailableForProfile' => '現在のプロフィールで利用可能なサーバーがありません', 'subtitlingStyling.text' => 'テキスト', 'subtitlingStyling.border' => '枠線', 'subtitlingStyling.background' => '背景', @@ -3262,6 +3403,8 @@ extension on TranslationsJa { 'subtitlingStyling.overrideStrip' => 'スタイルを削除', 'subtitlingStyling.positionTop' => '上', 'subtitlingStyling.positionBottom' => '下', + 'subtitlingStyling.anchorToScreen' => '画面に固定', + 'subtitlingStyling.anchorToScreenDescription' => 'ワイドスクリーン映像の下にある黒帯にテキスト字幕を表示します', 'subtitlingStyling.bold' => '太字', 'subtitlingStyling.italic' => '斜体', 'subtitlingStyling.renderResolution' => 'レンダリング解像度', @@ -3344,6 +3487,7 @@ extension on TranslationsJa { 'profiles.pinExplain' => 'プロフィール切り替えには4桁のPINが必要です。', 'profiles.continueButton' => '続ける', 'profiles.pinsDontMatch' => 'PINが一致しません', + 'profiles.tokenIdentityMismatch' => 'Plexプロフィールのトークンから予期しないサーバーが特定されました', 'connections.sectionTitle' => '接続', 'connections.addConnection' => '接続を追加', 'connections.addConnectionSubtitleNoProfile' => 'Plexでサインインするか、Jellyfinサーバーに接続', @@ -3377,6 +3521,7 @@ extension on TranslationsJa { 'discover.tvShow' => 'テレビ番組', 'discover.minutesLeft' => ({required Object minutes}) => '残り${minutes}分', 'discover.moreLikeThis' => '似ている作品', + 'discover.titleCount' => ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('ja'))(n, other: '${n}作品', ), 'errors.searchFailed' => ({required Object error}) => '検索に失敗しました: ${error}', 'errors.searchUnavailable' => '検索中にメディアサーバーへ接続できませんでした。', 'errors.connectionTimeout' => ({required Object context}) => '${context}の読み込み中に接続がタイムアウトしました', @@ -3549,7 +3694,10 @@ extension on TranslationsJa { 'explore.characters' => 'キャラクター', 'explore.addToWatchlist' => 'ウォッチリストに追加', 'explore.removeFromWatchlist' => 'ウォッチリストから削除', + 'explore.addedToWatchlist' => 'ウォッチリストに追加しました', + 'explore.removedFromWatchlist' => 'ウォッチリストから削除しました', 'explore.watchlistUpdateFailed' => 'ウォッチリストを更新できませんでした', + 'explore.watchlistNoMatch' => 'このアイテムに一致するウォッチリスト項目が見つかりませんでした', 'explore.notInLibrary' => 'ライブラリにありません', 'explore.inTheseLibraries' => 'これらのライブラリにあります', 'explore.checkingLibrary' => 'ライブラリを確認中…', @@ -3557,6 +3705,8 @@ extension on TranslationsJa { 'explore.emptyMessage' => ({required Object source}) => '${source}にコンテンツが追加されると、ここに表示されます。', 'explore.searchHint' => ({required Object source}) => '${source}を検索', 'explore.searchEmpty' => ({required Object query}) => '「${query}」の結果が見つかりません', + _ => null, + } ?? switch (path) { 'explore.searchPrompt' => ({required Object source}) => '${source}で映画やテレビ番組を検索します。', 'explore.searchFailed' => '検索に失敗しました。接続を確認してもう一度お試しください。', 'explore.badge.rankPopular' => ({required Object n}) => '人気 #${n}', @@ -3596,8 +3746,6 @@ extension on TranslationsJa { 'explore.stats.completed' => ({required Object n}) => '${n}人が視聴済み', 'explore.stats.onHold' => ({required Object n}) => '${n}人が保留中', 'explore.stats.dropped' => ({required Object n}) => '${n}人が視聴中止', - _ => null, - } ?? switch (path) { 'explore.season.winter' => '冬', 'explore.season.spring' => '春', 'explore.season.summer' => '夏', @@ -3694,6 +3842,9 @@ extension on TranslationsJa { 'liveTv.watchChannel' => 'チャンネルを視聴', 'liveTv.favorites' => 'お気に入り', 'liveTv.reorderFavorites' => 'お気に入りを並べ替え', + 'liveTv.noFavoriteChannels' => 'お気に入りのチャンネルがありません', + 'liveTv.noFavoriteChannelsHint' => 'すべてのチャンネルを表示し、チャンネルを長押ししてお気に入りに追加してください。', + 'liveTv.showAllChannels' => 'すべてのチャンネルを表示', 'liveTv.favoritesLoadFailed' => 'お気に入りを読み込めませんでした。接続を確認してもう一度お試しください。', 'liveTv.favoritesUpdateFailed' => 'お気に入りを更新できませんでした。接続を確認してもう一度お試しください。', 'liveTv.joinSession' => '進行中のセッションに参加', @@ -3733,6 +3884,11 @@ extension on TranslationsJa { 'liveTv.guideReloadRequested' => '番組表の更新をリクエストしました', 'liveTv.rulesProcessRequested' => '録画ルールの再評価をリクエストしました', 'liveTv.recordShow' => '番組を録画', + 'liveTv.startingInMinutes' => ({required Object minutes}) => '${minutes}分後に開始', + 'liveTv.dayAtTime' => ({required Object day, required Object time}) => '${day} ${time}', + 'liveTv.invalidPlaybackData' => ({required Object product}) => '${product}から無効なライブTV再生データが返されました', + 'liveTv.failedToStartChannel' => 'ライブチャンネルを開始できませんでした', + 'liveTv.failedToBuildStreamUrl' => 'ストリームURLを生成できませんでした', 'collections.title' => 'コレクション', 'collections.collection' => 'コレクション', 'collections.empty' => 'コレクションは空です', @@ -3801,6 +3957,8 @@ extension on TranslationsJa { 'music.repeat' => 'リピート', 'music.repeatAll' => '全曲リピート', 'music.repeatOne' => '1曲リピート', + 'music.instantMixNoServer' => 'インスタントミックスに利用できるサーバーがありません', + 'music.noAudioUrl' => ({required Object track}) => '${track}で利用可能な音声URLがありません', 'watchTogether.title' => '一緒に見る', 'watchTogether.description' => '友達や家族と同期してコンテンツを視聴', 'watchTogether.createSession' => 'セッションを作成', @@ -3866,6 +4024,7 @@ extension on TranslationsJa { 'watchTogether.removeRoom' => '削除', 'watchTogether.guestSwitchUnavailable' => '切り替えられません — 同期に必要なサーバーを利用できません', 'watchTogether.guestSwitchFailed' => '切り替えられません — このサーバーにコンテンツが見つかりません', + 'watchTogether.defaultDisplayName' => 'ユーザー', 'downloads.title' => 'ダウンロード', 'downloads.manage' => '管理', 'downloads.tvShows' => 'テレビ番組', @@ -3966,6 +4125,16 @@ extension on TranslationsJa { 'downloads.backgroundWarning.statusUnknown' => '未確認', 'downloads.backgroundWarning.settingsUnavailable' => 'この端末ではシステム設定を開けませんでした', 'downloads.backgroundWarning.linkUnavailable' => 'この端末ではdontkillmyapp.comを開けませんでした', + 'downloads.unknownShow' => '不明な番組', + 'downloads.unknownSeason' => '不明なシーズン', + 'downloads.unknownAlbum' => '不明なアルバム', + 'downloads.completedOfTotal' => ({required Object completed, required Object total}) => '${completed}/${total}完了', + 'downloads.errorFileNotFound' => 'ファイルが見つかりません(404)', + 'downloads.errorDownloadFailed' => 'ダウンロードに失敗しました', + 'downloads.errorPostProcessing' => ({required Object error}) => '後処理に失敗しました: ${error}', + 'downloads.notificationDownloading' => 'ダウンロード中…', + 'downloads.notificationComplete' => 'ダウンロードが完了しました', + 'downloads.notificationPaused' => 'ダウンロードを一時停止しました', 'shaders.title' => 'シェーダー', 'shaders.noShaderDescription' => '映像補正なし', 'shaders.nvscalerDescription' => 'NVIDIA画像スケーリングで映像をより鮮明にします', @@ -4045,14 +4214,24 @@ extension on TranslationsJa { 'companionRemote.errors.failedToConnectAnyAddress' => 'どのアドレスにも接続できませんでした', 'companionRemote.errors.connectionLostAfterAttempts' => ({required Object attempts}) => '${attempts}回試行後に接続が切断されました', 'companionRemote.errors.connectionLost' => '接続が切断されました', + 'companionRemote.closedBeforeAuth' => '認証前に接続が切断されました', 'videoSettings.playbackSpeed' => '再生速度', 'videoSettings.normalSpeed' => '標準', 'videoSettings.sleepTimerActive' => ({required Object duration}) => '作動中(${duration})', 'videoSettings.zoom' => 'ズーム', + _ => null, + } ?? switch (path) { 'videoSettings.sleepTimer' => 'スリープタイマー', 'videoSettings.audioSync' => '音声同期', 'videoSettings.subtitleSync' => '字幕同期', 'videoSettings.hdr' => 'HDR', + 'videoSettings.hdrUnsupported' => 'ここではHDRを利用できません。このデスクトップコンポジターまたは映像出力はHDRに対応していません。', + 'videoSettings.hdrToneMapping' => 'HDRトーンマッピング', + 'videoSettings.hdrToneMappingCompositor' => 'コンポジター', + 'videoSettings.hdrToneMappingCompositorDescription' => 'ソースのHDRメタデータをそのまま渡し、デスクトップコンポジターにマッピングさせます。', + 'videoSettings.hdrToneMappingPlayer' => 'プレーヤー', + 'videoSettings.hdrToneMappingPlayerDescription' => 'プレーヤーでディスプレイのピーク輝度に合わせてマッピングし、その結果をコンポジターに通知します。', + 'videoSettings.hdrToneMappingFailed' => 'HDRトーンマッピングを変更できませんでした。以前のモードが引き続き有効です。', 'videoSettings.audioOutput' => '音声出力', 'videoSettings.performanceOverlay' => 'パフォーマンスオーバーレイ', 'videoSettings.audioOutputDolbyAtmos' => 'Dolby Atmos', @@ -4097,6 +4276,16 @@ extension on TranslationsJa { 'performanceOverlay.player' => 'プレーヤー', 'performanceOverlay.memory' => 'メモリ', 'performanceOverlay.uiFps' => 'UI FPS', + 'performanceOverlay.fps' => 'FPS', + 'performanceOverlay.decoderAndroidHw' => 'Android HW', + 'performanceOverlay.decoderNvidiaHw' => 'NVIDIA HW', + 'performanceOverlay.decoderQualcommHw' => 'Qualcomm HW', + 'performanceOverlay.decoderMediatekHw' => 'MediaTek HW', + 'performanceOverlay.decoderExynosHw' => 'Exynos HW', + 'performanceOverlay.decoderSoftware' => 'ソフトウェア', + 'performanceOverlay.decoderHardware' => 'ハードウェア', + 'performanceOverlay.tunnelingActive' => '有効', + 'performanceOverlay.dvRpuFailed' => ({required Object converted, required Object failures}) => '${converted}(${failures}件失敗)', 'externalPlayer.title' => '外部プレーヤー', 'externalPlayer.useExternalPlayer' => '外部プレーヤーを使用', 'externalPlayer.useExternalPlayerDescription' => '動画を別のアプリで開きます', @@ -4110,8 +4299,6 @@ extension on TranslationsJa { 'externalPlayer.playerPackage' => 'パッケージ名', 'externalPlayer.playerUrlScheme' => 'URLスキーム', 'externalPlayer.off' => 'オフ', - _ => null, - } ?? switch (path) { 'externalPlayer.launchFailed' => '外部プレーヤーの起動に失敗しました', 'externalPlayer.appNotInstalled' => ({required Object name}) => '${name}がインストールされていません', 'externalPlayer.playInExternalPlayer' => '外部プレーヤーで再生', @@ -4245,6 +4432,16 @@ extension on TranslationsJa { 'seerr.statusPartiallyAvailable' => '一部利用可能', 'seerr.statusRequested' => 'リクエスト済み', 'seerr.statusProcessing' => '処理中', + 'seerr.couldNotReach' => ({required Object url, required Object error}) => '${url}に接続できませんでした: ${error}', + 'seerr.noInstanceAtUrl' => ({required Object url, required Object status}) => '${url}にSeerrインスタンスがありません(HTTP ${status})', + 'seerr.notInitialized' => 'このSeerrインスタンスでは初回セットアップが完了していません', + 'seerr.noPlexTokenForReauth' => '再サインインに使用できるPlexトークンがありません', + 'seerr.noStoredCredentials' => '再サインインに使用できる保存済みの認証情報がありません', + 'seerr.signInRejected' => 'サインインが拒否されました', + 'seerr.noSessionCookie' => 'Seerrからセッションクッキーが発行されませんでした', + 'seerr.freshCookieRejected' => 'Seerrが新しいセッションクッキーを拒否しました', + 'seerr.noUserInformation' => 'Seerrからユーザー情報が返されませんでした', + 'seerr.sessionRejectedAfterReauth' => '再サインイン後にセッションが拒否されました', 'services.title' => 'サービス', 'services.hubSubtitle' => '視聴の進捗を同期して、新しいタイトルをリクエストします。', 'services.notConnected' => '未接続', @@ -4260,6 +4457,7 @@ extension on TranslationsJa { 'services.names.seerr' => 'Seerr', 'services.names.mdblist' => 'MDBList', 'services.deviceCode.title' => ({required Object service}) => '${service} で Plezy を有効化', + 'services.deviceCode.instructions' => 'QRコードをスキャンするか、以下のアドレスにアクセスしてこのコードを入力してください:', 'services.deviceCode.openToActivate' => ({required Object service}) => '${service} を開いて有効化', 'services.deviceCode.copyCode' => 'アクティベーションコードをコピー', 'services.deviceCode.waitingForAuthorization' => '認証を待っています…', @@ -4309,6 +4507,24 @@ extension on TranslationsJa { 'addServer.connectToMediaBrowserCardSubtitleScoped' => ({required Object product, required Object name}) => '${product}サーバーにサインインします。「${name}」に紐付けられます。', 'addServer.borrowFromAnotherProfile' => '別のプロフィールの接続を利用', 'addServer.borrowFromAnotherProfileSubtitle' => '別のプロフィールの接続を再利用します。PINで保護されたプロフィールにはPINが必要です。', + 'addServer.invalidCredentials' => 'ユーザー名またはパスワードが正しくありません', + 'addServer.authResponseNotJson' => '認証レスポンスが有効なJSONではありません', + 'addServer.quickConnectRejected' => 'Quick Connectがサーバーに拒否されました', + 'addServer.quickConnectNotJson' => 'Quick Connectのレスポンスが有効なJSONではありません', + 'addServer.quickConnectMissingFields' => 'Quick Connectのレスポンスにコードまたはシークレットがありません', + 'addServer.quickConnectPollRejected' => 'Quick Connectのポーリングがサーバーに拒否されました', + 'addServer.serverTimedOut' => 'サーバーが時間内に応答しませんでした', + 'addServer.responseNotJson' => 'サーバーのレスポンスが有効なJSONではありません', + 'addServer.responseMissingIdentity' => ({required Object product}) => 'レスポンスにIDまたはサーバー名がありません。これは${product}サーバーですか?', + 'addServer.probeFailed' => ({required Object error}) => 'サーバーに接続できませんでした: ${error}', + 'addServer.enterAtLeastOneUrl' => ({required Object product}) => '${product}サーバーのURLを1つ以上入力してください', + 'addServer.noReachableServer' => ({required Object product}) => '接続可能な${product}サーバーが見つかりませんでした', + 'addServer.urlsPointToDifferentServers' => ({required Object product}) => 'これらのURLは異なる${product}サーバーを指しています', + 'addServer.urlDoesNotMatchServer' => ({required Object product}) => 'このURLは${product}サーバーと一致しません', + 'addServer.redirectUnsupported' => 'サーバーからサポートされていないURLにリダイレクトされました', + 'addServer.redirectDifferentHost' => ({required Object product}) => 'サーバーから別のホストにリダイレクトされました。最終的な${product}のURLを直接入力してください。', + 'addServer.redirectInsecure' => 'サーバーからHTTPSではない安全でないURLにリダイレクトされました', + 'addServer.redirectUnsupportedEnterFinal' => ({required Object product}) => 'サーバーからサポートされていないURLにリダイレクトされました。最終的な${product}のURLを直接入力してください。', _ => null, }; } diff --git a/lib/i18n/strings_kk.g.dart b/lib/i18n/strings_kk.g.dart index 4a40394f..72979f4e 100644 --- a/lib/i18n/strings_kk.g.dart +++ b/lib/i18n/strings_kk.g.dart @@ -123,6 +123,7 @@ class _Translations$auth$kk extends Translations$auth$en { @override String get quickConnectCancel => 'Бас тарту'; @override String get quickConnectExpired => 'Жылдам қосылу мерзімі өтті. Қайтадан байқап көріңіз.'; @override String get localDataRecoveryRequired => 'Plezy жергілікті кіру мәліметтерін қалпына келтіре алмады. Қайтадан кіріңіз.'; + @override String get pinCheckRejected => 'Plex PIN кодын тексеру қабылданбады'; } // Path: common @@ -178,6 +179,9 @@ class _Translations$common$kk extends Translations$common$en { @override String get exitFullscreen => 'Толық экраннан шығу'; @override String get pressBackAgainToExit => 'Шығу үшін артқа түймесін қайтадан басыңыз'; @override late final _Translations$common$ratingSource$kk ratingSource = _Translations$common$ratingSource$kk._(_root); + @override String get notAvailable => 'N/A'; + @override String get url => 'URL'; + @override String get letterKeys => 'ABC'; } // Path: screens @@ -444,6 +448,8 @@ class _Translations$settings$kk extends Translations$settings$en { @override String get showNavBarLabels => 'Навигация панелінің мәтіндерін көрсету'; @override String get showNavBarLabelsDescription => 'Навигация белгішелерінің астында мәтінді көрсету'; @override String get startupSection => 'Бастапқы бөлім'; + @override String get showExploreTab => '«Шолу» қойындысын көрсету'; + @override String get showExploreTabDescription => 'Plex шолуынан және қосылған трекерлерден алынған контенті бар «Шолу» қойындысын көрсету'; @override String get liveTvDefaultFavorites => 'Тікелей TV-де таңдаулы арналарды әдепкі ету'; @override String get liveTvDefaultFavoritesDescription => 'Тікелей TV ашылғанда тек таңдаулы арналарды көрсету'; @override String get display => 'Дисплей'; @@ -455,6 +461,7 @@ class _Translations$settings$kk extends Translations$settings$en { @override String get subtitlesAndConfig => 'Субтитрлер мен конфигурация'; @override String get seekAndTiming => 'Айналдыру және уақытты реттеу'; @override String get behavior => 'Мінез-құлық'; + @override String get exportDialogTitle => 'Plezy параметрлерін экспорттау'; } // Path: search @@ -606,6 +613,8 @@ class _Translations$fileInfo$kk extends Translations$fileInfo$en { @override String get flagHearingImpaired => 'Есту қабілеті бұзылғандар үшін'; @override String get flagDub => 'Дубляж'; @override String get flagOriginal => 'Түпнұсқа'; + @override String get channelsMono => 'Моно'; + @override String dolbyVisionProfile({required Object profile}) => '${profile} профилі'; } // Path: mediaMenu @@ -704,6 +713,11 @@ class _Translations$accessibility$kk extends Translations$accessibility$en { @override String get alphabetScrollHint => 'Әріптер бойынша өту үшін жоғары немесе төмен сырғытыңыз'; @override String rowColumnPosition({required Object row, required Object rowCount, required Object column, required Object columnCount}) => 'Жол ${row} / ${rowCount}, баған ${column} / ${columnCount}'; @override String rowPosition({required Object row, required Object rowCount}) => 'Жол ${row} / ${rowCount}'; + @override String get autoScrollPlay => 'Автоайналдыруды бастау'; + @override String get autoScrollPause => 'Автоайналдыруды кідірту'; + @override String get hueShort => 'H'; + @override String get saturationShort => 'S'; + @override String get valueShort => 'V'; } // Path: tooltips @@ -815,6 +829,15 @@ class _Translations$videoControls$kk extends Translations$videoControls$en { @override String get subtitleDownloadedNotApplied => 'Субтитр жүктелді, бірақ қолданылмады'; @override String get subtitleDownloadFailed => 'Субтитрді жүктеу мүмкін болмады'; @override String get searchLanguages => 'Тілдерден іздеу...'; + @override String get skipIntro => 'Кіріспені өткізу'; + @override String get skipCredits => 'Титрлерді өткізу'; + @override String get nextEpisode => 'Келесі бөлім'; + @override String subtitleTrack({required Object n}) => 'Жол ${n}'; + @override String subtitleFile({required Object name}) => 'Субтитр ${name}'; + @override String forcedTrack({required Object label}) => '${label} (Мәжбүрлі)'; + @override String get osdSubtitlesOff => 'Субтитр: өшірулі'; + @override String osdSubtitles({required Object track}) => 'Субтитр: ${track}'; + @override String osdAudio({required Object track}) => 'Дыбыс: ${track}'; } // Path: messages @@ -876,9 +899,18 @@ class _Translations$messages$kk extends Translations$messages$en { @override String get serverLimitBody => 'Сервер қатесі (HTTP 500). Шектеу бұл сеансты қабылдамады.'; @override String get mediaUnreadableTitle => 'Файл қолжетімсіз'; @override String get mediaUnreadableBody => 'Сервер бұл элементті тапты, бірақ оның файлын оқи алмады (HTTP 404). Файл жылжытылған, өшірілген немесе оның сақтау орны қолжетімсіз болуы мүмкін. Сервер иесінен файлды тексеріп, кітапхананы қайта сканерлеуді сұраңыз.'; + @override String get serverBusyTitle => 'Ағын қолжетімсіз'; + @override String get serverBusyBody => 'Сервер бұл файлды ағынмен жіберуден қайта-қайта бас тартты (HTTP 503). Ол қайта іске қосылып, бос емес болуы немесе файл сақталған қойма офлайн болуы мүмкін. Сәлден соң қайталап көріңіз — бұл жалғаса берсе, сервер иесінен серверді және файл қоймасын тексеруін сұраңыз.'; @override String get logsUploaded => 'Журналдар жүктелді'; @override String get logsUploadFailed => 'Журналдарды жүктеу мүмкін болмады'; @override String get logId => 'Журнал ID-сі'; + @override String get burnedSubtitlesUseMenu => 'Субтитрлер бұл ағынға кіріктірілген. Оларды субтитр мәзірінен өзгертіңіз.'; + @override String get noVideoUrl => 'Бейне URL-і қолжетімді емес'; + @override String get playbackNoMediaSources => 'Сервер ойнатуға болатын медиа көздерін қайтармады'; + @override String get playbackDataNotPrepared => 'Ойнату деректері дайын болмай тұрып басталды'; + @override String get streamSelectionUnavailable => 'Бұл көз үшін ағынды таңдау қолжетімді емес'; + @override String get streamSelectionFailed => 'Таңдалған ағындарды қолдану мүмкін болмады'; + @override String get serverUnavailableForProfile => 'Белсенді профиль үшін қолжетімді сервер жоқ'; } // Path: subtitlingStyling @@ -904,6 +936,8 @@ class _Translations$subtitlingStyling$kk extends Translations$subtitlingStyling$ @override String get overrideStrip => 'Форматтауды жою'; @override String get positionTop => 'Жоғары'; @override String get positionBottom => 'Төмен'; + @override String get anchorToScreen => 'Экранға бекіту'; + @override String get anchorToScreenDescription => 'Мәтіндік субтитрлерді кең экранды бейненің астындағы қара жолақтарда көрсету'; @override String get bold => 'Қалың'; @override String get italic => 'Көлбеу'; @override String get renderResolution => 'Рендеринг ажыратымдылығы'; @@ -1013,6 +1047,7 @@ class _Translations$profiles$kk extends Translations$profiles$en { @override String get pinExplain => 'Профильдер арасында ауысу үшін 4 таңбалы PIN код қажет.'; @override String get continueButton => 'Жалғастыру'; @override String get pinsDontMatch => 'PIN кодтар сәйкес келмейді'; + @override String get tokenIdentityMismatch => 'Plex профилінің токені күтілмеген серверді анықтады'; } // Path: connections @@ -1064,6 +1099,10 @@ class _Translations$discover$kk extends Translations$discover$en { @override String get tvShow => 'TV Шоу'; @override String minutesLeft({required Object minutes}) => '${minutes} мин қалды'; @override String get moreLikeThis => 'Ұқсастар'; + @override String titleCount({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('kk'))(n, + one: '${n} атау', + other: '${n} атау', + ); } // Path: errors @@ -1276,7 +1315,10 @@ class _Translations$explore$kk extends Translations$explore$en { @override String get characters => 'Кейіпкерлер'; @override String get addToWatchlist => 'Көру тізіміне қосу'; @override String get removeFromWatchlist => 'Көру тізімінен өшіру'; + @override String get addedToWatchlist => 'Көру тізіміне қосылды'; + @override String get removedFromWatchlist => 'Көру тізімінен алынды'; @override String get watchlistUpdateFailed => 'Көру тізімін жаңарту мүмкін болмады'; + @override String get watchlistNoMatch => 'Бұл элементті көру тізімімен сәйкестендіру мүмкін болмады'; @override String get notInLibrary => 'Кітапханаңызда жоқ'; @override String get inTheseLibraries => 'Осы кітапханаларда бар'; @override String get checkingLibrary => 'Кітапхана тексерілуде...'; @@ -1337,6 +1379,9 @@ class _Translations$liveTv$kk extends Translations$liveTv$en { @override String get watchChannel => 'Арнаны көру'; @override String get favorites => 'Таңдаулылар'; @override String get reorderFavorites => 'Таңдаулыларды қайта реттеу'; + @override String get noFavoriteChannels => 'Таңдаулы арналар жоқ'; + @override String get noFavoriteChannelsHint => 'Барлық арнаны көрсетіп, таңдаулыларға қосу үшін арнаны ұзақ басып тұрыңыз.'; + @override String get showAllChannels => 'Барлық арнаны көрсету'; @override String get favoritesLoadFailed => 'Таңдаулыларды жүктеу мүмкін болмады.'; @override String get favoritesUpdateFailed => 'Таңдаулыларды жаңарту мүмкін болмады.'; @override String get joinSession => 'Сеансқа қосылу'; @@ -1376,6 +1421,11 @@ class _Translations$liveTv$kk extends Translations$liveTv$en { @override String get guideReloadRequested => 'Бағдарламаны жаңарту сұралды'; @override String get rulesProcessRequested => 'Ережелерді қайта бағалау сұралды'; @override String get recordShow => 'Шоуды жазу'; + @override String startingInMinutes({required Object minutes}) => '${minutes} мин кейін басталады'; + @override String dayAtTime({required Object day, required Object time}) => '${day}, ${time}'; + @override String invalidPlaybackData({required Object product}) => '${product} жарамсыз тікелей TV ойнату деректерін қайтарды'; + @override String get failedToStartChannel => 'Тікелей эфир арнасын іске қосу мүмкін болмады'; + @override String get failedToBuildStreamUrl => 'Ағын URL-ін құру мүмкін болмады'; } // Path: collections @@ -1474,6 +1524,8 @@ class _Translations$music$kk extends Translations$music$en { @override String get repeat => 'Қайталау'; @override String get repeatAll => 'Барлығын қайталау'; @override String get repeatOne => 'Біреуін қайталау'; + @override String get instantMixNoServer => 'Жедел микс үшін қолжетімді сервер жоқ'; + @override String noAudioUrl({required Object track}) => '${track} үшін аудио URL-і қолжетімді емес'; } // Path: watchTogether @@ -1548,6 +1600,7 @@ class _Translations$watchTogether$kk extends Translations$watchTogether$en { @override String get removeRoom => 'Өшіру'; @override String get guestSwitchUnavailable => 'Ауысу мүмкін болмады'; @override String get guestSwitchFailed => 'Ауысу мүмкін болмады — мазмұн табылмады'; + @override String get defaultDisplayName => 'Пайдаланушы'; } // Path: downloads @@ -1632,6 +1685,16 @@ class _Translations$downloads$kk extends Translations$downloads$en { @override String get syncRuleUnknownServer => 'Белгісіз сервер'; @override String get syncRuleListCreated => 'Синхрондау ережесі жасалды'; @override late final _Translations$downloads$backgroundWarning$kk backgroundWarning = _Translations$downloads$backgroundWarning$kk._(_root); + @override String get unknownShow => 'Белгісіз телешоу'; + @override String get unknownSeason => 'Белгісіз маусым'; + @override String get unknownAlbum => 'Белгісіз альбом'; + @override String completedOfTotal({required Object completed, required Object total}) => '${completed}/${total} аяқталды'; + @override String get errorFileNotFound => 'Файл табылмады (404)'; + @override String get errorDownloadFailed => 'Жүктеу сәтсіз аяқталды'; + @override String errorPostProcessing({required Object error}) => 'Кейінгі өңдеу сәтсіз аяқталды: ${error}'; + @override String get notificationDownloading => 'Жүктелуде...'; + @override String get notificationComplete => 'Жүктеу аяқталды'; + @override String get notificationPaused => 'Жүктеу кідіртілді'; } // Path: shaders @@ -1672,6 +1735,7 @@ class _Translations$companionRemote$kk extends Translations$companionRemote$en { @override late final _Translations$companionRemote$pairing$kk pairing = _Translations$companionRemote$pairing$kk._(_root); @override late final _Translations$companionRemote$remote$kk remote = _Translations$companionRemote$remote$kk._(_root); @override late final _Translations$companionRemote$errors$kk errors = _Translations$companionRemote$errors$kk._(_root); + @override String get closedBeforeAuth => 'Аутентификациядан бұрын байланыс жабылды'; } // Path: videoSettings @@ -1689,6 +1753,13 @@ class _Translations$videoSettings$kk extends Translations$videoSettings$en { @override String get audioSync => 'Аудио синхрондау'; @override String get subtitleSync => 'Субтитр синхрондау'; @override String get hdr => 'HDR'; + @override String get hdrUnsupported => 'HDR мұнда қолжетімді емес — бұл жұмыс үстелі композиторы немесе бейне шығысы оны өткізе алмайды.'; + @override String get hdrToneMapping => 'HDR тондарын түрлендіру'; + @override String get hdrToneMappingCompositor => 'Композитор'; + @override String get hdrToneMappingCompositorDescription => 'Дереккөздің HDR метадеректерін өзгеріссіз өткізіп, оларды жұмыс үстелі композиторына түрлендіруге мүмкіндік беру.'; + @override String get hdrToneMappingPlayer => 'Ойнатқыш'; + @override String get hdrToneMappingPlayerDescription => 'Ойнатқышта дисплейдің ең жоғары жарықтығына сәйкестендіріп, нәтижені композиторға хабарлау.'; + @override String get hdrToneMappingFailed => 'HDR тондарын түрлендіруді өзгерту мүмкін болмады — алдыңғы режим әлі де белсенді.'; @override String get audioOutput => 'Аудио шығысы'; @override String get performanceOverlay => 'Өнімділік панелі'; @override String get audioOutputDolbyAtmos => 'Dolby Atmos'; @@ -1742,6 +1813,16 @@ class _Translations$performanceOverlay$kk extends Translations$performanceOverla @override String get player => 'Ойнатқыш'; @override String get memory => 'Жады'; @override String get uiFps => 'Интерфейс (UI) FPS'; + @override String get fps => 'FPS'; + @override String get decoderAndroidHw => 'Android HW'; + @override String get decoderNvidiaHw => 'NVIDIA HW'; + @override String get decoderQualcommHw => 'Qualcomm HW'; + @override String get decoderMediatekHw => 'MediaTek HW'; + @override String get decoderExynosHw => 'Exynos HW'; + @override String get decoderSoftware => 'Бағдарламалық'; + @override String get decoderHardware => 'Аппараттық'; + @override String get tunnelingActive => 'Белсенді'; + @override String dvRpuFailed({required Object converted, required Object failures}) => '${converted} (${failures} сәтсіз аяқталды)'; } // Path: externalPlayer @@ -1942,6 +2023,16 @@ class _Translations$seerr$kk extends Translations$seerr$en { @override String get statusPartiallyAvailable => 'Жартылай қолжетімді'; @override String get statusRequested => 'Сұралды'; @override String get statusProcessing => 'Өңделуде'; + @override String couldNotReach({required Object url, required Object error}) => '${url} мекенжайына қосылу мүмкін болмады: ${error}'; + @override String noInstanceAtUrl({required Object url, required Object status}) => '${url} мекенжайында Seerr данасы жоқ (HTTP ${status})'; + @override String get notInitialized => 'Бұл Seerr данасының бастапқы баптауы аяқталмаған'; + @override String get noPlexTokenForReauth => 'Қайта кіру үшін Plex токені қолжетімді емес'; + @override String get noStoredCredentials => 'Қайта кіру үшін сақталған тіркелгі деректері жоқ'; + @override String get signInRejected => 'Кіру қабылданбады'; + @override String get noSessionCookie => 'Seerr сеанс cookie файлын бермеді'; + @override String get freshCookieRejected => 'Seerr жаңа сеанс cookie файлын қабылдамады'; + @override String get noUserInformation => 'Seerr пайдаланушы туралы мәліметтерді қайтармады'; + @override String get sessionRejectedAfterReauth => 'Қайта кіргеннен кейін сеанс қабылданбады'; } // Path: services @@ -2002,6 +2093,24 @@ class _Translations$addServer$kk extends Translations$addServer$en { @override String connectToMediaBrowserCardSubtitleScoped({required Object product, required Object name}) => '${product} серверіне кіріңіз. ${name} тіркелгісіне байланыстырылады.'; @override String get borrowFromAnotherProfile => 'Басқа профильден алу'; @override String get borrowFromAnotherProfileSubtitle => 'Басқа профильдің қосылымын қайта пайдалану.'; + @override String get invalidCredentials => 'Пайдаланушы аты немесе құпия сөз қате'; + @override String get authResponseNotJson => 'Аутентификация жауабы жарамды JSON болмады'; + @override String get quickConnectRejected => 'Сервер Quick Connect сұрауын қабылдамады'; + @override String get quickConnectNotJson => 'Quick Connect жауабы жарамды JSON болмады'; + @override String get quickConnectMissingFields => 'Quick Connect жауабында код немесе құпия кілт жоқ'; + @override String get quickConnectPollRejected => 'Сервер Quick Connect сұрауын тексеруді қабылдамады'; + @override String get serverTimedOut => 'Сервер уақытында жауап бермеді'; + @override String get responseNotJson => 'Сервер жауабы жарамды JSON болмады'; + @override String responseMissingIdentity({required Object product}) => 'Жауапта ID немесе сервер атауы жоқ — бұл ${product} сервері ме?'; + @override String probeFailed({required Object error}) => 'Серверге қосылу мүмкін болмады: ${error}'; + @override String enterAtLeastOneUrl({required Object product}) => 'Кемінде бір ${product} серверінің URL-ін енгізіңіз'; + @override String noReachableServer({required Object product}) => 'Қолжетімді ${product} сервері табылмады'; + @override String urlsPointToDifferentServers({required Object product}) => 'Бұл URL-дер әртүрлі ${product} серверлеріне бағыттайды'; + @override String urlDoesNotMatchServer({required Object product}) => 'Бұл URL ${product} серверіне сәйкес келмейді'; + @override String get redirectUnsupported => 'Сервер қолдау көрсетілмейтін URL-ге қайта бағыттады'; + @override String redirectDifferentHost({required Object product}) => 'Сервер басқа хостқа қайта бағыттады. Соңғы ${product} URL-ін тікелей енгізіңіз.'; + @override String get redirectInsecure => 'Сервер HTTPS мекенжайынан қауіпсіз емес URL-ге қайта бағыттады'; + @override String redirectUnsupportedEnterFinal({required Object product}) => 'Сервер қолдау көрсетілмейтін URL-ге қайта бағыттады. Соңғы ${product} URL-ін тікелей енгізіңіз.'; } // Path: common.ratingSource @@ -2521,6 +2630,7 @@ class _Translations$services$deviceCode$kk extends Translations$services$deviceC // Translations @override String title({required Object service}) => 'Plezy-ді ${service} қызметінде белсендіру'; + @override String get instructions => 'QR кодын сканерлеңіз немесе төмендегі мекенжайға өтіп, мына кодты енгізіңіз:'; @override String openToActivate({required Object service}) => 'Белсендіру үшін ${service} ашу'; @override String get copyCode => 'Белсендіру кодын көшіру'; @override String get waitingForAuthorization => 'Авторизация күтілуде…'; @@ -2595,6 +2705,7 @@ extension on TranslationsKk { 'auth.quickConnectCancel' => 'Бас тарту', 'auth.quickConnectExpired' => 'Жылдам қосылу мерзімі өтті. Қайтадан байқап көріңіз.', 'auth.localDataRecoveryRequired' => 'Plezy жергілікті кіру мәліметтерін қалпына келтіре алмады. Қайтадан кіріңіз.', + 'auth.pinCheckRejected' => 'Plex PIN кодын тексеру қабылданбады', 'common.cancel' => 'Бас тарту', 'common.save' => 'Сақтау', 'common.close' => 'Жабу', @@ -2651,6 +2762,9 @@ extension on TranslationsKk { 'common.ratingSource.trakt' => 'Trakt', 'common.ratingSource.rottenTomatoesCritic' => 'Rotten Tomatoes сыншылары', 'common.ratingSource.rottenTomatoesAudience' => 'Rotten Tomatoes көрермендері', + 'common.notAvailable' => 'N/A', + 'common.url' => 'URL', + 'common.letterKeys' => 'ABC', 'screens.licenses' => 'Лицензиялар', 'screens.switchProfile' => 'Профильді ауыстыру', 'screens.subtitleStyling' => 'Субтитр баптаулары', @@ -2890,6 +3004,8 @@ extension on TranslationsKk { 'settings.showNavBarLabels' => 'Навигация панелінің мәтіндерін көрсету', 'settings.showNavBarLabelsDescription' => 'Навигация белгішелерінің астында мәтінді көрсету', 'settings.startupSection' => 'Бастапқы бөлім', + 'settings.showExploreTab' => '«Шолу» қойындысын көрсету', + 'settings.showExploreTabDescription' => 'Plex шолуынан және қосылған трекерлерден алынған контенті бар «Шолу» қойындысын көрсету', 'settings.liveTvDefaultFavorites' => 'Тікелей TV-де таңдаулы арналарды әдепкі ету', 'settings.liveTvDefaultFavoritesDescription' => 'Тікелей TV ашылғанда тек таңдаулы арналарды көрсету', 'settings.display' => 'Дисплей', @@ -2901,6 +3017,7 @@ extension on TranslationsKk { 'settings.subtitlesAndConfig' => 'Субтитрлер мен конфигурация', 'settings.seekAndTiming' => 'Айналдыру және уақытты реттеу', 'settings.behavior' => 'Мінез-құлық', + 'settings.exportDialogTitle' => 'Plezy параметрлерін экспорттау', 'search.hint' => 'Фильмдер, сериалдар, музыка іздеу...', 'search.tryDifferentTerm' => 'Басқа іздеу сөзін байқап көріңіз', 'search.searchYourMedia' => 'Медиафайлдардан іздеу', @@ -3049,6 +3166,8 @@ extension on TranslationsKk { 'fileInfo.flagHearingImpaired' => 'Есту қабілеті бұзылғандар үшін', 'fileInfo.flagDub' => 'Дубляж', 'fileInfo.flagOriginal' => 'Түпнұсқа', + 'fileInfo.channelsMono' => 'Моно', + 'fileInfo.dolbyVisionProfile' => ({required Object profile}) => '${profile} профилі', 'mediaMenu.markAsWatched' => 'Көрілді деп белгілеу', 'mediaMenu.markAsUnwatched' => 'Көрілмеді деп белгілеу', 'mediaMenu.removeFromContinueWatching' => '"Көруді жалғастыру" тізімінен өшіру', @@ -3082,6 +3201,8 @@ extension on TranslationsKk { 'mediaMenu.rate' => 'Бағалау', 'mediaMenu.playFromBeginning' => 'Басынан бастап ойнату', 'mediaMenu.playVersion' => 'Нұсқаны ойнату...', + _ => null, + } ?? switch (path) { 'rateSheet.title' => 'Бағалау', 'rateSheet.server' => 'Сервер', 'rateSheet.favorite' => 'Таңдаулы', @@ -3091,8 +3212,6 @@ extension on TranslationsKk { 'rateSheet.noConnectedServices' => 'Бағалау үшін Баптаулардан қызметті қосыңыз.', 'accessibility.mediaCardMovie' => ({required Object title}) => '${title}, фильм', 'accessibility.mediaCardShow' => ({required Object title}) => '${title}, TV шоу', - _ => null, - } ?? switch (path) { 'accessibility.mediaCardEpisode' => ({required Object title, required Object episodeInfo}) => '${title}, ${episodeInfo}', 'accessibility.mediaCardSeason' => ({required Object title, required Object seasonInfo}) => '${title}, ${seasonInfo}', 'accessibility.mediaCardWatched' => 'көрілген', @@ -3113,6 +3232,11 @@ extension on TranslationsKk { 'accessibility.alphabetScrollHint' => 'Әріптер бойынша өту үшін жоғары немесе төмен сырғытыңыз', 'accessibility.rowColumnPosition' => ({required Object row, required Object rowCount, required Object column, required Object columnCount}) => 'Жол ${row} / ${rowCount}, баған ${column} / ${columnCount}', 'accessibility.rowPosition' => ({required Object row, required Object rowCount}) => 'Жол ${row} / ${rowCount}', + 'accessibility.autoScrollPlay' => 'Автоайналдыруды бастау', + 'accessibility.autoScrollPause' => 'Автоайналдыруды кідірту', + 'accessibility.hueShort' => 'H', + 'accessibility.saturationShort' => 'S', + 'accessibility.valueShort' => 'V', 'tooltips.shufflePlay' => 'Араластырып ойнату', 'tooltips.playTrailer' => 'Трейлерді ойнату', 'tooltips.markAsWatched' => 'Көрілді деп белгілеу', @@ -3203,6 +3327,15 @@ extension on TranslationsKk { 'videoControls.subtitleDownloadedNotApplied' => 'Субтитр жүктелді, бірақ қолданылмады', 'videoControls.subtitleDownloadFailed' => 'Субтитрді жүктеу мүмкін болмады', 'videoControls.searchLanguages' => 'Тілдерден іздеу...', + 'videoControls.skipIntro' => 'Кіріспені өткізу', + 'videoControls.skipCredits' => 'Титрлерді өткізу', + 'videoControls.nextEpisode' => 'Келесі бөлім', + 'videoControls.subtitleTrack' => ({required Object n}) => 'Жол ${n}', + 'videoControls.subtitleFile' => ({required Object name}) => 'Субтитр ${name}', + 'videoControls.forcedTrack' => ({required Object label}) => '${label} (Мәжбүрлі)', + 'videoControls.osdSubtitlesOff' => 'Субтитр: өшірулі', + 'videoControls.osdSubtitles' => ({required Object track}) => 'Субтитр: ${track}', + 'videoControls.osdAudio' => ({required Object track}) => 'Дыбыс: ${track}', 'messages.markedAsWatched' => 'Көрілді деп белгіленді', 'messages.markedAsUnwatched' => 'Көрілмеді деп белгіленді', 'messages.markedAsWatchedOffline' => 'Көрілді деп белгіленді (онлайн болғанда синхрондалады)', @@ -3252,9 +3385,18 @@ extension on TranslationsKk { 'messages.serverLimitBody' => 'Сервер қатесі (HTTP 500). Шектеу бұл сеансты қабылдамады.', 'messages.mediaUnreadableTitle' => 'Файл қолжетімсіз', 'messages.mediaUnreadableBody' => 'Сервер бұл элементті тапты, бірақ оның файлын оқи алмады (HTTP 404). Файл жылжытылған, өшірілген немесе оның сақтау орны қолжетімсіз болуы мүмкін. Сервер иесінен файлды тексеріп, кітапхананы қайта сканерлеуді сұраңыз.', + 'messages.serverBusyTitle' => 'Ағын қолжетімсіз', + 'messages.serverBusyBody' => 'Сервер бұл файлды ағынмен жіберуден қайта-қайта бас тартты (HTTP 503). Ол қайта іске қосылып, бос емес болуы немесе файл сақталған қойма офлайн болуы мүмкін. Сәлден соң қайталап көріңіз — бұл жалғаса берсе, сервер иесінен серверді және файл қоймасын тексеруін сұраңыз.', 'messages.logsUploaded' => 'Журналдар жүктелді', 'messages.logsUploadFailed' => 'Журналдарды жүктеу мүмкін болмады', 'messages.logId' => 'Журнал ID-сі', + 'messages.burnedSubtitlesUseMenu' => 'Субтитрлер бұл ағынға кіріктірілген. Оларды субтитр мәзірінен өзгертіңіз.', + 'messages.noVideoUrl' => 'Бейне URL-і қолжетімді емес', + 'messages.playbackNoMediaSources' => 'Сервер ойнатуға болатын медиа көздерін қайтармады', + 'messages.playbackDataNotPrepared' => 'Ойнату деректері дайын болмай тұрып басталды', + 'messages.streamSelectionUnavailable' => 'Бұл көз үшін ағынды таңдау қолжетімді емес', + 'messages.streamSelectionFailed' => 'Таңдалған ағындарды қолдану мүмкін болмады', + 'messages.serverUnavailableForProfile' => 'Белсенді профиль үшін қолжетімді сервер жоқ', 'subtitlingStyling.text' => 'Мәтін', 'subtitlingStyling.border' => 'Жиек', 'subtitlingStyling.background' => 'Фон', @@ -3271,6 +3413,8 @@ extension on TranslationsKk { 'subtitlingStyling.overrideStrip' => 'Форматтауды жою', 'subtitlingStyling.positionTop' => 'Жоғары', 'subtitlingStyling.positionBottom' => 'Төмен', + 'subtitlingStyling.anchorToScreen' => 'Экранға бекіту', + 'subtitlingStyling.anchorToScreenDescription' => 'Мәтіндік субтитрлерді кең экранды бейненің астындағы қара жолақтарда көрсету', 'subtitlingStyling.bold' => 'Қалың', 'subtitlingStyling.italic' => 'Көлбеу', 'subtitlingStyling.renderResolution' => 'Рендеринг ажыратымдылығы', @@ -3353,6 +3497,7 @@ extension on TranslationsKk { 'profiles.pinExplain' => 'Профильдер арасында ауысу үшін 4 таңбалы PIN код қажет.', 'profiles.continueButton' => 'Жалғастыру', 'profiles.pinsDontMatch' => 'PIN кодтар сәйкес келмейді', + 'profiles.tokenIdentityMismatch' => 'Plex профилінің токені күтілмеген серверді анықтады', 'connections.sectionTitle' => 'Қосылымдар', 'connections.addConnection' => 'Қосылым қосу', 'connections.addConnectionSubtitleNoProfile' => 'Plex арқылы кіріңіз немесе Jellyfin серверіне қосылыңыз', @@ -3386,6 +3531,7 @@ extension on TranslationsKk { 'discover.tvShow' => 'TV Шоу', 'discover.minutesLeft' => ({required Object minutes}) => '${minutes} мин қалды', 'discover.moreLikeThis' => 'Ұқсастар', + 'discover.titleCount' => ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('kk'))(n, one: '${n} атау', other: '${n} атау', ), 'errors.searchFailed' => ({required Object error}) => 'Іздеу қатесі: ${error}', 'errors.searchUnavailable' => 'Іздеу ешбір медиа серверге қосыла алмады.', 'errors.connectionTimeout' => ({required Object context}) => '${context} жүктеу уақыты өтті', @@ -3558,7 +3704,10 @@ extension on TranslationsKk { 'explore.characters' => 'Кейіпкерлер', 'explore.addToWatchlist' => 'Көру тізіміне қосу', 'explore.removeFromWatchlist' => 'Көру тізімінен өшіру', + 'explore.addedToWatchlist' => 'Көру тізіміне қосылды', + 'explore.removedFromWatchlist' => 'Көру тізімінен алынды', 'explore.watchlistUpdateFailed' => 'Көру тізімін жаңарту мүмкін болмады', + 'explore.watchlistNoMatch' => 'Бұл элементті көру тізімімен сәйкестендіру мүмкін болмады', 'explore.notInLibrary' => 'Кітапханаңызда жоқ', 'explore.inTheseLibraries' => 'Осы кітапханаларда бар', 'explore.checkingLibrary' => 'Кітапхана тексерілуде...', @@ -3566,6 +3715,8 @@ extension on TranslationsKk { 'explore.emptyMessage' => ({required Object source}) => '${source} дереккөзінен алынған қатарлар мұнда көрінеді.', 'explore.searchHint' => ({required Object source}) => '${source} ішінен іздеу', 'explore.searchEmpty' => ({required Object query}) => '"${query}" бойынша нәтиже табылмады', + _ => null, + } ?? switch (path) { 'explore.searchPrompt' => ({required Object source}) => '${source} арқылы фильмдер мен сериалдарды іздеңіз.', 'explore.searchFailed' => 'Іздеу қатесі. Қосылымды тексеріңіз.', 'explore.badge.rankPopular' => ({required Object n}) => '#${n} танымал', @@ -3605,8 +3756,6 @@ extension on TranslationsKk { 'explore.stats.completed' => ({required Object n}) => '${n} аяқтады', 'explore.stats.onHold' => ({required Object n}) => '${n} кейінге қалдырды', 'explore.stats.dropped' => ({required Object n}) => '${n} тастады', - _ => null, - } ?? switch (path) { 'explore.season.winter' => 'Қыс', 'explore.season.spring' => 'Көктем', 'explore.season.summer' => 'Жаз', @@ -3703,6 +3852,9 @@ extension on TranslationsKk { 'liveTv.watchChannel' => 'Арнаны көру', 'liveTv.favorites' => 'Таңдаулылар', 'liveTv.reorderFavorites' => 'Таңдаулыларды қайта реттеу', + 'liveTv.noFavoriteChannels' => 'Таңдаулы арналар жоқ', + 'liveTv.noFavoriteChannelsHint' => 'Барлық арнаны көрсетіп, таңдаулыларға қосу үшін арнаны ұзақ басып тұрыңыз.', + 'liveTv.showAllChannels' => 'Барлық арнаны көрсету', 'liveTv.favoritesLoadFailed' => 'Таңдаулыларды жүктеу мүмкін болмады.', 'liveTv.favoritesUpdateFailed' => 'Таңдаулыларды жаңарту мүмкін болмады.', 'liveTv.joinSession' => 'Сеансқа қосылу', @@ -3742,6 +3894,11 @@ extension on TranslationsKk { 'liveTv.guideReloadRequested' => 'Бағдарламаны жаңарту сұралды', 'liveTv.rulesProcessRequested' => 'Ережелерді қайта бағалау сұралды', 'liveTv.recordShow' => 'Шоуды жазу', + 'liveTv.startingInMinutes' => ({required Object minutes}) => '${minutes} мин кейін басталады', + 'liveTv.dayAtTime' => ({required Object day, required Object time}) => '${day}, ${time}', + 'liveTv.invalidPlaybackData' => ({required Object product}) => '${product} жарамсыз тікелей TV ойнату деректерін қайтарды', + 'liveTv.failedToStartChannel' => 'Тікелей эфир арнасын іске қосу мүмкін болмады', + 'liveTv.failedToBuildStreamUrl' => 'Ағын URL-ін құру мүмкін болмады', 'collections.title' => 'Топтамалар', 'collections.collection' => 'Топтама', 'collections.empty' => 'Топтама бос', @@ -3810,6 +3967,8 @@ extension on TranslationsKk { 'music.repeat' => 'Қайталау', 'music.repeatAll' => 'Барлығын қайталау', 'music.repeatOne' => 'Біреуін қайталау', + 'music.instantMixNoServer' => 'Жедел микс үшін қолжетімді сервер жоқ', + 'music.noAudioUrl' => ({required Object track}) => '${track} үшін аудио URL-і қолжетімді емес', 'watchTogether.title' => 'Бірге көру', 'watchTogether.description' => 'Достарыңызбен бірге көріңіз', 'watchTogether.createSession' => 'Сеанс жасау', @@ -3875,6 +4034,7 @@ extension on TranslationsKk { 'watchTogether.removeRoom' => 'Өшіру', 'watchTogether.guestSwitchUnavailable' => 'Ауысу мүмкін болмады', 'watchTogether.guestSwitchFailed' => 'Ауысу мүмкін болмады — мазмұн табылмады', + 'watchTogether.defaultDisplayName' => 'Пайдаланушы', 'downloads.title' => 'Жүктеулер', 'downloads.manage' => 'Басқару', 'downloads.tvShows' => 'TV Шоулар', @@ -3975,6 +4135,16 @@ extension on TranslationsKk { 'downloads.backgroundWarning.statusUnknown' => 'Әлі тексерілмеген', 'downloads.backgroundWarning.settingsUnavailable' => 'Бұл құрылғыда жүйе баптаулары ашылмады', 'downloads.backgroundWarning.linkUnavailable' => 'Бұл құрылғыда dontkillmyapp.com ашылмады', + 'downloads.unknownShow' => 'Белгісіз телешоу', + 'downloads.unknownSeason' => 'Белгісіз маусым', + 'downloads.unknownAlbum' => 'Белгісіз альбом', + 'downloads.completedOfTotal' => ({required Object completed, required Object total}) => '${completed}/${total} аяқталды', + 'downloads.errorFileNotFound' => 'Файл табылмады (404)', + 'downloads.errorDownloadFailed' => 'Жүктеу сәтсіз аяқталды', + 'downloads.errorPostProcessing' => ({required Object error}) => 'Кейінгі өңдеу сәтсіз аяқталды: ${error}', + 'downloads.notificationDownloading' => 'Жүктелуде...', + 'downloads.notificationComplete' => 'Жүктеу аяқталды', + 'downloads.notificationPaused' => 'Жүктеу кідіртілді', 'shaders.title' => 'Шейдерлер', 'shaders.noShaderDescription' => 'Видеоны жақсарту өшірілген', 'shaders.nvscalerDescription' => 'Анығырақ видео үшін NVIDIA масштабы', @@ -4054,14 +4224,24 @@ extension on TranslationsKk { 'companionRemote.errors.failedToConnectAnyAddress' => 'Ешбір мекенжайға қосылу мүмкін болмады', 'companionRemote.errors.connectionLostAfterAttempts' => ({required Object attempts}) => '${attempts} әрекеттен кейін байланыс үзілді', 'companionRemote.errors.connectionLost' => 'Байланыс үзілді', + 'companionRemote.closedBeforeAuth' => 'Аутентификациядан бұрын байланыс жабылды', 'videoSettings.playbackSpeed' => 'Ойнату жылдамдығы', 'videoSettings.normalSpeed' => 'Қалыпты', 'videoSettings.sleepTimerActive' => ({required Object duration}) => 'Белсенді (${duration})', 'videoSettings.zoom' => 'Масштаб', + _ => null, + } ?? switch (path) { 'videoSettings.sleepTimer' => 'Ұйқы таймері', 'videoSettings.audioSync' => 'Аудио синхрондау', 'videoSettings.subtitleSync' => 'Субтитр синхрондау', 'videoSettings.hdr' => 'HDR', + 'videoSettings.hdrUnsupported' => 'HDR мұнда қолжетімді емес — бұл жұмыс үстелі композиторы немесе бейне шығысы оны өткізе алмайды.', + 'videoSettings.hdrToneMapping' => 'HDR тондарын түрлендіру', + 'videoSettings.hdrToneMappingCompositor' => 'Композитор', + 'videoSettings.hdrToneMappingCompositorDescription' => 'Дереккөздің HDR метадеректерін өзгеріссіз өткізіп, оларды жұмыс үстелі композиторына түрлендіруге мүмкіндік беру.', + 'videoSettings.hdrToneMappingPlayer' => 'Ойнатқыш', + 'videoSettings.hdrToneMappingPlayerDescription' => 'Ойнатқышта дисплейдің ең жоғары жарықтығына сәйкестендіріп, нәтижені композиторға хабарлау.', + 'videoSettings.hdrToneMappingFailed' => 'HDR тондарын түрлендіруді өзгерту мүмкін болмады — алдыңғы режим әлі де белсенді.', 'videoSettings.audioOutput' => 'Аудио шығысы', 'videoSettings.performanceOverlay' => 'Өнімділік панелі', 'videoSettings.audioOutputDolbyAtmos' => 'Dolby Atmos', @@ -4106,6 +4286,16 @@ extension on TranslationsKk { 'performanceOverlay.player' => 'Ойнатқыш', 'performanceOverlay.memory' => 'Жады', 'performanceOverlay.uiFps' => 'Интерфейс (UI) FPS', + 'performanceOverlay.fps' => 'FPS', + 'performanceOverlay.decoderAndroidHw' => 'Android HW', + 'performanceOverlay.decoderNvidiaHw' => 'NVIDIA HW', + 'performanceOverlay.decoderQualcommHw' => 'Qualcomm HW', + 'performanceOverlay.decoderMediatekHw' => 'MediaTek HW', + 'performanceOverlay.decoderExynosHw' => 'Exynos HW', + 'performanceOverlay.decoderSoftware' => 'Бағдарламалық', + 'performanceOverlay.decoderHardware' => 'Аппараттық', + 'performanceOverlay.tunnelingActive' => 'Белсенді', + 'performanceOverlay.dvRpuFailed' => ({required Object converted, required Object failures}) => '${converted} (${failures} сәтсіз аяқталды)', 'externalPlayer.title' => 'Сыртқы ойнатқыш', 'externalPlayer.useExternalPlayer' => 'Сыртқы ойнатқышты пайдалану', 'externalPlayer.useExternalPlayerDescription' => 'Видеоларды басқа қолданбада ашу', @@ -4119,8 +4309,6 @@ extension on TranslationsKk { 'externalPlayer.playerPackage' => 'Пакет атауы', 'externalPlayer.playerUrlScheme' => 'URL схемасы', 'externalPlayer.off' => 'Өшірулі', - _ => null, - } ?? switch (path) { 'externalPlayer.launchFailed' => 'Сыртқы ойнатқышты іске қосу мүмкін болмады', 'externalPlayer.appNotInstalled' => ({required Object name}) => '${name} орнатылмаған', 'externalPlayer.playInExternalPlayer' => 'Сыртқы ойнатқышта ойнату', @@ -4254,6 +4442,16 @@ extension on TranslationsKk { 'seerr.statusPartiallyAvailable' => 'Жартылай қолжетімді', 'seerr.statusRequested' => 'Сұралды', 'seerr.statusProcessing' => 'Өңделуде', + 'seerr.couldNotReach' => ({required Object url, required Object error}) => '${url} мекенжайына қосылу мүмкін болмады: ${error}', + 'seerr.noInstanceAtUrl' => ({required Object url, required Object status}) => '${url} мекенжайында Seerr данасы жоқ (HTTP ${status})', + 'seerr.notInitialized' => 'Бұл Seerr данасының бастапқы баптауы аяқталмаған', + 'seerr.noPlexTokenForReauth' => 'Қайта кіру үшін Plex токені қолжетімді емес', + 'seerr.noStoredCredentials' => 'Қайта кіру үшін сақталған тіркелгі деректері жоқ', + 'seerr.signInRejected' => 'Кіру қабылданбады', + 'seerr.noSessionCookie' => 'Seerr сеанс cookie файлын бермеді', + 'seerr.freshCookieRejected' => 'Seerr жаңа сеанс cookie файлын қабылдамады', + 'seerr.noUserInformation' => 'Seerr пайдаланушы туралы мәліметтерді қайтармады', + 'seerr.sessionRejectedAfterReauth' => 'Қайта кіргеннен кейін сеанс қабылданбады', 'services.title' => 'Қызметтер', 'services.hubSubtitle' => 'Көру барысын синхрондаңыз және жаңа мазмұн сұраңыз.', 'services.notConnected' => 'Қосылмаған', @@ -4269,6 +4467,7 @@ extension on TranslationsKk { 'services.names.seerr' => 'Seerr', 'services.names.mdblist' => 'MDBList', 'services.deviceCode.title' => ({required Object service}) => 'Plezy-ді ${service} қызметінде белсендіру', + 'services.deviceCode.instructions' => 'QR кодын сканерлеңіз немесе төмендегі мекенжайға өтіп, мына кодты енгізіңіз:', 'services.deviceCode.openToActivate' => ({required Object service}) => 'Белсендіру үшін ${service} ашу', 'services.deviceCode.copyCode' => 'Белсендіру кодын көшіру', 'services.deviceCode.waitingForAuthorization' => 'Авторизация күтілуде…', @@ -4318,6 +4517,24 @@ extension on TranslationsKk { 'addServer.connectToMediaBrowserCardSubtitleScoped' => ({required Object product, required Object name}) => '${product} серверіне кіріңіз. ${name} тіркелгісіне байланыстырылады.', 'addServer.borrowFromAnotherProfile' => 'Басқа профильден алу', 'addServer.borrowFromAnotherProfileSubtitle' => 'Басқа профильдің қосылымын қайта пайдалану.', + 'addServer.invalidCredentials' => 'Пайдаланушы аты немесе құпия сөз қате', + 'addServer.authResponseNotJson' => 'Аутентификация жауабы жарамды JSON болмады', + 'addServer.quickConnectRejected' => 'Сервер Quick Connect сұрауын қабылдамады', + 'addServer.quickConnectNotJson' => 'Quick Connect жауабы жарамды JSON болмады', + 'addServer.quickConnectMissingFields' => 'Quick Connect жауабында код немесе құпия кілт жоқ', + 'addServer.quickConnectPollRejected' => 'Сервер Quick Connect сұрауын тексеруді қабылдамады', + 'addServer.serverTimedOut' => 'Сервер уақытында жауап бермеді', + 'addServer.responseNotJson' => 'Сервер жауабы жарамды JSON болмады', + 'addServer.responseMissingIdentity' => ({required Object product}) => 'Жауапта ID немесе сервер атауы жоқ — бұл ${product} сервері ме?', + 'addServer.probeFailed' => ({required Object error}) => 'Серверге қосылу мүмкін болмады: ${error}', + 'addServer.enterAtLeastOneUrl' => ({required Object product}) => 'Кемінде бір ${product} серверінің URL-ін енгізіңіз', + 'addServer.noReachableServer' => ({required Object product}) => 'Қолжетімді ${product} сервері табылмады', + 'addServer.urlsPointToDifferentServers' => ({required Object product}) => 'Бұл URL-дер әртүрлі ${product} серверлеріне бағыттайды', + 'addServer.urlDoesNotMatchServer' => ({required Object product}) => 'Бұл URL ${product} серверіне сәйкес келмейді', + 'addServer.redirectUnsupported' => 'Сервер қолдау көрсетілмейтін URL-ге қайта бағыттады', + 'addServer.redirectDifferentHost' => ({required Object product}) => 'Сервер басқа хостқа қайта бағыттады. Соңғы ${product} URL-ін тікелей енгізіңіз.', + 'addServer.redirectInsecure' => 'Сервер HTTPS мекенжайынан қауіпсіз емес URL-ге қайта бағыттады', + 'addServer.redirectUnsupportedEnterFinal' => ({required Object product}) => 'Сервер қолдау көрсетілмейтін URL-ге қайта бағыттады. Соңғы ${product} URL-ін тікелей енгізіңіз.', _ => null, }; } diff --git a/lib/i18n/strings_ko.g.dart b/lib/i18n/strings_ko.g.dart index 8887d466..9a088dd2 100644 --- a/lib/i18n/strings_ko.g.dart +++ b/lib/i18n/strings_ko.g.dart @@ -123,6 +123,7 @@ class _Translations$auth$ko extends Translations$auth$en { @override String get quickConnectCancel => '취소'; @override String get quickConnectExpired => 'Quick Connect가 만료되었습니다. 다시 시도하세요.'; @override String get localDataRecoveryRequired => 'Plezy에서 로컬 로그인 정보와 대기 중인 재생 데이터를 안전하게 복구하지 못했습니다. 다시 로그인해 주세요.'; + @override String get pinCheckRejected => 'Plex PIN 확인이 거부되었습니다'; } // Path: common @@ -178,6 +179,9 @@ class _Translations$common$ko extends Translations$common$en { @override String get exitFullscreen => '전체 화면 종료'; @override String get pressBackAgainToExit => '한 번 더 누르면 종료됩니다'; @override late final _Translations$common$ratingSource$ko ratingSource = _Translations$common$ratingSource$ko._(_root); + @override String get notAvailable => 'N/A'; + @override String get url => 'URL'; + @override String get letterKeys => 'ABC'; } // Path: screens @@ -444,6 +448,8 @@ class _Translations$settings$ko extends Translations$settings$en { @override String get showNavBarLabels => '내비게이션 바 라벨 표시'; @override String get showNavBarLabelsDescription => '내비게이션 바 아이콘 아래에 텍스트 라벨을 표시합니다'; @override String get startupSection => '시작 섹션'; + @override String get showExploreTab => '둘러보기 탭 표시'; + @override String get showExploreTabDescription => 'Plex Discover와 연결된 트래커의 콘텐츠가 포함된 둘러보기 탭을 표시합니다'; @override String get liveTvDefaultFavorites => '즐겨찾기 채널 기본 설정'; @override String get liveTvDefaultFavoritesDescription => '라이브 TV를 열 때 즐겨찾기 채널만 표시'; @override String get display => '디스플레이'; @@ -455,6 +461,7 @@ class _Translations$settings$ko extends Translations$settings$en { @override String get subtitlesAndConfig => '자막 및 구성'; @override String get seekAndTiming => '탐색 및 타이밍'; @override String get behavior => '동작'; + @override String get exportDialogTitle => 'Plezy 설정 내보내기'; } // Path: search @@ -606,6 +613,8 @@ class _Translations$fileInfo$ko extends Translations$fileInfo$en { @override String get flagHearingImpaired => '청각 장애인용'; @override String get flagDub => '더빙'; @override String get flagOriginal => '원본'; + @override String get channelsMono => '모노'; + @override String dolbyVisionProfile({required Object profile}) => '프로파일 ${profile}'; } // Path: mediaMenu @@ -701,6 +710,11 @@ class _Translations$accessibility$ko extends Translations$accessibility$en { @override String get alphabetScrollHint => '위아래로 스와이프하여 글자별로 이동'; @override String rowColumnPosition({required Object rowCount, required Object row, required Object columnCount, required Object column}) => '${rowCount}행 중 ${row}행, ${columnCount}열 중 ${column}열'; @override String rowPosition({required Object rowCount, required Object row}) => '${rowCount}행 중 ${row}행'; + @override String get autoScrollPlay => '자동 스크롤 재생'; + @override String get autoScrollPause => '자동 스크롤 일시정지'; + @override String get hueShort => 'H'; + @override String get saturationShort => 'S'; + @override String get valueShort => 'V'; } // Path: tooltips @@ -812,6 +826,15 @@ class _Translations$videoControls$ko extends Translations$videoControls$en { @override String get subtitleDownloadedNotApplied => '자막을 다운로드했지만 선택할 수 없습니다'; @override String get subtitleDownloadFailed => '자막 다운로드에 실패했습니다'; @override String get searchLanguages => '언어 검색...'; + @override String get skipIntro => '인트로 건너뛰기'; + @override String get skipCredits => '크레딧 건너뛰기'; + @override String get nextEpisode => '다음 에피소드'; + @override String subtitleTrack({required Object n}) => '트랙 ${n}'; + @override String subtitleFile({required Object name}) => '자막 ${name}'; + @override String forcedTrack({required Object label}) => '${label} (강제)'; + @override String get osdSubtitlesOff => '자막: 꺼짐'; + @override String osdSubtitles({required Object track}) => '자막: ${track}'; + @override String osdAudio({required Object track}) => '오디오: ${track}'; } // Path: messages @@ -872,9 +895,18 @@ class _Translations$messages$ko extends Translations$messages$en { @override String get serverLimitBody => '서버 오류(HTTP 500). 대역폭/트랜스코딩 제한으로 세션이 거부된 것 같습니다. 소유자에게 조정을 요청하세요.'; @override String get mediaUnreadableTitle => '파일을 사용할 수 없음'; @override String get mediaUnreadableBody => '서버에서 이 항목을 찾았지만 파일을 읽을 수 없습니다(HTTP 404). 파일이 이동되거나 삭제되었거나 저장소가 오프라인 상태일 수 있습니다. 서버 관리자에게 파일 확인과 라이브러리 재스캔을 요청하세요.'; + @override String get serverBusyTitle => '스트림을 사용할 수 없음'; + @override String get serverBusyBody => '서버에서 이 파일의 스트리밍을 계속 거부했습니다(HTTP 503). 서버가 다시 시작 중이거나 사용량이 많을 수 있으며, 파일이 저장된 저장소가 오프라인일 수도 있습니다. 잠시 후 다시 시도하세요. 문제가 계속되면 서버 소유자에게 서버와 파일 저장소를 확인해 달라고 요청하세요.'; @override String get logsUploaded => '로그 업로드 완료'; @override String get logsUploadFailed => '로그 업로드 실패'; @override String get logId => '로그 ID'; + @override String get burnedSubtitlesUseMenu => '자막이 이 스트림에 입혀져 있습니다. 자막 메뉴에서 변경하세요.'; + @override String get noVideoUrl => '사용 가능한 비디오 URL이 없습니다'; + @override String get playbackNoMediaSources => '서버에서 재생 가능한 미디어 소스를 반환하지 않았습니다'; + @override String get playbackDataNotPrepared => '재생 데이터가 준비되기 전에 재생이 시작되었습니다'; + @override String get streamSelectionUnavailable => '이 소스에서는 스트림을 선택할 수 없습니다'; + @override String get streamSelectionFailed => '선택한 스트림을 적용할 수 없습니다'; + @override String get serverUnavailableForProfile => '활성 프로필에 사용할 수 있는 서버가 없습니다'; } // Path: subtitlingStyling @@ -900,6 +932,8 @@ class _Translations$subtitlingStyling$ko extends Translations$subtitlingStyling$ @override String get overrideStrip => '스타일 제거'; @override String get positionTop => '위'; @override String get positionBottom => '아래'; + @override String get anchorToScreen => '화면에 고정'; + @override String get anchorToScreenDescription => '와이드스크린 비디오 아래의 검은 여백에 텍스트 자막을 표시합니다'; @override String get bold => '굵게'; @override String get italic => '기울임꼴'; @override String get renderResolution => '렌더링 해상도'; @@ -1009,6 +1043,7 @@ class _Translations$profiles$ko extends Translations$profiles$en { @override String get pinExplain => '프로필 전환에는 4자리 PIN이 필요합니다.'; @override String get continueButton => '계속'; @override String get pinsDontMatch => 'PIN이 일치하지 않습니다'; + @override String get tokenIdentityMismatch => 'Plex 프로필 토큰이 예상과 다른 서버로 확인되었습니다'; } // Path: connections @@ -1060,6 +1095,9 @@ class _Translations$discover$ko extends Translations$discover$en { @override String get tvShow => 'TV 시리즈'; @override String minutesLeft({required Object minutes}) => '${minutes}분 남음'; @override String get moreLikeThis => '비슷한 콘텐츠'; + @override String titleCount({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('ko'))(n, + other: '${n}개 타이틀', + ); } // Path: errors @@ -1271,7 +1309,10 @@ class _Translations$explore$ko extends Translations$explore$en { @override String get characters => '캐릭터'; @override String get addToWatchlist => '관심 목록에 추가'; @override String get removeFromWatchlist => '관심 목록에서 제거'; + @override String get addedToWatchlist => '관심 목록에 추가했습니다'; + @override String get removedFromWatchlist => '관심 목록에서 삭제했습니다'; @override String get watchlistUpdateFailed => '관심 목록을 업데이트하지 못했습니다'; + @override String get watchlistNoMatch => '이 항목을 관심 목록과 연결할 수 없습니다'; @override String get notInLibrary => '라이브러리에 없음'; @override String get inTheseLibraries => '이 라이브러리에 있음'; @override String get checkingLibrary => '라이브러리 확인 중...'; @@ -1331,6 +1372,9 @@ class _Translations$liveTv$ko extends Translations$liveTv$en { @override String get watchChannel => '채널 시청'; @override String get favorites => '즐겨찾기'; @override String get reorderFavorites => '즐겨찾기 순서 변경'; + @override String get noFavoriteChannels => '즐겨찾기 채널 없음'; + @override String get noFavoriteChannelsHint => '모든 채널을 표시한 다음 채널을 길게 눌러 즐겨찾기에 추가하세요.'; + @override String get showAllChannels => '모든 채널 표시'; @override String get favoritesLoadFailed => '즐겨찾기를 불러올 수 없습니다. 연결을 확인하고 다시 시도하세요.'; @override String get favoritesUpdateFailed => '즐겨찾기를 업데이트할 수 없습니다. 연결을 확인하고 다시 시도하세요.'; @override String get joinSession => '진행 중인 세션 참여'; @@ -1370,6 +1414,11 @@ class _Translations$liveTv$ko extends Translations$liveTv$en { @override String get guideReloadRequested => '가이드 새로고침 요청됨'; @override String get rulesProcessRequested => '규칙 재평가 요청됨'; @override String get recordShow => '프로그램 녹화'; + @override String startingInMinutes({required Object minutes}) => '${minutes}분 후 시작'; + @override String dayAtTime({required Object day, required Object time}) => '${day} ${time}'; + @override String invalidPlaybackData({required Object product}) => '${product}에서 잘못된 실시간 TV 재생 데이터를 반환했습니다'; + @override String get failedToStartChannel => '실시간 채널을 시작할 수 없습니다'; + @override String get failedToBuildStreamUrl => '스트림 URL을 생성할 수 없습니다'; } // Path: collections @@ -1467,6 +1516,8 @@ class _Translations$music$ko extends Translations$music$en { @override String get repeat => '반복'; @override String get repeatAll => '전체 반복'; @override String get repeatOne => '한 곡 반복'; + @override String get instantMixNoServer => '즉석 믹스에 사용할 수 있는 서버가 없습니다'; + @override String noAudioUrl({required Object track}) => '${track}에 사용할 수 있는 오디오 URL이 없습니다'; } // Path: watchTogether @@ -1541,6 +1592,7 @@ class _Translations$watchTogether$ko extends Translations$watchTogether$en { @override String get removeRoom => '제거'; @override String get guestSwitchUnavailable => '전환할 수 없음 — 동기화 서버를 사용할 수 없습니다'; @override String get guestSwitchFailed => '전환할 수 없음 — 이 서버에서 콘텐츠를 찾을 수 없습니다'; + @override String get defaultDisplayName => '사용자'; } // Path: downloads @@ -1625,6 +1677,16 @@ class _Translations$downloads$ko extends Translations$downloads$en { @override String get syncRuleUnknownServer => '알 수 없는 서버'; @override String get syncRuleListCreated => '동기화 규칙이 생성되었습니다'; @override late final _Translations$downloads$backgroundWarning$ko backgroundWarning = _Translations$downloads$backgroundWarning$ko._(_root); + @override String get unknownShow => '알 수 없는 프로그램'; + @override String get unknownSeason => '알 수 없는 시즌'; + @override String get unknownAlbum => '알 수 없는 앨범'; + @override String completedOfTotal({required Object completed, required Object total}) => '${completed}/${total} 완료'; + @override String get errorFileNotFound => '파일을 찾을 수 없음(404)'; + @override String get errorDownloadFailed => '다운로드 실패'; + @override String errorPostProcessing({required Object error}) => '후처리 실패: ${error}'; + @override String get notificationDownloading => '다운로드 중...'; + @override String get notificationComplete => '다운로드 완료'; + @override String get notificationPaused => '다운로드 일시 중지'; } // Path: shaders @@ -1665,6 +1727,7 @@ class _Translations$companionRemote$ko extends Translations$companionRemote$en { @override late final _Translations$companionRemote$pairing$ko pairing = _Translations$companionRemote$pairing$ko._(_root); @override late final _Translations$companionRemote$remote$ko remote = _Translations$companionRemote$remote$ko._(_root); @override late final _Translations$companionRemote$errors$ko errors = _Translations$companionRemote$errors$ko._(_root); + @override String get closedBeforeAuth => '인증 전에 연결이 종료되었습니다'; } // Path: videoSettings @@ -1682,6 +1745,13 @@ class _Translations$videoSettings$ko extends Translations$videoSettings$en { @override String get audioSync => '오디오 동기화'; @override String get subtitleSync => '자막 동기화'; @override String get hdr => 'HDR'; + @override String get hdrUnsupported => '여기서는 HDR을 사용할 수 없습니다. 이 데스크톱 컴포지터 또는 비디오 출력에서 HDR을 전달할 수 없습니다.'; + @override String get hdrToneMapping => 'HDR 톤 매핑'; + @override String get hdrToneMappingCompositor => '컴포지터'; + @override String get hdrToneMappingCompositorDescription => '소스의 HDR 메타데이터를 그대로 전달하고 데스크톱 컴포지터에서 매핑하도록 합니다.'; + @override String get hdrToneMappingPlayer => '플레이어'; + @override String get hdrToneMappingPlayerDescription => '플레이어에서 디스플레이의 최대 밝기에 맞게 매핑한 다음 그 결과를 컴포지터에 전달합니다.'; + @override String get hdrToneMappingFailed => 'HDR 톤 매핑을 변경할 수 없습니다. 이전 모드가 계속 적용됩니다.'; @override String get audioOutput => '오디오 출력'; @override String get performanceOverlay => '성능 오버레이'; @override String get audioOutputDolbyAtmos => 'Dolby Atmos'; @@ -1735,6 +1805,16 @@ class _Translations$performanceOverlay$ko extends Translations$performanceOverla @override String get player => '플레이어'; @override String get memory => '메모리'; @override String get uiFps => 'UI FPS'; + @override String get fps => 'FPS'; + @override String get decoderAndroidHw => 'Android HW'; + @override String get decoderNvidiaHw => 'NVIDIA HW'; + @override String get decoderQualcommHw => 'Qualcomm HW'; + @override String get decoderMediatekHw => 'MediaTek HW'; + @override String get decoderExynosHw => 'Exynos HW'; + @override String get decoderSoftware => '소프트웨어'; + @override String get decoderHardware => '하드웨어'; + @override String get tunnelingActive => '활성'; + @override String dvRpuFailed({required Object converted, required Object failures}) => '${converted} (${failures}개 실패)'; } // Path: externalPlayer @@ -1935,6 +2015,16 @@ class _Translations$seerr$ko extends Translations$seerr$en { @override String get statusPartiallyAvailable => '일부 사용 가능'; @override String get statusRequested => '요청됨'; @override String get statusProcessing => '처리 중'; + @override String couldNotReach({required Object url, required Object error}) => '${url}에 연결할 수 없습니다: ${error}'; + @override String noInstanceAtUrl({required Object url, required Object status}) => '${url}에 Seerr 인스턴스가 없습니다(HTTP ${status})'; + @override String get notInitialized => '이 Seerr 인스턴스는 최초 실행 설정을 완료하지 않았습니다'; + @override String get noPlexTokenForReauth => '다시 로그인하는 데 사용할 수 있는 Plex 토큰이 없습니다'; + @override String get noStoredCredentials => '다시 로그인하는 데 사용할 수 있는 저장된 인증 정보가 없습니다'; + @override String get signInRejected => '로그인이 거부되었습니다'; + @override String get noSessionCookie => 'Seerr에서 세션 쿠키를 발급하지 않았습니다'; + @override String get freshCookieRejected => 'Seerr에서 새 세션 쿠키를 거부했습니다'; + @override String get noUserInformation => 'Seerr에서 사용자 정보를 반환하지 않았습니다'; + @override String get sessionRejectedAfterReauth => '다시 로그인한 후 세션이 거부되었습니다'; } // Path: services @@ -1995,6 +2085,24 @@ class _Translations$addServer$ko extends Translations$addServer$en { @override String connectToMediaBrowserCardSubtitleScoped({required Object product, required Object name}) => '${product} 서버에 로그인하세요. ${name}에 연결됩니다.'; @override String get borrowFromAnotherProfile => '다른 프로필에서 빌리기'; @override String get borrowFromAnotherProfileSubtitle => '다른 프로필의 연결을 재사용합니다. PIN으로 보호된 프로필에는 PIN이 필요합니다.'; + @override String get invalidCredentials => '사용자 이름 또는 비밀번호가 올바르지 않습니다'; + @override String get authResponseNotJson => '인증 응답이 유효한 JSON이 아닙니다'; + @override String get quickConnectRejected => '서버에서 Quick Connect를 거부했습니다'; + @override String get quickConnectNotJson => 'Quick Connect 응답이 유효한 JSON이 아닙니다'; + @override String get quickConnectMissingFields => 'Quick Connect 응답에 코드 또는 비밀 키가 없습니다'; + @override String get quickConnectPollRejected => '서버에서 Quick Connect 폴링을 거부했습니다'; + @override String get serverTimedOut => '서버가 제시간에 응답하지 않았습니다'; + @override String get responseNotJson => '서버 응답이 유효한 JSON이 아닙니다'; + @override String responseMissingIdentity({required Object product}) => '응답에 ID 또는 서버 이름이 없습니다. 이 서버가 ${product} 서버인가요?'; + @override String probeFailed({required Object error}) => '서버에 연결할 수 없습니다: ${error}'; + @override String enterAtLeastOneUrl({required Object product}) => '${product} 서버 URL을 하나 이상 입력하세요'; + @override String noReachableServer({required Object product}) => '연결 가능한 ${product} 서버를 찾을 수 없습니다'; + @override String urlsPointToDifferentServers({required Object product}) => '이 URL들은 서로 다른 ${product} 서버를 가리킵니다'; + @override String urlDoesNotMatchServer({required Object product}) => '이 URL은 ${product} 서버와 일치하지 않습니다'; + @override String get redirectUnsupported => '서버가 지원되지 않는 URL로 리디렉션했습니다'; + @override String redirectDifferentHost({required Object product}) => '서버가 다른 호스트로 리디렉션했습니다. 최종 ${product} URL을 직접 입력하세요.'; + @override String get redirectInsecure => '서버가 HTTPS에서 안전하지 않은 URL로 리디렉션했습니다'; + @override String redirectUnsupportedEnterFinal({required Object product}) => '서버가 지원되지 않는 URL로 리디렉션했습니다. 최종 ${product} URL을 직접 입력하세요.'; } // Path: common.ratingSource @@ -2512,6 +2620,7 @@ class _Translations$services$deviceCode$ko extends Translations$services$deviceC // Translations @override String title({required Object service}) => '${service}에서 Plezy 활성화'; + @override String get instructions => 'QR 코드를 스캔하거나 아래 주소로 이동하여 이 코드를 입력하세요:'; @override String openToActivate({required Object service}) => '활성화하려면 ${service} 열기'; @override String get copyCode => '활성화 코드 복사'; @override String get waitingForAuthorization => '인증을 기다리는 중…'; @@ -2586,6 +2695,7 @@ extension on TranslationsKo { 'auth.quickConnectCancel' => '취소', 'auth.quickConnectExpired' => 'Quick Connect가 만료되었습니다. 다시 시도하세요.', 'auth.localDataRecoveryRequired' => 'Plezy에서 로컬 로그인 정보와 대기 중인 재생 데이터를 안전하게 복구하지 못했습니다. 다시 로그인해 주세요.', + 'auth.pinCheckRejected' => 'Plex PIN 확인이 거부되었습니다', 'common.cancel' => '취소', 'common.save' => '저장', 'common.close' => '닫기', @@ -2642,6 +2752,9 @@ extension on TranslationsKo { 'common.ratingSource.trakt' => 'Trakt', 'common.ratingSource.rottenTomatoesCritic' => 'Rotten Tomatoes 평론가', 'common.ratingSource.rottenTomatoesAudience' => 'Rotten Tomatoes 관객', + 'common.notAvailable' => 'N/A', + 'common.url' => 'URL', + 'common.letterKeys' => 'ABC', 'screens.licenses' => '라이선스', 'screens.switchProfile' => '프로필 전환', 'screens.subtitleStyling' => '자막 스타일 설정', @@ -2881,6 +2994,8 @@ extension on TranslationsKo { 'settings.showNavBarLabels' => '내비게이션 바 라벨 표시', 'settings.showNavBarLabelsDescription' => '내비게이션 바 아이콘 아래에 텍스트 라벨을 표시합니다', 'settings.startupSection' => '시작 섹션', + 'settings.showExploreTab' => '둘러보기 탭 표시', + 'settings.showExploreTabDescription' => 'Plex Discover와 연결된 트래커의 콘텐츠가 포함된 둘러보기 탭을 표시합니다', 'settings.liveTvDefaultFavorites' => '즐겨찾기 채널 기본 설정', 'settings.liveTvDefaultFavoritesDescription' => '라이브 TV를 열 때 즐겨찾기 채널만 표시', 'settings.display' => '디스플레이', @@ -2892,6 +3007,7 @@ extension on TranslationsKo { 'settings.subtitlesAndConfig' => '자막 및 구성', 'settings.seekAndTiming' => '탐색 및 타이밍', 'settings.behavior' => '동작', + 'settings.exportDialogTitle' => 'Plezy 설정 내보내기', 'search.hint' => '영화, 시리즈, 음악 등을 검색하세요...', 'search.tryDifferentTerm' => '다른 검색어를 시도해 보세요', 'search.searchYourMedia' => '미디어 검색', @@ -3040,6 +3156,8 @@ extension on TranslationsKo { 'fileInfo.flagHearingImpaired' => '청각 장애인용', 'fileInfo.flagDub' => '더빙', 'fileInfo.flagOriginal' => '원본', + 'fileInfo.channelsMono' => '모노', + 'fileInfo.dolbyVisionProfile' => ({required Object profile}) => '프로파일 ${profile}', 'mediaMenu.markAsWatched' => '시청 완료로 표시', 'mediaMenu.markAsUnwatched' => '미시청으로 표시', 'mediaMenu.removeFromContinueWatching' => '계속 보기에서 제거', @@ -3073,6 +3191,8 @@ extension on TranslationsKo { 'mediaMenu.rate' => '평가', 'mediaMenu.playFromBeginning' => '처음부터 재생', 'mediaMenu.playVersion' => '버전 재생...', + _ => null, + } ?? switch (path) { 'rateSheet.title' => '평가', 'rateSheet.server' => '서버', 'rateSheet.favorite' => '즐겨찾기', @@ -3082,8 +3202,6 @@ extension on TranslationsKo { 'rateSheet.noConnectedServices' => '평가하려면 설정에서 서비스를 연결하세요.', 'accessibility.mediaCardMovie' => ({required Object title}) => '${title}, 영화', 'accessibility.mediaCardShow' => ({required Object title}) => '${title}, TV 프로그램', - _ => null, - } ?? switch (path) { 'accessibility.mediaCardEpisode' => ({required Object title, required Object episodeInfo}) => '${title}, ${episodeInfo}', 'accessibility.mediaCardSeason' => ({required Object title, required Object seasonInfo}) => '${title}, ${seasonInfo}', 'accessibility.mediaCardWatched' => '시청 완료', @@ -3104,6 +3222,11 @@ extension on TranslationsKo { 'accessibility.alphabetScrollHint' => '위아래로 스와이프하여 글자별로 이동', 'accessibility.rowColumnPosition' => ({required Object rowCount, required Object row, required Object columnCount, required Object column}) => '${rowCount}행 중 ${row}행, ${columnCount}열 중 ${column}열', 'accessibility.rowPosition' => ({required Object rowCount, required Object row}) => '${rowCount}행 중 ${row}행', + 'accessibility.autoScrollPlay' => '자동 스크롤 재생', + 'accessibility.autoScrollPause' => '자동 스크롤 일시정지', + 'accessibility.hueShort' => 'H', + 'accessibility.saturationShort' => 'S', + 'accessibility.valueShort' => 'V', 'tooltips.shufflePlay' => '무작위 재생', 'tooltips.playTrailer' => '예고편 재생', 'tooltips.markAsWatched' => '시청 완료로 표시', @@ -3194,6 +3317,15 @@ extension on TranslationsKo { 'videoControls.subtitleDownloadedNotApplied' => '자막을 다운로드했지만 선택할 수 없습니다', 'videoControls.subtitleDownloadFailed' => '자막 다운로드에 실패했습니다', 'videoControls.searchLanguages' => '언어 검색...', + 'videoControls.skipIntro' => '인트로 건너뛰기', + 'videoControls.skipCredits' => '크레딧 건너뛰기', + 'videoControls.nextEpisode' => '다음 에피소드', + 'videoControls.subtitleTrack' => ({required Object n}) => '트랙 ${n}', + 'videoControls.subtitleFile' => ({required Object name}) => '자막 ${name}', + 'videoControls.forcedTrack' => ({required Object label}) => '${label} (강제)', + 'videoControls.osdSubtitlesOff' => '자막: 꺼짐', + 'videoControls.osdSubtitles' => ({required Object track}) => '자막: ${track}', + 'videoControls.osdAudio' => ({required Object track}) => '오디오: ${track}', 'messages.markedAsWatched' => '시청 완료로 표시됨', 'messages.markedAsUnwatched' => '미시청으로 표시됨', 'messages.markedAsWatchedOffline' => '시청 완료로 표시됨 (연결 시 동기화됨)', @@ -3243,9 +3375,18 @@ extension on TranslationsKo { 'messages.serverLimitBody' => '서버 오류(HTTP 500). 대역폭/트랜스코딩 제한으로 세션이 거부된 것 같습니다. 소유자에게 조정을 요청하세요.', 'messages.mediaUnreadableTitle' => '파일을 사용할 수 없음', 'messages.mediaUnreadableBody' => '서버에서 이 항목을 찾았지만 파일을 읽을 수 없습니다(HTTP 404). 파일이 이동되거나 삭제되었거나 저장소가 오프라인 상태일 수 있습니다. 서버 관리자에게 파일 확인과 라이브러리 재스캔을 요청하세요.', + 'messages.serverBusyTitle' => '스트림을 사용할 수 없음', + 'messages.serverBusyBody' => '서버에서 이 파일의 스트리밍을 계속 거부했습니다(HTTP 503). 서버가 다시 시작 중이거나 사용량이 많을 수 있으며, 파일이 저장된 저장소가 오프라인일 수도 있습니다. 잠시 후 다시 시도하세요. 문제가 계속되면 서버 소유자에게 서버와 파일 저장소를 확인해 달라고 요청하세요.', 'messages.logsUploaded' => '로그 업로드 완료', 'messages.logsUploadFailed' => '로그 업로드 실패', 'messages.logId' => '로그 ID', + 'messages.burnedSubtitlesUseMenu' => '자막이 이 스트림에 입혀져 있습니다. 자막 메뉴에서 변경하세요.', + 'messages.noVideoUrl' => '사용 가능한 비디오 URL이 없습니다', + 'messages.playbackNoMediaSources' => '서버에서 재생 가능한 미디어 소스를 반환하지 않았습니다', + 'messages.playbackDataNotPrepared' => '재생 데이터가 준비되기 전에 재생이 시작되었습니다', + 'messages.streamSelectionUnavailable' => '이 소스에서는 스트림을 선택할 수 없습니다', + 'messages.streamSelectionFailed' => '선택한 스트림을 적용할 수 없습니다', + 'messages.serverUnavailableForProfile' => '활성 프로필에 사용할 수 있는 서버가 없습니다', 'subtitlingStyling.text' => '텍스트', 'subtitlingStyling.border' => '테두리', 'subtitlingStyling.background' => '배경', @@ -3262,6 +3403,8 @@ extension on TranslationsKo { 'subtitlingStyling.overrideStrip' => '스타일 제거', 'subtitlingStyling.positionTop' => '위', 'subtitlingStyling.positionBottom' => '아래', + 'subtitlingStyling.anchorToScreen' => '화면에 고정', + 'subtitlingStyling.anchorToScreenDescription' => '와이드스크린 비디오 아래의 검은 여백에 텍스트 자막을 표시합니다', 'subtitlingStyling.bold' => '굵게', 'subtitlingStyling.italic' => '기울임꼴', 'subtitlingStyling.renderResolution' => '렌더링 해상도', @@ -3344,6 +3487,7 @@ extension on TranslationsKo { 'profiles.pinExplain' => '프로필 전환에는 4자리 PIN이 필요합니다.', 'profiles.continueButton' => '계속', 'profiles.pinsDontMatch' => 'PIN이 일치하지 않습니다', + 'profiles.tokenIdentityMismatch' => 'Plex 프로필 토큰이 예상과 다른 서버로 확인되었습니다', 'connections.sectionTitle' => '연결', 'connections.addConnection' => '연결 추가', 'connections.addConnectionSubtitleNoProfile' => 'Plex로 로그인하거나 Jellyfin 서버에 연결', @@ -3377,6 +3521,7 @@ extension on TranslationsKo { 'discover.tvShow' => 'TV 시리즈', 'discover.minutesLeft' => ({required Object minutes}) => '${minutes}분 남음', 'discover.moreLikeThis' => '비슷한 콘텐츠', + 'discover.titleCount' => ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('ko'))(n, other: '${n}개 타이틀', ), 'errors.searchFailed' => ({required Object error}) => '검색 실패: ${error}', 'errors.searchUnavailable' => '검색이 어떤 미디어 서버에도 연결할 수 없습니다.', 'errors.connectionTimeout' => ({required Object context}) => '${context} 로드 중 연결 시간 초과', @@ -3549,7 +3694,10 @@ extension on TranslationsKo { 'explore.characters' => '캐릭터', 'explore.addToWatchlist' => '관심 목록에 추가', 'explore.removeFromWatchlist' => '관심 목록에서 제거', + 'explore.addedToWatchlist' => '관심 목록에 추가했습니다', + 'explore.removedFromWatchlist' => '관심 목록에서 삭제했습니다', 'explore.watchlistUpdateFailed' => '관심 목록을 업데이트하지 못했습니다', + 'explore.watchlistNoMatch' => '이 항목을 관심 목록과 연결할 수 없습니다', 'explore.notInLibrary' => '라이브러리에 없음', 'explore.inTheseLibraries' => '이 라이브러리에 있음', 'explore.checkingLibrary' => '라이브러리 확인 중...', @@ -3557,6 +3705,8 @@ extension on TranslationsKo { 'explore.emptyMessage' => ({required Object source}) => '${source}에 콘텐츠가 추가되면 여기에 표시됩니다.', 'explore.searchHint' => ({required Object source}) => '${source}에서 검색', 'explore.searchEmpty' => ({required Object query}) => '「${query}」에 대한 결과가 없습니다', + _ => null, + } ?? switch (path) { 'explore.searchPrompt' => ({required Object source}) => '${source}에서 영화와 TV 프로그램을 검색하세요.', 'explore.searchFailed' => '검색에 실패했습니다. 연결을 확인하고 다시 시도하세요.', 'explore.badge.rankPopular' => ({required Object n}) => '#${n} 인기', @@ -3596,8 +3746,6 @@ extension on TranslationsKo { 'explore.stats.completed' => ({required Object n}) => '완료 ${n}명', 'explore.stats.onHold' => ({required Object n}) => '보류 ${n}명', 'explore.stats.dropped' => ({required Object n}) => '하차 ${n}명', - _ => null, - } ?? switch (path) { 'explore.season.winter' => '겨울', 'explore.season.spring' => '봄', 'explore.season.summer' => '여름', @@ -3694,6 +3842,9 @@ extension on TranslationsKo { 'liveTv.watchChannel' => '채널 시청', 'liveTv.favorites' => '즐겨찾기', 'liveTv.reorderFavorites' => '즐겨찾기 순서 변경', + 'liveTv.noFavoriteChannels' => '즐겨찾기 채널 없음', + 'liveTv.noFavoriteChannelsHint' => '모든 채널을 표시한 다음 채널을 길게 눌러 즐겨찾기에 추가하세요.', + 'liveTv.showAllChannels' => '모든 채널 표시', 'liveTv.favoritesLoadFailed' => '즐겨찾기를 불러올 수 없습니다. 연결을 확인하고 다시 시도하세요.', 'liveTv.favoritesUpdateFailed' => '즐겨찾기를 업데이트할 수 없습니다. 연결을 확인하고 다시 시도하세요.', 'liveTv.joinSession' => '진행 중인 세션 참여', @@ -3733,6 +3884,11 @@ extension on TranslationsKo { 'liveTv.guideReloadRequested' => '가이드 새로고침 요청됨', 'liveTv.rulesProcessRequested' => '규칙 재평가 요청됨', 'liveTv.recordShow' => '프로그램 녹화', + 'liveTv.startingInMinutes' => ({required Object minutes}) => '${minutes}분 후 시작', + 'liveTv.dayAtTime' => ({required Object day, required Object time}) => '${day} ${time}', + 'liveTv.invalidPlaybackData' => ({required Object product}) => '${product}에서 잘못된 실시간 TV 재생 데이터를 반환했습니다', + 'liveTv.failedToStartChannel' => '실시간 채널을 시작할 수 없습니다', + 'liveTv.failedToBuildStreamUrl' => '스트림 URL을 생성할 수 없습니다', 'collections.title' => '컬렉션', 'collections.collection' => '컬렉션', 'collections.empty' => '컬렉션이 비어 있습니다', @@ -3801,6 +3957,8 @@ extension on TranslationsKo { 'music.repeat' => '반복', 'music.repeatAll' => '전체 반복', 'music.repeatOne' => '한 곡 반복', + 'music.instantMixNoServer' => '즉석 믹스에 사용할 수 있는 서버가 없습니다', + 'music.noAudioUrl' => ({required Object track}) => '${track}에 사용할 수 있는 오디오 URL이 없습니다', 'watchTogether.title' => '함께 보기', 'watchTogether.description' => '친구 및 가족과 콘텐츠를 동시에 시청하세요', 'watchTogether.createSession' => '세션 생성', @@ -3866,6 +4024,7 @@ extension on TranslationsKo { 'watchTogether.removeRoom' => '제거', 'watchTogether.guestSwitchUnavailable' => '전환할 수 없음 — 동기화 서버를 사용할 수 없습니다', 'watchTogether.guestSwitchFailed' => '전환할 수 없음 — 이 서버에서 콘텐츠를 찾을 수 없습니다', + 'watchTogether.defaultDisplayName' => '사용자', 'downloads.title' => '다운로드', 'downloads.manage' => '관리', 'downloads.tvShows' => 'TV 프로그램', @@ -3966,6 +4125,16 @@ extension on TranslationsKo { 'downloads.backgroundWarning.statusUnknown' => '아직 확인하지 않음', 'downloads.backgroundWarning.settingsUnavailable' => '이 기기에서 시스템 설정을 열 수 없습니다', 'downloads.backgroundWarning.linkUnavailable' => '이 기기에서 dontkillmyapp.com을 열 수 없습니다', + 'downloads.unknownShow' => '알 수 없는 프로그램', + 'downloads.unknownSeason' => '알 수 없는 시즌', + 'downloads.unknownAlbum' => '알 수 없는 앨범', + 'downloads.completedOfTotal' => ({required Object completed, required Object total}) => '${completed}/${total} 완료', + 'downloads.errorFileNotFound' => '파일을 찾을 수 없음(404)', + 'downloads.errorDownloadFailed' => '다운로드 실패', + 'downloads.errorPostProcessing' => ({required Object error}) => '후처리 실패: ${error}', + 'downloads.notificationDownloading' => '다운로드 중...', + 'downloads.notificationComplete' => '다운로드 완료', + 'downloads.notificationPaused' => '다운로드 일시 중지', 'shaders.title' => '셰이더', 'shaders.noShaderDescription' => '비디오 향상 없음', 'shaders.nvscalerDescription' => '더 선명한 비디오를 위한 NVIDIA 이미지 스케일링', @@ -4045,14 +4214,24 @@ extension on TranslationsKo { 'companionRemote.errors.failedToConnectAnyAddress' => '어떤 주소에도 연결하지 못했습니다', 'companionRemote.errors.connectionLostAfterAttempts' => ({required Object attempts}) => '${attempts}회 시도 후 연결이 끊어졌습니다', 'companionRemote.errors.connectionLost' => '연결이 끊어졌습니다', + 'companionRemote.closedBeforeAuth' => '인증 전에 연결이 종료되었습니다', 'videoSettings.playbackSpeed' => '재생 속도', 'videoSettings.normalSpeed' => '보통', 'videoSettings.sleepTimerActive' => ({required Object duration}) => '활성 (${duration})', 'videoSettings.zoom' => '확대/축소', + _ => null, + } ?? switch (path) { 'videoSettings.sleepTimer' => '취침 타이머', 'videoSettings.audioSync' => '오디오 동기화', 'videoSettings.subtitleSync' => '자막 동기화', 'videoSettings.hdr' => 'HDR', + 'videoSettings.hdrUnsupported' => '여기서는 HDR을 사용할 수 없습니다. 이 데스크톱 컴포지터 또는 비디오 출력에서 HDR을 전달할 수 없습니다.', + 'videoSettings.hdrToneMapping' => 'HDR 톤 매핑', + 'videoSettings.hdrToneMappingCompositor' => '컴포지터', + 'videoSettings.hdrToneMappingCompositorDescription' => '소스의 HDR 메타데이터를 그대로 전달하고 데스크톱 컴포지터에서 매핑하도록 합니다.', + 'videoSettings.hdrToneMappingPlayer' => '플레이어', + 'videoSettings.hdrToneMappingPlayerDescription' => '플레이어에서 디스플레이의 최대 밝기에 맞게 매핑한 다음 그 결과를 컴포지터에 전달합니다.', + 'videoSettings.hdrToneMappingFailed' => 'HDR 톤 매핑을 변경할 수 없습니다. 이전 모드가 계속 적용됩니다.', 'videoSettings.audioOutput' => '오디오 출력', 'videoSettings.performanceOverlay' => '성능 오버레이', 'videoSettings.audioOutputDolbyAtmos' => 'Dolby Atmos', @@ -4097,6 +4276,16 @@ extension on TranslationsKo { 'performanceOverlay.player' => '플레이어', 'performanceOverlay.memory' => '메모리', 'performanceOverlay.uiFps' => 'UI FPS', + 'performanceOverlay.fps' => 'FPS', + 'performanceOverlay.decoderAndroidHw' => 'Android HW', + 'performanceOverlay.decoderNvidiaHw' => 'NVIDIA HW', + 'performanceOverlay.decoderQualcommHw' => 'Qualcomm HW', + 'performanceOverlay.decoderMediatekHw' => 'MediaTek HW', + 'performanceOverlay.decoderExynosHw' => 'Exynos HW', + 'performanceOverlay.decoderSoftware' => '소프트웨어', + 'performanceOverlay.decoderHardware' => '하드웨어', + 'performanceOverlay.tunnelingActive' => '활성', + 'performanceOverlay.dvRpuFailed' => ({required Object converted, required Object failures}) => '${converted} (${failures}개 실패)', 'externalPlayer.title' => '외부 플레이어', 'externalPlayer.useExternalPlayer' => '외부 플레이어 사용', 'externalPlayer.useExternalPlayerDescription' => '동영상을 다른 앱에서 열기', @@ -4110,8 +4299,6 @@ extension on TranslationsKo { 'externalPlayer.playerPackage' => '패키지 이름', 'externalPlayer.playerUrlScheme' => 'URL 스킴', 'externalPlayer.off' => '꺼짐', - _ => null, - } ?? switch (path) { 'externalPlayer.launchFailed' => '외부 플레이어를 열 수 없습니다', 'externalPlayer.appNotInstalled' => ({required Object name}) => '${name}이(가) 설치되어 있지 않습니다', 'externalPlayer.playInExternalPlayer' => '외부 플레이어에서 재생', @@ -4245,6 +4432,16 @@ extension on TranslationsKo { 'seerr.statusPartiallyAvailable' => '일부 사용 가능', 'seerr.statusRequested' => '요청됨', 'seerr.statusProcessing' => '처리 중', + 'seerr.couldNotReach' => ({required Object url, required Object error}) => '${url}에 연결할 수 없습니다: ${error}', + 'seerr.noInstanceAtUrl' => ({required Object url, required Object status}) => '${url}에 Seerr 인스턴스가 없습니다(HTTP ${status})', + 'seerr.notInitialized' => '이 Seerr 인스턴스는 최초 실행 설정을 완료하지 않았습니다', + 'seerr.noPlexTokenForReauth' => '다시 로그인하는 데 사용할 수 있는 Plex 토큰이 없습니다', + 'seerr.noStoredCredentials' => '다시 로그인하는 데 사용할 수 있는 저장된 인증 정보가 없습니다', + 'seerr.signInRejected' => '로그인이 거부되었습니다', + 'seerr.noSessionCookie' => 'Seerr에서 세션 쿠키를 발급하지 않았습니다', + 'seerr.freshCookieRejected' => 'Seerr에서 새 세션 쿠키를 거부했습니다', + 'seerr.noUserInformation' => 'Seerr에서 사용자 정보를 반환하지 않았습니다', + 'seerr.sessionRejectedAfterReauth' => '다시 로그인한 후 세션이 거부되었습니다', 'services.title' => '서비스', 'services.hubSubtitle' => '시청 진행률을 동기화하고 새 작품을 요청하세요.', 'services.notConnected' => '연결되지 않음', @@ -4260,6 +4457,7 @@ extension on TranslationsKo { 'services.names.seerr' => 'Seerr', 'services.names.mdblist' => 'MDBList', 'services.deviceCode.title' => ({required Object service}) => '${service}에서 Plezy 활성화', + 'services.deviceCode.instructions' => 'QR 코드를 스캔하거나 아래 주소로 이동하여 이 코드를 입력하세요:', 'services.deviceCode.openToActivate' => ({required Object service}) => '활성화하려면 ${service} 열기', 'services.deviceCode.copyCode' => '활성화 코드 복사', 'services.deviceCode.waitingForAuthorization' => '인증을 기다리는 중…', @@ -4309,6 +4507,24 @@ extension on TranslationsKo { 'addServer.connectToMediaBrowserCardSubtitleScoped' => ({required Object product, required Object name}) => '${product} 서버에 로그인하세요. ${name}에 연결됩니다.', 'addServer.borrowFromAnotherProfile' => '다른 프로필에서 빌리기', 'addServer.borrowFromAnotherProfileSubtitle' => '다른 프로필의 연결을 재사용합니다. PIN으로 보호된 프로필에는 PIN이 필요합니다.', + 'addServer.invalidCredentials' => '사용자 이름 또는 비밀번호가 올바르지 않습니다', + 'addServer.authResponseNotJson' => '인증 응답이 유효한 JSON이 아닙니다', + 'addServer.quickConnectRejected' => '서버에서 Quick Connect를 거부했습니다', + 'addServer.quickConnectNotJson' => 'Quick Connect 응답이 유효한 JSON이 아닙니다', + 'addServer.quickConnectMissingFields' => 'Quick Connect 응답에 코드 또는 비밀 키가 없습니다', + 'addServer.quickConnectPollRejected' => '서버에서 Quick Connect 폴링을 거부했습니다', + 'addServer.serverTimedOut' => '서버가 제시간에 응답하지 않았습니다', + 'addServer.responseNotJson' => '서버 응답이 유효한 JSON이 아닙니다', + 'addServer.responseMissingIdentity' => ({required Object product}) => '응답에 ID 또는 서버 이름이 없습니다. 이 서버가 ${product} 서버인가요?', + 'addServer.probeFailed' => ({required Object error}) => '서버에 연결할 수 없습니다: ${error}', + 'addServer.enterAtLeastOneUrl' => ({required Object product}) => '${product} 서버 URL을 하나 이상 입력하세요', + 'addServer.noReachableServer' => ({required Object product}) => '연결 가능한 ${product} 서버를 찾을 수 없습니다', + 'addServer.urlsPointToDifferentServers' => ({required Object product}) => '이 URL들은 서로 다른 ${product} 서버를 가리킵니다', + 'addServer.urlDoesNotMatchServer' => ({required Object product}) => '이 URL은 ${product} 서버와 일치하지 않습니다', + 'addServer.redirectUnsupported' => '서버가 지원되지 않는 URL로 리디렉션했습니다', + 'addServer.redirectDifferentHost' => ({required Object product}) => '서버가 다른 호스트로 리디렉션했습니다. 최종 ${product} URL을 직접 입력하세요.', + 'addServer.redirectInsecure' => '서버가 HTTPS에서 안전하지 않은 URL로 리디렉션했습니다', + 'addServer.redirectUnsupportedEnterFinal' => ({required Object product}) => '서버가 지원되지 않는 URL로 리디렉션했습니다. 최종 ${product} URL을 직접 입력하세요.', _ => null, }; } diff --git a/lib/i18n/strings_nb.g.dart b/lib/i18n/strings_nb.g.dart index d507cc89..37e6c177 100644 --- a/lib/i18n/strings_nb.g.dart +++ b/lib/i18n/strings_nb.g.dart @@ -123,6 +123,7 @@ class _Translations$auth$nb extends Translations$auth$en { @override String get quickConnectCancel => 'Avbryt'; @override String get quickConnectExpired => 'Quick Connect er utløpt. Prøv igjen.'; @override String get localDataRecoveryRequired => 'Plezy kunne ikke gjenopprette lokale innloggingsdata og ventende avspillingsdata på en sikker måte. Logg inn på nytt.'; + @override String get pinCheckRejected => 'Kontrollen av Plex-PIN-koden ble avvist'; } // Path: common @@ -178,6 +179,9 @@ class _Translations$common$nb extends Translations$common$en { @override String get exitFullscreen => 'Avslutt fullskjerm'; @override String get pressBackAgainToExit => 'Trykk på Tilbake en gang til for å avslutte'; @override late final _Translations$common$ratingSource$nb ratingSource = _Translations$common$ratingSource$nb._(_root); + @override String get notAvailable => 'I/T'; + @override String get url => 'URL'; + @override String get letterKeys => 'ABC'; } // Path: screens @@ -444,6 +448,8 @@ class _Translations$settings$nb extends Translations$settings$en { @override String get showNavBarLabels => 'Vis etiketter i navigasjonsfeltet'; @override String get showNavBarLabelsDescription => 'Vis tekstetiketter under ikonene i navigasjonsfeltet'; @override String get startupSection => 'Startseksjon'; + @override String get showExploreTab => 'Vis Oppdag-fanen'; + @override String get showExploreTabDescription => 'Vis Oppdag-fanen med innhold fra Plex Discover og tilkoblede sporingstjenester'; @override String get liveTvDefaultFavorites => 'Vis favorittkanaler som standard'; @override String get liveTvDefaultFavoritesDescription => 'Vis bare favorittkanaler når du åpner Direkte-TV'; @override String get display => 'Skjerm'; @@ -455,6 +461,7 @@ class _Translations$settings$nb extends Translations$settings$en { @override String get subtitlesAndConfig => 'Undertekster og konfigurasjon'; @override String get seekAndTiming => 'Spoling og tidsinnstillinger'; @override String get behavior => 'Oppførsel'; + @override String get exportDialogTitle => 'Eksporter Plezy-innstillinger'; } // Path: search @@ -606,6 +613,8 @@ class _Translations$fileInfo$nb extends Translations$fileInfo$en { @override String get flagHearingImpaired => 'Hørselshemmet'; @override String get flagDub => 'Dub'; @override String get flagOriginal => 'Original'; + @override String get channelsMono => 'Mono'; + @override String dolbyVisionProfile({required Object profile}) => 'Profil ${profile}'; } // Path: mediaMenu @@ -704,6 +713,11 @@ class _Translations$accessibility$nb extends Translations$accessibility$en { @override String get alphabetScrollHint => 'Sveip opp eller ned for å gå én bokstav om gangen'; @override String rowColumnPosition({required Object row, required Object rowCount, required Object column, required Object columnCount}) => 'Rad ${row} av ${rowCount}, kolonne ${column} av ${columnCount}'; @override String rowPosition({required Object row, required Object rowCount}) => 'Rad ${row} av ${rowCount}'; + @override String get autoScrollPlay => 'Start automatisk rulling'; + @override String get autoScrollPause => 'Sett automatisk rulling på pause'; + @override String get hueShort => 'H'; + @override String get saturationShort => 'S'; + @override String get valueShort => 'V'; } // Path: tooltips @@ -815,6 +829,15 @@ class _Translations$videoControls$nb extends Translations$videoControls$en { @override String get subtitleDownloadedNotApplied => 'Underteksten ble lastet ned, men kunne ikke velges'; @override String get subtitleDownloadFailed => 'Kunne ikke laste ned undertekst'; @override String get searchLanguages => 'Søk etter språk...'; + @override String get skipIntro => 'Hopp over intro'; + @override String get skipCredits => 'Hopp over rulletekst'; + @override String get nextEpisode => 'Neste episode'; + @override String subtitleTrack({required Object n}) => 'Spor ${n}'; + @override String subtitleFile({required Object name}) => 'Undertekst ${name}'; + @override String forcedTrack({required Object label}) => '${label} (tvunget)'; + @override String get osdSubtitlesOff => 'Undertekster: Av'; + @override String osdSubtitles({required Object track}) => 'Undertekster: ${track}'; + @override String osdAudio({required Object track}) => 'Lyd: ${track}'; } // Path: messages @@ -876,9 +899,18 @@ class _Translations$messages$nb extends Translations$messages$en { @override String get serverLimitBody => 'Serverfeil (HTTP 500). En båndbredde-/transkodingsgrense avviste trolig økten. Be eieren justere den.'; @override String get mediaUnreadableTitle => 'Fil utilgjengelig'; @override String get mediaUnreadableBody => 'Serveren fant dette elementet, men kunne ikke lese filen (HTTP 404). Filen er sannsynligvis flyttet, slettet, eller lagringen er frakoblet. Be serverens eier om å sjekke filen og skanne biblioteket på nytt.'; + @override String get serverBusyTitle => 'Strømmen er utilgjengelig'; + @override String get serverBusyBody => 'Serveren fortsatte å nekte å strømme denne filen (HTTP 503). Den kan være i ferd med å starte på nytt eller være opptatt, eller lagringsstedet til filen kan være frakoblet. Prøv igjen om litt – hvis det fortsetter å skje, kan du be eieren av serveren om å kontrollere serveren og lagringsstedet til filen.'; @override String get logsUploaded => 'Logger lastet opp'; @override String get logsUploadFailed => 'Kunne ikke laste opp logger'; @override String get logId => 'Logg-ID'; + @override String get burnedSubtitlesUseMenu => 'Undertekstene er brent inn i denne strømmen. Endre dem fra undertekstmenyen.'; + @override String get noVideoUrl => 'Ingen video-URL er tilgjengelig'; + @override String get playbackNoMediaSources => 'Serveren returnerte ingen avspillbare mediekilder'; + @override String get playbackDataNotPrepared => 'Avspillingen ble startet før dataene var klare'; + @override String get streamSelectionUnavailable => 'Valg av strømmer er ikke tilgjengelig for denne kilden'; + @override String get streamSelectionFailed => 'Kunne ikke bruke de valgte strømmene'; + @override String get serverUnavailableForProfile => 'Ingen server er tilgjengelig for den aktive profilen'; } // Path: subtitlingStyling @@ -904,6 +936,8 @@ class _Translations$subtitlingStyling$nb extends Translations$subtitlingStyling$ @override String get overrideStrip => 'Fjern formatering'; @override String get positionTop => 'Øverst'; @override String get positionBottom => 'Nederst'; + @override String get anchorToScreen => 'Forankre til skjermen'; + @override String get anchorToScreenDescription => 'Vis tekstundertekster i de svarte feltene under video i bredformat'; @override String get bold => 'Fet'; @override String get italic => 'Kursiv'; @override String get renderResolution => 'Gjengivelsesoppløsning'; @@ -1013,6 +1047,7 @@ class _Translations$profiles$nb extends Translations$profiles$en { @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 tokenIdentityMismatch => 'Plex-profiltokenet ble knyttet til en uventet server'; } // Path: connections @@ -1064,6 +1099,10 @@ class _Translations$discover$nb extends Translations$discover$en { @override String get tvShow => 'TV-serie'; @override String minutesLeft({required Object minutes}) => '${minutes} min igjen'; @override String get moreLikeThis => 'Mer som dette'; + @override String titleCount({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('nb'))(n, + one: '${n} tittel', + other: '${n} titler', + ); } // Path: errors @@ -1276,7 +1315,10 @@ class _Translations$explore$nb extends Translations$explore$en { @override String get characters => 'Figurer'; @override String get addToWatchlist => 'Legg til i ønskeliste'; @override String get removeFromWatchlist => 'Fjern fra ønskeliste'; + @override String get addedToWatchlist => 'Lagt til i overvåkningslisten'; + @override String get removedFromWatchlist => 'Fjernet fra overvåkningslisten'; @override String get watchlistUpdateFailed => 'Kunne ikke oppdatere ønskelisten'; + @override String get watchlistNoMatch => 'Kunne ikke koble dette elementet til en overvåkningsliste'; @override String get notInLibrary => 'Ikke i biblioteket ditt'; @override String get inTheseLibraries => 'I disse bibliotekene'; @override String get checkingLibrary => 'Sjekker biblioteket ditt...'; @@ -1337,6 +1379,9 @@ class _Translations$liveTv$nb extends Translations$liveTv$en { @override String get watchChannel => 'Se kanal'; @override String get favorites => 'Favoritter'; @override String get reorderFavorites => 'Endre rekkefølge på favoritter'; + @override String get noFavoriteChannels => 'Ingen favorittkanaler'; + @override String get noFavoriteChannelsHint => 'Vis alle kanaler, og trykk deretter lenge på en kanal for å legge den til i favorittene dine.'; + @override String get showAllChannels => 'Vis alle kanaler'; @override String get favoritesLoadFailed => 'Kunne ikke laste inn favoritter. Kontroller tilkoblingen og prøv på nytt.'; @override String get favoritesUpdateFailed => 'Kunne ikke oppdatere favorittene. Kontroller tilkoblingen og prøv på nytt.'; @override String get joinSession => 'Bli med i pågående økt'; @@ -1376,6 +1421,11 @@ class _Translations$liveTv$nb extends Translations$liveTv$en { @override String get guideReloadRequested => 'Oppdatering av programguiden er forespurt'; @override String get rulesProcessRequested => 'Ny vurdering av reglene er forespurt'; @override String get recordShow => 'Ta opp program'; + @override String startingInMinutes({required Object minutes}) => 'Starter om ${minutes} min'; + @override String dayAtTime({required Object day, required Object time}) => '${day} kl. ${time}'; + @override String invalidPlaybackData({required Object product}) => '${product} returnerte ugyldige avspillingsdata for direkte-TV'; + @override String get failedToStartChannel => 'Kunne ikke starte direktekanalen'; + @override String get failedToBuildStreamUrl => 'Kunne ikke opprette strømme-URL-en'; } // Path: collections @@ -1474,6 +1524,8 @@ class _Translations$music$nb extends Translations$music$en { @override String get repeat => 'Gjenta'; @override String get repeatAll => 'Gjenta alle'; @override String get repeatOne => 'Gjenta ett spor'; + @override String get instantMixNoServer => 'Ingen server er tilgjengelig for en hurtigmiks'; + @override String noAudioUrl({required Object track}) => 'Ingen lyd-URL er tilgjengelig for ${track}'; } // Path: watchTogether @@ -1548,6 +1600,7 @@ class _Translations$watchTogether$nb extends Translations$watchTogether$en { @override String get removeRoom => 'Fjern'; @override String get guestSwitchUnavailable => 'Kunne ikke bytte — server ikke tilgjengelig for synkronisering'; @override String get guestSwitchFailed => 'Kunne ikke bytte — innhold ble ikke funnet på denne serveren'; + @override String get defaultDisplayName => 'Bruker'; } // Path: downloads @@ -1632,6 +1685,16 @@ class _Translations$downloads$nb extends Translations$downloads$en { @override String get syncRuleUnknownServer => 'Ukjent server'; @override String get syncRuleListCreated => 'Synkroniseringsregel opprettet'; @override late final _Translations$downloads$backgroundWarning$nb backgroundWarning = _Translations$downloads$backgroundWarning$nb._(_root); + @override String get unknownShow => 'Ukjent serie'; + @override String get unknownSeason => 'Ukjent sesong'; + @override String get unknownAlbum => 'Ukjent album'; + @override String completedOfTotal({required Object completed, required Object total}) => '${completed}/${total} fullført'; + @override String get errorFileNotFound => 'Filen ble ikke funnet (404)'; + @override String get errorDownloadFailed => 'Nedlastingen mislyktes'; + @override String errorPostProcessing({required Object error}) => 'Etterbehandlingen mislyktes: ${error}'; + @override String get notificationDownloading => 'Laster ned...'; + @override String get notificationComplete => 'Nedlastingen er fullført'; + @override String get notificationPaused => 'Nedlastingen er satt på pause'; } // Path: shaders @@ -1672,6 +1735,7 @@ class _Translations$companionRemote$nb extends Translations$companionRemote$en { @override late final _Translations$companionRemote$pairing$nb pairing = _Translations$companionRemote$pairing$nb._(_root); @override late final _Translations$companionRemote$remote$nb remote = _Translations$companionRemote$remote$nb._(_root); @override late final _Translations$companionRemote$errors$nb errors = _Translations$companionRemote$errors$nb._(_root); + @override String get closedBeforeAuth => 'Tilkoblingen ble lukket før autentisering'; } // Path: videoSettings @@ -1689,6 +1753,13 @@ class _Translations$videoSettings$nb extends Translations$videoSettings$en { @override String get audioSync => 'Lydsynkronisering'; @override String get subtitleSync => 'Undertekstsynkronisering'; @override String get hdr => 'HDR'; + @override String get hdrUnsupported => 'HDR er ikke tilgjengelig her – denne skrivebordskompositoren eller videoutgangen kan ikke overføre HDR.'; + @override String get hdrToneMapping => 'HDR-tonekartlegging'; + @override String get hdrToneMappingCompositor => 'Kompositor'; + @override String get hdrToneMappingCompositorDescription => 'Send kildens HDR-metadata videre, og la skrivebordskompositoren utføre tonekartleggingen.'; + @override String get hdrToneMappingPlayer => 'Spiller'; + @override String get hdrToneMappingPlayerDescription => 'Tilpass til skjermens maksimale lysstyrke i spilleren, og send deretter resultatet til kompositoren.'; + @override String get hdrToneMappingFailed => 'Kunne ikke endre HDR-tonekartleggingen – den forrige modusen er fortsatt aktiv.'; @override String get audioOutput => 'Lydutgang'; @override String get performanceOverlay => 'Ytelsesoverlegg'; @override String get audioOutputDolbyAtmos => 'Dolby Atmos'; @@ -1742,6 +1813,16 @@ class _Translations$performanceOverlay$nb extends Translations$performanceOverla @override String get player => 'Spiller'; @override String get memory => 'Minne'; @override String get uiFps => 'UI FPS'; + @override String get fps => 'FPS'; + @override String get decoderAndroidHw => 'Android-maskinvare'; + @override String get decoderNvidiaHw => 'NVIDIA-maskinvare'; + @override String get decoderQualcommHw => 'Qualcomm-maskinvare'; + @override String get decoderMediatekHw => 'MediaTek-maskinvare'; + @override String get decoderExynosHw => 'Exynos-maskinvare'; + @override String get decoderSoftware => 'Programvare'; + @override String get decoderHardware => 'Maskinvare'; + @override String get tunnelingActive => 'Aktiv'; + @override String dvRpuFailed({required Object converted, required Object failures}) => '${converted} (${failures} mislyktes)'; } // Path: externalPlayer @@ -1942,6 +2023,16 @@ class _Translations$seerr$nb extends Translations$seerr$en { @override String get statusPartiallyAvailable => 'Delvis tilgjengelig'; @override String get statusRequested => 'Forespurt'; @override String get statusProcessing => 'Behandler'; + @override String couldNotReach({required Object url, required Object error}) => 'Kunne ikke nå ${url}: ${error}'; + @override String noInstanceAtUrl({required Object url, required Object status}) => 'Ingen Seerr-instans på ${url} (HTTP ${status})'; + @override String get notInitialized => 'Denne Seerr-instansen har ikke fullført førstegangsoppsettet'; + @override String get noPlexTokenForReauth => 'Ingen Plex-token er tilgjengelig for å logge inn på nytt'; + @override String get noStoredCredentials => 'Ingen lagret påloggingsinformasjon er tilgjengelig for å logge inn på nytt'; + @override String get signInRejected => 'Innloggingen ble avvist'; + @override String get noSessionCookie => 'Seerr utstedte ingen øktinformasjonskapsel'; + @override String get freshCookieRejected => 'Seerr avviste den nye øktinformasjonskapselen'; + @override String get noUserInformation => 'Seerr returnerte ingen brukerinformasjon'; + @override String get sessionRejectedAfterReauth => 'Økten ble avvist etter ny innlogging'; } // Path: services @@ -2002,6 +2093,24 @@ class _Translations$addServer$nb extends Translations$addServer$en { @override String connectToMediaBrowserCardSubtitleScoped({required Object product, required Object name}) => 'Logg på ${product}-serveren din. Knyttes til ${name}.'; @override String get borrowFromAnotherProfile => 'Lån fra en annen profil'; @override String get borrowFromAnotherProfileSubtitle => 'Gjenbruk en annen profils tilkobling. PIN-beskyttede profiler krever PIN.'; + @override String get invalidCredentials => 'Ugyldig brukernavn eller passord'; + @override String get authResponseNotJson => 'Autentiseringssvaret var ikke gyldig JSON'; + @override String get quickConnectRejected => 'Quick Connect ble avvist av serveren'; + @override String get quickConnectNotJson => 'Quick Connect-svaret var ikke gyldig JSON'; + @override String get quickConnectMissingFields => 'Quick Connect-svaret mangler en kode eller hemmelighet'; + @override String get quickConnectPollRejected => 'Quick Connect-spørringen ble avvist av serveren'; + @override String get serverTimedOut => 'Serveren svarte ikke i tide'; + @override String get responseNotJson => 'Serversvaret var ikke gyldig JSON'; + @override String responseMissingIdentity({required Object product}) => 'Svaret mangler en ID eller et servernavn – er dette en ${product}-server?'; + @override String probeFailed({required Object error}) => 'Kunne ikke nå serveren: ${error}'; + @override String enterAtLeastOneUrl({required Object product}) => 'Angi minst én URL til en ${product}-server'; + @override String noReachableServer({required Object product}) => 'Fant ingen tilgjengelig ${product}-server'; + @override String urlsPointToDifferentServers({required Object product}) => 'Disse URL-ene peker til forskjellige ${product}-servere'; + @override String urlDoesNotMatchServer({required Object product}) => 'Denne URL-en samsvarer ikke med ${product}-serveren'; + @override String get redirectUnsupported => 'Serveren omdirigerte til en URL som ikke støttes'; + @override String redirectDifferentHost({required Object product}) => 'Serveren omdirigerte til en annen vert. Angi den endelige ${product}-URL-en direkte.'; + @override String get redirectInsecure => 'Serveren omdirigerte fra HTTPS til en usikker URL'; + @override String redirectUnsupportedEnterFinal({required Object product}) => 'Serveren omdirigerte til en URL som ikke støttes. Angi den endelige ${product}-URL-en direkte.'; } // Path: common.ratingSource @@ -2521,6 +2630,7 @@ class _Translations$services$deviceCode$nb extends Translations$services$deviceC // Translations @override String title({required Object service}) => 'Aktiver Plezy på ${service}'; + @override String get instructions => 'Skann QR-koden, eller gå til adressen nedenfor og skriv inn denne koden:'; @override String openToActivate({required Object service}) => 'Åpne ${service} for å aktivere'; @override String get copyCode => 'Kopier aktiveringskode'; @override String get waitingForAuthorization => 'Venter på godkjenning…'; @@ -2595,6 +2705,7 @@ extension on TranslationsNb { 'auth.quickConnectCancel' => 'Avbryt', 'auth.quickConnectExpired' => 'Quick Connect er utløpt. Prøv igjen.', 'auth.localDataRecoveryRequired' => 'Plezy kunne ikke gjenopprette lokale innloggingsdata og ventende avspillingsdata på en sikker måte. Logg inn på nytt.', + 'auth.pinCheckRejected' => 'Kontrollen av Plex-PIN-koden ble avvist', 'common.cancel' => 'Avbryt', 'common.save' => 'Lagre', 'common.close' => 'Lukk', @@ -2651,6 +2762,9 @@ extension on TranslationsNb { 'common.ratingSource.trakt' => 'Trakt', 'common.ratingSource.rottenTomatoesCritic' => 'Rotten Tomatoes-kritikere', 'common.ratingSource.rottenTomatoesAudience' => 'Rotten Tomatoes-publikum', + 'common.notAvailable' => 'I/T', + 'common.url' => 'URL', + 'common.letterKeys' => 'ABC', 'screens.licenses' => 'Lisenser', 'screens.switchProfile' => 'Bytt profil', 'screens.subtitleStyling' => 'Undertekststil', @@ -2890,6 +3004,8 @@ extension on TranslationsNb { 'settings.showNavBarLabels' => 'Vis etiketter i navigasjonsfeltet', 'settings.showNavBarLabelsDescription' => 'Vis tekstetiketter under ikonene i navigasjonsfeltet', 'settings.startupSection' => 'Startseksjon', + 'settings.showExploreTab' => 'Vis Oppdag-fanen', + 'settings.showExploreTabDescription' => 'Vis Oppdag-fanen med innhold fra Plex Discover og tilkoblede sporingstjenester', 'settings.liveTvDefaultFavorites' => 'Vis favorittkanaler som standard', 'settings.liveTvDefaultFavoritesDescription' => 'Vis bare favorittkanaler når du åpner Direkte-TV', 'settings.display' => 'Skjerm', @@ -2901,6 +3017,7 @@ extension on TranslationsNb { 'settings.subtitlesAndConfig' => 'Undertekster og konfigurasjon', 'settings.seekAndTiming' => 'Spoling og tidsinnstillinger', 'settings.behavior' => 'Oppførsel', + 'settings.exportDialogTitle' => 'Eksporter Plezy-innstillinger', 'search.hint' => 'Søk i filmer, serier, musikk...', 'search.tryDifferentTerm' => 'Prøv et annet søkeord', 'search.searchYourMedia' => 'Søk i mediene dine', @@ -3049,6 +3166,8 @@ extension on TranslationsNb { 'fileInfo.flagHearingImpaired' => 'Hørselshemmet', 'fileInfo.flagDub' => 'Dub', 'fileInfo.flagOriginal' => 'Original', + 'fileInfo.channelsMono' => 'Mono', + 'fileInfo.dolbyVisionProfile' => ({required Object profile}) => 'Profil ${profile}', 'mediaMenu.markAsWatched' => 'Merk som sett', 'mediaMenu.markAsUnwatched' => 'Merk som usett', 'mediaMenu.removeFromContinueWatching' => 'Fjern fra Fortsett å se', @@ -3082,6 +3201,8 @@ extension on TranslationsNb { 'mediaMenu.rate' => 'Vurder', 'mediaMenu.playFromBeginning' => 'Spill fra begynnelsen', 'mediaMenu.playVersion' => 'Spill av versjon...', + _ => null, + } ?? switch (path) { 'rateSheet.title' => 'Vurder', 'rateSheet.server' => 'Server', 'rateSheet.favorite' => 'Favoritt', @@ -3091,8 +3212,6 @@ extension on TranslationsNb { 'rateSheet.noConnectedServices' => 'Koble til en tjeneste i Innstillinger for å vurdere her.', 'accessibility.mediaCardMovie' => ({required Object title}) => '${title}, film', 'accessibility.mediaCardShow' => ({required Object title}) => '${title}, TV-serie', - _ => null, - } ?? switch (path) { 'accessibility.mediaCardEpisode' => ({required Object title, required Object episodeInfo}) => '${title}, ${episodeInfo}', 'accessibility.mediaCardSeason' => ({required Object title, required Object seasonInfo}) => '${title}, ${seasonInfo}', 'accessibility.mediaCardWatched' => 'sett', @@ -3113,6 +3232,11 @@ extension on TranslationsNb { 'accessibility.alphabetScrollHint' => 'Sveip opp eller ned for å gå én bokstav om gangen', 'accessibility.rowColumnPosition' => ({required Object row, required Object rowCount, required Object column, required Object columnCount}) => 'Rad ${row} av ${rowCount}, kolonne ${column} av ${columnCount}', 'accessibility.rowPosition' => ({required Object row, required Object rowCount}) => 'Rad ${row} av ${rowCount}', + 'accessibility.autoScrollPlay' => 'Start automatisk rulling', + 'accessibility.autoScrollPause' => 'Sett automatisk rulling på pause', + 'accessibility.hueShort' => 'H', + 'accessibility.saturationShort' => 'S', + 'accessibility.valueShort' => 'V', 'tooltips.shufflePlay' => 'Tilfeldig avspilling', 'tooltips.playTrailer' => 'Spill trailer', 'tooltips.markAsWatched' => 'Merk som sett', @@ -3203,6 +3327,15 @@ extension on TranslationsNb { 'videoControls.subtitleDownloadedNotApplied' => 'Underteksten ble lastet ned, men kunne ikke velges', 'videoControls.subtitleDownloadFailed' => 'Kunne ikke laste ned undertekst', 'videoControls.searchLanguages' => 'Søk etter språk...', + 'videoControls.skipIntro' => 'Hopp over intro', + 'videoControls.skipCredits' => 'Hopp over rulletekst', + 'videoControls.nextEpisode' => 'Neste episode', + 'videoControls.subtitleTrack' => ({required Object n}) => 'Spor ${n}', + 'videoControls.subtitleFile' => ({required Object name}) => 'Undertekst ${name}', + 'videoControls.forcedTrack' => ({required Object label}) => '${label} (tvunget)', + 'videoControls.osdSubtitlesOff' => 'Undertekster: Av', + 'videoControls.osdSubtitles' => ({required Object track}) => 'Undertekster: ${track}', + 'videoControls.osdAudio' => ({required Object track}) => 'Lyd: ${track}', 'messages.markedAsWatched' => 'Merket som sett', 'messages.markedAsUnwatched' => 'Merket som usett', 'messages.markedAsWatchedOffline' => 'Merket som sett (synkroniseres når tilkoblet)', @@ -3252,9 +3385,18 @@ extension on TranslationsNb { 'messages.serverLimitBody' => 'Serverfeil (HTTP 500). En båndbredde-/transkodingsgrense avviste trolig økten. Be eieren justere den.', 'messages.mediaUnreadableTitle' => 'Fil utilgjengelig', 'messages.mediaUnreadableBody' => 'Serveren fant dette elementet, men kunne ikke lese filen (HTTP 404). Filen er sannsynligvis flyttet, slettet, eller lagringen er frakoblet. Be serverens eier om å sjekke filen og skanne biblioteket på nytt.', + 'messages.serverBusyTitle' => 'Strømmen er utilgjengelig', + 'messages.serverBusyBody' => 'Serveren fortsatte å nekte å strømme denne filen (HTTP 503). Den kan være i ferd med å starte på nytt eller være opptatt, eller lagringsstedet til filen kan være frakoblet. Prøv igjen om litt – hvis det fortsetter å skje, kan du be eieren av serveren om å kontrollere serveren og lagringsstedet til filen.', 'messages.logsUploaded' => 'Logger lastet opp', 'messages.logsUploadFailed' => 'Kunne ikke laste opp logger', 'messages.logId' => 'Logg-ID', + 'messages.burnedSubtitlesUseMenu' => 'Undertekstene er brent inn i denne strømmen. Endre dem fra undertekstmenyen.', + 'messages.noVideoUrl' => 'Ingen video-URL er tilgjengelig', + 'messages.playbackNoMediaSources' => 'Serveren returnerte ingen avspillbare mediekilder', + 'messages.playbackDataNotPrepared' => 'Avspillingen ble startet før dataene var klare', + 'messages.streamSelectionUnavailable' => 'Valg av strømmer er ikke tilgjengelig for denne kilden', + 'messages.streamSelectionFailed' => 'Kunne ikke bruke de valgte strømmene', + 'messages.serverUnavailableForProfile' => 'Ingen server er tilgjengelig for den aktive profilen', 'subtitlingStyling.text' => 'Tekst', 'subtitlingStyling.border' => 'Kantlinje', 'subtitlingStyling.background' => 'Bakgrunn', @@ -3271,6 +3413,8 @@ extension on TranslationsNb { 'subtitlingStyling.overrideStrip' => 'Fjern formatering', 'subtitlingStyling.positionTop' => 'Øverst', 'subtitlingStyling.positionBottom' => 'Nederst', + 'subtitlingStyling.anchorToScreen' => 'Forankre til skjermen', + 'subtitlingStyling.anchorToScreenDescription' => 'Vis tekstundertekster i de svarte feltene under video i bredformat', 'subtitlingStyling.bold' => 'Fet', 'subtitlingStyling.italic' => 'Kursiv', 'subtitlingStyling.renderResolution' => 'Gjengivelsesoppløsning', @@ -3353,6 +3497,7 @@ extension on TranslationsNb { 'profiles.pinExplain' => '4-sifret PIN kreves for å bytte profiler.', 'profiles.continueButton' => 'Fortsett', 'profiles.pinsDontMatch' => 'PIN-ene samsvarer ikke', + 'profiles.tokenIdentityMismatch' => 'Plex-profiltokenet ble knyttet til en uventet server', 'connections.sectionTitle' => 'Tilkoblinger', 'connections.addConnection' => 'Legg til tilkobling', 'connections.addConnectionSubtitleNoProfile' => 'Logg inn med Plex eller koble til en Jellyfin-server', @@ -3386,6 +3531,7 @@ extension on TranslationsNb { 'discover.tvShow' => 'TV-serie', 'discover.minutesLeft' => ({required Object minutes}) => '${minutes} min igjen', 'discover.moreLikeThis' => 'Mer som dette', + 'discover.titleCount' => ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('nb'))(n, one: '${n} tittel', other: '${n} titler', ), 'errors.searchFailed' => ({required Object error}) => 'Søk mislyktes: ${error}', 'errors.searchUnavailable' => 'Søket kunne ikke nå noen medieserver.', 'errors.connectionTimeout' => ({required Object context}) => 'Tidsavbrudd ved lasting av ${context}', @@ -3558,7 +3704,10 @@ extension on TranslationsNb { 'explore.characters' => 'Figurer', 'explore.addToWatchlist' => 'Legg til i ønskeliste', 'explore.removeFromWatchlist' => 'Fjern fra ønskeliste', + 'explore.addedToWatchlist' => 'Lagt til i overvåkningslisten', + 'explore.removedFromWatchlist' => 'Fjernet fra overvåkningslisten', 'explore.watchlistUpdateFailed' => 'Kunne ikke oppdatere ønskelisten', + 'explore.watchlistNoMatch' => 'Kunne ikke koble dette elementet til en overvåkningsliste', 'explore.notInLibrary' => 'Ikke i biblioteket ditt', 'explore.inTheseLibraries' => 'I disse bibliotekene', 'explore.checkingLibrary' => 'Sjekker biblioteket ditt...', @@ -3566,6 +3715,8 @@ extension on TranslationsNb { 'explore.emptyMessage' => ({required Object source}) => 'Rader fra ${source} vises her når de har innhold.', 'explore.searchHint' => ({required Object source}) => 'Søk i ${source}', 'explore.searchEmpty' => ({required Object query}) => 'Ingen treff for "${query}"', + _ => null, + } ?? switch (path) { 'explore.searchPrompt' => ({required Object source}) => 'Søk etter filmer og serier på ${source}.', 'explore.searchFailed' => 'Søk mislyktes. Sjekk tilkoblingen og prøv igjen.', 'explore.badge.rankPopular' => ({required Object n}) => '#${n} populær', @@ -3605,8 +3756,6 @@ extension on TranslationsNb { 'explore.stats.completed' => ({required Object n}) => '${n} fullførte', 'explore.stats.onHold' => ({required Object n}) => '${n} på pause', 'explore.stats.dropped' => ({required Object n}) => '${n} droppet', - _ => null, - } ?? switch (path) { 'explore.season.winter' => 'Vinter', 'explore.season.spring' => 'Vår', 'explore.season.summer' => 'Sommer', @@ -3703,6 +3852,9 @@ extension on TranslationsNb { 'liveTv.watchChannel' => 'Se kanal', 'liveTv.favorites' => 'Favoritter', 'liveTv.reorderFavorites' => 'Endre rekkefølge på favoritter', + 'liveTv.noFavoriteChannels' => 'Ingen favorittkanaler', + 'liveTv.noFavoriteChannelsHint' => 'Vis alle kanaler, og trykk deretter lenge på en kanal for å legge den til i favorittene dine.', + 'liveTv.showAllChannels' => 'Vis alle kanaler', 'liveTv.favoritesLoadFailed' => 'Kunne ikke laste inn favoritter. Kontroller tilkoblingen og prøv på nytt.', 'liveTv.favoritesUpdateFailed' => 'Kunne ikke oppdatere favorittene. Kontroller tilkoblingen og prøv på nytt.', 'liveTv.joinSession' => 'Bli med i pågående økt', @@ -3742,6 +3894,11 @@ extension on TranslationsNb { 'liveTv.guideReloadRequested' => 'Oppdatering av programguiden er forespurt', 'liveTv.rulesProcessRequested' => 'Ny vurdering av reglene er forespurt', 'liveTv.recordShow' => 'Ta opp program', + 'liveTv.startingInMinutes' => ({required Object minutes}) => 'Starter om ${minutes} min', + 'liveTv.dayAtTime' => ({required Object day, required Object time}) => '${day} kl. ${time}', + 'liveTv.invalidPlaybackData' => ({required Object product}) => '${product} returnerte ugyldige avspillingsdata for direkte-TV', + 'liveTv.failedToStartChannel' => 'Kunne ikke starte direktekanalen', + 'liveTv.failedToBuildStreamUrl' => 'Kunne ikke opprette strømme-URL-en', 'collections.title' => 'Samlinger', 'collections.collection' => 'Samling', 'collections.empty' => 'Samlingen er tom', @@ -3810,6 +3967,8 @@ extension on TranslationsNb { 'music.repeat' => 'Gjenta', 'music.repeatAll' => 'Gjenta alle', 'music.repeatOne' => 'Gjenta ett spor', + 'music.instantMixNoServer' => 'Ingen server er tilgjengelig for en hurtigmiks', + 'music.noAudioUrl' => ({required Object track}) => 'Ingen lyd-URL er tilgjengelig for ${track}', 'watchTogether.title' => 'Se sammen', 'watchTogether.description' => 'Se innhold synkronisert med venner og familie', 'watchTogether.createSession' => 'Opprett økt', @@ -3875,6 +4034,7 @@ extension on TranslationsNb { 'watchTogether.removeRoom' => 'Fjern', 'watchTogether.guestSwitchUnavailable' => 'Kunne ikke bytte — server ikke tilgjengelig for synkronisering', 'watchTogether.guestSwitchFailed' => 'Kunne ikke bytte — innhold ble ikke funnet på denne serveren', + 'watchTogether.defaultDisplayName' => 'Bruker', 'downloads.title' => 'Nedlastinger', 'downloads.manage' => 'Administrer', 'downloads.tvShows' => 'TV-serier', @@ -3975,6 +4135,16 @@ extension on TranslationsNb { 'downloads.backgroundWarning.statusUnknown' => 'Ikke sjekket ennå', 'downloads.backgroundWarning.settingsUnavailable' => 'Kunne ikke åpne systeminnstillingene på denne enheten', 'downloads.backgroundWarning.linkUnavailable' => 'Kunne ikke åpne dontkillmyapp.com på denne enheten', + 'downloads.unknownShow' => 'Ukjent serie', + 'downloads.unknownSeason' => 'Ukjent sesong', + 'downloads.unknownAlbum' => 'Ukjent album', + 'downloads.completedOfTotal' => ({required Object completed, required Object total}) => '${completed}/${total} fullført', + 'downloads.errorFileNotFound' => 'Filen ble ikke funnet (404)', + 'downloads.errorDownloadFailed' => 'Nedlastingen mislyktes', + 'downloads.errorPostProcessing' => ({required Object error}) => 'Etterbehandlingen mislyktes: ${error}', + 'downloads.notificationDownloading' => 'Laster ned...', + 'downloads.notificationComplete' => 'Nedlastingen er fullført', + 'downloads.notificationPaused' => 'Nedlastingen er satt på pause', 'shaders.title' => 'Shadere', 'shaders.noShaderDescription' => 'Ingen videoforbedring', 'shaders.nvscalerDescription' => 'NVIDIA bildeskalering for skarpere video', @@ -4054,14 +4224,24 @@ extension on TranslationsNb { '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', + 'companionRemote.closedBeforeAuth' => 'Tilkoblingen ble lukket før autentisering', 'videoSettings.playbackSpeed' => 'Avspillingshastighet', 'videoSettings.normalSpeed' => 'Normal', 'videoSettings.sleepTimerActive' => ({required Object duration}) => 'Aktiv (${duration})', 'videoSettings.zoom' => 'Zoom', + _ => null, + } ?? switch (path) { 'videoSettings.sleepTimer' => 'Innsovningstimer', 'videoSettings.audioSync' => 'Lydsynkronisering', 'videoSettings.subtitleSync' => 'Undertekstsynkronisering', 'videoSettings.hdr' => 'HDR', + 'videoSettings.hdrUnsupported' => 'HDR er ikke tilgjengelig her – denne skrivebordskompositoren eller videoutgangen kan ikke overføre HDR.', + 'videoSettings.hdrToneMapping' => 'HDR-tonekartlegging', + 'videoSettings.hdrToneMappingCompositor' => 'Kompositor', + 'videoSettings.hdrToneMappingCompositorDescription' => 'Send kildens HDR-metadata videre, og la skrivebordskompositoren utføre tonekartleggingen.', + 'videoSettings.hdrToneMappingPlayer' => 'Spiller', + 'videoSettings.hdrToneMappingPlayerDescription' => 'Tilpass til skjermens maksimale lysstyrke i spilleren, og send deretter resultatet til kompositoren.', + 'videoSettings.hdrToneMappingFailed' => 'Kunne ikke endre HDR-tonekartleggingen – den forrige modusen er fortsatt aktiv.', 'videoSettings.audioOutput' => 'Lydutgang', 'videoSettings.performanceOverlay' => 'Ytelsesoverlegg', 'videoSettings.audioOutputDolbyAtmos' => 'Dolby Atmos', @@ -4106,6 +4286,16 @@ extension on TranslationsNb { 'performanceOverlay.player' => 'Spiller', 'performanceOverlay.memory' => 'Minne', 'performanceOverlay.uiFps' => 'UI FPS', + 'performanceOverlay.fps' => 'FPS', + 'performanceOverlay.decoderAndroidHw' => 'Android-maskinvare', + 'performanceOverlay.decoderNvidiaHw' => 'NVIDIA-maskinvare', + 'performanceOverlay.decoderQualcommHw' => 'Qualcomm-maskinvare', + 'performanceOverlay.decoderMediatekHw' => 'MediaTek-maskinvare', + 'performanceOverlay.decoderExynosHw' => 'Exynos-maskinvare', + 'performanceOverlay.decoderSoftware' => 'Programvare', + 'performanceOverlay.decoderHardware' => 'Maskinvare', + 'performanceOverlay.tunnelingActive' => 'Aktiv', + 'performanceOverlay.dvRpuFailed' => ({required Object converted, required Object failures}) => '${converted} (${failures} mislyktes)', 'externalPlayer.title' => 'Ekstern spiller', 'externalPlayer.useExternalPlayer' => 'Bruk ekstern spiller', 'externalPlayer.useExternalPlayerDescription' => 'Åpne videoer i en annen app', @@ -4119,8 +4309,6 @@ extension on TranslationsNb { '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', @@ -4254,6 +4442,16 @@ extension on TranslationsNb { 'seerr.statusPartiallyAvailable' => 'Delvis tilgjengelig', 'seerr.statusRequested' => 'Forespurt', 'seerr.statusProcessing' => 'Behandler', + 'seerr.couldNotReach' => ({required Object url, required Object error}) => 'Kunne ikke nå ${url}: ${error}', + 'seerr.noInstanceAtUrl' => ({required Object url, required Object status}) => 'Ingen Seerr-instans på ${url} (HTTP ${status})', + 'seerr.notInitialized' => 'Denne Seerr-instansen har ikke fullført førstegangsoppsettet', + 'seerr.noPlexTokenForReauth' => 'Ingen Plex-token er tilgjengelig for å logge inn på nytt', + 'seerr.noStoredCredentials' => 'Ingen lagret påloggingsinformasjon er tilgjengelig for å logge inn på nytt', + 'seerr.signInRejected' => 'Innloggingen ble avvist', + 'seerr.noSessionCookie' => 'Seerr utstedte ingen øktinformasjonskapsel', + 'seerr.freshCookieRejected' => 'Seerr avviste den nye øktinformasjonskapselen', + 'seerr.noUserInformation' => 'Seerr returnerte ingen brukerinformasjon', + 'seerr.sessionRejectedAfterReauth' => 'Økten ble avvist etter ny innlogging', 'services.title' => 'Tjenester', 'services.hubSubtitle' => 'Synkroniser fremdrift og forespør nye titler.', 'services.notConnected' => 'Ikke tilkoblet', @@ -4269,6 +4467,7 @@ extension on TranslationsNb { 'services.names.seerr' => 'Seerr', 'services.names.mdblist' => 'MDBList', 'services.deviceCode.title' => ({required Object service}) => 'Aktiver Plezy på ${service}', + 'services.deviceCode.instructions' => 'Skann QR-koden, eller gå til adressen nedenfor og skriv inn denne koden:', 'services.deviceCode.openToActivate' => ({required Object service}) => 'Åpne ${service} for å aktivere', 'services.deviceCode.copyCode' => 'Kopier aktiveringskode', 'services.deviceCode.waitingForAuthorization' => 'Venter på godkjenning…', @@ -4318,6 +4517,24 @@ extension on TranslationsNb { 'addServer.connectToMediaBrowserCardSubtitleScoped' => ({required Object product, required Object name}) => 'Logg på ${product}-serveren din. Knyttes til ${name}.', 'addServer.borrowFromAnotherProfile' => 'Lån fra en annen profil', 'addServer.borrowFromAnotherProfileSubtitle' => 'Gjenbruk en annen profils tilkobling. PIN-beskyttede profiler krever PIN.', + 'addServer.invalidCredentials' => 'Ugyldig brukernavn eller passord', + 'addServer.authResponseNotJson' => 'Autentiseringssvaret var ikke gyldig JSON', + 'addServer.quickConnectRejected' => 'Quick Connect ble avvist av serveren', + 'addServer.quickConnectNotJson' => 'Quick Connect-svaret var ikke gyldig JSON', + 'addServer.quickConnectMissingFields' => 'Quick Connect-svaret mangler en kode eller hemmelighet', + 'addServer.quickConnectPollRejected' => 'Quick Connect-spørringen ble avvist av serveren', + 'addServer.serverTimedOut' => 'Serveren svarte ikke i tide', + 'addServer.responseNotJson' => 'Serversvaret var ikke gyldig JSON', + 'addServer.responseMissingIdentity' => ({required Object product}) => 'Svaret mangler en ID eller et servernavn – er dette en ${product}-server?', + 'addServer.probeFailed' => ({required Object error}) => 'Kunne ikke nå serveren: ${error}', + 'addServer.enterAtLeastOneUrl' => ({required Object product}) => 'Angi minst én URL til en ${product}-server', + 'addServer.noReachableServer' => ({required Object product}) => 'Fant ingen tilgjengelig ${product}-server', + 'addServer.urlsPointToDifferentServers' => ({required Object product}) => 'Disse URL-ene peker til forskjellige ${product}-servere', + 'addServer.urlDoesNotMatchServer' => ({required Object product}) => 'Denne URL-en samsvarer ikke med ${product}-serveren', + 'addServer.redirectUnsupported' => 'Serveren omdirigerte til en URL som ikke støttes', + 'addServer.redirectDifferentHost' => ({required Object product}) => 'Serveren omdirigerte til en annen vert. Angi den endelige ${product}-URL-en direkte.', + 'addServer.redirectInsecure' => 'Serveren omdirigerte fra HTTPS til en usikker URL', + 'addServer.redirectUnsupportedEnterFinal' => ({required Object product}) => 'Serveren omdirigerte til en URL som ikke støttes. Angi den endelige ${product}-URL-en direkte.', _ => null, }; } diff --git a/lib/i18n/strings_nl.g.dart b/lib/i18n/strings_nl.g.dart index 1c630dbe..1c273aa6 100644 --- a/lib/i18n/strings_nl.g.dart +++ b/lib/i18n/strings_nl.g.dart @@ -123,6 +123,7 @@ class _Translations$auth$nl extends Translations$auth$en { @override String get quickConnectCancel => 'Annuleren'; @override String get quickConnectExpired => 'Quick Connect is verlopen. Probeer opnieuw.'; @override String get localDataRecoveryRequired => 'Plezy kon lokale aanmeldings- en openstaande afspeelgegevens niet veilig herstellen. Meld je opnieuw aan.'; + @override String get pinCheckRejected => 'De controle van de Plex-pincode is geweigerd'; } // Path: common @@ -178,6 +179,9 @@ class _Translations$common$nl extends Translations$common$en { @override String get exitFullscreen => 'Volledig scherm verlaten'; @override String get pressBackAgainToExit => 'Druk nogmaals op terug om af te sluiten'; @override late final _Translations$common$ratingSource$nl ratingSource = _Translations$common$ratingSource$nl._(_root); + @override String get notAvailable => 'N/A'; + @override String get url => 'URL'; + @override String get letterKeys => 'ABC'; } // Path: screens @@ -444,6 +448,8 @@ class _Translations$settings$nl extends Translations$settings$en { @override String get showNavBarLabels => 'Labels op navigatiebalk tonen'; @override String get showNavBarLabelsDescription => 'Tekstlabels onder de pictogrammen op de navigatiebalk weergeven'; @override String get startupSection => 'Opstartsectie'; + @override String get showExploreTab => 'Tabblad Ontdekken tonen'; + @override String get showExploreTabDescription => 'Toon het tabblad Ontdekken met content uit Plex Discover en gekoppelde trackers'; @override String get liveTvDefaultFavorites => 'Standaard favoriete zenders'; @override String get liveTvDefaultFavoritesDescription => 'Toon alleen favoriete zenders bij het openen van Live TV'; @override String get display => 'Weergave'; @@ -455,6 +461,7 @@ class _Translations$settings$nl extends Translations$settings$en { @override String get subtitlesAndConfig => 'Ondertitels en instellingen'; @override String get seekAndTiming => 'Spoelen en timing'; @override String get behavior => 'Gedrag'; + @override String get exportDialogTitle => 'Plezy-instellingen exporteren'; } // Path: search @@ -606,6 +613,8 @@ class _Translations$fileInfo$nl extends Translations$fileInfo$en { @override String get flagHearingImpaired => 'Slechthorend'; @override String get flagDub => 'Nasynchronisatie'; @override String get flagOriginal => 'Origineel'; + @override String get channelsMono => 'Mono'; + @override String dolbyVisionProfile({required Object profile}) => 'Profiel ${profile}'; } // Path: mediaMenu @@ -704,6 +713,11 @@ class _Translations$accessibility$nl extends Translations$accessibility$en { @override String get alphabetScrollHint => 'Veeg omhoog of omlaag om per letter te bewegen'; @override String rowColumnPosition({required Object row, required Object rowCount, required Object column, required Object columnCount}) => 'Rij ${row} van ${rowCount}, kolom ${column} van ${columnCount}'; @override String rowPosition({required Object row, required Object rowCount}) => 'Rij ${row} van ${rowCount}'; + @override String get autoScrollPlay => 'Automatisch scrollen starten'; + @override String get autoScrollPause => 'Automatisch scrollen pauzeren'; + @override String get hueShort => 'H'; + @override String get saturationShort => 'S'; + @override String get valueShort => 'V'; } // Path: tooltips @@ -815,6 +829,15 @@ class _Translations$videoControls$nl extends Translations$videoControls$en { @override String get subtitleDownloadedNotApplied => 'De ondertiteling is gedownload, maar kon niet worden geselecteerd'; @override String get subtitleDownloadFailed => 'Ondertitel downloaden mislukt'; @override String get searchLanguages => 'Talen zoeken...'; + @override String get skipIntro => 'Intro overslaan'; + @override String get skipCredits => 'Aftiteling overslaan'; + @override String get nextEpisode => 'Volgende aflevering'; + @override String subtitleTrack({required Object n}) => 'Spoor ${n}'; + @override String subtitleFile({required Object name}) => 'Ondertitel ${name}'; + @override String forcedTrack({required Object label}) => '${label} (Geforceerd)'; + @override String get osdSubtitlesOff => 'Ondertitels: uit'; + @override String osdSubtitles({required Object track}) => 'Ondertitels: ${track}'; + @override String osdAudio({required Object track}) => 'Audio: ${track}'; } // Path: messages @@ -876,9 +899,18 @@ class _Translations$messages$nl extends Translations$messages$en { @override String get serverLimitBody => 'Serverfout (HTTP 500). Waarschijnlijk weigerde een bandbreedte-/transcodeerlimiet deze sessie. Vraag de eigenaar dit aan te passen.'; @override String get mediaUnreadableTitle => 'Bestand niet beschikbaar'; @override String get mediaUnreadableBody => 'De server heeft dit item gevonden maar kon het bestand niet lezen (HTTP 404). Het bestand is waarschijnlijk verplaatst of verwijderd, of de opslag is offline. Vraag de serverbeheerder om het bestand te controleren en de bibliotheek opnieuw te scannen.'; + @override String get serverBusyTitle => 'Stream niet beschikbaar'; + @override String get serverBusyBody => 'De server bleef weigeren dit bestand te streamen (HTTP 503). Mogelijk wordt de server opnieuw opgestart, is deze bezet of is de opslag van het bestand offline. Probeer het over een moment opnieuw — als dit blijft gebeuren, vraag dan de servereigenaar om de server en de opslag van het bestand te controleren.'; @override String get logsUploaded => 'Logbestanden geüpload'; @override String get logsUploadFailed => 'Uploaden van logbestanden mislukt'; @override String get logId => 'Logboek-ID'; + @override String get burnedSubtitlesUseMenu => 'De ondertitels zijn in deze stream ingebrand. Wijzig ze via het ondertitelmenu.'; + @override String get noVideoUrl => 'Geen video-URL beschikbaar'; + @override String get playbackNoMediaSources => 'De server heeft geen afspeelbare mediabronnen geretourneerd'; + @override String get playbackDataNotPrepared => 'Het afspelen is gestart voordat de gegevens gereed waren'; + @override String get streamSelectionUnavailable => 'Streamselectie is niet beschikbaar voor deze bron'; + @override String get streamSelectionFailed => 'Kon de geselecteerde streams niet toepassen'; + @override String get serverUnavailableForProfile => 'Er is geen server beschikbaar voor het actieve profiel'; } // Path: subtitlingStyling @@ -904,6 +936,8 @@ class _Translations$subtitlingStyling$nl extends Translations$subtitlingStyling$ @override String get overrideStrip => 'Opmaak verwijderen'; @override String get positionTop => 'Bovenaan'; @override String get positionBottom => 'Onderaan'; + @override String get anchorToScreen => 'Aan scherm verankeren'; + @override String get anchorToScreenDescription => 'Toon tekstondertitels in de zwarte balken onder breedbeeldvideo'; @override String get bold => 'Vet'; @override String get italic => 'Cursief'; @override String get renderResolution => 'Renderresolutie'; @@ -1013,6 +1047,7 @@ class _Translations$profiles$nl extends Translations$profiles$en { @override String get pinExplain => 'Een viercijferige pincode is vereist om van profiel te wisselen.'; @override String get continueButton => 'Doorgaan'; @override String get pinsDontMatch => 'De pincodes komen niet overeen'; + @override String get tokenIdentityMismatch => 'Het token van het Plex-profiel bleek bij een onverwachte server te horen'; } // Path: connections @@ -1064,6 +1099,10 @@ class _Translations$discover$nl extends Translations$discover$en { @override String get tvShow => 'Tv-serie'; @override String minutesLeft({required Object minutes}) => 'nog ${minutes} min'; @override String get moreLikeThis => 'Meer zoals dit'; + @override String titleCount({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('nl'))(n, + one: '${n} titel', + other: '${n} titels', + ); } // Path: errors @@ -1276,7 +1315,10 @@ class _Translations$explore$nl extends Translations$explore$en { @override String get characters => 'Personages'; @override String get addToWatchlist => 'Toevoegen aan kijklijst'; @override String get removeFromWatchlist => 'Verwijderen uit kijklijst'; + @override String get addedToWatchlist => 'Aan kijklijst toegevoegd'; + @override String get removedFromWatchlist => 'Uit kijklijst verwijderd'; @override String get watchlistUpdateFailed => 'Kon kijklijst niet bijwerken'; + @override String get watchlistNoMatch => 'Kon dit item niet aan een kijklijst koppelen'; @override String get notInLibrary => 'Niet in je bibliotheek'; @override String get inTheseLibraries => 'In deze bibliotheken'; @override String get checkingLibrary => 'Je bibliotheek controleren...'; @@ -1337,6 +1379,9 @@ class _Translations$liveTv$nl extends Translations$liveTv$en { @override String get watchChannel => 'Kanaal bekijken'; @override String get favorites => 'Favorieten'; @override String get reorderFavorites => 'Favorieten herordenen'; + @override String get noFavoriteChannels => 'Geen favoriete zenders'; + @override String get noFavoriteChannelsHint => 'Toon alle zenders en houd daarna een zender ingedrukt om deze aan je favorieten toe te voegen.'; + @override String get showAllChannels => 'Alle zenders tonen'; @override String get favoritesLoadFailed => 'Favorieten konden niet worden geladen. Controleer je verbinding en probeer het opnieuw.'; @override String get favoritesUpdateFailed => 'Favorieten konden niet worden bijgewerkt. Controleer je verbinding en probeer het opnieuw.'; @override String get joinSession => 'Deelnemen aan lopende sessie'; @@ -1376,6 +1421,11 @@ class _Translations$liveTv$nl extends Translations$liveTv$en { @override String get guideReloadRequested => 'Vernieuwing van de gids aangevraagd'; @override String get rulesProcessRequested => 'Nieuwe evaluatie van regels aangevraagd'; @override String get recordShow => 'Programma opnemen'; + @override String startingInMinutes({required Object minutes}) => 'Begint over ${minutes} min'; + @override String dayAtTime({required Object day, required Object time}) => '${day} om ${time}'; + @override String invalidPlaybackData({required Object product}) => '${product} heeft ongeldige afspeelgegevens voor Live-tv geretourneerd'; + @override String get failedToStartChannel => 'Kon de livezender niet starten'; + @override String get failedToBuildStreamUrl => 'Kon de stream-URL niet samenstellen'; } // Path: collections @@ -1474,6 +1524,8 @@ class _Translations$music$nl extends Translations$music$en { @override String get repeat => 'Herhalen'; @override String get repeatAll => 'Alles herhalen'; @override String get repeatOne => 'Eén herhalen'; + @override String get instantMixNoServer => 'Er is geen server beschikbaar voor een instantmix'; + @override String noAudioUrl({required Object track}) => 'Er is geen audio-URL beschikbaar voor ${track}'; } // Path: watchTogether @@ -1548,6 +1600,7 @@ class _Translations$watchTogether$nl extends Translations$watchTogether$en { @override String get removeRoom => 'Verwijderen'; @override String get guestSwitchUnavailable => 'Kon niet schakelen — server niet beschikbaar voor synchronisatie'; @override String get guestSwitchFailed => 'Kon niet schakelen — inhoud niet gevonden op deze server'; + @override String get defaultDisplayName => 'Gebruiker'; } // Path: downloads @@ -1632,6 +1685,16 @@ class _Translations$downloads$nl extends Translations$downloads$en { @override String get syncRuleUnknownServer => 'Onbekende server'; @override String get syncRuleListCreated => 'Synchronisatieregel aangemaakt'; @override late final _Translations$downloads$backgroundWarning$nl backgroundWarning = _Translations$downloads$backgroundWarning$nl._(_root); + @override String get unknownShow => 'Onbekende serie'; + @override String get unknownSeason => 'Onbekend seizoen'; + @override String get unknownAlbum => 'Onbekend album'; + @override String completedOfTotal({required Object completed, required Object total}) => '${completed}/${total} voltooid'; + @override String get errorFileNotFound => 'Bestand niet gevonden (404)'; + @override String get errorDownloadFailed => 'Download mislukt'; + @override String errorPostProcessing({required Object error}) => 'Nabewerking mislukt: ${error}'; + @override String get notificationDownloading => 'Downloaden...'; + @override String get notificationComplete => 'Download voltooid'; + @override String get notificationPaused => 'Download gepauzeerd'; } // Path: shaders @@ -1672,6 +1735,7 @@ class _Translations$companionRemote$nl extends Translations$companionRemote$en { @override late final _Translations$companionRemote$pairing$nl pairing = _Translations$companionRemote$pairing$nl._(_root); @override late final _Translations$companionRemote$remote$nl remote = _Translations$companionRemote$remote$nl._(_root); @override late final _Translations$companionRemote$errors$nl errors = _Translations$companionRemote$errors$nl._(_root); + @override String get closedBeforeAuth => 'De verbinding is vóór de authenticatie gesloten'; } // Path: videoSettings @@ -1689,6 +1753,13 @@ class _Translations$videoSettings$nl extends Translations$videoSettings$en { @override String get audioSync => 'Audiosynchronisatie'; @override String get subtitleSync => 'Ondertitelsynchronisatie'; @override String get hdr => 'HDR'; + @override String get hdrUnsupported => 'HDR is hier niet beschikbaar — deze desktopcompositor of video-uitvoer kan HDR niet doorgeven.'; + @override String get hdrToneMapping => 'HDR-tonemapping'; + @override String get hdrToneMappingCompositor => 'Compositor'; + @override String get hdrToneMappingCompositorDescription => 'Geef de HDR-metadata van de bron ongewijzigd door en laat de desktopcompositor de mapping uitvoeren.'; + @override String get hdrToneMappingPlayer => 'Speler'; + @override String get hdrToneMappingPlayerDescription => 'Laat de speler de mapping naar de piekhelderheid van het scherm uitvoeren en geef het resultaat vervolgens door aan de compositor.'; + @override String get hdrToneMappingFailed => 'Kon HDR-tonemapping niet wijzigen — de vorige modus is nog actief.'; @override String get audioOutput => 'Audio-uitvoer'; @override String get performanceOverlay => 'Prestatie-overlay'; @override String get audioOutputDolbyAtmos => 'Dolby Atmos'; @@ -1742,6 +1813,16 @@ class _Translations$performanceOverlay$nl extends Translations$performanceOverla @override String get player => 'Speler'; @override String get memory => 'Geheugen'; @override String get uiFps => 'UI FPS'; + @override String get fps => 'FPS'; + @override String get decoderAndroidHw => 'Android HW'; + @override String get decoderNvidiaHw => 'NVIDIA HW'; + @override String get decoderQualcommHw => 'Qualcomm HW'; + @override String get decoderMediatekHw => 'MediaTek HW'; + @override String get decoderExynosHw => 'Exynos HW'; + @override String get decoderSoftware => 'Software'; + @override String get decoderHardware => 'Hardware'; + @override String get tunnelingActive => 'Actief'; + @override String dvRpuFailed({required Object converted, required Object failures}) => '${converted} (${failures} mislukt)'; } // Path: externalPlayer @@ -1942,6 +2023,16 @@ class _Translations$seerr$nl extends Translations$seerr$en { @override String get statusPartiallyAvailable => 'Gedeeltelijk beschikbaar'; @override String get statusRequested => 'Aangevraagd'; @override String get statusProcessing => 'Verwerken'; + @override String couldNotReach({required Object url, required Object error}) => 'Kon ${url} niet bereiken: ${error}'; + @override String noInstanceAtUrl({required Object url, required Object status}) => 'Geen Seerr-instantie op ${url} (HTTP ${status})'; + @override String get notInitialized => 'De eerste configuratie van deze Seerr-instantie is niet voltooid'; + @override String get noPlexTokenForReauth => 'Er is geen Plex-token beschikbaar om opnieuw in te loggen'; + @override String get noStoredCredentials => 'Er zijn geen opgeslagen inloggegevens beschikbaar om opnieuw in te loggen'; + @override String get signInRejected => 'Inloggen is geweigerd'; + @override String get noSessionCookie => 'Seerr heeft geen sessiecookie verstrekt'; + @override String get freshCookieRejected => 'Seerr heeft de nieuwe sessiecookie geweigerd'; + @override String get noUserInformation => 'Seerr heeft geen gebruikersgegevens geretourneerd'; + @override String get sessionRejectedAfterReauth => 'De sessie is na het opnieuw inloggen geweigerd'; } // Path: services @@ -2002,6 +2093,24 @@ class _Translations$addServer$nl extends Translations$addServer$en { @override String connectToMediaBrowserCardSubtitleScoped({required Object product, required Object name}) => 'Meld je aan bij je ${product}-server. Wordt gekoppeld aan ${name}.'; @override String get borrowFromAnotherProfile => 'Van een ander profiel lenen'; @override String get borrowFromAnotherProfileSubtitle => 'Hergebruik de verbinding van een ander profiel. Voor profielen met pincodebeveiliging is een pincode vereist.'; + @override String get invalidCredentials => 'Ongeldige gebruikersnaam of ongeldig wachtwoord'; + @override String get authResponseNotJson => 'Het authenticatieantwoord was geen geldige JSON'; + @override String get quickConnectRejected => 'Quick Connect is door de server geweigerd'; + @override String get quickConnectNotJson => 'Het Quick Connect-antwoord was geen geldige JSON'; + @override String get quickConnectMissingFields => 'In het Quick Connect-antwoord ontbreekt een code of geheim'; + @override String get quickConnectPollRejected => 'Quick Connect-polling is door de server geweigerd'; + @override String get serverTimedOut => 'De server heeft niet op tijd gereageerd'; + @override String get responseNotJson => 'Het serverantwoord was geen geldige JSON'; + @override String responseMissingIdentity({required Object product}) => 'In het antwoord ontbreekt een ID of servernaam — is dit een ${product}-server?'; + @override String probeFailed({required Object error}) => 'Kon de server niet bereiken: ${error}'; + @override String enterAtLeastOneUrl({required Object product}) => 'Voer ten minste één URL van een ${product}-server in'; + @override String noReachableServer({required Object product}) => 'Er is geen bereikbare ${product}-server gevonden'; + @override String urlsPointToDifferentServers({required Object product}) => 'Deze URL\'s verwijzen naar verschillende ${product}-servers'; + @override String urlDoesNotMatchServer({required Object product}) => 'Deze URL komt niet overeen met de ${product}-server'; + @override String get redirectUnsupported => 'De server heeft doorgestuurd naar een niet-ondersteunde URL'; + @override String redirectDifferentHost({required Object product}) => 'De server heeft doorgestuurd naar een andere host. Voer de uiteindelijke ${product}-URL rechtstreeks in.'; + @override String get redirectInsecure => 'De server heeft van HTTPS doorgestuurd naar een onbeveiligde URL'; + @override String redirectUnsupportedEnterFinal({required Object product}) => 'De server heeft doorgestuurd naar een niet-ondersteunde URL. Voer de uiteindelijke ${product}-URL rechtstreeks in.'; } // Path: common.ratingSource @@ -2521,6 +2630,7 @@ class _Translations$services$deviceCode$nl extends Translations$services$deviceC // Translations @override String title({required Object service}) => 'Plezy activeren op ${service}'; + @override String get instructions => 'Scan de QR-code of ga naar het onderstaande adres en voer deze code in:'; @override String openToActivate({required Object service}) => 'Open ${service} om te activeren'; @override String get copyCode => 'Activeringscode kopiëren'; @override String get waitingForAuthorization => 'Wachten op autorisatie…'; @@ -2595,6 +2705,7 @@ extension on TranslationsNl { 'auth.quickConnectCancel' => 'Annuleren', 'auth.quickConnectExpired' => 'Quick Connect is verlopen. Probeer opnieuw.', 'auth.localDataRecoveryRequired' => 'Plezy kon lokale aanmeldings- en openstaande afspeelgegevens niet veilig herstellen. Meld je opnieuw aan.', + 'auth.pinCheckRejected' => 'De controle van de Plex-pincode is geweigerd', 'common.cancel' => 'Annuleren', 'common.save' => 'Opslaan', 'common.close' => 'Sluiten', @@ -2651,6 +2762,9 @@ extension on TranslationsNl { 'common.ratingSource.trakt' => 'Trakt', 'common.ratingSource.rottenTomatoesCritic' => 'Rotten Tomatoes-critici', 'common.ratingSource.rottenTomatoesAudience' => 'Rotten Tomatoes-publiek', + 'common.notAvailable' => 'N/A', + 'common.url' => 'URL', + 'common.letterKeys' => 'ABC', 'screens.licenses' => 'Licenties', 'screens.switchProfile' => 'Wissel van profiel', 'screens.subtitleStyling' => 'Ondertitelopmaak', @@ -2890,6 +3004,8 @@ extension on TranslationsNl { 'settings.showNavBarLabels' => 'Labels op navigatiebalk tonen', 'settings.showNavBarLabelsDescription' => 'Tekstlabels onder de pictogrammen op de navigatiebalk weergeven', 'settings.startupSection' => 'Opstartsectie', + 'settings.showExploreTab' => 'Tabblad Ontdekken tonen', + 'settings.showExploreTabDescription' => 'Toon het tabblad Ontdekken met content uit Plex Discover en gekoppelde trackers', 'settings.liveTvDefaultFavorites' => 'Standaard favoriete zenders', 'settings.liveTvDefaultFavoritesDescription' => 'Toon alleen favoriete zenders bij het openen van Live TV', 'settings.display' => 'Weergave', @@ -2901,6 +3017,7 @@ extension on TranslationsNl { 'settings.subtitlesAndConfig' => 'Ondertitels en instellingen', 'settings.seekAndTiming' => 'Spoelen en timing', 'settings.behavior' => 'Gedrag', + 'settings.exportDialogTitle' => 'Plezy-instellingen exporteren', 'search.hint' => 'Zoek films, series, muziek...', 'search.tryDifferentTerm' => 'Probeer een andere zoekterm', 'search.searchYourMedia' => 'Zoek in je media', @@ -3049,6 +3166,8 @@ extension on TranslationsNl { 'fileInfo.flagHearingImpaired' => 'Slechthorend', 'fileInfo.flagDub' => 'Nasynchronisatie', 'fileInfo.flagOriginal' => 'Origineel', + 'fileInfo.channelsMono' => 'Mono', + 'fileInfo.dolbyVisionProfile' => ({required Object profile}) => 'Profiel ${profile}', 'mediaMenu.markAsWatched' => 'Als bekeken markeren', 'mediaMenu.markAsUnwatched' => 'Als ongekeken markeren', 'mediaMenu.removeFromContinueWatching' => 'Uit \'Doorgaan met kijken\' verwijderen', @@ -3082,6 +3201,8 @@ extension on TranslationsNl { 'mediaMenu.rate' => 'Beoordelen', 'mediaMenu.playFromBeginning' => 'Afspelen vanaf het begin', 'mediaMenu.playVersion' => 'Versie afspelen...', + _ => null, + } ?? switch (path) { 'rateSheet.title' => 'Beoordelen', 'rateSheet.server' => 'Server', 'rateSheet.favorite' => 'Favoriet', @@ -3091,8 +3212,6 @@ extension on TranslationsNl { 'rateSheet.noConnectedServices' => 'Koppel een dienst in Instellingen om daar een beoordeling te geven.', 'accessibility.mediaCardMovie' => ({required Object title}) => '${title}, film', 'accessibility.mediaCardShow' => ({required Object title}) => '${title}, tv-serie', - _ => null, - } ?? switch (path) { 'accessibility.mediaCardEpisode' => ({required Object title, required Object episodeInfo}) => '${title}, ${episodeInfo}', 'accessibility.mediaCardSeason' => ({required Object title, required Object seasonInfo}) => '${title}, ${seasonInfo}', 'accessibility.mediaCardWatched' => 'bekeken', @@ -3113,6 +3232,11 @@ extension on TranslationsNl { 'accessibility.alphabetScrollHint' => 'Veeg omhoog of omlaag om per letter te bewegen', 'accessibility.rowColumnPosition' => ({required Object row, required Object rowCount, required Object column, required Object columnCount}) => 'Rij ${row} van ${rowCount}, kolom ${column} van ${columnCount}', 'accessibility.rowPosition' => ({required Object row, required Object rowCount}) => 'Rij ${row} van ${rowCount}', + 'accessibility.autoScrollPlay' => 'Automatisch scrollen starten', + 'accessibility.autoScrollPause' => 'Automatisch scrollen pauzeren', + 'accessibility.hueShort' => 'H', + 'accessibility.saturationShort' => 'S', + 'accessibility.valueShort' => 'V', 'tooltips.shufflePlay' => 'Willekeurig afspelen', 'tooltips.playTrailer' => 'Trailer afspelen', 'tooltips.markAsWatched' => 'Als bekeken markeren', @@ -3203,6 +3327,15 @@ extension on TranslationsNl { 'videoControls.subtitleDownloadedNotApplied' => 'De ondertiteling is gedownload, maar kon niet worden geselecteerd', 'videoControls.subtitleDownloadFailed' => 'Ondertitel downloaden mislukt', 'videoControls.searchLanguages' => 'Talen zoeken...', + 'videoControls.skipIntro' => 'Intro overslaan', + 'videoControls.skipCredits' => 'Aftiteling overslaan', + 'videoControls.nextEpisode' => 'Volgende aflevering', + 'videoControls.subtitleTrack' => ({required Object n}) => 'Spoor ${n}', + 'videoControls.subtitleFile' => ({required Object name}) => 'Ondertitel ${name}', + 'videoControls.forcedTrack' => ({required Object label}) => '${label} (Geforceerd)', + 'videoControls.osdSubtitlesOff' => 'Ondertitels: uit', + 'videoControls.osdSubtitles' => ({required Object track}) => 'Ondertitels: ${track}', + 'videoControls.osdAudio' => ({required Object track}) => 'Audio: ${track}', 'messages.markedAsWatched' => 'Gemarkeerd als gekeken', 'messages.markedAsUnwatched' => 'Gemarkeerd als ongekeken', 'messages.markedAsWatchedOffline' => 'Gemarkeerd als bekeken (wordt gesynchroniseerd zodra je online bent)', @@ -3252,9 +3385,18 @@ extension on TranslationsNl { 'messages.serverLimitBody' => 'Serverfout (HTTP 500). Waarschijnlijk weigerde een bandbreedte-/transcodeerlimiet deze sessie. Vraag de eigenaar dit aan te passen.', 'messages.mediaUnreadableTitle' => 'Bestand niet beschikbaar', 'messages.mediaUnreadableBody' => 'De server heeft dit item gevonden maar kon het bestand niet lezen (HTTP 404). Het bestand is waarschijnlijk verplaatst of verwijderd, of de opslag is offline. Vraag de serverbeheerder om het bestand te controleren en de bibliotheek opnieuw te scannen.', + 'messages.serverBusyTitle' => 'Stream niet beschikbaar', + 'messages.serverBusyBody' => 'De server bleef weigeren dit bestand te streamen (HTTP 503). Mogelijk wordt de server opnieuw opgestart, is deze bezet of is de opslag van het bestand offline. Probeer het over een moment opnieuw — als dit blijft gebeuren, vraag dan de servereigenaar om de server en de opslag van het bestand te controleren.', 'messages.logsUploaded' => 'Logbestanden geüpload', 'messages.logsUploadFailed' => 'Uploaden van logbestanden mislukt', 'messages.logId' => 'Logboek-ID', + 'messages.burnedSubtitlesUseMenu' => 'De ondertitels zijn in deze stream ingebrand. Wijzig ze via het ondertitelmenu.', + 'messages.noVideoUrl' => 'Geen video-URL beschikbaar', + 'messages.playbackNoMediaSources' => 'De server heeft geen afspeelbare mediabronnen geretourneerd', + 'messages.playbackDataNotPrepared' => 'Het afspelen is gestart voordat de gegevens gereed waren', + 'messages.streamSelectionUnavailable' => 'Streamselectie is niet beschikbaar voor deze bron', + 'messages.streamSelectionFailed' => 'Kon de geselecteerde streams niet toepassen', + 'messages.serverUnavailableForProfile' => 'Er is geen server beschikbaar voor het actieve profiel', 'subtitlingStyling.text' => 'Tekst', 'subtitlingStyling.border' => 'Rand', 'subtitlingStyling.background' => 'Achtergrond', @@ -3271,6 +3413,8 @@ extension on TranslationsNl { 'subtitlingStyling.overrideStrip' => 'Opmaak verwijderen', 'subtitlingStyling.positionTop' => 'Bovenaan', 'subtitlingStyling.positionBottom' => 'Onderaan', + 'subtitlingStyling.anchorToScreen' => 'Aan scherm verankeren', + 'subtitlingStyling.anchorToScreenDescription' => 'Toon tekstondertitels in de zwarte balken onder breedbeeldvideo', 'subtitlingStyling.bold' => 'Vet', 'subtitlingStyling.italic' => 'Cursief', 'subtitlingStyling.renderResolution' => 'Renderresolutie', @@ -3353,6 +3497,7 @@ extension on TranslationsNl { 'profiles.pinExplain' => 'Een viercijferige pincode is vereist om van profiel te wisselen.', 'profiles.continueButton' => 'Doorgaan', 'profiles.pinsDontMatch' => 'De pincodes komen niet overeen', + 'profiles.tokenIdentityMismatch' => 'Het token van het Plex-profiel bleek bij een onverwachte server te horen', 'connections.sectionTitle' => 'Verbindingen', 'connections.addConnection' => 'Verbinding toevoegen', 'connections.addConnectionSubtitleNoProfile' => 'Meld je aan met Plex of verbind een Jellyfin-server', @@ -3386,6 +3531,7 @@ extension on TranslationsNl { 'discover.tvShow' => 'Tv-serie', 'discover.minutesLeft' => ({required Object minutes}) => 'nog ${minutes} min', 'discover.moreLikeThis' => 'Meer zoals dit', + 'discover.titleCount' => ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('nl'))(n, one: '${n} titel', other: '${n} titels', ), 'errors.searchFailed' => ({required Object error}) => 'Zoeken mislukt: ${error}', 'errors.searchUnavailable' => 'Zoeken kon geen enkele mediaserver bereiken.', 'errors.connectionTimeout' => ({required Object context}) => 'Time-out van verbinding tijdens het laden van ${context}', @@ -3558,7 +3704,10 @@ extension on TranslationsNl { 'explore.characters' => 'Personages', 'explore.addToWatchlist' => 'Toevoegen aan kijklijst', 'explore.removeFromWatchlist' => 'Verwijderen uit kijklijst', + 'explore.addedToWatchlist' => 'Aan kijklijst toegevoegd', + 'explore.removedFromWatchlist' => 'Uit kijklijst verwijderd', 'explore.watchlistUpdateFailed' => 'Kon kijklijst niet bijwerken', + 'explore.watchlistNoMatch' => 'Kon dit item niet aan een kijklijst koppelen', 'explore.notInLibrary' => 'Niet in je bibliotheek', 'explore.inTheseLibraries' => 'In deze bibliotheken', 'explore.checkingLibrary' => 'Je bibliotheek controleren...', @@ -3566,6 +3715,8 @@ extension on TranslationsNl { 'explore.emptyMessage' => ({required Object source}) => 'Rijen van ${source} verschijnen hier zodra ze inhoud hebben.', 'explore.searchHint' => ({required Object source}) => 'Zoeken in ${source}', 'explore.searchEmpty' => ({required Object query}) => 'Geen resultaten voor "${query}"', + _ => null, + } ?? switch (path) { 'explore.searchPrompt' => ({required Object source}) => 'Zoek naar films en series op ${source}.', 'explore.searchFailed' => 'Zoeken mislukt. Controleer je verbinding en probeer opnieuw.', 'explore.badge.rankPopular' => ({required Object n}) => '#${n} populair', @@ -3605,8 +3756,6 @@ extension on TranslationsNl { 'explore.stats.completed' => ({required Object n}) => '${n} afgerond', 'explore.stats.onHold' => ({required Object n}) => '${n} op pauze', 'explore.stats.dropped' => ({required Object n}) => '${n} gestopt', - _ => null, - } ?? switch (path) { 'explore.season.winter' => 'Winter', 'explore.season.spring' => 'Lente', 'explore.season.summer' => 'Zomer', @@ -3703,6 +3852,9 @@ extension on TranslationsNl { 'liveTv.watchChannel' => 'Kanaal bekijken', 'liveTv.favorites' => 'Favorieten', 'liveTv.reorderFavorites' => 'Favorieten herordenen', + 'liveTv.noFavoriteChannels' => 'Geen favoriete zenders', + 'liveTv.noFavoriteChannelsHint' => 'Toon alle zenders en houd daarna een zender ingedrukt om deze aan je favorieten toe te voegen.', + 'liveTv.showAllChannels' => 'Alle zenders tonen', 'liveTv.favoritesLoadFailed' => 'Favorieten konden niet worden geladen. Controleer je verbinding en probeer het opnieuw.', 'liveTv.favoritesUpdateFailed' => 'Favorieten konden niet worden bijgewerkt. Controleer je verbinding en probeer het opnieuw.', 'liveTv.joinSession' => 'Deelnemen aan lopende sessie', @@ -3742,6 +3894,11 @@ extension on TranslationsNl { 'liveTv.guideReloadRequested' => 'Vernieuwing van de gids aangevraagd', 'liveTv.rulesProcessRequested' => 'Nieuwe evaluatie van regels aangevraagd', 'liveTv.recordShow' => 'Programma opnemen', + 'liveTv.startingInMinutes' => ({required Object minutes}) => 'Begint over ${minutes} min', + 'liveTv.dayAtTime' => ({required Object day, required Object time}) => '${day} om ${time}', + 'liveTv.invalidPlaybackData' => ({required Object product}) => '${product} heeft ongeldige afspeelgegevens voor Live-tv geretourneerd', + 'liveTv.failedToStartChannel' => 'Kon de livezender niet starten', + 'liveTv.failedToBuildStreamUrl' => 'Kon de stream-URL niet samenstellen', 'collections.title' => 'Collecties', 'collections.collection' => 'Collectie', 'collections.empty' => 'Collectie is leeg', @@ -3810,6 +3967,8 @@ extension on TranslationsNl { 'music.repeat' => 'Herhalen', 'music.repeatAll' => 'Alles herhalen', 'music.repeatOne' => 'Eén herhalen', + 'music.instantMixNoServer' => 'Er is geen server beschikbaar voor een instantmix', + 'music.noAudioUrl' => ({required Object track}) => 'Er is geen audio-URL beschikbaar voor ${track}', 'watchTogether.title' => 'Samen kijken', 'watchTogether.description' => 'Kijk synchroon met vrienden en familie', 'watchTogether.createSession' => 'Sessie maken', @@ -3875,6 +4034,7 @@ extension on TranslationsNl { 'watchTogether.removeRoom' => 'Verwijderen', 'watchTogether.guestSwitchUnavailable' => 'Kon niet schakelen — server niet beschikbaar voor synchronisatie', 'watchTogether.guestSwitchFailed' => 'Kon niet schakelen — inhoud niet gevonden op deze server', + 'watchTogether.defaultDisplayName' => 'Gebruiker', 'downloads.title' => 'Downloads', 'downloads.manage' => 'Beheren', 'downloads.tvShows' => 'Series', @@ -3975,6 +4135,16 @@ extension on TranslationsNl { 'downloads.backgroundWarning.statusUnknown' => 'Nog niet gecontroleerd', 'downloads.backgroundWarning.settingsUnavailable' => 'Kan de systeeminstellingen niet openen op dit apparaat', 'downloads.backgroundWarning.linkUnavailable' => 'Kan dontkillmyapp.com niet openen op dit apparaat', + 'downloads.unknownShow' => 'Onbekende serie', + 'downloads.unknownSeason' => 'Onbekend seizoen', + 'downloads.unknownAlbum' => 'Onbekend album', + 'downloads.completedOfTotal' => ({required Object completed, required Object total}) => '${completed}/${total} voltooid', + 'downloads.errorFileNotFound' => 'Bestand niet gevonden (404)', + 'downloads.errorDownloadFailed' => 'Download mislukt', + 'downloads.errorPostProcessing' => ({required Object error}) => 'Nabewerking mislukt: ${error}', + 'downloads.notificationDownloading' => 'Downloaden...', + 'downloads.notificationComplete' => 'Download voltooid', + 'downloads.notificationPaused' => 'Download gepauzeerd', 'shaders.title' => 'Shaders', 'shaders.noShaderDescription' => 'Geen videoverbetering', 'shaders.nvscalerDescription' => 'NVIDIA-beeldschaling voor scherpere video', @@ -4054,14 +4224,24 @@ extension on TranslationsNl { 'companionRemote.errors.failedToConnectAnyAddress' => 'Er kon met geen enkel adres verbinding worden gemaakt', 'companionRemote.errors.connectionLostAfterAttempts' => ({required Object attempts}) => 'Verbinding verbroken na ${attempts} pogingen', 'companionRemote.errors.connectionLost' => 'Verbinding verloren', + 'companionRemote.closedBeforeAuth' => 'De verbinding is vóór de authenticatie gesloten', 'videoSettings.playbackSpeed' => 'Afspeelsnelheid', 'videoSettings.normalSpeed' => 'Normaal', 'videoSettings.sleepTimerActive' => ({required Object duration}) => 'Actief (${duration})', 'videoSettings.zoom' => 'Zoom', + _ => null, + } ?? switch (path) { 'videoSettings.sleepTimer' => 'Slaaptimer', 'videoSettings.audioSync' => 'Audiosynchronisatie', 'videoSettings.subtitleSync' => 'Ondertitelsynchronisatie', 'videoSettings.hdr' => 'HDR', + 'videoSettings.hdrUnsupported' => 'HDR is hier niet beschikbaar — deze desktopcompositor of video-uitvoer kan HDR niet doorgeven.', + 'videoSettings.hdrToneMapping' => 'HDR-tonemapping', + 'videoSettings.hdrToneMappingCompositor' => 'Compositor', + 'videoSettings.hdrToneMappingCompositorDescription' => 'Geef de HDR-metadata van de bron ongewijzigd door en laat de desktopcompositor de mapping uitvoeren.', + 'videoSettings.hdrToneMappingPlayer' => 'Speler', + 'videoSettings.hdrToneMappingPlayerDescription' => 'Laat de speler de mapping naar de piekhelderheid van het scherm uitvoeren en geef het resultaat vervolgens door aan de compositor.', + 'videoSettings.hdrToneMappingFailed' => 'Kon HDR-tonemapping niet wijzigen — de vorige modus is nog actief.', 'videoSettings.audioOutput' => 'Audio-uitvoer', 'videoSettings.performanceOverlay' => 'Prestatie-overlay', 'videoSettings.audioOutputDolbyAtmos' => 'Dolby Atmos', @@ -4106,6 +4286,16 @@ extension on TranslationsNl { 'performanceOverlay.player' => 'Speler', 'performanceOverlay.memory' => 'Geheugen', 'performanceOverlay.uiFps' => 'UI FPS', + 'performanceOverlay.fps' => 'FPS', + 'performanceOverlay.decoderAndroidHw' => 'Android HW', + 'performanceOverlay.decoderNvidiaHw' => 'NVIDIA HW', + 'performanceOverlay.decoderQualcommHw' => 'Qualcomm HW', + 'performanceOverlay.decoderMediatekHw' => 'MediaTek HW', + 'performanceOverlay.decoderExynosHw' => 'Exynos HW', + 'performanceOverlay.decoderSoftware' => 'Software', + 'performanceOverlay.decoderHardware' => 'Hardware', + 'performanceOverlay.tunnelingActive' => 'Actief', + 'performanceOverlay.dvRpuFailed' => ({required Object converted, required Object failures}) => '${converted} (${failures} mislukt)', 'externalPlayer.title' => 'Externe speler', 'externalPlayer.useExternalPlayer' => 'Externe speler gebruiken', 'externalPlayer.useExternalPlayerDescription' => 'Open video\'s in een andere app', @@ -4119,8 +4309,6 @@ extension on TranslationsNl { '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', @@ -4254,6 +4442,16 @@ extension on TranslationsNl { 'seerr.statusPartiallyAvailable' => 'Gedeeltelijk beschikbaar', 'seerr.statusRequested' => 'Aangevraagd', 'seerr.statusProcessing' => 'Verwerken', + 'seerr.couldNotReach' => ({required Object url, required Object error}) => 'Kon ${url} niet bereiken: ${error}', + 'seerr.noInstanceAtUrl' => ({required Object url, required Object status}) => 'Geen Seerr-instantie op ${url} (HTTP ${status})', + 'seerr.notInitialized' => 'De eerste configuratie van deze Seerr-instantie is niet voltooid', + 'seerr.noPlexTokenForReauth' => 'Er is geen Plex-token beschikbaar om opnieuw in te loggen', + 'seerr.noStoredCredentials' => 'Er zijn geen opgeslagen inloggegevens beschikbaar om opnieuw in te loggen', + 'seerr.signInRejected' => 'Inloggen is geweigerd', + 'seerr.noSessionCookie' => 'Seerr heeft geen sessiecookie verstrekt', + 'seerr.freshCookieRejected' => 'Seerr heeft de nieuwe sessiecookie geweigerd', + 'seerr.noUserInformation' => 'Seerr heeft geen gebruikersgegevens geretourneerd', + 'seerr.sessionRejectedAfterReauth' => 'De sessie is na het opnieuw inloggen geweigerd', 'services.title' => 'Diensten', 'services.hubSubtitle' => 'Synchroniseer kijkvoortgang en vraag nieuwe titels aan.', 'services.notConnected' => 'Niet verbonden', @@ -4269,6 +4467,7 @@ extension on TranslationsNl { 'services.names.seerr' => 'Seerr', 'services.names.mdblist' => 'MDBList', 'services.deviceCode.title' => ({required Object service}) => 'Plezy activeren op ${service}', + 'services.deviceCode.instructions' => 'Scan de QR-code of ga naar het onderstaande adres en voer deze code in:', 'services.deviceCode.openToActivate' => ({required Object service}) => 'Open ${service} om te activeren', 'services.deviceCode.copyCode' => 'Activeringscode kopiëren', 'services.deviceCode.waitingForAuthorization' => 'Wachten op autorisatie…', @@ -4318,6 +4517,24 @@ extension on TranslationsNl { 'addServer.connectToMediaBrowserCardSubtitleScoped' => ({required Object product, required Object name}) => 'Meld je aan bij je ${product}-server. Wordt gekoppeld aan ${name}.', 'addServer.borrowFromAnotherProfile' => 'Van een ander profiel lenen', 'addServer.borrowFromAnotherProfileSubtitle' => 'Hergebruik de verbinding van een ander profiel. Voor profielen met pincodebeveiliging is een pincode vereist.', + 'addServer.invalidCredentials' => 'Ongeldige gebruikersnaam of ongeldig wachtwoord', + 'addServer.authResponseNotJson' => 'Het authenticatieantwoord was geen geldige JSON', + 'addServer.quickConnectRejected' => 'Quick Connect is door de server geweigerd', + 'addServer.quickConnectNotJson' => 'Het Quick Connect-antwoord was geen geldige JSON', + 'addServer.quickConnectMissingFields' => 'In het Quick Connect-antwoord ontbreekt een code of geheim', + 'addServer.quickConnectPollRejected' => 'Quick Connect-polling is door de server geweigerd', + 'addServer.serverTimedOut' => 'De server heeft niet op tijd gereageerd', + 'addServer.responseNotJson' => 'Het serverantwoord was geen geldige JSON', + 'addServer.responseMissingIdentity' => ({required Object product}) => 'In het antwoord ontbreekt een ID of servernaam — is dit een ${product}-server?', + 'addServer.probeFailed' => ({required Object error}) => 'Kon de server niet bereiken: ${error}', + 'addServer.enterAtLeastOneUrl' => ({required Object product}) => 'Voer ten minste één URL van een ${product}-server in', + 'addServer.noReachableServer' => ({required Object product}) => 'Er is geen bereikbare ${product}-server gevonden', + 'addServer.urlsPointToDifferentServers' => ({required Object product}) => 'Deze URL\'s verwijzen naar verschillende ${product}-servers', + 'addServer.urlDoesNotMatchServer' => ({required Object product}) => 'Deze URL komt niet overeen met de ${product}-server', + 'addServer.redirectUnsupported' => 'De server heeft doorgestuurd naar een niet-ondersteunde URL', + 'addServer.redirectDifferentHost' => ({required Object product}) => 'De server heeft doorgestuurd naar een andere host. Voer de uiteindelijke ${product}-URL rechtstreeks in.', + 'addServer.redirectInsecure' => 'De server heeft van HTTPS doorgestuurd naar een onbeveiligde URL', + 'addServer.redirectUnsupportedEnterFinal' => ({required Object product}) => 'De server heeft doorgestuurd naar een niet-ondersteunde URL. Voer de uiteindelijke ${product}-URL rechtstreeks in.', _ => null, }; } diff --git a/lib/i18n/strings_pl.g.dart b/lib/i18n/strings_pl.g.dart index 87b38b5d..b7c5a04f 100644 --- a/lib/i18n/strings_pl.g.dart +++ b/lib/i18n/strings_pl.g.dart @@ -123,6 +123,7 @@ class _Translations$auth$pl extends Translations$auth$en { @override String get quickConnectCancel => 'Anuluj'; @override String get quickConnectExpired => 'Quick Connect wygasł. Spróbuj ponownie.'; @override String get localDataRecoveryRequired => 'Plezy nie mogło bezpiecznie odzyskać lokalnych danych logowania ani oczekujących danych odtwarzania. Zaloguj się ponownie.'; + @override String get pinCheckRejected => 'Sprawdzenie kodu PIN Plex zostało odrzucone'; } // Path: common @@ -178,6 +179,9 @@ class _Translations$common$pl extends Translations$common$en { @override String get exitFullscreen => 'Wyjdź z pełnego ekranu'; @override String get pressBackAgainToExit => 'Naciśnij ponownie przycisk Wstecz, aby wyjść'; @override late final _Translations$common$ratingSource$pl ratingSource = _Translations$common$ratingSource$pl._(_root); + @override String get notAvailable => 'N/D'; + @override String get url => 'URL'; + @override String get letterKeys => 'ABC'; } // Path: screens @@ -444,6 +448,8 @@ class _Translations$settings$pl extends Translations$settings$en { @override String get showNavBarLabels => 'Pokaż etykiety paska nawigacji'; @override String get showNavBarLabelsDescription => 'Wyświetl tekstowe etykiety pod ikonami paska nawigacji'; @override String get startupSection => 'Sekcja startowa'; + @override String get showExploreTab => 'Pokaż kartę Odkryj'; + @override String get showExploreTabDescription => 'Wyświetlaj kartę Odkryj z treściami z Plex Discover i połączonych serwisów śledzących'; @override String get liveTvDefaultFavorites => 'Domyślnie ulubione kanały'; @override String get liveTvDefaultFavoritesDescription => 'Pokaż tylko ulubione kanały po otwarciu telewizji na żywo'; @override String get display => 'Ekran'; @@ -455,6 +461,7 @@ class _Translations$settings$pl extends Translations$settings$en { @override String get subtitlesAndConfig => 'Napisy i konfiguracja'; @override String get seekAndTiming => 'Przewijanie i czas'; @override String get behavior => 'Zachowanie'; + @override String get exportDialogTitle => 'Eksport ustawień Plezy'; } // Path: search @@ -606,6 +613,8 @@ class _Translations$fileInfo$pl extends Translations$fileInfo$en { @override String get flagHearingImpaired => 'Dla niesłyszących'; @override String get flagDub => 'Dubbing'; @override String get flagOriginal => 'Oryginalna'; + @override String get channelsMono => 'Mono'; + @override String dolbyVisionProfile({required Object profile}) => 'Profil ${profile}'; } // Path: mediaMenu @@ -710,6 +719,11 @@ class _Translations$accessibility$pl extends Translations$accessibility$en { @override String get alphabetScrollHint => 'Przesuń w górę lub w dół, aby przejść o literę'; @override String rowColumnPosition({required Object row, required Object rowCount, required Object column, required Object columnCount}) => 'Wiersz ${row} z ${rowCount}, kolumna ${column} z ${columnCount}'; @override String rowPosition({required Object row, required Object rowCount}) => 'Wiersz ${row} z ${rowCount}'; + @override String get autoScrollPlay => 'Uruchom automatyczne przewijanie'; + @override String get autoScrollPause => 'Wstrzymaj automatyczne przewijanie'; + @override String get hueShort => 'H'; + @override String get saturationShort => 'S'; + @override String get valueShort => 'V'; } // Path: tooltips @@ -821,6 +835,15 @@ class _Translations$videoControls$pl extends Translations$videoControls$en { @override String get subtitleDownloadedNotApplied => 'Napisy zostały pobrane, ale nie można ich było wybrać'; @override String get subtitleDownloadFailed => 'Nie udało się pobrać napisów'; @override String get searchLanguages => 'Szukaj języków...'; + @override String get skipIntro => 'Pomiń intro'; + @override String get skipCredits => 'Pomiń napisy końcowe'; + @override String get nextEpisode => 'Następny odcinek'; + @override String subtitleTrack({required Object n}) => 'Ścieżka ${n}'; + @override String subtitleFile({required Object name}) => 'Napisy ${name}'; + @override String forcedTrack({required Object label}) => '${label} (wymuszone)'; + @override String get osdSubtitlesOff => 'Napisy: wył.'; + @override String osdSubtitles({required Object track}) => 'Napisy: ${track}'; + @override String osdAudio({required Object track}) => 'Audio: ${track}'; } // Path: messages @@ -884,9 +907,18 @@ class _Translations$messages$pl extends Translations$messages$en { @override String get serverLimitBody => 'Błąd serwera (HTTP 500). Limit przepustowości/transkodowania prawdopodobnie odrzucił tę sesję. Poproś właściciela o zmianę.'; @override String get mediaUnreadableTitle => 'Plik niedostępny'; @override String get mediaUnreadableBody => 'Serwer znalazł ten element, ale nie mógł odczytać jego pliku (HTTP 404). Plik został prawdopodobnie przeniesiony, usunięty albo jego pamięć masowa jest niedostępna. Poproś właściciela serwera o sprawdzenie pliku i ponowne przeskanowanie biblioteki.'; + @override String get serverBusyTitle => 'Strumień niedostępny'; + @override String get serverBusyBody => 'Serwer wielokrotnie odmawiał strumieniowania tego pliku (HTTP 503). Być może jest ponownie uruchamiany lub zajęty albo magazyn danych zawierający plik jest offline. Spróbuj ponownie za chwilę — jeśli problem będzie się powtarzać, poproś właściciela serwera o sprawdzenie serwera i magazynu danych zawierającego plik.'; @override String get logsUploaded => 'Logi przesłane'; @override String get logsUploadFailed => 'Nie udało się przesłać logów'; @override String get logId => 'ID logu'; + @override String get burnedSubtitlesUseMenu => 'Napisy są wtopione w ten strumień. Zmień je w menu napisów.'; + @override String get noVideoUrl => 'Brak dostępnego adresu URL wideo'; + @override String get playbackNoMediaSources => 'Serwer nie zwrócił żadnych możliwych do odtworzenia źródeł multimediów'; + @override String get playbackDataNotPrepared => 'Odtwarzanie rozpoczęło się, zanim dane były gotowe'; + @override String get streamSelectionUnavailable => 'Wybór strumieni nie jest dostępny dla tego źródła'; + @override String get streamSelectionFailed => 'Nie udało się zastosować wybranych strumieni'; + @override String get serverUnavailableForProfile => 'Brak dostępnego serwera dla aktywnego profilu'; } // Path: subtitlingStyling @@ -912,6 +944,8 @@ class _Translations$subtitlingStyling$pl extends Translations$subtitlingStyling$ @override String get overrideStrip => 'Usuń style'; @override String get positionTop => 'Góra'; @override String get positionBottom => 'Dół'; + @override String get anchorToScreen => 'Zakotwicz na ekranie'; + @override String get anchorToScreenDescription => 'Wyświetlaj napisy tekstowe na czarnych pasach poniżej obrazu panoramicznego'; @override String get bold => 'Pogrubienie'; @override String get italic => 'Kursywa'; @override String get renderResolution => 'Rozdzielczość renderowania'; @@ -1021,6 +1055,7 @@ class _Translations$profiles$pl extends Translations$profiles$en { @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 tokenIdentityMismatch => 'Token profilu Plex został powiązany z nieoczekiwanym serwerem'; } // Path: connections @@ -1072,6 +1107,12 @@ class _Translations$discover$pl extends Translations$discover$en { @override String get tvShow => 'Serial TV'; @override String minutesLeft({required Object minutes}) => 'Pozostało ${minutes} min'; @override String get moreLikeThis => 'Więcej podobnych'; + @override String titleCount({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('pl'))(n, + one: '${n} tytuł', + few: '${n} tytuły', + many: '${n} tytułów', + other: '${n} tytułu', + ); } // Path: errors @@ -1286,7 +1327,10 @@ class _Translations$explore$pl extends Translations$explore$en { @override String get characters => 'Postacie'; @override String get addToWatchlist => 'Dodaj do listy do obejrzenia'; @override String get removeFromWatchlist => 'Usuń z listy do obejrzenia'; + @override String get addedToWatchlist => 'Dodano do listy do obejrzenia'; + @override String get removedFromWatchlist => 'Usunięto z listy do obejrzenia'; @override String get watchlistUpdateFailed => 'Nie udało się zaktualizować listy do obejrzenia'; + @override String get watchlistNoMatch => 'Nie udało się dopasować tej pozycji do listy do obejrzenia'; @override String get notInLibrary => 'Nie ma tego w Twojej bibliotece'; @override String get inTheseLibraries => 'W tych bibliotekach'; @override String get checkingLibrary => 'Sprawdzanie Twojej biblioteki...'; @@ -1349,6 +1393,9 @@ class _Translations$liveTv$pl extends Translations$liveTv$en { @override String get watchChannel => 'Oglądaj kanał'; @override String get favorites => 'Ulubione'; @override String get reorderFavorites => 'Zmień kolejność ulubionych'; + @override String get noFavoriteChannels => 'Brak ulubionych kanałów'; + @override String get noFavoriteChannelsHint => 'Pokaż wszystkie kanały, a następnie naciśnij i przytrzymaj kanał, aby dodać go do ulubionych.'; + @override String get showAllChannels => 'Pokaż wszystkie kanały'; @override String get favoritesLoadFailed => 'Nie udało się wczytać ulubionych. Sprawdź połączenie i spróbuj ponownie.'; @override String get favoritesUpdateFailed => 'Nie udało się zaktualizować ulubionych. Sprawdź połączenie i spróbuj ponownie.'; @override String get joinSession => 'Dołącz do trwającej sesji'; @@ -1388,6 +1435,11 @@ class _Translations$liveTv$pl extends Translations$liveTv$en { @override String get guideReloadRequested => 'Zażądano odświeżenia przewodnika'; @override String get rulesProcessRequested => 'Zażądano ponownej oceny reguł'; @override String get recordShow => 'Nagraj program'; + @override String startingInMinutes({required Object minutes}) => 'Rozpocznie się za ${minutes} min'; + @override String dayAtTime({required Object day, required Object time}) => '${day} o ${time}'; + @override String invalidPlaybackData({required Object product}) => '${product} zwrócił nieprawidłowe dane odtwarzania TV na żywo'; + @override String get failedToStartChannel => 'Nie udało się uruchomić kanału na żywo'; + @override String get failedToBuildStreamUrl => 'Nie udało się utworzyć adresu URL strumienia'; } // Path: collections @@ -1488,6 +1540,8 @@ class _Translations$music$pl extends Translations$music$en { @override String get repeat => 'Powtarzaj'; @override String get repeatAll => 'Powtarzaj wszystko'; @override String get repeatOne => 'Powtarzaj jeden'; + @override String get instantMixNoServer => 'Brak dostępnego serwera dla szybkiego miksu'; + @override String noAudioUrl({required Object track}) => 'Brak dostępnego adresu URL audio dla utworu ${track}'; } // Path: watchTogether @@ -1562,6 +1616,7 @@ class _Translations$watchTogether$pl extends Translations$watchTogether$en { @override String get removeRoom => 'Usuń'; @override String get guestSwitchUnavailable => 'Nie można przełączyć — serwer niedostępny do synchronizacji'; @override String get guestSwitchFailed => 'Nie można przełączyć — nie znaleziono treści na tym serwerze'; + @override String get defaultDisplayName => 'Użytkownik'; } // Path: downloads @@ -1646,6 +1701,16 @@ class _Translations$downloads$pl extends Translations$downloads$en { @override String get syncRuleUnknownServer => 'Nieznany serwer'; @override String get syncRuleListCreated => 'Utworzono regułę synchronizacji'; @override late final _Translations$downloads$backgroundWarning$pl backgroundWarning = _Translations$downloads$backgroundWarning$pl._(_root); + @override String get unknownShow => 'Nieznany serial'; + @override String get unknownSeason => 'Nieznany sezon'; + @override String get unknownAlbum => 'Nieznany album'; + @override String completedOfTotal({required Object completed, required Object total}) => 'Ukończono ${completed}/${total}'; + @override String get errorFileNotFound => 'Nie znaleziono pliku (404)'; + @override String get errorDownloadFailed => 'Pobieranie nie powiodło się'; + @override String errorPostProcessing({required Object error}) => 'Przetwarzanie końcowe nie powiodło się: ${error}'; + @override String get notificationDownloading => 'Pobieranie...'; + @override String get notificationComplete => 'Pobieranie zakończone'; + @override String get notificationPaused => 'Pobieranie wstrzymane'; } // Path: shaders @@ -1686,6 +1751,7 @@ class _Translations$companionRemote$pl extends Translations$companionRemote$en { @override late final _Translations$companionRemote$pairing$pl pairing = _Translations$companionRemote$pairing$pl._(_root); @override late final _Translations$companionRemote$remote$pl remote = _Translations$companionRemote$remote$pl._(_root); @override late final _Translations$companionRemote$errors$pl errors = _Translations$companionRemote$errors$pl._(_root); + @override String get closedBeforeAuth => 'Połączenie zostało zamknięte przed uwierzytelnieniem'; } // Path: videoSettings @@ -1703,6 +1769,13 @@ class _Translations$videoSettings$pl extends Translations$videoSettings$en { @override String get audioSync => 'Synchronizacja audio'; @override String get subtitleSync => 'Synchronizacja napisów'; @override String get hdr => 'HDR'; + @override String get hdrUnsupported => 'HDR nie jest tutaj dostępny — ten kompozytor pulpitu lub wyjście wideo nie może go przesyłać.'; + @override String get hdrToneMapping => 'Mapowanie tonów HDR'; + @override String get hdrToneMappingCompositor => 'Kompozytor'; + @override String get hdrToneMappingCompositorDescription => 'Przekazuj metadane HDR źródła bez zmian i pozwól kompozytorowi pulpitu je zmapować.'; + @override String get hdrToneMappingPlayer => 'Odtwarzacz'; + @override String get hdrToneMappingPlayerDescription => 'Mapuj w odtwarzaczu do szczytowej jasności wyświetlacza, a następnie przekaż kompozytorowi informację o wyniku.'; + @override String get hdrToneMappingFailed => 'Nie udało się zmienić mapowania tonów HDR — poprzedni tryb nadal jest aktywny.'; @override String get audioOutput => 'Wyjście audio'; @override String get performanceOverlay => 'Nakładka wydajności'; @override String get audioOutputDolbyAtmos => 'Dolby Atmos'; @@ -1756,6 +1829,16 @@ class _Translations$performanceOverlay$pl extends Translations$performanceOverla @override String get player => 'Odtwarzacz'; @override String get memory => 'Pamięć'; @override String get uiFps => 'UI FPS'; + @override String get fps => 'FPS'; + @override String get decoderAndroidHw => 'Android (sprzętowy)'; + @override String get decoderNvidiaHw => 'NVIDIA (sprzętowy)'; + @override String get decoderQualcommHw => 'Qualcomm (sprzętowy)'; + @override String get decoderMediatekHw => 'MediaTek (sprzętowy)'; + @override String get decoderExynosHw => 'Exynos (sprzętowy)'; + @override String get decoderSoftware => 'Programowy'; + @override String get decoderHardware => 'Sprzętowy'; + @override String get tunnelingActive => 'Aktywne'; + @override String dvRpuFailed({required Object converted, required Object failures}) => '${converted} (niepowodzenia: ${failures})'; } // Path: externalPlayer @@ -1956,6 +2039,16 @@ class _Translations$seerr$pl extends Translations$seerr$en { @override String get statusPartiallyAvailable => 'Częściowo dostępne'; @override String get statusRequested => 'Zamówione'; @override String get statusProcessing => 'Przetwarzanie'; + @override String couldNotReach({required Object url, required Object error}) => 'Nie udało się połączyć z ${url}: ${error}'; + @override String noInstanceAtUrl({required Object url, required Object status}) => 'Pod adresem ${url} nie ma instancji Seerr (HTTP ${status})'; + @override String get notInitialized => 'Ta instancja Seerr nie ukończyła konfiguracji początkowej'; + @override String get noPlexTokenForReauth => 'Brak tokenu Plex umożliwiającego ponowne zalogowanie'; + @override String get noStoredCredentials => 'Brak zapisanych danych logowania umożliwiających ponowne zalogowanie'; + @override String get signInRejected => 'Logowanie zostało odrzucone'; + @override String get noSessionCookie => 'Seerr nie utworzył pliku cookie sesji'; + @override String get freshCookieRejected => 'Seerr odrzucił nowy plik cookie sesji'; + @override String get noUserInformation => 'Seerr nie zwrócił informacji o użytkowniku'; + @override String get sessionRejectedAfterReauth => 'Sesja została odrzucona po ponownym zalogowaniu'; } // Path: services @@ -2016,6 +2109,24 @@ class _Translations$addServer$pl extends Translations$addServer$en { @override String connectToMediaBrowserCardSubtitleScoped({required Object product, required Object name}) => 'Zaloguj się do serwera ${product}. Powiązane z ${name}.'; @override String get borrowFromAnotherProfile => 'Pożycz z innego profilu'; @override String get borrowFromAnotherProfileSubtitle => 'Użyj połączenia innego profilu. Profile chronione PIN-em wymagają podania PIN-u.'; + @override String get invalidCredentials => 'Nieprawidłowa nazwa użytkownika lub hasło'; + @override String get authResponseNotJson => 'Odpowiedź uwierzytelniania ma nieprawidłowy format JSON'; + @override String get quickConnectRejected => 'Quick Connect został odrzucony przez serwer'; + @override String get quickConnectNotJson => 'Odpowiedź Quick Connect ma nieprawidłowy format JSON'; + @override String get quickConnectMissingFields => 'W odpowiedzi Quick Connect brakuje kodu lub sekretu'; + @override String get quickConnectPollRejected => 'Odpytywanie Quick Connect zostało odrzucone przez serwer'; + @override String get serverTimedOut => 'Serwer nie odpowiedział w wymaganym czasie'; + @override String get responseNotJson => 'Odpowiedź serwera ma nieprawidłowy format JSON'; + @override String responseMissingIdentity({required Object product}) => 'W odpowiedzi brakuje identyfikatora lub nazwy serwera — czy to serwer ${product}?'; + @override String probeFailed({required Object error}) => 'Nie udało się połączyć z serwerem: ${error}'; + @override String enterAtLeastOneUrl({required Object product}) => 'Wprowadź co najmniej jeden adres URL serwera ${product}'; + @override String noReachableServer({required Object product}) => 'Nie znaleziono żadnego osiągalnego serwera ${product}'; + @override String urlsPointToDifferentServers({required Object product}) => 'Te adresy URL wskazują różne serwery ${product}'; + @override String urlDoesNotMatchServer({required Object product}) => 'Ten adres URL nie odpowiada serwerowi ${product}'; + @override String get redirectUnsupported => 'Serwer przekierował do nieobsługiwanego adresu URL'; + @override String redirectDifferentHost({required Object product}) => 'Serwer przekierował do innego hosta. Wprowadź bezpośrednio docelowy adres URL serwera ${product}.'; + @override String get redirectInsecure => 'Serwer przekierował z HTTPS do niezabezpieczonego adresu URL'; + @override String redirectUnsupportedEnterFinal({required Object product}) => 'Serwer przekierował do nieobsługiwanego adresu URL. Wprowadź bezpośrednio docelowy adres URL serwera ${product}.'; } // Path: common.ratingSource @@ -2539,6 +2650,7 @@ class _Translations$services$deviceCode$pl extends Translations$services$deviceC // Translations @override String title({required Object service}) => 'Aktywuj Plezy w ${service}'; + @override String get instructions => 'Zeskanuj kod QR albo przejdź pod poniższy adres i wprowadź ten kod:'; @override String openToActivate({required Object service}) => 'Otwórz ${service}, aby aktywować'; @override String get copyCode => 'Skopiuj kod aktywacyjny'; @override String get waitingForAuthorization => 'Oczekiwanie na autoryzację…'; @@ -2613,6 +2725,7 @@ extension on TranslationsPl { 'auth.quickConnectCancel' => 'Anuluj', 'auth.quickConnectExpired' => 'Quick Connect wygasł. Spróbuj ponownie.', 'auth.localDataRecoveryRequired' => 'Plezy nie mogło bezpiecznie odzyskać lokalnych danych logowania ani oczekujących danych odtwarzania. Zaloguj się ponownie.', + 'auth.pinCheckRejected' => 'Sprawdzenie kodu PIN Plex zostało odrzucone', 'common.cancel' => 'Anuluj', 'common.save' => 'Zapisz', 'common.close' => 'Zamknij', @@ -2669,6 +2782,9 @@ extension on TranslationsPl { 'common.ratingSource.trakt' => 'Trakt', 'common.ratingSource.rottenTomatoesCritic' => 'Krytycy Rotten Tomatoes', 'common.ratingSource.rottenTomatoesAudience' => 'Widzowie Rotten Tomatoes', + 'common.notAvailable' => 'N/D', + 'common.url' => 'URL', + 'common.letterKeys' => 'ABC', 'screens.licenses' => 'Licencje', 'screens.switchProfile' => 'Zmień profil', 'screens.subtitleStyling' => 'Styl napisów', @@ -2908,6 +3024,8 @@ extension on TranslationsPl { 'settings.showNavBarLabels' => 'Pokaż etykiety paska nawigacji', 'settings.showNavBarLabelsDescription' => 'Wyświetl tekstowe etykiety pod ikonami paska nawigacji', 'settings.startupSection' => 'Sekcja startowa', + 'settings.showExploreTab' => 'Pokaż kartę Odkryj', + 'settings.showExploreTabDescription' => 'Wyświetlaj kartę Odkryj z treściami z Plex Discover i połączonych serwisów śledzących', 'settings.liveTvDefaultFavorites' => 'Domyślnie ulubione kanały', 'settings.liveTvDefaultFavoritesDescription' => 'Pokaż tylko ulubione kanały po otwarciu telewizji na żywo', 'settings.display' => 'Ekran', @@ -2919,6 +3037,7 @@ extension on TranslationsPl { 'settings.subtitlesAndConfig' => 'Napisy i konfiguracja', 'settings.seekAndTiming' => 'Przewijanie i czas', 'settings.behavior' => 'Zachowanie', + 'settings.exportDialogTitle' => 'Eksport ustawień Plezy', 'search.hint' => 'Szukaj filmów, seriali, muzyki...', 'search.tryDifferentTerm' => 'Spróbuj innego wyszukiwania', 'search.searchYourMedia' => 'Przeszukaj swoje media', @@ -3067,6 +3186,8 @@ extension on TranslationsPl { 'fileInfo.flagHearingImpaired' => 'Dla niesłyszących', 'fileInfo.flagDub' => 'Dubbing', 'fileInfo.flagOriginal' => 'Oryginalna', + 'fileInfo.channelsMono' => 'Mono', + 'fileInfo.dolbyVisionProfile' => ({required Object profile}) => 'Profil ${profile}', 'mediaMenu.markAsWatched' => 'Oznacz jako obejrzane', 'mediaMenu.markAsUnwatched' => 'Oznacz jako nieobejrzane', 'mediaMenu.removeFromContinueWatching' => 'Usuń z kontynuowania oglądania', @@ -3100,6 +3221,8 @@ extension on TranslationsPl { 'mediaMenu.rate' => 'Oceń', 'mediaMenu.playFromBeginning' => 'Odtwórz od początku', 'mediaMenu.playVersion' => 'Odtwórz wersję...', + _ => null, + } ?? switch (path) { 'rateSheet.title' => 'Oceń', 'rateSheet.server' => 'Serwer', 'rateSheet.favorite' => 'Dodaj do ulubionych', @@ -3109,8 +3232,6 @@ extension on TranslationsPl { 'rateSheet.noConnectedServices' => 'Połącz usługę w Ustawieniach, aby tam oceniać.', 'accessibility.mediaCardMovie' => ({required Object title}) => '${title}, film', 'accessibility.mediaCardShow' => ({required Object title}) => '${title}, serial TV', - _ => null, - } ?? switch (path) { 'accessibility.mediaCardEpisode' => ({required Object title, required Object episodeInfo}) => '${title}, ${episodeInfo}', 'accessibility.mediaCardSeason' => ({required Object title, required Object seasonInfo}) => '${title}, ${seasonInfo}', 'accessibility.mediaCardWatched' => 'obejrzane', @@ -3131,6 +3252,11 @@ extension on TranslationsPl { 'accessibility.alphabetScrollHint' => 'Przesuń w górę lub w dół, aby przejść o literę', 'accessibility.rowColumnPosition' => ({required Object row, required Object rowCount, required Object column, required Object columnCount}) => 'Wiersz ${row} z ${rowCount}, kolumna ${column} z ${columnCount}', 'accessibility.rowPosition' => ({required Object row, required Object rowCount}) => 'Wiersz ${row} z ${rowCount}', + 'accessibility.autoScrollPlay' => 'Uruchom automatyczne przewijanie', + 'accessibility.autoScrollPause' => 'Wstrzymaj automatyczne przewijanie', + 'accessibility.hueShort' => 'H', + 'accessibility.saturationShort' => 'S', + 'accessibility.valueShort' => 'V', 'tooltips.shufflePlay' => 'Odtwarzanie losowe', 'tooltips.playTrailer' => 'Odtwórz zwiastun', 'tooltips.markAsWatched' => 'Oznacz jako obejrzane', @@ -3221,6 +3347,15 @@ extension on TranslationsPl { 'videoControls.subtitleDownloadedNotApplied' => 'Napisy zostały pobrane, ale nie można ich było wybrać', 'videoControls.subtitleDownloadFailed' => 'Nie udało się pobrać napisów', 'videoControls.searchLanguages' => 'Szukaj języków...', + 'videoControls.skipIntro' => 'Pomiń intro', + 'videoControls.skipCredits' => 'Pomiń napisy końcowe', + 'videoControls.nextEpisode' => 'Następny odcinek', + 'videoControls.subtitleTrack' => ({required Object n}) => 'Ścieżka ${n}', + 'videoControls.subtitleFile' => ({required Object name}) => 'Napisy ${name}', + 'videoControls.forcedTrack' => ({required Object label}) => '${label} (wymuszone)', + 'videoControls.osdSubtitlesOff' => 'Napisy: wył.', + 'videoControls.osdSubtitles' => ({required Object track}) => 'Napisy: ${track}', + 'videoControls.osdAudio' => ({required Object track}) => 'Audio: ${track}', 'messages.markedAsWatched' => 'Oznaczono jako obejrzane', 'messages.markedAsUnwatched' => 'Oznaczono jako nieobejrzane', 'messages.markedAsWatchedOffline' => 'Oznaczono jako obejrzane (zsynchronizuje się po połączeniu)', @@ -3270,9 +3405,18 @@ extension on TranslationsPl { 'messages.serverLimitBody' => 'Błąd serwera (HTTP 500). Limit przepustowości/transkodowania prawdopodobnie odrzucił tę sesję. Poproś właściciela o zmianę.', 'messages.mediaUnreadableTitle' => 'Plik niedostępny', 'messages.mediaUnreadableBody' => 'Serwer znalazł ten element, ale nie mógł odczytać jego pliku (HTTP 404). Plik został prawdopodobnie przeniesiony, usunięty albo jego pamięć masowa jest niedostępna. Poproś właściciela serwera o sprawdzenie pliku i ponowne przeskanowanie biblioteki.', + 'messages.serverBusyTitle' => 'Strumień niedostępny', + 'messages.serverBusyBody' => 'Serwer wielokrotnie odmawiał strumieniowania tego pliku (HTTP 503). Być może jest ponownie uruchamiany lub zajęty albo magazyn danych zawierający plik jest offline. Spróbuj ponownie za chwilę — jeśli problem będzie się powtarzać, poproś właściciela serwera o sprawdzenie serwera i magazynu danych zawierającego plik.', 'messages.logsUploaded' => 'Logi przesłane', 'messages.logsUploadFailed' => 'Nie udało się przesłać logów', 'messages.logId' => 'ID logu', + 'messages.burnedSubtitlesUseMenu' => 'Napisy są wtopione w ten strumień. Zmień je w menu napisów.', + 'messages.noVideoUrl' => 'Brak dostępnego adresu URL wideo', + 'messages.playbackNoMediaSources' => 'Serwer nie zwrócił żadnych możliwych do odtworzenia źródeł multimediów', + 'messages.playbackDataNotPrepared' => 'Odtwarzanie rozpoczęło się, zanim dane były gotowe', + 'messages.streamSelectionUnavailable' => 'Wybór strumieni nie jest dostępny dla tego źródła', + 'messages.streamSelectionFailed' => 'Nie udało się zastosować wybranych strumieni', + 'messages.serverUnavailableForProfile' => 'Brak dostępnego serwera dla aktywnego profilu', 'subtitlingStyling.text' => 'Tekst', 'subtitlingStyling.border' => 'Obramowanie', 'subtitlingStyling.background' => 'Tło', @@ -3289,6 +3433,8 @@ extension on TranslationsPl { 'subtitlingStyling.overrideStrip' => 'Usuń style', 'subtitlingStyling.positionTop' => 'Góra', 'subtitlingStyling.positionBottom' => 'Dół', + 'subtitlingStyling.anchorToScreen' => 'Zakotwicz na ekranie', + 'subtitlingStyling.anchorToScreenDescription' => 'Wyświetlaj napisy tekstowe na czarnych pasach poniżej obrazu panoramicznego', 'subtitlingStyling.bold' => 'Pogrubienie', 'subtitlingStyling.italic' => 'Kursywa', 'subtitlingStyling.renderResolution' => 'Rozdzielczość renderowania', @@ -3371,6 +3517,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.tokenIdentityMismatch' => 'Token profilu Plex został powiązany z nieoczekiwanym serwerem', 'connections.sectionTitle' => 'Połączenia', 'connections.addConnection' => 'Dodaj połączenie', 'connections.addConnectionSubtitleNoProfile' => 'Zaloguj się przez Plex lub połącz serwer Jellyfin', @@ -3404,6 +3551,7 @@ extension on TranslationsPl { 'discover.tvShow' => 'Serial TV', 'discover.minutesLeft' => ({required Object minutes}) => 'Pozostało ${minutes} min', 'discover.moreLikeThis' => 'Więcej podobnych', + 'discover.titleCount' => ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('pl'))(n, one: '${n} tytuł', few: '${n} tytuły', many: '${n} tytułów', other: '${n} tytułu', ), 'errors.searchFailed' => ({required Object error}) => 'Wyszukiwanie nie powiodło się: ${error}', 'errors.searchUnavailable' => 'Wyszukiwanie nie mogło połączyć się z żadnym serwerem multimediów.', 'errors.connectionTimeout' => ({required Object context}) => 'Limit czasu połączenia przy ładowaniu ${context}', @@ -3576,7 +3724,10 @@ extension on TranslationsPl { 'explore.characters' => 'Postacie', 'explore.addToWatchlist' => 'Dodaj do listy do obejrzenia', 'explore.removeFromWatchlist' => 'Usuń z listy do obejrzenia', + 'explore.addedToWatchlist' => 'Dodano do listy do obejrzenia', + 'explore.removedFromWatchlist' => 'Usunięto z listy do obejrzenia', 'explore.watchlistUpdateFailed' => 'Nie udało się zaktualizować listy do obejrzenia', + 'explore.watchlistNoMatch' => 'Nie udało się dopasować tej pozycji do listy do obejrzenia', 'explore.notInLibrary' => 'Nie ma tego w Twojej bibliotece', 'explore.inTheseLibraries' => 'W tych bibliotekach', 'explore.checkingLibrary' => 'Sprawdzanie Twojej biblioteki...', @@ -3584,6 +3735,8 @@ extension on TranslationsPl { 'explore.emptyMessage' => ({required Object source}) => 'Wiersze z ${source} pojawią się tutaj, gdy będą zawierać treści.', 'explore.searchHint' => ({required Object source}) => 'Szukaj w ${source}', 'explore.searchEmpty' => ({required Object query}) => 'Brak wyników dla "${query}"', + _ => null, + } ?? switch (path) { 'explore.searchPrompt' => ({required Object source}) => 'Szukaj filmów i seriali w ${source}.', 'explore.searchFailed' => 'Wyszukiwanie nie powiodło się. Sprawdź połączenie i spróbuj ponownie.', 'explore.badge.rankPopular' => ({required Object n}) => '#${n} popularne', @@ -3623,8 +3776,6 @@ extension on TranslationsPl { 'explore.stats.completed' => ({required Object n}) => '${n} ukończyło', 'explore.stats.onHold' => ({required Object n}) => '${n} wstrzymało', 'explore.stats.dropped' => ({required Object n}) => '${n} porzuciło', - _ => null, - } ?? switch (path) { 'explore.season.winter' => 'Zima', 'explore.season.spring' => 'Wiosna', 'explore.season.summer' => 'Lato', @@ -3721,6 +3872,9 @@ extension on TranslationsPl { 'liveTv.watchChannel' => 'Oglądaj kanał', 'liveTv.favorites' => 'Ulubione', 'liveTv.reorderFavorites' => 'Zmień kolejność ulubionych', + 'liveTv.noFavoriteChannels' => 'Brak ulubionych kanałów', + 'liveTv.noFavoriteChannelsHint' => 'Pokaż wszystkie kanały, a następnie naciśnij i przytrzymaj kanał, aby dodać go do ulubionych.', + 'liveTv.showAllChannels' => 'Pokaż wszystkie kanały', 'liveTv.favoritesLoadFailed' => 'Nie udało się wczytać ulubionych. Sprawdź połączenie i spróbuj ponownie.', 'liveTv.favoritesUpdateFailed' => 'Nie udało się zaktualizować ulubionych. Sprawdź połączenie i spróbuj ponownie.', 'liveTv.joinSession' => 'Dołącz do trwającej sesji', @@ -3760,6 +3914,11 @@ extension on TranslationsPl { 'liveTv.guideReloadRequested' => 'Zażądano odświeżenia przewodnika', 'liveTv.rulesProcessRequested' => 'Zażądano ponownej oceny reguł', 'liveTv.recordShow' => 'Nagraj program', + 'liveTv.startingInMinutes' => ({required Object minutes}) => 'Rozpocznie się za ${minutes} min', + 'liveTv.dayAtTime' => ({required Object day, required Object time}) => '${day} o ${time}', + 'liveTv.invalidPlaybackData' => ({required Object product}) => '${product} zwrócił nieprawidłowe dane odtwarzania TV na żywo', + 'liveTv.failedToStartChannel' => 'Nie udało się uruchomić kanału na żywo', + 'liveTv.failedToBuildStreamUrl' => 'Nie udało się utworzyć adresu URL strumienia', 'collections.title' => 'Kolekcje', 'collections.collection' => 'Kolekcja', 'collections.empty' => 'Kolekcja jest pusta', @@ -3828,6 +3987,8 @@ extension on TranslationsPl { 'music.repeat' => 'Powtarzaj', 'music.repeatAll' => 'Powtarzaj wszystko', 'music.repeatOne' => 'Powtarzaj jeden', + 'music.instantMixNoServer' => 'Brak dostępnego serwera dla szybkiego miksu', + 'music.noAudioUrl' => ({required Object track}) => 'Brak dostępnego adresu URL audio dla utworu ${track}', 'watchTogether.title' => 'Oglądaj razem', 'watchTogether.description' => 'Oglądaj treści wspólnie z rodziną i znajomymi dzięki synchronizacji odtwarzania', 'watchTogether.createSession' => 'Utwórz sesję', @@ -3893,6 +4054,7 @@ extension on TranslationsPl { 'watchTogether.removeRoom' => 'Usuń', 'watchTogether.guestSwitchUnavailable' => 'Nie można przełączyć — serwer niedostępny do synchronizacji', 'watchTogether.guestSwitchFailed' => 'Nie można przełączyć — nie znaleziono treści na tym serwerze', + 'watchTogether.defaultDisplayName' => 'Użytkownik', 'downloads.title' => 'Pobrania', 'downloads.manage' => 'Zarządzaj', 'downloads.tvShows' => 'Seriale TV', @@ -3993,6 +4155,16 @@ extension on TranslationsPl { 'downloads.backgroundWarning.statusUnknown' => 'Jeszcze nie sprawdzono', 'downloads.backgroundWarning.settingsUnavailable' => 'Nie udało się otworzyć ustawień systemowych na tym urządzeniu', 'downloads.backgroundWarning.linkUnavailable' => 'Nie udało się otworzyć dontkillmyapp.com na tym urządzeniu', + 'downloads.unknownShow' => 'Nieznany serial', + 'downloads.unknownSeason' => 'Nieznany sezon', + 'downloads.unknownAlbum' => 'Nieznany album', + 'downloads.completedOfTotal' => ({required Object completed, required Object total}) => 'Ukończono ${completed}/${total}', + 'downloads.errorFileNotFound' => 'Nie znaleziono pliku (404)', + 'downloads.errorDownloadFailed' => 'Pobieranie nie powiodło się', + 'downloads.errorPostProcessing' => ({required Object error}) => 'Przetwarzanie końcowe nie powiodło się: ${error}', + 'downloads.notificationDownloading' => 'Pobieranie...', + 'downloads.notificationComplete' => 'Pobieranie zakończone', + 'downloads.notificationPaused' => 'Pobieranie wstrzymane', 'shaders.title' => 'Shadery', 'shaders.noShaderDescription' => 'Bez ulepszenia wideo', 'shaders.nvscalerDescription' => 'Skalowanie obrazu NVIDIA dla ostrzejszego wideo', @@ -4072,14 +4244,24 @@ extension on TranslationsPl { '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', + 'companionRemote.closedBeforeAuth' => 'Połączenie zostało zamknięte przed uwierzytelnieniem', 'videoSettings.playbackSpeed' => 'Prędkość odtwarzania', 'videoSettings.normalSpeed' => 'Normalna', 'videoSettings.sleepTimerActive' => ({required Object duration}) => 'Aktywny (${duration})', 'videoSettings.zoom' => 'Powiększenie', + _ => null, + } ?? switch (path) { 'videoSettings.sleepTimer' => 'Wyłącznik czasowy', 'videoSettings.audioSync' => 'Synchronizacja audio', 'videoSettings.subtitleSync' => 'Synchronizacja napisów', 'videoSettings.hdr' => 'HDR', + 'videoSettings.hdrUnsupported' => 'HDR nie jest tutaj dostępny — ten kompozytor pulpitu lub wyjście wideo nie może go przesyłać.', + 'videoSettings.hdrToneMapping' => 'Mapowanie tonów HDR', + 'videoSettings.hdrToneMappingCompositor' => 'Kompozytor', + 'videoSettings.hdrToneMappingCompositorDescription' => 'Przekazuj metadane HDR źródła bez zmian i pozwól kompozytorowi pulpitu je zmapować.', + 'videoSettings.hdrToneMappingPlayer' => 'Odtwarzacz', + 'videoSettings.hdrToneMappingPlayerDescription' => 'Mapuj w odtwarzaczu do szczytowej jasności wyświetlacza, a następnie przekaż kompozytorowi informację o wyniku.', + 'videoSettings.hdrToneMappingFailed' => 'Nie udało się zmienić mapowania tonów HDR — poprzedni tryb nadal jest aktywny.', 'videoSettings.audioOutput' => 'Wyjście audio', 'videoSettings.performanceOverlay' => 'Nakładka wydajności', 'videoSettings.audioOutputDolbyAtmos' => 'Dolby Atmos', @@ -4124,6 +4306,16 @@ extension on TranslationsPl { 'performanceOverlay.player' => 'Odtwarzacz', 'performanceOverlay.memory' => 'Pamięć', 'performanceOverlay.uiFps' => 'UI FPS', + 'performanceOverlay.fps' => 'FPS', + 'performanceOverlay.decoderAndroidHw' => 'Android (sprzętowy)', + 'performanceOverlay.decoderNvidiaHw' => 'NVIDIA (sprzętowy)', + 'performanceOverlay.decoderQualcommHw' => 'Qualcomm (sprzętowy)', + 'performanceOverlay.decoderMediatekHw' => 'MediaTek (sprzętowy)', + 'performanceOverlay.decoderExynosHw' => 'Exynos (sprzętowy)', + 'performanceOverlay.decoderSoftware' => 'Programowy', + 'performanceOverlay.decoderHardware' => 'Sprzętowy', + 'performanceOverlay.tunnelingActive' => 'Aktywne', + 'performanceOverlay.dvRpuFailed' => ({required Object converted, required Object failures}) => '${converted} (niepowodzenia: ${failures})', 'externalPlayer.title' => 'Zewnętrzny odtwarzacz', 'externalPlayer.useExternalPlayer' => 'Użyj zewnętrznego odtwarzacza', 'externalPlayer.useExternalPlayerDescription' => 'Otwieraj wideo w innej aplikacji', @@ -4137,8 +4329,6 @@ extension on TranslationsPl { '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', @@ -4272,6 +4462,16 @@ extension on TranslationsPl { 'seerr.statusPartiallyAvailable' => 'Częściowo dostępne', 'seerr.statusRequested' => 'Zamówione', 'seerr.statusProcessing' => 'Przetwarzanie', + 'seerr.couldNotReach' => ({required Object url, required Object error}) => 'Nie udało się połączyć z ${url}: ${error}', + 'seerr.noInstanceAtUrl' => ({required Object url, required Object status}) => 'Pod adresem ${url} nie ma instancji Seerr (HTTP ${status})', + 'seerr.notInitialized' => 'Ta instancja Seerr nie ukończyła konfiguracji początkowej', + 'seerr.noPlexTokenForReauth' => 'Brak tokenu Plex umożliwiającego ponowne zalogowanie', + 'seerr.noStoredCredentials' => 'Brak zapisanych danych logowania umożliwiających ponowne zalogowanie', + 'seerr.signInRejected' => 'Logowanie zostało odrzucone', + 'seerr.noSessionCookie' => 'Seerr nie utworzył pliku cookie sesji', + 'seerr.freshCookieRejected' => 'Seerr odrzucił nowy plik cookie sesji', + 'seerr.noUserInformation' => 'Seerr nie zwrócił informacji o użytkowniku', + 'seerr.sessionRejectedAfterReauth' => 'Sesja została odrzucona po ponownym zalogowaniu', 'services.title' => 'Usługi', 'services.hubSubtitle' => 'Synchronizuj postęp oglądania i zamawiaj nowe tytuły.', 'services.notConnected' => 'Nie połączono', @@ -4287,6 +4487,7 @@ extension on TranslationsPl { 'services.names.seerr' => 'Seerr', 'services.names.mdblist' => 'MDBList', 'services.deviceCode.title' => ({required Object service}) => 'Aktywuj Plezy w ${service}', + 'services.deviceCode.instructions' => 'Zeskanuj kod QR albo przejdź pod poniższy adres i wprowadź ten kod:', 'services.deviceCode.openToActivate' => ({required Object service}) => 'Otwórz ${service}, aby aktywować', 'services.deviceCode.copyCode' => 'Skopiuj kod aktywacyjny', 'services.deviceCode.waitingForAuthorization' => 'Oczekiwanie na autoryzację…', @@ -4336,6 +4537,24 @@ extension on TranslationsPl { 'addServer.connectToMediaBrowserCardSubtitleScoped' => ({required Object product, required Object name}) => 'Zaloguj się do serwera ${product}. Powiązane z ${name}.', 'addServer.borrowFromAnotherProfile' => 'Pożycz z innego profilu', 'addServer.borrowFromAnotherProfileSubtitle' => 'Użyj połączenia innego profilu. Profile chronione PIN-em wymagają podania PIN-u.', + 'addServer.invalidCredentials' => 'Nieprawidłowa nazwa użytkownika lub hasło', + 'addServer.authResponseNotJson' => 'Odpowiedź uwierzytelniania ma nieprawidłowy format JSON', + 'addServer.quickConnectRejected' => 'Quick Connect został odrzucony przez serwer', + 'addServer.quickConnectNotJson' => 'Odpowiedź Quick Connect ma nieprawidłowy format JSON', + 'addServer.quickConnectMissingFields' => 'W odpowiedzi Quick Connect brakuje kodu lub sekretu', + 'addServer.quickConnectPollRejected' => 'Odpytywanie Quick Connect zostało odrzucone przez serwer', + 'addServer.serverTimedOut' => 'Serwer nie odpowiedział w wymaganym czasie', + 'addServer.responseNotJson' => 'Odpowiedź serwera ma nieprawidłowy format JSON', + 'addServer.responseMissingIdentity' => ({required Object product}) => 'W odpowiedzi brakuje identyfikatora lub nazwy serwera — czy to serwer ${product}?', + 'addServer.probeFailed' => ({required Object error}) => 'Nie udało się połączyć z serwerem: ${error}', + 'addServer.enterAtLeastOneUrl' => ({required Object product}) => 'Wprowadź co najmniej jeden adres URL serwera ${product}', + 'addServer.noReachableServer' => ({required Object product}) => 'Nie znaleziono żadnego osiągalnego serwera ${product}', + 'addServer.urlsPointToDifferentServers' => ({required Object product}) => 'Te adresy URL wskazują różne serwery ${product}', + 'addServer.urlDoesNotMatchServer' => ({required Object product}) => 'Ten adres URL nie odpowiada serwerowi ${product}', + 'addServer.redirectUnsupported' => 'Serwer przekierował do nieobsługiwanego adresu URL', + 'addServer.redirectDifferentHost' => ({required Object product}) => 'Serwer przekierował do innego hosta. Wprowadź bezpośrednio docelowy adres URL serwera ${product}.', + 'addServer.redirectInsecure' => 'Serwer przekierował z HTTPS do niezabezpieczonego adresu URL', + 'addServer.redirectUnsupportedEnterFinal' => ({required Object product}) => 'Serwer przekierował do nieobsługiwanego adresu URL. Wprowadź bezpośrednio docelowy adres URL serwera ${product}.', _ => null, }; } diff --git a/lib/i18n/strings_pt.g.dart b/lib/i18n/strings_pt.g.dart index b081ede3..ab48cd0e 100644 --- a/lib/i18n/strings_pt.g.dart +++ b/lib/i18n/strings_pt.g.dart @@ -123,6 +123,7 @@ class _Translations$auth$pt extends Translations$auth$en { @override String get quickConnectCancel => 'Cancelar'; @override String get quickConnectExpired => 'Quick Connect expirou. Tente novamente.'; @override String get localDataRecoveryRequired => 'O Plezy não conseguiu recuperar com segurança os dados locais de acesso e de reproduções pendentes. Entre novamente.'; + @override String get pinCheckRejected => 'A verificação do PIN do Plex foi rejeitada'; } // Path: common @@ -178,6 +179,9 @@ class _Translations$common$pt extends Translations$common$en { @override String get exitFullscreen => 'Sair da tela cheia'; @override String get pressBackAgainToExit => 'Pressione voltar novamente para sair'; @override late final _Translations$common$ratingSource$pt ratingSource = _Translations$common$ratingSource$pt._(_root); + @override String get notAvailable => 'N/D'; + @override String get url => 'URL'; + @override String get letterKeys => 'ABC'; } // Path: screens @@ -444,6 +448,8 @@ class _Translations$settings$pt extends Translations$settings$en { @override String get showNavBarLabels => 'Mostrar Rótulos da Barra de Navegação'; @override String get showNavBarLabelsDescription => 'Exibir rótulos de texto sob os ícones da barra de navegação'; @override String get startupSection => 'Seção inicial'; + @override String get showExploreTab => 'Mostrar aba Explorar'; + @override String get showExploreTabDescription => 'Exibir a aba Explorar com conteúdo do Plex Discover e dos rastreadores conectados'; @override String get liveTvDefaultFavorites => 'Canais favoritos por padrão'; @override String get liveTvDefaultFavoritesDescription => 'Mostrar apenas os canais favoritos ao abrir a TV ao vivo'; @override String get display => 'Tela'; @@ -455,6 +461,7 @@ class _Translations$settings$pt extends Translations$settings$en { @override String get subtitlesAndConfig => 'Legendas e configuração'; @override String get seekAndTiming => 'Busca e tempo'; @override String get behavior => 'Comportamento'; + @override String get exportDialogTitle => 'Exportar configurações do Plezy'; } // Path: search @@ -606,6 +613,8 @@ class _Translations$fileInfo$pt extends Translations$fileInfo$en { @override String get flagHearingImpaired => 'Deficiência auditiva'; @override String get flagDub => 'Dublada'; @override String get flagOriginal => 'Original'; + @override String get channelsMono => 'Mono'; + @override String dolbyVisionProfile({required Object profile}) => 'Perfil ${profile}'; } // Path: mediaMenu @@ -704,6 +713,11 @@ class _Translations$accessibility$pt extends Translations$accessibility$en { @override String get alphabetScrollHint => 'Deslize para cima ou para baixo para avançar por letra'; @override String rowColumnPosition({required Object row, required Object rowCount, required Object column, required Object columnCount}) => 'Linha ${row} de ${rowCount}, coluna ${column} de ${columnCount}'; @override String rowPosition({required Object row, required Object rowCount}) => 'Linha ${row} de ${rowCount}'; + @override String get autoScrollPlay => 'Iniciar rolagem automática'; + @override String get autoScrollPause => 'Pausar rolagem automática'; + @override String get hueShort => 'M'; + @override String get saturationShort => 'S'; + @override String get valueShort => 'V'; } // Path: tooltips @@ -815,6 +829,15 @@ class _Translations$videoControls$pt extends Translations$videoControls$en { @override String get subtitleDownloadedNotApplied => 'A legenda foi baixada, mas não foi possível selecioná-la'; @override String get subtitleDownloadFailed => 'Falha ao baixar legenda'; @override String get searchLanguages => 'Pesquisar idiomas...'; + @override String get skipIntro => 'Pular abertura'; + @override String get skipCredits => 'Pular créditos'; + @override String get nextEpisode => 'Próximo episódio'; + @override String subtitleTrack({required Object n}) => 'Faixa ${n}'; + @override String subtitleFile({required Object name}) => 'Legenda ${name}'; + @override String forcedTrack({required Object label}) => '${label} (Forçada)'; + @override String get osdSubtitlesOff => 'Legendas: desativadas'; + @override String osdSubtitles({required Object track}) => 'Legendas: ${track}'; + @override String osdAudio({required Object track}) => 'Áudio: ${track}'; } // Path: messages @@ -876,9 +899,18 @@ class _Translations$messages$pt extends Translations$messages$en { @override String get serverLimitBody => 'Erro do servidor (HTTP 500). Um limite de largura de banda ou transcodificação provavelmente rejeitou esta sessão. Peça ao proprietário do servidor para ajustá-lo.'; @override String get mediaUnreadableTitle => 'Arquivo indisponível'; @override String get mediaUnreadableBody => 'O servidor encontrou este item, mas não conseguiu ler o arquivo (HTTP 404). O arquivo provavelmente foi movido, excluído ou o armazenamento está offline. Peça ao responsável pelo servidor para verificar o arquivo e reexaminar a biblioteca.'; + @override String get serverBusyTitle => 'Transmissão indisponível'; + @override String get serverBusyBody => 'O servidor continuou se recusando a transmitir este arquivo (HTTP 503). Ele pode estar reiniciando ou ocupado, ou o armazenamento do arquivo pode estar offline. Tente novamente em instantes — se isso continuar acontecendo, peça ao proprietário do servidor para verificar o servidor e o armazenamento do arquivo.'; @override String get logsUploaded => 'Logs enviados'; @override String get logsUploadFailed => 'Falha ao enviar logs'; @override String get logId => 'ID do log'; + @override String get burnedSubtitlesUseMenu => 'As legendas estão incorporadas a esta transmissão. Altere-as no menu de legendas.'; + @override String get noVideoUrl => 'Nenhuma URL de vídeo disponível'; + @override String get playbackNoMediaSources => 'O servidor não retornou nenhuma fonte de mídia reproduzível'; + @override String get playbackDataNotPrepared => 'A reprodução foi iniciada antes que os dados estivessem prontos'; + @override String get streamSelectionUnavailable => 'A seleção de fluxos não está disponível para esta fonte'; + @override String get streamSelectionFailed => 'Não foi possível aplicar os fluxos selecionados'; + @override String get serverUnavailableForProfile => 'Nenhum servidor está disponível para o perfil ativo'; } // Path: subtitlingStyling @@ -904,6 +936,8 @@ class _Translations$subtitlingStyling$pt extends Translations$subtitlingStyling$ @override String get overrideStrip => 'Remover estilo'; @override String get positionTop => 'Superior'; @override String get positionBottom => 'Inferior'; + @override String get anchorToScreen => 'Ancorar à tela'; + @override String get anchorToScreenDescription => 'Exibir as legendas de texto nas faixas pretas abaixo de vídeos em tela ampla'; @override String get bold => 'Negrito'; @override String get italic => 'Itálico'; @override String get renderResolution => 'Resolução de renderização'; @@ -1013,6 +1047,7 @@ class _Translations$profiles$pt extends Translations$profiles$en { @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 tokenIdentityMismatch => 'O token do perfil do Plex foi associado a um servidor inesperado'; } // Path: connections @@ -1064,6 +1099,10 @@ class _Translations$discover$pt extends Translations$discover$en { @override String get tvShow => 'Série de TV'; @override String minutesLeft({required Object minutes}) => '${minutes} min restantes'; @override String get moreLikeThis => 'Títulos semelhantes'; + @override String titleCount({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('pt'))(n, + one: '${n} título', + other: '${n} títulos', + ); } // Path: errors @@ -1276,7 +1315,10 @@ class _Translations$explore$pt extends Translations$explore$en { @override String get characters => 'Personagens'; @override String get addToWatchlist => 'Adicionar à lista para assistir'; @override String get removeFromWatchlist => 'Remover da lista para assistir'; + @override String get addedToWatchlist => 'Adicionado à lista de interesses'; + @override String get removedFromWatchlist => 'Removido da lista de interesses'; @override String get watchlistUpdateFailed => 'Não foi possível atualizar a lista para assistir'; + @override String get watchlistNoMatch => 'Não foi possível associar este item a uma lista de interesses'; @override String get notInLibrary => 'Não está na sua biblioteca'; @override String get inTheseLibraries => 'Nestas bibliotecas'; @override String get checkingLibrary => 'Verificando sua biblioteca...'; @@ -1337,6 +1379,9 @@ class _Translations$liveTv$pt extends Translations$liveTv$en { @override String get watchChannel => 'Assistir ao canal'; @override String get favorites => 'Favoritos'; @override String get reorderFavorites => 'Reordenar favoritos'; + @override String get noFavoriteChannels => 'Nenhum canal favorito'; + @override String get noFavoriteChannelsHint => 'Mostre todos os canais e mantenha um canal pressionado para adicioná-lo aos favoritos.'; + @override String get showAllChannels => 'Mostrar todos os canais'; @override String get favoritesLoadFailed => 'Não foi possível carregar os favoritos. Verifique sua conexão e tente novamente.'; @override String get favoritesUpdateFailed => 'Não foi possível atualizar os favoritos. Verifique sua conexão e tente novamente.'; @override String get joinSession => 'Entrar na sessão em andamento'; @@ -1376,6 +1421,11 @@ class _Translations$liveTv$pt extends Translations$liveTv$en { @override String get guideReloadRequested => 'Atualização do guia solicitada'; @override String get rulesProcessRequested => 'Reavaliação de regras solicitada'; @override String get recordShow => 'Gravar programa'; + @override String startingInMinutes({required Object minutes}) => 'Começa em ${minutes} min'; + @override String dayAtTime({required Object day, required Object time}) => '${day} às ${time}'; + @override String invalidPlaybackData({required Object product}) => '${product} retornou dados inválidos de reprodução de TV ao Vivo'; + @override String get failedToStartChannel => 'Não foi possível iniciar o canal ao vivo'; + @override String get failedToBuildStreamUrl => 'Não foi possível gerar a URL da transmissão'; } // Path: collections @@ -1474,6 +1524,8 @@ class _Translations$music$pt extends Translations$music$en { @override String get repeat => 'Repetir'; @override String get repeatAll => 'Repetir tudo'; @override String get repeatOne => 'Repetir uma faixa'; + @override String get instantMixNoServer => 'Nenhum servidor está disponível para uma mistura instantânea'; + @override String noAudioUrl({required Object track}) => 'Nenhuma URL de áudio está disponível para ${track}'; } // Path: watchTogether @@ -1548,6 +1600,7 @@ class _Translations$watchTogether$pt extends Translations$watchTogether$en { @override String get removeRoom => 'Remover'; @override String get guestSwitchUnavailable => 'Não foi possível trocar — servidor indisponível para sincronização'; @override String get guestSwitchFailed => 'Não foi possível trocar — conteúdo não encontrado neste servidor'; + @override String get defaultDisplayName => 'Usuário'; } // Path: downloads @@ -1632,6 +1685,16 @@ class _Translations$downloads$pt extends Translations$downloads$en { @override String get syncRuleUnknownServer => 'Servidor desconhecido'; @override String get syncRuleListCreated => 'Regra de sincronização criada'; @override late final _Translations$downloads$backgroundWarning$pt backgroundWarning = _Translations$downloads$backgroundWarning$pt._(_root); + @override String get unknownShow => 'Série desconhecida'; + @override String get unknownSeason => 'Temporada desconhecida'; + @override String get unknownAlbum => 'Álbum desconhecido'; + @override String completedOfTotal({required Object completed, required Object total}) => '${completed}/${total} concluídos'; + @override String get errorFileNotFound => 'Arquivo não encontrado (404)'; + @override String get errorDownloadFailed => 'Falha no download'; + @override String errorPostProcessing({required Object error}) => 'Falha no pós-processamento: ${error}'; + @override String get notificationDownloading => 'Baixando...'; + @override String get notificationComplete => 'Download concluído'; + @override String get notificationPaused => 'Download pausado'; } // Path: shaders @@ -1672,6 +1735,7 @@ class _Translations$companionRemote$pt extends Translations$companionRemote$en { @override late final _Translations$companionRemote$pairing$pt pairing = _Translations$companionRemote$pairing$pt._(_root); @override late final _Translations$companionRemote$remote$pt remote = _Translations$companionRemote$remote$pt._(_root); @override late final _Translations$companionRemote$errors$pt errors = _Translations$companionRemote$errors$pt._(_root); + @override String get closedBeforeAuth => 'A conexão foi encerrada antes da autenticação'; } // Path: videoSettings @@ -1689,6 +1753,13 @@ class _Translations$videoSettings$pt extends Translations$videoSettings$en { @override String get audioSync => 'Sincronia de áudio'; @override String get subtitleSync => 'Sincronia de legendas'; @override String get hdr => 'HDR'; + @override String get hdrUnsupported => 'O HDR não está disponível aqui — este compositor da área de trabalho ou esta saída de vídeo não é compatível com ele.'; + @override String get hdrToneMapping => 'Mapeamento de tons HDR'; + @override String get hdrToneMappingCompositor => 'Compositor'; + @override String get hdrToneMappingCompositorDescription => 'Repassar os metadados HDR da fonte e deixar que o compositor da área de trabalho faça o mapeamento.'; + @override String get hdrToneMappingPlayer => 'Reprodutor'; + @override String get hdrToneMappingPlayerDescription => 'Mapear para o brilho máximo da tela no reprodutor e informar o resultado ao compositor.'; + @override String get hdrToneMappingFailed => 'Não foi possível alterar o mapeamento de tons HDR — o modo anterior continua ativo.'; @override String get audioOutput => 'Saída de áudio'; @override String get performanceOverlay => 'Painel de desempenho'; @override String get audioOutputDolbyAtmos => 'Dolby Atmos'; @@ -1742,6 +1813,16 @@ class _Translations$performanceOverlay$pt extends Translations$performanceOverla @override String get player => 'Reprodutor'; @override String get memory => 'Memória'; @override String get uiFps => 'UI FPS'; + @override String get fps => 'FPS'; + @override String get decoderAndroidHw => 'Android HW'; + @override String get decoderNvidiaHw => 'NVIDIA HW'; + @override String get decoderQualcommHw => 'Qualcomm HW'; + @override String get decoderMediatekHw => 'MediaTek HW'; + @override String get decoderExynosHw => 'Exynos HW'; + @override String get decoderSoftware => 'Software'; + @override String get decoderHardware => 'Hardware'; + @override String get tunnelingActive => 'Ativo'; + @override String dvRpuFailed({required Object converted, required Object failures}) => '${converted} (${failures} com falha)'; } // Path: externalPlayer @@ -1942,6 +2023,16 @@ class _Translations$seerr$pt extends Translations$seerr$en { @override String get statusPartiallyAvailable => 'Parcialmente disponível'; @override String get statusRequested => 'Solicitado'; @override String get statusProcessing => 'Processando'; + @override String couldNotReach({required Object url, required Object error}) => 'Não foi possível acessar ${url}: ${error}'; + @override String noInstanceAtUrl({required Object url, required Object status}) => 'Nenhuma instância do Seerr em ${url} (HTTP ${status})'; + @override String get notInitialized => 'Esta instância do Seerr não concluiu a configuração inicial'; + @override String get noPlexTokenForReauth => 'Nenhum token do Plex está disponível para entrar novamente'; + @override String get noStoredCredentials => 'Nenhuma credencial armazenada está disponível para entrar novamente'; + @override String get signInRejected => 'A entrada foi rejeitada'; + @override String get noSessionCookie => 'O Seerr não forneceu um cookie de sessão'; + @override String get freshCookieRejected => 'O Seerr rejeitou o novo cookie de sessão'; + @override String get noUserInformation => 'O Seerr não retornou informações do usuário'; + @override String get sessionRejectedAfterReauth => 'A sessão foi rejeitada após entrar novamente'; } // Path: services @@ -2002,6 +2093,24 @@ class _Translations$addServer$pt extends Translations$addServer$en { @override String connectToMediaBrowserCardSubtitleScoped({required Object product, required Object name}) => 'Entre no seu servidor ${product}. Vinculado a ${name}.'; @override String get borrowFromAnotherProfile => 'Pegar emprestado de outro perfil'; @override String get borrowFromAnotherProfileSubtitle => 'Reutilize a conexão de outro perfil. Perfis protegidos por PIN exigem PIN.'; + @override String get invalidCredentials => 'Usuário ou senha inválidos'; + @override String get authResponseNotJson => 'A resposta de autenticação não era um JSON válido'; + @override String get quickConnectRejected => 'O Quick Connect foi rejeitado pelo servidor'; + @override String get quickConnectNotJson => 'A resposta do Quick Connect não era um JSON válido'; + @override String get quickConnectMissingFields => 'A resposta do Quick Connect não contém um código ou segredo'; + @override String get quickConnectPollRejected => 'A consulta do Quick Connect foi rejeitada pelo servidor'; + @override String get serverTimedOut => 'O servidor não respondeu a tempo'; + @override String get responseNotJson => 'A resposta do servidor não era um JSON válido'; + @override String responseMissingIdentity({required Object product}) => 'A resposta não contém um ID ou nome de servidor — este é um servidor ${product}?'; + @override String probeFailed({required Object error}) => 'Não foi possível conectar ao servidor: ${error}'; + @override String enterAtLeastOneUrl({required Object product}) => 'Insira pelo menos uma URL de servidor ${product}'; + @override String noReachableServer({required Object product}) => 'Nenhum servidor ${product} acessível foi encontrado'; + @override String urlsPointToDifferentServers({required Object product}) => 'Estas URLs apontam para servidores ${product} diferentes'; + @override String urlDoesNotMatchServer({required Object product}) => 'Esta URL não corresponde ao servidor ${product}'; + @override String get redirectUnsupported => 'O servidor redirecionou para uma URL não compatível'; + @override String redirectDifferentHost({required Object product}) => 'O servidor redirecionou para outro host. Insira diretamente a URL final do ${product}.'; + @override String get redirectInsecure => 'O servidor redirecionou de HTTPS para uma URL insegura'; + @override String redirectUnsupportedEnterFinal({required Object product}) => 'O servidor redirecionou para uma URL não compatível. Insira diretamente a URL final do ${product}.'; } // Path: common.ratingSource @@ -2521,6 +2630,7 @@ class _Translations$services$deviceCode$pt extends Translations$services$deviceC // Translations @override String title({required Object service}) => 'Ativar o Plezy no ${service}'; + @override String get instructions => 'Leia o código QR ou acesse o endereço abaixo e insira este código:'; @override String openToActivate({required Object service}) => 'Abrir ${service} para ativar'; @override String get copyCode => 'Copiar código de ativação'; @override String get waitingForAuthorization => 'Aguardando autorização…'; @@ -2595,6 +2705,7 @@ extension on TranslationsPt { 'auth.quickConnectCancel' => 'Cancelar', 'auth.quickConnectExpired' => 'Quick Connect expirou. Tente novamente.', 'auth.localDataRecoveryRequired' => 'O Plezy não conseguiu recuperar com segurança os dados locais de acesso e de reproduções pendentes. Entre novamente.', + 'auth.pinCheckRejected' => 'A verificação do PIN do Plex foi rejeitada', 'common.cancel' => 'Cancelar', 'common.save' => 'Salvar', 'common.close' => 'Fechar', @@ -2651,6 +2762,9 @@ extension on TranslationsPt { 'common.ratingSource.trakt' => 'Trakt', 'common.ratingSource.rottenTomatoesCritic' => 'Críticos do Rotten Tomatoes', 'common.ratingSource.rottenTomatoesAudience' => 'Público do Rotten Tomatoes', + 'common.notAvailable' => 'N/D', + 'common.url' => 'URL', + 'common.letterKeys' => 'ABC', 'screens.licenses' => 'Licenças', 'screens.switchProfile' => 'Trocar Perfil', 'screens.subtitleStyling' => 'Estilo de Legendas', @@ -2890,6 +3004,8 @@ extension on TranslationsPt { 'settings.showNavBarLabels' => 'Mostrar Rótulos da Barra de Navegação', 'settings.showNavBarLabelsDescription' => 'Exibir rótulos de texto sob os ícones da barra de navegação', 'settings.startupSection' => 'Seção inicial', + 'settings.showExploreTab' => 'Mostrar aba Explorar', + 'settings.showExploreTabDescription' => 'Exibir a aba Explorar com conteúdo do Plex Discover e dos rastreadores conectados', 'settings.liveTvDefaultFavorites' => 'Canais favoritos por padrão', 'settings.liveTvDefaultFavoritesDescription' => 'Mostrar apenas os canais favoritos ao abrir a TV ao vivo', 'settings.display' => 'Tela', @@ -2901,6 +3017,7 @@ extension on TranslationsPt { 'settings.subtitlesAndConfig' => 'Legendas e configuração', 'settings.seekAndTiming' => 'Busca e tempo', 'settings.behavior' => 'Comportamento', + 'settings.exportDialogTitle' => 'Exportar configurações do Plezy', 'search.hint' => 'Buscar filmes, séries, músicas...', 'search.tryDifferentTerm' => 'Tente um termo de busca diferente', 'search.searchYourMedia' => 'Buscar suas mídias', @@ -3049,6 +3166,8 @@ extension on TranslationsPt { 'fileInfo.flagHearingImpaired' => 'Deficiência auditiva', 'fileInfo.flagDub' => 'Dublada', 'fileInfo.flagOriginal' => 'Original', + 'fileInfo.channelsMono' => 'Mono', + 'fileInfo.dolbyVisionProfile' => ({required Object profile}) => 'Perfil ${profile}', 'mediaMenu.markAsWatched' => 'Marcar como Assistido', 'mediaMenu.markAsUnwatched' => 'Marcar como Não Assistido', 'mediaMenu.removeFromContinueWatching' => 'Remover de Continuar Assistindo', @@ -3082,6 +3201,8 @@ extension on TranslationsPt { 'mediaMenu.rate' => 'Avaliar', 'mediaMenu.playFromBeginning' => 'Reproduzir do início', 'mediaMenu.playVersion' => 'Reproduzir versão...', + _ => null, + } ?? switch (path) { 'rateSheet.title' => 'Avaliar', 'rateSheet.server' => 'Servidor', 'rateSheet.favorite' => 'Favorito', @@ -3091,8 +3212,6 @@ extension on TranslationsPt { 'rateSheet.noConnectedServices' => 'Conecte um serviço nas Configurações para avaliar por lá.', 'accessibility.mediaCardMovie' => ({required Object title}) => '${title}, filme', 'accessibility.mediaCardShow' => ({required Object title}) => '${title}, série de TV', - _ => null, - } ?? switch (path) { 'accessibility.mediaCardEpisode' => ({required Object title, required Object episodeInfo}) => '${title}, ${episodeInfo}', 'accessibility.mediaCardSeason' => ({required Object title, required Object seasonInfo}) => '${title}, ${seasonInfo}', 'accessibility.mediaCardWatched' => 'assistido', @@ -3113,6 +3232,11 @@ extension on TranslationsPt { 'accessibility.alphabetScrollHint' => 'Deslize para cima ou para baixo para avançar por letra', 'accessibility.rowColumnPosition' => ({required Object row, required Object rowCount, required Object column, required Object columnCount}) => 'Linha ${row} de ${rowCount}, coluna ${column} de ${columnCount}', 'accessibility.rowPosition' => ({required Object row, required Object rowCount}) => 'Linha ${row} de ${rowCount}', + 'accessibility.autoScrollPlay' => 'Iniciar rolagem automática', + 'accessibility.autoScrollPause' => 'Pausar rolagem automática', + 'accessibility.hueShort' => 'M', + 'accessibility.saturationShort' => 'S', + 'accessibility.valueShort' => 'V', 'tooltips.shufflePlay' => 'Reprodução aleatória', 'tooltips.playTrailer' => 'Reproduzir trailer', 'tooltips.markAsWatched' => 'Marcar como assistido', @@ -3203,6 +3327,15 @@ extension on TranslationsPt { 'videoControls.subtitleDownloadedNotApplied' => 'A legenda foi baixada, mas não foi possível selecioná-la', 'videoControls.subtitleDownloadFailed' => 'Falha ao baixar legenda', 'videoControls.searchLanguages' => 'Pesquisar idiomas...', + 'videoControls.skipIntro' => 'Pular abertura', + 'videoControls.skipCredits' => 'Pular créditos', + 'videoControls.nextEpisode' => 'Próximo episódio', + 'videoControls.subtitleTrack' => ({required Object n}) => 'Faixa ${n}', + 'videoControls.subtitleFile' => ({required Object name}) => 'Legenda ${name}', + 'videoControls.forcedTrack' => ({required Object label}) => '${label} (Forçada)', + 'videoControls.osdSubtitlesOff' => 'Legendas: desativadas', + 'videoControls.osdSubtitles' => ({required Object track}) => 'Legendas: ${track}', + 'videoControls.osdAudio' => ({required Object track}) => 'Áudio: ${track}', 'messages.markedAsWatched' => 'Marcado como assistido', 'messages.markedAsUnwatched' => 'Marcado como não assistido', 'messages.markedAsWatchedOffline' => 'Marcado como assistido (será sincronizado quando online)', @@ -3252,9 +3385,18 @@ extension on TranslationsPt { 'messages.serverLimitBody' => 'Erro do servidor (HTTP 500). Um limite de largura de banda ou transcodificação provavelmente rejeitou esta sessão. Peça ao proprietário do servidor para ajustá-lo.', 'messages.mediaUnreadableTitle' => 'Arquivo indisponível', 'messages.mediaUnreadableBody' => 'O servidor encontrou este item, mas não conseguiu ler o arquivo (HTTP 404). O arquivo provavelmente foi movido, excluído ou o armazenamento está offline. Peça ao responsável pelo servidor para verificar o arquivo e reexaminar a biblioteca.', + 'messages.serverBusyTitle' => 'Transmissão indisponível', + 'messages.serverBusyBody' => 'O servidor continuou se recusando a transmitir este arquivo (HTTP 503). Ele pode estar reiniciando ou ocupado, ou o armazenamento do arquivo pode estar offline. Tente novamente em instantes — se isso continuar acontecendo, peça ao proprietário do servidor para verificar o servidor e o armazenamento do arquivo.', 'messages.logsUploaded' => 'Logs enviados', 'messages.logsUploadFailed' => 'Falha ao enviar logs', 'messages.logId' => 'ID do log', + 'messages.burnedSubtitlesUseMenu' => 'As legendas estão incorporadas a esta transmissão. Altere-as no menu de legendas.', + 'messages.noVideoUrl' => 'Nenhuma URL de vídeo disponível', + 'messages.playbackNoMediaSources' => 'O servidor não retornou nenhuma fonte de mídia reproduzível', + 'messages.playbackDataNotPrepared' => 'A reprodução foi iniciada antes que os dados estivessem prontos', + 'messages.streamSelectionUnavailable' => 'A seleção de fluxos não está disponível para esta fonte', + 'messages.streamSelectionFailed' => 'Não foi possível aplicar os fluxos selecionados', + 'messages.serverUnavailableForProfile' => 'Nenhum servidor está disponível para o perfil ativo', 'subtitlingStyling.text' => 'Texto', 'subtitlingStyling.border' => 'Borda', 'subtitlingStyling.background' => 'Fundo', @@ -3271,6 +3413,8 @@ extension on TranslationsPt { 'subtitlingStyling.overrideStrip' => 'Remover estilo', 'subtitlingStyling.positionTop' => 'Superior', 'subtitlingStyling.positionBottom' => 'Inferior', + 'subtitlingStyling.anchorToScreen' => 'Ancorar à tela', + 'subtitlingStyling.anchorToScreenDescription' => 'Exibir as legendas de texto nas faixas pretas abaixo de vídeos em tela ampla', 'subtitlingStyling.bold' => 'Negrito', 'subtitlingStyling.italic' => 'Itálico', 'subtitlingStyling.renderResolution' => 'Resolução de renderização', @@ -3353,6 +3497,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.tokenIdentityMismatch' => 'O token do perfil do Plex foi associado a um servidor inesperado', 'connections.sectionTitle' => 'Conexões', 'connections.addConnection' => 'Adicionar conexão', 'connections.addConnectionSubtitleNoProfile' => 'Entre com Plex ou conecte um servidor Jellyfin', @@ -3386,6 +3531,7 @@ extension on TranslationsPt { 'discover.tvShow' => 'Série de TV', 'discover.minutesLeft' => ({required Object minutes}) => '${minutes} min restantes', 'discover.moreLikeThis' => 'Títulos semelhantes', + 'discover.titleCount' => ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('pt'))(n, one: '${n} título', other: '${n} títulos', ), 'errors.searchFailed' => ({required Object error}) => 'Falha na busca: ${error}', 'errors.searchUnavailable' => 'A busca não conseguiu alcançar nenhum servidor de mídia.', 'errors.connectionTimeout' => ({required Object context}) => 'Tempo de conexão esgotado ao carregar ${context}', @@ -3558,7 +3704,10 @@ extension on TranslationsPt { 'explore.characters' => 'Personagens', 'explore.addToWatchlist' => 'Adicionar à lista para assistir', 'explore.removeFromWatchlist' => 'Remover da lista para assistir', + 'explore.addedToWatchlist' => 'Adicionado à lista de interesses', + 'explore.removedFromWatchlist' => 'Removido da lista de interesses', 'explore.watchlistUpdateFailed' => 'Não foi possível atualizar a lista para assistir', + 'explore.watchlistNoMatch' => 'Não foi possível associar este item a uma lista de interesses', 'explore.notInLibrary' => 'Não está na sua biblioteca', 'explore.inTheseLibraries' => 'Nestas bibliotecas', 'explore.checkingLibrary' => 'Verificando sua biblioteca...', @@ -3566,6 +3715,8 @@ extension on TranslationsPt { 'explore.emptyMessage' => ({required Object source}) => 'As linhas de ${source} aparecerão aqui quando tiverem conteúdo.', 'explore.searchHint' => ({required Object source}) => 'Buscar em ${source}', 'explore.searchEmpty' => ({required Object query}) => 'Nenhum resultado para "${query}"', + _ => null, + } ?? switch (path) { 'explore.searchPrompt' => ({required Object source}) => 'Busque filmes e séries em ${source}.', 'explore.searchFailed' => 'Falha na busca. Verifique sua conexão e tente novamente.', 'explore.badge.rankPopular' => ({required Object n}) => '#${n} popular', @@ -3605,8 +3756,6 @@ extension on TranslationsPt { 'explore.stats.completed' => ({required Object n}) => '${n} concluíram', 'explore.stats.onHold' => ({required Object n}) => '${n} em pausa', 'explore.stats.dropped' => ({required Object n}) => '${n} abandonaram', - _ => null, - } ?? switch (path) { 'explore.season.winter' => 'Inverno', 'explore.season.spring' => 'Primavera', 'explore.season.summer' => 'Verão', @@ -3703,6 +3852,9 @@ extension on TranslationsPt { 'liveTv.watchChannel' => 'Assistir ao canal', 'liveTv.favorites' => 'Favoritos', 'liveTv.reorderFavorites' => 'Reordenar favoritos', + 'liveTv.noFavoriteChannels' => 'Nenhum canal favorito', + 'liveTv.noFavoriteChannelsHint' => 'Mostre todos os canais e mantenha um canal pressionado para adicioná-lo aos favoritos.', + 'liveTv.showAllChannels' => 'Mostrar todos os canais', 'liveTv.favoritesLoadFailed' => 'Não foi possível carregar os favoritos. Verifique sua conexão e tente novamente.', 'liveTv.favoritesUpdateFailed' => 'Não foi possível atualizar os favoritos. Verifique sua conexão e tente novamente.', 'liveTv.joinSession' => 'Entrar na sessão em andamento', @@ -3742,6 +3894,11 @@ extension on TranslationsPt { 'liveTv.guideReloadRequested' => 'Atualização do guia solicitada', 'liveTv.rulesProcessRequested' => 'Reavaliação de regras solicitada', 'liveTv.recordShow' => 'Gravar programa', + 'liveTv.startingInMinutes' => ({required Object minutes}) => 'Começa em ${minutes} min', + 'liveTv.dayAtTime' => ({required Object day, required Object time}) => '${day} às ${time}', + 'liveTv.invalidPlaybackData' => ({required Object product}) => '${product} retornou dados inválidos de reprodução de TV ao Vivo', + 'liveTv.failedToStartChannel' => 'Não foi possível iniciar o canal ao vivo', + 'liveTv.failedToBuildStreamUrl' => 'Não foi possível gerar a URL da transmissão', 'collections.title' => 'Coleções', 'collections.collection' => 'Coleção', 'collections.empty' => 'A coleção está vazia', @@ -3810,6 +3967,8 @@ extension on TranslationsPt { 'music.repeat' => 'Repetir', 'music.repeatAll' => 'Repetir tudo', 'music.repeatOne' => 'Repetir uma faixa', + 'music.instantMixNoServer' => 'Nenhum servidor está disponível para uma mistura instantânea', + 'music.noAudioUrl' => ({required Object track}) => 'Nenhuma URL de áudio está disponível para ${track}', 'watchTogether.title' => 'Assistir Juntos', 'watchTogether.description' => 'Assista a conteúdos sincronizados com amigos e familiares', 'watchTogether.createSession' => 'Criar sessão', @@ -3875,6 +4034,7 @@ extension on TranslationsPt { 'watchTogether.removeRoom' => 'Remover', 'watchTogether.guestSwitchUnavailable' => 'Não foi possível trocar — servidor indisponível para sincronização', 'watchTogether.guestSwitchFailed' => 'Não foi possível trocar — conteúdo não encontrado neste servidor', + 'watchTogether.defaultDisplayName' => 'Usuário', 'downloads.title' => 'Downloads', 'downloads.manage' => 'Gerenciar', 'downloads.tvShows' => 'Séries de TV', @@ -3975,6 +4135,16 @@ extension on TranslationsPt { 'downloads.backgroundWarning.statusUnknown' => 'Ainda não verificado', 'downloads.backgroundWarning.settingsUnavailable' => 'Não foi possível abrir as configurações do sistema neste dispositivo', 'downloads.backgroundWarning.linkUnavailable' => 'Não foi possível abrir dontkillmyapp.com neste dispositivo', + 'downloads.unknownShow' => 'Série desconhecida', + 'downloads.unknownSeason' => 'Temporada desconhecida', + 'downloads.unknownAlbum' => 'Álbum desconhecido', + 'downloads.completedOfTotal' => ({required Object completed, required Object total}) => '${completed}/${total} concluídos', + 'downloads.errorFileNotFound' => 'Arquivo não encontrado (404)', + 'downloads.errorDownloadFailed' => 'Falha no download', + 'downloads.errorPostProcessing' => ({required Object error}) => 'Falha no pós-processamento: ${error}', + 'downloads.notificationDownloading' => 'Baixando...', + 'downloads.notificationComplete' => 'Download concluído', + 'downloads.notificationPaused' => 'Download pausado', 'shaders.title' => 'Shaders', 'shaders.noShaderDescription' => 'Sem aprimoramento de vídeo', 'shaders.nvscalerDescription' => 'Dimensionamento de imagem da NVIDIA para vídeos mais nítidos', @@ -4054,14 +4224,24 @@ extension on TranslationsPt { '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', + 'companionRemote.closedBeforeAuth' => 'A conexão foi encerrada antes da autenticação', 'videoSettings.playbackSpeed' => 'Velocidade de Reprodução', 'videoSettings.normalSpeed' => 'Normal', 'videoSettings.sleepTimerActive' => ({required Object duration}) => 'Ativo (${duration})', 'videoSettings.zoom' => 'Zoom', + _ => null, + } ?? switch (path) { 'videoSettings.sleepTimer' => 'Temporizador de suspensão', 'videoSettings.audioSync' => 'Sincronia de áudio', 'videoSettings.subtitleSync' => 'Sincronia de legendas', 'videoSettings.hdr' => 'HDR', + 'videoSettings.hdrUnsupported' => 'O HDR não está disponível aqui — este compositor da área de trabalho ou esta saída de vídeo não é compatível com ele.', + 'videoSettings.hdrToneMapping' => 'Mapeamento de tons HDR', + 'videoSettings.hdrToneMappingCompositor' => 'Compositor', + 'videoSettings.hdrToneMappingCompositorDescription' => 'Repassar os metadados HDR da fonte e deixar que o compositor da área de trabalho faça o mapeamento.', + 'videoSettings.hdrToneMappingPlayer' => 'Reprodutor', + 'videoSettings.hdrToneMappingPlayerDescription' => 'Mapear para o brilho máximo da tela no reprodutor e informar o resultado ao compositor.', + 'videoSettings.hdrToneMappingFailed' => 'Não foi possível alterar o mapeamento de tons HDR — o modo anterior continua ativo.', 'videoSettings.audioOutput' => 'Saída de áudio', 'videoSettings.performanceOverlay' => 'Painel de desempenho', 'videoSettings.audioOutputDolbyAtmos' => 'Dolby Atmos', @@ -4106,6 +4286,16 @@ extension on TranslationsPt { 'performanceOverlay.player' => 'Reprodutor', 'performanceOverlay.memory' => 'Memória', 'performanceOverlay.uiFps' => 'UI FPS', + 'performanceOverlay.fps' => 'FPS', + 'performanceOverlay.decoderAndroidHw' => 'Android HW', + 'performanceOverlay.decoderNvidiaHw' => 'NVIDIA HW', + 'performanceOverlay.decoderQualcommHw' => 'Qualcomm HW', + 'performanceOverlay.decoderMediatekHw' => 'MediaTek HW', + 'performanceOverlay.decoderExynosHw' => 'Exynos HW', + 'performanceOverlay.decoderSoftware' => 'Software', + 'performanceOverlay.decoderHardware' => 'Hardware', + 'performanceOverlay.tunnelingActive' => 'Ativo', + 'performanceOverlay.dvRpuFailed' => ({required Object converted, required Object failures}) => '${converted} (${failures} com falha)', 'externalPlayer.title' => 'Reprodutor externo', 'externalPlayer.useExternalPlayer' => 'Usar reprodutor externo', 'externalPlayer.useExternalPlayerDescription' => 'Abrir vídeos em outro app', @@ -4119,8 +4309,6 @@ extension on TranslationsPt { 'externalPlayer.playerPackage' => 'Nome do pacote', 'externalPlayer.playerUrlScheme' => 'Esquema de URL', 'externalPlayer.off' => 'Desativado', - _ => null, - } ?? switch (path) { 'externalPlayer.launchFailed' => 'Falha ao abrir o reprodutor externo', 'externalPlayer.appNotInstalled' => ({required Object name}) => '${name} não está instalado', 'externalPlayer.playInExternalPlayer' => 'Reproduzir no reprodutor externo', @@ -4254,6 +4442,16 @@ extension on TranslationsPt { 'seerr.statusPartiallyAvailable' => 'Parcialmente disponível', 'seerr.statusRequested' => 'Solicitado', 'seerr.statusProcessing' => 'Processando', + 'seerr.couldNotReach' => ({required Object url, required Object error}) => 'Não foi possível acessar ${url}: ${error}', + 'seerr.noInstanceAtUrl' => ({required Object url, required Object status}) => 'Nenhuma instância do Seerr em ${url} (HTTP ${status})', + 'seerr.notInitialized' => 'Esta instância do Seerr não concluiu a configuração inicial', + 'seerr.noPlexTokenForReauth' => 'Nenhum token do Plex está disponível para entrar novamente', + 'seerr.noStoredCredentials' => 'Nenhuma credencial armazenada está disponível para entrar novamente', + 'seerr.signInRejected' => 'A entrada foi rejeitada', + 'seerr.noSessionCookie' => 'O Seerr não forneceu um cookie de sessão', + 'seerr.freshCookieRejected' => 'O Seerr rejeitou o novo cookie de sessão', + 'seerr.noUserInformation' => 'O Seerr não retornou informações do usuário', + 'seerr.sessionRejectedAfterReauth' => 'A sessão foi rejeitada após entrar novamente', 'services.title' => 'Serviços', 'services.hubSubtitle' => 'Sincronize o progresso de exibição e solicite novos títulos.', 'services.notConnected' => 'Não conectado', @@ -4269,6 +4467,7 @@ extension on TranslationsPt { 'services.names.seerr' => 'Seerr', 'services.names.mdblist' => 'MDBList', 'services.deviceCode.title' => ({required Object service}) => 'Ativar o Plezy no ${service}', + 'services.deviceCode.instructions' => 'Leia o código QR ou acesse o endereço abaixo e insira este código:', 'services.deviceCode.openToActivate' => ({required Object service}) => 'Abrir ${service} para ativar', 'services.deviceCode.copyCode' => 'Copiar código de ativação', 'services.deviceCode.waitingForAuthorization' => 'Aguardando autorização…', @@ -4318,6 +4517,24 @@ extension on TranslationsPt { 'addServer.connectToMediaBrowserCardSubtitleScoped' => ({required Object product, required Object name}) => 'Entre no seu servidor ${product}. Vinculado a ${name}.', 'addServer.borrowFromAnotherProfile' => 'Pegar emprestado de outro perfil', 'addServer.borrowFromAnotherProfileSubtitle' => 'Reutilize a conexão de outro perfil. Perfis protegidos por PIN exigem PIN.', + 'addServer.invalidCredentials' => 'Usuário ou senha inválidos', + 'addServer.authResponseNotJson' => 'A resposta de autenticação não era um JSON válido', + 'addServer.quickConnectRejected' => 'O Quick Connect foi rejeitado pelo servidor', + 'addServer.quickConnectNotJson' => 'A resposta do Quick Connect não era um JSON válido', + 'addServer.quickConnectMissingFields' => 'A resposta do Quick Connect não contém um código ou segredo', + 'addServer.quickConnectPollRejected' => 'A consulta do Quick Connect foi rejeitada pelo servidor', + 'addServer.serverTimedOut' => 'O servidor não respondeu a tempo', + 'addServer.responseNotJson' => 'A resposta do servidor não era um JSON válido', + 'addServer.responseMissingIdentity' => ({required Object product}) => 'A resposta não contém um ID ou nome de servidor — este é um servidor ${product}?', + 'addServer.probeFailed' => ({required Object error}) => 'Não foi possível conectar ao servidor: ${error}', + 'addServer.enterAtLeastOneUrl' => ({required Object product}) => 'Insira pelo menos uma URL de servidor ${product}', + 'addServer.noReachableServer' => ({required Object product}) => 'Nenhum servidor ${product} acessível foi encontrado', + 'addServer.urlsPointToDifferentServers' => ({required Object product}) => 'Estas URLs apontam para servidores ${product} diferentes', + 'addServer.urlDoesNotMatchServer' => ({required Object product}) => 'Esta URL não corresponde ao servidor ${product}', + 'addServer.redirectUnsupported' => 'O servidor redirecionou para uma URL não compatível', + 'addServer.redirectDifferentHost' => ({required Object product}) => 'O servidor redirecionou para outro host. Insira diretamente a URL final do ${product}.', + 'addServer.redirectInsecure' => 'O servidor redirecionou de HTTPS para uma URL insegura', + 'addServer.redirectUnsupportedEnterFinal' => ({required Object product}) => 'O servidor redirecionou para uma URL não compatível. Insira diretamente a URL final do ${product}.', _ => null, }; } diff --git a/lib/i18n/strings_ru.g.dart b/lib/i18n/strings_ru.g.dart index b4732901..759d4809 100644 --- a/lib/i18n/strings_ru.g.dart +++ b/lib/i18n/strings_ru.g.dart @@ -123,6 +123,7 @@ class _Translations$auth$ru extends Translations$auth$en { @override String get quickConnectCancel => 'Отмена'; @override String get quickConnectExpired => 'Срок действия Quick Connect истёк. Попробуйте снова.'; @override String get localDataRecoveryRequired => 'Plezy не удалось безопасно восстановить данные локального входа и несинхронизированные данные о воспроизведении. Войдите снова.'; + @override String get pinCheckRejected => 'Проверка PIN-кода Plex была отклонена'; } // Path: common @@ -178,6 +179,9 @@ class _Translations$common$ru extends Translations$common$en { @override String get exitFullscreen => 'Выйти из полноэкранного режима'; @override String get pressBackAgainToExit => 'Нажмите ещё раз для выхода'; @override late final _Translations$common$ratingSource$ru ratingSource = _Translations$common$ratingSource$ru._(_root); + @override String get notAvailable => 'Н/Д'; + @override String get url => 'URL'; + @override String get letterKeys => 'АБВ'; } // Path: screens @@ -444,6 +448,8 @@ class _Translations$settings$ru extends Translations$settings$en { @override String get showNavBarLabels => 'Показывать подписи панели навигации'; @override String get showNavBarLabelsDescription => 'Отображать текстовые подписи под иконками панели навигации'; @override String get startupSection => 'Начальный раздел'; + @override String get showExploreTab => 'Показывать вкладку «Обзор»'; + @override String get showExploreTabDescription => 'Показывать вкладку «Обзор» с контентом из Plex Discover и подключённых трекеров'; @override String get liveTvDefaultFavorites => 'Избранные каналы по умолчанию'; @override String get liveTvDefaultFavoritesDescription => 'Показывать только избранные каналы при открытии ТВ'; @override String get display => 'Экран'; @@ -455,6 +461,7 @@ class _Translations$settings$ru extends Translations$settings$en { @override String get subtitlesAndConfig => 'Субтитры и конфигурация'; @override String get seekAndTiming => 'Перемотка и время'; @override String get behavior => 'Поведение'; + @override String get exportDialogTitle => 'Экспорт настроек Plezy'; } // Path: search @@ -606,6 +613,8 @@ class _Translations$fileInfo$ru extends Translations$fileInfo$en { @override String get flagHearingImpaired => 'Для слабослышащих'; @override String get flagDub => 'Дубляж'; @override String get flagOriginal => 'Оригинал'; + @override String get channelsMono => 'Моно'; + @override String dolbyVisionProfile({required Object profile}) => 'Профиль ${profile}'; } // Path: mediaMenu @@ -710,6 +719,11 @@ class _Translations$accessibility$ru extends Translations$accessibility$en { @override String get alphabetScrollHint => 'Проведите вверх или вниз для перехода по буквам'; @override String rowColumnPosition({required Object row, required Object rowCount, required Object column, required Object columnCount}) => 'Строка ${row} из ${rowCount}, столбец ${column} из ${columnCount}'; @override String rowPosition({required Object row, required Object rowCount}) => 'Строка ${row} из ${rowCount}'; + @override String get autoScrollPlay => 'Запустить автопрокрутку'; + @override String get autoScrollPause => 'Приостановить автопрокрутку'; + @override String get hueShort => 'H'; + @override String get saturationShort => 'S'; + @override String get valueShort => 'V'; } // Path: tooltips @@ -821,6 +835,15 @@ class _Translations$videoControls$ru extends Translations$videoControls$en { @override String get subtitleDownloadedNotApplied => 'Субтитры загружены, но их не удалось выбрать'; @override String get subtitleDownloadFailed => 'Не удалось загрузить субтитры'; @override String get searchLanguages => 'Поиск языков...'; + @override String get skipIntro => 'Пропустить заставку'; + @override String get skipCredits => 'Пропустить титры'; + @override String get nextEpisode => 'Следующий эпизод'; + @override String subtitleTrack({required Object n}) => 'Дорожка ${n}'; + @override String subtitleFile({required Object name}) => 'Субтитры ${name}'; + @override String forcedTrack({required Object label}) => '${label} (принудительная)'; + @override String get osdSubtitlesOff => 'Субтитры: выкл.'; + @override String osdSubtitles({required Object track}) => 'Субтитры: ${track}'; + @override String osdAudio({required Object track}) => 'Аудио: ${track}'; } // Path: messages @@ -884,9 +907,18 @@ class _Translations$messages$ru extends Translations$messages$en { @override String get serverLimitBody => 'Ошибка сервера (HTTP 500). Лимит пропускной способности/транскодирования, вероятно, отклонил сессию. Попросите владельца изменить настройки.'; @override String get mediaUnreadableTitle => 'Файл недоступен'; @override String get mediaUnreadableBody => 'Сервер нашёл этот элемент, но не смог прочитать его файл (HTTP 404). Вероятно, файл был перемещён, удалён или его хранилище недоступно. Попросите владельца сервера проверить файл и пересканировать библиотеку.'; + @override String get serverBusyTitle => 'Поток недоступен'; + @override String get serverBusyBody => 'Сервер продолжает отклонять запросы на потоковую передачу этого файла (HTTP 503). Возможно, он перезапускается, перегружен или хранилище с файлом недоступно. Повторите попытку через некоторое время. Если это продолжает происходить, попросите владельца сервера проверить сервер и хранилище с файлом.'; @override String get logsUploaded => 'Логи загружены'; @override String get logsUploadFailed => 'Не удалось загрузить логи'; @override String get logId => 'ID лога'; + @override String get burnedSubtitlesUseMenu => 'Субтитры встроены в этот поток. Изменить их можно в меню субтитров.'; + @override String get noVideoUrl => 'URL видео недоступен'; + @override String get playbackNoMediaSources => 'Сервер не вернул пригодных для воспроизведения медиаисточников'; + @override String get playbackDataNotPrepared => 'Воспроизведение началось до того, как данные были готовы'; + @override String get streamSelectionUnavailable => 'Выбор потоков недоступен для этого источника'; + @override String get streamSelectionFailed => 'Не удалось применить выбранные потоки'; + @override String get serverUnavailableForProfile => 'Для активного профиля нет доступных серверов'; } // Path: subtitlingStyling @@ -912,6 +944,8 @@ class _Translations$subtitlingStyling$ru extends Translations$subtitlingStyling$ @override String get overrideStrip => 'Удалить стили'; @override String get positionTop => 'Сверху'; @override String get positionBottom => 'Снизу'; + @override String get anchorToScreen => 'Привязка к экрану'; + @override String get anchorToScreenDescription => 'Показывать текстовые субтитры в чёрных полосах под широкоформатным видео'; @override String get bold => 'Жирный'; @override String get italic => 'Курсив'; @override String get renderResolution => 'Разрешение отрисовки'; @@ -1021,6 +1055,7 @@ class _Translations$profiles$ru extends Translations$profiles$en { @override String get pinExplain => 'Для переключения профилей нужен 4-значный PIN.'; @override String get continueButton => 'Продолжить'; @override String get pinsDontMatch => 'PIN-коды не совпадают'; + @override String get tokenIdentityMismatch => 'Токен профиля Plex указал на неожиданный сервер'; } // Path: connections @@ -1072,6 +1107,12 @@ class _Translations$discover$ru extends Translations$discover$en { @override String get tvShow => 'Сериал'; @override String minutesLeft({required Object minutes}) => 'Осталось ${minutes} мин'; @override String get moreLikeThis => 'Похожее'; + @override String titleCount({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('ru'))(n, + one: '${n} название', + few: '${n} названия', + many: '${n} названий', + other: '${n} названия', + ); } // Path: errors @@ -1286,7 +1327,10 @@ class _Translations$explore$ru extends Translations$explore$en { @override String get characters => 'Персонажи'; @override String get addToWatchlist => 'Добавить в список для просмотра'; @override String get removeFromWatchlist => 'Удалить из списка для просмотра'; + @override String get addedToWatchlist => 'Добавлено в список просмотра'; + @override String get removedFromWatchlist => 'Удалено из списка просмотра'; @override String get watchlistUpdateFailed => 'Не удалось обновить список для просмотра'; + @override String get watchlistNoMatch => 'Не удалось сопоставить этот элемент со списком просмотра'; @override String get notInLibrary => 'Нет в вашей библиотеке'; @override String get inTheseLibraries => 'В этих библиотеках'; @override String get checkingLibrary => 'Проверка вашей библиотеки...'; @@ -1349,6 +1393,9 @@ class _Translations$liveTv$ru extends Translations$liveTv$en { @override String get watchChannel => 'Смотреть канал'; @override String get favorites => 'Избранное'; @override String get reorderFavorites => 'Изменить порядок избранного'; + @override String get noFavoriteChannels => 'Нет избранных каналов'; + @override String get noFavoriteChannelsHint => 'Покажите все каналы, затем нажмите и удерживайте канал, чтобы добавить его в избранное.'; + @override String get showAllChannels => 'Показать все каналы'; @override String get favoritesLoadFailed => 'Не удалось загрузить избранное. Проверьте подключение и повторите попытку.'; @override String get favoritesUpdateFailed => 'Не удалось обновить избранное. Проверьте подключение и повторите попытку.'; @override String get joinSession => 'Присоединиться к текущему сеансу'; @@ -1388,6 +1435,11 @@ class _Translations$liveTv$ru extends Translations$liveTv$en { @override String get guideReloadRequested => 'Запрошено обновление гайда'; @override String get rulesProcessRequested => 'Запрошен пересчёт правил'; @override String get recordShow => 'Записать передачу'; + @override String startingInMinutes({required Object minutes}) => 'Начало через ${minutes} мин'; + @override String dayAtTime({required Object day, required Object time}) => '${day} в ${time}'; + @override String invalidPlaybackData({required Object product}) => '${product} вернул некорректные данные для воспроизведения ТВ в прямом эфире'; + @override String get failedToStartChannel => 'Не удалось запустить канал в прямом эфире'; + @override String get failedToBuildStreamUrl => 'Не удалось сформировать URL потока'; } // Path: collections @@ -1488,6 +1540,8 @@ class _Translations$music$ru extends Translations$music$en { @override String get repeat => 'Повтор'; @override String get repeatAll => 'Повторять все'; @override String get repeatOne => 'Повторять один'; + @override String get instantMixNoServer => 'Нет доступного сервера для мгновенного микса'; + @override String noAudioUrl({required Object track}) => 'Для трека ${track} нет доступного URL аудио'; } // Path: watchTogether @@ -1562,6 +1616,7 @@ class _Translations$watchTogether$ru extends Translations$watchTogether$en { @override String get removeRoom => 'Удалить'; @override String get guestSwitchUnavailable => 'Не удалось переключиться — сервер недоступен для синхронизации'; @override String get guestSwitchFailed => 'Не удалось переключиться — содержимое не найдено на этом сервере'; + @override String get defaultDisplayName => 'Пользователь'; } // Path: downloads @@ -1646,6 +1701,16 @@ class _Translations$downloads$ru extends Translations$downloads$en { @override String get syncRuleUnknownServer => 'Неизвестный сервер'; @override String get syncRuleListCreated => 'Правило синхронизации создано'; @override late final _Translations$downloads$backgroundWarning$ru backgroundWarning = _Translations$downloads$backgroundWarning$ru._(_root); + @override String get unknownShow => 'Неизвестный сериал'; + @override String get unknownSeason => 'Неизвестный сезон'; + @override String get unknownAlbum => 'Неизвестный альбом'; + @override String completedOfTotal({required Object completed, required Object total}) => 'Завершено: ${completed}/${total}'; + @override String get errorFileNotFound => 'Файл не найден (404)'; + @override String get errorDownloadFailed => 'Не удалось выполнить загрузку'; + @override String errorPostProcessing({required Object error}) => 'Не удалось выполнить постобработку: ${error}'; + @override String get notificationDownloading => 'Загрузка...'; + @override String get notificationComplete => 'Загрузка завершена'; + @override String get notificationPaused => 'Загрузка приостановлена'; } // Path: shaders @@ -1686,6 +1751,7 @@ class _Translations$companionRemote$ru extends Translations$companionRemote$en { @override late final _Translations$companionRemote$pairing$ru pairing = _Translations$companionRemote$pairing$ru._(_root); @override late final _Translations$companionRemote$remote$ru remote = _Translations$companionRemote$remote$ru._(_root); @override late final _Translations$companionRemote$errors$ru errors = _Translations$companionRemote$errors$ru._(_root); + @override String get closedBeforeAuth => 'Соединение было закрыто до аутентификации'; } // Path: videoSettings @@ -1703,6 +1769,13 @@ class _Translations$videoSettings$ru extends Translations$videoSettings$en { @override String get audioSync => 'Синхронизация аудио'; @override String get subtitleSync => 'Синхронизация субтитров'; @override String get hdr => 'HDR'; + @override String get hdrUnsupported => 'HDR здесь недоступен: этот композитор рабочего стола или видеовыход не поддерживает его передачу.'; + @override String get hdrToneMapping => 'Тональное отображение HDR'; + @override String get hdrToneMappingCompositor => 'Композитор'; + @override String get hdrToneMappingCompositorDescription => 'Передавать метаданные HDR источника без изменений, чтобы тональное отображение выполнял композитор рабочего стола.'; + @override String get hdrToneMappingPlayer => 'Проигрыватель'; + @override String get hdrToneMappingPlayerDescription => 'Выполнять тональное отображение в проигрывателе с учётом пиковой яркости дисплея, а затем передавать результат композитору.'; + @override String get hdrToneMappingFailed => 'Не удалось изменить тональное отображение HDR — предыдущий режим по-прежнему активен.'; @override String get audioOutput => 'Аудиовыход'; @override String get performanceOverlay => 'Оверлей производительности'; @override String get audioOutputDolbyAtmos => 'Dolby Atmos'; @@ -1756,6 +1829,16 @@ class _Translations$performanceOverlay$ru extends Translations$performanceOverla @override String get player => 'Плеер'; @override String get memory => 'Память'; @override String get uiFps => 'UI FPS'; + @override String get fps => 'FPS'; + @override String get decoderAndroidHw => 'Android, аппаратный'; + @override String get decoderNvidiaHw => 'NVIDIA, аппаратный'; + @override String get decoderQualcommHw => 'Qualcomm, аппаратный'; + @override String get decoderMediatekHw => 'MediaTek, аппаратный'; + @override String get decoderExynosHw => 'Exynos, аппаратный'; + @override String get decoderSoftware => 'Программный'; + @override String get decoderHardware => 'Аппаратный'; + @override String get tunnelingActive => 'Активно'; + @override String dvRpuFailed({required Object converted, required Object failures}) => '${converted} (ошибок: ${failures})'; } // Path: externalPlayer @@ -1956,6 +2039,16 @@ class _Translations$seerr$ru extends Translations$seerr$en { @override String get statusPartiallyAvailable => 'Частично доступно'; @override String get statusRequested => 'Запрошено'; @override String get statusProcessing => 'Обработка'; + @override String couldNotReach({required Object url, required Object error}) => 'Не удалось связаться с ${url}: ${error}'; + @override String noInstanceAtUrl({required Object url, required Object status}) => 'По адресу ${url} нет экземпляра Seerr (HTTP ${status})'; + @override String get notInitialized => 'Первоначальная настройка этого экземпляра Seerr не завершена'; + @override String get noPlexTokenForReauth => 'Нет токена Plex для повторного входа'; + @override String get noStoredCredentials => 'Нет сохранённых учётных данных для повторного входа'; + @override String get signInRejected => 'Вход был отклонён'; + @override String get noSessionCookie => 'Seerr не выдал cookie-файл сеанса'; + @override String get freshCookieRejected => 'Seerr отклонил новый cookie-файл сеанса'; + @override String get noUserInformation => 'Seerr не вернул сведения о пользователе'; + @override String get sessionRejectedAfterReauth => 'Сеанс был отклонён после повторного входа'; } // Path: services @@ -2016,6 +2109,24 @@ class _Translations$addServer$ru extends Translations$addServer$en { @override String connectToMediaBrowserCardSubtitleScoped({required Object product, required Object name}) => 'Войдите на свой сервер ${product}. Будет привязано к ${name}.'; @override String get borrowFromAnotherProfile => 'Использовать подключение другого профиля'; @override String get borrowFromAnotherProfileSubtitle => 'Повторно используйте подключение другого профиля. Для защищённых профилей потребуется PIN.'; + @override String get invalidCredentials => 'Неверное имя пользователя или пароль'; + @override String get authResponseNotJson => 'Ответ аутентификации не является допустимым JSON'; + @override String get quickConnectRejected => 'Quick Connect был отклонён сервером'; + @override String get quickConnectNotJson => 'Ответ Quick Connect не является допустимым JSON'; + @override String get quickConnectMissingFields => 'В ответе Quick Connect отсутствует код или секрет'; + @override String get quickConnectPollRejected => 'Опрос Quick Connect был отклонён сервером'; + @override String get serverTimedOut => 'Сервер не ответил вовремя'; + @override String get responseNotJson => 'Ответ сервера не является допустимым JSON'; + @override String responseMissingIdentity({required Object product}) => 'В ответе отсутствует идентификатор или имя сервера. Это точно сервер ${product}?'; + @override String probeFailed({required Object error}) => 'Не удалось связаться с сервером: ${error}'; + @override String enterAtLeastOneUrl({required Object product}) => 'Введите хотя бы один URL сервера ${product}'; + @override String noReachableServer({required Object product}) => 'Не найдено ни одного доступного сервера ${product}'; + @override String urlsPointToDifferentServers({required Object product}) => 'Эти URL указывают на разные серверы ${product}'; + @override String urlDoesNotMatchServer({required Object product}) => 'Этот URL не соответствует серверу ${product}'; + @override String get redirectUnsupported => 'Сервер перенаправил на неподдерживаемый URL'; + @override String redirectDifferentHost({required Object product}) => 'Сервер перенаправил на другой хост. Введите конечный URL ${product} напрямую.'; + @override String get redirectInsecure => 'Сервер перенаправил с HTTPS на небезопасный URL'; + @override String redirectUnsupportedEnterFinal({required Object product}) => 'Сервер перенаправил на неподдерживаемый URL. Введите конечный URL ${product} напрямую.'; } // Path: common.ratingSource @@ -2539,6 +2650,7 @@ class _Translations$services$deviceCode$ru extends Translations$services$deviceC // Translations @override String title({required Object service}) => 'Активируйте Plezy в ${service}'; + @override String get instructions => 'Отсканируйте QR-код или перейдите по адресу ниже и введите этот код:'; @override String openToActivate({required Object service}) => 'Открыть ${service} для активации'; @override String get copyCode => 'Скопировать код активации'; @override String get waitingForAuthorization => 'Ожидание авторизации…'; @@ -2613,6 +2725,7 @@ extension on TranslationsRu { 'auth.quickConnectCancel' => 'Отмена', 'auth.quickConnectExpired' => 'Срок действия Quick Connect истёк. Попробуйте снова.', 'auth.localDataRecoveryRequired' => 'Plezy не удалось безопасно восстановить данные локального входа и несинхронизированные данные о воспроизведении. Войдите снова.', + 'auth.pinCheckRejected' => 'Проверка PIN-кода Plex была отклонена', 'common.cancel' => 'Отмена', 'common.save' => 'Сохранить', 'common.close' => 'Закрыть', @@ -2669,6 +2782,9 @@ extension on TranslationsRu { 'common.ratingSource.trakt' => 'Trakt', 'common.ratingSource.rottenTomatoesCritic' => 'Критики Rotten Tomatoes', 'common.ratingSource.rottenTomatoesAudience' => 'Зрители Rotten Tomatoes', + 'common.notAvailable' => 'Н/Д', + 'common.url' => 'URL', + 'common.letterKeys' => 'АБВ', 'screens.licenses' => 'Лицензии', 'screens.switchProfile' => 'Сменить профиль', 'screens.subtitleStyling' => 'Стиль субтитров', @@ -2908,6 +3024,8 @@ extension on TranslationsRu { 'settings.showNavBarLabels' => 'Показывать подписи панели навигации', 'settings.showNavBarLabelsDescription' => 'Отображать текстовые подписи под иконками панели навигации', 'settings.startupSection' => 'Начальный раздел', + 'settings.showExploreTab' => 'Показывать вкладку «Обзор»', + 'settings.showExploreTabDescription' => 'Показывать вкладку «Обзор» с контентом из Plex Discover и подключённых трекеров', 'settings.liveTvDefaultFavorites' => 'Избранные каналы по умолчанию', 'settings.liveTvDefaultFavoritesDescription' => 'Показывать только избранные каналы при открытии ТВ', 'settings.display' => 'Экран', @@ -2919,6 +3037,7 @@ extension on TranslationsRu { 'settings.subtitlesAndConfig' => 'Субтитры и конфигурация', 'settings.seekAndTiming' => 'Перемотка и время', 'settings.behavior' => 'Поведение', + 'settings.exportDialogTitle' => 'Экспорт настроек Plezy', 'search.hint' => 'Поиск фильмов, сериалов, музыки...', 'search.tryDifferentTerm' => 'Попробуйте другой запрос', 'search.searchYourMedia' => 'Поиск в вашей медиатеке', @@ -3067,6 +3186,8 @@ extension on TranslationsRu { 'fileInfo.flagHearingImpaired' => 'Для слабослышащих', 'fileInfo.flagDub' => 'Дубляж', 'fileInfo.flagOriginal' => 'Оригинал', + 'fileInfo.channelsMono' => 'Моно', + 'fileInfo.dolbyVisionProfile' => ({required Object profile}) => 'Профиль ${profile}', 'mediaMenu.markAsWatched' => 'Отметить как просмотренное', 'mediaMenu.markAsUnwatched' => 'Отметить как непросмотренное', 'mediaMenu.removeFromContinueWatching' => 'Удалить из «Продолжить просмотр»', @@ -3100,6 +3221,8 @@ extension on TranslationsRu { 'mediaMenu.rate' => 'Оценить', 'mediaMenu.playFromBeginning' => 'Воспроизвести сначала', 'mediaMenu.playVersion' => 'Воспроизвести версию...', + _ => null, + } ?? switch (path) { 'rateSheet.title' => 'Оценить', 'rateSheet.server' => 'Сервер', 'rateSheet.favorite' => 'Добавить в избранное', @@ -3109,8 +3232,6 @@ extension on TranslationsRu { 'rateSheet.noConnectedServices' => 'Подключите сервис в настройках, чтобы выставлять оценки в нём.', 'accessibility.mediaCardMovie' => ({required Object title}) => '${title}, фильм', 'accessibility.mediaCardShow' => ({required Object title}) => '${title}, сериал', - _ => null, - } ?? switch (path) { 'accessibility.mediaCardEpisode' => ({required Object title, required Object episodeInfo}) => '${title}, ${episodeInfo}', 'accessibility.mediaCardSeason' => ({required Object title, required Object seasonInfo}) => '${title}, ${seasonInfo}', 'accessibility.mediaCardWatched' => 'просмотрено', @@ -3131,6 +3252,11 @@ extension on TranslationsRu { 'accessibility.alphabetScrollHint' => 'Проведите вверх или вниз для перехода по буквам', 'accessibility.rowColumnPosition' => ({required Object row, required Object rowCount, required Object column, required Object columnCount}) => 'Строка ${row} из ${rowCount}, столбец ${column} из ${columnCount}', 'accessibility.rowPosition' => ({required Object row, required Object rowCount}) => 'Строка ${row} из ${rowCount}', + 'accessibility.autoScrollPlay' => 'Запустить автопрокрутку', + 'accessibility.autoScrollPause' => 'Приостановить автопрокрутку', + 'accessibility.hueShort' => 'H', + 'accessibility.saturationShort' => 'S', + 'accessibility.valueShort' => 'V', 'tooltips.shufflePlay' => 'Случайное воспроизведение', 'tooltips.playTrailer' => 'Воспроизвести трейлер', 'tooltips.markAsWatched' => 'Отметить как просмотренное', @@ -3221,6 +3347,15 @@ extension on TranslationsRu { 'videoControls.subtitleDownloadedNotApplied' => 'Субтитры загружены, но их не удалось выбрать', 'videoControls.subtitleDownloadFailed' => 'Не удалось загрузить субтитры', 'videoControls.searchLanguages' => 'Поиск языков...', + 'videoControls.skipIntro' => 'Пропустить заставку', + 'videoControls.skipCredits' => 'Пропустить титры', + 'videoControls.nextEpisode' => 'Следующий эпизод', + 'videoControls.subtitleTrack' => ({required Object n}) => 'Дорожка ${n}', + 'videoControls.subtitleFile' => ({required Object name}) => 'Субтитры ${name}', + 'videoControls.forcedTrack' => ({required Object label}) => '${label} (принудительная)', + 'videoControls.osdSubtitlesOff' => 'Субтитры: выкл.', + 'videoControls.osdSubtitles' => ({required Object track}) => 'Субтитры: ${track}', + 'videoControls.osdAudio' => ({required Object track}) => 'Аудио: ${track}', 'messages.markedAsWatched' => 'Отмечено как просмотренное', 'messages.markedAsUnwatched' => 'Отмечено как непросмотренное', 'messages.markedAsWatchedOffline' => 'Отмечено как просмотренное (синхронизируется при подключении)', @@ -3270,9 +3405,18 @@ extension on TranslationsRu { 'messages.serverLimitBody' => 'Ошибка сервера (HTTP 500). Лимит пропускной способности/транскодирования, вероятно, отклонил сессию. Попросите владельца изменить настройки.', 'messages.mediaUnreadableTitle' => 'Файл недоступен', 'messages.mediaUnreadableBody' => 'Сервер нашёл этот элемент, но не смог прочитать его файл (HTTP 404). Вероятно, файл был перемещён, удалён или его хранилище недоступно. Попросите владельца сервера проверить файл и пересканировать библиотеку.', + 'messages.serverBusyTitle' => 'Поток недоступен', + 'messages.serverBusyBody' => 'Сервер продолжает отклонять запросы на потоковую передачу этого файла (HTTP 503). Возможно, он перезапускается, перегружен или хранилище с файлом недоступно. Повторите попытку через некоторое время. Если это продолжает происходить, попросите владельца сервера проверить сервер и хранилище с файлом.', 'messages.logsUploaded' => 'Логи загружены', 'messages.logsUploadFailed' => 'Не удалось загрузить логи', 'messages.logId' => 'ID лога', + 'messages.burnedSubtitlesUseMenu' => 'Субтитры встроены в этот поток. Изменить их можно в меню субтитров.', + 'messages.noVideoUrl' => 'URL видео недоступен', + 'messages.playbackNoMediaSources' => 'Сервер не вернул пригодных для воспроизведения медиаисточников', + 'messages.playbackDataNotPrepared' => 'Воспроизведение началось до того, как данные были готовы', + 'messages.streamSelectionUnavailable' => 'Выбор потоков недоступен для этого источника', + 'messages.streamSelectionFailed' => 'Не удалось применить выбранные потоки', + 'messages.serverUnavailableForProfile' => 'Для активного профиля нет доступных серверов', 'subtitlingStyling.text' => 'Текст', 'subtitlingStyling.border' => 'Обводка', 'subtitlingStyling.background' => 'Фон', @@ -3289,6 +3433,8 @@ extension on TranslationsRu { 'subtitlingStyling.overrideStrip' => 'Удалить стили', 'subtitlingStyling.positionTop' => 'Сверху', 'subtitlingStyling.positionBottom' => 'Снизу', + 'subtitlingStyling.anchorToScreen' => 'Привязка к экрану', + 'subtitlingStyling.anchorToScreenDescription' => 'Показывать текстовые субтитры в чёрных полосах под широкоформатным видео', 'subtitlingStyling.bold' => 'Жирный', 'subtitlingStyling.italic' => 'Курсив', 'subtitlingStyling.renderResolution' => 'Разрешение отрисовки', @@ -3371,6 +3517,7 @@ extension on TranslationsRu { 'profiles.pinExplain' => 'Для переключения профилей нужен 4-значный PIN.', 'profiles.continueButton' => 'Продолжить', 'profiles.pinsDontMatch' => 'PIN-коды не совпадают', + 'profiles.tokenIdentityMismatch' => 'Токен профиля Plex указал на неожиданный сервер', 'connections.sectionTitle' => 'Подключения', 'connections.addConnection' => 'Добавить подключение', 'connections.addConnectionSubtitleNoProfile' => 'Войдите через Plex или подключите сервер Jellyfin', @@ -3404,6 +3551,7 @@ extension on TranslationsRu { 'discover.tvShow' => 'Сериал', 'discover.minutesLeft' => ({required Object minutes}) => 'Осталось ${minutes} мин', 'discover.moreLikeThis' => 'Похожее', + 'discover.titleCount' => ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('ru'))(n, one: '${n} название', few: '${n} названия', many: '${n} названий', other: '${n} названия', ), 'errors.searchFailed' => ({required Object error}) => 'Ошибка поиска: ${error}', 'errors.searchUnavailable' => 'Поиску не удалось связаться ни с одним медиасервером.', 'errors.connectionTimeout' => ({required Object context}) => 'Таймаут подключения при загрузке ${context}', @@ -3576,7 +3724,10 @@ extension on TranslationsRu { 'explore.characters' => 'Персонажи', 'explore.addToWatchlist' => 'Добавить в список для просмотра', 'explore.removeFromWatchlist' => 'Удалить из списка для просмотра', + 'explore.addedToWatchlist' => 'Добавлено в список просмотра', + 'explore.removedFromWatchlist' => 'Удалено из списка просмотра', 'explore.watchlistUpdateFailed' => 'Не удалось обновить список для просмотра', + 'explore.watchlistNoMatch' => 'Не удалось сопоставить этот элемент со списком просмотра', 'explore.notInLibrary' => 'Нет в вашей библиотеке', 'explore.inTheseLibraries' => 'В этих библиотеках', 'explore.checkingLibrary' => 'Проверка вашей библиотеки...', @@ -3584,6 +3735,8 @@ extension on TranslationsRu { 'explore.emptyMessage' => ({required Object source}) => 'Разделы из ${source} появятся здесь, когда в них появится контент.', 'explore.searchHint' => ({required Object source}) => 'Поиск в ${source}', 'explore.searchEmpty' => ({required Object query}) => 'Нет результатов по запросу "${query}"', + _ => null, + } ?? switch (path) { 'explore.searchPrompt' => ({required Object source}) => 'Ищите фильмы и сериалы в ${source}.', 'explore.searchFailed' => 'Ошибка поиска. Проверьте подключение и повторите попытку.', 'explore.badge.rankPopular' => ({required Object n}) => '#${n} по популярности', @@ -3623,8 +3776,6 @@ extension on TranslationsRu { 'explore.stats.completed' => ({required Object n}) => '${n} завершили', 'explore.stats.onHold' => ({required Object n}) => '${n} отложили', 'explore.stats.dropped' => ({required Object n}) => '${n} бросили', - _ => null, - } ?? switch (path) { 'explore.season.winter' => 'Зима', 'explore.season.spring' => 'Весна', 'explore.season.summer' => 'Лето', @@ -3721,6 +3872,9 @@ extension on TranslationsRu { 'liveTv.watchChannel' => 'Смотреть канал', 'liveTv.favorites' => 'Избранное', 'liveTv.reorderFavorites' => 'Изменить порядок избранного', + 'liveTv.noFavoriteChannels' => 'Нет избранных каналов', + 'liveTv.noFavoriteChannelsHint' => 'Покажите все каналы, затем нажмите и удерживайте канал, чтобы добавить его в избранное.', + 'liveTv.showAllChannels' => 'Показать все каналы', 'liveTv.favoritesLoadFailed' => 'Не удалось загрузить избранное. Проверьте подключение и повторите попытку.', 'liveTv.favoritesUpdateFailed' => 'Не удалось обновить избранное. Проверьте подключение и повторите попытку.', 'liveTv.joinSession' => 'Присоединиться к текущему сеансу', @@ -3760,6 +3914,11 @@ extension on TranslationsRu { 'liveTv.guideReloadRequested' => 'Запрошено обновление гайда', 'liveTv.rulesProcessRequested' => 'Запрошен пересчёт правил', 'liveTv.recordShow' => 'Записать передачу', + 'liveTv.startingInMinutes' => ({required Object minutes}) => 'Начало через ${minutes} мин', + 'liveTv.dayAtTime' => ({required Object day, required Object time}) => '${day} в ${time}', + 'liveTv.invalidPlaybackData' => ({required Object product}) => '${product} вернул некорректные данные для воспроизведения ТВ в прямом эфире', + 'liveTv.failedToStartChannel' => 'Не удалось запустить канал в прямом эфире', + 'liveTv.failedToBuildStreamUrl' => 'Не удалось сформировать URL потока', 'collections.title' => 'Коллекции', 'collections.collection' => 'Коллекция', 'collections.empty' => 'Коллекция пуста', @@ -3828,6 +3987,8 @@ extension on TranslationsRu { 'music.repeat' => 'Повтор', 'music.repeatAll' => 'Повторять все', 'music.repeatOne' => 'Повторять один', + 'music.instantMixNoServer' => 'Нет доступного сервера для мгновенного микса', + 'music.noAudioUrl' => ({required Object track}) => 'Для трека ${track} нет доступного URL аудио', 'watchTogether.title' => 'Смотреть вместе', 'watchTogether.description' => 'Смотрите контент синхронно с друзьями и семьёй', 'watchTogether.createSession' => 'Создать сессию', @@ -3893,6 +4054,7 @@ extension on TranslationsRu { 'watchTogether.removeRoom' => 'Удалить', 'watchTogether.guestSwitchUnavailable' => 'Не удалось переключиться — сервер недоступен для синхронизации', 'watchTogether.guestSwitchFailed' => 'Не удалось переключиться — содержимое не найдено на этом сервере', + 'watchTogether.defaultDisplayName' => 'Пользователь', 'downloads.title' => 'Загрузки', 'downloads.manage' => 'Управление', 'downloads.tvShows' => 'Сериалы', @@ -3993,6 +4155,16 @@ extension on TranslationsRu { 'downloads.backgroundWarning.statusUnknown' => 'Ещё не проверено', 'downloads.backgroundWarning.settingsUnavailable' => 'Не удалось открыть системные настройки на этом устройстве', 'downloads.backgroundWarning.linkUnavailable' => 'Не удалось открыть dontkillmyapp.com на этом устройстве', + 'downloads.unknownShow' => 'Неизвестный сериал', + 'downloads.unknownSeason' => 'Неизвестный сезон', + 'downloads.unknownAlbum' => 'Неизвестный альбом', + 'downloads.completedOfTotal' => ({required Object completed, required Object total}) => 'Завершено: ${completed}/${total}', + 'downloads.errorFileNotFound' => 'Файл не найден (404)', + 'downloads.errorDownloadFailed' => 'Не удалось выполнить загрузку', + 'downloads.errorPostProcessing' => ({required Object error}) => 'Не удалось выполнить постобработку: ${error}', + 'downloads.notificationDownloading' => 'Загрузка...', + 'downloads.notificationComplete' => 'Загрузка завершена', + 'downloads.notificationPaused' => 'Загрузка приостановлена', 'shaders.title' => 'Шейдеры', 'shaders.noShaderDescription' => 'Без улучшения видео', 'shaders.nvscalerDescription' => 'Масштабирование NVIDIA для более чёткого видео', @@ -4072,14 +4244,24 @@ extension on TranslationsRu { 'companionRemote.errors.failedToConnectAnyAddress' => 'Не удалось подключиться ни к одному адресу', 'companionRemote.errors.connectionLostAfterAttempts' => ({required Object attempts}) => 'Соединение потеряно после ${attempts} попыток', 'companionRemote.errors.connectionLost' => 'Соединение потеряно', + 'companionRemote.closedBeforeAuth' => 'Соединение было закрыто до аутентификации', 'videoSettings.playbackSpeed' => 'Скорость воспроизведения', 'videoSettings.normalSpeed' => 'Обычная', 'videoSettings.sleepTimerActive' => ({required Object duration}) => 'Активен (${duration})', 'videoSettings.zoom' => 'Масштаб', + _ => null, + } ?? switch (path) { 'videoSettings.sleepTimer' => 'Таймер сна', 'videoSettings.audioSync' => 'Синхронизация аудио', 'videoSettings.subtitleSync' => 'Синхронизация субтитров', 'videoSettings.hdr' => 'HDR', + 'videoSettings.hdrUnsupported' => 'HDR здесь недоступен: этот композитор рабочего стола или видеовыход не поддерживает его передачу.', + 'videoSettings.hdrToneMapping' => 'Тональное отображение HDR', + 'videoSettings.hdrToneMappingCompositor' => 'Композитор', + 'videoSettings.hdrToneMappingCompositorDescription' => 'Передавать метаданные HDR источника без изменений, чтобы тональное отображение выполнял композитор рабочего стола.', + 'videoSettings.hdrToneMappingPlayer' => 'Проигрыватель', + 'videoSettings.hdrToneMappingPlayerDescription' => 'Выполнять тональное отображение в проигрывателе с учётом пиковой яркости дисплея, а затем передавать результат композитору.', + 'videoSettings.hdrToneMappingFailed' => 'Не удалось изменить тональное отображение HDR — предыдущий режим по-прежнему активен.', 'videoSettings.audioOutput' => 'Аудиовыход', 'videoSettings.performanceOverlay' => 'Оверлей производительности', 'videoSettings.audioOutputDolbyAtmos' => 'Dolby Atmos', @@ -4124,6 +4306,16 @@ extension on TranslationsRu { 'performanceOverlay.player' => 'Плеер', 'performanceOverlay.memory' => 'Память', 'performanceOverlay.uiFps' => 'UI FPS', + 'performanceOverlay.fps' => 'FPS', + 'performanceOverlay.decoderAndroidHw' => 'Android, аппаратный', + 'performanceOverlay.decoderNvidiaHw' => 'NVIDIA, аппаратный', + 'performanceOverlay.decoderQualcommHw' => 'Qualcomm, аппаратный', + 'performanceOverlay.decoderMediatekHw' => 'MediaTek, аппаратный', + 'performanceOverlay.decoderExynosHw' => 'Exynos, аппаратный', + 'performanceOverlay.decoderSoftware' => 'Программный', + 'performanceOverlay.decoderHardware' => 'Аппаратный', + 'performanceOverlay.tunnelingActive' => 'Активно', + 'performanceOverlay.dvRpuFailed' => ({required Object converted, required Object failures}) => '${converted} (ошибок: ${failures})', 'externalPlayer.title' => 'Внешний плеер', 'externalPlayer.useExternalPlayer' => 'Использовать внешний плеер', 'externalPlayer.useExternalPlayerDescription' => 'Открывать видео в другом приложении', @@ -4137,8 +4329,6 @@ extension on TranslationsRu { 'externalPlayer.playerPackage' => 'Имя пакета', 'externalPlayer.playerUrlScheme' => 'URL-схема', 'externalPlayer.off' => 'Выкл.', - _ => null, - } ?? switch (path) { 'externalPlayer.launchFailed' => 'Не удалось открыть внешний плеер', 'externalPlayer.appNotInstalled' => ({required Object name}) => '${name} не установлен', 'externalPlayer.playInExternalPlayer' => 'Воспроизвести во внешнем плеере', @@ -4272,6 +4462,16 @@ extension on TranslationsRu { 'seerr.statusPartiallyAvailable' => 'Частично доступно', 'seerr.statusRequested' => 'Запрошено', 'seerr.statusProcessing' => 'Обработка', + 'seerr.couldNotReach' => ({required Object url, required Object error}) => 'Не удалось связаться с ${url}: ${error}', + 'seerr.noInstanceAtUrl' => ({required Object url, required Object status}) => 'По адресу ${url} нет экземпляра Seerr (HTTP ${status})', + 'seerr.notInitialized' => 'Первоначальная настройка этого экземпляра Seerr не завершена', + 'seerr.noPlexTokenForReauth' => 'Нет токена Plex для повторного входа', + 'seerr.noStoredCredentials' => 'Нет сохранённых учётных данных для повторного входа', + 'seerr.signInRejected' => 'Вход был отклонён', + 'seerr.noSessionCookie' => 'Seerr не выдал cookie-файл сеанса', + 'seerr.freshCookieRejected' => 'Seerr отклонил новый cookie-файл сеанса', + 'seerr.noUserInformation' => 'Seerr не вернул сведения о пользователе', + 'seerr.sessionRejectedAfterReauth' => 'Сеанс был отклонён после повторного входа', 'services.title' => 'Сервисы', 'services.hubSubtitle' => 'Синхронизируйте прогресс просмотра и запрашивайте новые фильмы и сериалы.', 'services.notConnected' => 'Не подключено', @@ -4287,6 +4487,7 @@ extension on TranslationsRu { 'services.names.seerr' => 'Seerr', 'services.names.mdblist' => 'MDBList', 'services.deviceCode.title' => ({required Object service}) => 'Активируйте Plezy в ${service}', + 'services.deviceCode.instructions' => 'Отсканируйте QR-код или перейдите по адресу ниже и введите этот код:', 'services.deviceCode.openToActivate' => ({required Object service}) => 'Открыть ${service} для активации', 'services.deviceCode.copyCode' => 'Скопировать код активации', 'services.deviceCode.waitingForAuthorization' => 'Ожидание авторизации…', @@ -4336,6 +4537,24 @@ extension on TranslationsRu { 'addServer.connectToMediaBrowserCardSubtitleScoped' => ({required Object product, required Object name}) => 'Войдите на свой сервер ${product}. Будет привязано к ${name}.', 'addServer.borrowFromAnotherProfile' => 'Использовать подключение другого профиля', 'addServer.borrowFromAnotherProfileSubtitle' => 'Повторно используйте подключение другого профиля. Для защищённых профилей потребуется PIN.', + 'addServer.invalidCredentials' => 'Неверное имя пользователя или пароль', + 'addServer.authResponseNotJson' => 'Ответ аутентификации не является допустимым JSON', + 'addServer.quickConnectRejected' => 'Quick Connect был отклонён сервером', + 'addServer.quickConnectNotJson' => 'Ответ Quick Connect не является допустимым JSON', + 'addServer.quickConnectMissingFields' => 'В ответе Quick Connect отсутствует код или секрет', + 'addServer.quickConnectPollRejected' => 'Опрос Quick Connect был отклонён сервером', + 'addServer.serverTimedOut' => 'Сервер не ответил вовремя', + 'addServer.responseNotJson' => 'Ответ сервера не является допустимым JSON', + 'addServer.responseMissingIdentity' => ({required Object product}) => 'В ответе отсутствует идентификатор или имя сервера. Это точно сервер ${product}?', + 'addServer.probeFailed' => ({required Object error}) => 'Не удалось связаться с сервером: ${error}', + 'addServer.enterAtLeastOneUrl' => ({required Object product}) => 'Введите хотя бы один URL сервера ${product}', + 'addServer.noReachableServer' => ({required Object product}) => 'Не найдено ни одного доступного сервера ${product}', + 'addServer.urlsPointToDifferentServers' => ({required Object product}) => 'Эти URL указывают на разные серверы ${product}', + 'addServer.urlDoesNotMatchServer' => ({required Object product}) => 'Этот URL не соответствует серверу ${product}', + 'addServer.redirectUnsupported' => 'Сервер перенаправил на неподдерживаемый URL', + 'addServer.redirectDifferentHost' => ({required Object product}) => 'Сервер перенаправил на другой хост. Введите конечный URL ${product} напрямую.', + 'addServer.redirectInsecure' => 'Сервер перенаправил с HTTPS на небезопасный URL', + 'addServer.redirectUnsupportedEnterFinal' => ({required Object product}) => 'Сервер перенаправил на неподдерживаемый URL. Введите конечный URL ${product} напрямую.', _ => null, }; } diff --git a/lib/i18n/strings_sv.g.dart b/lib/i18n/strings_sv.g.dart index 2aa80319..e4757418 100644 --- a/lib/i18n/strings_sv.g.dart +++ b/lib/i18n/strings_sv.g.dart @@ -123,6 +123,7 @@ class _Translations$auth$sv extends Translations$auth$en { @override String get quickConnectCancel => 'Avbryt'; @override String get quickConnectExpired => 'Quick Connect har gått ut. Försök igen.'; @override String get localDataRecoveryRequired => 'Plezy kunde inte återställa lokala inloggningsuppgifter och väntande uppspelningsdata på ett säkert sätt. Logga in igen.'; + @override String get pinCheckRejected => 'Plex PIN-kontrollen avvisades'; } // Path: common @@ -178,6 +179,9 @@ class _Translations$common$sv extends Translations$common$en { @override String get exitFullscreen => 'Avsluta helskärm'; @override String get pressBackAgainToExit => 'Tryck bakåt igen för att avsluta'; @override late final _Translations$common$ratingSource$sv ratingSource = _Translations$common$ratingSource$sv._(_root); + @override String get notAvailable => 'N/A'; + @override String get url => 'URL'; + @override String get letterKeys => 'ABC'; } // Path: screens @@ -444,6 +448,8 @@ class _Translations$settings$sv extends Translations$settings$en { @override String get showNavBarLabels => 'Visa navigeringsfältets etiketter'; @override String get showNavBarLabelsDescription => 'Visa textetiketter under navigeringsfältets ikoner'; @override String get startupSection => 'Startsida'; + @override String get showExploreTab => 'Visa fliken Utforska'; + @override String get showExploreTabDescription => 'Visa fliken Utforska med innehåll från Plex Discover och anslutna spårningstjänster'; @override String get liveTvDefaultFavorites => 'Öppna med favoriter'; @override String get liveTvDefaultFavoritesDescription => 'Visa endast favoritkanaler när Live-TV öppnas'; @override String get display => 'Skärm'; @@ -455,6 +461,7 @@ class _Translations$settings$sv extends Translations$settings$en { @override String get subtitlesAndConfig => 'Undertexter och konfiguration'; @override String get seekAndTiming => 'Spolning och tidsinställningar'; @override String get behavior => 'Beteende'; + @override String get exportDialogTitle => 'Exportera Plezy-inställningar'; } // Path: search @@ -606,6 +613,8 @@ class _Translations$fileInfo$sv extends Translations$fileInfo$en { @override String get flagHearingImpaired => 'Hörselskadade'; @override String get flagDub => 'Dubbad'; @override String get flagOriginal => 'Original'; + @override String get channelsMono => 'Mono'; + @override String dolbyVisionProfile({required Object profile}) => 'Profil ${profile}'; } // Path: mediaMenu @@ -704,6 +713,11 @@ class _Translations$accessibility$sv extends Translations$accessibility$en { @override String get alphabetScrollHint => 'Svep uppåt eller nedåt för att gå mellan bokstäver'; @override String rowColumnPosition({required Object row, required Object rowCount, required Object column, required Object columnCount}) => 'Rad ${row} av ${rowCount}, kolumn ${column} av ${columnCount}'; @override String rowPosition({required Object row, required Object rowCount}) => 'Rad ${row} av ${rowCount}'; + @override String get autoScrollPlay => 'Starta automatisk rullning'; + @override String get autoScrollPause => 'Pausa automatisk rullning'; + @override String get hueShort => 'H'; + @override String get saturationShort => 'S'; + @override String get valueShort => 'V'; } // Path: tooltips @@ -815,6 +829,15 @@ class _Translations$videoControls$sv extends Translations$videoControls$en { @override String get subtitleDownloadedNotApplied => 'Undertexten laddades ned men kunde inte väljas'; @override String get subtitleDownloadFailed => 'Det gick inte att ladda ned undertexten'; @override String get searchLanguages => 'Sök språk...'; + @override String get skipIntro => 'Hoppa över intro'; + @override String get skipCredits => 'Hoppa över eftertexter'; + @override String get nextEpisode => 'Nästa avsnitt'; + @override String subtitleTrack({required Object n}) => 'Spår ${n}'; + @override String subtitleFile({required Object name}) => 'Undertext ${name}'; + @override String forcedTrack({required Object label}) => '${label} (Forcerad)'; + @override String get osdSubtitlesOff => 'Undertexter: Av'; + @override String osdSubtitles({required Object track}) => 'Undertexter: ${track}'; + @override String osdAudio({required Object track}) => 'Ljud: ${track}'; } // Path: messages @@ -876,9 +899,18 @@ class _Translations$messages$sv extends Translations$messages$en { @override String get serverLimitBody => 'Serverfel (HTTP 500). En bandbredds-/transkodningsgräns avvisade troligen sessionen. Be ägaren justera den.'; @override String get mediaUnreadableTitle => 'Filen är otillgänglig'; @override String get mediaUnreadableBody => 'Servern hittade objektet men kunde inte läsa dess fil (HTTP 404). Filen har troligen flyttats, tagits bort eller så är dess lagring offline. Be serverägaren kontrollera filen och skanna om biblioteket.'; + @override String get serverBusyTitle => 'Strömmen är inte tillgänglig'; + @override String get serverBusyBody => 'Servern nekade upprepade gånger att strömma den här filen (HTTP 503). Den kan hålla på att startas om eller vara upptagen, eller så kan lagringen där filen finns vara offline. Försök igen om en stund – om det fortsätter, be serverns ägare att kontrollera servern och lagringen där filen finns.'; @override String get logsUploaded => 'Loggarna har laddats upp'; @override String get logsUploadFailed => 'Det gick inte att ladda upp loggarna'; @override String get logId => 'Logg-ID'; + @override String get burnedSubtitlesUseMenu => 'Undertexterna är inbrända i den här strömmen. Ändra dem via undertextmenyn.'; + @override String get noVideoUrl => 'Ingen video-URL är tillgänglig'; + @override String get playbackNoMediaSources => 'Servern returnerade inga spelbara mediekällor'; + @override String get playbackDataNotPrepared => 'Uppspelningen startades innan uppspelningsinformationen var klar'; + @override String get streamSelectionUnavailable => 'Val av ström är inte tillgängligt för den här källan'; + @override String get streamSelectionFailed => 'Kunde inte tillämpa de valda strömmarna'; + @override String get serverUnavailableForProfile => 'Ingen server är tillgänglig för den aktiva profilen'; } // Path: subtitlingStyling @@ -904,6 +936,8 @@ class _Translations$subtitlingStyling$sv extends Translations$subtitlingStyling$ @override String get overrideStrip => 'Ta bort formatering'; @override String get positionTop => 'Överst'; @override String get positionBottom => 'Nederst'; + @override String get anchorToScreen => 'Förankra vid skärmen'; + @override String get anchorToScreenDescription => 'Visa textbaserade undertexter i de svarta fälten under bredbildsvideon'; @override String get bold => 'Fet'; @override String get italic => 'Kursiv'; @override String get renderResolution => 'Renderingsupplösning'; @@ -1013,6 +1047,7 @@ class _Translations$profiles$sv extends Translations$profiles$en { @override String get pinExplain => 'En fyrsiffrig PIN-kod krävs för att byta profil.'; @override String get continueButton => 'Fortsätt'; @override String get pinsDontMatch => 'PIN-koderna stämmer inte överens'; + @override String get tokenIdentityMismatch => 'Plex-profiltoken kopplades till en oväntad server'; } // Path: connections @@ -1064,6 +1099,10 @@ class _Translations$discover$sv extends Translations$discover$en { @override String get tvShow => 'TV-serie'; @override String minutesLeft({required Object minutes}) => '${minutes} min kvar'; @override String get moreLikeThis => 'Mer liknande innehåll'; + @override String titleCount({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('sv'))(n, + one: '${n} titel', + other: '${n} titlar', + ); } // Path: errors @@ -1276,7 +1315,10 @@ class _Translations$explore$sv extends Translations$explore$en { @override String get characters => 'Karaktärer'; @override String get addToWatchlist => 'Lägg till i bevakningslista'; @override String get removeFromWatchlist => 'Ta bort från bevakningslista'; + @override String get addedToWatchlist => 'Tillagd i bevakningslistan'; + @override String get removedFromWatchlist => 'Borttagen från bevakningslistan'; @override String get watchlistUpdateFailed => 'Det gick inte att uppdatera bevakningslistan'; + @override String get watchlistNoMatch => 'Det gick inte att matcha det här objektet mot en bevakningslista'; @override String get notInLibrary => 'Finns inte i ditt bibliotek'; @override String get inTheseLibraries => 'I dessa bibliotek'; @override String get checkingLibrary => 'Kontrollerar ditt bibliotek...'; @@ -1337,6 +1379,9 @@ class _Translations$liveTv$sv extends Translations$liveTv$en { @override String get watchChannel => 'Titta på kanal'; @override String get favorites => 'Favoriter'; @override String get reorderFavorites => 'Ordna om favoriter'; + @override String get noFavoriteChannels => 'Inga favoritkanaler'; + @override String get noFavoriteChannelsHint => 'Visa alla kanaler och tryck sedan länge på en kanal för att lägga till den som favorit.'; + @override String get showAllChannels => 'Visa alla kanaler'; @override String get favoritesLoadFailed => 'Det gick inte att läsa in favoriter. Kontrollera anslutningen och försök igen.'; @override String get favoritesUpdateFailed => 'Det gick inte att uppdatera favoriterna. Kontrollera anslutningen och försök igen.'; @override String get joinSession => 'Gå med i pågående session'; @@ -1376,6 +1421,11 @@ class _Translations$liveTv$sv extends Translations$liveTv$en { @override String get guideReloadRequested => 'Uppdatering av programguiden har begärts'; @override String get rulesProcessRequested => 'Ny regelutvärdering har begärts'; @override String get recordShow => 'Spela in program'; + @override String startingInMinutes({required Object minutes}) => 'Börjar om ${minutes} min'; + @override String dayAtTime({required Object day, required Object time}) => '${day} kl. ${time}'; + @override String invalidPlaybackData({required Object product}) => '${product} returnerade ogiltiga uppspelningsdata för Live-TV'; + @override String get failedToStartChannel => 'Kunde inte starta livekanalen'; + @override String get failedToBuildStreamUrl => 'Kunde inte skapa strömmens URL'; } // Path: collections @@ -1474,6 +1524,8 @@ class _Translations$music$sv extends Translations$music$en { @override String get repeat => 'Upprepa'; @override String get repeatAll => 'Upprepa alla'; @override String get repeatOne => 'Upprepa en låt'; + @override String get instantMixNoServer => 'Ingen server är tillgänglig för en snabbmix'; + @override String noAudioUrl({required Object track}) => 'Ingen ljud-URL är tillgänglig för ${track}'; } // Path: watchTogether @@ -1548,6 +1600,7 @@ class _Translations$watchTogether$sv extends Translations$watchTogether$en { @override String get removeRoom => 'Ta bort'; @override String get guestSwitchUnavailable => 'Kunde inte byta — server inte tillgänglig för synkronisering'; @override String get guestSwitchFailed => 'Kunde inte byta — innehåll hittades inte på denna server'; + @override String get defaultDisplayName => 'Användare'; } // Path: downloads @@ -1632,6 +1685,16 @@ class _Translations$downloads$sv extends Translations$downloads$en { @override String get syncRuleUnknownServer => 'Okänd server'; @override String get syncRuleListCreated => 'Synkroniseringsregel skapad'; @override late final _Translations$downloads$backgroundWarning$sv backgroundWarning = _Translations$downloads$backgroundWarning$sv._(_root); + @override String get unknownShow => 'Okänd serie'; + @override String get unknownSeason => 'Okänd säsong'; + @override String get unknownAlbum => 'Okänt album'; + @override String completedOfTotal({required Object completed, required Object total}) => '${completed}/${total} slutförda'; + @override String get errorFileNotFound => 'Filen hittades inte (404)'; + @override String get errorDownloadFailed => 'Nedladdningen misslyckades'; + @override String errorPostProcessing({required Object error}) => 'Efterbehandlingen misslyckades: ${error}'; + @override String get notificationDownloading => 'Laddar ned...'; + @override String get notificationComplete => 'Nedladdningen är klar'; + @override String get notificationPaused => 'Nedladdningen har pausats'; } // Path: shaders @@ -1672,6 +1735,7 @@ class _Translations$companionRemote$sv extends Translations$companionRemote$en { @override late final _Translations$companionRemote$pairing$sv pairing = _Translations$companionRemote$pairing$sv._(_root); @override late final _Translations$companionRemote$remote$sv remote = _Translations$companionRemote$remote$sv._(_root); @override late final _Translations$companionRemote$errors$sv errors = _Translations$companionRemote$errors$sv._(_root); + @override String get closedBeforeAuth => 'Anslutningen stängdes före autentiseringen'; } // Path: videoSettings @@ -1689,6 +1753,13 @@ class _Translations$videoSettings$sv extends Translations$videoSettings$en { @override String get audioSync => 'Ljudsynkronisering'; @override String get subtitleSync => 'Undertextsynkronisering'; @override String get hdr => 'HDR'; + @override String get hdrUnsupported => 'HDR kan inte användas här – skrivbordets kompositionshanterare eller videoutgången kan inte överföra det.'; + @override String get hdrToneMapping => 'HDR-tonmappning'; + @override String get hdrToneMappingCompositor => 'Kompositionshanterare'; + @override String get hdrToneMappingCompositorDescription => 'Vidarebefordra källans HDR-metadata och låt skrivbordets kompositionshanterare tonmappa dem.'; + @override String get hdrToneMappingPlayer => 'Spelare'; + @override String get hdrToneMappingPlayerDescription => 'Tonmappa till skärmens maximala ljusstyrka i spelaren och informera sedan kompositionshanteraren om resultatet.'; + @override String get hdrToneMappingFailed => 'Det gick inte att ändra HDR-tonmappningen – det föregående läget är fortfarande aktivt.'; @override String get audioOutput => 'Ljudutgång'; @override String get performanceOverlay => 'Prestandaöverlägg'; @override String get audioOutputDolbyAtmos => 'Dolby Atmos'; @@ -1742,6 +1813,16 @@ class _Translations$performanceOverlay$sv extends Translations$performanceOverla @override String get player => 'Spelare'; @override String get memory => 'Minne'; @override String get uiFps => 'UI FPS'; + @override String get fps => 'FPS'; + @override String get decoderAndroidHw => 'Android HW'; + @override String get decoderNvidiaHw => 'NVIDIA HW'; + @override String get decoderQualcommHw => 'Qualcomm HW'; + @override String get decoderMediatekHw => 'MediaTek HW'; + @override String get decoderExynosHw => 'Exynos HW'; + @override String get decoderSoftware => 'Programvara'; + @override String get decoderHardware => 'Maskinvara'; + @override String get tunnelingActive => 'Aktiv'; + @override String dvRpuFailed({required Object converted, required Object failures}) => '${converted} (${failures} misslyckades)'; } // Path: externalPlayer @@ -1942,6 +2023,16 @@ class _Translations$seerr$sv extends Translations$seerr$en { @override String get statusPartiallyAvailable => 'Delvis tillgänglig'; @override String get statusRequested => 'Begärd'; @override String get statusProcessing => 'Bearbetas'; + @override String couldNotReach({required Object url, required Object error}) => 'Kunde inte nå ${url}: ${error}'; + @override String noInstanceAtUrl({required Object url, required Object status}) => 'Det finns ingen Seerr-instans på ${url} (HTTP ${status})'; + @override String get notInitialized => 'Den här Seerr-instansen har inte slutfört den inledande konfigurationen'; + @override String get noPlexTokenForReauth => 'Det finns ingen Plex-token tillgänglig för att logga in igen'; + @override String get noStoredCredentials => 'Det finns inga sparade inloggningsuppgifter för att logga in igen'; + @override String get signInRejected => 'Inloggningen avvisades'; + @override String get noSessionCookie => 'Seerr skapade ingen sessionscookie'; + @override String get freshCookieRejected => 'Seerr avvisade den nya sessionscookien'; + @override String get noUserInformation => 'Seerr returnerade ingen användarinformation'; + @override String get sessionRejectedAfterReauth => 'Sessionen avvisades efter den nya inloggningen'; } // Path: services @@ -2002,6 +2093,24 @@ class _Translations$addServer$sv extends Translations$addServer$en { @override String connectToMediaBrowserCardSubtitleScoped({required Object product, required Object name}) => 'Logga in på din ${product}-server. Knyts till ${name}.'; @override String get borrowFromAnotherProfile => 'Låna från en annan profil'; @override String get borrowFromAnotherProfileSubtitle => 'Återanvänd en annan profils anslutning. PIN-skyddade profiler kräver en PIN.'; + @override String get invalidCredentials => 'Ogiltigt användarnamn eller lösenord'; + @override String get authResponseNotJson => 'Autentiseringssvaret var inte ett giltigt JSON-svar'; + @override String get quickConnectRejected => 'Quick Connect avvisades av servern'; + @override String get quickConnectNotJson => 'Quick Connect-svaret var inte ett giltigt JSON-svar'; + @override String get quickConnectMissingFields => 'Quick Connect-svaret saknar en kod eller hemlig nyckel'; + @override String get quickConnectPollRejected => 'Servern avvisade avsökningen för Quick Connect'; + @override String get serverTimedOut => 'Servern svarade inte i tid'; + @override String get responseNotJson => 'Serversvaret var inte ett giltigt JSON-svar'; + @override String responseMissingIdentity({required Object product}) => 'Svaret saknar ett ID eller servernamn – är det här en ${product}-server?'; + @override String probeFailed({required Object error}) => 'Kunde inte nå servern: ${error}'; + @override String enterAtLeastOneUrl({required Object product}) => 'Ange minst en server-URL för ${product}'; + @override String noReachableServer({required Object product}) => 'Ingen nåbar ${product}-server hittades'; + @override String urlsPointToDifferentServers({required Object product}) => 'De här URL:erna pekar på olika servrar för ${product}'; + @override String urlDoesNotMatchServer({required Object product}) => 'Den här URL:en stämmer inte överens med ${product}-servern'; + @override String get redirectUnsupported => 'Servern omdirigerade till en URL som inte stöds'; + @override String redirectDifferentHost({required Object product}) => 'Servern omdirigerade till en annan värd. Ange den slutliga URL:en för ${product} direkt.'; + @override String get redirectInsecure => 'Servern omdirigerade från HTTPS till en osäker URL'; + @override String redirectUnsupportedEnterFinal({required Object product}) => 'Servern omdirigerade till en URL som inte stöds. Ange den slutliga URL:en för ${product} direkt.'; } // Path: common.ratingSource @@ -2521,6 +2630,7 @@ class _Translations$services$deviceCode$sv extends Translations$services$deviceC // Translations @override String title({required Object service}) => 'Aktivera Plezy på ${service}'; + @override String get instructions => 'Skanna QR-koden eller gå till adressen nedan och ange den här koden:'; @override String openToActivate({required Object service}) => 'Öppna ${service} för att aktivera'; @override String get copyCode => 'Kopiera aktiveringskod'; @override String get waitingForAuthorization => 'Väntar på auktorisering…'; @@ -2595,6 +2705,7 @@ extension on TranslationsSv { 'auth.quickConnectCancel' => 'Avbryt', 'auth.quickConnectExpired' => 'Quick Connect har gått ut. Försök igen.', 'auth.localDataRecoveryRequired' => 'Plezy kunde inte återställa lokala inloggningsuppgifter och väntande uppspelningsdata på ett säkert sätt. Logga in igen.', + 'auth.pinCheckRejected' => 'Plex PIN-kontrollen avvisades', 'common.cancel' => 'Avbryt', 'common.save' => 'Spara', 'common.close' => 'Stäng', @@ -2651,6 +2762,9 @@ extension on TranslationsSv { 'common.ratingSource.trakt' => 'Trakt', 'common.ratingSource.rottenTomatoesCritic' => 'Rotten Tomatoes-kritiker', 'common.ratingSource.rottenTomatoesAudience' => 'Rotten Tomatoes-publik', + 'common.notAvailable' => 'N/A', + 'common.url' => 'URL', + 'common.letterKeys' => 'ABC', 'screens.licenses' => 'Licenser', 'screens.switchProfile' => 'Byt profil', 'screens.subtitleStyling' => 'Utseende för undertexter', @@ -2890,6 +3004,8 @@ extension on TranslationsSv { 'settings.showNavBarLabels' => 'Visa navigeringsfältets etiketter', 'settings.showNavBarLabelsDescription' => 'Visa textetiketter under navigeringsfältets ikoner', 'settings.startupSection' => 'Startsida', + 'settings.showExploreTab' => 'Visa fliken Utforska', + 'settings.showExploreTabDescription' => 'Visa fliken Utforska med innehåll från Plex Discover och anslutna spårningstjänster', 'settings.liveTvDefaultFavorites' => 'Öppna med favoriter', 'settings.liveTvDefaultFavoritesDescription' => 'Visa endast favoritkanaler när Live-TV öppnas', 'settings.display' => 'Skärm', @@ -2901,6 +3017,7 @@ extension on TranslationsSv { 'settings.subtitlesAndConfig' => 'Undertexter och konfiguration', 'settings.seekAndTiming' => 'Spolning och tidsinställningar', 'settings.behavior' => 'Beteende', + 'settings.exportDialogTitle' => 'Exportera Plezy-inställningar', 'search.hint' => 'Sök filmer, serier, musik...', 'search.tryDifferentTerm' => 'Prova en annan sökterm', 'search.searchYourMedia' => 'Sök i dina media', @@ -3049,6 +3166,8 @@ extension on TranslationsSv { 'fileInfo.flagHearingImpaired' => 'Hörselskadade', 'fileInfo.flagDub' => 'Dubbad', 'fileInfo.flagOriginal' => 'Original', + 'fileInfo.channelsMono' => 'Mono', + 'fileInfo.dolbyVisionProfile' => ({required Object profile}) => 'Profil ${profile}', 'mediaMenu.markAsWatched' => 'Markera som sedd', 'mediaMenu.markAsUnwatched' => 'Markera som osedd', 'mediaMenu.removeFromContinueWatching' => 'Ta bort från Fortsätt titta', @@ -3082,6 +3201,8 @@ extension on TranslationsSv { 'mediaMenu.rate' => 'Betygsätt', 'mediaMenu.playFromBeginning' => 'Spela från början', 'mediaMenu.playVersion' => 'Spela version...', + _ => null, + } ?? switch (path) { 'rateSheet.title' => 'Betygsätt', 'rateSheet.server' => 'Server', 'rateSheet.favorite' => 'Favorit', @@ -3091,8 +3212,6 @@ extension on TranslationsSv { 'rateSheet.noConnectedServices' => 'Anslut en tjänst i Inställningar för att betygsätta där.', 'accessibility.mediaCardMovie' => ({required Object title}) => '${title}, film', 'accessibility.mediaCardShow' => ({required Object title}) => '${title}, TV-serie', - _ => null, - } ?? switch (path) { 'accessibility.mediaCardEpisode' => ({required Object title, required Object episodeInfo}) => '${title}, ${episodeInfo}', 'accessibility.mediaCardSeason' => ({required Object title, required Object seasonInfo}) => '${title}, ${seasonInfo}', 'accessibility.mediaCardWatched' => 'sedd', @@ -3113,6 +3232,11 @@ extension on TranslationsSv { 'accessibility.alphabetScrollHint' => 'Svep uppåt eller nedåt för att gå mellan bokstäver', 'accessibility.rowColumnPosition' => ({required Object row, required Object rowCount, required Object column, required Object columnCount}) => 'Rad ${row} av ${rowCount}, kolumn ${column} av ${columnCount}', 'accessibility.rowPosition' => ({required Object row, required Object rowCount}) => 'Rad ${row} av ${rowCount}', + 'accessibility.autoScrollPlay' => 'Starta automatisk rullning', + 'accessibility.autoScrollPause' => 'Pausa automatisk rullning', + 'accessibility.hueShort' => 'H', + 'accessibility.saturationShort' => 'S', + 'accessibility.valueShort' => 'V', 'tooltips.shufflePlay' => 'Blanda uppspelning', 'tooltips.playTrailer' => 'Spela trailer', 'tooltips.markAsWatched' => 'Markera som sedd', @@ -3203,6 +3327,15 @@ extension on TranslationsSv { 'videoControls.subtitleDownloadedNotApplied' => 'Undertexten laddades ned men kunde inte väljas', 'videoControls.subtitleDownloadFailed' => 'Det gick inte att ladda ned undertexten', 'videoControls.searchLanguages' => 'Sök språk...', + 'videoControls.skipIntro' => 'Hoppa över intro', + 'videoControls.skipCredits' => 'Hoppa över eftertexter', + 'videoControls.nextEpisode' => 'Nästa avsnitt', + 'videoControls.subtitleTrack' => ({required Object n}) => 'Spår ${n}', + 'videoControls.subtitleFile' => ({required Object name}) => 'Undertext ${name}', + 'videoControls.forcedTrack' => ({required Object label}) => '${label} (Forcerad)', + 'videoControls.osdSubtitlesOff' => 'Undertexter: Av', + 'videoControls.osdSubtitles' => ({required Object track}) => 'Undertexter: ${track}', + 'videoControls.osdAudio' => ({required Object track}) => 'Ljud: ${track}', 'messages.markedAsWatched' => 'Markerad som sedd', 'messages.markedAsUnwatched' => 'Markerad som osedd', 'messages.markedAsWatchedOffline' => 'Markerad som sedd (synkroniseras när online)', @@ -3252,9 +3385,18 @@ extension on TranslationsSv { 'messages.serverLimitBody' => 'Serverfel (HTTP 500). En bandbredds-/transkodningsgräns avvisade troligen sessionen. Be ägaren justera den.', 'messages.mediaUnreadableTitle' => 'Filen är otillgänglig', 'messages.mediaUnreadableBody' => 'Servern hittade objektet men kunde inte läsa dess fil (HTTP 404). Filen har troligen flyttats, tagits bort eller så är dess lagring offline. Be serverägaren kontrollera filen och skanna om biblioteket.', + 'messages.serverBusyTitle' => 'Strömmen är inte tillgänglig', + 'messages.serverBusyBody' => 'Servern nekade upprepade gånger att strömma den här filen (HTTP 503). Den kan hålla på att startas om eller vara upptagen, eller så kan lagringen där filen finns vara offline. Försök igen om en stund – om det fortsätter, be serverns ägare att kontrollera servern och lagringen där filen finns.', 'messages.logsUploaded' => 'Loggarna har laddats upp', 'messages.logsUploadFailed' => 'Det gick inte att ladda upp loggarna', 'messages.logId' => 'Logg-ID', + 'messages.burnedSubtitlesUseMenu' => 'Undertexterna är inbrända i den här strömmen. Ändra dem via undertextmenyn.', + 'messages.noVideoUrl' => 'Ingen video-URL är tillgänglig', + 'messages.playbackNoMediaSources' => 'Servern returnerade inga spelbara mediekällor', + 'messages.playbackDataNotPrepared' => 'Uppspelningen startades innan uppspelningsinformationen var klar', + 'messages.streamSelectionUnavailable' => 'Val av ström är inte tillgängligt för den här källan', + 'messages.streamSelectionFailed' => 'Kunde inte tillämpa de valda strömmarna', + 'messages.serverUnavailableForProfile' => 'Ingen server är tillgänglig för den aktiva profilen', 'subtitlingStyling.text' => 'Text', 'subtitlingStyling.border' => 'Kantlinje', 'subtitlingStyling.background' => 'Bakgrund', @@ -3271,6 +3413,8 @@ extension on TranslationsSv { 'subtitlingStyling.overrideStrip' => 'Ta bort formatering', 'subtitlingStyling.positionTop' => 'Överst', 'subtitlingStyling.positionBottom' => 'Nederst', + 'subtitlingStyling.anchorToScreen' => 'Förankra vid skärmen', + 'subtitlingStyling.anchorToScreenDescription' => 'Visa textbaserade undertexter i de svarta fälten under bredbildsvideon', 'subtitlingStyling.bold' => 'Fet', 'subtitlingStyling.italic' => 'Kursiv', 'subtitlingStyling.renderResolution' => 'Renderingsupplösning', @@ -3353,6 +3497,7 @@ extension on TranslationsSv { 'profiles.pinExplain' => 'En fyrsiffrig PIN-kod krävs för att byta profil.', 'profiles.continueButton' => 'Fortsätt', 'profiles.pinsDontMatch' => 'PIN-koderna stämmer inte överens', + 'profiles.tokenIdentityMismatch' => 'Plex-profiltoken kopplades till en oväntad server', 'connections.sectionTitle' => 'Anslutningar', 'connections.addConnection' => 'Lägg till anslutning', 'connections.addConnectionSubtitleNoProfile' => 'Logga in med Plex eller anslut en Jellyfin-server', @@ -3386,6 +3531,7 @@ extension on TranslationsSv { 'discover.tvShow' => 'TV-serie', 'discover.minutesLeft' => ({required Object minutes}) => '${minutes} min kvar', 'discover.moreLikeThis' => 'Mer liknande innehåll', + 'discover.titleCount' => ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('sv'))(n, one: '${n} titel', other: '${n} titlar', ), 'errors.searchFailed' => ({required Object error}) => 'Sökningen misslyckades: ${error}', 'errors.searchUnavailable' => 'Sökningen kunde inte nå någon medieserver.', 'errors.connectionTimeout' => ({required Object context}) => 'Anslutningen tog för lång tid när ${context} lästes in', @@ -3558,7 +3704,10 @@ extension on TranslationsSv { 'explore.characters' => 'Karaktärer', 'explore.addToWatchlist' => 'Lägg till i bevakningslista', 'explore.removeFromWatchlist' => 'Ta bort från bevakningslista', + 'explore.addedToWatchlist' => 'Tillagd i bevakningslistan', + 'explore.removedFromWatchlist' => 'Borttagen från bevakningslistan', 'explore.watchlistUpdateFailed' => 'Det gick inte att uppdatera bevakningslistan', + 'explore.watchlistNoMatch' => 'Det gick inte att matcha det här objektet mot en bevakningslista', 'explore.notInLibrary' => 'Finns inte i ditt bibliotek', 'explore.inTheseLibraries' => 'I dessa bibliotek', 'explore.checkingLibrary' => 'Kontrollerar ditt bibliotek...', @@ -3566,6 +3715,8 @@ extension on TranslationsSv { 'explore.emptyMessage' => ({required Object source}) => 'Rader från ${source} visas här när de har innehåll.', 'explore.searchHint' => ({required Object source}) => 'Sök i ${source}', 'explore.searchEmpty' => ({required Object query}) => 'Inga resultat för "${query}"', + _ => null, + } ?? switch (path) { 'explore.searchPrompt' => ({required Object source}) => 'Sök efter filmer och serier på ${source}.', 'explore.searchFailed' => 'Sökningen misslyckades. Kontrollera din anslutning och försök igen.', 'explore.badge.rankPopular' => ({required Object n}) => '#${n} populär', @@ -3605,8 +3756,6 @@ extension on TranslationsSv { 'explore.stats.completed' => ({required Object n}) => '${n} avslutade', 'explore.stats.onHold' => ({required Object n}) => '${n} på paus', 'explore.stats.dropped' => ({required Object n}) => '${n} hoppade av', - _ => null, - } ?? switch (path) { 'explore.season.winter' => 'Vinter', 'explore.season.spring' => 'Vår', 'explore.season.summer' => 'Sommar', @@ -3703,6 +3852,9 @@ extension on TranslationsSv { 'liveTv.watchChannel' => 'Titta på kanal', 'liveTv.favorites' => 'Favoriter', 'liveTv.reorderFavorites' => 'Ordna om favoriter', + 'liveTv.noFavoriteChannels' => 'Inga favoritkanaler', + 'liveTv.noFavoriteChannelsHint' => 'Visa alla kanaler och tryck sedan länge på en kanal för att lägga till den som favorit.', + 'liveTv.showAllChannels' => 'Visa alla kanaler', 'liveTv.favoritesLoadFailed' => 'Det gick inte att läsa in favoriter. Kontrollera anslutningen och försök igen.', 'liveTv.favoritesUpdateFailed' => 'Det gick inte att uppdatera favoriterna. Kontrollera anslutningen och försök igen.', 'liveTv.joinSession' => 'Gå med i pågående session', @@ -3742,6 +3894,11 @@ extension on TranslationsSv { 'liveTv.guideReloadRequested' => 'Uppdatering av programguiden har begärts', 'liveTv.rulesProcessRequested' => 'Ny regelutvärdering har begärts', 'liveTv.recordShow' => 'Spela in program', + 'liveTv.startingInMinutes' => ({required Object minutes}) => 'Börjar om ${minutes} min', + 'liveTv.dayAtTime' => ({required Object day, required Object time}) => '${day} kl. ${time}', + 'liveTv.invalidPlaybackData' => ({required Object product}) => '${product} returnerade ogiltiga uppspelningsdata för Live-TV', + 'liveTv.failedToStartChannel' => 'Kunde inte starta livekanalen', + 'liveTv.failedToBuildStreamUrl' => 'Kunde inte skapa strömmens URL', 'collections.title' => 'Samlingar', 'collections.collection' => 'Samling', 'collections.empty' => 'Samlingen är tom', @@ -3810,6 +3967,8 @@ extension on TranslationsSv { 'music.repeat' => 'Upprepa', 'music.repeatAll' => 'Upprepa alla', 'music.repeatOne' => 'Upprepa en låt', + 'music.instantMixNoServer' => 'Ingen server är tillgänglig för en snabbmix', + 'music.noAudioUrl' => ({required Object track}) => 'Ingen ljud-URL är tillgänglig för ${track}', 'watchTogether.title' => 'Titta tillsammans', 'watchTogether.description' => 'Titta på innehåll synkroniserat med vänner och familj', 'watchTogether.createSession' => 'Skapa session', @@ -3875,6 +4034,7 @@ extension on TranslationsSv { 'watchTogether.removeRoom' => 'Ta bort', 'watchTogether.guestSwitchUnavailable' => 'Kunde inte byta — server inte tillgänglig för synkronisering', 'watchTogether.guestSwitchFailed' => 'Kunde inte byta — innehåll hittades inte på denna server', + 'watchTogether.defaultDisplayName' => 'Användare', 'downloads.title' => 'Nedladdningar', 'downloads.manage' => 'Hantera', 'downloads.tvShows' => 'TV-serier', @@ -3975,6 +4135,16 @@ extension on TranslationsSv { 'downloads.backgroundWarning.statusUnknown' => 'Inte kontrollerat än', 'downloads.backgroundWarning.settingsUnavailable' => 'Det gick inte att öppna systeminställningarna på den här enheten', 'downloads.backgroundWarning.linkUnavailable' => 'Det gick inte att öppna dontkillmyapp.com på den här enheten', + 'downloads.unknownShow' => 'Okänd serie', + 'downloads.unknownSeason' => 'Okänd säsong', + 'downloads.unknownAlbum' => 'Okänt album', + 'downloads.completedOfTotal' => ({required Object completed, required Object total}) => '${completed}/${total} slutförda', + 'downloads.errorFileNotFound' => 'Filen hittades inte (404)', + 'downloads.errorDownloadFailed' => 'Nedladdningen misslyckades', + 'downloads.errorPostProcessing' => ({required Object error}) => 'Efterbehandlingen misslyckades: ${error}', + 'downloads.notificationDownloading' => 'Laddar ned...', + 'downloads.notificationComplete' => 'Nedladdningen är klar', + 'downloads.notificationPaused' => 'Nedladdningen har pausats', 'shaders.title' => 'Shaders', 'shaders.noShaderDescription' => 'Ingen videoförbättring', 'shaders.nvscalerDescription' => 'NVIDIA-bildskalning för skarpare video', @@ -4054,14 +4224,24 @@ extension on TranslationsSv { 'companionRemote.errors.failedToConnectAnyAddress' => 'Det gick inte att ansluta till någon adress', 'companionRemote.errors.connectionLostAfterAttempts' => ({required Object attempts}) => 'Anslutningen bröts efter ${attempts} försök', 'companionRemote.errors.connectionLost' => 'Anslutningen bröts', + 'companionRemote.closedBeforeAuth' => 'Anslutningen stängdes före autentiseringen', 'videoSettings.playbackSpeed' => 'Uppspelningshastighet', 'videoSettings.normalSpeed' => 'Normal', 'videoSettings.sleepTimerActive' => ({required Object duration}) => 'Aktiv (${duration})', 'videoSettings.zoom' => 'Zoom', + _ => null, + } ?? switch (path) { 'videoSettings.sleepTimer' => 'Sovtimer', 'videoSettings.audioSync' => 'Ljudsynkronisering', 'videoSettings.subtitleSync' => 'Undertextsynkronisering', 'videoSettings.hdr' => 'HDR', + 'videoSettings.hdrUnsupported' => 'HDR kan inte användas här – skrivbordets kompositionshanterare eller videoutgången kan inte överföra det.', + 'videoSettings.hdrToneMapping' => 'HDR-tonmappning', + 'videoSettings.hdrToneMappingCompositor' => 'Kompositionshanterare', + 'videoSettings.hdrToneMappingCompositorDescription' => 'Vidarebefordra källans HDR-metadata och låt skrivbordets kompositionshanterare tonmappa dem.', + 'videoSettings.hdrToneMappingPlayer' => 'Spelare', + 'videoSettings.hdrToneMappingPlayerDescription' => 'Tonmappa till skärmens maximala ljusstyrka i spelaren och informera sedan kompositionshanteraren om resultatet.', + 'videoSettings.hdrToneMappingFailed' => 'Det gick inte att ändra HDR-tonmappningen – det föregående läget är fortfarande aktivt.', 'videoSettings.audioOutput' => 'Ljudutgång', 'videoSettings.performanceOverlay' => 'Prestandaöverlägg', 'videoSettings.audioOutputDolbyAtmos' => 'Dolby Atmos', @@ -4106,6 +4286,16 @@ extension on TranslationsSv { 'performanceOverlay.player' => 'Spelare', 'performanceOverlay.memory' => 'Minne', 'performanceOverlay.uiFps' => 'UI FPS', + 'performanceOverlay.fps' => 'FPS', + 'performanceOverlay.decoderAndroidHw' => 'Android HW', + 'performanceOverlay.decoderNvidiaHw' => 'NVIDIA HW', + 'performanceOverlay.decoderQualcommHw' => 'Qualcomm HW', + 'performanceOverlay.decoderMediatekHw' => 'MediaTek HW', + 'performanceOverlay.decoderExynosHw' => 'Exynos HW', + 'performanceOverlay.decoderSoftware' => 'Programvara', + 'performanceOverlay.decoderHardware' => 'Maskinvara', + 'performanceOverlay.tunnelingActive' => 'Aktiv', + 'performanceOverlay.dvRpuFailed' => ({required Object converted, required Object failures}) => '${converted} (${failures} misslyckades)', 'externalPlayer.title' => 'Extern spelare', 'externalPlayer.useExternalPlayer' => 'Använd extern spelare', 'externalPlayer.useExternalPlayerDescription' => 'Öppna videor i en annan app', @@ -4119,8 +4309,6 @@ extension on TranslationsSv { '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', @@ -4254,6 +4442,16 @@ extension on TranslationsSv { 'seerr.statusPartiallyAvailable' => 'Delvis tillgänglig', 'seerr.statusRequested' => 'Begärd', 'seerr.statusProcessing' => 'Bearbetas', + 'seerr.couldNotReach' => ({required Object url, required Object error}) => 'Kunde inte nå ${url}: ${error}', + 'seerr.noInstanceAtUrl' => ({required Object url, required Object status}) => 'Det finns ingen Seerr-instans på ${url} (HTTP ${status})', + 'seerr.notInitialized' => 'Den här Seerr-instansen har inte slutfört den inledande konfigurationen', + 'seerr.noPlexTokenForReauth' => 'Det finns ingen Plex-token tillgänglig för att logga in igen', + 'seerr.noStoredCredentials' => 'Det finns inga sparade inloggningsuppgifter för att logga in igen', + 'seerr.signInRejected' => 'Inloggningen avvisades', + 'seerr.noSessionCookie' => 'Seerr skapade ingen sessionscookie', + 'seerr.freshCookieRejected' => 'Seerr avvisade den nya sessionscookien', + 'seerr.noUserInformation' => 'Seerr returnerade ingen användarinformation', + 'seerr.sessionRejectedAfterReauth' => 'Sessionen avvisades efter den nya inloggningen', 'services.title' => 'Tjänster', 'services.hubSubtitle' => 'Synkronisera visningsstatus och begär nya titlar.', 'services.notConnected' => 'Inte ansluten', @@ -4269,6 +4467,7 @@ extension on TranslationsSv { 'services.names.seerr' => 'Seerr', 'services.names.mdblist' => 'MDBList', 'services.deviceCode.title' => ({required Object service}) => 'Aktivera Plezy på ${service}', + 'services.deviceCode.instructions' => 'Skanna QR-koden eller gå till adressen nedan och ange den här koden:', 'services.deviceCode.openToActivate' => ({required Object service}) => 'Öppna ${service} för att aktivera', 'services.deviceCode.copyCode' => 'Kopiera aktiveringskod', 'services.deviceCode.waitingForAuthorization' => 'Väntar på auktorisering…', @@ -4318,6 +4517,24 @@ extension on TranslationsSv { 'addServer.connectToMediaBrowserCardSubtitleScoped' => ({required Object product, required Object name}) => 'Logga in på din ${product}-server. Knyts till ${name}.', 'addServer.borrowFromAnotherProfile' => 'Låna från en annan profil', 'addServer.borrowFromAnotherProfileSubtitle' => 'Återanvänd en annan profils anslutning. PIN-skyddade profiler kräver en PIN.', + 'addServer.invalidCredentials' => 'Ogiltigt användarnamn eller lösenord', + 'addServer.authResponseNotJson' => 'Autentiseringssvaret var inte ett giltigt JSON-svar', + 'addServer.quickConnectRejected' => 'Quick Connect avvisades av servern', + 'addServer.quickConnectNotJson' => 'Quick Connect-svaret var inte ett giltigt JSON-svar', + 'addServer.quickConnectMissingFields' => 'Quick Connect-svaret saknar en kod eller hemlig nyckel', + 'addServer.quickConnectPollRejected' => 'Servern avvisade avsökningen för Quick Connect', + 'addServer.serverTimedOut' => 'Servern svarade inte i tid', + 'addServer.responseNotJson' => 'Serversvaret var inte ett giltigt JSON-svar', + 'addServer.responseMissingIdentity' => ({required Object product}) => 'Svaret saknar ett ID eller servernamn – är det här en ${product}-server?', + 'addServer.probeFailed' => ({required Object error}) => 'Kunde inte nå servern: ${error}', + 'addServer.enterAtLeastOneUrl' => ({required Object product}) => 'Ange minst en server-URL för ${product}', + 'addServer.noReachableServer' => ({required Object product}) => 'Ingen nåbar ${product}-server hittades', + 'addServer.urlsPointToDifferentServers' => ({required Object product}) => 'De här URL:erna pekar på olika servrar för ${product}', + 'addServer.urlDoesNotMatchServer' => ({required Object product}) => 'Den här URL:en stämmer inte överens med ${product}-servern', + 'addServer.redirectUnsupported' => 'Servern omdirigerade till en URL som inte stöds', + 'addServer.redirectDifferentHost' => ({required Object product}) => 'Servern omdirigerade till en annan värd. Ange den slutliga URL:en för ${product} direkt.', + 'addServer.redirectInsecure' => 'Servern omdirigerade från HTTPS till en osäker URL', + 'addServer.redirectUnsupportedEnterFinal' => ({required Object product}) => 'Servern omdirigerade till en URL som inte stöds. Ange den slutliga URL:en för ${product} direkt.', _ => null, }; } diff --git a/lib/i18n/strings_tr.g.dart b/lib/i18n/strings_tr.g.dart index 5ee93d80..626880ef 100644 --- a/lib/i18n/strings_tr.g.dart +++ b/lib/i18n/strings_tr.g.dart @@ -123,6 +123,7 @@ class _Translations$auth$tr extends Translations$auth$en { @override String get quickConnectCancel => 'İptal'; @override String get quickConnectExpired => 'Hızlı Bağlantı süresi doldu. Tekrar deneyin.'; @override String get localDataRecoveryRequired => 'Plezy yerel giriş ve bekleyen oynatma verilerini güvenli bir şekilde kurtaramadı. Lütfen tekrar giriş yapın.'; + @override String get pinCheckRejected => 'Plex PIN denetimi reddedildi'; } // Path: common @@ -178,6 +179,9 @@ class _Translations$common$tr extends Translations$common$en { @override String get exitFullscreen => 'Tam Ekrandan Çık'; @override String get pressBackAgainToExit => 'Çıkmak için tekrar geri tuşuna basın'; @override late final _Translations$common$ratingSource$tr ratingSource = _Translations$common$ratingSource$tr._(_root); + @override String get notAvailable => 'N/A'; + @override String get url => 'URL'; + @override String get letterKeys => 'ABC'; } // Path: screens @@ -444,6 +448,8 @@ class _Translations$settings$tr extends Translations$settings$en { @override String get showNavBarLabels => 'Gezinme Çubuğu Etiketlerini Göster'; @override String get showNavBarLabelsDescription => 'Gezinme çubuğu simgelerinin altında metin etiketlerini göster'; @override String get startupSection => 'Başlangıç Bölümü'; + @override String get showExploreTab => 'Keşfet sekmesini göster'; + @override String get showExploreTabDescription => 'Plex Keşfet ve bağlı takip hizmetlerinden gelen içeriklerle Keşfet sekmesini göster'; @override String get liveTvDefaultFavorites => 'Canlı TV\'de Favorileri Varsayılan Yap'; @override String get liveTvDefaultFavoritesDescription => 'Canlı TV açıldığında yalnızca favori kanalları göster'; @override String get display => 'Ekran'; @@ -455,6 +461,7 @@ class _Translations$settings$tr extends Translations$settings$en { @override String get subtitlesAndConfig => 'Altyazılar ve Yapılandırma'; @override String get seekAndTiming => 'Sarılma ve Zamanlama'; @override String get behavior => 'Davranış'; + @override String get exportDialogTitle => 'Plezy ayarlarını dışa aktar'; } // Path: search @@ -606,6 +613,8 @@ class _Translations$fileInfo$tr extends Translations$fileInfo$en { @override String get flagHearingImpaired => 'İşitme Engelliler İçin'; @override String get flagDub => 'Dublaj'; @override String get flagOriginal => 'Orijinal'; + @override String get channelsMono => 'Mono'; + @override String dolbyVisionProfile({required Object profile}) => 'Profil ${profile}'; } // Path: mediaMenu @@ -704,6 +713,11 @@ class _Translations$accessibility$tr extends Translations$accessibility$en { @override String get alphabetScrollHint => 'Harfe göre gitmek için yukarı veya aşağı kaydırın'; @override String rowColumnPosition({required Object row, required Object rowCount, required Object column, required Object columnCount}) => 'Satır ${row} / ${rowCount}, sütun ${column} / ${columnCount}'; @override String rowPosition({required Object row, required Object rowCount}) => 'Satır ${row} / ${rowCount}'; + @override String get autoScrollPlay => 'Otomatik kaydırmayı başlat'; + @override String get autoScrollPause => 'Otomatik kaydırmayı duraklat'; + @override String get hueShort => 'H'; + @override String get saturationShort => 'S'; + @override String get valueShort => 'V'; } // Path: tooltips @@ -815,6 +829,15 @@ class _Translations$videoControls$tr extends Translations$videoControls$en { @override String get subtitleDownloadedNotApplied => 'Altyazı indirildi ancak seçilemedi'; @override String get subtitleDownloadFailed => 'Altyazı indirilemedi'; @override String get searchLanguages => 'Dillerde ara...'; + @override String get skipIntro => 'İntroyu atla'; + @override String get skipCredits => 'Jeneriği atla'; + @override String get nextEpisode => 'Sonraki bölüm'; + @override String subtitleTrack({required Object n}) => 'Parça ${n}'; + @override String subtitleFile({required Object name}) => 'Altyazı ${name}'; + @override String forcedTrack({required Object label}) => '${label} (Zorunlu)'; + @override String get osdSubtitlesOff => 'Altyazı: Kapalı'; + @override String osdSubtitles({required Object track}) => 'Altyazı: ${track}'; + @override String osdAudio({required Object track}) => 'Ses: ${track}'; } // Path: messages @@ -876,9 +899,18 @@ class _Translations$messages$tr extends Translations$messages$en { @override String get serverLimitBody => 'Sunucu hatası (HTTP 500). Muhtemelen bir bant genişliği/kod dönüştürme sınırı bu oturumu reddetti. Sunucu sahibinden bunu ayarlamasını isteyin.'; @override String get mediaUnreadableTitle => 'Dosya kullanılamıyor'; @override String get mediaUnreadableBody => 'Sunucu bu ögeyi buldu ancak dosyasını okuyamadı (HTTP 404). Dosya büyük olasılıkla taşındı, silindi veya depolama alanı çevrimdışı. Sunucu sahibinden dosyayı kontrol edip kitaplığı yeniden taramasını isteyin.'; + @override String get serverBusyTitle => 'Akış kullanılamıyor'; + @override String get serverBusyBody => 'Sunucu bu dosyayı yayınlamayı sürekli reddetti (HTTP 503). Sunucu yeniden başlatılıyor veya meşgul olabilir ya da dosyanın bulunduğu depolama birimi çevrim dışı olabilir. Kısa süre sonra tekrar deneyin — sorun devam ederse sunucu sahibinden sunucuyu ve dosyanın bulunduğu depolama birimini kontrol etmesini isteyin.'; @override String get logsUploaded => 'Günlükler yüklendi'; @override String get logsUploadFailed => 'Günlükler yüklenemedi'; @override String get logId => 'Günlük Kimliği (ID)'; + @override String get burnedSubtitlesUseMenu => 'Altyazılar bu akışın görüntüsüne gömülü. Bunları altyazı menüsünden değiştirin.'; + @override String get noVideoUrl => 'Kullanılabilir video URL\'si yok'; + @override String get playbackNoMediaSources => 'Sunucu oynatılabilir medya kaynağı döndürmedi'; + @override String get playbackDataNotPrepared => 'Oynatma, veriler hazır olmadan başlatıldı'; + @override String get streamSelectionUnavailable => 'Akış seçimi bu kaynak için kullanılamıyor'; + @override String get streamSelectionFailed => 'Seçilen akışlar uygulanamadı'; + @override String get serverUnavailableForProfile => 'Etkin profil için kullanılabilir sunucu yok'; } // Path: subtitlingStyling @@ -904,6 +936,8 @@ class _Translations$subtitlingStyling$tr extends Translations$subtitlingStyling$ @override String get overrideStrip => 'Biçimlendirmeyi kaldır'; @override String get positionTop => 'Üst'; @override String get positionBottom => 'Alt'; + @override String get anchorToScreen => 'Ekrana sabitle'; + @override String get anchorToScreenDescription => 'Metin altyazılarını geniş ekran videonun altındaki siyah çubuklarda göster'; @override String get bold => 'Kalın'; @override String get italic => 'İtalik'; @override String get renderResolution => 'İşleme Çözünürlüğü'; @@ -1013,6 +1047,7 @@ class _Translations$profiles$tr extends Translations$profiles$en { @override String get pinExplain => 'Profiller arasında geçiş yapmak için 4 haneli PIN gereklidir.'; @override String get continueButton => 'Devam Et'; @override String get pinsDontMatch => 'PIN\'ler eşleşmiyor'; + @override String get tokenIdentityMismatch => 'Plex profil belirtecinin beklenmeyen bir sunucuya ait olduğu belirlendi'; } // Path: connections @@ -1064,6 +1099,10 @@ class _Translations$discover$tr extends Translations$discover$en { @override String get tvShow => 'TV Dizisi'; @override String minutesLeft({required Object minutes}) => '${minutes} dk kaldı'; @override String get moreLikeThis => 'Buna Benzerler'; + @override String titleCount({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('tr'))(n, + one: '${n} başlık', + other: '${n} başlık', + ); } // Path: errors @@ -1276,7 +1315,10 @@ class _Translations$explore$tr extends Translations$explore$en { @override String get characters => 'Karakterler'; @override String get addToWatchlist => 'İzleme Listesine Ekle'; @override String get removeFromWatchlist => 'İzleme Listesinden Kaldır'; + @override String get addedToWatchlist => 'İzleme listesine eklendi'; + @override String get removedFromWatchlist => 'İzleme listesinden kaldırıldı'; @override String get watchlistUpdateFailed => 'İzleme listesi güncellenemedi'; + @override String get watchlistNoMatch => 'Bu öğe bir izleme listesiyle eşleştirilemedi'; @override String get notInLibrary => 'Kitaplığınızda yok'; @override String get inTheseLibraries => 'Bu kitaplıklarda var'; @override String get checkingLibrary => 'Kitaplığınız kontrol ediliyor...'; @@ -1337,6 +1379,9 @@ class _Translations$liveTv$tr extends Translations$liveTv$en { @override String get watchChannel => 'Kanalı İzle'; @override String get favorites => 'Favoriler'; @override String get reorderFavorites => 'Favorileri Yeniden Sırala'; + @override String get noFavoriteChannels => 'Favori kanal yok'; + @override String get noFavoriteChannelsHint => 'Tüm kanalları gösterin, ardından favorilerinize eklemek için bir kanalı basılı tutun.'; + @override String get showAllChannels => 'Tüm kanalları göster'; @override String get favoritesLoadFailed => 'Favoriler yüklenemedi. Bağlantınızı kontrol edip tekrar deneyin.'; @override String get favoritesUpdateFailed => 'Favoriler güncellenemedi. Bağlantınızı kontrol edip tekrar deneyin.'; @override String get joinSession => 'Devam Eden Oturuma Katıl'; @@ -1376,6 +1421,11 @@ class _Translations$liveTv$tr extends Translations$liveTv$en { @override String get guideReloadRequested => 'Rehber yenilemesi istendi'; @override String get rulesProcessRequested => 'Kuralın yeniden değerlendirilmesi istendi'; @override String get recordShow => 'Programı kaydet'; + @override String startingInMinutes({required Object minutes}) => '${minutes} dk içinde başlıyor'; + @override String dayAtTime({required Object day, required Object time}) => '${day} saat ${time}'; + @override String invalidPlaybackData({required Object product}) => '${product} geçersiz Canlı TV oynatma verileri döndürdü'; + @override String get failedToStartChannel => 'Canlı kanal başlatılamadı'; + @override String get failedToBuildStreamUrl => 'Akış URL\'si oluşturulamadı'; } // Path: collections @@ -1474,6 +1524,8 @@ class _Translations$music$tr extends Translations$music$en { @override String get repeat => 'Tekrarla'; @override String get repeatAll => 'Tümünü tekrarla'; @override String get repeatOne => 'Tekini tekrarla'; + @override String get instantMixNoServer => 'Anında miks için kullanılabilir sunucu yok'; + @override String noAudioUrl({required Object track}) => '${track} için kullanılabilir ses URL\'si yok'; } // Path: watchTogether @@ -1548,6 +1600,7 @@ class _Translations$watchTogether$tr extends Translations$watchTogether$en { @override String get removeRoom => 'Kaldır'; @override String get guestSwitchUnavailable => 'Geçiş yapılamadı — eşitleme için sunucu mevcut değil'; @override String get guestSwitchFailed => 'Geçiş yapılamadı — içerik bu sunucuda bulunamadı'; + @override String get defaultDisplayName => 'Kullanıcı'; } // Path: downloads @@ -1632,6 +1685,16 @@ class _Translations$downloads$tr extends Translations$downloads$en { @override String get syncRuleUnknownServer => 'Bilinmeyen sunucu'; @override String get syncRuleListCreated => 'Eşitleme kuralı oluşturuldu'; @override late final _Translations$downloads$backgroundWarning$tr backgroundWarning = _Translations$downloads$backgroundWarning$tr._(_root); + @override String get unknownShow => 'Bilinmeyen Dizi'; + @override String get unknownSeason => 'Bilinmeyen Sezon'; + @override String get unknownAlbum => 'Bilinmeyen Albüm'; + @override String completedOfTotal({required Object completed, required Object total}) => '${completed}/${total} tamamlandı'; + @override String get errorFileNotFound => 'Dosya bulunamadı (404)'; + @override String get errorDownloadFailed => 'İndirme başarısız oldu'; + @override String errorPostProcessing({required Object error}) => 'Son işleme başarısız oldu: ${error}'; + @override String get notificationDownloading => 'İndiriliyor...'; + @override String get notificationComplete => 'İndirme tamamlandı'; + @override String get notificationPaused => 'İndirme duraklatıldı'; } // Path: shaders @@ -1672,6 +1735,7 @@ class _Translations$companionRemote$tr extends Translations$companionRemote$en { @override late final _Translations$companionRemote$pairing$tr pairing = _Translations$companionRemote$pairing$tr._(_root); @override late final _Translations$companionRemote$remote$tr remote = _Translations$companionRemote$remote$tr._(_root); @override late final _Translations$companionRemote$errors$tr errors = _Translations$companionRemote$errors$tr._(_root); + @override String get closedBeforeAuth => 'Bağlantı, kimlik doğrulamadan önce kapandı'; } // Path: videoSettings @@ -1689,6 +1753,13 @@ class _Translations$videoSettings$tr extends Translations$videoSettings$en { @override String get audioSync => 'Ses Senkronizasyonu'; @override String get subtitleSync => 'Altyazı Senkronizasyonu'; @override String get hdr => 'HDR'; + @override String get hdrUnsupported => 'HDR burada kullanılamıyor — bu masaüstü birleştiricisi veya video çıkışı HDR\'yi taşıyamıyor.'; + @override String get hdrToneMapping => 'HDR ton eşleme'; + @override String get hdrToneMappingCompositor => 'Birleştirici'; + @override String get hdrToneMappingCompositorDescription => 'Kaynağın HDR meta verilerini olduğu gibi iletip eşlemeyi masaüstü birleştiricisine bırakın.'; + @override String get hdrToneMappingPlayer => 'Oynatıcı'; + @override String get hdrToneMappingPlayerDescription => 'Oynatıcıda ekranın en yüksek parlaklığına göre eşleyin, ardından sonucu birleştiriciye bildirin.'; + @override String get hdrToneMappingFailed => 'HDR ton eşleme değiştirilemedi — önceki mod hâlâ etkin.'; @override String get audioOutput => 'Ses Çıkışı'; @override String get performanceOverlay => 'Performans Katmanı'; @override String get audioOutputDolbyAtmos => 'Dolby Atmos'; @@ -1742,6 +1813,16 @@ class _Translations$performanceOverlay$tr extends Translations$performanceOverla @override String get player => 'Oynatıcı'; @override String get memory => 'Bellek'; @override String get uiFps => 'Arayüz (UI) FPS'; + @override String get fps => 'FPS'; + @override String get decoderAndroidHw => 'Android Donanım'; + @override String get decoderNvidiaHw => 'NVIDIA Donanım'; + @override String get decoderQualcommHw => 'Qualcomm Donanım'; + @override String get decoderMediatekHw => 'MediaTek Donanım'; + @override String get decoderExynosHw => 'Exynos Donanım'; + @override String get decoderSoftware => 'Yazılım'; + @override String get decoderHardware => 'Donanım'; + @override String get tunnelingActive => 'Etkin'; + @override String dvRpuFailed({required Object converted, required Object failures}) => '${converted} (${failures} başarısız)'; } // Path: externalPlayer @@ -1942,6 +2023,16 @@ class _Translations$seerr$tr extends Translations$seerr$en { @override String get statusPartiallyAvailable => 'Kısmen mevcut'; @override String get statusRequested => 'İstendi'; @override String get statusProcessing => 'İşleniyor'; + @override String couldNotReach({required Object url, required Object error}) => '${url} adresine ulaşılamadı: ${error}'; + @override String noInstanceAtUrl({required Object url, required Object status}) => '${url} adresinde Seerr örneği bulunamadı (HTTP ${status})'; + @override String get notInitialized => 'Bu Seerr örneği ilk çalıştırma kurulumunu tamamlamadı'; + @override String get noPlexTokenForReauth => 'Yeniden giriş yapmak için kullanılabilir Plex belirteci yok'; + @override String get noStoredCredentials => 'Yeniden giriş yapmak için kullanılabilir kayıtlı kimlik bilgisi yok'; + @override String get signInRejected => 'Giriş reddedildi'; + @override String get noSessionCookie => 'Seerr bir oturum çerezi oluşturmadı'; + @override String get freshCookieRejected => 'Seerr yeni oturum çerezini reddetti'; + @override String get noUserInformation => 'Seerr kullanıcı bilgilerini döndürmedi'; + @override String get sessionRejectedAfterReauth => 'Yeniden giriş yapıldıktan sonra oturum reddedildi'; } // Path: services @@ -2002,6 +2093,24 @@ class _Translations$addServer$tr extends Translations$addServer$en { @override String connectToMediaBrowserCardSubtitleScoped({required Object product, required Object name}) => '${product} sunucunuza giriş yapın. ${name} profiline bağlanır.'; @override String get borrowFromAnotherProfile => 'Başka bir profilden ödünç al'; @override String get borrowFromAnotherProfileSubtitle => 'Başka bir profilin bağlantısını yeniden kullanın. PIN korumalı profiller bir PIN gerektirir.'; + @override String get invalidCredentials => 'Geçersiz kullanıcı adı veya şifre'; + @override String get authResponseNotJson => 'Kimlik doğrulama yanıtı geçerli bir JSON değildi'; + @override String get quickConnectRejected => 'Quick Connect sunucu tarafından reddedildi'; + @override String get quickConnectNotJson => 'Quick Connect yanıtı geçerli bir JSON değildi'; + @override String get quickConnectMissingFields => 'Quick Connect yanıtında kod veya gizli anahtar eksik'; + @override String get quickConnectPollRejected => 'Quick Connect yoklaması sunucu tarafından reddedildi'; + @override String get serverTimedOut => 'Sunucu zamanında yanıt vermedi'; + @override String get responseNotJson => 'Sunucu yanıtı geçerli bir JSON değildi'; + @override String responseMissingIdentity({required Object product}) => 'Yanıtta kimlik veya sunucu adı eksik — bu bir ${product} sunucusu mu?'; + @override String probeFailed({required Object error}) => 'Sunucuya ulaşılamadı: ${error}'; + @override String enterAtLeastOneUrl({required Object product}) => 'En az bir ${product} sunucu URL\'si girin'; + @override String noReachableServer({required Object product}) => 'Ulaşılabilir ${product} sunucusu bulunamadı'; + @override String urlsPointToDifferentServers({required Object product}) => 'Bu URL\'ler farklı ${product} sunucularını gösteriyor'; + @override String urlDoesNotMatchServer({required Object product}) => 'Bu URL, ${product} sunucusuyla eşleşmiyor'; + @override String get redirectUnsupported => 'Sunucu desteklenmeyen bir URL\'ye yönlendirdi'; + @override String redirectDifferentHost({required Object product}) => 'Sunucu farklı bir ana makineye yönlendirdi. Nihai ${product} URL\'sini doğrudan girin.'; + @override String get redirectInsecure => 'Sunucu HTTPS\'den güvenli olmayan bir URL\'ye yönlendirdi'; + @override String redirectUnsupportedEnterFinal({required Object product}) => 'Sunucu desteklenmeyen bir URL\'ye yönlendirdi. Nihai ${product} URL\'sini doğrudan girin.'; } // Path: common.ratingSource @@ -2521,6 +2630,7 @@ class _Translations$services$deviceCode$tr extends Translations$services$deviceC // Translations @override String title({required Object service}) => 'Plezy\'yi ${service} üzerinde etkinleştirin'; + @override String get instructions => 'QR kodunu tarayın veya aşağıdaki adresi ziyaret edip bu kodu girin:'; @override String openToActivate({required Object service}) => 'Etkinleştirmek için ${service} servisini açın'; @override String get copyCode => 'Etkinleştirme kodunu kopyala'; @override String get waitingForAuthorization => 'Yetkilendirme bekleniyor…'; @@ -2595,6 +2705,7 @@ extension on TranslationsTr { 'auth.quickConnectCancel' => 'İptal', 'auth.quickConnectExpired' => 'Hızlı Bağlantı süresi doldu. Tekrar deneyin.', 'auth.localDataRecoveryRequired' => 'Plezy yerel giriş ve bekleyen oynatma verilerini güvenli bir şekilde kurtaramadı. Lütfen tekrar giriş yapın.', + 'auth.pinCheckRejected' => 'Plex PIN denetimi reddedildi', 'common.cancel' => 'İptal', 'common.save' => 'Kaydet', 'common.close' => 'Kapat', @@ -2651,6 +2762,9 @@ extension on TranslationsTr { 'common.ratingSource.trakt' => 'Trakt', 'common.ratingSource.rottenTomatoesCritic' => 'Rotten Tomatoes eleştirmenleri', 'common.ratingSource.rottenTomatoesAudience' => 'Rotten Tomatoes izleyicileri', + 'common.notAvailable' => 'N/A', + 'common.url' => 'URL', + 'common.letterKeys' => 'ABC', 'screens.licenses' => 'Lisanslar', 'screens.switchProfile' => 'Profil Değiştir', 'screens.subtitleStyling' => 'Altyazı Biçimlendirmesi', @@ -2890,6 +3004,8 @@ extension on TranslationsTr { 'settings.showNavBarLabels' => 'Gezinme Çubuğu Etiketlerini Göster', 'settings.showNavBarLabelsDescription' => 'Gezinme çubuğu simgelerinin altında metin etiketlerini göster', 'settings.startupSection' => 'Başlangıç Bölümü', + 'settings.showExploreTab' => 'Keşfet sekmesini göster', + 'settings.showExploreTabDescription' => 'Plex Keşfet ve bağlı takip hizmetlerinden gelen içeriklerle Keşfet sekmesini göster', 'settings.liveTvDefaultFavorites' => 'Canlı TV\'de Favorileri Varsayılan Yap', 'settings.liveTvDefaultFavoritesDescription' => 'Canlı TV açıldığında yalnızca favori kanalları göster', 'settings.display' => 'Ekran', @@ -2901,6 +3017,7 @@ extension on TranslationsTr { 'settings.subtitlesAndConfig' => 'Altyazılar ve Yapılandırma', 'settings.seekAndTiming' => 'Sarılma ve Zamanlama', 'settings.behavior' => 'Davranış', + 'settings.exportDialogTitle' => 'Plezy ayarlarını dışa aktar', 'search.hint' => 'Film, dizi, müzik ara...', 'search.tryDifferentTerm' => 'Farklı bir arama terimi deneyin', 'search.searchYourMedia' => 'Medyanızda arayın', @@ -3049,6 +3166,8 @@ extension on TranslationsTr { 'fileInfo.flagHearingImpaired' => 'İşitme Engelliler İçin', 'fileInfo.flagDub' => 'Dublaj', 'fileInfo.flagOriginal' => 'Orijinal', + 'fileInfo.channelsMono' => 'Mono', + 'fileInfo.dolbyVisionProfile' => ({required Object profile}) => 'Profil ${profile}', 'mediaMenu.markAsWatched' => 'İzlendi Olarak İşaretle', 'mediaMenu.markAsUnwatched' => 'İzlenmedi Olarak İşaretle', 'mediaMenu.removeFromContinueWatching' => 'İzlemeye Devam Et\'ten Kaldır', @@ -3082,6 +3201,8 @@ extension on TranslationsTr { 'mediaMenu.rate' => 'Oyla', 'mediaMenu.playFromBeginning' => 'Baştan Oynat', 'mediaMenu.playVersion' => 'Sürümü Oynat...', + _ => null, + } ?? switch (path) { 'rateSheet.title' => 'Oyla', 'rateSheet.server' => 'Sunucu', 'rateSheet.favorite' => 'Favori', @@ -3091,8 +3212,6 @@ extension on TranslationsTr { 'rateSheet.noConnectedServices' => 'Orada oylamak için Ayarlar\'dan bir servis bağlayın.', 'accessibility.mediaCardMovie' => ({required Object title}) => '${title}, film', 'accessibility.mediaCardShow' => ({required Object title}) => '${title}, TV dizisi', - _ => null, - } ?? switch (path) { 'accessibility.mediaCardEpisode' => ({required Object title, required Object episodeInfo}) => '${title}, ${episodeInfo}', 'accessibility.mediaCardSeason' => ({required Object title, required Object seasonInfo}) => '${title}, ${seasonInfo}', 'accessibility.mediaCardWatched' => 'izlendi', @@ -3113,6 +3232,11 @@ extension on TranslationsTr { 'accessibility.alphabetScrollHint' => 'Harfe göre gitmek için yukarı veya aşağı kaydırın', 'accessibility.rowColumnPosition' => ({required Object row, required Object rowCount, required Object column, required Object columnCount}) => 'Satır ${row} / ${rowCount}, sütun ${column} / ${columnCount}', 'accessibility.rowPosition' => ({required Object row, required Object rowCount}) => 'Satır ${row} / ${rowCount}', + 'accessibility.autoScrollPlay' => 'Otomatik kaydırmayı başlat', + 'accessibility.autoScrollPause' => 'Otomatik kaydırmayı duraklat', + 'accessibility.hueShort' => 'H', + 'accessibility.saturationShort' => 'S', + 'accessibility.valueShort' => 'V', 'tooltips.shufflePlay' => 'Karışık oynat', 'tooltips.playTrailer' => 'Fragmanı oynat', 'tooltips.markAsWatched' => 'İzlendi olarak işaretle', @@ -3203,6 +3327,15 @@ extension on TranslationsTr { 'videoControls.subtitleDownloadedNotApplied' => 'Altyazı indirildi ancak seçilemedi', 'videoControls.subtitleDownloadFailed' => 'Altyazı indirilemedi', 'videoControls.searchLanguages' => 'Dillerde ara...', + 'videoControls.skipIntro' => 'İntroyu atla', + 'videoControls.skipCredits' => 'Jeneriği atla', + 'videoControls.nextEpisode' => 'Sonraki bölüm', + 'videoControls.subtitleTrack' => ({required Object n}) => 'Parça ${n}', + 'videoControls.subtitleFile' => ({required Object name}) => 'Altyazı ${name}', + 'videoControls.forcedTrack' => ({required Object label}) => '${label} (Zorunlu)', + 'videoControls.osdSubtitlesOff' => 'Altyazı: Kapalı', + 'videoControls.osdSubtitles' => ({required Object track}) => 'Altyazı: ${track}', + 'videoControls.osdAudio' => ({required Object track}) => 'Ses: ${track}', 'messages.markedAsWatched' => 'İzlendi olarak işaretlendi', 'messages.markedAsUnwatched' => 'İzlenmedi olarak işaretlendi', 'messages.markedAsWatchedOffline' => 'İzlendi olarak işaretlendi (çevrimiçi olunca senkronize edilecek)', @@ -3252,9 +3385,18 @@ extension on TranslationsTr { 'messages.serverLimitBody' => 'Sunucu hatası (HTTP 500). Muhtemelen bir bant genişliği/kod dönüştürme sınırı bu oturumu reddetti. Sunucu sahibinden bunu ayarlamasını isteyin.', 'messages.mediaUnreadableTitle' => 'Dosya kullanılamıyor', 'messages.mediaUnreadableBody' => 'Sunucu bu ögeyi buldu ancak dosyasını okuyamadı (HTTP 404). Dosya büyük olasılıkla taşındı, silindi veya depolama alanı çevrimdışı. Sunucu sahibinden dosyayı kontrol edip kitaplığı yeniden taramasını isteyin.', + 'messages.serverBusyTitle' => 'Akış kullanılamıyor', + 'messages.serverBusyBody' => 'Sunucu bu dosyayı yayınlamayı sürekli reddetti (HTTP 503). Sunucu yeniden başlatılıyor veya meşgul olabilir ya da dosyanın bulunduğu depolama birimi çevrim dışı olabilir. Kısa süre sonra tekrar deneyin — sorun devam ederse sunucu sahibinden sunucuyu ve dosyanın bulunduğu depolama birimini kontrol etmesini isteyin.', 'messages.logsUploaded' => 'Günlükler yüklendi', 'messages.logsUploadFailed' => 'Günlükler yüklenemedi', 'messages.logId' => 'Günlük Kimliği (ID)', + 'messages.burnedSubtitlesUseMenu' => 'Altyazılar bu akışın görüntüsüne gömülü. Bunları altyazı menüsünden değiştirin.', + 'messages.noVideoUrl' => 'Kullanılabilir video URL\'si yok', + 'messages.playbackNoMediaSources' => 'Sunucu oynatılabilir medya kaynağı döndürmedi', + 'messages.playbackDataNotPrepared' => 'Oynatma, veriler hazır olmadan başlatıldı', + 'messages.streamSelectionUnavailable' => 'Akış seçimi bu kaynak için kullanılamıyor', + 'messages.streamSelectionFailed' => 'Seçilen akışlar uygulanamadı', + 'messages.serverUnavailableForProfile' => 'Etkin profil için kullanılabilir sunucu yok', 'subtitlingStyling.text' => 'Metin', 'subtitlingStyling.border' => 'Kenarlık', 'subtitlingStyling.background' => 'Arka Plan', @@ -3271,6 +3413,8 @@ extension on TranslationsTr { 'subtitlingStyling.overrideStrip' => 'Biçimlendirmeyi kaldır', 'subtitlingStyling.positionTop' => 'Üst', 'subtitlingStyling.positionBottom' => 'Alt', + 'subtitlingStyling.anchorToScreen' => 'Ekrana sabitle', + 'subtitlingStyling.anchorToScreenDescription' => 'Metin altyazılarını geniş ekran videonun altındaki siyah çubuklarda göster', 'subtitlingStyling.bold' => 'Kalın', 'subtitlingStyling.italic' => 'İtalik', 'subtitlingStyling.renderResolution' => 'İşleme Çözünürlüğü', @@ -3353,6 +3497,7 @@ extension on TranslationsTr { 'profiles.pinExplain' => 'Profiller arasında geçiş yapmak için 4 haneli PIN gereklidir.', 'profiles.continueButton' => 'Devam Et', 'profiles.pinsDontMatch' => 'PIN\'ler eşleşmiyor', + 'profiles.tokenIdentityMismatch' => 'Plex profil belirtecinin beklenmeyen bir sunucuya ait olduğu belirlendi', 'connections.sectionTitle' => 'Bağlantılar', 'connections.addConnection' => 'Bağlantı ekle', 'connections.addConnectionSubtitleNoProfile' => 'Plex ile giriş yapın veya bir Jellyfin sunucusu bağlayın', @@ -3386,6 +3531,7 @@ extension on TranslationsTr { 'discover.tvShow' => 'TV Dizisi', 'discover.minutesLeft' => ({required Object minutes}) => '${minutes} dk kaldı', 'discover.moreLikeThis' => 'Buna Benzerler', + 'discover.titleCount' => ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('tr'))(n, one: '${n} başlık', other: '${n} başlık', ), 'errors.searchFailed' => ({required Object error}) => 'Arama başarısız: ${error}', 'errors.searchUnavailable' => 'Arama hiçbir medya sunucusuna ulaşamadı.', 'errors.connectionTimeout' => ({required Object context}) => '${context} yüklenirken bağlantı zaman aşımına uğradı', @@ -3558,7 +3704,10 @@ extension on TranslationsTr { 'explore.characters' => 'Karakterler', 'explore.addToWatchlist' => 'İzleme Listesine Ekle', 'explore.removeFromWatchlist' => 'İzleme Listesinden Kaldır', + 'explore.addedToWatchlist' => 'İzleme listesine eklendi', + 'explore.removedFromWatchlist' => 'İzleme listesinden kaldırıldı', 'explore.watchlistUpdateFailed' => 'İzleme listesi güncellenemedi', + 'explore.watchlistNoMatch' => 'Bu öğe bir izleme listesiyle eşleştirilemedi', 'explore.notInLibrary' => 'Kitaplığınızda yok', 'explore.inTheseLibraries' => 'Bu kitaplıklarda var', 'explore.checkingLibrary' => 'Kitaplığınız kontrol ediliyor...', @@ -3566,6 +3715,8 @@ extension on TranslationsTr { 'explore.emptyMessage' => ({required Object source}) => '${source} kaynağındaki satırlar içerik bulunduğunda burada görünecektir.', 'explore.searchHint' => ({required Object source}) => '${source} üzerinde ara', 'explore.searchEmpty' => ({required Object query}) => '"${query}" için sonuç bulunamadı', + _ => null, + } ?? switch (path) { 'explore.searchPrompt' => ({required Object source}) => '${source} üzerinde film ve dizileri arayın.', 'explore.searchFailed' => 'Arama başarısız. Bağlantınızı kontrol edip tekrar deneyin.', 'explore.badge.rankPopular' => ({required Object n}) => 'Popülerde #${n}', @@ -3605,8 +3756,6 @@ extension on TranslationsTr { 'explore.stats.completed' => ({required Object n}) => '${n} tamamladı', 'explore.stats.onHold' => ({required Object n}) => '${n} bekletiyor', 'explore.stats.dropped' => ({required Object n}) => '${n} bıraktı', - _ => null, - } ?? switch (path) { 'explore.season.winter' => 'Kış', 'explore.season.spring' => 'İlkbahar', 'explore.season.summer' => 'Yaz', @@ -3703,6 +3852,9 @@ extension on TranslationsTr { 'liveTv.watchChannel' => 'Kanalı İzle', 'liveTv.favorites' => 'Favoriler', 'liveTv.reorderFavorites' => 'Favorileri Yeniden Sırala', + 'liveTv.noFavoriteChannels' => 'Favori kanal yok', + 'liveTv.noFavoriteChannelsHint' => 'Tüm kanalları gösterin, ardından favorilerinize eklemek için bir kanalı basılı tutun.', + 'liveTv.showAllChannels' => 'Tüm kanalları göster', 'liveTv.favoritesLoadFailed' => 'Favoriler yüklenemedi. Bağlantınızı kontrol edip tekrar deneyin.', 'liveTv.favoritesUpdateFailed' => 'Favoriler güncellenemedi. Bağlantınızı kontrol edip tekrar deneyin.', 'liveTv.joinSession' => 'Devam Eden Oturuma Katıl', @@ -3742,6 +3894,11 @@ extension on TranslationsTr { 'liveTv.guideReloadRequested' => 'Rehber yenilemesi istendi', 'liveTv.rulesProcessRequested' => 'Kuralın yeniden değerlendirilmesi istendi', 'liveTv.recordShow' => 'Programı kaydet', + 'liveTv.startingInMinutes' => ({required Object minutes}) => '${minutes} dk içinde başlıyor', + 'liveTv.dayAtTime' => ({required Object day, required Object time}) => '${day} saat ${time}', + 'liveTv.invalidPlaybackData' => ({required Object product}) => '${product} geçersiz Canlı TV oynatma verileri döndürdü', + 'liveTv.failedToStartChannel' => 'Canlı kanal başlatılamadı', + 'liveTv.failedToBuildStreamUrl' => 'Akış URL\'si oluşturulamadı', 'collections.title' => 'Koleksiyonlar', 'collections.collection' => 'Koleksiyon', 'collections.empty' => 'Koleksiyon boş', @@ -3810,6 +3967,8 @@ extension on TranslationsTr { 'music.repeat' => 'Tekrarla', 'music.repeatAll' => 'Tümünü tekrarla', 'music.repeatOne' => 'Tekini tekrarla', + 'music.instantMixNoServer' => 'Anında miks için kullanılabilir sunucu yok', + 'music.noAudioUrl' => ({required Object track}) => '${track} için kullanılabilir ses URL\'si yok', 'watchTogether.title' => 'Birlikte İzle', 'watchTogether.description' => 'Arkadaşlarınızla ve ailenizle eş zamanlı içerik izleyin', 'watchTogether.createSession' => 'Oturum Oluştur', @@ -3875,6 +4034,7 @@ extension on TranslationsTr { 'watchTogether.removeRoom' => 'Kaldır', 'watchTogether.guestSwitchUnavailable' => 'Geçiş yapılamadı — eşitleme için sunucu mevcut değil', 'watchTogether.guestSwitchFailed' => 'Geçiş yapılamadı — içerik bu sunucuda bulunamadı', + 'watchTogether.defaultDisplayName' => 'Kullanıcı', 'downloads.title' => 'İndirmeler', 'downloads.manage' => 'Yönet', 'downloads.tvShows' => 'TV Dizileri', @@ -3975,6 +4135,16 @@ extension on TranslationsTr { 'downloads.backgroundWarning.statusUnknown' => 'Henüz kontrol edilmedi', 'downloads.backgroundWarning.settingsUnavailable' => 'Bu cihazda sistem ayarları açılamadı', 'downloads.backgroundWarning.linkUnavailable' => 'Bu cihazda dontkillmyapp.com açılamadı', + 'downloads.unknownShow' => 'Bilinmeyen Dizi', + 'downloads.unknownSeason' => 'Bilinmeyen Sezon', + 'downloads.unknownAlbum' => 'Bilinmeyen Albüm', + 'downloads.completedOfTotal' => ({required Object completed, required Object total}) => '${completed}/${total} tamamlandı', + 'downloads.errorFileNotFound' => 'Dosya bulunamadı (404)', + 'downloads.errorDownloadFailed' => 'İndirme başarısız oldu', + 'downloads.errorPostProcessing' => ({required Object error}) => 'Son işleme başarısız oldu: ${error}', + 'downloads.notificationDownloading' => 'İndiriliyor...', + 'downloads.notificationComplete' => 'İndirme tamamlandı', + 'downloads.notificationPaused' => 'İndirme duraklatıldı', 'shaders.title' => 'Gölgelendiriciler', 'shaders.noShaderDescription' => 'Video iyileştirmesi yok', 'shaders.nvscalerDescription' => 'Daha keskin video için NVIDIA görsel ölçekleme', @@ -4054,14 +4224,24 @@ extension on TranslationsTr { 'companionRemote.errors.failedToConnectAnyAddress' => 'Hiçbir adrese bağlanılamadı', 'companionRemote.errors.connectionLostAfterAttempts' => ({required Object attempts}) => '${attempts} denemeden sonra bağlantı kesildi', 'companionRemote.errors.connectionLost' => 'Bağlantı kesildi', + 'companionRemote.closedBeforeAuth' => 'Bağlantı, kimlik doğrulamadan önce kapandı', 'videoSettings.playbackSpeed' => 'Oynatma Hızı', 'videoSettings.normalSpeed' => 'Normal', 'videoSettings.sleepTimerActive' => ({required Object duration}) => 'Aktif (${duration})', 'videoSettings.zoom' => 'Yakınlaştırma', + _ => null, + } ?? switch (path) { 'videoSettings.sleepTimer' => 'Uyku Zamanlayıcısı', 'videoSettings.audioSync' => 'Ses Senkronizasyonu', 'videoSettings.subtitleSync' => 'Altyazı Senkronizasyonu', 'videoSettings.hdr' => 'HDR', + 'videoSettings.hdrUnsupported' => 'HDR burada kullanılamıyor — bu masaüstü birleştiricisi veya video çıkışı HDR\'yi taşıyamıyor.', + 'videoSettings.hdrToneMapping' => 'HDR ton eşleme', + 'videoSettings.hdrToneMappingCompositor' => 'Birleştirici', + 'videoSettings.hdrToneMappingCompositorDescription' => 'Kaynağın HDR meta verilerini olduğu gibi iletip eşlemeyi masaüstü birleştiricisine bırakın.', + 'videoSettings.hdrToneMappingPlayer' => 'Oynatıcı', + 'videoSettings.hdrToneMappingPlayerDescription' => 'Oynatıcıda ekranın en yüksek parlaklığına göre eşleyin, ardından sonucu birleştiriciye bildirin.', + 'videoSettings.hdrToneMappingFailed' => 'HDR ton eşleme değiştirilemedi — önceki mod hâlâ etkin.', 'videoSettings.audioOutput' => 'Ses Çıkışı', 'videoSettings.performanceOverlay' => 'Performans Katmanı', 'videoSettings.audioOutputDolbyAtmos' => 'Dolby Atmos', @@ -4106,6 +4286,16 @@ extension on TranslationsTr { 'performanceOverlay.player' => 'Oynatıcı', 'performanceOverlay.memory' => 'Bellek', 'performanceOverlay.uiFps' => 'Arayüz (UI) FPS', + 'performanceOverlay.fps' => 'FPS', + 'performanceOverlay.decoderAndroidHw' => 'Android Donanım', + 'performanceOverlay.decoderNvidiaHw' => 'NVIDIA Donanım', + 'performanceOverlay.decoderQualcommHw' => 'Qualcomm Donanım', + 'performanceOverlay.decoderMediatekHw' => 'MediaTek Donanım', + 'performanceOverlay.decoderExynosHw' => 'Exynos Donanım', + 'performanceOverlay.decoderSoftware' => 'Yazılım', + 'performanceOverlay.decoderHardware' => 'Donanım', + 'performanceOverlay.tunnelingActive' => 'Etkin', + 'performanceOverlay.dvRpuFailed' => ({required Object converted, required Object failures}) => '${converted} (${failures} başarısız)', 'externalPlayer.title' => 'Harici Oynatıcı', 'externalPlayer.useExternalPlayer' => 'Harici Oynatıcı Kullan', 'externalPlayer.useExternalPlayerDescription' => 'Videoları başka bir uygulamada açın', @@ -4119,8 +4309,6 @@ extension on TranslationsTr { 'externalPlayer.playerPackage' => 'Paket Adı', 'externalPlayer.playerUrlScheme' => 'URL Şeması', 'externalPlayer.off' => 'Kapalı', - _ => null, - } ?? switch (path) { 'externalPlayer.launchFailed' => 'Harici oynatıcı açılamadı', 'externalPlayer.appNotInstalled' => ({required Object name}) => '${name} yüklü değil', 'externalPlayer.playInExternalPlayer' => 'Harici Oynatıcıda Oynat', @@ -4254,6 +4442,16 @@ extension on TranslationsTr { 'seerr.statusPartiallyAvailable' => 'Kısmen mevcut', 'seerr.statusRequested' => 'İstendi', 'seerr.statusProcessing' => 'İşleniyor', + 'seerr.couldNotReach' => ({required Object url, required Object error}) => '${url} adresine ulaşılamadı: ${error}', + 'seerr.noInstanceAtUrl' => ({required Object url, required Object status}) => '${url} adresinde Seerr örneği bulunamadı (HTTP ${status})', + 'seerr.notInitialized' => 'Bu Seerr örneği ilk çalıştırma kurulumunu tamamlamadı', + 'seerr.noPlexTokenForReauth' => 'Yeniden giriş yapmak için kullanılabilir Plex belirteci yok', + 'seerr.noStoredCredentials' => 'Yeniden giriş yapmak için kullanılabilir kayıtlı kimlik bilgisi yok', + 'seerr.signInRejected' => 'Giriş reddedildi', + 'seerr.noSessionCookie' => 'Seerr bir oturum çerezi oluşturmadı', + 'seerr.freshCookieRejected' => 'Seerr yeni oturum çerezini reddetti', + 'seerr.noUserInformation' => 'Seerr kullanıcı bilgilerini döndürmedi', + 'seerr.sessionRejectedAfterReauth' => 'Yeniden giriş yapıldıktan sonra oturum reddedildi', 'services.title' => 'Servisler', 'services.hubSubtitle' => 'İzleme ilerlemesini eşitleyin ve yeni başlıklar isteyin.', 'services.notConnected' => 'Bağlı değil', @@ -4269,6 +4467,7 @@ extension on TranslationsTr { 'services.names.seerr' => 'Seerr', 'services.names.mdblist' => 'MDBList', 'services.deviceCode.title' => ({required Object service}) => 'Plezy\'yi ${service} üzerinde etkinleştirin', + 'services.deviceCode.instructions' => 'QR kodunu tarayın veya aşağıdaki adresi ziyaret edip bu kodu girin:', 'services.deviceCode.openToActivate' => ({required Object service}) => 'Etkinleştirmek için ${service} servisini açın', 'services.deviceCode.copyCode' => 'Etkinleştirme kodunu kopyala', 'services.deviceCode.waitingForAuthorization' => 'Yetkilendirme bekleniyor…', @@ -4318,6 +4517,24 @@ extension on TranslationsTr { 'addServer.connectToMediaBrowserCardSubtitleScoped' => ({required Object product, required Object name}) => '${product} sunucunuza giriş yapın. ${name} profiline bağlanır.', 'addServer.borrowFromAnotherProfile' => 'Başka bir profilden ödünç al', 'addServer.borrowFromAnotherProfileSubtitle' => 'Başka bir profilin bağlantısını yeniden kullanın. PIN korumalı profiller bir PIN gerektirir.', + 'addServer.invalidCredentials' => 'Geçersiz kullanıcı adı veya şifre', + 'addServer.authResponseNotJson' => 'Kimlik doğrulama yanıtı geçerli bir JSON değildi', + 'addServer.quickConnectRejected' => 'Quick Connect sunucu tarafından reddedildi', + 'addServer.quickConnectNotJson' => 'Quick Connect yanıtı geçerli bir JSON değildi', + 'addServer.quickConnectMissingFields' => 'Quick Connect yanıtında kod veya gizli anahtar eksik', + 'addServer.quickConnectPollRejected' => 'Quick Connect yoklaması sunucu tarafından reddedildi', + 'addServer.serverTimedOut' => 'Sunucu zamanında yanıt vermedi', + 'addServer.responseNotJson' => 'Sunucu yanıtı geçerli bir JSON değildi', + 'addServer.responseMissingIdentity' => ({required Object product}) => 'Yanıtta kimlik veya sunucu adı eksik — bu bir ${product} sunucusu mu?', + 'addServer.probeFailed' => ({required Object error}) => 'Sunucuya ulaşılamadı: ${error}', + 'addServer.enterAtLeastOneUrl' => ({required Object product}) => 'En az bir ${product} sunucu URL\'si girin', + 'addServer.noReachableServer' => ({required Object product}) => 'Ulaşılabilir ${product} sunucusu bulunamadı', + 'addServer.urlsPointToDifferentServers' => ({required Object product}) => 'Bu URL\'ler farklı ${product} sunucularını gösteriyor', + 'addServer.urlDoesNotMatchServer' => ({required Object product}) => 'Bu URL, ${product} sunucusuyla eşleşmiyor', + 'addServer.redirectUnsupported' => 'Sunucu desteklenmeyen bir URL\'ye yönlendirdi', + 'addServer.redirectDifferentHost' => ({required Object product}) => 'Sunucu farklı bir ana makineye yönlendirdi. Nihai ${product} URL\'sini doğrudan girin.', + 'addServer.redirectInsecure' => 'Sunucu HTTPS\'den güvenli olmayan bir URL\'ye yönlendirdi', + 'addServer.redirectUnsupportedEnterFinal' => ({required Object product}) => 'Sunucu desteklenmeyen bir URL\'ye yönlendirdi. Nihai ${product} URL\'sini doğrudan girin.', _ => null, }; } diff --git a/lib/i18n/strings_uz.g.dart b/lib/i18n/strings_uz.g.dart index f5700ac6..a2f721b5 100644 --- a/lib/i18n/strings_uz.g.dart +++ b/lib/i18n/strings_uz.g.dart @@ -123,6 +123,7 @@ class _Translations$auth$uz extends Translations$auth$en { @override String get quickConnectCancel => 'Bekor qilish'; @override String get quickConnectExpired => 'Tezkor ulanish vaqti tugadi. Qaytadan urinib koʻring.'; @override String get localDataRecoveryRequired => 'Plezy mahalliy kirish maʼlumotlarini tiklay olmadi. Iltimos, qaytadan kiring.'; + @override String get pinCheckRejected => 'Plex PIN tekshiruvi rad etildi'; } // Path: common @@ -178,6 +179,9 @@ class _Translations$common$uz extends Translations$common$en { @override String get exitFullscreen => 'Toʻliq ekrandan chiqish'; @override String get pressBackAgainToExit => 'Chiqish uchun orqaga tugmasini yana bir bor bosing'; @override late final _Translations$common$ratingSource$uz ratingSource = _Translations$common$ratingSource$uz._(_root); + @override String get notAvailable => 'N/A'; + @override String get url => 'URL'; + @override String get letterKeys => 'ABC'; } // Path: screens @@ -444,6 +448,8 @@ class _Translations$settings$uz extends Translations$settings$en { @override String get showNavBarLabels => 'Navigatsiya paneli matnlarini koʻrsatish'; @override String get showNavBarLabelsDescription => 'Navigatsiya belgilarining ostida matnni koʻrsatish'; @override String get startupSection => 'Boshlangʻich boʻlim'; + @override String get showExploreTab => 'Kashf qilish varagʻini koʻrsatish'; + @override String get showExploreTabDescription => 'Plex Discover va ulangan kuzatuvchilardagi kontent bilan Kashf qilish varagʻini koʻrsatish'; @override String get liveTvDefaultFavorites => 'Jonli TV-da tanlangan kanallarni standart qilish'; @override String get liveTvDefaultFavoritesDescription => 'Jonli TV ochilganda faqat tanlangan kanallarni koʻrsatish'; @override String get display => 'Displey'; @@ -455,6 +461,7 @@ class _Translations$settings$uz extends Translations$settings$en { @override String get subtitlesAndConfig => 'Subtitrlar va konfiguratsiya'; @override String get seekAndTiming => 'Oʻtkazish va vaqt sozlamalari'; @override String get behavior => 'Xatti-harakat'; + @override String get exportDialogTitle => 'Plezy sozlamalarini eksport qilish'; } // Path: search @@ -606,6 +613,8 @@ class _Translations$fileInfo$uz extends Translations$fileInfo$en { @override String get flagHearingImpaired => 'Eshitishida nuqsoni borlar uchun'; @override String get flagDub => 'Dublyaj'; @override String get flagOriginal => 'Asl'; + @override String get channelsMono => 'Mono'; + @override String dolbyVisionProfile({required Object profile}) => 'Profil ${profile}'; } // Path: mediaMenu @@ -704,6 +713,11 @@ class _Translations$accessibility$uz extends Translations$accessibility$en { @override String get alphabetScrollHint => 'Harflar boʻyicha oʻtish uchun yuqoriga yoki pastga suring'; @override String rowColumnPosition({required Object row, required Object rowCount, required Object column, required Object columnCount}) => 'Qator ${row} / ${rowCount}, ustun ${column} / ${columnCount}'; @override String rowPosition({required Object row, required Object rowCount}) => 'Qator ${row} / ${rowCount}'; + @override String get autoScrollPlay => 'Avtomatik aylantirishni boshlash'; + @override String get autoScrollPause => 'Avtomatik aylantirishni pauza qilish'; + @override String get hueShort => 'H'; + @override String get saturationShort => 'S'; + @override String get valueShort => 'V'; } // Path: tooltips @@ -815,6 +829,15 @@ class _Translations$videoControls$uz extends Translations$videoControls$en { @override String get subtitleDownloadedNotApplied => 'Subtitr yuklab olindi, lekin qoʻllanilmadi'; @override String get subtitleDownloadFailed => 'Subtitrni yuklab boʻlmadi'; @override String get searchLanguages => 'Tillardan qidirish...'; + @override String get skipIntro => 'Kirishni oʻtkazish'; + @override String get skipCredits => 'Titrlardan oʻtish'; + @override String get nextEpisode => 'Keyingi qism'; + @override String subtitleTrack({required Object n}) => 'Yoʻlak ${n}'; + @override String subtitleFile({required Object name}) => 'Subtitr ${name}'; + @override String forcedTrack({required Object label}) => '${label} (Majburiy)'; + @override String get osdSubtitlesOff => 'Subtitr: Oʻchirilgan'; + @override String osdSubtitles({required Object track}) => 'Subtitr: ${track}'; + @override String osdAudio({required Object track}) => 'Ovoz: ${track}'; } // Path: messages @@ -876,9 +899,18 @@ class _Translations$messages$uz extends Translations$messages$en { @override String get serverLimitBody => 'Server xatoligi (HTTP 500). Cheklov ushbu seansni rad etdi.'; @override String get mediaUnreadableTitle => 'Fayl mavjud emas'; @override String get mediaUnreadableBody => 'Server bu elementni topdi, lekin uning faylini oʻqiy olmadi (HTTP 404). Fayl koʻchirilgan, oʻchirilgan yoki uning saqlash joyi oflayn boʻlishi mumkin. Server egasidan faylni tekshirishni va kutubxonani qayta skanerlashni soʻrang.'; + @override String get serverBusyTitle => 'Oqim mavjud emas'; + @override String get serverBusyBody => 'Server bu faylni uzatishni qayta-qayta rad etdi (HTTP 503). U qayta ishga tushayotgan yoki band boʻlishi, yoxud fayl saqlanadigan xotira oflayn boʻlishi mumkin. Birozdan keyin qaytadan urinib koʻring. Muammo davom etsa, server egasidan server va fayl xotirasini tekshirishni soʻrang.'; @override String get logsUploaded => 'Jurnallar yuklandi'; @override String get logsUploadFailed => 'Jurnallarni yuklab boʻlmadi'; @override String get logId => 'Jurnal ID-si'; + @override String get burnedSubtitlesUseMenu => 'Subtitrlar bu oqim tasviriga singdirilgan. Ularni subtitr menyusidan oʻzgartiring.'; + @override String get noVideoUrl => 'Video URL mavjud emas'; + @override String get playbackNoMediaSources => 'Server ijro etiladigan media manbalarini qaytarmadi'; + @override String get playbackDataNotPrepared => 'Ijro maʼlumotlari tayyor boʻlishidan oldin boshlandi'; + @override String get streamSelectionUnavailable => 'Bu manba uchun oqim tanlash imkoni yoʻq'; + @override String get streamSelectionFailed => 'Tanlangan oqimlarni qoʻllab boʻlmadi'; + @override String get serverUnavailableForProfile => 'Faol profil uchun hech qanday server mavjud emas'; } // Path: subtitlingStyling @@ -904,6 +936,8 @@ class _Translations$subtitlingStyling$uz extends Translations$subtitlingStyling$ @override String get overrideStrip => 'Formatlashni olib tashlash'; @override String get positionTop => 'Yuqori'; @override String get positionBottom => 'Pastki'; + @override String get anchorToScreen => 'Ekranga mahkamlash'; + @override String get anchorToScreenDescription => 'Matnli subtitrlarni keng ekranli video ostidagi qora hoshiyalarda koʻrsatish'; @override String get bold => 'Qalin'; @override String get italic => 'Qiya'; @override String get renderResolution => 'Renderlash oʻlchamlari'; @@ -1013,6 +1047,7 @@ class _Translations$profiles$uz extends Translations$profiles$en { @override String get pinExplain => 'Profillar orasida oʻtish uchun 4 xonali PIN kod talab qilinadi.'; @override String get continueButton => 'Davom ettirish'; @override String get pinsDontMatch => 'PIN kodlar mos kelmadi'; + @override String get tokenIdentityMismatch => 'Plex profil tokeni kutilmagan serverga tegishli boʻlib chiqdi'; } // Path: connections @@ -1064,6 +1099,10 @@ class _Translations$discover$uz extends Translations$discover$en { @override String get tvShow => 'TV Shou'; @override String minutesLeft({required Object minutes}) => '${minutes} daq qoldi'; @override String get moreLikeThis => 'Oʻxshashlar'; + @override String titleCount({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('uz'))(n, + one: '${n} ta nom', + other: '${n} ta nom', + ); } // Path: errors @@ -1276,7 +1315,10 @@ class _Translations$explore$uz extends Translations$explore$en { @override String get characters => 'Qahramonlar'; @override String get addToWatchlist => 'Tomosha roʻyxatiga qoʻshish'; @override String get removeFromWatchlist => 'Tomosha roʻyxatidan oʻchirish'; + @override String get addedToWatchlist => 'Tomosha roʻyxatiga qoʻshildi'; + @override String get removedFromWatchlist => 'Tomosha roʻyxatidan olib tashlandi'; @override String get watchlistUpdateFailed => 'Tomosha roʻyxatini yangilab boʻlmadi'; + @override String get watchlistNoMatch => 'Bu elementni tomosha roʻyxatiga moslab boʻlmadi'; @override String get notInLibrary => 'Kutubxonangizda yoʻq'; @override String get inTheseLibraries => 'Ushbu kutubxonalarda bor'; @override String get checkingLibrary => 'Kutubxona tekshirilmoqda...'; @@ -1337,6 +1379,9 @@ class _Translations$liveTv$uz extends Translations$liveTv$en { @override String get watchChannel => 'Kanalni tomosha qilish'; @override String get favorites => 'Tanlanganlar'; @override String get reorderFavorites => 'Tanlanganlarni tartiblash'; + @override String get noFavoriteChannels => 'Sevimli kanallar yoʻq'; + @override String get noFavoriteChannelsHint => 'Barcha kanallarni koʻrsating, soʻng kanalni sevimlilarga qoʻshish uchun uni bosib turing.'; + @override String get showAllChannels => 'Barcha kanallarni koʻrsatish'; @override String get favoritesLoadFailed => 'Tanlanganlarni yuklab boʻlmadi.'; @override String get favoritesUpdateFailed => 'Tanlanganlarni yangilab boʻlmadi.'; @override String get joinSession => 'Seansga qoʻshilish'; @@ -1376,6 +1421,11 @@ class _Translations$liveTv$uz extends Translations$liveTv$en { @override String get guideReloadRequested => 'Jadvalni yangilash soʻraldi'; @override String get rulesProcessRequested => 'Qoidalarni qayta baholash soʻraldi'; @override String get recordShow => 'Shouni yozib olish'; + @override String startingInMinutes({required Object minutes}) => '${minutes} daqiqadan keyin boshlanadi'; + @override String dayAtTime({required Object day, required Object time}) => '${day}, soat ${time} da'; + @override String invalidPlaybackData({required Object product}) => '${product} Jonli TV ijrosi uchun notoʻgʻri maʼlumot qaytardi'; + @override String get failedToStartChannel => 'Jonli kanalni boshlab boʻlmadi'; + @override String get failedToBuildStreamUrl => 'Oqim URL-ini tuzib boʻlmadi'; } // Path: collections @@ -1474,6 +1524,8 @@ class _Translations$music$uz extends Translations$music$en { @override String get repeat => 'Takrorlash'; @override String get repeatAll => 'Barchasini takrorlash'; @override String get repeatOne => 'Birtasini takrorlash'; + @override String get instantMixNoServer => 'Tezkor miks uchun hech qanday server mavjud emas'; + @override String noAudioUrl({required Object track}) => '${track} uchun audio URL mavjud emas'; } // Path: watchTogether @@ -1548,6 +1600,7 @@ class _Translations$watchTogether$uz extends Translations$watchTogether$en { @override String get removeRoom => 'Oʻchirish'; @override String get guestSwitchUnavailable => 'Oʻtib boʻlmadi'; @override String get guestSwitchFailed => 'Oʻtib boʻlmadi — kontent topilmadi'; + @override String get defaultDisplayName => 'Foydalanuvchi'; } // Path: downloads @@ -1632,6 +1685,16 @@ class _Translations$downloads$uz extends Translations$downloads$en { @override String get syncRuleUnknownServer => 'Nomaʼlum server'; @override String get syncRuleListCreated => 'Sinxronlash qoidasi yaratildi'; @override late final _Translations$downloads$backgroundWarning$uz backgroundWarning = _Translations$downloads$backgroundWarning$uz._(_root); + @override String get unknownShow => 'Nomaʼlum serial'; + @override String get unknownSeason => 'Nomaʼlum mavsum'; + @override String get unknownAlbum => 'Nomaʼlum albom'; + @override String completedOfTotal({required Object completed, required Object total}) => '${completed}/${total} ta yakunlandi'; + @override String get errorFileNotFound => 'Fayl topilmadi (404)'; + @override String get errorDownloadFailed => 'Yuklab boʻlmadi'; + @override String errorPostProcessing({required Object error}) => 'Keyingi ishlov berishda xatolik: ${error}'; + @override String get notificationDownloading => 'Yuklanmoqda...'; + @override String get notificationComplete => 'Yuklash tugallandi'; + @override String get notificationPaused => 'Yuklash toʻxtatib turildi'; } // Path: shaders @@ -1672,6 +1735,7 @@ class _Translations$companionRemote$uz extends Translations$companionRemote$en { @override late final _Translations$companionRemote$pairing$uz pairing = _Translations$companionRemote$pairing$uz._(_root); @override late final _Translations$companionRemote$remote$uz remote = _Translations$companionRemote$remote$uz._(_root); @override late final _Translations$companionRemote$errors$uz errors = _Translations$companionRemote$errors$uz._(_root); + @override String get closedBeforeAuth => 'Ulanish autentifikatsiyadan oldin yopildi'; } // Path: videoSettings @@ -1689,6 +1753,13 @@ class _Translations$videoSettings$uz extends Translations$videoSettings$en { @override String get audioSync => 'Audio sinxronlash'; @override String get subtitleSync => 'Subtitr sinxronlash'; @override String get hdr => 'HDR'; + @override String get hdrUnsupported => 'Bu yerda HDR mavjud emas — ish stoli kompozitori yoki video chiqishi uni uzata olmaydi.'; + @override String get hdrToneMapping => 'HDR tonlarini moslashtirish'; + @override String get hdrToneMappingCompositor => 'Kompozitor'; + @override String get hdrToneMappingCompositorDescription => 'Manbaning HDR metamaʼlumotlarini oʻzgarishsiz uzatib, ularni moslashtirishni ish stoli kompozitoriga topshirish.'; + @override String get hdrToneMappingPlayer => 'Pleyer'; + @override String get hdrToneMappingPlayerDescription => 'Pleyerda displeyning eng yuqori yorqinligiga moslashtirib, soʻng natijani kompozitorga bildirish.'; + @override String get hdrToneMappingFailed => 'HDR tonlarini moslashtirishni oʻzgartirib boʻlmadi — avvalgi rejim hali ham faol.'; @override String get audioOutput => 'Audio chiqishi'; @override String get performanceOverlay => 'Unumdorlik paneli'; @override String get audioOutputDolbyAtmos => 'Dolby Atmos'; @@ -1742,6 +1813,16 @@ class _Translations$performanceOverlay$uz extends Translations$performanceOverla @override String get player => 'Pleyer'; @override String get memory => 'Xotira'; @override String get uiFps => 'Interfeys (UI) FPS'; + @override String get fps => 'FPS'; + @override String get decoderAndroidHw => 'Android HW'; + @override String get decoderNvidiaHw => 'NVIDIA HW'; + @override String get decoderQualcommHw => 'Qualcomm HW'; + @override String get decoderMediatekHw => 'MediaTek HW'; + @override String get decoderExynosHw => 'Exynos HW'; + @override String get decoderSoftware => 'Dasturiy'; + @override String get decoderHardware => 'Apparat'; + @override String get tunnelingActive => 'Faol'; + @override String dvRpuFailed({required Object converted, required Object failures}) => '${converted} (${failures} ta muvaffaqiyatsiz)'; } // Path: externalPlayer @@ -1942,6 +2023,16 @@ class _Translations$seerr$uz extends Translations$seerr$en { @override String get statusPartiallyAvailable => 'Qisman mavjud'; @override String get statusRequested => 'Soʻraldi'; @override String get statusProcessing => 'Ishlanmoqda'; + @override String couldNotReach({required Object url, required Object error}) => '${url} manziliga ulanib boʻlmadi: ${error}'; + @override String noInstanceAtUrl({required Object url, required Object status}) => '${url} manzilida Seerr nusxasi yoʻq (HTTP ${status})'; + @override String get notInitialized => 'Bu Seerr nusxasining dastlabki sozlamasi yakunlanmagan'; + @override String get noPlexTokenForReauth => 'Qayta kirish uchun Plex tokeni mavjud emas'; + @override String get noStoredCredentials => 'Qayta kirish uchun saqlangan kirish maʼlumotlari mavjud emas'; + @override String get signInRejected => 'Kirish rad etildi'; + @override String get noSessionCookie => 'Seerr seans cookie-faylini bermadi'; + @override String get freshCookieRejected => 'Seerr yangi seans cookie-faylini rad etdi'; + @override String get noUserInformation => 'Seerr foydalanuvchi maʼlumotlarini qaytarmadi'; + @override String get sessionRejectedAfterReauth => 'Qayta kirilgandan keyin seans rad etildi'; } // Path: services @@ -2002,6 +2093,24 @@ class _Translations$addServer$uz extends Translations$addServer$en { @override String connectToMediaBrowserCardSubtitleScoped({required Object product, required Object name}) => '${product} serveringizga kiring. ${name} profiliga bogʻlanadi.'; @override String get borrowFromAnotherProfile => 'Boshqa profildan olish'; @override String get borrowFromAnotherProfileSubtitle => 'Boshqa profilning ulanishidan qayta foydalaning.'; + @override String get invalidCredentials => 'Foydalanuvchi nomi yoki parol notoʻgʻri'; + @override String get authResponseNotJson => 'Autentifikatsiya javobi yaroqli JSON emas'; + @override String get quickConnectRejected => 'Quick Connect server tomonidan rad etildi'; + @override String get quickConnectNotJson => 'Quick Connect javobi yaroqli JSON emas'; + @override String get quickConnectMissingFields => 'Quick Connect javobida kod yoki maxfiy kalit yoʻq'; + @override String get quickConnectPollRejected => 'Quick Connect soʻrovi server tomonidan rad etildi'; + @override String get serverTimedOut => 'Server oʻz vaqtida javob bermadi'; + @override String get responseNotJson => 'Server javobi yaroqli JSON emas'; + @override String responseMissingIdentity({required Object product}) => 'Javobda ID yoki server nomi yoʻq — bu ${product} serverimi?'; + @override String probeFailed({required Object error}) => 'Serverga ulanib boʻlmadi: ${error}'; + @override String enterAtLeastOneUrl({required Object product}) => 'Kamida bitta ${product} server URL-ini kiriting'; + @override String noReachableServer({required Object product}) => 'Ulanish mumkin boʻlgan ${product} serveri topilmadi'; + @override String urlsPointToDifferentServers({required Object product}) => 'Bu URL-lar turli ${product} serverlariga olib boradi'; + @override String urlDoesNotMatchServer({required Object product}) => 'Bu URL ${product} serveriga mos kelmaydi'; + @override String get redirectUnsupported => 'Server qoʻllab-quvvatlanmaydigan URL-ga yoʻnaltirdi'; + @override String redirectDifferentHost({required Object product}) => 'Server boshqa xostga yoʻnaltirdi. Yakuniy ${product} URL-ini bevosita kiriting.'; + @override String get redirectInsecure => 'Server HTTPS manzilidan xavfsiz boʻlmagan URL-ga yoʻnaltirdi'; + @override String redirectUnsupportedEnterFinal({required Object product}) => 'Server qoʻllab-quvvatlanmaydigan URL-ga yoʻnaltirdi. Yakuniy ${product} URL-ini bevosita kiriting.'; } // Path: common.ratingSource @@ -2521,6 +2630,7 @@ class _Translations$services$deviceCode$uz extends Translations$services$deviceC // Translations @override String title({required Object service}) => 'Plezy-ni ${service} xizmatida faollashtiring'; + @override String get instructions => 'QR-kodni skanerlang yoki quyidagi manzilga oʻtib, bu kodni kiriting:'; @override String openToActivate({required Object service}) => 'Faollashtirish uchun ${service} xizmatini oching'; @override String get copyCode => 'Faollashtirish kodini nusxalash'; @override String get waitingForAuthorization => 'Avtorizatsiya kutilmoqda…'; @@ -2595,6 +2705,7 @@ extension on TranslationsUz { 'auth.quickConnectCancel' => 'Bekor qilish', 'auth.quickConnectExpired' => 'Tezkor ulanish vaqti tugadi. Qaytadan urinib koʻring.', 'auth.localDataRecoveryRequired' => 'Plezy mahalliy kirish maʼlumotlarini tiklay olmadi. Iltimos, qaytadan kiring.', + 'auth.pinCheckRejected' => 'Plex PIN tekshiruvi rad etildi', 'common.cancel' => 'Bekor qilish', 'common.save' => 'Saqlash', 'common.close' => 'Yopish', @@ -2651,6 +2762,9 @@ extension on TranslationsUz { 'common.ratingSource.trakt' => 'Trakt', 'common.ratingSource.rottenTomatoesCritic' => 'Rotten Tomatoes tanqidchilari', 'common.ratingSource.rottenTomatoesAudience' => 'Rotten Tomatoes tomoshabinlari', + 'common.notAvailable' => 'N/A', + 'common.url' => 'URL', + 'common.letterKeys' => 'ABC', 'screens.licenses' => 'Litsenziyalar', 'screens.switchProfile' => 'Profilni almashtirish', 'screens.subtitleStyling' => 'Subtitr sozlamalari', @@ -2890,6 +3004,8 @@ extension on TranslationsUz { 'settings.showNavBarLabels' => 'Navigatsiya paneli matnlarini koʻrsatish', 'settings.showNavBarLabelsDescription' => 'Navigatsiya belgilarining ostida matnni koʻrsatish', 'settings.startupSection' => 'Boshlangʻich boʻlim', + 'settings.showExploreTab' => 'Kashf qilish varagʻini koʻrsatish', + 'settings.showExploreTabDescription' => 'Plex Discover va ulangan kuzatuvchilardagi kontent bilan Kashf qilish varagʻini koʻrsatish', 'settings.liveTvDefaultFavorites' => 'Jonli TV-da tanlangan kanallarni standart qilish', 'settings.liveTvDefaultFavoritesDescription' => 'Jonli TV ochilganda faqat tanlangan kanallarni koʻrsatish', 'settings.display' => 'Displey', @@ -2901,6 +3017,7 @@ extension on TranslationsUz { 'settings.subtitlesAndConfig' => 'Subtitrlar va konfiguratsiya', 'settings.seekAndTiming' => 'Oʻtkazish va vaqt sozlamalari', 'settings.behavior' => 'Xatti-harakat', + 'settings.exportDialogTitle' => 'Plezy sozlamalarini eksport qilish', 'search.hint' => 'Filmlar, seriallar, musiqa qidirish...', 'search.tryDifferentTerm' => 'Boshqa qidiruv soʻzini kiriting', 'search.searchYourMedia' => 'Medialaringizdan qidiring', @@ -3049,6 +3166,8 @@ extension on TranslationsUz { 'fileInfo.flagHearingImpaired' => 'Eshitishida nuqsoni borlar uchun', 'fileInfo.flagDub' => 'Dublyaj', 'fileInfo.flagOriginal' => 'Asl', + 'fileInfo.channelsMono' => 'Mono', + 'fileInfo.dolbyVisionProfile' => ({required Object profile}) => 'Profil ${profile}', 'mediaMenu.markAsWatched' => 'Koʻrilgan deb belgilash', 'mediaMenu.markAsUnwatched' => 'Koʻrilmagan deb belgilash', 'mediaMenu.removeFromContinueWatching' => '"Tomoshani davom ettirish"dan oʻchirish', @@ -3082,6 +3201,8 @@ extension on TranslationsUz { 'mediaMenu.rate' => 'Baho berish', 'mediaMenu.playFromBeginning' => 'Boshidan ijro etish', 'mediaMenu.playVersion' => 'Versiyani ijro etish...', + _ => null, + } ?? switch (path) { 'rateSheet.title' => 'Baho berish', 'rateSheet.server' => 'Server', 'rateSheet.favorite' => 'Tanlangan', @@ -3091,8 +3212,6 @@ extension on TranslationsUz { 'rateSheet.noConnectedServices' => 'Baho berish uchun Sozlamalardan xizmatni ulang.', 'accessibility.mediaCardMovie' => ({required Object title}) => '${title}, film', 'accessibility.mediaCardShow' => ({required Object title}) => '${title}, TV shou', - _ => null, - } ?? switch (path) { 'accessibility.mediaCardEpisode' => ({required Object title, required Object episodeInfo}) => '${title}, ${episodeInfo}', 'accessibility.mediaCardSeason' => ({required Object title, required Object seasonInfo}) => '${title}, ${seasonInfo}', 'accessibility.mediaCardWatched' => 'koʻrilgan', @@ -3113,6 +3232,11 @@ extension on TranslationsUz { 'accessibility.alphabetScrollHint' => 'Harflar boʻyicha oʻtish uchun yuqoriga yoki pastga suring', 'accessibility.rowColumnPosition' => ({required Object row, required Object rowCount, required Object column, required Object columnCount}) => 'Qator ${row} / ${rowCount}, ustun ${column} / ${columnCount}', 'accessibility.rowPosition' => ({required Object row, required Object rowCount}) => 'Qator ${row} / ${rowCount}', + 'accessibility.autoScrollPlay' => 'Avtomatik aylantirishni boshlash', + 'accessibility.autoScrollPause' => 'Avtomatik aylantirishni pauza qilish', + 'accessibility.hueShort' => 'H', + 'accessibility.saturationShort' => 'S', + 'accessibility.valueShort' => 'V', 'tooltips.shufflePlay' => 'Aralashtirib ijro etish', 'tooltips.playTrailer' => 'Treylerni koʻrish', 'tooltips.markAsWatched' => 'Koʻrilgan deb belgilash', @@ -3203,6 +3327,15 @@ extension on TranslationsUz { 'videoControls.subtitleDownloadedNotApplied' => 'Subtitr yuklab olindi, lekin qoʻllanilmadi', 'videoControls.subtitleDownloadFailed' => 'Subtitrni yuklab boʻlmadi', 'videoControls.searchLanguages' => 'Tillardan qidirish...', + 'videoControls.skipIntro' => 'Kirishni oʻtkazish', + 'videoControls.skipCredits' => 'Titrlardan oʻtish', + 'videoControls.nextEpisode' => 'Keyingi qism', + 'videoControls.subtitleTrack' => ({required Object n}) => 'Yoʻlak ${n}', + 'videoControls.subtitleFile' => ({required Object name}) => 'Subtitr ${name}', + 'videoControls.forcedTrack' => ({required Object label}) => '${label} (Majburiy)', + 'videoControls.osdSubtitlesOff' => 'Subtitr: Oʻchirilgan', + 'videoControls.osdSubtitles' => ({required Object track}) => 'Subtitr: ${track}', + 'videoControls.osdAudio' => ({required Object track}) => 'Ovoz: ${track}', 'messages.markedAsWatched' => 'Koʻrilgan deb belgilandi', 'messages.markedAsUnwatched' => 'Koʻrilmagan deb belgilandi', 'messages.markedAsWatchedOffline' => 'Koʻrilgan deb belgilandi (tarmoqqa ulanganda sinxronlanadi)', @@ -3252,9 +3385,18 @@ extension on TranslationsUz { 'messages.serverLimitBody' => 'Server xatoligi (HTTP 500). Cheklov ushbu seansni rad etdi.', 'messages.mediaUnreadableTitle' => 'Fayl mavjud emas', 'messages.mediaUnreadableBody' => 'Server bu elementni topdi, lekin uning faylini oʻqiy olmadi (HTTP 404). Fayl koʻchirilgan, oʻchirilgan yoki uning saqlash joyi oflayn boʻlishi mumkin. Server egasidan faylni tekshirishni va kutubxonani qayta skanerlashni soʻrang.', + 'messages.serverBusyTitle' => 'Oqim mavjud emas', + 'messages.serverBusyBody' => 'Server bu faylni uzatishni qayta-qayta rad etdi (HTTP 503). U qayta ishga tushayotgan yoki band boʻlishi, yoxud fayl saqlanadigan xotira oflayn boʻlishi mumkin. Birozdan keyin qaytadan urinib koʻring. Muammo davom etsa, server egasidan server va fayl xotirasini tekshirishni soʻrang.', 'messages.logsUploaded' => 'Jurnallar yuklandi', 'messages.logsUploadFailed' => 'Jurnallarni yuklab boʻlmadi', 'messages.logId' => 'Jurnal ID-si', + 'messages.burnedSubtitlesUseMenu' => 'Subtitrlar bu oqim tasviriga singdirilgan. Ularni subtitr menyusidan oʻzgartiring.', + 'messages.noVideoUrl' => 'Video URL mavjud emas', + 'messages.playbackNoMediaSources' => 'Server ijro etiladigan media manbalarini qaytarmadi', + 'messages.playbackDataNotPrepared' => 'Ijro maʼlumotlari tayyor boʻlishidan oldin boshlandi', + 'messages.streamSelectionUnavailable' => 'Bu manba uchun oqim tanlash imkoni yoʻq', + 'messages.streamSelectionFailed' => 'Tanlangan oqimlarni qoʻllab boʻlmadi', + 'messages.serverUnavailableForProfile' => 'Faol profil uchun hech qanday server mavjud emas', 'subtitlingStyling.text' => 'Matn', 'subtitlingStyling.border' => 'Hoshiya', 'subtitlingStyling.background' => 'Fon', @@ -3271,6 +3413,8 @@ extension on TranslationsUz { 'subtitlingStyling.overrideStrip' => 'Formatlashni olib tashlash', 'subtitlingStyling.positionTop' => 'Yuqori', 'subtitlingStyling.positionBottom' => 'Pastki', + 'subtitlingStyling.anchorToScreen' => 'Ekranga mahkamlash', + 'subtitlingStyling.anchorToScreenDescription' => 'Matnli subtitrlarni keng ekranli video ostidagi qora hoshiyalarda koʻrsatish', 'subtitlingStyling.bold' => 'Qalin', 'subtitlingStyling.italic' => 'Qiya', 'subtitlingStyling.renderResolution' => 'Renderlash oʻlchamlari', @@ -3353,6 +3497,7 @@ extension on TranslationsUz { 'profiles.pinExplain' => 'Profillar orasida oʻtish uchun 4 xonali PIN kod talab qilinadi.', 'profiles.continueButton' => 'Davom ettirish', 'profiles.pinsDontMatch' => 'PIN kodlar mos kelmadi', + 'profiles.tokenIdentityMismatch' => 'Plex profil tokeni kutilmagan serverga tegishli boʻlib chiqdi', 'connections.sectionTitle' => 'Ulanishlar', 'connections.addConnection' => 'Ulanish qoʻshish', 'connections.addConnectionSubtitleNoProfile' => 'Plex orqali kiring yoki Jellyfin serveriga ulaning', @@ -3386,6 +3531,7 @@ extension on TranslationsUz { 'discover.tvShow' => 'TV Shou', 'discover.minutesLeft' => ({required Object minutes}) => '${minutes} daq qoldi', 'discover.moreLikeThis' => 'Oʻxshashlar', + 'discover.titleCount' => ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('uz'))(n, one: '${n} ta nom', other: '${n} ta nom', ), 'errors.searchFailed' => ({required Object error}) => 'Qidiruv xatoligi: ${error}', 'errors.searchUnavailable' => 'Qidiruv hech bir media serverga ulana olmadi.', 'errors.connectionTimeout' => ({required Object context}) => '${context} yuklanish vaqti tugadi', @@ -3558,7 +3704,10 @@ extension on TranslationsUz { 'explore.characters' => 'Qahramonlar', 'explore.addToWatchlist' => 'Tomosha roʻyxatiga qoʻshish', 'explore.removeFromWatchlist' => 'Tomosha roʻyxatidan oʻchirish', + 'explore.addedToWatchlist' => 'Tomosha roʻyxatiga qoʻshildi', + 'explore.removedFromWatchlist' => 'Tomosha roʻyxatidan olib tashlandi', 'explore.watchlistUpdateFailed' => 'Tomosha roʻyxatini yangilab boʻlmadi', + 'explore.watchlistNoMatch' => 'Bu elementni tomosha roʻyxatiga moslab boʻlmadi', 'explore.notInLibrary' => 'Kutubxonangizda yoʻq', 'explore.inTheseLibraries' => 'Ushbu kutubxonalarda bor', 'explore.checkingLibrary' => 'Kutubxona tekshirilmoqda...', @@ -3566,6 +3715,8 @@ extension on TranslationsUz { 'explore.emptyMessage' => ({required Object source}) => '${source} manbasidan olingan qatorlar bu yerda koʻrinadi.', 'explore.searchHint' => ({required Object source}) => '${source} ichidan qidirish', 'explore.searchEmpty' => ({required Object query}) => '"${query}" boʻyicha natija topilmadi', + _ => null, + } ?? switch (path) { 'explore.searchPrompt' => ({required Object source}) => '${source} orqali filmlar va seriallarni qidiring.', 'explore.searchFailed' => 'Qidiruv xatoligi. Ulanishni tekshiring.', 'explore.badge.rankPopular' => ({required Object n}) => '#${n} mashhur', @@ -3605,8 +3756,6 @@ extension on TranslationsUz { 'explore.stats.completed' => ({required Object n}) => '${n} kishi yakunlagan', 'explore.stats.onHold' => ({required Object n}) => '${n} kishi toʻxtatib turibdi', 'explore.stats.dropped' => ({required Object n}) => '${n} kishi toʻxtatgan', - _ => null, - } ?? switch (path) { 'explore.season.winter' => 'Qish', 'explore.season.spring' => 'Bahor', 'explore.season.summer' => 'Yoz', @@ -3703,6 +3852,9 @@ extension on TranslationsUz { 'liveTv.watchChannel' => 'Kanalni tomosha qilish', 'liveTv.favorites' => 'Tanlanganlar', 'liveTv.reorderFavorites' => 'Tanlanganlarni tartiblash', + 'liveTv.noFavoriteChannels' => 'Sevimli kanallar yoʻq', + 'liveTv.noFavoriteChannelsHint' => 'Barcha kanallarni koʻrsating, soʻng kanalni sevimlilarga qoʻshish uchun uni bosib turing.', + 'liveTv.showAllChannels' => 'Barcha kanallarni koʻrsatish', 'liveTv.favoritesLoadFailed' => 'Tanlanganlarni yuklab boʻlmadi.', 'liveTv.favoritesUpdateFailed' => 'Tanlanganlarni yangilab boʻlmadi.', 'liveTv.joinSession' => 'Seansga qoʻshilish', @@ -3742,6 +3894,11 @@ extension on TranslationsUz { 'liveTv.guideReloadRequested' => 'Jadvalni yangilash soʻraldi', 'liveTv.rulesProcessRequested' => 'Qoidalarni qayta baholash soʻraldi', 'liveTv.recordShow' => 'Shouni yozib olish', + 'liveTv.startingInMinutes' => ({required Object minutes}) => '${minutes} daqiqadan keyin boshlanadi', + 'liveTv.dayAtTime' => ({required Object day, required Object time}) => '${day}, soat ${time} da', + 'liveTv.invalidPlaybackData' => ({required Object product}) => '${product} Jonli TV ijrosi uchun notoʻgʻri maʼlumot qaytardi', + 'liveTv.failedToStartChannel' => 'Jonli kanalni boshlab boʻlmadi', + 'liveTv.failedToBuildStreamUrl' => 'Oqim URL-ini tuzib boʻlmadi', 'collections.title' => 'Toʻplamlar', 'collections.collection' => 'Toʻplam', 'collections.empty' => 'Toʻplam boʻsh', @@ -3810,6 +3967,8 @@ extension on TranslationsUz { 'music.repeat' => 'Takrorlash', 'music.repeatAll' => 'Barchasini takrorlash', 'music.repeatOne' => 'Birtasini takrorlash', + 'music.instantMixNoServer' => 'Tezkor miks uchun hech qanday server mavjud emas', + 'music.noAudioUrl' => ({required Object track}) => '${track} uchun audio URL mavjud emas', 'watchTogether.title' => 'Birgalikda tomosha qilish', 'watchTogether.description' => 'Doʻstlaringiz va oilangiz bilan birga tomosha qiling', 'watchTogether.createSession' => 'Seans yaratish', @@ -3875,6 +4034,7 @@ extension on TranslationsUz { 'watchTogether.removeRoom' => 'Oʻchirish', 'watchTogether.guestSwitchUnavailable' => 'Oʻtib boʻlmadi', 'watchTogether.guestSwitchFailed' => 'Oʻtib boʻlmadi — kontent topilmadi', + 'watchTogether.defaultDisplayName' => 'Foydalanuvchi', 'downloads.title' => 'Yuklamalar', 'downloads.manage' => 'Boshqarish', 'downloads.tvShows' => 'TV Shoular', @@ -3975,6 +4135,16 @@ extension on TranslationsUz { 'downloads.backgroundWarning.statusUnknown' => 'Hali tekshirilmagan', 'downloads.backgroundWarning.settingsUnavailable' => 'Bu qurilmada tizim sozlamalarini ochib boʻlmadi', 'downloads.backgroundWarning.linkUnavailable' => 'Bu qurilmada dontkillmyapp.com-ni ochib boʻlmadi', + 'downloads.unknownShow' => 'Nomaʼlum serial', + 'downloads.unknownSeason' => 'Nomaʼlum mavsum', + 'downloads.unknownAlbum' => 'Nomaʼlum albom', + 'downloads.completedOfTotal' => ({required Object completed, required Object total}) => '${completed}/${total} ta yakunlandi', + 'downloads.errorFileNotFound' => 'Fayl topilmadi (404)', + 'downloads.errorDownloadFailed' => 'Yuklab boʻlmadi', + 'downloads.errorPostProcessing' => ({required Object error}) => 'Keyingi ishlov berishda xatolik: ${error}', + 'downloads.notificationDownloading' => 'Yuklanmoqda...', + 'downloads.notificationComplete' => 'Yuklash tugallandi', + 'downloads.notificationPaused' => 'Yuklash toʻxtatib turildi', 'shaders.title' => 'Sheyderlar', 'shaders.noShaderDescription' => 'Video yaxshilash oʻchirilgan', 'shaders.nvscalerDescription' => 'Aniqroq video uchun NVIDIA masshtabi', @@ -4054,14 +4224,24 @@ extension on TranslationsUz { 'companionRemote.errors.failedToConnectAnyAddress' => 'Hech bir manzilga ulanib boʻlmadi', 'companionRemote.errors.connectionLostAfterAttempts' => ({required Object attempts}) => '${attempts} urinishdan keyin aloqa uzildi', 'companionRemote.errors.connectionLost' => 'Aloqa uzildi', + 'companionRemote.closedBeforeAuth' => 'Ulanish autentifikatsiyadan oldin yopildi', 'videoSettings.playbackSpeed' => 'Ijro tezligi', 'videoSettings.normalSpeed' => 'Normal', 'videoSettings.sleepTimerActive' => ({required Object duration}) => 'Faol (${duration})', 'videoSettings.zoom' => 'Masshtab', + _ => null, + } ?? switch (path) { 'videoSettings.sleepTimer' => 'Uyqu taymeri', 'videoSettings.audioSync' => 'Audio sinxronlash', 'videoSettings.subtitleSync' => 'Subtitr sinxronlash', 'videoSettings.hdr' => 'HDR', + 'videoSettings.hdrUnsupported' => 'Bu yerda HDR mavjud emas — ish stoli kompozitori yoki video chiqishi uni uzata olmaydi.', + 'videoSettings.hdrToneMapping' => 'HDR tonlarini moslashtirish', + 'videoSettings.hdrToneMappingCompositor' => 'Kompozitor', + 'videoSettings.hdrToneMappingCompositorDescription' => 'Manbaning HDR metamaʼlumotlarini oʻzgarishsiz uzatib, ularni moslashtirishni ish stoli kompozitoriga topshirish.', + 'videoSettings.hdrToneMappingPlayer' => 'Pleyer', + 'videoSettings.hdrToneMappingPlayerDescription' => 'Pleyerda displeyning eng yuqori yorqinligiga moslashtirib, soʻng natijani kompozitorga bildirish.', + 'videoSettings.hdrToneMappingFailed' => 'HDR tonlarini moslashtirishni oʻzgartirib boʻlmadi — avvalgi rejim hali ham faol.', 'videoSettings.audioOutput' => 'Audio chiqishi', 'videoSettings.performanceOverlay' => 'Unumdorlik paneli', 'videoSettings.audioOutputDolbyAtmos' => 'Dolby Atmos', @@ -4106,6 +4286,16 @@ extension on TranslationsUz { 'performanceOverlay.player' => 'Pleyer', 'performanceOverlay.memory' => 'Xotira', 'performanceOverlay.uiFps' => 'Interfeys (UI) FPS', + 'performanceOverlay.fps' => 'FPS', + 'performanceOverlay.decoderAndroidHw' => 'Android HW', + 'performanceOverlay.decoderNvidiaHw' => 'NVIDIA HW', + 'performanceOverlay.decoderQualcommHw' => 'Qualcomm HW', + 'performanceOverlay.decoderMediatekHw' => 'MediaTek HW', + 'performanceOverlay.decoderExynosHw' => 'Exynos HW', + 'performanceOverlay.decoderSoftware' => 'Dasturiy', + 'performanceOverlay.decoderHardware' => 'Apparat', + 'performanceOverlay.tunnelingActive' => 'Faol', + 'performanceOverlay.dvRpuFailed' => ({required Object converted, required Object failures}) => '${converted} (${failures} ta muvaffaqiyatsiz)', 'externalPlayer.title' => 'Tashqi pleyer', 'externalPlayer.useExternalPlayer' => 'Tashqi pleyerdan foydalanish', 'externalPlayer.useExternalPlayerDescription' => 'Videolarni boshqa ilovada ochish', @@ -4119,8 +4309,6 @@ extension on TranslationsUz { 'externalPlayer.playerPackage' => 'Paket nomi', 'externalPlayer.playerUrlScheme' => 'URL sxemasi', 'externalPlayer.off' => 'Oʻchirilgan', - _ => null, - } ?? switch (path) { 'externalPlayer.launchFailed' => 'Tashqi pleyerni ishga tushirib boʻlmadi', 'externalPlayer.appNotInstalled' => ({required Object name}) => '${name} oʻrnatilmagan', 'externalPlayer.playInExternalPlayer' => 'Tashqi pleyerda ijro etish', @@ -4254,6 +4442,16 @@ extension on TranslationsUz { 'seerr.statusPartiallyAvailable' => 'Qisman mavjud', 'seerr.statusRequested' => 'Soʻraldi', 'seerr.statusProcessing' => 'Ishlanmoqda', + 'seerr.couldNotReach' => ({required Object url, required Object error}) => '${url} manziliga ulanib boʻlmadi: ${error}', + 'seerr.noInstanceAtUrl' => ({required Object url, required Object status}) => '${url} manzilida Seerr nusxasi yoʻq (HTTP ${status})', + 'seerr.notInitialized' => 'Bu Seerr nusxasining dastlabki sozlamasi yakunlanmagan', + 'seerr.noPlexTokenForReauth' => 'Qayta kirish uchun Plex tokeni mavjud emas', + 'seerr.noStoredCredentials' => 'Qayta kirish uchun saqlangan kirish maʼlumotlari mavjud emas', + 'seerr.signInRejected' => 'Kirish rad etildi', + 'seerr.noSessionCookie' => 'Seerr seans cookie-faylini bermadi', + 'seerr.freshCookieRejected' => 'Seerr yangi seans cookie-faylini rad etdi', + 'seerr.noUserInformation' => 'Seerr foydalanuvchi maʼlumotlarini qaytarmadi', + 'seerr.sessionRejectedAfterReauth' => 'Qayta kirilgandan keyin seans rad etildi', 'services.title' => 'Xizmatlar', 'services.hubSubtitle' => 'Koʻrish jarayonini sinxronlang va yangi kontent soʻrang.', 'services.notConnected' => 'Ulanmagan', @@ -4269,6 +4467,7 @@ extension on TranslationsUz { 'services.names.seerr' => 'Seerr', 'services.names.mdblist' => 'MDBList', 'services.deviceCode.title' => ({required Object service}) => 'Plezy-ni ${service} xizmatida faollashtiring', + 'services.deviceCode.instructions' => 'QR-kodni skanerlang yoki quyidagi manzilga oʻtib, bu kodni kiriting:', 'services.deviceCode.openToActivate' => ({required Object service}) => 'Faollashtirish uchun ${service} xizmatini oching', 'services.deviceCode.copyCode' => 'Faollashtirish kodini nusxalash', 'services.deviceCode.waitingForAuthorization' => 'Avtorizatsiya kutilmoqda…', @@ -4318,6 +4517,24 @@ extension on TranslationsUz { 'addServer.connectToMediaBrowserCardSubtitleScoped' => ({required Object product, required Object name}) => '${product} serveringizga kiring. ${name} profiliga bogʻlanadi.', 'addServer.borrowFromAnotherProfile' => 'Boshqa profildan olish', 'addServer.borrowFromAnotherProfileSubtitle' => 'Boshqa profilning ulanishidan qayta foydalaning.', + 'addServer.invalidCredentials' => 'Foydalanuvchi nomi yoki parol notoʻgʻri', + 'addServer.authResponseNotJson' => 'Autentifikatsiya javobi yaroqli JSON emas', + 'addServer.quickConnectRejected' => 'Quick Connect server tomonidan rad etildi', + 'addServer.quickConnectNotJson' => 'Quick Connect javobi yaroqli JSON emas', + 'addServer.quickConnectMissingFields' => 'Quick Connect javobida kod yoki maxfiy kalit yoʻq', + 'addServer.quickConnectPollRejected' => 'Quick Connect soʻrovi server tomonidan rad etildi', + 'addServer.serverTimedOut' => 'Server oʻz vaqtida javob bermadi', + 'addServer.responseNotJson' => 'Server javobi yaroqli JSON emas', + 'addServer.responseMissingIdentity' => ({required Object product}) => 'Javobda ID yoki server nomi yoʻq — bu ${product} serverimi?', + 'addServer.probeFailed' => ({required Object error}) => 'Serverga ulanib boʻlmadi: ${error}', + 'addServer.enterAtLeastOneUrl' => ({required Object product}) => 'Kamida bitta ${product} server URL-ini kiriting', + 'addServer.noReachableServer' => ({required Object product}) => 'Ulanish mumkin boʻlgan ${product} serveri topilmadi', + 'addServer.urlsPointToDifferentServers' => ({required Object product}) => 'Bu URL-lar turli ${product} serverlariga olib boradi', + 'addServer.urlDoesNotMatchServer' => ({required Object product}) => 'Bu URL ${product} serveriga mos kelmaydi', + 'addServer.redirectUnsupported' => 'Server qoʻllab-quvvatlanmaydigan URL-ga yoʻnaltirdi', + 'addServer.redirectDifferentHost' => ({required Object product}) => 'Server boshqa xostga yoʻnaltirdi. Yakuniy ${product} URL-ini bevosita kiriting.', + 'addServer.redirectInsecure' => 'Server HTTPS manzilidan xavfsiz boʻlmagan URL-ga yoʻnaltirdi', + 'addServer.redirectUnsupportedEnterFinal' => ({required Object product}) => 'Server qoʻllab-quvvatlanmaydigan URL-ga yoʻnaltirdi. Yakuniy ${product} URL-ini bevosita kiriting.', _ => null, }; } diff --git a/lib/i18n/strings_zh.g.dart b/lib/i18n/strings_zh.g.dart index ceceeeb0..3518ba82 100644 --- a/lib/i18n/strings_zh.g.dart +++ b/lib/i18n/strings_zh.g.dart @@ -123,6 +123,7 @@ class Translations$auth$zh extends Translations$auth$en { @override String get quickConnectCancel => '取消'; @override String get quickConnectExpired => 'Quick Connect 已过期。请重试。'; @override String get localDataRecoveryRequired => 'Plezy 无法安全恢复本地登录状态和待处理的播放数据。请重新登录。'; + @override String get pinCheckRejected => 'Plex PIN 检查被拒绝'; } // Path: common @@ -178,6 +179,9 @@ class Translations$common$zh extends Translations$common$en { @override String get exitFullscreen => '退出全屏'; @override String get pressBackAgainToExit => '再按一次返回键退出'; @override late final Translations$common$ratingSource$zh ratingSource = Translations$common$ratingSource$zh.internal(_root); + @override String get notAvailable => 'N/A'; + @override String get url => 'URL'; + @override String get letterKeys => 'ABC'; } // Path: screens @@ -444,6 +448,8 @@ class Translations$settings$zh extends Translations$settings$en { @override String get showNavBarLabels => '显示导航栏标签'; @override String get showNavBarLabelsDescription => '在导航栏图标下方显示文字标签'; @override String get startupSection => '启动页面'; + @override String get showExploreTab => '显示“探索”标签页'; + @override String get showExploreTabDescription => '显示“探索”标签页,其中包含来自 Plex Discover 和已连接追踪服务的内容'; @override String get liveTvDefaultFavorites => '默认显示收藏频道'; @override String get liveTvDefaultFavoritesDescription => '打开直播电视时仅显示收藏频道'; @override String get display => '显示'; @@ -455,6 +461,7 @@ class Translations$settings$zh extends Translations$settings$en { @override String get subtitlesAndConfig => '字幕与配置'; @override String get seekAndTiming => '跳转与计时'; @override String get behavior => '行为'; + @override String get exportDialogTitle => '导出 Plezy 设置'; } // Path: search @@ -606,6 +613,8 @@ class Translations$fileInfo$zh extends Translations$fileInfo$en { @override String get flagHearingImpaired => '听障辅助'; @override String get flagDub => '配音'; @override String get flagOriginal => '原声'; + @override String get channelsMono => '单声道'; + @override String dolbyVisionProfile({required Object profile}) => '编码配置 ${profile}'; } // Path: mediaMenu @@ -701,6 +710,11 @@ class Translations$accessibility$zh extends Translations$accessibility$en { @override String get alphabetScrollHint => '上下滑动以按字母移动'; @override String rowColumnPosition({required Object row, required Object rowCount, required Object column, required Object columnCount}) => '第 ${row} 行,共 ${rowCount} 行;第 ${column} 列,共 ${columnCount} 列'; @override String rowPosition({required Object row, required Object rowCount}) => '第 ${row} 行,共 ${rowCount} 行'; + @override String get autoScrollPlay => '开始自动滚动'; + @override String get autoScrollPause => '暂停自动滚动'; + @override String get hueShort => 'H'; + @override String get saturationShort => 'S'; + @override String get valueShort => 'V'; } // Path: tooltips @@ -812,6 +826,15 @@ class Translations$videoControls$zh extends Translations$videoControls$en { @override String get subtitleDownloadedNotApplied => '字幕已下载,但无法选择'; @override String get subtitleDownloadFailed => '字幕下载失败'; @override String get searchLanguages => '搜索语言…'; + @override String get skipIntro => '跳过片头'; + @override String get skipCredits => '跳过片尾'; + @override String get nextEpisode => '下一集'; + @override String subtitleTrack({required Object n}) => '轨道 ${n}'; + @override String subtitleFile({required Object name}) => '字幕 ${name}'; + @override String forcedTrack({required Object label}) => '${label}(强制)'; + @override String get osdSubtitlesOff => '字幕:关闭'; + @override String osdSubtitles({required Object track}) => '字幕:${track}'; + @override String osdAudio({required Object track}) => '音频:${track}'; } // Path: messages @@ -872,9 +895,18 @@ class Translations$messages$zh extends Translations$messages$en { @override String get serverLimitBody => '服务器错误(HTTP 500)。此次会话可能因带宽或转码限制而被拒绝。请联系服务器所有者调整限制。'; @override String get mediaUnreadableTitle => '文件不可用'; @override String get mediaUnreadableBody => '服务器找到了此项目,但无法读取其文件(HTTP 404)。文件可能已被移动、删除,或其存储已离线。请联系服务器管理员检查文件并重新扫描媒体库。'; + @override String get serverBusyTitle => '视频流不可用'; + @override String get serverBusyBody => '服务器持续拒绝传输此文件(HTTP 503)。服务器可能正在重启或正忙,也可能是文件所在的存储设备已离线。请稍后重试;如果问题持续出现,请联系服务器所有者检查服务器和文件存储设备。'; @override String get logsUploaded => '日志已上传'; @override String get logsUploadFailed => '上传日志失败'; @override String get logId => '日志 ID'; + @override String get burnedSubtitlesUseMenu => '字幕已烧录到此视频流中。请从字幕菜单中更改。'; + @override String get noVideoUrl => '没有可用的视频 URL'; + @override String get playbackNoMediaSources => '服务器未返回可播放的媒体源'; + @override String get playbackDataNotPrepared => '播放数据尚未准备就绪时便开始了播放'; + @override String get streamSelectionUnavailable => '此媒体源不支持选择视频流'; + @override String get streamSelectionFailed => '无法应用所选视频流'; + @override String get serverUnavailableForProfile => '没有可供当前用户资料使用的服务器'; } // Path: subtitlingStyling @@ -900,6 +932,8 @@ class Translations$subtitlingStyling$zh extends Translations$subtitlingStyling$e @override String get overrideStrip => '移除样式'; @override String get positionTop => '顶部'; @override String get positionBottom => '底部'; + @override String get anchorToScreen => '锚定到屏幕'; + @override String get anchorToScreenDescription => '在宽屏视频下方的黑边中显示文本字幕'; @override String get bold => '粗体'; @override String get italic => '斜体'; @override String get renderResolution => '渲染分辨率'; @@ -1009,6 +1043,7 @@ class Translations$profiles$zh extends Translations$profiles$en { @override String get pinExplain => '切换用户资料时需要输入 4 位 PIN。'; @override String get continueButton => '继续'; @override String get pinsDontMatch => 'PIN 不匹配'; + @override String get tokenIdentityMismatch => 'Plex 用户资料令牌解析到了非预期服务器'; } // Path: connections @@ -1060,6 +1095,9 @@ class Translations$discover$zh extends Translations$discover$en { @override String get tvShow => '电视剧'; @override String minutesLeft({required Object minutes}) => '剩余 ${minutes} 分钟'; @override String get moreLikeThis => '更多类似内容'; + @override String titleCount({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('zh'))(n, + other: '${n} 个标题', + ); } // Path: errors @@ -1271,7 +1309,10 @@ class Translations$explore$zh extends Translations$explore$en { @override String get characters => '角色'; @override String get addToWatchlist => '添加到想看列表'; @override String get removeFromWatchlist => '从想看列表移除'; + @override String get addedToWatchlist => '已加入待看列表'; + @override String get removedFromWatchlist => '已从待看列表中移除'; @override String get watchlistUpdateFailed => '无法更新想看列表'; + @override String get watchlistNoMatch => '无法将此项目与待看列表匹配'; @override String get notInLibrary => '不在你的媒体库中'; @override String get inTheseLibraries => '在这些媒体库中'; @override String get checkingLibrary => '正在检查你的媒体库…'; @@ -1331,6 +1372,9 @@ class Translations$liveTv$zh extends Translations$liveTv$en { @override String get watchChannel => '观看频道'; @override String get favorites => '收藏'; @override String get reorderFavorites => '重新排序收藏'; + @override String get noFavoriteChannels => '没有收藏的频道'; + @override String get noFavoriteChannelsHint => '显示所有频道,然后长按某个频道将其加入收藏。'; + @override String get showAllChannels => '显示所有频道'; @override String get favoritesLoadFailed => '无法加载收藏。请检查网络连接后重试。'; @override String get favoritesUpdateFailed => '无法更新收藏。请检查网络连接后重试。'; @override String get joinSession => '加入正在进行的会话'; @@ -1370,6 +1414,11 @@ class Translations$liveTv$zh extends Translations$liveTv$en { @override String get guideReloadRequested => '已请求更新节目指南'; @override String get rulesProcessRequested => '已请求重新评估规则'; @override String get recordShow => '录制节目'; + @override String startingInMinutes({required Object minutes}) => '${minutes} 分钟后开始'; + @override String dayAtTime({required Object day, required Object time}) => '${day} ${time}'; + @override String invalidPlaybackData({required Object product}) => '${product} 返回了无效的直播电视播放数据'; + @override String get failedToStartChannel => '无法播放直播频道'; + @override String get failedToBuildStreamUrl => '无法生成视频流 URL'; } // Path: collections @@ -1467,6 +1516,8 @@ class Translations$music$zh extends Translations$music$en { @override String get repeat => '循环'; @override String get repeatAll => '列表循环'; @override String get repeatOne => '单曲循环'; + @override String get instantMixNoServer => '没有可用于即时混合的服务器'; + @override String noAudioUrl({required Object track}) => '没有可供 ${track} 使用的音频 URL'; } // Path: watchTogether @@ -1541,6 +1592,7 @@ class Translations$watchTogether$zh extends Translations$watchTogether$en { @override String get removeRoom => '移除'; @override String get guestSwitchUnavailable => '无法切换 — 服务器不可用于同步'; @override String get guestSwitchFailed => '无法切换 — 在此服务器上未找到内容'; + @override String get defaultDisplayName => '用户'; } // Path: downloads @@ -1625,6 +1677,16 @@ class Translations$downloads$zh extends Translations$downloads$en { @override String get syncRuleUnknownServer => '未知服务器'; @override String get syncRuleListCreated => '同步规则已创建'; @override late final Translations$downloads$backgroundWarning$zh backgroundWarning = Translations$downloads$backgroundWarning$zh.internal(_root); + @override String get unknownShow => '未知节目'; + @override String get unknownSeason => '未知季'; + @override String get unknownAlbum => '未知专辑'; + @override String completedOfTotal({required Object completed, required Object total}) => '已完成 ${completed}/${total}'; + @override String get errorFileNotFound => '未找到文件(404)'; + @override String get errorDownloadFailed => '下载失败'; + @override String errorPostProcessing({required Object error}) => '后处理失败:${error}'; + @override String get notificationDownloading => '正在下载…'; + @override String get notificationComplete => '下载完成'; + @override String get notificationPaused => '下载已暂停'; } // Path: shaders @@ -1665,6 +1727,7 @@ class Translations$companionRemote$zh extends Translations$companionRemote$en { @override late final Translations$companionRemote$pairing$zh pairing = Translations$companionRemote$pairing$zh.internal(_root); @override late final Translations$companionRemote$remote$zh remote = Translations$companionRemote$remote$zh.internal(_root); @override late final Translations$companionRemote$errors$zh errors = Translations$companionRemote$errors$zh.internal(_root); + @override String get closedBeforeAuth => '连接在身份验证前已关闭'; } // Path: videoSettings @@ -1682,6 +1745,13 @@ class Translations$videoSettings$zh extends Translations$videoSettings$en { @override String get audioSync => '音频同步'; @override String get subtitleSync => '字幕同步'; @override String get hdr => 'HDR'; + @override String get hdrUnsupported => '此处不支持 HDR——当前桌面合成器或视频输出无法传输 HDR。'; + @override String get hdrToneMapping => 'HDR 色调映射'; + @override String get hdrToneMappingCompositor => '合成器'; + @override String get hdrToneMappingCompositorDescription => '直接传递源的 HDR 元数据,并由桌面合成器进行映射。'; + @override String get hdrToneMappingPlayer => '播放器'; + @override String get hdrToneMappingPlayerDescription => '在播放器中映射到显示器的峰值亮度,然后将结果告知合成器。'; + @override String get hdrToneMappingFailed => '无法更改 HDR 色调映射——仍在使用之前的模式。'; @override String get audioOutput => '音频输出'; @override String get performanceOverlay => '性能监控'; @override String get audioOutputDolbyAtmos => 'Dolby Atmos'; @@ -1735,6 +1805,16 @@ class Translations$performanceOverlay$zh extends Translations$performanceOverlay @override String get player => '播放器'; @override String get memory => '内存'; @override String get uiFps => 'UI FPS'; + @override String get fps => 'FPS'; + @override String get decoderAndroidHw => 'Android 硬件'; + @override String get decoderNvidiaHw => 'NVIDIA 硬件'; + @override String get decoderQualcommHw => 'Qualcomm 硬件'; + @override String get decoderMediatekHw => 'MediaTek 硬件'; + @override String get decoderExynosHw => 'Exynos 硬件'; + @override String get decoderSoftware => '软件'; + @override String get decoderHardware => '硬件'; + @override String get tunnelingActive => '已启用'; + @override String dvRpuFailed({required Object converted, required Object failures}) => '${converted}(${failures} 个失败)'; } // Path: externalPlayer @@ -1935,6 +2015,16 @@ class Translations$seerr$zh extends Translations$seerr$en { @override String get statusPartiallyAvailable => '部分可用'; @override String get statusRequested => '已请求'; @override String get statusProcessing => '处理中'; + @override String couldNotReach({required Object url, required Object error}) => '无法连接到 ${url}:${error}'; + @override String noInstanceAtUrl({required Object url, required Object status}) => '${url} 上没有 Seerr 实例(HTTP ${status})'; + @override String get notInitialized => '此 Seerr 实例尚未完成首次运行设置'; + @override String get noPlexTokenForReauth => '没有可用于重新登录的 Plex 令牌'; + @override String get noStoredCredentials => '没有已保存的凭据可用于重新登录'; + @override String get signInRejected => '登录被拒绝'; + @override String get noSessionCookie => 'Seerr 未签发会话 Cookie'; + @override String get freshCookieRejected => 'Seerr 拒绝了新的会话 Cookie'; + @override String get noUserInformation => 'Seerr 未返回用户信息'; + @override String get sessionRejectedAfterReauth => '重新登录后会话被拒绝'; } // Path: services @@ -1995,6 +2085,24 @@ class Translations$addServer$zh extends Translations$addServer$en { @override String connectToMediaBrowserCardSubtitleScoped({required Object product, required Object name}) => '登录你的 ${product} 服务器。将绑定到 ${name}。'; @override String get borrowFromAnotherProfile => '使用其他用户资料的连接'; @override String get borrowFromAnotherProfileSubtitle => '复用另一个用户资料的连接。受 PIN 保护的用户资料需要输入 PIN。'; + @override String get invalidCredentials => '用户名或密码无效'; + @override String get authResponseNotJson => '身份验证响应不是有效的 JSON'; + @override String get quickConnectRejected => '服务器拒绝了 Quick Connect'; + @override String get quickConnectNotJson => 'Quick Connect 响应不是有效的 JSON'; + @override String get quickConnectMissingFields => 'Quick Connect 响应中缺少代码或密钥'; + @override String get quickConnectPollRejected => '服务器拒绝了 Quick Connect 轮询'; + @override String get serverTimedOut => '服务器未及时响应'; + @override String get responseNotJson => '服务器响应不是有效的 JSON'; + @override String responseMissingIdentity({required Object product}) => '响应中缺少 ID 或服务器名称——这是 ${product} 服务器吗?'; + @override String probeFailed({required Object error}) => '无法连接到服务器:${error}'; + @override String enterAtLeastOneUrl({required Object product}) => '请输入至少一个 ${product} 服务器 URL'; + @override String noReachableServer({required Object product}) => '未找到可连接的 ${product} 服务器'; + @override String urlsPointToDifferentServers({required Object product}) => '这些 URL 指向不同的 ${product} 服务器'; + @override String urlDoesNotMatchServer({required Object product}) => '此 URL 与 ${product} 服务器不匹配'; + @override String get redirectUnsupported => '服务器重定向到了不受支持的 URL'; + @override String redirectDifferentHost({required Object product}) => '服务器重定向到了其他主机。请直接输入最终的 ${product} URL。'; + @override String get redirectInsecure => '服务器从 HTTPS 重定向到了不安全的 URL'; + @override String redirectUnsupportedEnterFinal({required Object product}) => '服务器重定向到了不受支持的 URL。请直接输入最终的 ${product} URL。'; } // Path: common.ratingSource @@ -2512,6 +2620,7 @@ class Translations$services$deviceCode$zh extends Translations$services$deviceCo // Translations @override String title({required Object service}) => '在 ${service} 上激活 Plezy'; + @override String get instructions => '扫描二维码,或访问下方地址并输入此代码:'; @override String openToActivate({required Object service}) => '打开 ${service} 以激活'; @override String get copyCode => '复制激活代码'; @override String get waitingForAuthorization => '等待授权…'; @@ -2586,6 +2695,7 @@ extension on TranslationsZh { 'auth.quickConnectCancel' => '取消', 'auth.quickConnectExpired' => 'Quick Connect 已过期。请重试。', 'auth.localDataRecoveryRequired' => 'Plezy 无法安全恢复本地登录状态和待处理的播放数据。请重新登录。', + 'auth.pinCheckRejected' => 'Plex PIN 检查被拒绝', 'common.cancel' => '取消', 'common.save' => '保存', 'common.close' => '关闭', @@ -2642,6 +2752,9 @@ extension on TranslationsZh { 'common.ratingSource.trakt' => 'Trakt', 'common.ratingSource.rottenTomatoesCritic' => 'Rotten Tomatoes 影评人', 'common.ratingSource.rottenTomatoesAudience' => 'Rotten Tomatoes 观众', + 'common.notAvailable' => 'N/A', + 'common.url' => 'URL', + 'common.letterKeys' => 'ABC', 'screens.licenses' => '许可证', 'screens.switchProfile' => '切换用户', 'screens.subtitleStyling' => '字幕样式', @@ -2881,6 +2994,8 @@ extension on TranslationsZh { 'settings.showNavBarLabels' => '显示导航栏标签', 'settings.showNavBarLabelsDescription' => '在导航栏图标下方显示文字标签', 'settings.startupSection' => '启动页面', + 'settings.showExploreTab' => '显示“探索”标签页', + 'settings.showExploreTabDescription' => '显示“探索”标签页,其中包含来自 Plex Discover 和已连接追踪服务的内容', 'settings.liveTvDefaultFavorites' => '默认显示收藏频道', 'settings.liveTvDefaultFavoritesDescription' => '打开直播电视时仅显示收藏频道', 'settings.display' => '显示', @@ -2892,6 +3007,7 @@ extension on TranslationsZh { 'settings.subtitlesAndConfig' => '字幕与配置', 'settings.seekAndTiming' => '跳转与计时', 'settings.behavior' => '行为', + 'settings.exportDialogTitle' => '导出 Plezy 设置', 'search.hint' => '搜索电影、剧集、音乐…', 'search.tryDifferentTerm' => '尝试不同的搜索词', 'search.searchYourMedia' => '搜索媒体', @@ -3040,6 +3156,8 @@ extension on TranslationsZh { 'fileInfo.flagHearingImpaired' => '听障辅助', 'fileInfo.flagDub' => '配音', 'fileInfo.flagOriginal' => '原声', + 'fileInfo.channelsMono' => '单声道', + 'fileInfo.dolbyVisionProfile' => ({required Object profile}) => '编码配置 ${profile}', 'mediaMenu.markAsWatched' => '标记为已观看', 'mediaMenu.markAsUnwatched' => '标记为未观看', 'mediaMenu.removeFromContinueWatching' => '从继续观看中移除', @@ -3073,6 +3191,8 @@ extension on TranslationsZh { 'mediaMenu.rate' => '评分', 'mediaMenu.playFromBeginning' => '从头播放', 'mediaMenu.playVersion' => '播放版本…', + _ => null, + } ?? switch (path) { 'rateSheet.title' => '评分', 'rateSheet.server' => '服务器', 'rateSheet.favorite' => '收藏', @@ -3082,8 +3202,6 @@ extension on TranslationsZh { 'rateSheet.noConnectedServices' => '在设置中连接服务,即可在此评分。', 'accessibility.mediaCardMovie' => ({required Object title}) => '${title}, 电影', 'accessibility.mediaCardShow' => ({required Object title}) => '${title}, 电视剧', - _ => null, - } ?? switch (path) { 'accessibility.mediaCardEpisode' => ({required Object title, required Object episodeInfo}) => '${title}, ${episodeInfo}', 'accessibility.mediaCardSeason' => ({required Object title, required Object seasonInfo}) => '${title}, ${seasonInfo}', 'accessibility.mediaCardWatched' => '已观看', @@ -3104,6 +3222,11 @@ extension on TranslationsZh { 'accessibility.alphabetScrollHint' => '上下滑动以按字母移动', 'accessibility.rowColumnPosition' => ({required Object row, required Object rowCount, required Object column, required Object columnCount}) => '第 ${row} 行,共 ${rowCount} 行;第 ${column} 列,共 ${columnCount} 列', 'accessibility.rowPosition' => ({required Object row, required Object rowCount}) => '第 ${row} 行,共 ${rowCount} 行', + 'accessibility.autoScrollPlay' => '开始自动滚动', + 'accessibility.autoScrollPause' => '暂停自动滚动', + 'accessibility.hueShort' => 'H', + 'accessibility.saturationShort' => 'S', + 'accessibility.valueShort' => 'V', 'tooltips.shufflePlay' => '随机播放', 'tooltips.playTrailer' => '播放预告片', 'tooltips.markAsWatched' => '标记为已观看', @@ -3194,6 +3317,15 @@ extension on TranslationsZh { 'videoControls.subtitleDownloadedNotApplied' => '字幕已下载,但无法选择', 'videoControls.subtitleDownloadFailed' => '字幕下载失败', 'videoControls.searchLanguages' => '搜索语言…', + 'videoControls.skipIntro' => '跳过片头', + 'videoControls.skipCredits' => '跳过片尾', + 'videoControls.nextEpisode' => '下一集', + 'videoControls.subtitleTrack' => ({required Object n}) => '轨道 ${n}', + 'videoControls.subtitleFile' => ({required Object name}) => '字幕 ${name}', + 'videoControls.forcedTrack' => ({required Object label}) => '${label}(强制)', + 'videoControls.osdSubtitlesOff' => '字幕:关闭', + 'videoControls.osdSubtitles' => ({required Object track}) => '字幕:${track}', + 'videoControls.osdAudio' => ({required Object track}) => '音频:${track}', 'messages.markedAsWatched' => '已标记为已观看', 'messages.markedAsUnwatched' => '已标记为未观看', 'messages.markedAsWatchedOffline' => '已标记为已观看(将在联网时同步)', @@ -3243,9 +3375,18 @@ extension on TranslationsZh { 'messages.serverLimitBody' => '服务器错误(HTTP 500)。此次会话可能因带宽或转码限制而被拒绝。请联系服务器所有者调整限制。', 'messages.mediaUnreadableTitle' => '文件不可用', 'messages.mediaUnreadableBody' => '服务器找到了此项目,但无法读取其文件(HTTP 404)。文件可能已被移动、删除,或其存储已离线。请联系服务器管理员检查文件并重新扫描媒体库。', + 'messages.serverBusyTitle' => '视频流不可用', + 'messages.serverBusyBody' => '服务器持续拒绝传输此文件(HTTP 503)。服务器可能正在重启或正忙,也可能是文件所在的存储设备已离线。请稍后重试;如果问题持续出现,请联系服务器所有者检查服务器和文件存储设备。', 'messages.logsUploaded' => '日志已上传', 'messages.logsUploadFailed' => '上传日志失败', 'messages.logId' => '日志 ID', + 'messages.burnedSubtitlesUseMenu' => '字幕已烧录到此视频流中。请从字幕菜单中更改。', + 'messages.noVideoUrl' => '没有可用的视频 URL', + 'messages.playbackNoMediaSources' => '服务器未返回可播放的媒体源', + 'messages.playbackDataNotPrepared' => '播放数据尚未准备就绪时便开始了播放', + 'messages.streamSelectionUnavailable' => '此媒体源不支持选择视频流', + 'messages.streamSelectionFailed' => '无法应用所选视频流', + 'messages.serverUnavailableForProfile' => '没有可供当前用户资料使用的服务器', 'subtitlingStyling.text' => '文本', 'subtitlingStyling.border' => '边框', 'subtitlingStyling.background' => '背景', @@ -3262,6 +3403,8 @@ extension on TranslationsZh { 'subtitlingStyling.overrideStrip' => '移除样式', 'subtitlingStyling.positionTop' => '顶部', 'subtitlingStyling.positionBottom' => '底部', + 'subtitlingStyling.anchorToScreen' => '锚定到屏幕', + 'subtitlingStyling.anchorToScreenDescription' => '在宽屏视频下方的黑边中显示文本字幕', 'subtitlingStyling.bold' => '粗体', 'subtitlingStyling.italic' => '斜体', 'subtitlingStyling.renderResolution' => '渲染分辨率', @@ -3344,6 +3487,7 @@ extension on TranslationsZh { 'profiles.pinExplain' => '切换用户资料时需要输入 4 位 PIN。', 'profiles.continueButton' => '继续', 'profiles.pinsDontMatch' => 'PIN 不匹配', + 'profiles.tokenIdentityMismatch' => 'Plex 用户资料令牌解析到了非预期服务器', 'connections.sectionTitle' => '连接', 'connections.addConnection' => '添加连接', 'connections.addConnectionSubtitleNoProfile' => '使用 Plex 登录或连接 Jellyfin 服务器', @@ -3377,6 +3521,7 @@ extension on TranslationsZh { 'discover.tvShow' => '电视剧', 'discover.minutesLeft' => ({required Object minutes}) => '剩余 ${minutes} 分钟', 'discover.moreLikeThis' => '更多类似内容', + 'discover.titleCount' => ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('zh'))(n, other: '${n} 个标题', ), 'errors.searchFailed' => ({required Object error}) => '搜索失败:${error}', 'errors.searchUnavailable' => '搜索无法连接任何媒体服务器。', 'errors.connectionTimeout' => ({required Object context}) => '加载 ${context} 时连接超时', @@ -3549,7 +3694,10 @@ extension on TranslationsZh { 'explore.characters' => '角色', 'explore.addToWatchlist' => '添加到想看列表', 'explore.removeFromWatchlist' => '从想看列表移除', + 'explore.addedToWatchlist' => '已加入待看列表', + 'explore.removedFromWatchlist' => '已从待看列表中移除', 'explore.watchlistUpdateFailed' => '无法更新想看列表', + 'explore.watchlistNoMatch' => '无法将此项目与待看列表匹配', 'explore.notInLibrary' => '不在你的媒体库中', 'explore.inTheseLibraries' => '在这些媒体库中', 'explore.checkingLibrary' => '正在检查你的媒体库…', @@ -3557,6 +3705,8 @@ extension on TranslationsZh { 'explore.emptyMessage' => ({required Object source}) => '当 ${source} 有内容时,相关内容将显示在这里。', 'explore.searchHint' => ({required Object source}) => '搜索 ${source}', 'explore.searchEmpty' => ({required Object query}) => '没有“${query}”的结果', + _ => null, + } ?? switch (path) { 'explore.searchPrompt' => ({required Object source}) => '在 ${source} 上搜索电影和剧集。', 'explore.searchFailed' => '搜索失败。请检查网络连接后重试。', 'explore.badge.rankPopular' => ({required Object n}) => '热门榜第 #${n} 名', @@ -3596,8 +3746,6 @@ extension on TranslationsZh { 'explore.stats.completed' => ({required Object n}) => '${n} 人已看完', 'explore.stats.onHold' => ({required Object n}) => '${n} 人搁置', 'explore.stats.dropped' => ({required Object n}) => '${n} 人弃番', - _ => null, - } ?? switch (path) { 'explore.season.winter' => '冬季', 'explore.season.spring' => '春季', 'explore.season.summer' => '夏季', @@ -3694,6 +3842,9 @@ extension on TranslationsZh { 'liveTv.watchChannel' => '观看频道', 'liveTv.favorites' => '收藏', 'liveTv.reorderFavorites' => '重新排序收藏', + 'liveTv.noFavoriteChannels' => '没有收藏的频道', + 'liveTv.noFavoriteChannelsHint' => '显示所有频道,然后长按某个频道将其加入收藏。', + 'liveTv.showAllChannels' => '显示所有频道', 'liveTv.favoritesLoadFailed' => '无法加载收藏。请检查网络连接后重试。', 'liveTv.favoritesUpdateFailed' => '无法更新收藏。请检查网络连接后重试。', 'liveTv.joinSession' => '加入正在进行的会话', @@ -3733,6 +3884,11 @@ extension on TranslationsZh { 'liveTv.guideReloadRequested' => '已请求更新节目指南', 'liveTv.rulesProcessRequested' => '已请求重新评估规则', 'liveTv.recordShow' => '录制节目', + 'liveTv.startingInMinutes' => ({required Object minutes}) => '${minutes} 分钟后开始', + 'liveTv.dayAtTime' => ({required Object day, required Object time}) => '${day} ${time}', + 'liveTv.invalidPlaybackData' => ({required Object product}) => '${product} 返回了无效的直播电视播放数据', + 'liveTv.failedToStartChannel' => '无法播放直播频道', + 'liveTv.failedToBuildStreamUrl' => '无法生成视频流 URL', 'collections.title' => '合集', 'collections.collection' => '合集', 'collections.empty' => '合集为空', @@ -3801,6 +3957,8 @@ extension on TranslationsZh { 'music.repeat' => '循环', 'music.repeatAll' => '列表循环', 'music.repeatOne' => '单曲循环', + 'music.instantMixNoServer' => '没有可用于即时混合的服务器', + 'music.noAudioUrl' => ({required Object track}) => '没有可供 ${track} 使用的音频 URL', 'watchTogether.title' => '一起看', 'watchTogether.description' => '与朋友和家人同步观看内容', 'watchTogether.createSession' => '创建会话', @@ -3866,6 +4024,7 @@ extension on TranslationsZh { 'watchTogether.removeRoom' => '移除', 'watchTogether.guestSwitchUnavailable' => '无法切换 — 服务器不可用于同步', 'watchTogether.guestSwitchFailed' => '无法切换 — 在此服务器上未找到内容', + 'watchTogether.defaultDisplayName' => '用户', 'downloads.title' => '下载', 'downloads.manage' => '管理', 'downloads.tvShows' => '电视剧', @@ -3966,6 +4125,16 @@ extension on TranslationsZh { 'downloads.backgroundWarning.statusUnknown' => '尚未检查', 'downloads.backgroundWarning.settingsUnavailable' => '无法在此设备上打开系统设置', 'downloads.backgroundWarning.linkUnavailable' => '无法在此设备上打开 dontkillmyapp.com', + 'downloads.unknownShow' => '未知节目', + 'downloads.unknownSeason' => '未知季', + 'downloads.unknownAlbum' => '未知专辑', + 'downloads.completedOfTotal' => ({required Object completed, required Object total}) => '已完成 ${completed}/${total}', + 'downloads.errorFileNotFound' => '未找到文件(404)', + 'downloads.errorDownloadFailed' => '下载失败', + 'downloads.errorPostProcessing' => ({required Object error}) => '后处理失败:${error}', + 'downloads.notificationDownloading' => '正在下载…', + 'downloads.notificationComplete' => '下载完成', + 'downloads.notificationPaused' => '下载已暂停', 'shaders.title' => '着色器', 'shaders.noShaderDescription' => '无视频增强', 'shaders.nvscalerDescription' => 'NVIDIA 图像缩放,使视频更清晰', @@ -4045,14 +4214,24 @@ extension on TranslationsZh { 'companionRemote.errors.failedToConnectAnyAddress' => '无法连接到任何地址', 'companionRemote.errors.connectionLostAfterAttempts' => ({required Object attempts}) => '${attempts} 次尝试后连接丢失', 'companionRemote.errors.connectionLost' => '连接丢失', + 'companionRemote.closedBeforeAuth' => '连接在身份验证前已关闭', 'videoSettings.playbackSpeed' => '播放速度', 'videoSettings.normalSpeed' => '正常', 'videoSettings.sleepTimerActive' => ({required Object duration}) => '运行中(${duration})', 'videoSettings.zoom' => '缩放', + _ => null, + } ?? switch (path) { 'videoSettings.sleepTimer' => '睡眠定时器', 'videoSettings.audioSync' => '音频同步', 'videoSettings.subtitleSync' => '字幕同步', 'videoSettings.hdr' => 'HDR', + 'videoSettings.hdrUnsupported' => '此处不支持 HDR——当前桌面合成器或视频输出无法传输 HDR。', + 'videoSettings.hdrToneMapping' => 'HDR 色调映射', + 'videoSettings.hdrToneMappingCompositor' => '合成器', + 'videoSettings.hdrToneMappingCompositorDescription' => '直接传递源的 HDR 元数据,并由桌面合成器进行映射。', + 'videoSettings.hdrToneMappingPlayer' => '播放器', + 'videoSettings.hdrToneMappingPlayerDescription' => '在播放器中映射到显示器的峰值亮度,然后将结果告知合成器。', + 'videoSettings.hdrToneMappingFailed' => '无法更改 HDR 色调映射——仍在使用之前的模式。', 'videoSettings.audioOutput' => '音频输出', 'videoSettings.performanceOverlay' => '性能监控', 'videoSettings.audioOutputDolbyAtmos' => 'Dolby Atmos', @@ -4097,6 +4276,16 @@ extension on TranslationsZh { 'performanceOverlay.player' => '播放器', 'performanceOverlay.memory' => '内存', 'performanceOverlay.uiFps' => 'UI FPS', + 'performanceOverlay.fps' => 'FPS', + 'performanceOverlay.decoderAndroidHw' => 'Android 硬件', + 'performanceOverlay.decoderNvidiaHw' => 'NVIDIA 硬件', + 'performanceOverlay.decoderQualcommHw' => 'Qualcomm 硬件', + 'performanceOverlay.decoderMediatekHw' => 'MediaTek 硬件', + 'performanceOverlay.decoderExynosHw' => 'Exynos 硬件', + 'performanceOverlay.decoderSoftware' => '软件', + 'performanceOverlay.decoderHardware' => '硬件', + 'performanceOverlay.tunnelingActive' => '已启用', + 'performanceOverlay.dvRpuFailed' => ({required Object converted, required Object failures}) => '${converted}(${failures} 个失败)', 'externalPlayer.title' => '外部播放器', 'externalPlayer.useExternalPlayer' => '使用外部播放器', 'externalPlayer.useExternalPlayerDescription' => '在其他应用中打开视频', @@ -4110,8 +4299,6 @@ extension on TranslationsZh { 'externalPlayer.playerPackage' => '包名', 'externalPlayer.playerUrlScheme' => 'URL 方案', 'externalPlayer.off' => '关闭', - _ => null, - } ?? switch (path) { 'externalPlayer.launchFailed' => '无法打开外部播放器', 'externalPlayer.appNotInstalled' => ({required Object name}) => '${name} 未安装', 'externalPlayer.playInExternalPlayer' => '在外部播放器中播放', @@ -4245,6 +4432,16 @@ extension on TranslationsZh { 'seerr.statusPartiallyAvailable' => '部分可用', 'seerr.statusRequested' => '已请求', 'seerr.statusProcessing' => '处理中', + 'seerr.couldNotReach' => ({required Object url, required Object error}) => '无法连接到 ${url}:${error}', + 'seerr.noInstanceAtUrl' => ({required Object url, required Object status}) => '${url} 上没有 Seerr 实例(HTTP ${status})', + 'seerr.notInitialized' => '此 Seerr 实例尚未完成首次运行设置', + 'seerr.noPlexTokenForReauth' => '没有可用于重新登录的 Plex 令牌', + 'seerr.noStoredCredentials' => '没有已保存的凭据可用于重新登录', + 'seerr.signInRejected' => '登录被拒绝', + 'seerr.noSessionCookie' => 'Seerr 未签发会话 Cookie', + 'seerr.freshCookieRejected' => 'Seerr 拒绝了新的会话 Cookie', + 'seerr.noUserInformation' => 'Seerr 未返回用户信息', + 'seerr.sessionRejectedAfterReauth' => '重新登录后会话被拒绝', 'services.title' => '服务', 'services.hubSubtitle' => '同步观看进度并请求新内容。', 'services.notConnected' => '未连接', @@ -4260,6 +4457,7 @@ extension on TranslationsZh { 'services.names.seerr' => 'Seerr', 'services.names.mdblist' => 'MDBList', 'services.deviceCode.title' => ({required Object service}) => '在 ${service} 上激活 Plezy', + 'services.deviceCode.instructions' => '扫描二维码,或访问下方地址并输入此代码:', 'services.deviceCode.openToActivate' => ({required Object service}) => '打开 ${service} 以激活', 'services.deviceCode.copyCode' => '复制激活代码', 'services.deviceCode.waitingForAuthorization' => '等待授权…', @@ -4309,6 +4507,24 @@ extension on TranslationsZh { 'addServer.connectToMediaBrowserCardSubtitleScoped' => ({required Object product, required Object name}) => '登录你的 ${product} 服务器。将绑定到 ${name}。', 'addServer.borrowFromAnotherProfile' => '使用其他用户资料的连接', 'addServer.borrowFromAnotherProfileSubtitle' => '复用另一个用户资料的连接。受 PIN 保护的用户资料需要输入 PIN。', + 'addServer.invalidCredentials' => '用户名或密码无效', + 'addServer.authResponseNotJson' => '身份验证响应不是有效的 JSON', + 'addServer.quickConnectRejected' => '服务器拒绝了 Quick Connect', + 'addServer.quickConnectNotJson' => 'Quick Connect 响应不是有效的 JSON', + 'addServer.quickConnectMissingFields' => 'Quick Connect 响应中缺少代码或密钥', + 'addServer.quickConnectPollRejected' => '服务器拒绝了 Quick Connect 轮询', + 'addServer.serverTimedOut' => '服务器未及时响应', + 'addServer.responseNotJson' => '服务器响应不是有效的 JSON', + 'addServer.responseMissingIdentity' => ({required Object product}) => '响应中缺少 ID 或服务器名称——这是 ${product} 服务器吗?', + 'addServer.probeFailed' => ({required Object error}) => '无法连接到服务器:${error}', + 'addServer.enterAtLeastOneUrl' => ({required Object product}) => '请输入至少一个 ${product} 服务器 URL', + 'addServer.noReachableServer' => ({required Object product}) => '未找到可连接的 ${product} 服务器', + 'addServer.urlsPointToDifferentServers' => ({required Object product}) => '这些 URL 指向不同的 ${product} 服务器', + 'addServer.urlDoesNotMatchServer' => ({required Object product}) => '此 URL 与 ${product} 服务器不匹配', + 'addServer.redirectUnsupported' => '服务器重定向到了不受支持的 URL', + 'addServer.redirectDifferentHost' => ({required Object product}) => '服务器重定向到了其他主机。请直接输入最终的 ${product} URL。', + 'addServer.redirectInsecure' => '服务器从 HTTPS 重定向到了不安全的 URL', + 'addServer.redirectUnsupportedEnterFinal' => ({required Object product}) => '服务器重定向到了不受支持的 URL。请直接输入最终的 ${product} URL。', _ => null, }; } diff --git a/lib/i18n/strings_zh_Hant.g.dart b/lib/i18n/strings_zh_Hant.g.dart index eb3d05f1..a79f6980 100644 --- a/lib/i18n/strings_zh_Hant.g.dart +++ b/lib/i18n/strings_zh_Hant.g.dart @@ -124,6 +124,7 @@ class _Translations$auth$zh_Hant extends Translations$auth$zh { @override String get quickConnectCancel => '取消'; @override String get quickConnectExpired => '快速連線代碼已過期。請重試。'; @override String get localDataRecoveryRequired => 'Plezy 無法安全地復原本機登入資料與待處理的播放資料。請重新登入。'; + @override String get pinCheckRejected => 'Plex PIN 檢查遭到拒絕'; } // Path: common @@ -179,6 +180,9 @@ class _Translations$common$zh_Hant extends Translations$common$zh { @override String get exitFullscreen => '退出全螢幕'; @override String get pressBackAgainToExit => '再按一次返回以退出'; @override late final _Translations$common$ratingSource$zh_Hant ratingSource = _Translations$common$ratingSource$zh_Hant._(_root); + @override String get notAvailable => 'N/A'; + @override String get url => 'URL'; + @override String get letterKeys => 'ABC'; } // Path: screens @@ -445,6 +449,8 @@ class _Translations$settings$zh_Hant extends Translations$settings$zh { @override String get showNavBarLabels => '顯示導覽列標籤'; @override String get showNavBarLabelsDescription => '在導覽列圖示下方顯示文字標籤'; @override String get startupSection => '啟動頁面'; + @override String get showExploreTab => '顯示探索分頁'; + @override String get showExploreTabDescription => '顯示探索分頁,其中包含來自 Plex Discover 和已連結追蹤服務的內容'; @override String get liveTvDefaultFavorites => '預設顯示最愛頻道'; @override String get liveTvDefaultFavoritesDescription => '開啟直播電視時僅顯示最愛頻道'; @override String get display => '顯示器'; @@ -456,6 +462,7 @@ class _Translations$settings$zh_Hant extends Translations$settings$zh { @override String get subtitlesAndConfig => '字幕與設定'; @override String get seekAndTiming => '跳轉與計時'; @override String get behavior => '行為'; + @override String get exportDialogTitle => '匯出 Plezy 設定'; } // Path: search @@ -607,6 +614,8 @@ class _Translations$fileInfo$zh_Hant extends Translations$fileInfo$zh { @override String get flagHearingImpaired => '聽障輔助'; @override String get flagDub => '配音'; @override String get flagOriginal => '原音'; + @override String get channelsMono => '單聲道'; + @override String dolbyVisionProfile({required Object profile}) => '規格檔(Profile)${profile}'; } // Path: mediaMenu @@ -702,6 +711,11 @@ class _Translations$accessibility$zh_Hant extends Translations$accessibility$zh @override String get alphabetScrollHint => '向上或向下滑動以按字母移動'; @override String rowColumnPosition({required Object row, required Object rowCount, required Object column, required Object columnCount}) => '第 ${row} 列,共 ${rowCount} 列;第 ${column} 欄,共 ${columnCount} 欄'; @override String rowPosition({required Object row, required Object rowCount}) => '第 ${row} 列,共 ${rowCount} 列'; + @override String get autoScrollPlay => '開始自動捲動'; + @override String get autoScrollPause => '暫停自動捲動'; + @override String get hueShort => 'H'; + @override String get saturationShort => 'S'; + @override String get valueShort => 'V'; } // Path: tooltips @@ -813,6 +827,15 @@ class _Translations$videoControls$zh_Hant extends Translations$videoControls$zh @override String get subtitleDownloadedNotApplied => '字幕已下載,但無法套用'; @override String get subtitleDownloadFailed => '字幕下載失敗'; @override String get searchLanguages => '搜尋語言…'; + @override String get skipIntro => '略過片頭'; + @override String get skipCredits => '略過片尾'; + @override String get nextEpisode => '下一集'; + @override String subtitleTrack({required Object n}) => '字幕軌 ${n}'; + @override String subtitleFile({required Object name}) => '字幕 ${name}'; + @override String forcedTrack({required Object label}) => '${label}(強制)'; + @override String get osdSubtitlesOff => '字幕:關閉'; + @override String osdSubtitles({required Object track}) => '字幕:${track}'; + @override String osdAudio({required Object track}) => '音訊:${track}'; } // Path: messages @@ -873,9 +896,18 @@ class _Translations$messages$zh_Hant extends Translations$messages$zh { @override String get serverLimitBody => '伺服器錯誤(HTTP 500)。伺服器的頻寬或轉碼限制可能拒絕此播放要求。請聯絡伺服器擁有者調整設定。'; @override String get mediaUnreadableTitle => '檔案無法使用'; @override String get mediaUnreadableBody => '伺服器找到了此項目,但無法讀取其檔案(HTTP 404)。檔案可能已移動、刪除,或其儲存空間離線。請聯絡伺服器擁有者檢查檔案並重新掃描媒體庫。'; + @override String get serverBusyTitle => '串流無法使用'; + @override String get serverBusyBody => '伺服器持續拒絕串流此檔案(HTTP 503)。伺服器可能正在重新啟動、忙碌中,或檔案所在的儲存裝置可能已離線。請稍後再試;若問題持續發生,請要求伺服器擁有者檢查伺服器及檔案所在的儲存裝置。'; @override String get logsUploaded => '日誌已上傳'; @override String get logsUploadFailed => '上傳日誌失敗'; @override String get logId => '日誌 ID'; + @override String get burnedSubtitlesUseMenu => '字幕已燒錄至此串流中。請從字幕選單變更字幕。'; + @override String get noVideoUrl => '沒有可用的視訊 URL'; + @override String get playbackNoMediaSources => '伺服器未傳回可播放的媒體來源'; + @override String get playbackDataNotPrepared => '播放資料尚未準備完成就已開始播放'; + @override String get streamSelectionUnavailable => '此來源不支援選擇串流'; + @override String get streamSelectionFailed => '無法套用所選串流'; + @override String get serverUnavailableForProfile => '使用中的使用者設定檔沒有可用的伺服器'; } // Path: subtitlingStyling @@ -901,6 +933,8 @@ class _Translations$subtitlingStyling$zh_Hant extends Translations$subtitlingSty @override String get overrideStrip => '移除樣式'; @override String get positionTop => '頂部'; @override String get positionBottom => '底部'; + @override String get anchorToScreen => '錨定至螢幕'; + @override String get anchorToScreenDescription => '在寬螢幕影片下方的黑邊顯示文字字幕'; @override String get bold => '粗體'; @override String get italic => '斜體'; @override String get renderResolution => '渲染解析度'; @@ -1010,6 +1044,7 @@ class _Translations$profiles$zh_Hant extends Translations$profiles$zh { @override String get pinExplain => '切換至此使用者設定檔時需要 4 位數 PIN 碼。'; @override String get continueButton => '繼續'; @override String get pinsDontMatch => 'PIN 碼不符合'; + @override String get tokenIdentityMismatch => 'Plex 使用者設定檔權杖解析到非預期的伺服器'; } // Path: connections @@ -1061,6 +1096,9 @@ class _Translations$discover$zh_Hant extends Translations$discover$zh { @override String get tvShow => '影集'; @override String minutesLeft({required Object minutes}) => '剩餘 ${minutes} 分鐘'; @override String get moreLikeThis => '更多類似內容'; + @override String titleCount({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('zh'))(n, + other: '${n} 部作品', + ); } // Path: errors @@ -1272,7 +1310,10 @@ class _Translations$explore$zh_Hant extends Translations$explore$zh { @override String get characters => '角色'; @override String get addToWatchlist => '新增至待看清單'; @override String get removeFromWatchlist => '從待看清單移除'; + @override String get addedToWatchlist => '已加入待看清單'; + @override String get removedFromWatchlist => '已從待看清單移除'; @override String get watchlistUpdateFailed => '無法更新待看清單'; + @override String get watchlistNoMatch => '無法將此項目與待看清單配對'; @override String get notInLibrary => '不在您的媒體庫中'; @override String get inTheseLibraries => '在這些媒體庫中'; @override String get checkingLibrary => '正在檢查您的媒體庫…'; @@ -1332,6 +1373,9 @@ class _Translations$liveTv$zh_Hant extends Translations$liveTv$zh { @override String get watchChannel => '觀看頻道'; @override String get favorites => '最愛'; @override String get reorderFavorites => '重新排序最愛頻道'; + @override String get noFavoriteChannels => '沒有最愛頻道'; + @override String get noFavoriteChannelsHint => '顯示所有頻道,然後長按頻道即可將其加入最愛。'; + @override String get showAllChannels => '顯示所有頻道'; @override String get favoritesLoadFailed => '無法載入最愛頻道。請檢查網路連線後重試。'; @override String get favoritesUpdateFailed => '無法更新最愛頻道。請檢查網路連線後重試。'; @override String get joinSession => '加入進行中的「一起看」'; @@ -1371,6 +1415,11 @@ class _Translations$liveTv$zh_Hant extends Translations$liveTv$zh { @override String get guideReloadRequested => '已要求更新節目表指南'; @override String get rulesProcessRequested => '已要求重新評估規則'; @override String get recordShow => '錄製節目'; + @override String startingInMinutes({required Object minutes}) => '${minutes} 分鐘後開始'; + @override String dayAtTime({required Object day, required Object time}) => '${day} ${time}'; + @override String invalidPlaybackData({required Object product}) => '${product} 傳回了無效的直播電視播放資料'; + @override String get failedToStartChannel => '無法啟動直播頻道'; + @override String get failedToBuildStreamUrl => '無法建立串流 URL'; } // Path: collections @@ -1468,6 +1517,8 @@ class _Translations$music$zh_Hant extends Translations$music$zh { @override String get repeat => '重複播放'; @override String get repeatAll => '全部重複播放'; @override String get repeatOne => '單曲重複播放'; + @override String get instantMixNoServer => '沒有可用於即時混音的伺服器'; + @override String noAudioUrl({required Object track}) => '${track} 沒有可用的音訊 URL'; } // Path: watchTogether @@ -1542,6 +1593,7 @@ class _Translations$watchTogether$zh_Hant extends Translations$watchTogether$zh @override String get removeRoom => '移除'; @override String get guestSwitchUnavailable => '無法切換 — 伺服器無法進行同步'; @override String get guestSwitchFailed => '無法切換 — 在此伺服器上找不到內容'; + @override String get defaultDisplayName => '使用者'; } // Path: downloads @@ -1626,6 +1678,16 @@ class _Translations$downloads$zh_Hant extends Translations$downloads$zh { @override String get syncRuleUnknownServer => '未知伺服器'; @override String get syncRuleListCreated => '同步規則已建立'; @override late final _Translations$downloads$backgroundWarning$zh_Hant backgroundWarning = _Translations$downloads$backgroundWarning$zh_Hant._(_root); + @override String get unknownShow => '未知節目'; + @override String get unknownSeason => '未知季度'; + @override String get unknownAlbum => '未知專輯'; + @override String completedOfTotal({required Object completed, required Object total}) => '已完成 ${completed}/${total}'; + @override String get errorFileNotFound => '找不到檔案(404)'; + @override String get errorDownloadFailed => '下載失敗'; + @override String errorPostProcessing({required Object error}) => '後續處理失敗:${error}'; + @override String get notificationDownloading => '正在下載…'; + @override String get notificationComplete => '下載完成'; + @override String get notificationPaused => '下載已暫停'; } // Path: shaders @@ -1666,6 +1728,7 @@ class _Translations$companionRemote$zh_Hant extends Translations$companionRemote @override late final _Translations$companionRemote$pairing$zh_Hant pairing = _Translations$companionRemote$pairing$zh_Hant._(_root); @override late final _Translations$companionRemote$remote$zh_Hant remote = _Translations$companionRemote$remote$zh_Hant._(_root); @override late final _Translations$companionRemote$errors$zh_Hant errors = _Translations$companionRemote$errors$zh_Hant._(_root); + @override String get closedBeforeAuth => '連線在驗證前已關閉'; } // Path: videoSettings @@ -1683,6 +1746,13 @@ class _Translations$videoSettings$zh_Hant extends Translations$videoSettings$zh @override String get audioSync => '音訊同步調整'; @override String get subtitleSync => '字幕同步調整'; @override String get hdr => 'HDR'; + @override String get hdrUnsupported => '此處無法使用 HDR——這個桌面合成器或視訊輸出無法傳遞 HDR。'; + @override String get hdrToneMapping => 'HDR 色調映射'; + @override String get hdrToneMappingCompositor => '合成器'; + @override String get hdrToneMappingCompositorDescription => '直接傳遞來源的 HDR 中繼資料,並交由桌面合成器進行色調映射。'; + @override String get hdrToneMappingPlayer => '播放器'; + @override String get hdrToneMappingPlayerDescription => '在播放器中依顯示器的峰值亮度進行映射,再將結果告知合成器。'; + @override String get hdrToneMappingFailed => '無法變更 HDR 色調映射,先前的模式仍在使用中。'; @override String get audioOutput => '音訊輸出'; @override String get performanceOverlay => '效能監控'; @override String get audioOutputDolbyAtmos => 'Dolby Atmos'; @@ -1736,6 +1806,16 @@ class _Translations$performanceOverlay$zh_Hant extends Translations$performanceO @override String get player => '播放器'; @override String get memory => '記憶體'; @override String get uiFps => 'UI FPS'; + @override String get fps => 'FPS'; + @override String get decoderAndroidHw => 'Android 硬體'; + @override String get decoderNvidiaHw => 'NVIDIA 硬體'; + @override String get decoderQualcommHw => 'Qualcomm 硬體'; + @override String get decoderMediatekHw => 'MediaTek 硬體'; + @override String get decoderExynosHw => 'Exynos 硬體'; + @override String get decoderSoftware => '軟體'; + @override String get decoderHardware => '硬體'; + @override String get tunnelingActive => '已啟用'; + @override String dvRpuFailed({required Object converted, required Object failures}) => '${converted}(${failures} 個失敗)'; } // Path: externalPlayer @@ -1936,6 +2016,16 @@ class _Translations$seerr$zh_Hant extends Translations$seerr$zh { @override String get statusPartiallyAvailable => '部分可用'; @override String get statusRequested => '已請求'; @override String get statusProcessing => '處理中'; + @override String couldNotReach({required Object url, required Object error}) => '無法連線至 ${url}:${error}'; + @override String noInstanceAtUrl({required Object url, required Object status}) => '在 ${url} 找不到 Seerr 執行個體(HTTP ${status})'; + @override String get notInitialized => '此 Seerr 執行個體尚未完成首次執行設定'; + @override String get noPlexTokenForReauth => '沒有可用於重新登入的 Plex 權杖'; + @override String get noStoredCredentials => '沒有可用於重新登入的已儲存認證資訊'; + @override String get signInRejected => '登入遭到拒絕'; + @override String get noSessionCookie => 'Seerr 未發出工作階段 Cookie'; + @override String get freshCookieRejected => 'Seerr 拒絕了新的工作階段 Cookie'; + @override String get noUserInformation => 'Seerr 未傳回使用者資訊'; + @override String get sessionRejectedAfterReauth => '重新登入後,工作階段遭到拒絕'; } // Path: services @@ -1996,6 +2086,24 @@ class _Translations$addServer$zh_Hant extends Translations$addServer$zh { @override String connectToMediaBrowserCardSubtitleScoped({required Object product, required Object name}) => '登入您的 ${product} 伺服器。將綁定至 ${name}。'; @override String get borrowFromAnotherProfile => '從另一個使用者設定檔共用'; @override String get borrowFromAnotherProfileSubtitle => '重複使用另一個使用者設定檔的連線資訊。受 PIN 碼保護的使用者設定檔需輸入 PIN 碼。'; + @override String get invalidCredentials => '使用者名稱或密碼無效'; + @override String get authResponseNotJson => '驗證回應不是有效的 JSON'; + @override String get quickConnectRejected => 'Quick Connect 遭到伺服器拒絕'; + @override String get quickConnectNotJson => 'Quick Connect 回應不是有效的 JSON'; + @override String get quickConnectMissingFields => 'Quick Connect 回應缺少代碼或密鑰'; + @override String get quickConnectPollRejected => 'Quick Connect 輪詢遭到伺服器拒絕'; + @override String get serverTimedOut => '伺服器未及時回應'; + @override String get responseNotJson => '伺服器回應不是有效的 JSON'; + @override String responseMissingIdentity({required Object product}) => '回應缺少 ID 或伺服器名稱——這是 ${product} 伺服器嗎?'; + @override String probeFailed({required Object error}) => '無法連線至伺服器:${error}'; + @override String enterAtLeastOneUrl({required Object product}) => '請輸入至少一個 ${product} 伺服器 URL'; + @override String noReachableServer({required Object product}) => '找不到可連線的 ${product} 伺服器'; + @override String urlsPointToDifferentServers({required Object product}) => '這些 URL 指向不同的 ${product} 伺服器'; + @override String urlDoesNotMatchServer({required Object product}) => '此 URL 與 ${product} 伺服器不符'; + @override String get redirectUnsupported => '伺服器重新導向至不支援的 URL'; + @override String redirectDifferentHost({required Object product}) => '伺服器重新導向至不同的主機。請直接輸入最終的 ${product} URL。'; + @override String get redirectInsecure => '伺服器從 HTTPS 重新導向至不安全的 URL'; + @override String redirectUnsupportedEnterFinal({required Object product}) => '伺服器重新導向至不支援的 URL。請直接輸入最終的 ${product} URL。'; } // Path: common.ratingSource @@ -2513,6 +2621,7 @@ class _Translations$services$deviceCode$zh_Hant extends Translations$services$de // Translations @override String title({required Object service}) => '在 ${service} 啟用 Plezy'; + @override String get instructions => '掃描 QR 碼,或前往下方網址並輸入此代碼:'; @override String openToActivate({required Object service}) => '開啟 ${service} 進行啟用'; @override String get copyCode => '複製啟用代碼'; @override String get waitingForAuthorization => '等待授權中…'; @@ -2587,6 +2696,7 @@ extension on TranslationsZhHant { 'auth.quickConnectCancel' => '取消', 'auth.quickConnectExpired' => '快速連線代碼已過期。請重試。', 'auth.localDataRecoveryRequired' => 'Plezy 無法安全地復原本機登入資料與待處理的播放資料。請重新登入。', + 'auth.pinCheckRejected' => 'Plex PIN 檢查遭到拒絕', 'common.cancel' => '取消', 'common.save' => '儲存', 'common.close' => '關閉', @@ -2643,6 +2753,9 @@ extension on TranslationsZhHant { 'common.ratingSource.trakt' => 'Trakt', 'common.ratingSource.rottenTomatoesCritic' => 'Rotten Tomatoes 影評人', 'common.ratingSource.rottenTomatoesAudience' => 'Rotten Tomatoes 觀眾', + 'common.notAvailable' => 'N/A', + 'common.url' => 'URL', + 'common.letterKeys' => 'ABC', 'screens.licenses' => '授權條款', 'screens.switchProfile' => '切換使用者', 'screens.subtitleStyling' => '字幕樣式', @@ -2882,6 +2995,8 @@ extension on TranslationsZhHant { 'settings.showNavBarLabels' => '顯示導覽列標籤', 'settings.showNavBarLabelsDescription' => '在導覽列圖示下方顯示文字標籤', 'settings.startupSection' => '啟動頁面', + 'settings.showExploreTab' => '顯示探索分頁', + 'settings.showExploreTabDescription' => '顯示探索分頁,其中包含來自 Plex Discover 和已連結追蹤服務的內容', 'settings.liveTvDefaultFavorites' => '預設顯示最愛頻道', 'settings.liveTvDefaultFavoritesDescription' => '開啟直播電視時僅顯示最愛頻道', 'settings.display' => '顯示器', @@ -2893,6 +3008,7 @@ extension on TranslationsZhHant { 'settings.subtitlesAndConfig' => '字幕與設定', 'settings.seekAndTiming' => '跳轉與計時', 'settings.behavior' => '行為', + 'settings.exportDialogTitle' => '匯出 Plezy 設定', 'search.hint' => '搜尋電影、影集、音樂…', 'search.tryDifferentTerm' => '嘗試不同的關鍵字', 'search.searchYourMedia' => '搜尋媒體庫', @@ -3041,6 +3157,8 @@ extension on TranslationsZhHant { 'fileInfo.flagHearingImpaired' => '聽障輔助', 'fileInfo.flagDub' => '配音', 'fileInfo.flagOriginal' => '原音', + 'fileInfo.channelsMono' => '單聲道', + 'fileInfo.dolbyVisionProfile' => ({required Object profile}) => '規格檔(Profile)${profile}', 'mediaMenu.markAsWatched' => '標記為已觀看', 'mediaMenu.markAsUnwatched' => '標記為未觀看', 'mediaMenu.removeFromContinueWatching' => '從「繼續觀看」中移除', @@ -3074,6 +3192,8 @@ extension on TranslationsZhHant { 'mediaMenu.rate' => '評分', 'mediaMenu.playFromBeginning' => '從頭播放', 'mediaMenu.playVersion' => '播放版本…', + _ => null, + } ?? switch (path) { 'rateSheet.title' => '評分', 'rateSheet.server' => '伺服器', 'rateSheet.favorite' => '最愛', @@ -3083,8 +3203,6 @@ extension on TranslationsZhHant { 'rateSheet.noConnectedServices' => '在設定中連結外部服務後,即可在此評分。', 'accessibility.mediaCardMovie' => ({required Object title}) => '${title}, 電影', 'accessibility.mediaCardShow' => ({required Object title}) => '${title}, 影集', - _ => null, - } ?? switch (path) { 'accessibility.mediaCardEpisode' => ({required Object title, required Object episodeInfo}) => '${title}, ${episodeInfo}', 'accessibility.mediaCardSeason' => ({required Object title, required Object seasonInfo}) => '${title}, ${seasonInfo}', 'accessibility.mediaCardWatched' => '已觀看', @@ -3105,6 +3223,11 @@ extension on TranslationsZhHant { 'accessibility.alphabetScrollHint' => '向上或向下滑動以按字母移動', 'accessibility.rowColumnPosition' => ({required Object row, required Object rowCount, required Object column, required Object columnCount}) => '第 ${row} 列,共 ${rowCount} 列;第 ${column} 欄,共 ${columnCount} 欄', 'accessibility.rowPosition' => ({required Object row, required Object rowCount}) => '第 ${row} 列,共 ${rowCount} 列', + 'accessibility.autoScrollPlay' => '開始自動捲動', + 'accessibility.autoScrollPause' => '暫停自動捲動', + 'accessibility.hueShort' => 'H', + 'accessibility.saturationShort' => 'S', + 'accessibility.valueShort' => 'V', 'tooltips.shufflePlay' => '隨機播放', 'tooltips.playTrailer' => '播放預告片', 'tooltips.markAsWatched' => '標記為已觀看', @@ -3195,6 +3318,15 @@ extension on TranslationsZhHant { 'videoControls.subtitleDownloadedNotApplied' => '字幕已下載,但無法套用', 'videoControls.subtitleDownloadFailed' => '字幕下載失敗', 'videoControls.searchLanguages' => '搜尋語言…', + 'videoControls.skipIntro' => '略過片頭', + 'videoControls.skipCredits' => '略過片尾', + 'videoControls.nextEpisode' => '下一集', + 'videoControls.subtitleTrack' => ({required Object n}) => '字幕軌 ${n}', + 'videoControls.subtitleFile' => ({required Object name}) => '字幕 ${name}', + 'videoControls.forcedTrack' => ({required Object label}) => '${label}(強制)', + 'videoControls.osdSubtitlesOff' => '字幕:關閉', + 'videoControls.osdSubtitles' => ({required Object track}) => '字幕:${track}', + 'videoControls.osdAudio' => ({required Object track}) => '音訊:${track}', 'messages.markedAsWatched' => '已標記為已觀看', 'messages.markedAsUnwatched' => '已標記為未觀看', 'messages.markedAsWatchedOffline' => '已標記為已觀看(將在連線時同步)', @@ -3244,9 +3376,18 @@ extension on TranslationsZhHant { 'messages.serverLimitBody' => '伺服器錯誤(HTTP 500)。伺服器的頻寬或轉碼限制可能拒絕此播放要求。請聯絡伺服器擁有者調整設定。', 'messages.mediaUnreadableTitle' => '檔案無法使用', 'messages.mediaUnreadableBody' => '伺服器找到了此項目,但無法讀取其檔案(HTTP 404)。檔案可能已移動、刪除,或其儲存空間離線。請聯絡伺服器擁有者檢查檔案並重新掃描媒體庫。', + 'messages.serverBusyTitle' => '串流無法使用', + 'messages.serverBusyBody' => '伺服器持續拒絕串流此檔案(HTTP 503)。伺服器可能正在重新啟動、忙碌中,或檔案所在的儲存裝置可能已離線。請稍後再試;若問題持續發生,請要求伺服器擁有者檢查伺服器及檔案所在的儲存裝置。', 'messages.logsUploaded' => '日誌已上傳', 'messages.logsUploadFailed' => '上傳日誌失敗', 'messages.logId' => '日誌 ID', + 'messages.burnedSubtitlesUseMenu' => '字幕已燒錄至此串流中。請從字幕選單變更字幕。', + 'messages.noVideoUrl' => '沒有可用的視訊 URL', + 'messages.playbackNoMediaSources' => '伺服器未傳回可播放的媒體來源', + 'messages.playbackDataNotPrepared' => '播放資料尚未準備完成就已開始播放', + 'messages.streamSelectionUnavailable' => '此來源不支援選擇串流', + 'messages.streamSelectionFailed' => '無法套用所選串流', + 'messages.serverUnavailableForProfile' => '使用中的使用者設定檔沒有可用的伺服器', 'subtitlingStyling.text' => '文字', 'subtitlingStyling.border' => '邊框', 'subtitlingStyling.background' => '背景', @@ -3263,6 +3404,8 @@ extension on TranslationsZhHant { 'subtitlingStyling.overrideStrip' => '移除樣式', 'subtitlingStyling.positionTop' => '頂部', 'subtitlingStyling.positionBottom' => '底部', + 'subtitlingStyling.anchorToScreen' => '錨定至螢幕', + 'subtitlingStyling.anchorToScreenDescription' => '在寬螢幕影片下方的黑邊顯示文字字幕', 'subtitlingStyling.bold' => '粗體', 'subtitlingStyling.italic' => '斜體', 'subtitlingStyling.renderResolution' => '渲染解析度', @@ -3345,6 +3488,7 @@ extension on TranslationsZhHant { 'profiles.pinExplain' => '切換至此使用者設定檔時需要 4 位數 PIN 碼。', 'profiles.continueButton' => '繼續', 'profiles.pinsDontMatch' => 'PIN 碼不符合', + 'profiles.tokenIdentityMismatch' => 'Plex 使用者設定檔權杖解析到非預期的伺服器', 'connections.sectionTitle' => '連線', 'connections.addConnection' => '新增連線', 'connections.addConnectionSubtitleNoProfile' => '使用 Plex 登入或連線至 Jellyfin 伺服器', @@ -3378,6 +3522,7 @@ extension on TranslationsZhHant { 'discover.tvShow' => '影集', 'discover.minutesLeft' => ({required Object minutes}) => '剩餘 ${minutes} 分鐘', 'discover.moreLikeThis' => '更多類似內容', + 'discover.titleCount' => ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('zh'))(n, other: '${n} 部作品', ), 'errors.searchFailed' => ({required Object error}) => '搜尋失敗:${error}', 'errors.searchUnavailable' => '搜尋無法連線至任何媒體伺服器。', 'errors.connectionTimeout' => ({required Object context}) => '載入 ${context} 時連線逾時', @@ -3550,7 +3695,10 @@ extension on TranslationsZhHant { 'explore.characters' => '角色', 'explore.addToWatchlist' => '新增至待看清單', 'explore.removeFromWatchlist' => '從待看清單移除', + 'explore.addedToWatchlist' => '已加入待看清單', + 'explore.removedFromWatchlist' => '已從待看清單移除', 'explore.watchlistUpdateFailed' => '無法更新待看清單', + 'explore.watchlistNoMatch' => '無法將此項目與待看清單配對', 'explore.notInLibrary' => '不在您的媒體庫中', 'explore.inTheseLibraries' => '在這些媒體庫中', 'explore.checkingLibrary' => '正在檢查您的媒體庫…', @@ -3558,6 +3706,8 @@ extension on TranslationsZhHant { 'explore.emptyMessage' => ({required Object source}) => '當 ${source} 有內容時,相關資訊將顯示在此處。', 'explore.searchHint' => ({required Object source}) => '搜尋 ${source}', 'explore.searchEmpty' => ({required Object query}) => '沒有「${query}」的結果', + _ => null, + } ?? switch (path) { 'explore.searchPrompt' => ({required Object source}) => '在 ${source} 搜尋電影與影集。', 'explore.searchFailed' => '搜尋失敗。請檢查網路連線後重試。', 'explore.badge.rankPopular' => ({required Object n}) => '#${n} 熱門', @@ -3597,8 +3747,6 @@ extension on TranslationsZhHant { 'explore.stats.completed' => ({required Object n}) => '${n} 人已看完', 'explore.stats.onHold' => ({required Object n}) => '${n} 人擱置中', 'explore.stats.dropped' => ({required Object n}) => '${n} 人棄番', - _ => null, - } ?? switch (path) { 'explore.season.winter' => '冬季', 'explore.season.spring' => '春季', 'explore.season.summer' => '夏季', @@ -3695,6 +3843,9 @@ extension on TranslationsZhHant { 'liveTv.watchChannel' => '觀看頻道', 'liveTv.favorites' => '最愛', 'liveTv.reorderFavorites' => '重新排序最愛頻道', + 'liveTv.noFavoriteChannels' => '沒有最愛頻道', + 'liveTv.noFavoriteChannelsHint' => '顯示所有頻道,然後長按頻道即可將其加入最愛。', + 'liveTv.showAllChannels' => '顯示所有頻道', 'liveTv.favoritesLoadFailed' => '無法載入最愛頻道。請檢查網路連線後重試。', 'liveTv.favoritesUpdateFailed' => '無法更新最愛頻道。請檢查網路連線後重試。', 'liveTv.joinSession' => '加入進行中的「一起看」', @@ -3734,6 +3885,11 @@ extension on TranslationsZhHant { 'liveTv.guideReloadRequested' => '已要求更新節目表指南', 'liveTv.rulesProcessRequested' => '已要求重新評估規則', 'liveTv.recordShow' => '錄製節目', + 'liveTv.startingInMinutes' => ({required Object minutes}) => '${minutes} 分鐘後開始', + 'liveTv.dayAtTime' => ({required Object day, required Object time}) => '${day} ${time}', + 'liveTv.invalidPlaybackData' => ({required Object product}) => '${product} 傳回了無效的直播電視播放資料', + 'liveTv.failedToStartChannel' => '無法啟動直播頻道', + 'liveTv.failedToBuildStreamUrl' => '無法建立串流 URL', 'collections.title' => '收藏集', 'collections.collection' => '收藏集', 'collections.empty' => '收藏集為空', @@ -3802,6 +3958,8 @@ extension on TranslationsZhHant { 'music.repeat' => '重複播放', 'music.repeatAll' => '全部重複播放', 'music.repeatOne' => '單曲重複播放', + 'music.instantMixNoServer' => '沒有可用於即時混音的伺服器', + 'music.noAudioUrl' => ({required Object track}) => '${track} 沒有可用的音訊 URL', 'watchTogether.title' => '一起看', 'watchTogether.description' => '與親友同步觀看內容', 'watchTogether.createSession' => '建立「一起看」工作階段', @@ -3867,6 +4025,7 @@ extension on TranslationsZhHant { 'watchTogether.removeRoom' => '移除', 'watchTogether.guestSwitchUnavailable' => '無法切換 — 伺服器無法進行同步', 'watchTogether.guestSwitchFailed' => '無法切換 — 在此伺服器上找不到內容', + 'watchTogether.defaultDisplayName' => '使用者', 'downloads.title' => '下載', 'downloads.manage' => '管理', 'downloads.tvShows' => '影集', @@ -3967,6 +4126,16 @@ extension on TranslationsZhHant { 'downloads.backgroundWarning.statusUnknown' => '尚未檢查', 'downloads.backgroundWarning.settingsUnavailable' => '無法在這部裝置上開啟系統設定', 'downloads.backgroundWarning.linkUnavailable' => '無法在這部裝置上開啟 dontkillmyapp.com', + 'downloads.unknownShow' => '未知節目', + 'downloads.unknownSeason' => '未知季度', + 'downloads.unknownAlbum' => '未知專輯', + 'downloads.completedOfTotal' => ({required Object completed, required Object total}) => '已完成 ${completed}/${total}', + 'downloads.errorFileNotFound' => '找不到檔案(404)', + 'downloads.errorDownloadFailed' => '下載失敗', + 'downloads.errorPostProcessing' => ({required Object error}) => '後續處理失敗:${error}', + 'downloads.notificationDownloading' => '正在下載…', + 'downloads.notificationComplete' => '下載完成', + 'downloads.notificationPaused' => '下載已暫停', 'shaders.title' => '著色器', 'shaders.noShaderDescription' => '無影片增強效果', 'shaders.nvscalerDescription' => 'NVIDIA 圖像縮放技術,使影片邊緣更清晰', @@ -4046,14 +4215,24 @@ extension on TranslationsZhHant { 'companionRemote.errors.failedToConnectAnyAddress' => '無法連線至任何位址', 'companionRemote.errors.connectionLostAfterAttempts' => ({required Object attempts}) => '嘗試 ${attempts} 次後連線中斷', 'companionRemote.errors.connectionLost' => '連線已中斷', + 'companionRemote.closedBeforeAuth' => '連線在驗證前已關閉', 'videoSettings.playbackSpeed' => '播放速度', 'videoSettings.normalSpeed' => '正常速度', 'videoSettings.sleepTimerActive' => ({required Object duration}) => '執行中(${duration})', 'videoSettings.zoom' => '縮放', + _ => null, + } ?? switch (path) { 'videoSettings.sleepTimer' => '睡眠計時器', 'videoSettings.audioSync' => '音訊同步調整', 'videoSettings.subtitleSync' => '字幕同步調整', 'videoSettings.hdr' => 'HDR', + 'videoSettings.hdrUnsupported' => '此處無法使用 HDR——這個桌面合成器或視訊輸出無法傳遞 HDR。', + 'videoSettings.hdrToneMapping' => 'HDR 色調映射', + 'videoSettings.hdrToneMappingCompositor' => '合成器', + 'videoSettings.hdrToneMappingCompositorDescription' => '直接傳遞來源的 HDR 中繼資料,並交由桌面合成器進行色調映射。', + 'videoSettings.hdrToneMappingPlayer' => '播放器', + 'videoSettings.hdrToneMappingPlayerDescription' => '在播放器中依顯示器的峰值亮度進行映射,再將結果告知合成器。', + 'videoSettings.hdrToneMappingFailed' => '無法變更 HDR 色調映射,先前的模式仍在使用中。', 'videoSettings.audioOutput' => '音訊輸出', 'videoSettings.performanceOverlay' => '效能監控', 'videoSettings.audioOutputDolbyAtmos' => 'Dolby Atmos', @@ -4098,6 +4277,16 @@ extension on TranslationsZhHant { 'performanceOverlay.player' => '播放器', 'performanceOverlay.memory' => '記憶體', 'performanceOverlay.uiFps' => 'UI FPS', + 'performanceOverlay.fps' => 'FPS', + 'performanceOverlay.decoderAndroidHw' => 'Android 硬體', + 'performanceOverlay.decoderNvidiaHw' => 'NVIDIA 硬體', + 'performanceOverlay.decoderQualcommHw' => 'Qualcomm 硬體', + 'performanceOverlay.decoderMediatekHw' => 'MediaTek 硬體', + 'performanceOverlay.decoderExynosHw' => 'Exynos 硬體', + 'performanceOverlay.decoderSoftware' => '軟體', + 'performanceOverlay.decoderHardware' => '硬體', + 'performanceOverlay.tunnelingActive' => '已啟用', + 'performanceOverlay.dvRpuFailed' => ({required Object converted, required Object failures}) => '${converted}(${failures} 個失敗)', 'externalPlayer.title' => '外部播放器', 'externalPlayer.useExternalPlayer' => '使用外部播放器', 'externalPlayer.useExternalPlayerDescription' => '在其他應用程式中開啟影片', @@ -4111,8 +4300,6 @@ extension on TranslationsZhHant { 'externalPlayer.playerPackage' => '套件名稱', 'externalPlayer.playerUrlScheme' => 'URL 協定架構(Scheme)', 'externalPlayer.off' => '關閉', - _ => null, - } ?? switch (path) { 'externalPlayer.launchFailed' => '無法啟動外部播放器', 'externalPlayer.appNotInstalled' => ({required Object name}) => '${name} 未安裝', 'externalPlayer.playInExternalPlayer' => '在外部播放器播放', @@ -4246,6 +4433,16 @@ extension on TranslationsZhHant { 'seerr.statusPartiallyAvailable' => '部分可用', 'seerr.statusRequested' => '已請求', 'seerr.statusProcessing' => '處理中', + 'seerr.couldNotReach' => ({required Object url, required Object error}) => '無法連線至 ${url}:${error}', + 'seerr.noInstanceAtUrl' => ({required Object url, required Object status}) => '在 ${url} 找不到 Seerr 執行個體(HTTP ${status})', + 'seerr.notInitialized' => '此 Seerr 執行個體尚未完成首次執行設定', + 'seerr.noPlexTokenForReauth' => '沒有可用於重新登入的 Plex 權杖', + 'seerr.noStoredCredentials' => '沒有可用於重新登入的已儲存認證資訊', + 'seerr.signInRejected' => '登入遭到拒絕', + 'seerr.noSessionCookie' => 'Seerr 未發出工作階段 Cookie', + 'seerr.freshCookieRejected' => 'Seerr 拒絕了新的工作階段 Cookie', + 'seerr.noUserInformation' => 'Seerr 未傳回使用者資訊', + 'seerr.sessionRejectedAfterReauth' => '重新登入後,工作階段遭到拒絕', 'services.title' => '外部服務', 'services.hubSubtitle' => '同步觀看進度並請求新內容。', 'services.notConnected' => '未連線', @@ -4261,6 +4458,7 @@ extension on TranslationsZhHant { 'services.names.seerr' => 'Seerr', 'services.names.mdblist' => 'MDBList', 'services.deviceCode.title' => ({required Object service}) => '在 ${service} 啟用 Plezy', + 'services.deviceCode.instructions' => '掃描 QR 碼,或前往下方網址並輸入此代碼:', 'services.deviceCode.openToActivate' => ({required Object service}) => '開啟 ${service} 進行啟用', 'services.deviceCode.copyCode' => '複製啟用代碼', 'services.deviceCode.waitingForAuthorization' => '等待授權中…', @@ -4310,6 +4508,24 @@ extension on TranslationsZhHant { 'addServer.connectToMediaBrowserCardSubtitleScoped' => ({required Object product, required Object name}) => '登入您的 ${product} 伺服器。將綁定至 ${name}。', 'addServer.borrowFromAnotherProfile' => '從另一個使用者設定檔共用', 'addServer.borrowFromAnotherProfileSubtitle' => '重複使用另一個使用者設定檔的連線資訊。受 PIN 碼保護的使用者設定檔需輸入 PIN 碼。', + 'addServer.invalidCredentials' => '使用者名稱或密碼無效', + 'addServer.authResponseNotJson' => '驗證回應不是有效的 JSON', + 'addServer.quickConnectRejected' => 'Quick Connect 遭到伺服器拒絕', + 'addServer.quickConnectNotJson' => 'Quick Connect 回應不是有效的 JSON', + 'addServer.quickConnectMissingFields' => 'Quick Connect 回應缺少代碼或密鑰', + 'addServer.quickConnectPollRejected' => 'Quick Connect 輪詢遭到伺服器拒絕', + 'addServer.serverTimedOut' => '伺服器未及時回應', + 'addServer.responseNotJson' => '伺服器回應不是有效的 JSON', + 'addServer.responseMissingIdentity' => ({required Object product}) => '回應缺少 ID 或伺服器名稱——這是 ${product} 伺服器嗎?', + 'addServer.probeFailed' => ({required Object error}) => '無法連線至伺服器:${error}', + 'addServer.enterAtLeastOneUrl' => ({required Object product}) => '請輸入至少一個 ${product} 伺服器 URL', + 'addServer.noReachableServer' => ({required Object product}) => '找不到可連線的 ${product} 伺服器', + 'addServer.urlsPointToDifferentServers' => ({required Object product}) => '這些 URL 指向不同的 ${product} 伺服器', + 'addServer.urlDoesNotMatchServer' => ({required Object product}) => '此 URL 與 ${product} 伺服器不符', + 'addServer.redirectUnsupported' => '伺服器重新導向至不支援的 URL', + 'addServer.redirectDifferentHost' => ({required Object product}) => '伺服器重新導向至不同的主機。請直接輸入最終的 ${product} URL。', + 'addServer.redirectInsecure' => '伺服器從 HTTPS 重新導向至不安全的 URL', + 'addServer.redirectUnsupportedEnterFinal' => ({required Object product}) => '伺服器重新導向至不支援的 URL。請直接輸入最終的 ${product} URL。', _ => null, }; } diff --git a/lib/i18n/sv.i18n.json b/lib/i18n/sv.i18n.json index 514b2e18..600b0787 100644 --- a/lib/i18n/sv.i18n.json +++ b/lib/i18n/sv.i18n.json @@ -17,7 +17,8 @@ "quickConnectWaiting": "Väntar på godkännande…", "quickConnectCancel": "Avbryt", "quickConnectExpired": "Quick Connect har gått ut. Försök igen.", - "localDataRecoveryRequired": "Plezy kunde inte återställa lokala inloggningsuppgifter och väntande uppspelningsdata på ett säkert sätt. Logga in igen." + "localDataRecoveryRequired": "Plezy kunde inte återställa lokala inloggningsuppgifter och väntande uppspelningsdata på ett säkert sätt. Logga in igen.", + "pinCheckRejected": "Plex PIN-kontrollen avvisades" }, "common": { "cancel": "Avbryt", @@ -77,7 +78,10 @@ "trakt": "Trakt", "rottenTomatoesCritic": "Rotten Tomatoes-kritiker", "rottenTomatoesAudience": "Rotten Tomatoes-publik" - } + }, + "notAvailable": "N/A", + "url": "URL", + "letterKeys": "ABC" }, "screens": { "licenses": "Licenser", @@ -323,8 +327,8 @@ "showNavBarLabels": "Visa navigeringsfältets etiketter", "showNavBarLabelsDescription": "Visa textetiketter under navigeringsfältets ikoner", "startupSection": "Startsida", - "showExploreTab": "", - "showExploreTabDescription": "", + "showExploreTab": "Visa fliken Utforska", + "showExploreTabDescription": "Visa fliken Utforska med innehåll från Plex Discover och anslutna spårningstjänster", "liveTvDefaultFavorites": "Öppna med favoriter", "liveTvDefaultFavoritesDescription": "Visa endast favoritkanaler när Live-TV öppnas", "display": "Skärm", @@ -335,7 +339,8 @@ "player": "Spelare", "subtitlesAndConfig": "Undertexter och konfiguration", "seekAndTiming": "Spolning och tidsinställningar", - "behavior": "Beteende" + "behavior": "Beteende", + "exportDialogTitle": "Exportera Plezy-inställningar" }, "search": { "hint": "Sök filmer, serier, musik...", @@ -491,7 +496,9 @@ "flagExternal": "Extern", "flagHearingImpaired": "Hörselskadade", "flagDub": "Dubbad", - "flagOriginal": "Original" + "flagOriginal": "Original", + "channelsMono": "Mono", + "dolbyVisionProfile": "Profil ${profile}" }, "mediaMenu": { "markAsWatched": "Markera som sedd", @@ -568,7 +575,12 @@ "alphabetNavigation": "Alfabetisk navigering", "alphabetScrollHint": "Svep uppåt eller nedåt för att gå mellan bokstäver", "rowColumnPosition": "Rad ${row} av ${rowCount}, kolumn ${column} av ${columnCount}", - "rowPosition": "Rad ${row} av ${rowCount}" + "rowPosition": "Rad ${row} av ${rowCount}", + "autoScrollPlay": "Starta automatisk rullning", + "autoScrollPause": "Pausa automatisk rullning", + "hueShort": "H", + "saturationShort": "S", + "valueShort": "V" }, "tooltips": { "shufflePlay": "Blanda uppspelning", @@ -666,7 +678,16 @@ "subtitleDownloaded": "Undertexten har laddats ned", "subtitleDownloadedNotApplied": "Undertexten laddades ned men kunde inte väljas", "subtitleDownloadFailed": "Det gick inte att ladda ned undertexten", - "searchLanguages": "Sök språk..." + "searchLanguages": "Sök språk...", + "skipIntro": "Hoppa över intro", + "skipCredits": "Hoppa över eftertexter", + "nextEpisode": "Nästa avsnitt", + "subtitleTrack": "Spår ${n}", + "subtitleFile": "Undertext ${name}", + "forcedTrack": "${label} (Forcerad)", + "osdSubtitlesOff": "Undertexter: Av", + "osdSubtitles": "Undertexter: ${track}", + "osdAudio": "Ljud: ${track}" }, "userStatus": {}, "messages": { @@ -722,12 +743,18 @@ "serverLimitBody": "Serverfel (HTTP 500). En bandbredds-/transkodningsgräns avvisade troligen sessionen. Be ägaren justera den.", "mediaUnreadableTitle": "Filen är otillgänglig", "mediaUnreadableBody": "Servern hittade objektet men kunde inte läsa dess fil (HTTP 404). Filen har troligen flyttats, tagits bort eller så är dess lagring offline. Be serverägaren kontrollera filen och skanna om biblioteket.", - "serverBusyTitle": "", - "serverBusyBody": "", + "serverBusyTitle": "Strömmen är inte tillgänglig", + "serverBusyBody": "Servern nekade upprepade gånger att strömma den här filen (HTTP 503). Den kan hålla på att startas om eller vara upptagen, eller så kan lagringen där filen finns vara offline. Försök igen om en stund – om det fortsätter, be serverns ägare att kontrollera servern och lagringen där filen finns.", "logsUploaded": "Loggarna har laddats upp", "logsUploadFailed": "Det gick inte att ladda upp loggarna", "logId": "Logg-ID", - "burnedSubtitlesUseMenu": "" + "burnedSubtitlesUseMenu": "Undertexterna är inbrända i den här strömmen. Ändra dem via undertextmenyn.", + "noVideoUrl": "Ingen video-URL är tillgänglig", + "playbackNoMediaSources": "Servern returnerade inga spelbara mediekällor", + "playbackDataNotPrepared": "Uppspelningen startades innan uppspelningsinformationen var klar", + "streamSelectionUnavailable": "Val av ström är inte tillgängligt för den här källan", + "streamSelectionFailed": "Kunde inte tillämpa de valda strömmarna", + "serverUnavailableForProfile": "Ingen server är tillgänglig för den aktiva profilen" }, "subtitlingStyling": { "text": "Text", @@ -746,8 +773,8 @@ "overrideStrip": "Ta bort formatering", "positionTop": "Överst", "positionBottom": "Nederst", - "anchorToScreen": "", - "anchorToScreenDescription": "", + "anchorToScreen": "Förankra vid skärmen", + "anchorToScreenDescription": "Visa textbaserade undertexter i de svarta fälten under bredbildsvideon", "bold": "Fet", "italic": "Kursiv", "renderResolution": "Renderingsupplösning", @@ -835,7 +862,8 @@ "pinProtectionOptional": "PIN-skydd (valfritt)", "pinExplain": "En fyrsiffrig PIN-kod krävs för att byta profil.", "continueButton": "Fortsätt", - "pinsDontMatch": "PIN-koderna stämmer inte överens" + "pinsDontMatch": "PIN-koderna stämmer inte överens", + "tokenIdentityMismatch": "Plex-profiltoken kopplades till en oväntad server" }, "connections": { "sectionTitle": "Anslutningar", @@ -872,7 +900,11 @@ "movie": "Film", "tvShow": "TV-serie", "minutesLeft": "${minutes} min kvar", - "moreLikeThis": "Mer liknande innehåll" + "moreLikeThis": "Mer liknande innehåll", + "titleCount": { + "one": "${n} titel", + "other": "${n} titlar" + } }, "errors": { "searchFailed": "Sökningen misslyckades: ${error}", @@ -1080,10 +1112,10 @@ "characters": "Karaktärer", "addToWatchlist": "Lägg till i bevakningslista", "removeFromWatchlist": "Ta bort från bevakningslista", - "addedToWatchlist": "", - "removedFromWatchlist": "", + "addedToWatchlist": "Tillagd i bevakningslistan", + "removedFromWatchlist": "Borttagen från bevakningslistan", "watchlistUpdateFailed": "Det gick inte att uppdatera bevakningslistan", - "watchlistNoMatch": "", + "watchlistNoMatch": "Det gick inte att matcha det här objektet mot en bevakningslista", "notInLibrary": "Finns inte i ditt bibliotek", "inTheseLibraries": "I dessa bibliotek", "checkingLibrary": "Kontrollerar ditt bibliotek...", @@ -1253,9 +1285,9 @@ "watchChannel": "Titta på kanal", "favorites": "Favoriter", "reorderFavorites": "Ordna om favoriter", - "noFavoriteChannels": "", - "noFavoriteChannelsHint": "", - "showAllChannels": "", + "noFavoriteChannels": "Inga favoritkanaler", + "noFavoriteChannelsHint": "Visa alla kanaler och tryck sedan länge på en kanal för att lägga till den som favorit.", + "showAllChannels": "Visa alla kanaler", "favoritesLoadFailed": "Det gick inte att läsa in favoriter. Kontrollera anslutningen och försök igen.", "favoritesUpdateFailed": "Det gick inte att uppdatera favoriterna. Kontrollera anslutningen och försök igen.", "joinSession": "Gå med i pågående session", @@ -1294,7 +1326,12 @@ "recordingRuleUpdated": "Inspelningsregel uppdaterad", "guideReloadRequested": "Uppdatering av programguiden har begärts", "rulesProcessRequested": "Ny regelutvärdering har begärts", - "recordShow": "Spela in program" + "recordShow": "Spela in program", + "startingInMinutes": "Börjar om ${minutes} min", + "dayAtTime": "${day} kl. ${time}", + "invalidPlaybackData": "${product} returnerade ogiltiga uppspelningsdata för Live-TV", + "failedToStartChannel": "Kunde inte starta livekanalen", + "failedToBuildStreamUrl": "Kunde inte skapa strömmens URL" }, "collections": { "title": "Samlingar", @@ -1371,7 +1408,9 @@ "nextTrack": "Nästa låt", "repeat": "Upprepa", "repeatAll": "Upprepa alla", - "repeatOne": "Upprepa en låt" + "repeatOne": "Upprepa en låt", + "instantMixNoServer": "Ingen server är tillgänglig för en snabbmix", + "noAudioUrl": "Ingen ljud-URL är tillgänglig för ${track}" }, "watchTogether": { "title": "Titta tillsammans", @@ -1438,7 +1477,8 @@ "renameRoom": "Byt namn på rummet", "removeRoom": "Ta bort", "guestSwitchUnavailable": "Kunde inte byta — server inte tillgänglig för synkronisering", - "guestSwitchFailed": "Kunde inte byta — innehåll hittades inte på denna server" + "guestSwitchFailed": "Kunde inte byta — innehåll hittades inte på denna server", + "defaultDisplayName": "Användare" }, "downloads": { "title": "Nedladdningar", @@ -1542,7 +1582,17 @@ "statusUnknown": "Inte kontrollerat än", "settingsUnavailable": "Det gick inte att öppna systeminställningarna på den här enheten", "linkUnavailable": "Det gick inte att öppna dontkillmyapp.com på den här enheten" - } + }, + "unknownShow": "Okänd serie", + "unknownSeason": "Okänd säsong", + "unknownAlbum": "Okänt album", + "completedOfTotal": "${completed}/${total} slutförda", + "errorFileNotFound": "Filen hittades inte (404)", + "errorDownloadFailed": "Nedladdningen misslyckades", + "errorPostProcessing": "Efterbehandlingen misslyckades: ${error}", + "notificationDownloading": "Laddar ned...", + "notificationComplete": "Nedladdningen är klar", + "notificationPaused": "Nedladdningen har pausats" }, "shaders": { "title": "Shaders", @@ -1633,7 +1683,8 @@ "failedToConnectAnyAddress": "Det gick inte att ansluta till någon adress", "connectionLostAfterAttempts": "Anslutningen bröts efter ${attempts} försök", "connectionLost": "Anslutningen bröts" - } + }, + "closedBeforeAuth": "Anslutningen stängdes före autentiseringen" }, "videoSettings": { "playbackSpeed": "Uppspelningshastighet", @@ -1644,13 +1695,13 @@ "audioSync": "Ljudsynkronisering", "subtitleSync": "Undertextsynkronisering", "hdr": "HDR", - "hdrUnsupported": "", - "hdrToneMapping": "", - "hdrToneMappingCompositor": "", - "hdrToneMappingCompositorDescription": "", - "hdrToneMappingPlayer": "", - "hdrToneMappingPlayerDescription": "", - "hdrToneMappingFailed": "", + "hdrUnsupported": "HDR kan inte användas här – skrivbordets kompositionshanterare eller videoutgången kan inte överföra det.", + "hdrToneMapping": "HDR-tonmappning", + "hdrToneMappingCompositor": "Kompositionshanterare", + "hdrToneMappingCompositorDescription": "Vidarebefordra källans HDR-metadata och låt skrivbordets kompositionshanterare tonmappa dem.", + "hdrToneMappingPlayer": "Spelare", + "hdrToneMappingPlayerDescription": "Tonmappa till skärmens maximala ljusstyrka i spelaren och informera sedan kompositionshanteraren om resultatet.", + "hdrToneMappingFailed": "Det gick inte att ändra HDR-tonmappningen – det föregående läget är fortfarande aktivt.", "audioOutput": "Ljudutgång", "performanceOverlay": "Prestandaöverlägg", "audioOutputDolbyAtmos": "Dolby Atmos", @@ -1696,7 +1747,17 @@ "speed": "Hastighet", "player": "Spelare", "memory": "Minne", - "uiFps": "UI FPS" + "uiFps": "UI FPS", + "fps": "FPS", + "decoderAndroidHw": "Android HW", + "decoderNvidiaHw": "NVIDIA HW", + "decoderQualcommHw": "Qualcomm HW", + "decoderMediatekHw": "MediaTek HW", + "decoderExynosHw": "Exynos HW", + "decoderSoftware": "Programvara", + "decoderHardware": "Maskinvara", + "tunnelingActive": "Aktiv", + "dvRpuFailed": "${converted} (${failures} misslyckades)" }, "externalPlayer": { "title": "Extern spelare", @@ -1854,7 +1915,17 @@ "statusAvailable": "Tillgänglig", "statusPartiallyAvailable": "Delvis tillgänglig", "statusRequested": "Begärd", - "statusProcessing": "Bearbetas" + "statusProcessing": "Bearbetas", + "couldNotReach": "Kunde inte nå ${url}: ${error}", + "noInstanceAtUrl": "Det finns ingen Seerr-instans på ${url} (HTTP ${status})", + "notInitialized": "Den här Seerr-instansen har inte slutfört den inledande konfigurationen", + "noPlexTokenForReauth": "Det finns ingen Plex-token tillgänglig för att logga in igen", + "noStoredCredentials": "Det finns inga sparade inloggningsuppgifter för att logga in igen", + "signInRejected": "Inloggningen avvisades", + "noSessionCookie": "Seerr skapade ingen sessionscookie", + "freshCookieRejected": "Seerr avvisade den nya sessionscookien", + "noUserInformation": "Seerr returnerade ingen användarinformation", + "sessionRejectedAfterReauth": "Sessionen avvisades efter den nya inloggningen" }, "services": { "title": "Tjänster", @@ -1875,7 +1946,7 @@ }, "deviceCode": { "title": "Aktivera Plezy på ${service}", - "instructions": "", + "instructions": "Skanna QR-koden eller gå till adressen nedan och ange den här koden:", "openToActivate": "Öppna ${service} för att aktivera", "copyCode": "Kopiera aktiveringskod", "waitingForAuthorization": "Väntar på auktorisering…", @@ -1933,6 +2004,24 @@ "connectToMediaBrowserCardSubtitle": "Ange din server-URL, användarnamn och lösenord.", "connectToMediaBrowserCardSubtitleScoped": "Logga in på din ${product}-server. Knyts till ${name}.", "borrowFromAnotherProfile": "Låna från en annan profil", - "borrowFromAnotherProfileSubtitle": "Återanvänd en annan profils anslutning. PIN-skyddade profiler kräver en PIN." + "borrowFromAnotherProfileSubtitle": "Återanvänd en annan profils anslutning. PIN-skyddade profiler kräver en PIN.", + "invalidCredentials": "Ogiltigt användarnamn eller lösenord", + "authResponseNotJson": "Autentiseringssvaret var inte ett giltigt JSON-svar", + "quickConnectRejected": "Quick Connect avvisades av servern", + "quickConnectNotJson": "Quick Connect-svaret var inte ett giltigt JSON-svar", + "quickConnectMissingFields": "Quick Connect-svaret saknar en kod eller hemlig nyckel", + "quickConnectPollRejected": "Servern avvisade avsökningen för Quick Connect", + "serverTimedOut": "Servern svarade inte i tid", + "responseNotJson": "Serversvaret var inte ett giltigt JSON-svar", + "responseMissingIdentity": "Svaret saknar ett ID eller servernamn – är det här en ${product}-server?", + "probeFailed": "Kunde inte nå servern: ${error}", + "enterAtLeastOneUrl": "Ange minst en server-URL för ${product}", + "noReachableServer": "Ingen nåbar ${product}-server hittades", + "urlsPointToDifferentServers": "De här URL:erna pekar på olika servrar för ${product}", + "urlDoesNotMatchServer": "Den här URL:en stämmer inte överens med ${product}-servern", + "redirectUnsupported": "Servern omdirigerade till en URL som inte stöds", + "redirectDifferentHost": "Servern omdirigerade till en annan värd. Ange den slutliga URL:en för ${product} direkt.", + "redirectInsecure": "Servern omdirigerade från HTTPS till en osäker URL", + "redirectUnsupportedEnterFinal": "Servern omdirigerade till en URL som inte stöds. Ange den slutliga URL:en för ${product} direkt." } } diff --git a/lib/i18n/tr.i18n.json b/lib/i18n/tr.i18n.json index 367ed2bd..acf2293d 100644 --- a/lib/i18n/tr.i18n.json +++ b/lib/i18n/tr.i18n.json @@ -17,7 +17,8 @@ "quickConnectWaiting": "Onay bekleniyor…", "quickConnectCancel": "İptal", "quickConnectExpired": "Hızlı Bağlantı süresi doldu. Tekrar deneyin.", - "localDataRecoveryRequired": "Plezy yerel giriş ve bekleyen oynatma verilerini güvenli bir şekilde kurtaramadı. Lütfen tekrar giriş yapın." + "localDataRecoveryRequired": "Plezy yerel giriş ve bekleyen oynatma verilerini güvenli bir şekilde kurtaramadı. Lütfen tekrar giriş yapın.", + "pinCheckRejected": "Plex PIN denetimi reddedildi" }, "common": { "cancel": "İptal", @@ -77,7 +78,10 @@ "trakt": "Trakt", "rottenTomatoesCritic": "Rotten Tomatoes eleştirmenleri", "rottenTomatoesAudience": "Rotten Tomatoes izleyicileri" - } + }, + "notAvailable": "N/A", + "url": "URL", + "letterKeys": "ABC" }, "screens": { "licenses": "Lisanslar", @@ -323,8 +327,8 @@ "showNavBarLabels": "Gezinme Çubuğu Etiketlerini Göster", "showNavBarLabelsDescription": "Gezinme çubuğu simgelerinin altında metin etiketlerini göster", "startupSection": "Başlangıç Bölümü", - "showExploreTab": "", - "showExploreTabDescription": "", + "showExploreTab": "Keşfet sekmesini göster", + "showExploreTabDescription": "Plex Keşfet ve bağlı takip hizmetlerinden gelen içeriklerle Keşfet sekmesini göster", "liveTvDefaultFavorites": "Canlı TV'de Favorileri Varsayılan Yap", "liveTvDefaultFavoritesDescription": "Canlı TV açıldığında yalnızca favori kanalları göster", "display": "Ekran", @@ -335,7 +339,8 @@ "player": "Oynatıcı", "subtitlesAndConfig": "Altyazılar ve Yapılandırma", "seekAndTiming": "Sarılma ve Zamanlama", - "behavior": "Davranış" + "behavior": "Davranış", + "exportDialogTitle": "Plezy ayarlarını dışa aktar" }, "search": { "hint": "Film, dizi, müzik ara...", @@ -491,7 +496,9 @@ "flagExternal": "Harici", "flagHearingImpaired": "İşitme Engelliler İçin", "flagDub": "Dublaj", - "flagOriginal": "Orijinal" + "flagOriginal": "Orijinal", + "channelsMono": "Mono", + "dolbyVisionProfile": "Profil ${profile}" }, "mediaMenu": { "markAsWatched": "İzlendi Olarak İşaretle", @@ -568,7 +575,12 @@ "alphabetNavigation": "Alfabe gezinmesi", "alphabetScrollHint": "Harfe göre gitmek için yukarı veya aşağı kaydırın", "rowColumnPosition": "Satır ${row} / ${rowCount}, sütun ${column} / ${columnCount}", - "rowPosition": "Satır ${row} / ${rowCount}" + "rowPosition": "Satır ${row} / ${rowCount}", + "autoScrollPlay": "Otomatik kaydırmayı başlat", + "autoScrollPause": "Otomatik kaydırmayı duraklat", + "hueShort": "H", + "saturationShort": "S", + "valueShort": "V" }, "tooltips": { "shufflePlay": "Karışık oynat", @@ -666,7 +678,16 @@ "subtitleDownloaded": "Altyazı indirildi", "subtitleDownloadedNotApplied": "Altyazı indirildi ancak seçilemedi", "subtitleDownloadFailed": "Altyazı indirilemedi", - "searchLanguages": "Dillerde ara..." + "searchLanguages": "Dillerde ara...", + "skipIntro": "İntroyu atla", + "skipCredits": "Jeneriği atla", + "nextEpisode": "Sonraki bölüm", + "subtitleTrack": "Parça ${n}", + "subtitleFile": "Altyazı ${name}", + "forcedTrack": "${label} (Zorunlu)", + "osdSubtitlesOff": "Altyazı: Kapalı", + "osdSubtitles": "Altyazı: ${track}", + "osdAudio": "Ses: ${track}" }, "userStatus": {}, "messages": { @@ -722,12 +743,18 @@ "serverLimitBody": "Sunucu hatası (HTTP 500). Muhtemelen bir bant genişliği/kod dönüştürme sınırı bu oturumu reddetti. Sunucu sahibinden bunu ayarlamasını isteyin.", "mediaUnreadableTitle": "Dosya kullanılamıyor", "mediaUnreadableBody": "Sunucu bu ögeyi buldu ancak dosyasını okuyamadı (HTTP 404). Dosya büyük olasılıkla taşındı, silindi veya depolama alanı çevrimdışı. Sunucu sahibinden dosyayı kontrol edip kitaplığı yeniden taramasını isteyin.", - "serverBusyTitle": "", - "serverBusyBody": "", + "serverBusyTitle": "Akış kullanılamıyor", + "serverBusyBody": "Sunucu bu dosyayı yayınlamayı sürekli reddetti (HTTP 503). Sunucu yeniden başlatılıyor veya meşgul olabilir ya da dosyanın bulunduğu depolama birimi çevrim dışı olabilir. Kısa süre sonra tekrar deneyin — sorun devam ederse sunucu sahibinden sunucuyu ve dosyanın bulunduğu depolama birimini kontrol etmesini isteyin.", "logsUploaded": "Günlükler yüklendi", "logsUploadFailed": "Günlükler yüklenemedi", "logId": "Günlük Kimliği (ID)", - "burnedSubtitlesUseMenu": "" + "burnedSubtitlesUseMenu": "Altyazılar bu akışın görüntüsüne gömülü. Bunları altyazı menüsünden değiştirin.", + "noVideoUrl": "Kullanılabilir video URL'si yok", + "playbackNoMediaSources": "Sunucu oynatılabilir medya kaynağı döndürmedi", + "playbackDataNotPrepared": "Oynatma, veriler hazır olmadan başlatıldı", + "streamSelectionUnavailable": "Akış seçimi bu kaynak için kullanılamıyor", + "streamSelectionFailed": "Seçilen akışlar uygulanamadı", + "serverUnavailableForProfile": "Etkin profil için kullanılabilir sunucu yok" }, "subtitlingStyling": { "text": "Metin", @@ -746,8 +773,8 @@ "overrideStrip": "Biçimlendirmeyi kaldır", "positionTop": "Üst", "positionBottom": "Alt", - "anchorToScreen": "", - "anchorToScreenDescription": "", + "anchorToScreen": "Ekrana sabitle", + "anchorToScreenDescription": "Metin altyazılarını geniş ekran videonun altındaki siyah çubuklarda göster", "bold": "Kalın", "italic": "İtalik", "renderResolution": "İşleme Çözünürlüğü", @@ -835,7 +862,8 @@ "pinProtectionOptional": "PIN koruması (isteğe bağlı)", "pinExplain": "Profiller arasında geçiş yapmak için 4 haneli PIN gereklidir.", "continueButton": "Devam Et", - "pinsDontMatch": "PIN'ler eşleşmiyor" + "pinsDontMatch": "PIN'ler eşleşmiyor", + "tokenIdentityMismatch": "Plex profil belirtecinin beklenmeyen bir sunucuya ait olduğu belirlendi" }, "connections": { "sectionTitle": "Bağlantılar", @@ -872,7 +900,11 @@ "movie": "Film", "tvShow": "TV Dizisi", "minutesLeft": "${minutes} dk kaldı", - "moreLikeThis": "Buna Benzerler" + "moreLikeThis": "Buna Benzerler", + "titleCount": { + "one": "${n} başlık", + "other": "${n} başlık" + } }, "errors": { "searchFailed": "Arama başarısız: ${error}", @@ -1080,10 +1112,10 @@ "characters": "Karakterler", "addToWatchlist": "İzleme Listesine Ekle", "removeFromWatchlist": "İzleme Listesinden Kaldır", - "addedToWatchlist": "", - "removedFromWatchlist": "", + "addedToWatchlist": "İzleme listesine eklendi", + "removedFromWatchlist": "İzleme listesinden kaldırıldı", "watchlistUpdateFailed": "İzleme listesi güncellenemedi", - "watchlistNoMatch": "", + "watchlistNoMatch": "Bu öğe bir izleme listesiyle eşleştirilemedi", "notInLibrary": "Kitaplığınızda yok", "inTheseLibraries": "Bu kitaplıklarda var", "checkingLibrary": "Kitaplığınız kontrol ediliyor...", @@ -1253,9 +1285,9 @@ "watchChannel": "Kanalı İzle", "favorites": "Favoriler", "reorderFavorites": "Favorileri Yeniden Sırala", - "noFavoriteChannels": "", - "noFavoriteChannelsHint": "", - "showAllChannels": "", + "noFavoriteChannels": "Favori kanal yok", + "noFavoriteChannelsHint": "Tüm kanalları gösterin, ardından favorilerinize eklemek için bir kanalı basılı tutun.", + "showAllChannels": "Tüm kanalları göster", "favoritesLoadFailed": "Favoriler yüklenemedi. Bağlantınızı kontrol edip tekrar deneyin.", "favoritesUpdateFailed": "Favoriler güncellenemedi. Bağlantınızı kontrol edip tekrar deneyin.", "joinSession": "Devam Eden Oturuma Katıl", @@ -1294,7 +1326,12 @@ "recordingRuleUpdated": "Kayıt kuralı güncellendi", "guideReloadRequested": "Rehber yenilemesi istendi", "rulesProcessRequested": "Kuralın yeniden değerlendirilmesi istendi", - "recordShow": "Programı kaydet" + "recordShow": "Programı kaydet", + "startingInMinutes": "${minutes} dk içinde başlıyor", + "dayAtTime": "${day} saat ${time}", + "invalidPlaybackData": "${product} geçersiz Canlı TV oynatma verileri döndürdü", + "failedToStartChannel": "Canlı kanal başlatılamadı", + "failedToBuildStreamUrl": "Akış URL'si oluşturulamadı" }, "collections": { "title": "Koleksiyonlar", @@ -1371,7 +1408,9 @@ "nextTrack": "Sonraki parça", "repeat": "Tekrarla", "repeatAll": "Tümünü tekrarla", - "repeatOne": "Tekini tekrarla" + "repeatOne": "Tekini tekrarla", + "instantMixNoServer": "Anında miks için kullanılabilir sunucu yok", + "noAudioUrl": "${track} için kullanılabilir ses URL'si yok" }, "watchTogether": { "title": "Birlikte İzle", @@ -1438,7 +1477,8 @@ "renameRoom": "Odayı Yeniden Adlandır", "removeRoom": "Kaldır", "guestSwitchUnavailable": "Geçiş yapılamadı — eşitleme için sunucu mevcut değil", - "guestSwitchFailed": "Geçiş yapılamadı — içerik bu sunucuda bulunamadı" + "guestSwitchFailed": "Geçiş yapılamadı — içerik bu sunucuda bulunamadı", + "defaultDisplayName": "Kullanıcı" }, "downloads": { "title": "İndirmeler", @@ -1542,7 +1582,17 @@ "statusUnknown": "Henüz kontrol edilmedi", "settingsUnavailable": "Bu cihazda sistem ayarları açılamadı", "linkUnavailable": "Bu cihazda dontkillmyapp.com açılamadı" - } + }, + "unknownShow": "Bilinmeyen Dizi", + "unknownSeason": "Bilinmeyen Sezon", + "unknownAlbum": "Bilinmeyen Albüm", + "completedOfTotal": "${completed}/${total} tamamlandı", + "errorFileNotFound": "Dosya bulunamadı (404)", + "errorDownloadFailed": "İndirme başarısız oldu", + "errorPostProcessing": "Son işleme başarısız oldu: ${error}", + "notificationDownloading": "İndiriliyor...", + "notificationComplete": "İndirme tamamlandı", + "notificationPaused": "İndirme duraklatıldı" }, "shaders": { "title": "Gölgelendiriciler", @@ -1633,7 +1683,8 @@ "failedToConnectAnyAddress": "Hiçbir adrese bağlanılamadı", "connectionLostAfterAttempts": "${attempts} denemeden sonra bağlantı kesildi", "connectionLost": "Bağlantı kesildi" - } + }, + "closedBeforeAuth": "Bağlantı, kimlik doğrulamadan önce kapandı" }, "videoSettings": { "playbackSpeed": "Oynatma Hızı", @@ -1644,13 +1695,13 @@ "audioSync": "Ses Senkronizasyonu", "subtitleSync": "Altyazı Senkronizasyonu", "hdr": "HDR", - "hdrUnsupported": "", - "hdrToneMapping": "", - "hdrToneMappingCompositor": "", - "hdrToneMappingCompositorDescription": "", - "hdrToneMappingPlayer": "", - "hdrToneMappingPlayerDescription": "", - "hdrToneMappingFailed": "", + "hdrUnsupported": "HDR burada kullanılamıyor — bu masaüstü birleştiricisi veya video çıkışı HDR'yi taşıyamıyor.", + "hdrToneMapping": "HDR ton eşleme", + "hdrToneMappingCompositor": "Birleştirici", + "hdrToneMappingCompositorDescription": "Kaynağın HDR meta verilerini olduğu gibi iletip eşlemeyi masaüstü birleştiricisine bırakın.", + "hdrToneMappingPlayer": "Oynatıcı", + "hdrToneMappingPlayerDescription": "Oynatıcıda ekranın en yüksek parlaklığına göre eşleyin, ardından sonucu birleştiriciye bildirin.", + "hdrToneMappingFailed": "HDR ton eşleme değiştirilemedi — önceki mod hâlâ etkin.", "audioOutput": "Ses Çıkışı", "performanceOverlay": "Performans Katmanı", "audioOutputDolbyAtmos": "Dolby Atmos", @@ -1696,7 +1747,17 @@ "speed": "Hız", "player": "Oynatıcı", "memory": "Bellek", - "uiFps": "Arayüz (UI) FPS" + "uiFps": "Arayüz (UI) FPS", + "fps": "FPS", + "decoderAndroidHw": "Android Donanım", + "decoderNvidiaHw": "NVIDIA Donanım", + "decoderQualcommHw": "Qualcomm Donanım", + "decoderMediatekHw": "MediaTek Donanım", + "decoderExynosHw": "Exynos Donanım", + "decoderSoftware": "Yazılım", + "decoderHardware": "Donanım", + "tunnelingActive": "Etkin", + "dvRpuFailed": "${converted} (${failures} başarısız)" }, "externalPlayer": { "title": "Harici Oynatıcı", @@ -1854,7 +1915,17 @@ "statusAvailable": "Mevcut", "statusPartiallyAvailable": "Kısmen mevcut", "statusRequested": "İstendi", - "statusProcessing": "İşleniyor" + "statusProcessing": "İşleniyor", + "couldNotReach": "${url} adresine ulaşılamadı: ${error}", + "noInstanceAtUrl": "${url} adresinde Seerr örneği bulunamadı (HTTP ${status})", + "notInitialized": "Bu Seerr örneği ilk çalıştırma kurulumunu tamamlamadı", + "noPlexTokenForReauth": "Yeniden giriş yapmak için kullanılabilir Plex belirteci yok", + "noStoredCredentials": "Yeniden giriş yapmak için kullanılabilir kayıtlı kimlik bilgisi yok", + "signInRejected": "Giriş reddedildi", + "noSessionCookie": "Seerr bir oturum çerezi oluşturmadı", + "freshCookieRejected": "Seerr yeni oturum çerezini reddetti", + "noUserInformation": "Seerr kullanıcı bilgilerini döndürmedi", + "sessionRejectedAfterReauth": "Yeniden giriş yapıldıktan sonra oturum reddedildi" }, "services": { "title": "Servisler", @@ -1875,7 +1946,7 @@ }, "deviceCode": { "title": "Plezy'yi ${service} üzerinde etkinleştirin", - "instructions": "", + "instructions": "QR kodunu tarayın veya aşağıdaki adresi ziyaret edip bu kodu girin:", "openToActivate": "Etkinleştirmek için ${service} servisini açın", "copyCode": "Etkinleştirme kodunu kopyala", "waitingForAuthorization": "Yetkilendirme bekleniyor…", @@ -1933,6 +2004,24 @@ "connectToMediaBrowserCardSubtitle": "Sunucu URL'nizi, kullanıcı adınızı ve şifrenizi girin.", "connectToMediaBrowserCardSubtitleScoped": "${product} sunucunuza giriş yapın. ${name} profiline bağlanır.", "borrowFromAnotherProfile": "Başka bir profilden ödünç al", - "borrowFromAnotherProfileSubtitle": "Başka bir profilin bağlantısını yeniden kullanın. PIN korumalı profiller bir PIN gerektirir." + "borrowFromAnotherProfileSubtitle": "Başka bir profilin bağlantısını yeniden kullanın. PIN korumalı profiller bir PIN gerektirir.", + "invalidCredentials": "Geçersiz kullanıcı adı veya şifre", + "authResponseNotJson": "Kimlik doğrulama yanıtı geçerli bir JSON değildi", + "quickConnectRejected": "Quick Connect sunucu tarafından reddedildi", + "quickConnectNotJson": "Quick Connect yanıtı geçerli bir JSON değildi", + "quickConnectMissingFields": "Quick Connect yanıtında kod veya gizli anahtar eksik", + "quickConnectPollRejected": "Quick Connect yoklaması sunucu tarafından reddedildi", + "serverTimedOut": "Sunucu zamanında yanıt vermedi", + "responseNotJson": "Sunucu yanıtı geçerli bir JSON değildi", + "responseMissingIdentity": "Yanıtta kimlik veya sunucu adı eksik — bu bir ${product} sunucusu mu?", + "probeFailed": "Sunucuya ulaşılamadı: ${error}", + "enterAtLeastOneUrl": "En az bir ${product} sunucu URL'si girin", + "noReachableServer": "Ulaşılabilir ${product} sunucusu bulunamadı", + "urlsPointToDifferentServers": "Bu URL'ler farklı ${product} sunucularını gösteriyor", + "urlDoesNotMatchServer": "Bu URL, ${product} sunucusuyla eşleşmiyor", + "redirectUnsupported": "Sunucu desteklenmeyen bir URL'ye yönlendirdi", + "redirectDifferentHost": "Sunucu farklı bir ana makineye yönlendirdi. Nihai ${product} URL'sini doğrudan girin.", + "redirectInsecure": "Sunucu HTTPS'den güvenli olmayan bir URL'ye yönlendirdi", + "redirectUnsupportedEnterFinal": "Sunucu desteklenmeyen bir URL'ye yönlendirdi. Nihai ${product} URL'sini doğrudan girin." } } diff --git a/lib/i18n/uz.i18n.json b/lib/i18n/uz.i18n.json index c28a2006..5d43ec58 100644 --- a/lib/i18n/uz.i18n.json +++ b/lib/i18n/uz.i18n.json @@ -17,7 +17,8 @@ "quickConnectWaiting": "Tasdiq kutilmoqda…", "quickConnectCancel": "Bekor qilish", "quickConnectExpired": "Tezkor ulanish vaqti tugadi. Qaytadan urinib koʻring.", - "localDataRecoveryRequired": "Plezy mahalliy kirish maʼlumotlarini tiklay olmadi. Iltimos, qaytadan kiring." + "localDataRecoveryRequired": "Plezy mahalliy kirish maʼlumotlarini tiklay olmadi. Iltimos, qaytadan kiring.", + "pinCheckRejected": "Plex PIN tekshiruvi rad etildi" }, "common": { "cancel": "Bekor qilish", @@ -77,7 +78,10 @@ "trakt": "Trakt", "rottenTomatoesCritic": "Rotten Tomatoes tanqidchilari", "rottenTomatoesAudience": "Rotten Tomatoes tomoshabinlari" - } + }, + "notAvailable": "N/A", + "url": "URL", + "letterKeys": "ABC" }, "screens": { "licenses": "Litsenziyalar", @@ -323,8 +327,8 @@ "showNavBarLabels": "Navigatsiya paneli matnlarini koʻrsatish", "showNavBarLabelsDescription": "Navigatsiya belgilarining ostida matnni koʻrsatish", "startupSection": "Boshlangʻich boʻlim", - "showExploreTab": "", - "showExploreTabDescription": "", + "showExploreTab": "Kashf qilish varagʻini koʻrsatish", + "showExploreTabDescription": "Plex Discover va ulangan kuzatuvchilardagi kontent bilan Kashf qilish varagʻini koʻrsatish", "liveTvDefaultFavorites": "Jonli TV-da tanlangan kanallarni standart qilish", "liveTvDefaultFavoritesDescription": "Jonli TV ochilganda faqat tanlangan kanallarni koʻrsatish", "display": "Displey", @@ -335,7 +339,8 @@ "player": "Pleyer", "subtitlesAndConfig": "Subtitrlar va konfiguratsiya", "seekAndTiming": "Oʻtkazish va vaqt sozlamalari", - "behavior": "Xatti-harakat" + "behavior": "Xatti-harakat", + "exportDialogTitle": "Plezy sozlamalarini eksport qilish" }, "search": { "hint": "Filmlar, seriallar, musiqa qidirish...", @@ -491,7 +496,9 @@ "flagExternal": "Tashqi", "flagHearingImpaired": "Eshitishida nuqsoni borlar uchun", "flagDub": "Dublyaj", - "flagOriginal": "Asl" + "flagOriginal": "Asl", + "channelsMono": "Mono", + "dolbyVisionProfile": "Profil ${profile}" }, "mediaMenu": { "markAsWatched": "Koʻrilgan deb belgilash", @@ -568,7 +575,12 @@ "alphabetNavigation": "Alifboli navigatsiya", "alphabetScrollHint": "Harflar boʻyicha oʻtish uchun yuqoriga yoki pastga suring", "rowColumnPosition": "Qator ${row} / ${rowCount}, ustun ${column} / ${columnCount}", - "rowPosition": "Qator ${row} / ${rowCount}" + "rowPosition": "Qator ${row} / ${rowCount}", + "autoScrollPlay": "Avtomatik aylantirishni boshlash", + "autoScrollPause": "Avtomatik aylantirishni pauza qilish", + "hueShort": "H", + "saturationShort": "S", + "valueShort": "V" }, "tooltips": { "shufflePlay": "Aralashtirib ijro etish", @@ -666,7 +678,16 @@ "subtitleDownloaded": "Subtitr yuklab olindi", "subtitleDownloadedNotApplied": "Subtitr yuklab olindi, lekin qoʻllanilmadi", "subtitleDownloadFailed": "Subtitrni yuklab boʻlmadi", - "searchLanguages": "Tillardan qidirish..." + "searchLanguages": "Tillardan qidirish...", + "skipIntro": "Kirishni oʻtkazish", + "skipCredits": "Titrlardan oʻtish", + "nextEpisode": "Keyingi qism", + "subtitleTrack": "Yoʻlak ${n}", + "subtitleFile": "Subtitr ${name}", + "forcedTrack": "${label} (Majburiy)", + "osdSubtitlesOff": "Subtitr: Oʻchirilgan", + "osdSubtitles": "Subtitr: ${track}", + "osdAudio": "Ovoz: ${track}" }, "userStatus": {}, "messages": { @@ -722,12 +743,18 @@ "serverLimitBody": "Server xatoligi (HTTP 500). Cheklov ushbu seansni rad etdi.", "mediaUnreadableTitle": "Fayl mavjud emas", "mediaUnreadableBody": "Server bu elementni topdi, lekin uning faylini oʻqiy olmadi (HTTP 404). Fayl koʻchirilgan, oʻchirilgan yoki uning saqlash joyi oflayn boʻlishi mumkin. Server egasidan faylni tekshirishni va kutubxonani qayta skanerlashni soʻrang.", - "serverBusyTitle": "", - "serverBusyBody": "", + "serverBusyTitle": "Oqim mavjud emas", + "serverBusyBody": "Server bu faylni uzatishni qayta-qayta rad etdi (HTTP 503). U qayta ishga tushayotgan yoki band boʻlishi, yoxud fayl saqlanadigan xotira oflayn boʻlishi mumkin. Birozdan keyin qaytadan urinib koʻring. Muammo davom etsa, server egasidan server va fayl xotirasini tekshirishni soʻrang.", "logsUploaded": "Jurnallar yuklandi", "logsUploadFailed": "Jurnallarni yuklab boʻlmadi", "logId": "Jurnal ID-si", - "burnedSubtitlesUseMenu": "" + "burnedSubtitlesUseMenu": "Subtitrlar bu oqim tasviriga singdirilgan. Ularni subtitr menyusidan oʻzgartiring.", + "noVideoUrl": "Video URL mavjud emas", + "playbackNoMediaSources": "Server ijro etiladigan media manbalarini qaytarmadi", + "playbackDataNotPrepared": "Ijro maʼlumotlari tayyor boʻlishidan oldin boshlandi", + "streamSelectionUnavailable": "Bu manba uchun oqim tanlash imkoni yoʻq", + "streamSelectionFailed": "Tanlangan oqimlarni qoʻllab boʻlmadi", + "serverUnavailableForProfile": "Faol profil uchun hech qanday server mavjud emas" }, "subtitlingStyling": { "text": "Matn", @@ -746,8 +773,8 @@ "overrideStrip": "Formatlashni olib tashlash", "positionTop": "Yuqori", "positionBottom": "Pastki", - "anchorToScreen": "", - "anchorToScreenDescription": "", + "anchorToScreen": "Ekranga mahkamlash", + "anchorToScreenDescription": "Matnli subtitrlarni keng ekranli video ostidagi qora hoshiyalarda koʻrsatish", "bold": "Qalin", "italic": "Qiya", "renderResolution": "Renderlash oʻlchamlari", @@ -835,7 +862,8 @@ "pinProtectionOptional": "PIN himoyasi (ixtiyoriy)", "pinExplain": "Profillar orasida oʻtish uchun 4 xonali PIN kod talab qilinadi.", "continueButton": "Davom ettirish", - "pinsDontMatch": "PIN kodlar mos kelmadi" + "pinsDontMatch": "PIN kodlar mos kelmadi", + "tokenIdentityMismatch": "Plex profil tokeni kutilmagan serverga tegishli boʻlib chiqdi" }, "connections": { "sectionTitle": "Ulanishlar", @@ -872,7 +900,11 @@ "movie": "Film", "tvShow": "TV Shou", "minutesLeft": "${minutes} daq qoldi", - "moreLikeThis": "Oʻxshashlar" + "moreLikeThis": "Oʻxshashlar", + "titleCount": { + "one": "${n} ta nom", + "other": "${n} ta nom" + } }, "errors": { "searchFailed": "Qidiruv xatoligi: ${error}", @@ -1080,10 +1112,10 @@ "characters": "Qahramonlar", "addToWatchlist": "Tomosha roʻyxatiga qoʻshish", "removeFromWatchlist": "Tomosha roʻyxatidan oʻchirish", - "addedToWatchlist": "", - "removedFromWatchlist": "", + "addedToWatchlist": "Tomosha roʻyxatiga qoʻshildi", + "removedFromWatchlist": "Tomosha roʻyxatidan olib tashlandi", "watchlistUpdateFailed": "Tomosha roʻyxatini yangilab boʻlmadi", - "watchlistNoMatch": "", + "watchlistNoMatch": "Bu elementni tomosha roʻyxatiga moslab boʻlmadi", "notInLibrary": "Kutubxonangizda yoʻq", "inTheseLibraries": "Ushbu kutubxonalarda bor", "checkingLibrary": "Kutubxona tekshirilmoqda...", @@ -1253,9 +1285,9 @@ "watchChannel": "Kanalni tomosha qilish", "favorites": "Tanlanganlar", "reorderFavorites": "Tanlanganlarni tartiblash", - "noFavoriteChannels": "", - "noFavoriteChannelsHint": "", - "showAllChannels": "", + "noFavoriteChannels": "Sevimli kanallar yoʻq", + "noFavoriteChannelsHint": "Barcha kanallarni koʻrsating, soʻng kanalni sevimlilarga qoʻshish uchun uni bosib turing.", + "showAllChannels": "Barcha kanallarni koʻrsatish", "favoritesLoadFailed": "Tanlanganlarni yuklab boʻlmadi.", "favoritesUpdateFailed": "Tanlanganlarni yangilab boʻlmadi.", "joinSession": "Seansga qoʻshilish", @@ -1294,7 +1326,12 @@ "recordingRuleUpdated": "Yozib olish qoidasi yangilandi", "guideReloadRequested": "Jadvalni yangilash soʻraldi", "rulesProcessRequested": "Qoidalarni qayta baholash soʻraldi", - "recordShow": "Shouni yozib olish" + "recordShow": "Shouni yozib olish", + "startingInMinutes": "${minutes} daqiqadan keyin boshlanadi", + "dayAtTime": "${day}, soat ${time} da", + "invalidPlaybackData": "${product} Jonli TV ijrosi uchun notoʻgʻri maʼlumot qaytardi", + "failedToStartChannel": "Jonli kanalni boshlab boʻlmadi", + "failedToBuildStreamUrl": "Oqim URL-ini tuzib boʻlmadi" }, "collections": { "title": "Toʻplamlar", @@ -1371,7 +1408,9 @@ "nextTrack": "Keyingi tarona", "repeat": "Takrorlash", "repeatAll": "Barchasini takrorlash", - "repeatOne": "Birtasini takrorlash" + "repeatOne": "Birtasini takrorlash", + "instantMixNoServer": "Tezkor miks uchun hech qanday server mavjud emas", + "noAudioUrl": "${track} uchun audio URL mavjud emas" }, "watchTogether": { "title": "Birgalikda tomosha qilish", @@ -1438,7 +1477,8 @@ "renameRoom": "Xona nomini oʻzgartirmoqchimisiz?", "removeRoom": "Oʻchirish", "guestSwitchUnavailable": "Oʻtib boʻlmadi", - "guestSwitchFailed": "Oʻtib boʻlmadi — kontent topilmadi" + "guestSwitchFailed": "Oʻtib boʻlmadi — kontent topilmadi", + "defaultDisplayName": "Foydalanuvchi" }, "downloads": { "title": "Yuklamalar", @@ -1542,7 +1582,17 @@ "statusUnknown": "Hali tekshirilmagan", "settingsUnavailable": "Bu qurilmada tizim sozlamalarini ochib boʻlmadi", "linkUnavailable": "Bu qurilmada dontkillmyapp.com-ni ochib boʻlmadi" - } + }, + "unknownShow": "Nomaʼlum serial", + "unknownSeason": "Nomaʼlum mavsum", + "unknownAlbum": "Nomaʼlum albom", + "completedOfTotal": "${completed}/${total} ta yakunlandi", + "errorFileNotFound": "Fayl topilmadi (404)", + "errorDownloadFailed": "Yuklab boʻlmadi", + "errorPostProcessing": "Keyingi ishlov berishda xatolik: ${error}", + "notificationDownloading": "Yuklanmoqda...", + "notificationComplete": "Yuklash tugallandi", + "notificationPaused": "Yuklash toʻxtatib turildi" }, "shaders": { "title": "Sheyderlar", @@ -1633,7 +1683,8 @@ "failedToConnectAnyAddress": "Hech bir manzilga ulanib boʻlmadi", "connectionLostAfterAttempts": "${attempts} urinishdan keyin aloqa uzildi", "connectionLost": "Aloqa uzildi" - } + }, + "closedBeforeAuth": "Ulanish autentifikatsiyadan oldin yopildi" }, "videoSettings": { "playbackSpeed": "Ijro tezligi", @@ -1644,13 +1695,13 @@ "audioSync": "Audio sinxronlash", "subtitleSync": "Subtitr sinxronlash", "hdr": "HDR", - "hdrUnsupported": "", - "hdrToneMapping": "", - "hdrToneMappingCompositor": "", - "hdrToneMappingCompositorDescription": "", - "hdrToneMappingPlayer": "", - "hdrToneMappingPlayerDescription": "", - "hdrToneMappingFailed": "", + "hdrUnsupported": "Bu yerda HDR mavjud emas — ish stoli kompozitori yoki video chiqishi uni uzata olmaydi.", + "hdrToneMapping": "HDR tonlarini moslashtirish", + "hdrToneMappingCompositor": "Kompozitor", + "hdrToneMappingCompositorDescription": "Manbaning HDR metamaʼlumotlarini oʻzgarishsiz uzatib, ularni moslashtirishni ish stoli kompozitoriga topshirish.", + "hdrToneMappingPlayer": "Pleyer", + "hdrToneMappingPlayerDescription": "Pleyerda displeyning eng yuqori yorqinligiga moslashtirib, soʻng natijani kompozitorga bildirish.", + "hdrToneMappingFailed": "HDR tonlarini moslashtirishni oʻzgartirib boʻlmadi — avvalgi rejim hali ham faol.", "audioOutput": "Audio chiqishi", "performanceOverlay": "Unumdorlik paneli", "audioOutputDolbyAtmos": "Dolby Atmos", @@ -1696,7 +1747,17 @@ "speed": "Tezlik", "player": "Pleyer", "memory": "Xotira", - "uiFps": "Interfeys (UI) FPS" + "uiFps": "Interfeys (UI) FPS", + "fps": "FPS", + "decoderAndroidHw": "Android HW", + "decoderNvidiaHw": "NVIDIA HW", + "decoderQualcommHw": "Qualcomm HW", + "decoderMediatekHw": "MediaTek HW", + "decoderExynosHw": "Exynos HW", + "decoderSoftware": "Dasturiy", + "decoderHardware": "Apparat", + "tunnelingActive": "Faol", + "dvRpuFailed": "${converted} (${failures} ta muvaffaqiyatsiz)" }, "externalPlayer": { "title": "Tashqi pleyer", @@ -1854,7 +1915,17 @@ "statusAvailable": "Mavjud", "statusPartiallyAvailable": "Qisman mavjud", "statusRequested": "Soʻraldi", - "statusProcessing": "Ishlanmoqda" + "statusProcessing": "Ishlanmoqda", + "couldNotReach": "${url} manziliga ulanib boʻlmadi: ${error}", + "noInstanceAtUrl": "${url} manzilida Seerr nusxasi yoʻq (HTTP ${status})", + "notInitialized": "Bu Seerr nusxasining dastlabki sozlamasi yakunlanmagan", + "noPlexTokenForReauth": "Qayta kirish uchun Plex tokeni mavjud emas", + "noStoredCredentials": "Qayta kirish uchun saqlangan kirish maʼlumotlari mavjud emas", + "signInRejected": "Kirish rad etildi", + "noSessionCookie": "Seerr seans cookie-faylini bermadi", + "freshCookieRejected": "Seerr yangi seans cookie-faylini rad etdi", + "noUserInformation": "Seerr foydalanuvchi maʼlumotlarini qaytarmadi", + "sessionRejectedAfterReauth": "Qayta kirilgandan keyin seans rad etildi" }, "services": { "title": "Xizmatlar", @@ -1875,7 +1946,7 @@ }, "deviceCode": { "title": "Plezy-ni ${service} xizmatida faollashtiring", - "instructions": "", + "instructions": "QR-kodni skanerlang yoki quyidagi manzilga oʻtib, bu kodni kiriting:", "openToActivate": "Faollashtirish uchun ${service} xizmatini oching", "copyCode": "Faollashtirish kodini nusxalash", "waitingForAuthorization": "Avtorizatsiya kutilmoqda…", @@ -1933,6 +2004,24 @@ "connectToMediaBrowserCardSubtitle": "Server URL-ini, foydalanuvchi nomini va parolni kiriting.", "connectToMediaBrowserCardSubtitleScoped": "${product} serveringizga kiring. ${name} profiliga bogʻlanadi.", "borrowFromAnotherProfile": "Boshqa profildan olish", - "borrowFromAnotherProfileSubtitle": "Boshqa profilning ulanishidan qayta foydalaning." + "borrowFromAnotherProfileSubtitle": "Boshqa profilning ulanishidan qayta foydalaning.", + "invalidCredentials": "Foydalanuvchi nomi yoki parol notoʻgʻri", + "authResponseNotJson": "Autentifikatsiya javobi yaroqli JSON emas", + "quickConnectRejected": "Quick Connect server tomonidan rad etildi", + "quickConnectNotJson": "Quick Connect javobi yaroqli JSON emas", + "quickConnectMissingFields": "Quick Connect javobida kod yoki maxfiy kalit yoʻq", + "quickConnectPollRejected": "Quick Connect soʻrovi server tomonidan rad etildi", + "serverTimedOut": "Server oʻz vaqtida javob bermadi", + "responseNotJson": "Server javobi yaroqli JSON emas", + "responseMissingIdentity": "Javobda ID yoki server nomi yoʻq — bu ${product} serverimi?", + "probeFailed": "Serverga ulanib boʻlmadi: ${error}", + "enterAtLeastOneUrl": "Kamida bitta ${product} server URL-ini kiriting", + "noReachableServer": "Ulanish mumkin boʻlgan ${product} serveri topilmadi", + "urlsPointToDifferentServers": "Bu URL-lar turli ${product} serverlariga olib boradi", + "urlDoesNotMatchServer": "Bu URL ${product} serveriga mos kelmaydi", + "redirectUnsupported": "Server qoʻllab-quvvatlanmaydigan URL-ga yoʻnaltirdi", + "redirectDifferentHost": "Server boshqa xostga yoʻnaltirdi. Yakuniy ${product} URL-ini bevosita kiriting.", + "redirectInsecure": "Server HTTPS manzilidan xavfsiz boʻlmagan URL-ga yoʻnaltirdi", + "redirectUnsupportedEnterFinal": "Server qoʻllab-quvvatlanmaydigan URL-ga yoʻnaltirdi. Yakuniy ${product} URL-ini bevosita kiriting." } } diff --git a/lib/i18n/zh-Hant.i18n.json b/lib/i18n/zh-Hant.i18n.json index fc606f4d..56e43ef7 100644 --- a/lib/i18n/zh-Hant.i18n.json +++ b/lib/i18n/zh-Hant.i18n.json @@ -17,7 +17,8 @@ "quickConnectWaiting": "等待核准…", "quickConnectCancel": "取消", "quickConnectExpired": "快速連線代碼已過期。請重試。", - "localDataRecoveryRequired": "Plezy 無法安全地復原本機登入資料與待處理的播放資料。請重新登入。" + "localDataRecoveryRequired": "Plezy 無法安全地復原本機登入資料與待處理的播放資料。請重新登入。", + "pinCheckRejected": "Plex PIN 檢查遭到拒絕" }, "common": { "cancel": "取消", @@ -77,7 +78,10 @@ "trakt": "Trakt", "rottenTomatoesCritic": "Rotten Tomatoes 影評人", "rottenTomatoesAudience": "Rotten Tomatoes 觀眾" - } + }, + "notAvailable": "N/A", + "url": "URL", + "letterKeys": "ABC" }, "screens": { "licenses": "授權條款", @@ -323,8 +327,8 @@ "showNavBarLabels": "顯示導覽列標籤", "showNavBarLabelsDescription": "在導覽列圖示下方顯示文字標籤", "startupSection": "啟動頁面", - "showExploreTab": "", - "showExploreTabDescription": "", + "showExploreTab": "顯示探索分頁", + "showExploreTabDescription": "顯示探索分頁,其中包含來自 Plex Discover 和已連結追蹤服務的內容", "liveTvDefaultFavorites": "預設顯示最愛頻道", "liveTvDefaultFavoritesDescription": "開啟直播電視時僅顯示最愛頻道", "display": "顯示器", @@ -335,7 +339,8 @@ "player": "播放器", "subtitlesAndConfig": "字幕與設定", "seekAndTiming": "跳轉與計時", - "behavior": "行為" + "behavior": "行為", + "exportDialogTitle": "匯出 Plezy 設定" }, "search": { "hint": "搜尋電影、影集、音樂…", @@ -491,7 +496,9 @@ "flagExternal": "外部", "flagHearingImpaired": "聽障輔助", "flagDub": "配音", - "flagOriginal": "原音" + "flagOriginal": "原音", + "channelsMono": "單聲道", + "dolbyVisionProfile": "規格檔(Profile)${profile}" }, "mediaMenu": { "markAsWatched": "標記為已觀看", @@ -565,7 +572,12 @@ "alphabetNavigation": "字母導覽", "alphabetScrollHint": "向上或向下滑動以按字母移動", "rowColumnPosition": "第 ${row} 列,共 ${rowCount} 列;第 ${column} 欄,共 ${columnCount} 欄", - "rowPosition": "第 ${row} 列,共 ${rowCount} 列" + "rowPosition": "第 ${row} 列,共 ${rowCount} 列", + "autoScrollPlay": "開始自動捲動", + "autoScrollPause": "暫停自動捲動", + "hueShort": "H", + "saturationShort": "S", + "valueShort": "V" }, "tooltips": { "shufflePlay": "隨機播放", @@ -663,7 +675,16 @@ "subtitleDownloaded": "字幕下載成功", "subtitleDownloadedNotApplied": "字幕已下載,但無法套用", "subtitleDownloadFailed": "字幕下載失敗", - "searchLanguages": "搜尋語言…" + "searchLanguages": "搜尋語言…", + "skipIntro": "略過片頭", + "skipCredits": "略過片尾", + "nextEpisode": "下一集", + "subtitleTrack": "字幕軌 ${n}", + "subtitleFile": "字幕 ${name}", + "forcedTrack": "${label}(強制)", + "osdSubtitlesOff": "字幕:關閉", + "osdSubtitles": "字幕:${track}", + "osdAudio": "音訊:${track}" }, "userStatus": {}, "messages": { @@ -718,12 +739,18 @@ "serverLimitBody": "伺服器錯誤(HTTP 500)。伺服器的頻寬或轉碼限制可能拒絕此播放要求。請聯絡伺服器擁有者調整設定。", "mediaUnreadableTitle": "檔案無法使用", "mediaUnreadableBody": "伺服器找到了此項目,但無法讀取其檔案(HTTP 404)。檔案可能已移動、刪除,或其儲存空間離線。請聯絡伺服器擁有者檢查檔案並重新掃描媒體庫。", - "serverBusyTitle": "", - "serverBusyBody": "", + "serverBusyTitle": "串流無法使用", + "serverBusyBody": "伺服器持續拒絕串流此檔案(HTTP 503)。伺服器可能正在重新啟動、忙碌中,或檔案所在的儲存裝置可能已離線。請稍後再試;若問題持續發生,請要求伺服器擁有者檢查伺服器及檔案所在的儲存裝置。", "logsUploaded": "日誌已上傳", "logsUploadFailed": "上傳日誌失敗", "logId": "日誌 ID", - "burnedSubtitlesUseMenu": "" + "burnedSubtitlesUseMenu": "字幕已燒錄至此串流中。請從字幕選單變更字幕。", + "noVideoUrl": "沒有可用的視訊 URL", + "playbackNoMediaSources": "伺服器未傳回可播放的媒體來源", + "playbackDataNotPrepared": "播放資料尚未準備完成就已開始播放", + "streamSelectionUnavailable": "此來源不支援選擇串流", + "streamSelectionFailed": "無法套用所選串流", + "serverUnavailableForProfile": "使用中的使用者設定檔沒有可用的伺服器" }, "subtitlingStyling": { "text": "文字", @@ -742,8 +769,8 @@ "overrideStrip": "移除樣式", "positionTop": "頂部", "positionBottom": "底部", - "anchorToScreen": "", - "anchorToScreenDescription": "", + "anchorToScreen": "錨定至螢幕", + "anchorToScreenDescription": "在寬螢幕影片下方的黑邊顯示文字字幕", "bold": "粗體", "italic": "斜體", "renderResolution": "渲染解析度", @@ -831,7 +858,8 @@ "pinProtectionOptional": "PIN 碼保護(選填)", "pinExplain": "切換至此使用者設定檔時需要 4 位數 PIN 碼。", "continueButton": "繼續", - "pinsDontMatch": "PIN 碼不符合" + "pinsDontMatch": "PIN 碼不符合", + "tokenIdentityMismatch": "Plex 使用者設定檔權杖解析到非預期的伺服器" }, "connections": { "sectionTitle": "連線", @@ -868,7 +896,10 @@ "movie": "電影", "tvShow": "影集", "minutesLeft": "剩餘 ${minutes} 分鐘", - "moreLikeThis": "更多類似內容" + "moreLikeThis": "更多類似內容", + "titleCount": { + "other": "${n} 部作品" + } }, "errors": { "searchFailed": "搜尋失敗:${error}", @@ -1075,10 +1106,10 @@ "characters": "角色", "addToWatchlist": "新增至待看清單", "removeFromWatchlist": "從待看清單移除", - "addedToWatchlist": "", - "removedFromWatchlist": "", + "addedToWatchlist": "已加入待看清單", + "removedFromWatchlist": "已從待看清單移除", "watchlistUpdateFailed": "無法更新待看清單", - "watchlistNoMatch": "", + "watchlistNoMatch": "無法將此項目與待看清單配對", "notInLibrary": "不在您的媒體庫中", "inTheseLibraries": "在這些媒體庫中", "checkingLibrary": "正在檢查您的媒體庫…", @@ -1245,9 +1276,9 @@ "watchChannel": "觀看頻道", "favorites": "最愛", "reorderFavorites": "重新排序最愛頻道", - "noFavoriteChannels": "", - "noFavoriteChannelsHint": "", - "showAllChannels": "", + "noFavoriteChannels": "沒有最愛頻道", + "noFavoriteChannelsHint": "顯示所有頻道,然後長按頻道即可將其加入最愛。", + "showAllChannels": "顯示所有頻道", "favoritesLoadFailed": "無法載入最愛頻道。請檢查網路連線後重試。", "favoritesUpdateFailed": "無法更新最愛頻道。請檢查網路連線後重試。", "joinSession": "加入進行中的「一起看」", @@ -1286,7 +1317,12 @@ "recordingRuleUpdated": "錄製規則已更新", "guideReloadRequested": "已要求更新節目表指南", "rulesProcessRequested": "已要求重新評估規則", - "recordShow": "錄製節目" + "recordShow": "錄製節目", + "startingInMinutes": "${minutes} 分鐘後開始", + "dayAtTime": "${day} ${time}", + "invalidPlaybackData": "${product} 傳回了無效的直播電視播放資料", + "failedToStartChannel": "無法啟動直播頻道", + "failedToBuildStreamUrl": "無法建立串流 URL" }, "collections": { "title": "收藏集", @@ -1362,7 +1398,9 @@ "nextTrack": "下一首", "repeat": "重複播放", "repeatAll": "全部重複播放", - "repeatOne": "單曲重複播放" + "repeatOne": "單曲重複播放", + "instantMixNoServer": "沒有可用於即時混音的伺服器", + "noAudioUrl": "${track} 沒有可用的音訊 URL" }, "watchTogether": { "title": "一起看", @@ -1429,7 +1467,8 @@ "renameRoom": "重新命名房間", "removeRoom": "移除", "guestSwitchUnavailable": "無法切換 — 伺服器無法進行同步", - "guestSwitchFailed": "無法切換 — 在此伺服器上找不到內容" + "guestSwitchFailed": "無法切換 — 在此伺服器上找不到內容", + "defaultDisplayName": "使用者" }, "downloads": { "title": "下載", @@ -1533,7 +1572,17 @@ "statusUnknown": "尚未檢查", "settingsUnavailable": "無法在這部裝置上開啟系統設定", "linkUnavailable": "無法在這部裝置上開啟 dontkillmyapp.com" - } + }, + "unknownShow": "未知節目", + "unknownSeason": "未知季度", + "unknownAlbum": "未知專輯", + "completedOfTotal": "已完成 ${completed}/${total}", + "errorFileNotFound": "找不到檔案(404)", + "errorDownloadFailed": "下載失敗", + "errorPostProcessing": "後續處理失敗:${error}", + "notificationDownloading": "正在下載…", + "notificationComplete": "下載完成", + "notificationPaused": "下載已暫停" }, "shaders": { "title": "著色器", @@ -1624,7 +1673,8 @@ "failedToConnectAnyAddress": "無法連線至任何位址", "connectionLostAfterAttempts": "嘗試 ${attempts} 次後連線中斷", "connectionLost": "連線已中斷" - } + }, + "closedBeforeAuth": "連線在驗證前已關閉" }, "videoSettings": { "playbackSpeed": "播放速度", @@ -1635,13 +1685,13 @@ "audioSync": "音訊同步調整", "subtitleSync": "字幕同步調整", "hdr": "HDR", - "hdrUnsupported": "", - "hdrToneMapping": "", - "hdrToneMappingCompositor": "", - "hdrToneMappingCompositorDescription": "", - "hdrToneMappingPlayer": "", - "hdrToneMappingPlayerDescription": "", - "hdrToneMappingFailed": "", + "hdrUnsupported": "此處無法使用 HDR——這個桌面合成器或視訊輸出無法傳遞 HDR。", + "hdrToneMapping": "HDR 色調映射", + "hdrToneMappingCompositor": "合成器", + "hdrToneMappingCompositorDescription": "直接傳遞來源的 HDR 中繼資料,並交由桌面合成器進行色調映射。", + "hdrToneMappingPlayer": "播放器", + "hdrToneMappingPlayerDescription": "在播放器中依顯示器的峰值亮度進行映射,再將結果告知合成器。", + "hdrToneMappingFailed": "無法變更 HDR 色調映射,先前的模式仍在使用中。", "audioOutput": "音訊輸出", "performanceOverlay": "效能監控", "audioOutputDolbyAtmos": "Dolby Atmos", @@ -1687,7 +1737,17 @@ "speed": "速度", "player": "播放器", "memory": "記憶體", - "uiFps": "UI FPS" + "uiFps": "UI FPS", + "fps": "FPS", + "decoderAndroidHw": "Android 硬體", + "decoderNvidiaHw": "NVIDIA 硬體", + "decoderQualcommHw": "Qualcomm 硬體", + "decoderMediatekHw": "MediaTek 硬體", + "decoderExynosHw": "Exynos 硬體", + "decoderSoftware": "軟體", + "decoderHardware": "硬體", + "tunnelingActive": "已啟用", + "dvRpuFailed": "${converted}(${failures} 個失敗)" }, "externalPlayer": { "title": "外部播放器", @@ -1845,7 +1905,17 @@ "statusAvailable": "可用", "statusPartiallyAvailable": "部分可用", "statusRequested": "已請求", - "statusProcessing": "處理中" + "statusProcessing": "處理中", + "couldNotReach": "無法連線至 ${url}:${error}", + "noInstanceAtUrl": "在 ${url} 找不到 Seerr 執行個體(HTTP ${status})", + "notInitialized": "此 Seerr 執行個體尚未完成首次執行設定", + "noPlexTokenForReauth": "沒有可用於重新登入的 Plex 權杖", + "noStoredCredentials": "沒有可用於重新登入的已儲存認證資訊", + "signInRejected": "登入遭到拒絕", + "noSessionCookie": "Seerr 未發出工作階段 Cookie", + "freshCookieRejected": "Seerr 拒絕了新的工作階段 Cookie", + "noUserInformation": "Seerr 未傳回使用者資訊", + "sessionRejectedAfterReauth": "重新登入後,工作階段遭到拒絕" }, "services": { "title": "外部服務", @@ -1866,7 +1936,7 @@ }, "deviceCode": { "title": "在 ${service} 啟用 Plezy", - "instructions": "", + "instructions": "掃描 QR 碼,或前往下方網址並輸入此代碼:", "openToActivate": "開啟 ${service} 進行啟用", "copyCode": "複製啟用代碼", "waitingForAuthorization": "等待授權中…", @@ -1924,6 +1994,24 @@ "connectToMediaBrowserCardSubtitle": "輸入您的伺服器 URL、使用者名稱與密碼。", "connectToMediaBrowserCardSubtitleScoped": "登入您的 ${product} 伺服器。將綁定至 ${name}。", "borrowFromAnotherProfile": "從另一個使用者設定檔共用", - "borrowFromAnotherProfileSubtitle": "重複使用另一個使用者設定檔的連線資訊。受 PIN 碼保護的使用者設定檔需輸入 PIN 碼。" + "borrowFromAnotherProfileSubtitle": "重複使用另一個使用者設定檔的連線資訊。受 PIN 碼保護的使用者設定檔需輸入 PIN 碼。", + "invalidCredentials": "使用者名稱或密碼無效", + "authResponseNotJson": "驗證回應不是有效的 JSON", + "quickConnectRejected": "Quick Connect 遭到伺服器拒絕", + "quickConnectNotJson": "Quick Connect 回應不是有效的 JSON", + "quickConnectMissingFields": "Quick Connect 回應缺少代碼或密鑰", + "quickConnectPollRejected": "Quick Connect 輪詢遭到伺服器拒絕", + "serverTimedOut": "伺服器未及時回應", + "responseNotJson": "伺服器回應不是有效的 JSON", + "responseMissingIdentity": "回應缺少 ID 或伺服器名稱——這是 ${product} 伺服器嗎?", + "probeFailed": "無法連線至伺服器:${error}", + "enterAtLeastOneUrl": "請輸入至少一個 ${product} 伺服器 URL", + "noReachableServer": "找不到可連線的 ${product} 伺服器", + "urlsPointToDifferentServers": "這些 URL 指向不同的 ${product} 伺服器", + "urlDoesNotMatchServer": "此 URL 與 ${product} 伺服器不符", + "redirectUnsupported": "伺服器重新導向至不支援的 URL", + "redirectDifferentHost": "伺服器重新導向至不同的主機。請直接輸入最終的 ${product} URL。", + "redirectInsecure": "伺服器從 HTTPS 重新導向至不安全的 URL", + "redirectUnsupportedEnterFinal": "伺服器重新導向至不支援的 URL。請直接輸入最終的 ${product} URL。" } } diff --git a/lib/i18n/zh.i18n.json b/lib/i18n/zh.i18n.json index 9895066e..2b1d814b 100644 --- a/lib/i18n/zh.i18n.json +++ b/lib/i18n/zh.i18n.json @@ -17,7 +17,8 @@ "quickConnectWaiting": "等待批准…", "quickConnectCancel": "取消", "quickConnectExpired": "Quick Connect 已过期。请重试。", - "localDataRecoveryRequired": "Plezy 无法安全恢复本地登录状态和待处理的播放数据。请重新登录。" + "localDataRecoveryRequired": "Plezy 无法安全恢复本地登录状态和待处理的播放数据。请重新登录。", + "pinCheckRejected": "Plex PIN 检查被拒绝" }, "common": { "cancel": "取消", @@ -77,7 +78,10 @@ "trakt": "Trakt", "rottenTomatoesCritic": "Rotten Tomatoes 影评人", "rottenTomatoesAudience": "Rotten Tomatoes 观众" - } + }, + "notAvailable": "N/A", + "url": "URL", + "letterKeys": "ABC" }, "screens": { "licenses": "许可证", @@ -323,8 +327,8 @@ "showNavBarLabels": "显示导航栏标签", "showNavBarLabelsDescription": "在导航栏图标下方显示文字标签", "startupSection": "启动页面", - "showExploreTab": "", - "showExploreTabDescription": "", + "showExploreTab": "显示“探索”标签页", + "showExploreTabDescription": "显示“探索”标签页,其中包含来自 Plex Discover 和已连接追踪服务的内容", "liveTvDefaultFavorites": "默认显示收藏频道", "liveTvDefaultFavoritesDescription": "打开直播电视时仅显示收藏频道", "display": "显示", @@ -335,7 +339,8 @@ "player": "播放器", "subtitlesAndConfig": "字幕与配置", "seekAndTiming": "跳转与计时", - "behavior": "行为" + "behavior": "行为", + "exportDialogTitle": "导出 Plezy 设置" }, "search": { "hint": "搜索电影、剧集、音乐…", @@ -491,7 +496,9 @@ "flagExternal": "外部", "flagHearingImpaired": "听障辅助", "flagDub": "配音", - "flagOriginal": "原声" + "flagOriginal": "原声", + "channelsMono": "单声道", + "dolbyVisionProfile": "编码配置 ${profile}" }, "mediaMenu": { "markAsWatched": "标记为已观看", @@ -565,7 +572,12 @@ "alphabetNavigation": "字母导航", "alphabetScrollHint": "上下滑动以按字母移动", "rowColumnPosition": "第 ${row} 行,共 ${rowCount} 行;第 ${column} 列,共 ${columnCount} 列", - "rowPosition": "第 ${row} 行,共 ${rowCount} 行" + "rowPosition": "第 ${row} 行,共 ${rowCount} 行", + "autoScrollPlay": "开始自动滚动", + "autoScrollPause": "暂停自动滚动", + "hueShort": "H", + "saturationShort": "S", + "valueShort": "V" }, "tooltips": { "shufflePlay": "随机播放", @@ -663,7 +675,16 @@ "subtitleDownloaded": "字幕已下载", "subtitleDownloadedNotApplied": "字幕已下载,但无法选择", "subtitleDownloadFailed": "字幕下载失败", - "searchLanguages": "搜索语言…" + "searchLanguages": "搜索语言…", + "skipIntro": "跳过片头", + "skipCredits": "跳过片尾", + "nextEpisode": "下一集", + "subtitleTrack": "轨道 ${n}", + "subtitleFile": "字幕 ${name}", + "forcedTrack": "${label}(强制)", + "osdSubtitlesOff": "字幕:关闭", + "osdSubtitles": "字幕:${track}", + "osdAudio": "音频:${track}" }, "userStatus": {}, "messages": { @@ -718,12 +739,18 @@ "serverLimitBody": "服务器错误(HTTP 500)。此次会话可能因带宽或转码限制而被拒绝。请联系服务器所有者调整限制。", "mediaUnreadableTitle": "文件不可用", "mediaUnreadableBody": "服务器找到了此项目,但无法读取其文件(HTTP 404)。文件可能已被移动、删除,或其存储已离线。请联系服务器管理员检查文件并重新扫描媒体库。", - "serverBusyTitle": "", - "serverBusyBody": "", + "serverBusyTitle": "视频流不可用", + "serverBusyBody": "服务器持续拒绝传输此文件(HTTP 503)。服务器可能正在重启或正忙,也可能是文件所在的存储设备已离线。请稍后重试;如果问题持续出现,请联系服务器所有者检查服务器和文件存储设备。", "logsUploaded": "日志已上传", "logsUploadFailed": "上传日志失败", "logId": "日志 ID", - "burnedSubtitlesUseMenu": "" + "burnedSubtitlesUseMenu": "字幕已烧录到此视频流中。请从字幕菜单中更改。", + "noVideoUrl": "没有可用的视频 URL", + "playbackNoMediaSources": "服务器未返回可播放的媒体源", + "playbackDataNotPrepared": "播放数据尚未准备就绪时便开始了播放", + "streamSelectionUnavailable": "此媒体源不支持选择视频流", + "streamSelectionFailed": "无法应用所选视频流", + "serverUnavailableForProfile": "没有可供当前用户资料使用的服务器" }, "subtitlingStyling": { "text": "文本", @@ -742,8 +769,8 @@ "overrideStrip": "移除样式", "positionTop": "顶部", "positionBottom": "底部", - "anchorToScreen": "", - "anchorToScreenDescription": "", + "anchorToScreen": "锚定到屏幕", + "anchorToScreenDescription": "在宽屏视频下方的黑边中显示文本字幕", "bold": "粗体", "italic": "斜体", "renderResolution": "渲染分辨率", @@ -831,7 +858,8 @@ "pinProtectionOptional": "PIN 保护(可选)", "pinExplain": "切换用户资料时需要输入 4 位 PIN。", "continueButton": "继续", - "pinsDontMatch": "PIN 不匹配" + "pinsDontMatch": "PIN 不匹配", + "tokenIdentityMismatch": "Plex 用户资料令牌解析到了非预期服务器" }, "connections": { "sectionTitle": "连接", @@ -868,7 +896,10 @@ "movie": "电影", "tvShow": "电视剧", "minutesLeft": "剩余 ${minutes} 分钟", - "moreLikeThis": "更多类似内容" + "moreLikeThis": "更多类似内容", + "titleCount": { + "other": "${n} 个标题" + } }, "errors": { "searchFailed": "搜索失败:${error}", @@ -1075,10 +1106,10 @@ "characters": "角色", "addToWatchlist": "添加到想看列表", "removeFromWatchlist": "从想看列表移除", - "addedToWatchlist": "", - "removedFromWatchlist": "", + "addedToWatchlist": "已加入待看列表", + "removedFromWatchlist": "已从待看列表中移除", "watchlistUpdateFailed": "无法更新想看列表", - "watchlistNoMatch": "", + "watchlistNoMatch": "无法将此项目与待看列表匹配", "notInLibrary": "不在你的媒体库中", "inTheseLibraries": "在这些媒体库中", "checkingLibrary": "正在检查你的媒体库…", @@ -1245,9 +1276,9 @@ "watchChannel": "观看频道", "favorites": "收藏", "reorderFavorites": "重新排序收藏", - "noFavoriteChannels": "", - "noFavoriteChannelsHint": "", - "showAllChannels": "", + "noFavoriteChannels": "没有收藏的频道", + "noFavoriteChannelsHint": "显示所有频道,然后长按某个频道将其加入收藏。", + "showAllChannels": "显示所有频道", "favoritesLoadFailed": "无法加载收藏。请检查网络连接后重试。", "favoritesUpdateFailed": "无法更新收藏。请检查网络连接后重试。", "joinSession": "加入正在进行的会话", @@ -1286,7 +1317,12 @@ "recordingRuleUpdated": "录制规则已更新", "guideReloadRequested": "已请求更新节目指南", "rulesProcessRequested": "已请求重新评估规则", - "recordShow": "录制节目" + "recordShow": "录制节目", + "startingInMinutes": "${minutes} 分钟后开始", + "dayAtTime": "${day} ${time}", + "invalidPlaybackData": "${product} 返回了无效的直播电视播放数据", + "failedToStartChannel": "无法播放直播频道", + "failedToBuildStreamUrl": "无法生成视频流 URL" }, "collections": { "title": "合集", @@ -1362,7 +1398,9 @@ "nextTrack": "下一首", "repeat": "循环", "repeatAll": "列表循环", - "repeatOne": "单曲循环" + "repeatOne": "单曲循环", + "instantMixNoServer": "没有可用于即时混合的服务器", + "noAudioUrl": "没有可供 ${track} 使用的音频 URL" }, "watchTogether": { "title": "一起看", @@ -1429,7 +1467,8 @@ "renameRoom": "重命名房间", "removeRoom": "移除", "guestSwitchUnavailable": "无法切换 — 服务器不可用于同步", - "guestSwitchFailed": "无法切换 — 在此服务器上未找到内容" + "guestSwitchFailed": "无法切换 — 在此服务器上未找到内容", + "defaultDisplayName": "用户" }, "downloads": { "title": "下载", @@ -1533,7 +1572,17 @@ "statusUnknown": "尚未检查", "settingsUnavailable": "无法在此设备上打开系统设置", "linkUnavailable": "无法在此设备上打开 dontkillmyapp.com" - } + }, + "unknownShow": "未知节目", + "unknownSeason": "未知季", + "unknownAlbum": "未知专辑", + "completedOfTotal": "已完成 ${completed}/${total}", + "errorFileNotFound": "未找到文件(404)", + "errorDownloadFailed": "下载失败", + "errorPostProcessing": "后处理失败:${error}", + "notificationDownloading": "正在下载…", + "notificationComplete": "下载完成", + "notificationPaused": "下载已暂停" }, "shaders": { "title": "着色器", @@ -1624,7 +1673,8 @@ "failedToConnectAnyAddress": "无法连接到任何地址", "connectionLostAfterAttempts": "${attempts} 次尝试后连接丢失", "connectionLost": "连接丢失" - } + }, + "closedBeforeAuth": "连接在身份验证前已关闭" }, "videoSettings": { "playbackSpeed": "播放速度", @@ -1635,13 +1685,13 @@ "audioSync": "音频同步", "subtitleSync": "字幕同步", "hdr": "HDR", - "hdrUnsupported": "", - "hdrToneMapping": "", - "hdrToneMappingCompositor": "", - "hdrToneMappingCompositorDescription": "", - "hdrToneMappingPlayer": "", - "hdrToneMappingPlayerDescription": "", - "hdrToneMappingFailed": "", + "hdrUnsupported": "此处不支持 HDR——当前桌面合成器或视频输出无法传输 HDR。", + "hdrToneMapping": "HDR 色调映射", + "hdrToneMappingCompositor": "合成器", + "hdrToneMappingCompositorDescription": "直接传递源的 HDR 元数据,并由桌面合成器进行映射。", + "hdrToneMappingPlayer": "播放器", + "hdrToneMappingPlayerDescription": "在播放器中映射到显示器的峰值亮度,然后将结果告知合成器。", + "hdrToneMappingFailed": "无法更改 HDR 色调映射——仍在使用之前的模式。", "audioOutput": "音频输出", "performanceOverlay": "性能监控", "audioOutputDolbyAtmos": "Dolby Atmos", @@ -1687,7 +1737,17 @@ "speed": "速度", "player": "播放器", "memory": "内存", - "uiFps": "UI FPS" + "uiFps": "UI FPS", + "fps": "FPS", + "decoderAndroidHw": "Android 硬件", + "decoderNvidiaHw": "NVIDIA 硬件", + "decoderQualcommHw": "Qualcomm 硬件", + "decoderMediatekHw": "MediaTek 硬件", + "decoderExynosHw": "Exynos 硬件", + "decoderSoftware": "软件", + "decoderHardware": "硬件", + "tunnelingActive": "已启用", + "dvRpuFailed": "${converted}(${failures} 个失败)" }, "externalPlayer": { "title": "外部播放器", @@ -1845,7 +1905,17 @@ "statusAvailable": "可用", "statusPartiallyAvailable": "部分可用", "statusRequested": "已请求", - "statusProcessing": "处理中" + "statusProcessing": "处理中", + "couldNotReach": "无法连接到 ${url}:${error}", + "noInstanceAtUrl": "${url} 上没有 Seerr 实例(HTTP ${status})", + "notInitialized": "此 Seerr 实例尚未完成首次运行设置", + "noPlexTokenForReauth": "没有可用于重新登录的 Plex 令牌", + "noStoredCredentials": "没有已保存的凭据可用于重新登录", + "signInRejected": "登录被拒绝", + "noSessionCookie": "Seerr 未签发会话 Cookie", + "freshCookieRejected": "Seerr 拒绝了新的会话 Cookie", + "noUserInformation": "Seerr 未返回用户信息", + "sessionRejectedAfterReauth": "重新登录后会话被拒绝" }, "services": { "title": "服务", @@ -1866,7 +1936,7 @@ }, "deviceCode": { "title": "在 ${service} 上激活 Plezy", - "instructions": "", + "instructions": "扫描二维码,或访问下方地址并输入此代码:", "openToActivate": "打开 ${service} 以激活", "copyCode": "复制激活代码", "waitingForAuthorization": "等待授权…", @@ -1924,6 +1994,24 @@ "connectToMediaBrowserCardSubtitle": "输入你的服务器 URL、用户名和密码。", "connectToMediaBrowserCardSubtitleScoped": "登录你的 ${product} 服务器。将绑定到 ${name}。", "borrowFromAnotherProfile": "使用其他用户资料的连接", - "borrowFromAnotherProfileSubtitle": "复用另一个用户资料的连接。受 PIN 保护的用户资料需要输入 PIN。" + "borrowFromAnotherProfileSubtitle": "复用另一个用户资料的连接。受 PIN 保护的用户资料需要输入 PIN。", + "invalidCredentials": "用户名或密码无效", + "authResponseNotJson": "身份验证响应不是有效的 JSON", + "quickConnectRejected": "服务器拒绝了 Quick Connect", + "quickConnectNotJson": "Quick Connect 响应不是有效的 JSON", + "quickConnectMissingFields": "Quick Connect 响应中缺少代码或密钥", + "quickConnectPollRejected": "服务器拒绝了 Quick Connect 轮询", + "serverTimedOut": "服务器未及时响应", + "responseNotJson": "服务器响应不是有效的 JSON", + "responseMissingIdentity": "响应中缺少 ID 或服务器名称——这是 ${product} 服务器吗?", + "probeFailed": "无法连接到服务器:${error}", + "enterAtLeastOneUrl": "请输入至少一个 ${product} 服务器 URL", + "noReachableServer": "未找到可连接的 ${product} 服务器", + "urlsPointToDifferentServers": "这些 URL 指向不同的 ${product} 服务器", + "urlDoesNotMatchServer": "此 URL 与 ${product} 服务器不匹配", + "redirectUnsupported": "服务器重定向到了不受支持的 URL", + "redirectDifferentHost": "服务器重定向到了其他主机。请直接输入最终的 ${product} URL。", + "redirectInsecure": "服务器从 HTTPS 重定向到了不安全的 URL", + "redirectUnsupportedEnterFinal": "服务器重定向到了不受支持的 URL。请直接输入最终的 ${product} URL。" } } diff --git a/lib/main.dart b/lib/main.dart index 455adccb..b222823d 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1436,7 +1436,7 @@ class _MainAppState extends State with WidgetsBindingObserver { if (!downloadProvider.hasSyncRule(key)) continue; final result = await downloadProvider.executeSyncRuleFor(key, _serverManager); if (result != null && result.queuedCount > 0) { - final title = result.title ?? 'Unknown'; + final title = result.title ?? t.common.unknown; showMainSnackBar(t.downloads.syncedNewEpisodes(count: '1', title: '$title (${result.queuedCount})')); } } diff --git a/lib/media/media_file_info.dart b/lib/media/media_file_info.dart index 98015647..05cf871a 100644 --- a/lib/media/media_file_info.dart +++ b/lib/media/media_file_info.dart @@ -1,3 +1,5 @@ +import '../i18n/strings.g.dart'; + import '../utils/formatters.dart'; /// Backend-neutral file-info payload rendered by `FileInfoBottomSheet`. @@ -322,7 +324,8 @@ class MediaDolbyVisionInfo { String? get profileFormatted { if (profile == null) return title; final compatibility = blCompatibilityId; - return compatibility == null || compatibility == 0 ? 'Profile $profile' : 'Profile $profile.$compatibility'; + final numericProfile = compatibility == null || compatibility == 0 ? '$profile' : '$profile.$compatibility'; + return t.fileInfo.dolbyVisionProfile(profile: numericProfile); } } diff --git a/lib/providers/companion_remote_provider.dart b/lib/providers/companion_remote_provider.dart index 6b6adcd7..b75d224a 100644 --- a/lib/providers/companion_remote_provider.dart +++ b/lib/providers/companion_remote_provider.dart @@ -883,7 +883,7 @@ class CompanionRemoteProvider with ChangeNotifier, DisposableChangeNotifierMixin void _handleDeviceInfo(RemoteCommand command) { if (command.data != null) { final id = command.data!['id'] as String? ?? 'unknown'; - final name = command.data!['name'] as String? ?? 'Unknown Device'; + final name = command.data!['name'] as String? ?? t.companionRemote.unknownDevice; final platform = command.data!['platform'] as String? ?? 'unknown'; final role = command.data!['role'] as String?; diff --git a/lib/providers/download_provider.dart b/lib/providers/download_provider.dart index ecdb0c6a..870bd9a9 100644 --- a/lib/providers/download_provider.dart +++ b/lib/providers/download_provider.dart @@ -1733,7 +1733,7 @@ class DownloadProvider extends ChangeNotifier with DisposableChangeNotifierMixin try { appLogger.i('Auto-deleting watched download: ${meta.title} ($globalKey)'); await deleteDownload(globalKey); - deletedTitles.add(meta.title ?? 'Unknown'); + deletedTitles.add(meta.title ?? t.common.unknown); } catch (e) { appLogger.w('Failed to auto-delete watched download $globalKey: $e'); } @@ -2091,7 +2091,7 @@ class DownloadProvider extends ChangeNotifier with DisposableChangeNotifierMixin ); return results.where((r) => r.queuedCount > 0).map((r) { - final title = r.title ?? 'Unknown'; + final title = r.title ?? t.common.unknown; return '$title (${r.queuedCount})'; }).toList(); } diff --git a/lib/providers/offline_watch_provider.dart b/lib/providers/offline_watch_provider.dart index 0290d1ec..a2914e61 100644 --- a/lib/providers/offline_watch_provider.dart +++ b/lib/providers/offline_watch_provider.dart @@ -208,7 +208,7 @@ class OfflineWatchProvider extends ChangeNotifier with DisposableChangeNotifierM .deleteDownload(globalKey) .then( (_) { - showMainSnackBar(t.messages.autoRemovedWatchedDownload(title: meta.title ?? 'Unknown')); + showMainSnackBar(t.messages.autoRemovedWatchedDownload(title: meta.title ?? t.common.unknown)); }, onError: (e) { appLogger.w('Failed to auto-delete locally-watched download $globalKey: $e'); diff --git a/lib/screens/actor_media_screen.dart b/lib/screens/actor_media_screen.dart index 9157a8a0..5893b7f4 100644 --- a/lib/screens/actor_media_screen.dart +++ b/lib/screens/actor_media_screen.dart @@ -148,7 +148,7 @@ class _ActorMediaScreenState extends BaseMediaListDetailScreen if (totalSize > 0) ...[ const SizedBox(height: 4), Text( - '$totalSize ${totalSize == 1 ? 'title' : 'titles'}', + t.discover.titleCount(n: totalSize), style: theme.textTheme.bodySmall?.copyWith(color: theme.colorScheme.onSurfaceVariant), ), ], diff --git a/lib/screens/auth/plex_pin_auth_flow.dart b/lib/screens/auth/plex_pin_auth_flow.dart index 6844e629..e2d5adbf 100644 --- a/lib/screens/auth/plex_pin_auth_flow.dart +++ b/lib/screens/auth/plex_pin_auth_flow.dart @@ -206,9 +206,10 @@ class _PlexPinAuthFlowState extends State { String _authErrorMessage(Object error) { if (error is MediaServerPinExpiredException) return t.addServer.pinExpired; - if (error is MediaServerAuthException) return error.message; + if (error is MediaServerAuthException) return error.display ?? error.message; if (error is MediaServerHttpException) { - return t.addServer.couldNotReachServer(error: error.message.isEmpty ? error.toString() : error.message); + return error.display ?? + t.addServer.couldNotReachServer(error: error.message.isEmpty ? error.toString() : error.message); } return error.toString(); } diff --git a/lib/screens/discover_screen.dart b/lib/screens/discover_screen.dart index 7201092e..80bf86fd 100644 --- a/lib/screens/discover_screen.dart +++ b/lib/screens/discover_screen.dart @@ -1166,7 +1166,9 @@ class _DiscoverScreenState extends State fill: 1, color: Theme.of(context).colorScheme.onSurface, size: 18, - semanticLabel: '${_isAutoScrollPaused ? t.common.play : t.common.pause} auto-scroll', + semanticLabel: _isAutoScrollPaused + ? t.accessibility.autoScrollPlay + : t.accessibility.autoScrollPause, ), ), ), diff --git a/lib/screens/livetv/live_tv_show_schedule_screen.dart b/lib/screens/livetv/live_tv_show_schedule_screen.dart index 94496413..f8695a0a 100644 --- a/lib/screens/livetv/live_tv_show_schedule_screen.dart +++ b/lib/screens/livetv/live_tv_show_schedule_screen.dart @@ -200,7 +200,7 @@ class _ScheduleListTile extends StatelessWidget { if (program.isCurrentlyAiring && end != null) { final minutesLeft = end.difference(now).inMinutes; - return '${minutesLeft}min left'; + return t.discover.minutesLeft(minutes: minutesLeft); } final minutesUntil = start.difference(now).inMinutes; @@ -208,7 +208,7 @@ class _ScheduleListTile extends StatelessWidget { // Just started return _formatAbsoluteTime(start, now, is24Hour: is24Hour); } else if (minutesUntil < 90) { - return 'Starting in ${minutesUntil}min'; + return t.liveTv.startingInMinutes(minutes: minutesUntil); } else { return _formatAbsoluteTime(start, now, is24Hour: is24Hour); } @@ -216,7 +216,10 @@ class _ScheduleListTile extends StatelessWidget { String _formatAbsoluteTime(DateTime start, DateTime now, {required bool is24Hour}) { final time = formatClockTime(start, is24Hour: is24Hour); - return '${formatRelativeDayLabel(start, now: now)} at $time'; + return t.liveTv.dayAtTime( + day: formatRelativeDayLabel(start, now: now), + time: time, + ); } @override diff --git a/lib/screens/settings/add_jellyfin_screen.dart b/lib/screens/settings/add_jellyfin_screen.dart index fcd3154f..90b1d4d2 100644 --- a/lib/screens/settings/add_jellyfin_screen.dart +++ b/lib/screens/settings/add_jellyfin_screen.dart @@ -239,7 +239,7 @@ class _AddJellyfinScreenState extends State with AsyncFormSta return autoStart; }, errorMapper: (e) => - e is MediaServerUrlException ? e.message : t.addServer.couldNotReachServer(error: e.toString()), + e is MediaServerUrlException ? e.display ?? e.message : t.addServer.couldNotReachServer(error: e.toString()), ); // Sequenced after the probe's runAsync so busy stays set straight through // /QuickConnect/Initiate. Started from inside the probe body, the probe's @@ -276,7 +276,7 @@ class _AddJellyfinScreenState extends State with AsyncFormSta await _persistAndExit(connection); }, errorMapper: (e) { - if (e is MediaServerAuthException) return e.message; + if (e is MediaServerAuthException) return e.display ?? e.message; appLogger.e('Add ${widget.dialect.productName} failed', error: e); return t.addServer.signInFailed(error: e.toString()); }, @@ -324,7 +324,7 @@ class _AddJellyfinScreenState extends State with AsyncFormSta await _persistAndExit(connection); }, errorMapper: (e) { - if (e is MediaServerAuthException) return e.message; + if (e is MediaServerAuthException) return e.display ?? e.message; appLogger.e('Jellyfin Quick Connect failed', error: e); return t.addServer.quickConnectFailed(error: e.toString()); }, diff --git a/lib/screens/settings/edit_jellyfin_connection_screen.dart b/lib/screens/settings/edit_jellyfin_connection_screen.dart index 22fc7f02..0e767465 100644 --- a/lib/screens/settings/edit_jellyfin_connection_screen.dart +++ b/lib/screens/settings/edit_jellyfin_connection_screen.dart @@ -65,7 +65,7 @@ class _EditJellyfinConnectionScreenState extends State with AsyncFormS await runAsync(() async { final account = context.read(); final token = await account.resolvePlexToken(); - if (token == null || token.isEmpty) throw const SeerrAuthException('No Plex token available'); + if (token == null || token.isEmpty) { + throw SeerrAuthException('No Plex token available', display: t.seerr.noPlexTokenForReauth); + } final session = await account.authService.signInWithPlex(baseUrl: _baseUrl, plexToken: token); await _finish(account, session); }, errorMapper: _describeError); @@ -151,8 +153,8 @@ class _SeerrConnectScreenState extends State with AsyncFormS } String _describeError(Object e) => switch (e) { - SeerrUrlException(:final message) => message, - SeerrAuthException(:final message) => message, + SeerrUrlException(:final message, :final display) => display ?? message, + SeerrAuthException(:final message, :final display) => display ?? message, _ => t.addServer.couldNotReachServer(error: e.toString()), }; diff --git a/lib/screens/settings/settings_screen.dart b/lib/screens/settings/settings_screen.dart index 64f6a783..13991d7e 100644 --- a/lib/screens/settings/settings_screen.dart +++ b/lib/screens/settings/settings_screen.dart @@ -914,7 +914,7 @@ class _RelayUrlDialogState extends State<_RelayUrlDialog> { content: FocusableTextField( controller: _controller, decoration: InputDecoration( - labelText: 'URL', + labelText: t.common.url, hintText: t.settings.watchTogetherRelayHint, errorText: _relayUrlInvalid ? t.settings.watchTogetherRelayInvalid : null, ), diff --git a/lib/screens/video_player/parts/episode_navigation.dart b/lib/screens/video_player/parts/episode_navigation.dart index ab70bd42..0f40e45f 100644 --- a/lib/screens/video_player/parts/episode_navigation.dart +++ b/lib/screens/video_player/parts/episode_navigation.dart @@ -324,7 +324,10 @@ extension _VideoPlayerEpisodeNavigationMethods on VideoPlayerScreenState { if ((isSubtitleChange && isPlexBacked) || (isAudioChange && isPlexBacked)) { final partId = _currentMediaInfo?.partId; if (streamSelectClient == null || partId == null) { - throw StateError('No Plex part available for stream selection'); + throw PlaybackException( + t.messages.streamSelectionUnavailable, + reason: PlaybackFailureReason.invalidPlaybackData, + ); } final saved = await streamSelectClient.selectStreams( partId, @@ -339,7 +342,7 @@ extension _VideoPlayerEpisodeNavigationMethods on VideoPlayerScreenState { allParts: true, ); if (!saved) { - throw StateError('Failed to select streams'); + throw PlaybackException(t.messages.streamSelectionFailed); } if (!isCurrentSourceSwitch()) return PlaybackSourceChangeOutcome.superseded; } @@ -703,7 +706,7 @@ extension _VideoPlayerEpisodeNavigationMethods on VideoPlayerScreenState { final streamHeaders = playbackContext.streamHeaders; if (result.videoUrl == null) { - throw PlaybackException('No video URL available'); + throw PlaybackException(t.messages.noVideoUrl, reason: PlaybackFailureReason.noPlayableSource); } if (result.isOffline && !_offlineLibraryMode) { // The pre-resolve lookup assumed an online source; a download won diff --git a/lib/screens/video_player/parts/errors.dart b/lib/screens/video_player/parts/errors.dart index 1a043b82..63aa6d74 100644 --- a/lib/screens/video_player/parts/errors.dart +++ b/lib/screens/video_player/parts/errors.dart @@ -5,7 +5,7 @@ extension _VideoPlayerErrorMethods on VideoPlayerScreenState { final raw = error.toString(); final redacted = LogRedactionManager.redact(raw); if (raw.contains('No client registered')) { - return t.messages.errorLoading(error: 'Server is unavailable for the active profile'); + return t.messages.errorLoading(error: t.messages.serverUnavailableForProfile); } return t.messages.errorLoading(error: redacted); } @@ -87,7 +87,7 @@ extension _VideoPlayerErrorMethods on VideoPlayerScreenState { 'Server kept answering the stream with HTTP 503 for ' '${openHttp503Patience.inSeconds}s without a first frame — giving up on this open', ); - _onPlayerError(const PlayerError('HTTP 503', cause: PlayerError.serverHttp503)); + _onPlayerError(PlayerError(t.messages.serverBusyTitle, cause: PlayerError.serverHttp503)); } String _redactPlayerError(String message) => LogRedactionManager.redact(message); diff --git a/lib/screens/video_player/parts/playback_start.dart b/lib/screens/video_player/parts/playback_start.dart index 575c98f4..76b45436 100644 --- a/lib/screens/video_player/parts/playback_start.dart +++ b/lib/screens/video_player/parts/playback_start.dart @@ -22,7 +22,9 @@ extension _VideoPlayerPlaybackStartMethods on VideoPlayerScreenState { // spinner covers Plex's tune / Jellyfin's stream negotiation). final channel = widget.live!.channel; final session = await _startLiveSession(channel); - if (session == null) throw Exception('Failed to start live channel'); + if (session == null) { + throw PlaybackException(t.liveTv.failedToStartChannel, reason: PlaybackFailureReason.serverUnavailable); + } if (!mounted || !attempt.isCurrent) { _abandonLiveSession(session); return; @@ -59,7 +61,7 @@ extension _VideoPlayerPlaybackStartMethods on VideoPlayerScreenState { // Build the stream URL (with optional offset for time-shift) final streamUrl = await session.streamUrlAt(offsetSeconds: offsetSeconds); if (streamUrl == null || !mounted) { - throw Exception('Failed to build stream path'); + throw PlaybackException(t.liveTv.failedToBuildStreamUrl, reason: PlaybackFailureReason.noPlayableSource); } // Track stream start epoch for position calculations @@ -141,7 +143,7 @@ extension _VideoPlayerPlaybackStartMethods on VideoPlayerScreenState { // headers were resolved there too. Just await the result. final playbackDataFuture = _playbackDataFuture; if (playbackDataFuture == null) { - throw StateError('Playback data was not prepared before playback start'); + throw PlaybackException(t.messages.playbackDataNotPrepared); } playbackContext = await playbackDataFuture; if (!mounted || player != currentPlayer) return; diff --git a/lib/screens/video_player/widgets/player_prompt_overlays.dart b/lib/screens/video_player/widgets/player_prompt_overlays.dart index 5d891a4b..59d6fa08 100644 --- a/lib/screens/video_player/widgets/player_prompt_overlays.dart +++ b/lib/screens/video_player/widgets/player_prompt_overlays.dart @@ -258,7 +258,7 @@ class _PlayNextEpisodeHeader extends StatelessWidget { return Row( children: [ Text( - 'Next Episode', + t.videoControls.nextEpisode, style: TextStyle(color: Colors.white.withValues(alpha: 0.7), fontSize: 12, fontWeight: .w500), ), if (isShuffleActive) ...[ diff --git a/lib/services/companion_remote/companion_remote_peer_service.dart b/lib/services/companion_remote/companion_remote_peer_service.dart index 758e8ab2..9f153ef6 100644 --- a/lib/services/companion_remote/companion_remote_peer_service.dart +++ b/lib/services/companion_remote/companion_remote_peer_service.dart @@ -973,7 +973,7 @@ class CompanionRemotePeerService with KeepaliveMixin { completer.completeError( RemotePeerError( type: RemotePeerErrorType.connectionFailed, - message: t.companionRemote.pairing.failedToConnect(error: 'Connection closed before authentication'), + message: t.companionRemote.pairing.failedToConnect(error: t.companionRemote.closedBeforeAuth), ), ); } diff --git a/lib/services/download_manager_service.dart b/lib/services/download_manager_service.dart index d4c015ae..8e548a64 100644 --- a/lib/services/download_manager_service.dart +++ b/lib/services/download_manager_service.dart @@ -858,10 +858,10 @@ class DownloadManagerService { ) .configureNotificationForGroup( _downloadGroup, - running: const TaskNotification('{displayName}', 'Downloading...'), - complete: const TaskNotification('{displayName}', 'Download complete'), - error: const TaskNotification('{displayName}', 'Download failed'), - paused: const TaskNotification('{displayName}', 'Download paused'), + running: TaskNotification('{displayName}', t.downloads.notificationDownloading), + complete: TaskNotification('{displayName}', t.downloads.notificationComplete), + error: TaskNotification('{displayName}', t.downloads.errorDownloadFailed), + paused: TaskNotification('{displayName}', t.downloads.notificationPaused), progressBar: true, ); @@ -2196,7 +2196,7 @@ class DownloadManagerService { case TaskStatus.failed: await _onDownloadFailed(globalKey, update.task.taskId, update.exception); case TaskStatus.notFound: - await _onDownloadPermanentlyFailed(globalKey, update.task.taskId, 'File not found (404)'); + await _onDownloadPermanentlyFailed(globalKey, update.task.taskId, t.downloads.errorFileNotFound); case TaskStatus.canceled: if (_pausingKeys.contains(globalKey) || _cancellingKeys.contains(globalKey)) break; await _onDownloadCanceled(globalKey, update.task.taskId); @@ -2339,7 +2339,7 @@ class DownloadManagerService { await _handleStorageFullFailure(globalKey, taskId); return; } - final errorMessage = exception?.description ?? 'Download failed'; + final errorMessage = exception?.description ?? t.downloads.errorDownloadFailed; final retryCount = existing.retryCount; // DNS/connection errors fail instantly and exhaust native retries in milliseconds, @@ -2585,7 +2585,11 @@ class DownloadManagerService { appLogger.i('Download completed for $globalKey'); } catch (e) { appLogger.e('Post-download processing failed for $globalKey', error: e); - await _transitionStatus(globalKey, DownloadStatus.failed, errorMessage: 'Post-processing failed: $e'); + await _transitionStatus( + globalKey, + DownloadStatus.failed, + errorMessage: t.downloads.errorPostProcessing(error: e), + ); await _database.removeFromQueue(globalKey); } finally { _completingKeys.remove(globalKey); diff --git a/lib/services/jellyfin_auth_service.dart b/lib/services/jellyfin_auth_service.dart index b00fc580..0dc39090 100644 --- a/lib/services/jellyfin_auth_service.dart +++ b/lib/services/jellyfin_auth_service.dart @@ -6,6 +6,7 @@ import 'package:http/http.dart' as http; import '../connection/connection.dart'; import '../exceptions/media_server_exceptions.dart'; +import '../i18n/strings.g.dart'; import '../media/media_browser_dialect.dart'; import '../utils/app_logger.dart'; import '../utils/media_server_http_client.dart'; @@ -143,8 +144,10 @@ class JellyfinConnectionAuthService { ), rejectedStatusCodes: const {401, 403}, rejectionMessage: 'Invalid username or password', + rejectionDisplay: t.addServer.invalidCredentials, responseLabel: 'Authentication response', notJsonMessage: 'Authentication response was not JSON', + notJsonDisplay: t.addServer.authResponseNotJson, ); return _buildConnection( @@ -209,22 +212,33 @@ class JellyfinConnectionAuthService { response = await client.post('/QuickConnect/Initiate', timeout: MediaServerTimeouts.jellyfinProbe); } if (response.statusCode == 401 || response.statusCode == 403) { - throw MediaServerAuthException('Quick Connect rejected by server', statusCode: response.statusCode); + throw MediaServerAuthException( + 'Quick Connect rejected by server', + statusCode: response.statusCode, + display: t.addServer.quickConnectRejected, + ); } throwIfHttpError(response); final data = response.data; if (data is! Map) { - throw MediaServerAuthException('Quick Connect response was not JSON'); + throw MediaServerAuthException('Quick Connect response was not JSON', display: t.addServer.quickConnectNotJson); } final code = data['Code'] as String?; final secret = data['Secret'] as String?; if (code == null || secret == null) { - throw MediaServerAuthException('Quick Connect response missing Code or Secret'); + throw MediaServerAuthException( + 'Quick Connect response missing Code or Secret', + display: t.addServer.quickConnectMissingFields, + ); } return JellyfinQuickConnectInitiation(code: code, secret: secret); } on MediaServerHttpException catch (e) { if (e.statusCode == 401 || e.statusCode == 403) { - throw MediaServerAuthException('Quick Connect rejected by server', statusCode: e.statusCode); + throw MediaServerAuthException( + 'Quick Connect rejected by server', + statusCode: e.statusCode, + display: t.addServer.quickConnectRejected, + ); } rethrow; } finally { @@ -276,7 +290,11 @@ class JellyfinConnectionAuthService { // 404 mid-poll = secret expired or revoked server-side. Terminal. if (response.statusCode == 404) throw const PollTerminatedSignal(); if (response.statusCode == 401 || response.statusCode == 403) { - throw MediaServerAuthException('Quick Connect poll rejected by server', statusCode: response.statusCode); + throw MediaServerAuthException( + 'Quick Connect poll rejected by server', + statusCode: response.statusCode, + display: t.addServer.quickConnectPollRejected, + ); } throwIfHttpError(response); final data = response.data; @@ -287,7 +305,11 @@ class JellyfinConnectionAuthService { } on MediaServerHttpException catch (e) { if (e.statusCode == 404) throw const PollTerminatedSignal(); if (e.statusCode == 401 || e.statusCode == 403) { - throw MediaServerAuthException('Quick Connect poll rejected by server', statusCode: e.statusCode); + throw MediaServerAuthException( + 'Quick Connect poll rejected by server', + statusCode: e.statusCode, + display: t.addServer.quickConnectPollRejected, + ); } // Transient network blip — let the backoff handle it. The outer // timeout is the safety net if the server is durably broken. @@ -315,8 +337,10 @@ class JellyfinConnectionAuthService { ), rejectedStatusCodes: const {400, 401, 403}, rejectionMessage: 'Quick Connect exchange rejected by server', + rejectionDisplay: t.addServer.quickConnectRejected, responseLabel: 'Quick Connect exchange', notJsonMessage: 'Quick Connect exchange response was not JSON', + notJsonDisplay: t.addServer.quickConnectNotJson, ); return _buildConnection( @@ -383,7 +407,7 @@ class JellyfinConnectionAuthService { /// implements. void _requireQuickConnectSupport() { if (!dialect.supportsQuickConnect) { - throw MediaServerAuthException('Quick Connect rejected by server'); + throw MediaServerAuthException('Quick Connect rejected by server', display: t.addServer.quickConnectRejected); } } @@ -412,19 +436,21 @@ class JellyfinConnectionAuthService { Future responseFuture, { required Set rejectedStatusCodes, required String rejectionMessage, + required String rejectionDisplay, required String responseLabel, required String notJsonMessage, + required String notJsonDisplay, }) async { try { final response = await responseFuture; if (rejectedStatusCodes.contains(response.statusCode)) { - throw MediaServerAuthException(rejectionMessage, statusCode: response.statusCode); + throw MediaServerAuthException(rejectionMessage, statusCode: response.statusCode, display: rejectionDisplay); } throwIfHttpError(response); final data = response.data; if (data is! Map) { - throw MediaServerAuthException(notJsonMessage); + throw MediaServerAuthException(notJsonMessage, display: notJsonDisplay); } final accessToken = data['AccessToken'] as String?; final user = data['User'] as Map?; @@ -447,11 +473,11 @@ class JellyfinConnectionAuthService { } on TimeoutException { // MediaServerHttpClient normally wraps timeouts, but keep raw client // implementations aligned with the same auth policy. - throw MediaServerUrlException('Server did not respond in time'); + throw MediaServerUrlException('Server did not respond in time', display: t.addServer.serverTimedOut); } on MediaServerHttpException catch (e) { final status = e.statusCode; if (status != null && rejectedStatusCodes.contains(status)) { - throw MediaServerAuthException(rejectionMessage, statusCode: status); + throw MediaServerAuthException(rejectionMessage, statusCode: status, display: rejectionDisplay); } rethrow; } diff --git a/lib/services/jellyfin_client/parts/live_tv.dart b/lib/services/jellyfin_client/parts/live_tv.dart index 2a53b4bd..c87a19e2 100644 --- a/lib/services/jellyfin_client/parts/live_tv.dart +++ b/lib/services/jellyfin_client/parts/live_tv.dart @@ -181,7 +181,7 @@ class _JellyfinLiveTvSupport implements LiveTvSupport { final firstSource = sources.first; if (firstSource is! Map) { throw PlaybackException( - '${_client.dialect.productName} returned invalid Live TV playback data', + t.liveTv.invalidPlaybackData(product: _client.dialect.productName), reason: PlaybackFailureReason.invalidPlaybackData, ); } diff --git a/lib/services/jellyfin_client/parts/playback.dart b/lib/services/jellyfin_client/parts/playback.dart index c3317b13..bcbb8b03 100644 --- a/lib/services/jellyfin_client/parts/playback.dart +++ b/lib/services/jellyfin_client/parts/playback.dart @@ -154,7 +154,7 @@ mixin _JellyfinPlaybackMethods on _JellyfinClientInternals { preferredSignature: options.preferredVersionSignature, ); if (bundle == null) { - throw PlaybackException('Item ${metadata.id} returned no MediaSources'); + throw PlaybackException(t.messages.playbackNoMediaSources, reason: PlaybackFailureReason.noPlayableSource); } var mediaInfo = jellyfinMediaSourceToMediaSourceInfo( bundle.selectedSource, diff --git a/lib/services/jellyfin_endpoint_discovery.dart b/lib/services/jellyfin_endpoint_discovery.dart index fa32259b..12d8b652 100644 --- a/lib/services/jellyfin_endpoint_discovery.dart +++ b/lib/services/jellyfin_endpoint_discovery.dart @@ -2,6 +2,8 @@ import 'dart:async'; import 'package:http/http.dart' as http; +import '../i18n/strings.g.dart'; + import '../exceptions/media_server_exceptions.dart'; import '../media/media_browser_dialect.dart'; import '../utils/endpoint_race.dart'; @@ -141,12 +143,15 @@ class JellyfinEndpointDiscovery { } final data = response.data; if (data is! Map) { - throw MediaServerUrlException('Server response was not JSON'); + throw MediaServerUrlException('Server response was not JSON', display: t.addServer.responseNotJson); } final id = data['Id']; final name = data['ServerName'] ?? data['LocalAddress']; if (id is! String || name is! String) { - throw MediaServerUrlException('Server response missing Id/ServerName — not a ${dialect.productName} server?'); + throw MediaServerUrlException( + 'Server response missing Id/ServerName — not a ${dialect.productName} server?', + display: t.addServer.responseMissingIdentity(product: dialect.productName), + ); } return ( serverInfo: JellyfinServerInfo( @@ -161,11 +166,14 @@ class JellyfinEndpointDiscovery { rethrow; } on MediaServerHttpException catch (e) { if (e.isCancellation) rethrow; - throw MediaServerUrlException('Server probe failed: ${e.message}'); + throw MediaServerUrlException( + 'Server probe failed: ${e.message}', + display: t.addServer.probeFailed(error: e.message), + ); } on TimeoutException { - throw MediaServerUrlException('Server did not respond in time'); + throw MediaServerUrlException('Server did not respond in time', display: t.addServer.serverTimedOut); } catch (e) { - throw MediaServerUrlException('Server probe failed: $e'); + throw MediaServerUrlException('Server probe failed: $e', display: t.addServer.probeFailed(error: e)); } finally { client.close(); } @@ -186,7 +194,10 @@ class JellyfinEndpointDiscovery { }) async { final urls = normalizeBaseUrls(baseUrls); if (urls.isEmpty) { - throw MediaServerUrlException('Enter at least one ${dialect.productName} server URL'); + throw MediaServerUrlException( + 'Enter at least one ${dialect.productName} server URL', + display: t.addServer.enterAtLeastOneUrl(product: dialect.productName), + ); } final persistUrls = baseUrlsToPersist == null ? urls : normalizeBaseUrls(baseUrlsToPersist); @@ -243,7 +254,10 @@ class JellyfinEndpointDiscovery { final selected = bestSelection ?? firstSelection; if (selected == null || selected.result.serverInfo == null) { - throw MediaServerUrlException('No reachable ${dialect.productName} server found'); + throw MediaServerUrlException( + 'No reachable ${dialect.productName} server found', + display: t.addServer.noReachableServer(product: dialect.productName), + ); } final Map successfulResults = @@ -267,7 +281,10 @@ class JellyfinEndpointDiscovery { final selectedInfo = selectedResult.serverInfo; if (selectedInfo == null) { - throw MediaServerUrlException('No reachable ${dialect.productName} server found'); + throw MediaServerUrlException( + 'No reachable ${dialect.productName} server found', + display: t.addServer.noReachableServer(product: dialect.productName), + ); } final expected = hasExpectedMachineId ? expectedMachineIdTrimmed! : selectedInfo.machineId; @@ -281,7 +298,10 @@ class JellyfinEndpointDiscovery { final candidate = _selectValidationCandidate(groupResults, expectedMachineId: expectedMachineIdTrimmed); final info = candidate == null ? null : groupResults[candidate]?.serverInfo; if (info != null && info.machineId != expected) { - throw MediaServerUrlException('The URLs point to different ${dialect.productName} servers'); + throw MediaServerUrlException( + 'The URLs point to different ${dialect.productName} servers', + display: t.addServer.urlsPointToDifferentServers(product: dialect.productName), + ); } } } @@ -290,13 +310,19 @@ class JellyfinEndpointDiscovery { if (!validateUrlSet.contains(entry.key.url)) continue; final info = entry.value.serverInfo; if (info != null && info.machineId != expected) { - throw MediaServerUrlException('The URLs point to different ${dialect.productName} servers'); + throw MediaServerUrlException( + 'The URLs point to different ${dialect.productName} servers', + display: t.addServer.urlsPointToDifferentServers(product: dialect.productName), + ); } } } if (selectedInfo.machineId != expected) { - throw MediaServerUrlException('The URL does not match this ${dialect.productName} server'); + throw MediaServerUrlException( + 'The URL does not match this ${dialect.productName} server', + display: t.addServer.urlDoesNotMatchServer(product: dialect.productName), + ); } final effectiveUrls = {}; @@ -415,21 +441,29 @@ class JellyfinEndpointDiscovery { if (requestedBaseUri == null || requestedBaseUri.host.isEmpty || (effectiveScheme != 'http' && effectiveScheme != 'https')) { - throw MediaServerUrlException('Server redirected to an unsupported URL'); + throw MediaServerUrlException( + 'Server redirected to an unsupported URL', + display: t.addServer.redirectUnsupported, + ); } if (requestedBaseUri.host.toLowerCase() != effectiveUri.host.toLowerCase()) { throw MediaServerUrlException( 'Server redirected to a different host. Enter the final ${dialect.productName} URL directly', + display: t.addServer.redirectDifferentHost(product: dialect.productName), ); } if (requestedBaseUri.scheme.toLowerCase() == 'https' && effectiveScheme != 'https') { - throw MediaServerUrlException('Server redirected from HTTPS to an insecure URL'); + throw MediaServerUrlException( + 'Server redirected from HTTPS to an insecure URL', + display: t.addServer.redirectInsecure, + ); } const publicInfoPath = '/System/Info/Public'; if (!effectiveUri.path.endsWith(publicInfoPath)) { throw MediaServerUrlException( 'Server redirected to an unsupported URL. Enter the final ${dialect.productName} URL directly', + display: t.addServer.redirectUnsupportedEnterFinal(product: dialect.productName), ); } final basePath = effectiveUri.path.substring(0, effectiveUri.path.length - publicInfoPath.length); diff --git a/lib/services/music/music_playback_service_impl.dart b/lib/services/music/music_playback_service_impl.dart index 41c49013..cfd3c4ed 100644 --- a/lib/services/music/music_playback_service_impl.dart +++ b/lib/services/music/music_playback_service_impl.dart @@ -6,6 +6,7 @@ import 'package:flutter/widgets.dart'; import 'package:os_media_controls/os_media_controls.dart'; import '../../database/app_database.dart'; +import '../../i18n/strings.g.dart'; import '../../media/ids.dart'; import '../../media/lyrics.dart'; import '../../media/media_item.dart'; @@ -22,6 +23,7 @@ import '../media_controls_manager.dart'; import '../multi_server_manager.dart'; import '../offline_watch_sync_service.dart'; import '../playback_coordinator.dart'; +import '../playback_initialization_service.dart'; import '../playback_progress_tracker.dart'; import '../settings_service.dart'; import 'music_playback_service.dart'; @@ -293,7 +295,9 @@ class MusicPlaybackServiceImpl extends MusicPlaybackService with WidgetsBindingO final client = _clientFor(seed); if (client == null) { if (isPlayIntentCurrent(intent)) { - _errorsController.add(StateError('No server available for instant mix')); + _errorsController.add( + PlaybackException(t.music.instantMixNoServer, reason: PlaybackFailureReason.serverUnavailable), + ); } return; } diff --git a/lib/services/music/music_source_resolver.dart b/lib/services/music/music_source_resolver.dart index 6d566e0f..13da8e4a 100644 --- a/lib/services/music/music_source_resolver.dart +++ b/lib/services/music/music_source_resolver.dart @@ -1,4 +1,5 @@ import '../../database/app_database.dart'; +import '../../i18n/strings.g.dart'; import '../../media/media_item.dart'; import '../../media/media_server_client.dart'; import '../../media/media_source_info.dart'; @@ -82,7 +83,10 @@ class ServerMusicSourceResolver implements MusicSourceResolver { final result = context.result; final url = result.videoUrl; if (url == null) { - throw PlaybackException('No audio URL available for ${track.title ?? track.id}'); + throw PlaybackException( + t.music.noAudioUrl(track: track.title ?? track.id), + reason: PlaybackFailureReason.noPlayableSource, + ); } return MusicSource( diff --git a/lib/services/playback_initialization_service.dart b/lib/services/playback_initialization_service.dart index f4125a3c..ad759788 100644 --- a/lib/services/playback_initialization_service.dart +++ b/lib/services/playback_initialization_service.dart @@ -2,6 +2,7 @@ import 'dart:io'; import '../media/ids.dart'; import 'package:path/path.dart' as p; +import '../i18n/strings.g.dart'; import '../database/app_database.dart'; import '../media/media_item.dart'; @@ -142,7 +143,9 @@ class PlaybackInitializationService { ); } - if (client == null) throw PlaybackException('No video URL available'); + if (client == null) { + throw PlaybackException(t.messages.noVideoUrl, reason: PlaybackFailureReason.noPlayableSource); + } PlaybackInitializationResult result; try { @@ -245,7 +248,7 @@ class PlaybackInitializationService { sourceStreamId: trackId, track: SubtitleTrack.uri( Uri.file(entity.path).toString(), - title: cachedTrack?.displayTitle ?? cachedTrack?.language ?? 'Subtitle $fileName', + title: cachedTrack?.displayTitle ?? cachedTrack?.language ?? t.videoControls.subtitleFile(name: fileName), language: cachedTrack?.languageCode, codec: cachedTrack?.codec, isDefault: cachedTrack?.selected ?? false, diff --git a/lib/services/plex_auth_service.dart b/lib/services/plex_auth_service.dart index 9b138ce4..35318e67 100644 --- a/lib/services/plex_auth_service.dart +++ b/lib/services/plex_auth_service.dart @@ -5,6 +5,7 @@ import 'package:package_info_plus/package_info_plus.dart'; import 'storage_service.dart'; import 'plex_client.dart'; import '../exceptions/media_server_exceptions.dart'; +import '../i18n/strings.g.dart'; import '../models/plex/plex_user_profile.dart'; import '../models/plex/plex_home.dart'; import '../models/plex/plex_home_user.dart'; @@ -179,7 +180,11 @@ class PlexAuthService { throw const MediaServerPinExpiredException(); } if (response.statusCode == 401 || response.statusCode == 403) { - throw MediaServerAuthException('Plex PIN check rejected', statusCode: response.statusCode); + throw MediaServerAuthException( + 'Plex PIN check rejected', + statusCode: response.statusCode, + display: t.auth.pinCheckRejected, + ); } _checkStatus(response); diff --git a/lib/services/plex_client.dart b/lib/services/plex_client.dart index 5ed2a32f..8ae54ed6 100644 --- a/lib/services/plex_client.dart +++ b/lib/services/plex_client.dart @@ -3242,7 +3242,10 @@ class PlexClient ); final machineIdentifier = _getMediaContainer(identityResponse)?['machineIdentifier']?.toString(); if (machineIdentifier != serverId) { - throw MediaServerUrlException('Plex profile token resolved to an unexpected server identity'); + throw MediaServerUrlException( + 'Plex profile token resolved to an unexpected server identity', + display: t.profiles.tokenIdentityMismatch, + ); } if (generation != _profileUpdateGeneration) return false; @@ -3770,7 +3773,7 @@ class PlexClient SubtitleTrack _subtitleTrackFromMediaTrack(MediaSubtitleTrack track, String url) { return SubtitleTrack( id: 'external:$url', - title: track.displayTitle ?? track.title ?? track.language ?? 'Track ${track.id}', + title: track.displayTitle ?? track.title ?? track.language ?? t.videoControls.subtitleTrack(n: track.id), language: track.languageCode, codec: track.codec, isDefault: track.selected, @@ -3841,7 +3844,11 @@ class PlexClient sourceStreamId: plexTrack.id, track: SubtitleTrack.uri( url, - title: plexTrack.displayTitle ?? plexTrack.title ?? plexTrack.language ?? 'Track ${plexTrack.id}', + title: + plexTrack.displayTitle ?? + plexTrack.title ?? + plexTrack.language ?? + t.videoControls.subtitleTrack(n: plexTrack.id), language: plexTrack.languageCode, codec: plexTrack.codec, isDefault: plexTrack.selected, diff --git a/lib/services/plex_mappers.dart b/lib/services/plex_mappers.dart index 55e07945..c80ea492 100644 --- a/lib/services/plex_mappers.dart +++ b/lib/services/plex_mappers.dart @@ -14,6 +14,7 @@ import 'package:json_annotation/json_annotation.dart'; import '../media/ids.dart'; import 'package:sentry_flutter/sentry_flutter.dart'; +import '../i18n/strings.g.dart'; import '../media/media_backend.dart'; import '../media/media_display_criteria.dart'; @@ -238,7 +239,7 @@ List _mediaPartsFromReadValue(Object? raw) { } String _hubTitleFromJson(Object? raw) { - final title = raw as String? ?? 'Unknown'; + final title = raw as String? ?? t.common.unknown; return kBlurArtwork ? obfuscateText(title) : title; } diff --git a/lib/services/seerr/seerr_auth_service.dart b/lib/services/seerr/seerr_auth_service.dart index 59d028fe..169b5639 100644 --- a/lib/services/seerr/seerr_auth_service.dart +++ b/lib/services/seerr/seerr_auth_service.dart @@ -1,5 +1,6 @@ import 'package:http/http.dart' as http; +import '../../i18n/strings.g.dart'; import '../../models/seerr/seerr_public_settings.dart'; import '../../models/seerr/seerr_session.dart'; import '../../models/seerr/seerr_user.dart'; @@ -29,15 +30,21 @@ class SeerrAuthService { try { res = await client.send('GET', '/settings/public', timeout: SeerrConstants.probeTimeout, authenticated: false); } catch (e) { - throw SeerrUrlException('Could not reach $baseUrl: $e'); + throw SeerrUrlException( + 'Could not reach $baseUrl: $e', + display: t.seerr.couldNotReach(url: baseUrl, error: e), + ); } final data = res.data; if (res.statusCode >= 400 || data is! Map) { - throw SeerrUrlException('No Seerr instance at $baseUrl (HTTP ${res.statusCode})'); + throw SeerrUrlException( + 'No Seerr instance at $baseUrl (HTTP ${res.statusCode})', + display: t.seerr.noInstanceAtUrl(url: baseUrl, status: res.statusCode), + ); } final settings = SeerrPublicSettings.fromJson(data); if (!settings.initialized) { - throw const SeerrUrlException('Seerr instance has not completed first-run setup'); + throw SeerrUrlException('Seerr instance has not completed first-run setup', display: t.seerr.notInitialized); } return settings; } finally { @@ -98,7 +105,10 @@ class SeerrAuthService { // must not unlink the session. An empty stored secret below is the // opposite: those credentials are gone for good, so re-linking is the // only way forward and unlinking is honest. - SeerrAuthMethod.plex => throw const SeerrReauthUnavailableException('No Plex token available for silent re-auth'), + SeerrAuthMethod.plex => throw SeerrReauthUnavailableException( + 'No Plex token available for silent re-auth', + display: t.seerr.noPlexTokenForReauth, + ), SeerrAuthMethod.jellyfin || SeerrAuthMethod.emby when session.secret.isNotEmpty => signInWithJellyfin( baseUrl: session.baseUrl, username: session.identifier, @@ -110,7 +120,7 @@ class SeerrAuthService { email: session.identifier, password: session.secret, ), - _ => throw const SeerrAuthException('No stored credentials for silent re-auth'), + _ => throw SeerrAuthException('No stored credentials for silent re-auth', display: t.seerr.noStoredCredentials), }; return session.copyWith(cookie: fresh.cookie, permissions: fresh.permissions, displayName: fresh.displayName); } @@ -148,11 +158,15 @@ class SeerrAuthService { final message = res.data is Map ? (res.data as Map)['message'] as String? : null; - throw SeerrAuthException(message ?? 'Sign-in rejected', statusCode: res.statusCode); + throw SeerrAuthException( + message ?? 'Sign-in rejected', + statusCode: res.statusCode, + display: t.seerr.signInRejected, + ); } SeerrHttpClient.throwForStatus(res); if (!client.captureSessionCookie(res.response)) { - throw const SeerrAuthException('Seerr did not issue a session cookie'); + throw SeerrAuthException('Seerr did not issue a session cookie', display: t.seerr.noSessionCookie); } final user = await _resolveUser(client, res.data); return SeerrSession( @@ -187,11 +201,15 @@ class SeerrAuthService { // here it means the fresh cookie was rejected — an auth failure, not a // malformed-user-payload crash further down. if (res.statusCode == 401 || res.statusCode == 403) { - throw SeerrAuthException('Seerr rejected the fresh session cookie', statusCode: res.statusCode); + throw SeerrAuthException( + 'Seerr rejected the fresh session cookie', + statusCode: res.statusCode, + display: t.seerr.freshCookieRejected, + ); } SeerrHttpClient.throwForStatus(res); final data = res.data; if (data is Map) return SeerrUser.fromJson(data); - throw const SeerrAuthException('Seerr did not return user information'); + throw SeerrAuthException('Seerr did not return user information', display: t.seerr.noUserInformation); } } diff --git a/lib/services/seerr/seerr_client.dart b/lib/services/seerr/seerr_client.dart index c3c2a0f4..bf0a5ab1 100644 --- a/lib/services/seerr/seerr_client.dart +++ b/lib/services/seerr/seerr_client.dart @@ -211,7 +211,11 @@ class SeerrClient { res = await _http.send(method, path, query: query, body: body); if (res.statusCode == 401) { onSessionInvalidated(); - throw const SeerrAuthException('Session rejected after successful re-auth', statusCode: 401); + throw SeerrAuthException( + 'Session rejected after successful re-auth', + statusCode: 401, + display: t.seerr.sessionRejectedAfterReauth, + ); } } SeerrHttpClient.throwForStatus(res); diff --git a/lib/services/seerr/seerr_exceptions.dart b/lib/services/seerr/seerr_exceptions.dart index 81cb8962..512d0849 100644 --- a/lib/services/seerr/seerr_exceptions.dart +++ b/lib/services/seerr/seerr_exceptions.dart @@ -1,7 +1,11 @@ /// The URL doesn't point at a reachable, initialized Seerr instance. +/// +/// [message] is English for stable logs and Sentry grouping. [display] is the +/// localized user-facing text when this failure is rendered in the UI. class SeerrUrlException implements Exception { final String message; - const SeerrUrlException(this.message); + final String? display; + const SeerrUrlException(this.message, {this.display}); @override String toString() => 'SeerrUrlException: $message'; @@ -10,10 +14,14 @@ class SeerrUrlException implements Exception { /// Sign-in or session-refresh failure (bad credentials, revoked session). /// [SeerrClient] treats this during re-auth as "the server rejected the /// stored credentials" and unlinks the session. +/// +/// [message] is English for stable logs and Sentry grouping. [display] is the +/// localized user-facing text when this failure is rendered in the UI. class SeerrAuthException implements Exception { final String message; + final String? display; final int? statusCode; - const SeerrAuthException(this.message, {this.statusCode}); + const SeerrAuthException(this.message, {this.statusCode, this.display}); @override String toString() => 'SeerrAuthException: $message${statusCode == null ? '' : ' ($statusCode)'}'; @@ -23,9 +31,13 @@ class SeerrAuthException implements Exception { /// resolvable right now (e.g. the live Plex token supplier came up empty /// during a degraded launch). Deliberately not a [SeerrAuthException]: /// the failure is retryable and must not unlink the stored session. +/// +/// [message] is English for stable logs and Sentry grouping. [display] is the +/// localized user-facing text when this failure is rendered in the UI. class SeerrReauthUnavailableException implements Exception { final String message; - const SeerrReauthUnavailableException(this.message); + final String? display; + const SeerrReauthUnavailableException(this.message, {this.display}); @override String toString() => 'SeerrReauthUnavailableException: $message'; diff --git a/lib/services/settings_export_service.dart b/lib/services/settings_export_service.dart index 86f45dbe..a1ea3608 100644 --- a/lib/services/settings_export_service.dart +++ b/lib/services/settings_export_service.dart @@ -11,6 +11,7 @@ import 'package:path_provider/path_provider.dart'; import 'package:shared_preferences/shared_preferences.dart'; import '../models/shader_preset.dart'; +import '../i18n/strings.g.dart'; import '../utils/app_logger.dart'; import '../utils/formatters.dart'; import '../utils/platform_detector.dart'; @@ -384,7 +385,7 @@ class SettingsExportService { } return FilePickerService.instance.saveFile( - dialogTitle: 'Export Plezy settings', + dialogTitle: t.settings.exportDialogTitle, fileName: fileName, bytes: bytes, type: FileType.custom, diff --git a/lib/services/track_manager.dart b/lib/services/track_manager.dart index d8b6e9d0..ea870733 100644 --- a/lib/services/track_manager.dart +++ b/lib/services/track_manager.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'package:flutter/foundation.dart'; +import '../i18n/strings.g.dart'; import '../mpv/mpv.dart'; import '../media/media_item.dart'; @@ -452,8 +453,16 @@ class TrackManager { if (isActive()) { final label = next.id == 'no' - ? 'Subtitles: Off' - : 'Subtitles: ${TrackLabelBuilder.subtitleLabel(title: next.title, language: next.language, codec: next.codec, forced: next.isForced, index: nextIndex).joined}'; + ? t.videoControls.osdSubtitlesOff + : t.videoControls.osdSubtitles( + track: TrackLabelBuilder.subtitleLabel( + title: next.title, + language: next.language, + codec: next.codec, + forced: next.isForced, + index: nextIndex, + ).joined, + ); showMessage?.call(label, duration: const Duration(seconds: 1)); } return next; @@ -472,8 +481,15 @@ class TrackManager { unawaited(onAudioTrackSelectedByUser(next)); if (isActive()) { - final label = - 'Audio: ${TrackLabelBuilder.audioLabel(title: next.title, language: next.language, codec: next.codec, channels: next.channelsCount, index: nextIndex).joined}'; + final label = t.videoControls.osdAudio( + track: TrackLabelBuilder.audioLabel( + title: next.title, + language: next.language, + codec: next.codec, + channels: next.channelsCount, + index: nextIndex, + ).joined, + ); showMessage?.call(label, duration: const Duration(seconds: 1)); } } diff --git a/lib/utils/codec_utils.dart b/lib/utils/codec_utils.dart index 7d587c23..e686fa57 100644 --- a/lib/utils/codec_utils.dart +++ b/lib/utils/codec_utils.dart @@ -1,3 +1,5 @@ +import '../i18n/strings.g.dart'; + /// Utility class for codec-related operations. /// /// Provides centralized codec name mappings, file extension lookups, @@ -107,8 +109,8 @@ class CodecUtils { static String? formatAudioChannels(int? channels) { if (channels == null || channels <= 0) return null; return switch (channels) { - 1 => 'Mono', - 2 => 'Stereo', + 1 => t.fileInfo.channelsMono, + 2 => t.videoSettings.audioOutputStereo, 3 => '3.0', 4 => '4.0', 5 => '4.1', diff --git a/lib/utils/live_tv_grouping.dart b/lib/utils/live_tv_grouping.dart index 6866ac8d..ea175721 100644 --- a/lib/utils/live_tv_grouping.dart +++ b/lib/utils/live_tv_grouping.dart @@ -1,3 +1,4 @@ +import '../i18n/strings.g.dart'; import '../models/livetv_channel.dart'; import 'live_tv_matching.dart'; @@ -52,7 +53,7 @@ String liveTvChannelSourceKey(LiveTvChannel channel) { } String liveTvChannelSourceLabel(LiveTvChannel channel) { - final serverLabel = liveTvNonEmpty(channel.serverName) ?? liveTvNonEmpty(channel.serverId) ?? 'Live TV'; + final serverLabel = liveTvNonEmpty(channel.serverName) ?? liveTvNonEmpty(channel.serverId) ?? t.liveTv.title; final sourceTitle = liveTvNonEmpty(channel.liveTvSourceTitle); if (sourceTitle == null || sourceTitle == serverLabel) return serverLabel; return '$serverLabel - $sourceTitle'; diff --git a/lib/utils/track_label_builder.dart b/lib/utils/track_label_builder.dart index dc73ae40..34ab0087 100644 --- a/lib/utils/track_label_builder.dart +++ b/lib/utils/track_label_builder.dart @@ -1,3 +1,5 @@ +import '../i18n/strings.g.dart'; + import 'codec_utils.dart'; import 'language_codes.dart'; @@ -143,7 +145,7 @@ class TrackLabelBuilder { displayTitle: cleanTrackMetadataValue(displayTitle), rawLanguageValues: [language, languageCode], techParts: tech, - fallbackPrefix: 'Audio Track', + fallbackLabel: (n) => t.audioTracks.track(n: n), index: index, ); } @@ -164,13 +166,13 @@ class TrackLabelBuilder { displayTitle: cleanSubtitleTitle(displayTitle, codec: codec), rawLanguageValues: [language, languageCode], techParts: [if (codec != null && codec.isNotEmpty) CodecUtils.formatSubtitleCodec(codec)], - fallbackPrefix: 'Track', + fallbackLabel: (n) => t.videoControls.subtitleTrack(n: n), index: index, forced: forced || titleSaysForced(cleanedTitle), ); } - /// Primary ladder: language → title → displayTitle → `' N'`. The + /// Primary ladder: language → title → displayTitle → localized fallback. The /// title joins the secondary line only when the language took the primary /// slot and the title says more than the language/forced flag already do. static TrackLabel _compose({ @@ -179,7 +181,7 @@ class TrackLabelBuilder { required String? displayTitle, required List rawLanguageValues, required List techParts, - required String fallbackPrefix, + required String Function(int number) fallbackLabel, required int index, bool forced = false, }) { @@ -197,11 +199,11 @@ class TrackLabelBuilder { } else if (displayTitle != null) { primary = displayTitle; } else { - primary = '$fallbackPrefix ${index + 1}'; + primary = fallbackLabel(index + 1); } if (forced && !titleSaysForced(primary)) { - primary = '$primary (Forced)'; + primary = t.videoControls.forcedTrack(label: primary); } final secondaryParts = [?secondaryTitle, ...techParts]; diff --git a/lib/watch_together/providers/watch_together_provider.dart b/lib/watch_together/providers/watch_together_provider.dart index c35565f0..582197e6 100644 --- a/lib/watch_together/providers/watch_together_provider.dart +++ b/lib/watch_together/providers/watch_together_provider.dart @@ -5,6 +5,7 @@ import 'dart:math'; import 'package:flutter/foundation.dart'; import '../../mpv/mpv.dart'; +import '../../i18n/strings.g.dart'; import '../../utils/app_logger.dart'; import '../models/playback_state.dart'; import '../models/sync_message.dart'; @@ -47,7 +48,7 @@ class WatchTogetherProvider with ChangeNotifier { bool _isWaitingForPeers = false; List _waitingOnPeerIds = const []; PlaybackPhase? _playbackPhase; - String _displayName = 'User'; + String _displayName = t.watchTogether.defaultDisplayName; final CurrentPlaybackDispatcher _playbackDispatcher = CurrentPlaybackDispatcher(); // Coalesce rapid-fire notifyListeners() calls into a single rebuild per frame. diff --git a/lib/widgets/bottom_sheet_header.dart b/lib/widgets/bottom_sheet_header.dart index c282d164..9e393b58 100644 --- a/lib/widgets/bottom_sheet_header.dart +++ b/lib/widgets/bottom_sheet_header.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 'overlay_sheet.dart'; @@ -103,6 +104,7 @@ class BottomSheetHeader extends StatelessWidget { ExcludeFocusTraversal( child: IconButton( focusNode: closeFocusNode, + tooltip: t.common.close, icon: AppIcon(Symbols.close_rounded, fill: 1, color: iconColor), onPressed: onClose ?? () => OverlaySheetController.closeAdaptive(context), ), diff --git a/lib/widgets/download_tree_view.dart b/lib/widgets/download_tree_view.dart index 989ce6ad..d7b7cd96 100644 --- a/lib/widgets/download_tree_view.dart +++ b/lib/widgets/download_tree_view.dart @@ -171,7 +171,7 @@ class _DownloadTreeViewState extends State { // Get show metadata from first episode final firstEpisode = widget.metadata[episodes.first.key]; - final showTitle = firstEpisode?.grandparentTitle ?? 'Unknown Show'; + final showTitle = firstEpisode?.grandparentTitle ?? t.downloads.unknownShow; // Group episodes by season final Map>> seasonGroups = {}; @@ -199,7 +199,7 @@ class _DownloadTreeViewState extends State { ? firstEpisode!.parentTitle! : seasonNumber != null ? t.common.seasonNumber(number: seasonNumber) - : 'Unknown Season'; + : t.downloads.unknownSeason; // Build episode nodes final List episodeNodes = []; @@ -289,7 +289,7 @@ class _DownloadTreeViewState extends State { // Album/artist names from any track's parent fields final firstTrack = widget.metadata[tracks.first.key]; - final albumTitle = firstTrack?.albumTitle ?? 'Unknown Album'; + final albumTitle = firstTrack?.albumTitle ?? t.downloads.unknownAlbum; final artistTitle = firstTrack?.albumArtistTitle; final albumNodeTitle = artistTitle != null && artistTitle.isNotEmpty ? '$artistTitle - $albumTitle' : albumTitle; @@ -779,7 +779,7 @@ class _DownloadTreeItemState extends State<_DownloadTreeItem> { String _getNodeSummary() { final total = widget.node.children.length; final completed = widget.node.completedChildrenCount; - return '$completed/$total completed'; + return t.downloads.completedOfTotal(completed: completed, total: total); } /// The actions this row offers, in render order. Single source of truth: diff --git a/lib/widgets/tv_color_picker.dart b/lib/widgets/tv_color_picker.dart index 29cfd1f0..f808c8d9 100644 --- a/lib/widgets/tv_color_picker.dart +++ b/lib/widgets/tv_color_picker.dart @@ -144,7 +144,7 @@ class _TvColorPickerState extends State with ControllerDisposerMi ), const SizedBox(height: 16), _channelRow( - label: 'H', + label: t.accessibility.hueShort, semanticLabel: Translations.of(context).accessibility.hue, value: _hue, max: 360, @@ -157,7 +157,7 @@ class _TvColorPickerState extends State with ControllerDisposerMi ), const SizedBox(height: 8), _channelRow( - label: 'S', + label: t.accessibility.saturationShort, semanticLabel: Translations.of(context).accessibility.saturation, value: _saturation, max: 100, @@ -169,7 +169,7 @@ class _TvColorPickerState extends State with ControllerDisposerMi ), const SizedBox(height: 8), _channelRow( - label: 'V', + label: t.accessibility.valueShort, semanticLabel: Translations.of(context).accessibility.brightness, value: _value, max: 100, diff --git a/lib/widgets/tv_virtual_keyboard.dart b/lib/widgets/tv_virtual_keyboard.dart index f1597018..dd483467 100644 --- a/lib/widgets/tv_virtual_keyboard.dart +++ b/lib/widgets/tv_virtual_keyboard.dart @@ -267,7 +267,7 @@ class _TvVirtualKeyboardDialogState extends State<_TvVirtualKeyboardDialog> { List> _buildSymbolRows() { return [ [ - const _TvKey.action('ABC', _TvKeyType.symbols), + _TvKey.action(t.common.letterKeys, _TvKeyType.symbols), ..._symbols(['!', '?', r'$', '%', '^', '*', '+', '=', '~']), const _TvKey.action('Del', _TvKeyType.backspace, icon: Symbols.backspace_rounded), const _TvKey.spacer(), diff --git a/lib/widgets/video_controls/sheets/video_settings_sheet.dart b/lib/widgets/video_controls/sheets/video_settings_sheet.dart index 594a6938..95e5e162 100644 --- a/lib/widgets/video_controls/sheets/video_settings_sheet.dart +++ b/lib/widgets/video_controls/sheets/video_settings_sheet.dart @@ -602,7 +602,7 @@ class _VideoSettingsSheetState extends State { case _SettingsView.shader: return t.shaders.title; case _SettingsView.dvConversion: - return 'DV Conversion Mode'; + return t.settings.dvConversionMode; case _SettingsView.hdrToneMapping: return t.videoSettings.hdrToneMapping; } 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 d2fb5b2c..776226da 100644 --- a/lib/widgets/video_controls/widgets/performance_overlay/performance_overlay.dart +++ b/lib/widgets/video_controls/widgets/performance_overlay/performance_overlay.dart @@ -52,9 +52,9 @@ class _PlayerPerformanceOverlayState extends State { final sections = [ _buildSection(Symbols.videocam_rounded, t.fileInfo.video, [ - _metric(t.fileInfo.codec, _stats.videoCodec ?? 'N/A'), + _metric(t.fileInfo.codec, _stats.videoCodec ?? t.common.notAvailable), _metric(t.fileInfo.resolution, _stats.resolution), - if (_stats.hasValidVideoFps) _metric('FPS', _stats.videoFpsFormatted), + if (_stats.hasValidVideoFps) _metric(t.performanceOverlay.fps, _stats.videoFpsFormatted), 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), @@ -69,19 +69,19 @@ class _PlayerPerformanceOverlayState extends State { _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'), + _metric(t.fileInfo.channels, _stats.audioChannels ?? t.common.notAvailable), 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, t.performanceOverlay.color, [ - _metric(t.performanceOverlay.pixelFormat, _stats.pixelformat ?? 'N/A'), + _metric(t.performanceOverlay.pixelFormat, _stats.pixelformat ?? t.common.notAvailable), if (_stats.hwPixelformat != null && _stats.hwPixelformat != _stats.pixelformat) _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'), + _metric(t.performanceOverlay.matrix, _stats.colormatrix ?? t.common.notAvailable), + _metric(t.performanceOverlay.primaries, _stats.primaries ?? t.common.notAvailable), + _metric(t.performanceOverlay.transfer, _stats.gamma ?? t.common.notAvailable), ]), _buildSection(Symbols.speed_rounded, t.performanceOverlay.performance, [ if (isMpv) _metric(t.performanceOverlay.renderFps, _stats.actualFpsFormatted), @@ -94,7 +94,7 @@ class _PlayerPerformanceOverlayState extends State { _metric(t.performanceOverlay.dvSampleAverage, _stats.dvAvgSampleProcessingFormatted), ]), if (_stats.hasHdrMetadata) - _buildSection(Symbols.hdr_on_rounded, 'HDR', [ + _buildSection(Symbols.hdr_on_rounded, t.videoSettings.hdr, [ 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), diff --git a/lib/widgets/video_controls/widgets/performance_overlay/performance_stats.dart b/lib/widgets/video_controls/widgets/performance_overlay/performance_stats.dart index bfddad77..16b8f3dc 100644 --- a/lib/widgets/video_controls/widgets/performance_overlay/performance_stats.dart +++ b/lib/widgets/video_controls/widgets/performance_overlay/performance_stats.dart @@ -1,3 +1,5 @@ +import '../../../../i18n/strings.g.dart'; + /// Data model for video player performance statistics. /// /// Contains metrics queried from the video player (MPV or ExoPlayer) @@ -178,13 +180,13 @@ class PerformanceStats { /// Format video resolution as "WxH". String get resolution { - if (videoWidth == null || videoHeight == null) return 'N/A'; + if (videoWidth == null || videoHeight == null) return t.common.notAvailable; return '${videoWidth}x$videoHeight'; } /// Format video bitrate in Mbps. String get videoBitrateFormatted { - if (videoBitrate == null || videoBitrate == 0) return 'N/A'; + if (videoBitrate == null || videoBitrate == 0) return t.common.notAvailable; final mbps = videoBitrate! / 1_000_000; return '${mbps.toStringAsFixed(1)} Mbps'; } @@ -193,7 +195,7 @@ class PerformanceStats { /// The smaller one binds, so showing both explains a duration setting that /// appears to have no effect on high-bitrate media. String get bufferLimitsFormatted { - if (bufferMaxMs == null || bufferMaxMs! <= 0) return 'N/A'; + if (bufferMaxMs == null || bufferMaxMs! <= 0) return t.common.notAvailable; final duration = '${bufferMaxMs! ~/ 1000}s'; if (bufferTargetBytes == null) return duration; final targetBufferMb = bufferTargetBytes! ~/ (1024 * 1024); @@ -202,67 +204,67 @@ class PerformanceStats { /// Format audio bitrate in kbps. String get audioBitrateFormatted { - if (audioBitrate == null || audioBitrate == 0) return 'N/A'; + if (audioBitrate == null || audioBitrate == 0) return t.common.notAvailable; final kbps = audioBitrate! / 1000; return '${kbps.toStringAsFixed(0)} kbps'; } /// Format audio sample rate in kHz. String get sampleRateFormatted { - if (audioSamplerate == null) return 'N/A'; + if (audioSamplerate == null) return t.common.notAvailable; final khz = audioSamplerate! / 1000; return '${khz.toStringAsFixed(1)} kHz'; } /// Format FPS with 2 decimal places. String get actualFpsFormatted { - if (actualFps == null) return 'N/A'; + if (actualFps == null) return t.common.notAvailable; return actualFps!.toStringAsFixed(2); } /// Format source FPS with 2 decimal places. String get videoFpsFormatted { - if (videoFps == null) return 'N/A'; + if (videoFps == null) return t.common.notAvailable; return videoFps!.toStringAsFixed(2); } /// Format A/V sync in milliseconds. String get avsyncFormatted { - if (avsyncChange == null) return 'N/A'; + if (avsyncChange == null) return t.common.notAvailable; final ms = (avsyncChange! * 1000).round(); return '${ms > 0 ? '+' : ''}${ms}ms'; } /// Format cache used in MB. String get cacheUsedFormatted { - if (cacheUsed == null) return 'N/A'; + if (cacheUsed == null) return t.common.notAvailable; final mb = cacheUsed! / (1024 * 1024); return '${mb.toStringAsFixed(1)} MB'; } /// Format cache limit in MB. String get cacheLimitFormatted { - if (cacheLimit == null || cacheLimit! <= 0) return 'N/A'; + if (cacheLimit == null || cacheLimit! <= 0) return t.common.notAvailable; final mb = cacheLimit! / (1024 * 1024); return '${mb.toStringAsFixed(1)} MB'; } /// Format cache speed in MB/s. String get cacheSpeedFormatted { - if (cacheSpeed == null) return 'N/A'; + if (cacheSpeed == null) return t.common.notAvailable; final mbps = cacheSpeed! / (1024 * 1024); return '${mbps.toStringAsFixed(1)} MB/s'; } /// Format cache duration in seconds. String get cacheDurationFormatted { - if (cacheDuration == null) return 'N/A'; + if (cacheDuration == null) return t.common.notAvailable; return '${cacheDuration!.toStringAsFixed(1)}s'; } /// Format display FPS. String get displayFpsFormatted { - if (displayFps == null) return 'N/A'; + if (displayFps == null) return t.common.notAvailable; return displayFps!.toStringAsFixed(0); } @@ -280,102 +282,111 @@ class PerformanceStats { final decoder = videoDecoderName!; if (decoder.contains('c2.') || decoder.contains('OMX.') || decoder.contains('.hw.')) { // Extract a cleaner name - if (decoder.contains('c2.android.')) return 'Android HW'; - if (decoder.contains('c2.nvidia')) return 'NVIDIA HW'; - if (decoder.contains('c2.qti') || decoder.contains('c2.qcom')) return 'Qualcomm HW'; - if (decoder.contains('c2.mtk') || decoder.contains('c2.mediatek')) return 'MediaTek HW'; - if (decoder.contains('c2.exynos') || decoder.contains('c2.samsung')) return 'Exynos HW'; - if (decoder.contains('OMX.google')) return 'Software'; - return 'Hardware'; + if (decoder.contains('c2.android.')) return t.performanceOverlay.decoderAndroidHw; + if (decoder.contains('c2.nvidia')) return t.performanceOverlay.decoderNvidiaHw; + if (decoder.contains('c2.qti') || decoder.contains('c2.qcom')) { + return t.performanceOverlay.decoderQualcommHw; + } + if (decoder.contains('c2.mtk') || decoder.contains('c2.mediatek')) { + return t.performanceOverlay.decoderMediatekHw; + } + if (decoder.contains('c2.exynos') || decoder.contains('c2.samsung')) { + return t.performanceOverlay.decoderExynosHw; + } + if (decoder.contains('OMX.google')) return t.performanceOverlay.decoderSoftware; + return t.performanceOverlay.decoderHardware; } - return 'Software'; + return t.performanceOverlay.decoderSoftware; } // For MPV, use hwdec-current property if (hwdecCurrent == null || hwdecCurrent!.isEmpty || hwdecCurrent == 'no') { - return 'Software'; + return t.performanceOverlay.decoderSoftware; } return hwdecCurrent!; } /// Raw video decoder name (e.g. c2.qti.video.decoder.hevc). - String get videoDecoderRaw => videoDecoderName ?? 'N/A'; + String get videoDecoderRaw => videoDecoderName ?? t.common.notAvailable; /// Format audio decoder name for display. - String get audioDecoderFormatted => audioDecoderName ?? 'N/A'; + String get audioDecoderFormatted => audioDecoderName ?? t.common.notAvailable; /// Format tunneled playback status with reason. - String get tunneledPlaybackFormatted => tunnelingStatus ?? (tunneledPlayback ? 'Active' : 'Off'); + String get tunneledPlaybackFormatted => + tunnelingStatus ?? (tunneledPlayback ? t.performanceOverlay.tunnelingActive : t.common.off); /// Format DV conversion mode for display. String get dvConversionFormatted => dvConversionMode == 'DV81' ? '7→8.1' : '7→HEVC'; /// Format Dolby Vision source profile. - String get dvSourceProfileFormatted => dvSourceProfile == null ? 'N/A' : 'P$dvSourceProfile'; + String get dvSourceProfileFormatted => dvSourceProfile == null ? t.common.notAvailable : 'P$dvSourceProfile'; /// Format Dolby Vision playback path. - String get dvPlaybackPathFormatted => dvPlaybackPath ?? 'N/A'; + String get dvPlaybackPathFormatted => dvPlaybackPath ?? t.common.notAvailable; /// Format DV RPU conversion totals. String get dvRpuCountFormatted { final converted = dvConvertedRpus ?? 0; final failures = dvRpuConversionFailures ?? 0; - return failures > 0 ? '$converted ($failures failed)' : converted.toString(); + return failures > 0 + ? t.performanceOverlay.dvRpuFailed(converted: converted, failures: failures) + : converted.toString(); } /// Format DV conversion timing in microseconds. String get dvAvgRpuConversionFormatted { final us = dvAvgRpuConversionUs; - if (us == null || us <= 0) return 'N/A'; + if (us == null || us <= 0) return t.common.notAvailable; return '${us}us'; } /// Format DV sample processing timing in microseconds. String get dvAvgSampleProcessingFormatted { final us = dvAvgSampleProcessingUs; - if (us == null || us <= 0) return 'N/A'; + if (us == null || us <= 0) return t.common.notAvailable; return '${us}us'; } /// Format app memory usage in MB. String get appMemoryFormatted { - if (appMemoryBytes == null) return 'N/A'; + if (appMemoryBytes == null) return t.common.notAvailable; final mb = appMemoryBytes! / (1024 * 1024); return '${mb.toStringAsFixed(1)} MB'; } /// Format UI FPS with 1 decimal place. String get uiFpsFormatted { - if (uiFps == null) return 'N/A'; + if (uiFps == null) return t.common.notAvailable; return uiFps!.toStringAsFixed(1); } /// Format rotation in degrees. String get rotateFormatted { - if (rotate == null || rotate == 0) return 'N/A'; + if (rotate == null || rotate == 0) return t.common.notAvailable; return '$rotate°'; } /// Format luminance value in cd/m². String get maxLumaFormatted { - if (maxLuma == null) return 'N/A'; + if (maxLuma == null) return t.common.notAvailable; return '${maxLuma!.toStringAsFixed(0)} cd/m²'; } /// Format minimum luminance value in cd/m². String get minLumaFormatted { - if (minLuma == null) return 'N/A'; + if (minLuma == null) return t.common.notAvailable; return '${minLuma!.toStringAsFixed(4)} cd/m²'; } /// Format MaxCLL value in cd/m². String get maxCllFormatted { - if (maxCll == null) return 'N/A'; + if (maxCll == null) return t.common.notAvailable; return '${maxCll!.toStringAsFixed(0)} cd/m²'; } /// Format MaxFALL value in cd/m². String get maxFallFormatted { - if (maxFall == null) return 'N/A'; + if (maxFall == null) return t.common.notAvailable; return '${maxFall!.toStringAsFixed(0)} cd/m²'; } diff --git a/lib/widgets/video_controls/widgets/skip_marker_button.dart b/lib/widgets/video_controls/widgets/skip_marker_button.dart index 60d78ee7..b9ad9e20 100644 --- a/lib/widgets/video_controls/widgets/skip_marker_button.dart +++ b/lib/widgets/video_controls/widgets/skip_marker_button.dart @@ -3,6 +3,7 @@ import 'package:flutter/services.dart' show KeyDownEvent, LogicalKeyboardKey; import 'package:material_symbols_icons/symbols.dart'; import '../../../focus/focusable_wrapper.dart'; +import '../../../i18n/strings.g.dart'; import '../../../media/media_source_info.dart'; import '../../../theme/mono_tokens.dart'; import '../../app_icon.dart'; @@ -41,11 +42,11 @@ class SkipMarkerButton extends StatelessWidget { final showNextEpisode = creditsAtEnd && hasNextEpisode; String baseButtonText; if (showNextEpisode) { - baseButtonText = 'Next Episode'; + baseButtonText = t.videoControls.nextEpisode; } else if (isCredits) { - baseButtonText = 'Skip Credits'; + baseButtonText = t.videoControls.skipCredits; } else { - baseButtonText = 'Skip Intro'; + baseButtonText = t.videoControls.skipIntro; } final remainingSeconds = isAutoSkipActive && shouldShowAutoSkip diff --git a/lib/widgets/video_controls/widgets/track_chapter_controls.dart b/lib/widgets/video_controls/widgets/track_chapter_controls.dart index 99bbc9f0..3db1bb85 100644 --- a/lib/widgets/video_controls/widgets/track_chapter_controls.dart +++ b/lib/widgets/video_controls/widgets/track_chapter_controls.dart @@ -429,12 +429,7 @@ class TrackChapterControls extends StatelessWidget { channels: audio.channelsCount, index: visibleIndex, ); - final fallback = 'Audio Track ${visibleIndex + 1}'; - values.add( - label.primary == fallback - ? _joinTrackLabel(t.audioTracks.track(n: visibleIndex + 1), label.secondary) - : label.joined, - ); + values.add(label.joined); } final subtitle = selection.subtitle; @@ -454,10 +449,6 @@ class TrackChapterControls extends StatelessWidget { return values.isEmpty ? null : values.join(', '); } - String _joinTrackLabel(String primary, String? secondary) { - return secondary == null ? primary : '$primary · $secondary'; - } - /// Calculate total button count for navigation int _getButtonCount(bool isMobile, bool isDesktop) { final state = trackControlsState; diff --git a/scripts/check_hardcoded_strings.py b/scripts/check_hardcoded_strings.py new file mode 100755 index 00000000..da55adec --- /dev/null +++ b/scripts/check_hardcoded_strings.py @@ -0,0 +1,408 @@ +#!/usr/bin/env python3 +"""Reject common user-facing English string literals that bypass Slang. + +This is deliberately a structural check rather than a Dart/dataflow analyzer. It +cannot see English inside a ``throw`` that a screen later renders, nor a literal +assigned to a provider field that a widget later renders, because neither is +distinguishable from a log message without dataflow analysis. + +Bare ``label:`` and ``actionLabel:`` are deliberately NOT scanned. In this +codebase they overwhelmingly name a diagnostic operation rather than UI text +(``_broadcastToDvrs(actionLabel: 'Reload guide', successMessage: t....)``, +``raceEndpointCandidates(label: ...)``, ``systemShelf(label: 'Failed to ...')``), +so scanning them yields only false positives, and a check that is chronically +red is a check that gets switched off. Widget ``label:`` text is still covered +when it reaches a ``Text`` (rule 1) or mixes with ``t.`` (rule 3). +""" + +from __future__ import annotations + +import argparse +import json +import re +from dataclasses import dataclass +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[1] +LIB_DIR = ROOT / "lib" +ALLOWLIST_PATH = Path(__file__).with_name("hardcoded_strings_allowlist.json") + +_UI_ARGUMENTS = ( + "tooltip", + "semanticLabel", + "labelText", + "hintText", + "helperText", + "errorText", + "dialogTitle", +) +_UI_ARGUMENT_RE = re.compile(r"(? 'Created ...'`), so the argument name is not +# the text immediately preceding the literal. The `[a-z]Log` arm keeps +# innocent names such as `catalog:` out of the exclusion. +_DIAGNOSTIC_RE = re.compile( + r"(?:\bappLogger\.|\bSentry\.|\bassert\s*\(|\bthrow\b|(?:\blog|[a-z]Log)\s*:)" +) +_TRANSLATION_INTERPOLATION_RE = re.compile( + r"\$\{\s*(?:t\.|context\.t\b|Translations\.of\s*\()" +) +_T_PARAMETER_RE = re.compile(r"(?:\(\s*t\s*\)|\bt)\s*=>[^;]*$") +# Rule 4 support: a literal bound to a name or returned, rather than handed +# straight to a widget. This is the shape issue #1856 actually had -- +# `baseButtonText = 'Skip Intro';` a few lines above the `Text(buttonText)` +# that renders it -- which rules 1-3 structurally cannot see. +# +# Restricted to phrase-shaped literals: at least two letter-words separated by +# whitespace. Without that restriction the rule cannot tell display copy from +# the identifier strings this codebase binds constantly ('cast_row', 'auto', +# 'liveTv', 'HDR_UNSUPPORTED'), and it drowns in false positives. The cost is +# that a bound single-word label ('Software', 'Stereo') slips through; those +# are indistinguishable from an identifier without dataflow analysis. +_PHRASE_RE = re.compile(r"[A-Za-z]\s+[A-Za-z]") +_BOUND_LITERAL_RE = re.compile(r"(?:\breturn|=>|(?+\-*/%&|^~])=)\s*$") +_RENDERS_UI_RE = re.compile( + r"(?:\bText|\bSelectableText)\s*\(|(? int: + """Return the first offset after a balanced ``${...}`` expression.""" + cursor = start + 2 + depth = 1 + while cursor < len(source) and depth: + if source.startswith("//", cursor): + newline = source.find("\n", cursor + 2) + cursor = len(source) if newline < 0 else newline + 1 + continue + if source.startswith("/*", cursor): + end = source.find("*/", cursor + 2) + cursor = len(source) if end < 0 else end + 2 + continue + raw = ( + source[cursor] in "rR" + and cursor + 1 < len(source) + and source[cursor + 1] in "'\"" + ) + quote_start = cursor + 1 if raw else cursor + if source[quote_start] in "'\"": + quote_char = source[quote_start] + quote = ( + quote_char * 3 + if source.startswith(quote_char * 3, quote_start) + else quote_char + ) + cursor = quote_start + len(quote) + while cursor < len(source): + if not raw and source[cursor] == "\\": + cursor += 2 + elif source.startswith(quote, cursor): + cursor += len(quote) + break + else: + cursor += 1 + continue + if source[cursor] == "{": + depth += 1 + elif source[cursor] == "}": + depth -= 1 + cursor += 1 + return cursor + + +def _string_literals(source: str) -> list[Literal]: + """Return Dart string literals while ignoring line and block comments.""" + literals: list[Literal] = [] + index = 0 + length = len(source) + while index < length: + if source.startswith("//", index): + newline = source.find("\n", index + 2) + index = length if newline < 0 else newline + 1 + continue + if source.startswith("/*", index): + depth = 1 + index += 2 + while index < length and depth: + if source.startswith("/*", index): + depth += 1 + index += 2 + elif source.startswith("*/", index): + depth -= 1 + index += 2 + else: + index += 1 + continue + + raw = False + token_start = index + if ( + source[index] in "rR" + and index + 1 < length + and source[index + 1] in "'\"" + and (index == 0 or not (source[index - 1].isalnum() or source[index - 1] == "_")) + ): + raw = True + index += 1 + if source[index] not in "'\"": + index += 1 + continue + + quote_char = source[index] + quote = quote_char * 3 if source.startswith(quote_char * 3, index) else quote_char + body_start = index + len(quote) + cursor = body_start + while cursor < length: + if not raw and source[cursor] == "\\": + cursor += 2 + continue + if not raw and source.startswith("${", cursor): + cursor = _interpolation_end(source, cursor) + continue + if source.startswith(quote, cursor): + end = cursor + len(quote) + literals.append( + Literal( + line=source.count("\n", 0, token_start) + 1, + value=source[body_start:cursor], + start=token_start, + end=end, + raw=raw, + ) + ) + index = end + break + if len(quote) == 1 and source[cursor] == "\n": + index = cursor + 1 + break + cursor += 1 + else: + index = length + return literals + + +def _literal_text(value: str) -> str: + """Return the literal with every interpolation replaced by whitespace.""" + literal_parts: list[str] = [] + cursor = 0 + while cursor < len(value): + if value.startswith("${", cursor): + literal_parts.append(" ") + cursor = _interpolation_end(value, cursor) + elif value[cursor] == "$" and cursor + 1 < len(value) and ( + value[cursor + 1].isalpha() or value[cursor + 1] == "_" + ): + cursor += 2 + while cursor < len(value) and (value[cursor].isalnum() or value[cursor] == "_"): + cursor += 1 + else: + literal_parts.append(value[cursor]) + cursor += 1 + return "".join(literal_parts) + + +def _literal_words(value: str) -> list[str]: + return [word.lower() for word in _WORD_RE.findall(_literal_text(value))] + + +def _contains_english(value: str) -> bool: + words = _literal_words(value) + return bool(words) and not all(word in _UNITS for word in words) + + +def _statement_prefix(source: str, start: int) -> str: + boundary = source.rfind(";", 0, start) + return source[boundary + 1 : start] + + +def _is_excluded_context(source: str, literal: Literal) -> bool: + statement_prefix = _statement_prefix(source, literal.start) + if re.match(r"\s*(?:import|part)\b", statement_prefix): + return True + + prefix = source[max(0, literal.start - 300) : literal.start] + if _EXCLUDED_ARGUMENT_RE.search(prefix) or _KEY_RE.search(prefix): + return True + return bool(_DIAGNOSTIC_RE.search(statement_prefix)) + + +def _rule_for_literal(source: str, literal: Literal, renders_ui: bool = False) -> str | None: + if not _contains_english(literal.value) or _is_excluded_context(source, literal): + return None + + prefix = source[max(0, literal.start - 300) : literal.start] + if not literal.raw and _TRANSLATION_INTERPOLATION_RE.search(literal.value): + if not (re.search(r"\$\{\s*t\.", literal.value) and _T_PARAMETER_RE.search(prefix)): + return "mixed translation interpolation" + if _TEXT_RE.search(prefix): + return "Text first argument" + if _UI_ARGUMENT_RE.search(prefix): + return "UI named argument" + if ( + renders_ui + and _PHRASE_RE.search(_literal_text(literal.value)) + and _BOUND_LITERAL_RE.search(_statement_prefix(source, literal.start)) + ): + return "display string bound to a name" + return None + + +def load_allowlist(path: Path | None = None) -> dict[str, dict[str, str]]: + path = ALLOWLIST_PATH if path is None else path + data = json.loads(path.read_text(encoding="utf-8")) + if not isinstance(data, dict): + raise ValueError("allowlist root must be an object") + for relative_path, entries in data.items(): + if not isinstance(relative_path, str) or not isinstance(entries, dict): + raise ValueError("allowlist entries must map paths to objects") + for literal, reason in entries.items(): + if not isinstance(literal, str) or not isinstance(reason, str) or not reason.strip(): + raise ValueError(f"allowlist entry {relative_path!r} / {literal!r} needs a reason") + return data + + +def _is_allowlisted(path: str, literal: str, allowlist: dict[str, dict[str, str]]) -> bool: + return literal in allowlist.get(path, {}) or literal in allowlist.get("*", {}) + + +def scan( + lib_dir: Path | None = None, + allowlist: dict[str, dict[str, str]] | None = None, + root: Path | None = None, +) -> tuple[list[Finding], dict[str, set[str]]]: + lib_dir = LIB_DIR if lib_dir is None else lib_dir + root = ROOT if root is None else root + if allowlist is None: + allowlist = load_allowlist() + findings: list[Finding] = [] + seen_literals: dict[str, set[str]] = {} + for path in sorted(lib_dir.rglob("*.dart")): + relative = path.relative_to(root).as_posix() + # lib/dev is a separate measurement entrypoint, explicitly "NOT part of the app". + if ( + relative.startswith(("lib/i18n/", "lib/dev/")) + or path.name.endswith((".g.dart", ".freezed.dart")) + ): + continue + source = path.read_text(encoding="utf-8") + literals = _string_literals(source) + renders_ui = bool(_RENDERS_UI_RE.search(source)) + seen_literals[relative] = {literal.value for literal in literals} + for literal in literals: + rule = _rule_for_literal(source, literal, renders_ui) + if rule is None or _is_allowlisted(relative, literal.value, allowlist): + continue + findings.append(Finding(relative, literal.line, literal.value, rule)) + return findings, seen_literals + + +def stale_allowlist_entries( + allowlist: dict[str, dict[str, str]], seen_literals: dict[str, set[str]] +) -> list[tuple[str, str]]: + all_literals = set().union(*seen_literals.values()) if seen_literals else set() + stale: list[tuple[str, str]] = [] + for path, entries in allowlist.items(): + present = all_literals if path == "*" else seen_literals.get(path, set()) + stale.extend((path, literal) for literal in entries if literal not in present) + return sorted(stale) + + +def _print_findings(findings: list[Finding]) -> None: + current_path = None + for finding in findings: + if finding.path != current_path: + if current_path is not None: + print() + current_path = finding.path + print(f"{finding.path}:") + print(f" {finding.line}: [{finding.rule}] {finding.literal!r}") + print(f"\nFound {len(findings)} hardcoded user-facing string(s).") + + +def main(argv: list[str] | None = None) -> int: + parser = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter) + parser.add_argument("--root", type=Path, default=ROOT) + parser.add_argument( + "--allowlist", type=Path, default=ALLOWLIST_PATH, help="path to the JSON allowlist" + ) + parser.add_argument( + "--allowlist-missing", + action="store_true", + help="report allowlist entries whose literal no longer exists", + ) + args = parser.parse_args(argv) + + try: + allowlist = load_allowlist(args.allowlist) + findings, seen_literals = scan(args.root / "lib", allowlist, args.root) + except (OSError, ValueError, json.JSONDecodeError) as error: + print(f"error: {error}") + return 1 + + if args.allowlist_missing: + stale = stale_allowlist_entries(allowlist, seen_literals) + if stale: + print("Allowlist entries that no longer match a source literal:") + for path, literal in stale: + print(f" {path}: {literal!r}") + return 1 + print("All hardcoded-string allowlist entries still match source literals.") + return 0 + + if findings: + _print_findings(findings) + return 1 + print("No hardcoded user-facing English strings found.") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/scripts/ci_checks.sh b/scripts/ci_checks.sh index a4bf1622..25a3b05a 100755 --- a/scripts/ci_checks.sh +++ b/scripts/ci_checks.sh @@ -80,7 +80,16 @@ else FAILED=1 fi -# 4. Workflow and script regression guards +# 4. Hardcoded user-facing strings +section "hardcoded UI strings" +if python3 scripts/check_hardcoded_strings.py; then + ok "user-facing strings use the translation layer" +else + fail "hardcoded user-facing English strings found" + FAILED=1 +fi + +# 5. Workflow and script regression guards section "workflow and script guards" if bash scripts/ci_guard_checks.sh; then ok "workflow and script guards passed" @@ -89,7 +98,7 @@ else FAILED=1 fi -# 5. Icon consistency +# 6. Icon consistency section "icon consistency" if dart run scripts/check_icon_consistency.dart; then ok "production icons use AppIcon and rounded Symbols" @@ -98,7 +107,7 @@ else FAILED=1 fi -# 3. Native formatting +# 7. Native formatting section "native format" out="$(mktemp)" if scripts/format_native.sh --check >"$out" 2>&1; then @@ -110,7 +119,7 @@ else fi rm -f "$out" -# 3. Dart analyzer (mirrors ci.yml "Analyze code") +# 8. Dart analyzer (mirrors ci.yml "Analyze code") section "Dart analyzer" if dart run scripts/check_analyzer.dart; then ok "no unapproved diagnostics" @@ -119,7 +128,7 @@ else FAILED=1 fi -# 4. Unused code (mirrors ci.yml "Check for unused code") +# 9. Unused code (mirrors ci.yml "Check for unused code") section "dart_code_linter: unused code" if ! have_dart_code_linter; then skip "dart_code_linter unresolved — run 'flutter pub get'" @@ -136,7 +145,7 @@ else rm -f "$out" fi -# 5. Unused files (mirrors ci.yml "Check for unused files") +# 10. Unused files (mirrors ci.yml "Check for unused files") section "dart_code_linter: unused files" if ! have_dart_code_linter; then skip "dart_code_linter unresolved — run 'flutter pub get'" diff --git a/scripts/hardcoded_strings_allowlist.json b/scripts/hardcoded_strings_allowlist.json new file mode 100644 index 00000000..155101ae --- /dev/null +++ b/scripts/hardcoded_strings_allowlist.json @@ -0,0 +1,85 @@ +{ + "*": { + "Plex": "Brand name", + "Jellyfin": "Brand name", + "Emby": "Brand name", + "Plezy": "Brand name", + "Simkl": "Brand name", + "BL": "Technical token", + "EL": "Technical token", + "RPU": "Technical token", + "dontkillmyapp.com": "External technical resource name" + }, + "lib/screens/auth_screen.dart": { + "Debug: Enter Plex Token": "kDebugMode developer authentication affordance", + "Plex Auth Token": "kDebugMode developer authentication affordance", + "Enter your Plex.tv token": "kDebugMode developer authentication affordance", + "Auth service not ready": "kDebugMode developer authentication diagnostic" + }, + "lib/screens/settings/settings_screen.dart": { + "Test Sentry": "kDebugMode developer diagnostic affordance", + "Send a test error": "kDebugMode developer diagnostic affordance", + "Test ANR": "kDebugMode developer diagnostic affordance", + "Block the main thread for 10 seconds": "kDebugMode developer diagnostic affordance", + "Blocking main thread...": "kDebugMode developer diagnostic affordance" + }, + "lib/widgets/video_controls/sheets/video_settings_sheet.dart": { + "Trigger MPV Fallback": "kDebugMode developer playback affordance", + "Simulate HTTP $status from server": "kDebugMode developer playback affordance" + }, + "lib/screens/settings/seerr_connect_screen.dart": { + "https://seerr.example.com": "Intentional server URL example" + }, + "lib/screens/settings/external_player_screen.dart": { + "myplayer://play?url=": "Intentional URL scheme example", + "com.example.player": "Intentional Android package example", + "mpv": "Intentional executable example", + "/usr/bin/player": "Intentional executable path example" + }, + "lib/screens/settings/appearance_settings_screen.dart": { + "English": "Language endonym", + "Svenska": "Language endonym", + "Français": "Language endonym", + "Italiano": "Language endonym", + "Nederlands": "Language endonym", + "Deutsch": "Language endonym", + "Magyar": "Language endonym", + "简体中文": "Language endonym", + "繁體中文": "Language endonym", + "한국어": "Language endonym", + "Español": "Language endonym", + "Português": "Language endonym", + "日本語": "Language endonym", + "Русский": "Language endonym", + "Polski": "Language endonym", + "Dansk": "Language endonym", + "Norsk bokmål": "Language endonym", + "Български": "Language endonym", + "Türkçe": "Language endonym", + "Azərbaycanca": "Language endonym", + "Қазақша": "Language endonym", + "Oʻzbekcha": "Language endonym" + }, + "lib/screens/settings/logs_screen.dart": { + "Android ${info.version.release} (API ${info.version.sdkInt})": "English bug-report diagnostic", + "TV mode: yes$suffix": "English bug-report diagnostic", + "Renderer: $renderer": "English bug-report diagnostic", + "Background: ${backgroundWork.describeSync()}": "English bug-report diagnostic", + "iOS ${info.systemVersion}": "English bug-report diagnostic", + "macOS ${info.osRelease}": "English bug-report diagnostic", + "Linux ${info.versionId ?? info.id}": "English bug-report diagnostic", + "Effects: ${DevicePerformance.describeSync()}": "English bug-report diagnostic", + "Display: ${DevicePerformance.describeDisplay()}": "English bug-report diagnostic" + }, + "lib/services/startup_diagnostics.dart": { + "Plezy startup failure": "English bug-report diagnostic", + "Version: $appVersion": "English bug-report diagnostic", + "Platform: $platform": "English bug-report diagnostic", + "When: ${timestamp.toUtc().toIso8601String()}": "English bug-report diagnostic", + "Phase: $phaseId": "English bug-report diagnostic", + "Error: $errorType": "English bug-report diagnostic", + "Repair offered: ${repairable ? 'yes' : 'no'}": "English bug-report diagnostic", + "Message: $message": "English bug-report diagnostic", + "Stack trace:": "English bug-report diagnostic" + } +} diff --git a/scripts/test_check_hardcoded_strings.py b/scripts/test_check_hardcoded_strings.py new file mode 100755 index 00000000..90659157 --- /dev/null +++ b/scripts/test_check_hardcoded_strings.py @@ -0,0 +1,195 @@ +#!/usr/bin/env python3 + +import contextlib +import io +import json +import tempfile +import unittest +from pathlib import Path +from unittest.mock import patch + +import check_hardcoded_strings + + +class HardcodedStringsCheckerTest(unittest.TestCase): + def setUp(self) -> None: + self.temporary_directory = tempfile.TemporaryDirectory() + self.addCleanup(self.temporary_directory.cleanup) + self.root = Path(self.temporary_directory.name) + self.lib = self.root / "lib" + self.lib.mkdir() + self.allowlist_path = self.root / "allowlist.json" + self.allowlist_path.write_text("{}\n", encoding="utf-8") + self.enterContext(patch.object(check_hardcoded_strings, "ROOT", self.root)) + self.enterContext(patch.object(check_hardcoded_strings, "LIB_DIR", self.lib)) + self.enterContext( + patch.object(check_hardcoded_strings, "ALLOWLIST_PATH", self.allowlist_path) + ) + + def _write_source(self, source: str, relative: str = "widgets/example.dart") -> None: + path = self.lib / relative + path.parent.mkdir(parents=True, exist_ok=True) + path.write_text(source, encoding="utf-8") + + def _findings(self) -> list[check_hardcoded_strings.Finding]: + findings, _ = check_hardcoded_strings.scan() + return findings + + def test_text_literal_is_reported(self): + self._write_source("Widget build() => const Text('Skip Intro');\n") + + findings = self._findings() + + self.assertEqual([(finding.literal, finding.rule) for finding in findings], [ + ("Skip Intro", "Text first argument") + ]) + + def test_phrase_bound_to_a_name_in_a_ui_file_is_reported(self): + # The actual shape of issue #1856: the literal never touches Text() + # directly, it is assigned to a local a few lines above the render. + self._write_source( + "Widget build() {\n" + " String label;\n" + " if (isCredits) {\n" + " label = 'Skip Credits';\n" + " } else {\n" + " label = t.videoControls.skipIntro;\n" + " }\n" + " return Text(label);\n" + "}\n" + ) + + findings = self._findings() + + self.assertEqual([(finding.literal, finding.rule) for finding in findings], [ + ("Skip Credits", "display string bound to a name") + ]) + + def test_identifier_bound_to_a_name_is_not_reported(self): + # Single-token identifiers are indistinguishable from copy by word + # count alone, so the rule requires a whitespace-separated phrase. + self._write_source( + "Widget build() {\n" + " final section = 'cast_row';\n" + " final mode = 'HDR_UNSUPPORTED';\n" + " final tab = 'liveTv';\n" + " return Text(t.common.close);\n" + "}\n" + ) + + self.assertEqual(self._findings(), []) + + def test_phrase_bound_behind_a_log_argument_is_not_reported(self): + self._write_source( + "void run() => promptAndCreate(\n" + " createdLog: (playlist) => 'Successfully created playlist: ${playlist.title}',\n" + " title: Text(t.playlists.create),\n" + ");\n" + ) + + self.assertEqual(self._findings(), []) + + def test_phrase_bound_in_a_non_ui_file_is_not_reported(self): + self._write_source( + "String describe() => 'not name=value';\n", + relative="services/plain_service.dart", + ) + + self.assertEqual(self._findings(), []) + + def test_translated_text_is_not_reported(self): + self._write_source("Widget build() => Text(t.videoControls.skipIntro);\n") + + self.assertEqual(self._findings(), []) + + def test_tooltip_literal_is_reported(self): + self._write_source("Widget build() => IconButton(tooltip: 'Close');\n") + + findings = self._findings() + + self.assertEqual([(finding.literal, finding.rule) for finding in findings], [ + ("Close", "UI named argument") + ]) + + def test_mixed_translation_interpolation_is_reported(self): + self._write_source("final value = '${t.common.pause} auto-scroll';\n") + + findings = self._findings() + + self.assertEqual([(finding.literal, finding.rule) for finding in findings], [ + ("${t.common.pause} auto-scroll", "mixed translation interpolation") + ]) + + def test_t_lambda_parameter_is_not_mistaken_for_translation_accessor(self): + self._write_source("final title = tracks.map((t) => 'Track ${t.id}');\n") + + self.assertEqual(self._findings(), []) + + def test_numeric_season_episode_pattern_is_not_reported(self): + self._write_source( + "Widget build() => Text(" + "\"${hasIndex ? 'S${season} E${episode}' : ''}\"" + ");\n" + ) + + self.assertEqual(self._findings(), []) + + def test_diagnostic_and_debug_label_literals_are_not_reported(self): + self._write_source( + "final widget = Thing(debugLabel: 'Developer controls');\n" + "appLogger.i(Text('Developer details'));\n" + ) + + self.assertEqual(self._findings(), []) + + def test_allowlisted_literal_is_not_reported(self): + self._write_source("Widget build() => const Text('Permanent English');\n") + self.allowlist_path.write_text( + json.dumps( + { + "lib/widgets/example.dart": { + "Permanent English": "Deliberate product terminology" + } + } + ), + encoding="utf-8", + ) + + self.assertEqual(self._findings(), []) + + def test_stale_allowlist_report_finds_literal_that_matches_nothing(self): + self._write_source("Widget build() => Text(t.common.close);\n") + self.allowlist_path.write_text( + json.dumps( + { + "lib/widgets/example.dart": { + "Removed English": "Former deliberate terminology" + } + } + ), + encoding="utf-8", + ) + output = io.StringIO() + + with contextlib.redirect_stdout(output): + result = check_hardcoded_strings.main(["--allowlist-missing"]) + + self.assertEqual(result, 1) + self.assertIn("lib/widgets/example.dart: 'Removed English'", output.getvalue()) + + def test_comments_directives_keys_units_and_generated_files_are_ignored(self): + self._write_source( + "// Text('Comment words')\n" + "import 'Text(\\'Imported words\\')';\n" + "final key = ValueKey('Stable widget identity');\n" + "final duration = Text('min');\n" + ) + self._write_source("const Text('Generated English');\n", "model.g.dart") + self._write_source("const Text('Generated English');\n", "model.freezed.dart") + self._write_source("const Text('Generated English');\n", "i18n/generated.dart") + + self.assertEqual(self._findings(), []) + + +if __name__ == "__main__": + unittest.main() diff --git a/test/widgets/video_controls_test.dart b/test/widgets/video_controls_test.dart index 36a54e30..a39b40d7 100644 --- a/test/widgets/video_controls_test.dart +++ b/test/widgets/video_controls_test.dart @@ -943,7 +943,7 @@ void main() { onActivate: () => activateCount++, ); - expect(find.text('Skip Intro (3)'), findsOneWidget); + expect(find.text('${t.videoControls.skipIntro} (3)'), findsOneWidget); await tester.tap(find.byType(InkWell)); await tester.pump(); @@ -1006,13 +1006,26 @@ void main() { onActivate: () => activateCount++, ); - expect(find.text('Skip Intro'), findsOneWidget); + expect(find.text(t.videoControls.skipIntro), findsOneWidget); await tester.tap(find.byType(InkWell)); await tester.pump(); expect(activateCount, 1); }); + + testWidgets('uses the localized marker label', (tester) async { + await tester.runAsync(() => LocaleSettings.setLocale(AppLocale.pt)); + addTearDown(() => LocaleSettings.setLocaleSync(AppLocale.en)); + final focusNode = FocusNode(); + addTearDown(focusNode.dispose); + + await _pumpSkipMarkerButton(tester, focusNode: focusNode, isAutoSkipActive: false, onActivate: () {}); + + expect(t.videoControls.skipIntro, 'Pular abertura'); + expect(find.text('Pular abertura'), findsOneWidget); + expect(find.text('Skip Intro'), findsNothing); + }); }); group('mobileSkipZoneForTap', () {