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
This commit is contained in:
+126
-37
@@ -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."
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user