chore(i18n): delete 230 dead translation keys and guard against new ones (#6132)

* chore(i18n): delete 230 dead translation keys and guard against new ones

The 13 locale files carried 230 keys (11% of the set) that nothing in
the frontend or Go sources references — leftovers of renamed features
(the email notifier reuses tgbot.messages.* for subjects, the old
email.subject*/title* set was orphaned; likewise menu.*, the clients
bulk-copy strings, and the secAlert* family). Nothing detected this:
a missing key falls back to en-US and an unused key fails nothing.

A new test now fails the build when an en-US key has no reference in
frontend/src or internal Go sources (dynamic keys are covered by
harvesting concatenation and template-literal prefixes), and pins
that all 13 locales carry exactly the en-US key set, so parity drift
surfaces at test time instead of as a silent fallback.

Each locale shrinks by the same 230 keys; net -2,900 lines across
the translation set.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(i18n): restore the 29 live remarkVars keys, match whole tokens, unmask 9 more

From review: the template-literal harvester required the prefix to end
on a dot, so pages.hosts.remarkVars.desc${token} harvested nothing
and all 29 desc* tooltip keys were wrongly deleted — and the guard
shared the flawed logic, so CI stayed green while the Hosts page
would have shown raw key names in 13 languages. Restored from the
parent commit; the harvester now requires at least one dot but not a
trailing one.

Also from review: references are matched as whole dotted tokens
instead of substrings (a dead key can no longer hide behind a longer
sibling — that unmasked 9 more genuinely dead keys, each verified by
hand before deletion), and the test excludes itself from the scan so
its own prose cannot whitelist a subtree.

Net: -210 keys per locale instead of the previous -230.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
PathGao
2026-07-29 13:59:25 +08:00
committed by GitHub
parent 17e6b5a460
commit ea35884390
14 changed files with 117 additions and 2834 deletions
+2 -218
View File
@@ -48,7 +48,6 @@
"copySuccess": "Başarıyla kopyalandı",
"sure": "Emin misiniz?",
"encryption": "Şifreleme",
"useIPv4ForHost": "Ana bilgisayar için IPv4 kullan",
"transmission": "İletim",
"host": "Host",
"path": "Yol",
@@ -74,18 +73,9 @@
"twoFactorCode": "Kod",
"remained": "Kalan",
"security": "Güvenlik",
"secAlertTitle": "Güvenlik Uyarısı",
"secAlertSsl": "Bu bağlantı güvenli değil. Verilerin korunması için TLS etkinleştirilene kadar hassas bilgi girmekten kaçının.",
"secAlertConf": "Bazı ayarlar saldırıya açıktır. Olası ihlalleri önlemek için güvenlik protokollerini güçlendirmeniz önerilir.",
"secAlertSSL": "Panelde güvenli bağlantı yok. Verilerin korunması için TLS sertifikası yükleyin.",
"secAlertPanelPort": "Panelin varsayılan portu savunmasız. Rastgele veya belirli bir port yapılandırın.",
"secAlertPanelURI": "Panelin varsayılan URI yolu güvensiz. Karmaşık bir URI yolu yapılandırın.",
"secAlertSubURI": "Aboneliğin varsayılan URI yolu güvensiz. Karmaşık bir URI yolu yapılandırın.",
"secAlertSubJsonURI": "Abonelik JSON dosyasının varsayılan URI yolu güvensiz. Karmaşık bir URI yolu yapılandırın.",
"emptyDnsDesc": "Eklenmiş DNS sunucusu yok.",
"emptyFakeDnsDesc": "Eklenmiş Fake DNS sunucusu yok.",
"emptyBalancersDesc": "Eklenmiş dengeleyici yok.",
"emptyReverseDesc": "Eklenmiş ters proxy yok.",
"somethingWentWrong": "Bir hata oluştu",
"subscription": {
"title": "Abonelik Bilgisi",
@@ -106,8 +96,6 @@
},
"menu": {
"theme": "Tema",
"dark": "Koyu",
"ultraDark": "Ultra Koyu",
"dashboard": "Genel Bakış",
"inbounds": "Gelen Bağlantılar",
"clients": "Kullanıcılar",
@@ -118,7 +106,6 @@
"routing": "Yönlendirme",
"outbounds": "Giden Bağlantılar",
"apiDocs": "API Belgeleri",
"logout": "Çıkış Yap",
"link": "Yönet",
"donate": "Bağış Yap",
"hosts": "Host'lar",
@@ -139,7 +126,6 @@
}
},
"index": {
"title": "Genel Bakış",
"cpu": "CPU",
"logicalProcessors": "Mantıksal İşlemciler",
"frequency": "Frekans",
@@ -152,7 +138,6 @@
"restartXray": "Yeniden Başlat",
"xraySwitch": "Sürüm",
"xrayUpdates": "Xray Güncellemeleri",
"xraySwitchClick": "Geçiş yapmak istediğiniz sürümü seçin.",
"xraySwitchClickDesk": "Dikkatli seçin, eski sürümler mevcut yapılandırmalarla uyumlu olmayabilir.",
"updatePanel": "Paneli Güncelle",
"panelUpdateDesc": "Bu işlem 3X-UI'yi en son sürüme güncelleyecek ve panel servisini yeniden başlatacaktır.",
@@ -164,12 +149,10 @@
"currentCommit": "Geçerli commit",
"latestCommit": "Son commit",
"updateChannelChanged": "Güncelleme kanalı değiştirildi",
"upToDate": "Güncel",
"xrayStatusUnknown": "Bilinmiyor",
"xrayStatusRunning": "Çalışıyor",
"xrayStatusStop": "Durduruldu",
"xrayStatusError": "Hata",
"xrayErrorPopoverTitle": "Xray çalıştırılırken bir hata oluştu",
"operationHours": "Çalışma Süresi",
"systemHistoryTitle": "Sistem Geçmişi",
"historyTitleCpu": "CPU Kullanımı",
@@ -211,9 +194,6 @@
"xrayObservatoryDead": "Kapalı",
"xrayObservatoryLastSeen": "Son görülme",
"xrayObservatoryLastTry": "Son deneme",
"trendLast2Min": "Son 2 dakika",
"systemLoad": "Sistem Yükü",
"systemLoadDesc": "Son 1, 5 ve 15 dakikanın sistem yükü ortalaması",
"connectionCount": "Bağlantı İstatistikleri",
"ipAddresses": "IP Adresleri",
"toggleIpVisibility": "IP görünürlüğünü değiştir",
@@ -223,13 +203,11 @@
"totalData": "Toplam Veri",
"sent": "Gönderilen",
"received": "Alınan",
"documentation": "Dokümantasyon",
"xraySwitchVersionDialog": "Xray sürümünü gerçekten değiştirmek istiyor musunuz?",
"xraySwitchVersionDialogDesc": "Bu işlem Xray sürümünü #version# olarak değiştirecektir.",
"xraySwitchVersionPopover": "Xray başarıyla güncellendi",
"panelUpdateDialog": "Gerçekten paneli güncellemek istiyor musunuz?",
"panelUpdateDialogDesc": "Bu işlem 3X-UI'yi #version# sürümüne güncelleyecek ve panel servisini yeniden başlatacaktır.",
"panelUpdateCheckPopover": "Panel güncelleme kontrolü başarısız oldu",
"panelUpdateStartedPopover": "Panel güncellemesi başlatıldı",
"panelUpdateFailedTitle": "Panel güncellemesi başarısız oldu",
"panelUpdateFailedDesc": "Güncelleme başarıyla tamamlanamadı. Sunucu günlüklerini kontrol edin veya komut satırından 'x-ui update' çalıştırın.",
@@ -258,7 +236,6 @@
"accessLogs": "Erişim Günlükleri",
"autoUpdate": "Otomatik Güncelleme",
"config": "Yapılandırma",
"backup": "Yedek",
"backupTitle": "Yedekleme ve Geri Yükleme",
"exportDatabase": "Yedekle",
"exportDatabaseDesc": "Mevcut veritabanınızın yedeğini içeren bir .db dosyasını cihazınıza indirmek için tıklayın. Aynı dosya PostgreSQL üzerinde çalışan bir panele de geri yüklenebilir.",
@@ -276,7 +253,6 @@
"migrationDownloadPgDesc": "PostgreSQL verilerinizden oluşturulan ve bu paneli SQLite üzerinde çalıştırmaya hazır bir .db SQLite veritabanı indirmek için tıklayın."
},
"inbounds": {
"title": "Gelen Bağlantılar",
"totalDownUp": "Toplam Gönderilen/Alınan",
"totalUsage": "Toplam Kullanım",
"inboundCount": "Toplam Gelen Bağlantı",
@@ -288,21 +264,11 @@
"localPanel": "Yerel Panel",
"fallbacks": {
"title": "Fallback'ler",
"help": "Bu gelen bağlantı üzerindeki bir istek hiçbir istemci ile eşleşmediğinde, başka bir yere yönlendirilir. Aşağıdan bir alt (child) gelen bağlantı seçerek yönlendirme alanlarını (SNI / ALPN / Path / xver) aktarım (transport) ayarlarından otomatik doldurun ya da seçimi boş bırakıp Hedef (Dest) değerini doğrudan girin (örn. 8080 veya 127.0.0.1:8080); böylece Nginx gibi harici bir sunucuya yönlendirebilirsiniz. Her alt gelen bağlantı 127.0.0.1 üzerinde security=none (güvenlik=yok) ile dinlemelidir.",
"empty": "Henüz fallback yok",
"add": "Fallback Ekle",
"pickInbound": "Bir Gelen Bağlantı Seç",
"matchAny": "herhangi",
"destPlaceholder": "otomatik (child listen:port)",
"rederive": "Child'dan Yeniden Doldur",
"rederived": "Child'dan yeniden dolduruldu",
"editAdvanced": "Yönlendirme Alanlarını Düzenle",
"hideAdvanced": "Gelişmişi Gizle",
"quickAddAll": "Uygun Olan Tümünü Hızlı Ekle",
"quickAdded": "{n} fallback eklendi",
"quickAddedNone": "Eklenecek yeni uygun gelen bağlantı yok",
"routesWhen": "Şu Durumda Yönlendirir",
"defaultCatchAll": "Varsayılan — başka her şeyi yakalar",
"needsTls": "Geri düşüşler (fallback), Güvenlik sekmesinde TLS veya Reality seçildiğinde kullanılabilir olur (yalnızca RAW üzerinde VLESS/Trojan)."
},
"protocol": "Protokol",
@@ -310,8 +276,6 @@
"portMap": "Port Eşlemesi",
"traffic": "Trafik",
"speed": "Hız",
"details": "Detaylar",
"transportConfig": "Aktarım",
"expireDate": "Süre",
"createdAt": "Oluşturuldu",
"updatedAt": "Güncellendi",
@@ -319,8 +283,6 @@
"addInbound": "Gelen Bağlantı Ekle",
"generalActions": "Genel İşlemler",
"modifyInbound": "Gelen Bağlantını Düzenle",
"deleteInbound": "Gelen Bağlantını Sil",
"deleteInboundContent": "Bu gelen bağlantıyı silmek istediğinizden emin misiniz?",
"deleteConfirmTitle": "\"{remark}\" gelen bağlantı silinsin mi?",
"deleteConfirmContent": "Bu işlem gelen bağlantıyı ve tüm kullanıcılarını siler. Geri alınamaz.",
"resetConfirmTitle": "\"{remark}\" trafiği sıfırlansın mı?",
@@ -364,8 +326,6 @@
"exportAllLinksFileName": "Tüm-BağlantıNoktaları",
"exportAllSubsFileName": "Tüm-BağlantıNoktaları-Subs",
"inboundJsonTitle": "Gelen Bağlantı JSON",
"deleteClient": "Kullanıcıyı Sil",
"deleteClientContent": "Kullanıcıyı silmek istediğinizden emin misiniz?",
"resetTrafficContent": "Trafiği sıfırlamak istediğinizden emin misiniz?",
"copyLink": "URL'yi Kopyala",
"address": "Adres",
@@ -376,36 +336,19 @@
"meansNoLimit": "= Sınırsız. (birim: GB)",
"totalFlow": "Toplam Akış",
"leaveBlankToNeverExpire": "Süresiz olması için boş bırakın",
"noRecommendKeepDefault": "Varsayılan ayarda bırakılması önerilir",
"certificatePath": "Dosya Yolu",
"certificateContent": "Dosya İçeriği",
"publicKey": "Genel Anahtar",
"privatekey": "Özel Anahtar",
"clickOnQRcode": "Kopyalamak İçin QR Koda Tıklayın",
"client": "Kullanıcı",
"export": "Tüm URL'leri Dışa Aktar",
"clone": "Klonla",
"cloneInbound": "Klonla",
"cloneInboundContent": "Bu gelen bağlantıyın tüm ayarları, Port, Dinleme IP ve Kullanıcılar hariç, klona uygulanacaktır.",
"cloneInboundOk": "Klonla",
"resetAllTraffic": "Tüm Gelen Trafiği Sıfırla",
"resetAllTrafficTitle": "Tüm Gelen Trafiği Sıfırla",
"resetAllTrafficContent": "Tüm gelen bağlantılarnın trafiğini sıfırlamak istediğinizden emin misiniz?",
"resetInboundClientTraffics": "Kullanıcıların Trafiğini Sıfırla",
"resetInboundClientTrafficTitle": "Kullanıcı Trafiklerini Sıfırla",
"resetInboundClientTrafficContent": "Bu gelen bağlantıya ait kullanıcıların trafiğini sıfırlamak istediğinizden emin misiniz?",
"resetAllClientTraffics": "Tüm Kullanıcıların Trafiğini Sıfırla",
"resetAllClientTrafficTitle": "Tüm Kullanıcı Trafiklerini Sıfırla",
"resetAllClientTrafficContent": "Tüm kullanıcıların trafiğini sıfırlamak istediğinizden emin misiniz?",
"delDepletedClients": "Kotası Dolan Kullanıcıları Sil",
"delDepletedClientsTitle": "Kotası Dolan Kullanıcıları Sil",
"delDepletedClientsContent": "Kotası dolan veya süresi biten tüm kullanıcıları silmek istediğinizden emin misiniz?",
"email": "E-posta",
"emailDesc": "Lütfen benzersiz bir e-posta adresi sağlayın.",
"IPLimit": "IP Limiti",
"IPLimitDesc": "Sayının aşılması durumunda gelen bağlantı devre dışı bırakılır. (0 = devre dışı)",
"IPLimitlog": "IP Günlüğü",
"IPLimitlogDesc": "IP geçmiş günlüğü. (devre dışı bırakıldıktan sonra yeniden etkinleştirmek için günlüğü temizleyin)",
"IPLimitlogclear": "Günlüğü Temizle",
"setDefaultCert": "Panelden Sertifikayı Ayarla",
"setDefaultCertEmpty": "Panel için sertifika yapılandırılmamış. Önce Ayarlar'dan ayarlayın.",
@@ -438,21 +381,15 @@
"sniffing": "Sniffing",
"sniffingHelp": "Xray sniffing bloğunun sarmalayıcısı:",
"stream": "Stream",
"streamHelp": "Xray stream bloğunun sarmalayıcısı:",
"jsonErrorPrefix": "Gelişmiş JSON"
"streamHelp": "Xray stream bloğunun sarmalayıcısı:"
},
"telegramDesc": "Lütfen Telegram Sohbet Kimliği (Chat ID) sağlayın. ({'@'}userinfobot'tan öğrenebilir veya botta '/id' komutunu kullanabilirsiniz.)",
"subscriptionDesc": "Abonelik URL'nizi bulmak için 'Detaylar'a gidin. Aynı adı birden fazla kullanıcı için kullanabilirsiniz.",
"subSortIndex": "Sıralama",
"same": "Aynı",
"inboundInfo": "Gelen Bağlantı Bilgileri",
"exportInbound": "Gelen Bağlantını Dışa Aktar",
"import": "İçe Aktar",
"importInbound": "Gelen Bağlantı İçe Aktar",
"periodicTrafficResetTitle": "Trafik Sıfırlama",
"periodicTrafficResetDesc": "Belirtilen aralıklarla trafik sayacını otomatik olarak sıfırla",
"periodicTrafficResetDay": "Aylık sıfırlama günü",
"lastReset": "Son Sıfırlama",
"periodicTrafficReset": {
"never": "Asla",
"daily": "Günlük",
@@ -464,7 +401,6 @@
"obtain": "Al",
"updateSuccess": "Güncelleme başarılı oldu.",
"logCleanSuccess": "Günlük temizlendi.",
"inboundsUpdateSuccess": "Gelen bağlantılar başarıyla güncellendi.",
"inboundUpdateSuccess": "Gelen bağlantı başarıyla güncellendi.",
"inboundCreateSuccess": "Gelen bağlantı başarıyla oluşturuldu.",
"bulkDeleted": "{count} gelen bağlantı silindi",
@@ -474,7 +410,6 @@
"inboundClientDeleteSuccess": "Gelen bağlantı kullanıcısı silindi.",
"inboundClientUpdateSuccess": "Gelen bağlantı kullanıcısı güncellendi.",
"savedNodeOfflineWillSync": "Yerel olarak kaydedildi. Destekleyen bir düğüm çevrimdışı veya devre dışı — değişiklik yeniden bağlandığında senkronize edilecek.",
"delDepletedClientsSuccess": "Tüm tükenmiş kullanıcılar silindi.",
"resetAllClientTrafficSuccess": "Tüm kullanıcıların trafiği sıfırlandı.",
"resetAllTrafficSuccess": "Tüm trafik sıfırlandı.",
"resetInboundClientTrafficSuccess": "Trafik sıfırlandı.",
@@ -717,23 +652,6 @@
"peerNumber": "Peer {n}",
"peerNumberConfig": "Peer {n} Yapılandırması"
},
"stream": {
"general": {
"request": "İstek",
"response": "Yanıt",
"name": "Ad",
"value": "Değer"
},
"tcp": {
"version": "Sürüm",
"method": "Yöntem",
"path": "Yol",
"status": "Durum",
"statusDescription": "Durum Açıklaması",
"requestHeader": "İstek Başlığı",
"responseHeader": "Yanıt Başlığı"
}
},
"sniffingDestOverride": "Hedef geçersiz kılma"
},
"clients": {
@@ -747,24 +665,9 @@
"addExternalSubscription": "Harici Abonelik Ekle",
"noExternalLinks": "Henüz harici bağlantı yok.",
"noExternalSubscriptions": "Henüz harici abonelik yok.",
"add": "Kullanıcı Ekle",
"edit": "Kullanıcıyı Düzenle",
"submitAdd": "Kullanıcı Ekle",
"submitEdit": "Değişiklikleri Kaydet",
"clientCount": "Kullanıcı Sayısı",
"bulk": "Toplu Ekle",
"copyFromInbound": "Gelen Bağlantından Kullanıcıları Kopyala",
"copyToInbound": "Kullanıcıların Kopyalanacağı Yer",
"copySelected": "Seçileni Kopyala",
"copySource": "Kaynak",
"copyEmailPreview": "Oluşacak E-posta Önizlemesi",
"copySelectSourceFirst": "Önce bir kaynak gelen bağlantı seçin.",
"copyResult": "Kopya Sonucu",
"copyResultSuccess": "Başarıyla kopyalandı",
"copyResultNone": "Kopyalanacak bir şey yok: kullanıcı seçilmemiş veya kaynak boş.",
"copyResultErrors": "Kopyalama Hataları",
"copyFlowLabel": "Yeni Kullanıcılar İçin Flow (VLESS)",
"copyFlowHint": "Kopyalanan tüm kullanıcılara uygulanır. Atlamak için boş bırakın.",
"selectAll": "Tümünü Seç",
"clearAll": "Tümünü Temizle",
"method": "Yöntem",
@@ -775,7 +678,6 @@
"postfix": "Sonek",
"delayedStart": "İlk Kullanımdan Sonra Başla",
"expireDays": "Süre (gün)",
"days": "Gün(ler)",
"renew": "Otomatik Yenileme",
"renewDesc": "Süre dolduktan sonra otomatik yeniler. (0 = devre dışı) (birim: gün)",
"renewDays": "Otomatik Yenileme (gün)",
@@ -798,7 +700,6 @@
"sortExpiringSoonest": "Yakında Biten",
"has": "Var",
"hasNot": "Yok",
"title": "Kullanıcılar",
"actions": "İşlemler",
"totalGB": "Trafik Limiti (GB)",
"totalGBDesc": "Bu kullanıcı için veri kotası. 0 = sınırsız.",
@@ -826,8 +727,6 @@
"addClient": "Kullanıcı Ekle",
"qrCode": "QR Kodu",
"clientInfo": "Kullanıcı Bilgileri",
"delete": "Sil",
"reset": "Trafiği Sıfırla",
"editClient": "Kullanıcıyı Düzenle",
"client": "Kullanıcı",
"enabled": "Etkin",
@@ -841,13 +740,11 @@
"noLinks": "Paylaşılabilir bağlantı yok — önce bu kullanıcıyı bir protokole sahip olan gelen bağlantıya bağlayın.",
"link": "Bağlantı",
"resetNotPossible": "Önce bu kullanıcıyı bir gelen bağlantıya bağlayın.",
"general": "Genel",
"resetAllTraffics": "Tüm Kullanıcıların Trafiğini Sıfırla",
"resetAllTrafficsTitle": "Tüm Kullanıcıların Trafiği Sıfırlansın Mı?",
"resetAllTrafficsContent": "Her kullanıcının yükleme/indirme sayaçları sıfırlanır. Kotalar ve son kullanma tarihleri etkilenmez. Geri alınamaz.",
"deleteConfirmTitle": "{email} Kullanıcısı Silinsin Mi?",
"deleteConfirmContent": "Bu işlem kullanıcıyı bağlı tüm gelen bağlantılarndan kaldırır ve trafik kaydını siler. Geri alınamaz.",
"deleteSelected": "Sil ({count})",
"adjustSelected": "Ayarla ({count})",
"subLinksSelected": "Abonelik Bağlantıları ({count})",
"addToGroupTitle": "{count} Kullanıcıyı Bir Gruba Ekle",
@@ -869,12 +766,10 @@
"bulkDisableConfirmTitle": "{count} kullanıcı devre dışı bırakılsın mı?",
"bulkDisableConfirmContent": "Seçili her kullanıcıyı bağlı olduğu tüm gelen bağlantılarda devre dışı bırakır. Erişimlerini hemen kaybederler ancak kayıtları ve trafikleri korunur.",
"selectedCount": "{count} Seçildi",
"attachSelected": "Bağla ({count})",
"attachToInboundsTitle": "{count} Kullanıcıyı Gelen Bağlantına Bağla",
"attachToInboundsDesc": "Seçilen {count} kullanıcıyı (aynı UUID/şifre ve paylaşılan trafikle) seçilen gelen bağlantıya bağlar. Mevcut bağlantıları da korunur.",
"attachToInboundsTargets": "Hedef Gelen Bağlantılar",
"attachToInboundsNoTargets": "Bağlanacak çoklu kullanıcılı gelen bağlantı yok.",
"detachSelected": "Ayır ({count})",
"detach": "Ayır",
"detachFromInboundsTitle": "{count} Kullanıcıyı Gelen Bağlantından Ayır",
"detachFromInboundsDesc": "Seçilen {count} kullanıcıyı seçilen gelen bağlantıdan kaldırır. Kullanıcının zaten bağlı olmadığı gelen bağlantılar atlanır. Kullanıcı kayıtları korunur (tamamen kaldırmak için Sil'i kullanın).",
@@ -928,8 +823,6 @@
"reverseTagPlaceholder": "İsteğe Bağlı Reverse Tag",
"telegramId": "Telegram Kullanıcı ID'si",
"telegramIdPlaceholder": "Sayısal Telegram kullanıcı ID'si (0 = yok)",
"created": "Oluşturuldu",
"updated": "Güncellendi",
"ipLimit": "IP Limiti",
"toasts": {
"deleted": "Kullanıcı silindi",
@@ -952,7 +845,6 @@
}
},
"groups": {
"title": "Gruplar",
"name": "İsim",
"clientCount": "Kullanıcılar",
"totalGroups": "Toplam grup",
@@ -994,7 +886,6 @@
"removeFromGroupResult": "{name} grubundan {count} kullanıcı çıkarıldı."
},
"nodes": {
"title": "Düğümler",
"addNode": "Düğüm Ekle",
"editNode": "Düğümü Düzenle",
"totalNodes": "Toplam Düğüm",
@@ -1013,8 +904,6 @@
"apiTokenPlaceholder": "Uzak panelin Ayarlar sayfasındaki token",
"apiTokenHint": "Uzak panel API token'ını Kimlik Doğrulama → API Token altında gösterir.",
"apiTokenKeepHint": "Mevcut token'ı korumak için boş bırakın",
"regenerate": "Token'ı Yeniden Oluştur",
"regenerateConfirm": "Yeniden oluşturmak mevcut token'ı geçersiz kılar. Onu kullanan tüm merkezi paneller, güncellenene kadar erişimini kaybeder. Devam edilsin mi?",
"allowPrivateAddress": "Özel Adrese İzin Ver",
"allowPrivateAddressHint": "Yalnızca özel ağ veya VPN üzerindeki düğümler için etkinleştirin.",
"outboundTag": "Bağlantı gideni",
@@ -1046,7 +935,6 @@
"updatePanel": "Paneli Güncelle",
"updateSelected": "Seçilenleri Güncelle ({count})",
"updateAvailable": "Güncelleme mevcut",
"upToDate": "Güncel",
"updateConfirmTitle": "{count} düğüm en son sürüme güncellensin mi?",
"updateConfirmContent": "Seçilen her düğüm en son sürümü indirir ve yeniden başlatılır. Yalnızca etkin ve çevrimiçi düğümler güncellenir.",
"updateDevChannel": "Dev kanalına güncelle (son commit)",
@@ -1447,13 +1335,8 @@
"secretClearUndo": "Temizlemeyi geri al"
},
"xray": {
"title": "Xray Yapılandırmaları",
"save": "Kaydet",
"restart": "Xray'i Yeniden Başlat",
"restartSuccess": "Xray başarıyla yeniden başlatıldı.",
"restartOutputTitle": "Xray yeniden başlatma çıktısı",
"restartConfirmTitle": "Xray'i Yeniden Başlat?",
"restartConfirmContent": "Xray hizmeti kaydedilmiş yapılandırma ile yeniden yüklenir.",
"stopSuccess": "Xray başarıyla durduruldu.",
"restartError": "Xray yeniden başlatılırken bir hata oluştu.",
"stopError": "Xray durdurulurken bir hata oluştu.",
@@ -1463,7 +1346,6 @@
"generalConfigsDesc": "Bu seçenekler genel ayarlamaları belirler.",
"logConfigs": "Günlük",
"logConfigsDesc": "Günlükler sunucunuzun verimliliğini etkileyebilir. Yalnızca ihtiyaç durumunda akıllıca etkinleştirmeniz önerilir.",
"blockConfigsDesc": "Bu seçenekler belirli istek protokolleri ve web siteleri temelinde trafiği engeller.",
"basicRouting": "Temel Yönlendirme",
"blockConnectionsConfigsDesc": "Bu seçenekler, istenen belirli ülkelere göre trafiği engelleyecektir.",
"directConnectionsConfigsDesc": "Doğrudan bağlantı, belirli bir trafiğin başka bir sunucu üzerinden yönlendirilmeden doğrudan hedefe gitmesini sağlar.",
@@ -1473,10 +1355,6 @@
"directdomains": "Doğrudan Alan Adları",
"ipv4Routing": "IPv4 Yönlendirme",
"ipv4RoutingDesc": "Bu seçenekler belirli bir varış yerine IPv4 üzerinden trafiği yönlendirir.",
"warpRouting": "WARP Yönlendirme",
"warpRoutingDesc": "Bu seçenekler belirli bir varış yerine WARP üzerinden trafiği yönlendirir.",
"nordRouting": "NordVPN Yönlendirme",
"nordRoutingDesc": "Bu seçenekler belirli bir varış yerine NordVPN üzerinden trafiği yönlendirir.",
"Template": "Gelişmiş Xray Yapılandırma Şablonu",
"TemplateDesc": "Nihai Xray yapılandırma dosyası bu şablona göre oluşturulacaktır.",
"FreedomStrategy": "Freedom Protokol Stratejisi",
@@ -1498,10 +1376,7 @@
"metricsTag": "Metrik Etiketi",
"Torrent": "BitTorrent Protokolünü Engelle",
"Inbounds": "Gelen Bağlantılar",
"InboundsDesc": "Belirtilen istemcileri (clients) kabul eder.",
"Outbounds": "Giden Bağlantılar",
"OutboundSubscriptions": "Giden Bağlantı Abonelikleri",
"OutboundSubscriptionsDesc": "Uzak abonelik URL'lerinden (vmess/vless/trojan/ss/...) giden bağlantılarnı içe aktarın. Etiketler dengeleyicilerde ve yönlendirme kurallarında kullanılabilmek için sabit tutulur. Güncellemeler otomatiktir.",
"Balancers": "Dengeleyiciler",
"balancerTagRequired": "Etiket zorunludur",
"balancerSelectorRequired": "En az bir giden bağlantı seçin",
@@ -1520,9 +1395,7 @@
"routeTesterMatchedOutbound": "Eşleşen giden",
"routeTesterViaBalancer": "dengeleyici aracılığıyla",
"routeTesterDefaultOutbound": "Hiçbir yönlendirme kuralı eşleşmedi — trafik varsayılan (ilk) giden bağlantıya yönlendirilir.",
"OutboundsDesc": "Giden trafiğin yolunu ayarlayın.",
"Routings": "Yönlendirme Kuralları",
"RoutingsDesc": "Her kuralın önceliği önemlidir!",
"completeTemplate": "Tümü",
"logLevel": "Günlük Seviyesi",
"logLevelDesc": "Hata günlükleri için kayıt seviyesi; hangi detayda bilginin kaydedileceğini belirler.",
@@ -1536,13 +1409,9 @@
"maskAddressDesc": "IP adresi maskesi, etkinleştirildiğinde günlükte görünen IP adresini otomatik olarak değiştirecektir.",
"statistics": "İstatistikler",
"statsInboundUplink": "Gelen Yükleme İstatistikleri",
"statsInboundUplinkDesc": "Tüm gelen proxy'lerin yükleme trafiği için istatistik toplamayı etkinleştirir.",
"statsInboundDownlink": "Gelen İndirme İstatistikleri",
"statsInboundDownlinkDesc": "Tüm gelen proxy'lerin indirme trafiği için istatistik toplamayı etkinleştirir.",
"statsOutboundUplink": "Giden Yükleme İstatistikleri",
"statsOutboundUplinkDesc": "Tüm giden proxy'lerin yükleme trafiği için istatistik toplamayı etkinleştirir.",
"statsOutboundDownlink": "Giden İndirme İstatistikleri",
"statsOutboundDownlinkDesc": "Tüm giden proxy'lerin indirme trafiği için istatistik toplamayı etkinleştirir.",
"connectionLimits": "Bağlantı Sınırları",
"connectionLimitsDesc": "Kullanıcı seviyesi 0 için bağlantı düzeyi politikaları. Xray'in varsayılanını kullanmak için alanı boş bırakın.",
"connIdle": "Boşta Kalma Zaman Aşımı",
@@ -1552,18 +1421,10 @@
"bufferSizePlaceholder": "otomatik",
"seconds": "saniye",
"rules": {
"first": "İlk",
"last": "Son",
"up": "Yukarı",
"down": "Aşağı",
"source": "Kaynak",
"dest": "Hedef",
"inbound": "Gelen Bağlantı",
"outbound": "Giden Bağlantı",
"balancer": "Dengeleyici",
"info": "Bilgi",
"add": "Kural Ekle",
"edit": "Kuralı Düzenle",
"useComma": "Virgülle ayrılmış öğeler"
},
"routing": {
@@ -1604,7 +1465,6 @@
"ruleN": "Kural {n}",
"action": "Eylem",
"redirect": "Redirect",
"fragment": "Fragment",
"finalRules": "Nihai Kurallar",
"overrideXrayPrivateIp": "Xray'in varsayılan özel IP bloğunu geçersiz kıl",
"blockDelay": "Engelleme Gecikmesi (ms)",
@@ -1630,43 +1490,17 @@
"keepAliveInterval": "Keep Alive Aralığı",
"markFwmark": "Mark (fwmark)",
"interface": "Arabirim",
"ipv6Only": "Yalnızca IPv6",
"acceptProxyProtocol": "Proxy Protocol Kabul Et",
"proxyProtocol": "Proxy Protocol",
"tcpUserTimeoutMs": "TCP User Timeout (ms)",
"tcpKeepAliveIdleS": "TCP keep-alive idle (s)"
},
"outbound": {
"addOutbound": "Giden Bağlantı Ekle",
"addReverse": "Ters Ekle",
"editOutbound": "Giden Bağlantını Düzenle",
"editReverse": "Tersi Düzenle",
"reverseTag": "Ters Etiket",
"reverseTagDesc": "VLESS basit ters proxy giden bağlantı etiketi. Devre dışı bırakmak için boş bırakın.",
"reverseTagPlaceholder": "çıkış etiketi (boş = devre dışı)",
"tag": "Etiket",
"tagDesc": "Benzersiz Etiket",
"address": "Adres",
"egress": "Egress",
"egressHint": "Run an HTTP test to show egress IP and country.",
"reverse": "Ters",
"domain": "Alan Adı",
"type": "Tür",
"bridge": "Bridge",
"portal": "Portal",
"link": "Bağlantı",
"intercon": "Bağlantı",
"settings": "Ayarlar",
"accountInfo": "Hesap Bilgileri",
"outboundStatus": "Giden Bağlantı Durumu",
"sendThrough": "Üzerinden Gönder",
"targetStrategy": "Hedef Stratejisi",
"test": "Test",
"testResult": "Test Sonucu",
"testing": "Bağlantı test ediliyor...",
"testSuccess": "Test başarılı",
"testFailed": "Test başarısız",
"testError": "Giden bağlantı test edilemedi",
"modeRealDelay": "Gerçek gecikme",
"testModeTooltip": "TCP: hızlı sadece arama (dial-only) testi. HTTP: Xray üzerinden tam istek. Gerçek gecikme: bağlantı kurulumu dahil toplam süre.",
"testAll": "Tümünü Test Et",
@@ -1674,14 +1508,10 @@
"breakdownConnect": "Proxy bağlantısı",
"breakdownTls": "Giden üzerinden TLS",
"breakdownTtfb": "İlk bayt",
"nordvpn": "NordVPN",
"accessToken": "Erişim Jetonu",
"country": "Ülke",
"server": "Sunucu",
"city": "Şehir",
"allCities": "Tüm Şehirler",
"privateKey": "Özel Anahtar",
"load": "Yükle",
"moveToTop": "En üste taşı"
},
"outboundSub": {
@@ -1711,16 +1541,11 @@
"active": "Aktif abonelikler",
"empty": "Henüz hiç abonelik yok. Yukarıdan bir tane ekleyin.",
"colRemark": "Açıklama",
"colPrefix": "Önek",
"colInterval": "Aralık",
"colLastFetch": "Son getirme",
"colEnabled": "Etkin",
"auto": "otomatik",
"never": "asla",
"yes": "Evet",
"no": "Hayır",
"refreshNow": "Şimdi yenile",
"lastError": "Son hata",
"deleteConfirm": "Bu aboneliği silmek istiyor musunuz?",
"restartHint": "Ekledikten veya yeniledikten sonra giden bağlantılarnı aktif hale getirmek için Xray'i yeniden başlatın (veya bir sonraki otomatik yeniden yüklemeyi bekleyin).",
"fromSubsTitle": "Giden bağlantı aboneliklerinden (salt okunur)",
@@ -1737,8 +1562,6 @@
"tabBalancerSettings": "Dengeleyici Ayarları",
"tabObservatory": "Gözlemci",
"observatory": {
"title": "Gözlemci",
"burstTitle": "Burst Gözlemci",
"autoManaged": "Gözlemciler dengeleyicilerinize göre otomatik yönetilir. Nasıl sınama yapacaklarını aşağıdan ayarlayın; izlenen çıkışlar dengeleyici seçicilerini izler.",
"emptyHint": "Etkin bir bağlantı gözlemcisi yok. Least Ping veya Least Load dengeleyici — ya da fallback içeren Random / Round-robin dengeleyici — oluşturduğunuzda otomatik olarak bir tane eklenir; böylece gözlemci kullanan dengeleyiciler hedef seçmeden önce çıkış sağlığını kontrol edebilir.",
"mixedLegacy": "Bu yapılandırmada hem Observatory hem de Burst Observatory var. Xray tek bir global gözlemci kullanır, bu nedenle bu eski karma durum desteklenmez; dengeleyiciler kaydedildiğinde tek bir gözlemciye normalleştirilir.",
@@ -1772,12 +1595,8 @@
"balancerRemoved": "Dengeleyici {tag} — kaldırıldı (hedef kalmadı)"
},
"balancer": {
"addBalancer": "Dengeleyici Ekle",
"editBalancer": "Dengeleyiciyi Düzenle",
"balancerStrategy": "Strateji",
"balancerSelectors": "Seçiciler",
"tag": "Etiket",
"tagDesc": "Benzersiz Etiket",
"tagDuplicate": "Etiket başka bir dengeleyici tarafından kullanılıyor",
"tagPlaceholder": "benzersiz dengeleyici etiketi",
"selector": "Seçici",
@@ -1789,7 +1608,6 @@
"tolerance": "Tolerans",
"baselines": "Baselines",
"costs": "Costs",
"balancerDesc": "Dengeleyici Etiketi (balancerTag) ve Giden Bağlantı Etiketi (outboundTag) aynı anda kullanılamaz. Aynı anda kullanıldığında yalnızca giden bağlantı etiketi geçerli olur.",
"costMatch": "Etiket deseni",
"costValue": "Ağırlık",
"costRegexp": "Düzenli ifade eşleşmesi",
@@ -1804,14 +1622,10 @@
"publicKey": "Genel Anahtar",
"allowedIPs": "İzin Verilen IP'ler",
"endpoint": "Uç Nokta",
"psk": "Ön Paylaşılan Anahtar",
"domainStrategy": "Alan Adı Stratejisi"
},
"tun": {
"nameDesc": "TUN arabiriminin adı. Varsayılan değer 'xray0'dır.",
"mtuDesc": "Maksimum İletim Birimi. Veri paketlerinin maksimum boyutu. Varsayılan değer 1500'dür.",
"userLevel": "Kullanıcı Seviyesi",
"userLevelDesc": "Bu gelen bağlantı üzerinden yapılan tüm bağlantılar bu kullanıcı seviyesini kullanacaktır. Varsayılan değer 0'dır."
"userLevel": "Kullanıcı Seviyesi"
},
"nord": {
"accessToken": "Access Token",
@@ -1896,7 +1710,6 @@
},
"fakedns": {
"add": "Sahte DNS Ekle",
"edit": "Sahte DNS'i Düzenle",
"ipPool": "IP Havuzu Alt Ağı",
"poolSize": "Havuz Boyutu"
},
@@ -2032,7 +1845,6 @@
"add": "Ekle",
"month": "Ay",
"months": "Aylar",
"day": "Gün",
"days": "Günler",
"hours": "Saatler",
"minutes": "Dakikalar",
@@ -2071,7 +1883,6 @@
"userSaved": "✅ Telegram Kullanıcısı kaydedildi.",
"loginSuccess": "✅ Panele başarıyla giriş yapıldı.\r\n",
"loginFailed": "❗️Panele giriş denemesi başarısız oldu.\r\n",
"2faFailed": "2FA Hatası",
"report": "🕰 Planlanmış Raporlar: {{ .RunTime }}\r\n",
"datetime": "⏰ Tarih ve Saat: {{ .DateTime }}\r\n",
"hostname": "💻 Host: {{ .Hostname }}\r\n",
@@ -2104,7 +1915,6 @@
"download": "🔽 İndirme: ↓{{ .Download }}\r\n",
"total": "📊 Toplam: ↑↓{{ .UpDown }} / {{ .Total }}\r\n",
"TGUser": "👤 Telegram Kullanıcısı: {{ .TelegramID }}\r\n",
"exhaustedMsg": "🚨 Limiti Dolanlar ({{ .Type }}):\r\n",
"exhaustedCount": "🚨 Limiti Dolan {{ .Type }} sayısı:\r\n",
"onlinesCount": "🌐 Çevrimiçi Kullanıcılar: {{ .Count }}\r\n",
"disabled": "🛑 Devre Dışı: {{ .Disabled }}\r\n",
@@ -2113,16 +1923,10 @@
"refreshedOn": "\r\n📋🔄 Yenilendi: {{ .Time }}\r\n\r\n",
"yes": "✅ Evet",
"no": "❌ Hayır",
"received_id": "🔑📥 Kimlik (ID) güncellendi.",
"received_password": "🔑📥 Şifre güncellendi.",
"received_email": "📧📥 E-posta güncellendi.",
"received_comment": "💬📥 Yorum güncellendi.",
"id_prompt": "🔑 Mevcut Kimlik (ID): {{ .ClientId }}\n\nYeni kimliğinizi (ID) girin.",
"pass_prompt": "🔑 Varsayılan Şifre: {{ .ClientPassword }}\n\nŞifrenizi girin.",
"email_prompt": "📧 Varsayılan E-posta: {{ .ClientEmail }}\n\nE-postanızı girin.",
"comment_prompt": "💬 Varsayılan Yorum: {{ .ClientComment }}\n\nYorumunuzu girin.",
"inbound_client_data_id": "🔄 Gelen Bağlantı: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 E-posta: {{ .ClientEmail }}\n📊 Kota: {{ .ClientTraffic }}\n📅 Bitiş Tarihi: {{ .ClientExp }}\n🌐 IP Sınırı: {{ .IpLimit }}\n💬 Açıklama: {{ .ClientComment }}\n\nArtık bu kullanıcıyı gelen bağlantıya ekleyebilirsiniz!",
"inbound_client_data_pass": "🔄 Gelen Bağlantı: {{ .InboundRemark }}\n\n🔑 Şifre: {{ .ClientPass }}\n📧 E-posta: {{ .ClientEmail }}\n📊 Kota: {{ .ClientTraffic }}\n📅 Bitiş Tarihi: {{ .ClientExp }}\n🌐 IP Sınırı: {{ .IpLimit }}\n💬 Açıklama: {{ .ClientComment }}\n\nArtık bu kullanıcıyı gelen bağlantıya ekleyebilirsiniz!",
"cancel": "❌ İşlem iptal edildi! \n\nİstediğiniz zaman /start ile yeniden başlayabilirsiniz. 🔄",
"error_add_client": "⚠️ Hata:\n\n {{ .error }}",
"using_default_value": "Tamam, varsayılan değeri kullanacağım. 😊",
@@ -2139,8 +1943,6 @@
"eventXrayCrashError": "Hata: {{ .Error }}",
"eventNodeDown": "{{ .Name }} düğümü ÇEVRİMDIŞI",
"eventNodeUp": "{{ .Name }} düğümü ÇEVRİMİÇİ",
"eventCPUHigh": "Yüksek CPU",
"eventCPUHighDetail": "CPU: {{ .Detail }}",
"eventLoginFallback": "{{ .Source }} adresinden oturum açma başarısız",
"memoryThreshold": "Bellek kullanımı {{ .Percent }}% eşiği {{ .Threshold }}% aşıyor"
},
@@ -2181,11 +1983,8 @@
"submitDisable": "Devre Dışı Olarak Gönder ☑️",
"submitEnable": "Etkin Olarak Gönder ✅",
"use_default": "🏷️ Varsayılanı Kullan",
"change_id": "⚙️🔑 Kimlik",
"change_password": "⚙️🔑 Şifre",
"change_email": "⚙️📧 E-posta",
"change_comment": "⚙️💬 Yorum",
"change_flow": "⚙️🚦 Flow",
"ResetAllTraffics": "Tüm Trafikleri Sıfırla",
"SortedTrafficUsageReport": "Sıralı Trafik Kullanım Raporu"
},
@@ -2214,31 +2013,16 @@
}
},
"email": {
"subjectOutboundDown": "{{ .Tag }} giden bağlantısı ÇEVRİMDIŞI",
"subjectOutboundUp": "{{ .Tag }} giden bağlantısı ÇEVRİMİÇİ",
"subjectXrayCrash": "Xray ÇÖKTÜ",
"subjectCPUHigh": "Yüksek CPU",
"subjectLoginSuccess": "Oturum açma başarılı",
"subjectLoginFailed": "Oturum açma başarısız",
"titleOutboundDown": "Giden Bağlantı ÇEVRİMDIŞI",
"titleOutboundUp": "Giden Bağlantı ÇEVRİMİÇİ",
"titleXrayCrash": "Xray ÇÖKTÜ",
"titleCPUHigh": "Yüksek CPU",
"titleLoginSuccess": "Oturum açma başarılı",
"titleLoginFailed": "Oturum açma başarısız",
"labelStatus": "Durum",
"labelOutbound": "Giden Bağlantı",
"labelNode": "Düğüm",
"labelError": "Hata",
"labelDelay": "Gecikme",
"labelDetail": "Ayrıntı",
"labelUsername": "Kullanıcı Adı",
"labelIP": "IP",
"labelReason": "Neden",
"labelSource": "Kaynak",
"labelTime": "Zaman",
"statusCrashed": "ÇÖKTÜ",
"statusRunning": "Çalışıyor",
"statusHigh": "YÜKSEK",
"statusSuccess": "BAŞARILI",
"statusFailed": "BAŞARISIZ",