ITEM6 B4: frontend reshaping — xray page retired, stats switches to settings, template read paths closed

- Delete the xray settings page (routes/menu/title), geodata UI/service,
  XraySettingController/Service and routing-sync write paths; the stored
  xrayTemplateConfig row loses its last readers (GetXrayConfigTemplate now
  returns the embedded factory template; B1 already deleted the row).
- Settings GeneralTab gains the four trafficStatsSwitches switches
  (settings.trafficStatsSwitches, B1) with the dual warning copy; entity
  AllSetting carries the key end to end (TestTrafficStatsSwitchesPlumbing).
- Tag-directory consumers (panelOutbound, mtproto egress, node/host
  outbound pickers) move from POST /xray/ to GET /server/outboundDirectory.
- Shared Mux/Sockopt forms and balancer helpers relocated to lib/xray;
  converter preserves sniffing ips/domains exclusions into the panel
  sidecar instead of dropping them (B2 gap closed by retention).
- Freedom final-rules DB fix seeders retired; getDefaultJsonConfig
  endpoint removed (no in-repo consumer); locales pruned to referenced
  keys (pages.xray 331 -> 68) plus the five new settings keys.
This commit is contained in:
Muse
2026-10-22 23:40:54 +00:00
parent 1762e54d5f
commit 277838d7ca
151 changed files with 780 additions and 22140 deletions
+10 -297
View File
@@ -98,9 +98,6 @@
"clients": "Kullanıcılar",
"nodes": "Düğümler",
"settings": "Panel Ayarları",
"xray": "Xray Yapılandırmaları",
"routing": "Yönlendirme",
"outbounds": "Giden Bağlantılar",
"donate": "Bağış Yap",
"hosts": "Host'lar",
"docs": "Belgeler",
@@ -272,7 +269,6 @@
"clone": "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?",
"email": "E-posta",
"IPLimit": "IP Limiti",
"IPLimitlog": "IP Günlüğü",
@@ -1211,269 +1207,29 @@
"tgNotifyBackup": "Veritabanı Yedeği",
"tgNotifyBackupDesc": "Bir rapor ile birlikte veritabanı yedek dosyasını gönderir.",
"tgTestFailed": "Telegram testi başarısız oldu",
"tgTestSuccess": "Test mesajı Telegram'a gönderildi"
"tgTestSuccess": "Test mesajı Telegram'a gönderildi",
"trafficStatsInboundUplink": "Inbound Upload Accounting",
"trafficStatsInboundDownlink": "Inbound Download Accounting",
"trafficStatsOutboundUplink": "Outbound Upload Accounting",
"trafficStatsOutboundDownlink": "Outbound Download Accounting",
"trafficStatsDesc": "Applies to the whole network. A direction pair (inbound or outbound) is counted only while both of its switches are on. While counting is off, that traffic is never recorded and the gap is permanent — it is not backfilled later — and expiry / over-quota auto-disable loses the data it relies on."
},
"xray": {
"save": "Kaydet",
"basicTemplate": "Temeller",
"advancedTemplate": "Gelişmiş",
"generalConfigs": "Genel",
"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.",
"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.",
"blockips": "IP'leri Engelle",
"blockdomains": "Alan Adlarını Engelle",
"directips": "Doğrudan IP'ler",
"directdomains": "Doğrudan Alan Adları",
"ipv4Routing": "IPv4 Yönlendirme",
"ipv4RoutingDesc": "Bu seçenekler belirli bir varış yerine IPv4 üzerinden trafiği yönlendirir.",
"FreedomStrategy": "Freedom Protokol Stratejisi",
"FreedomStrategyDesc": "Freedom Protokolünde ağın çıkış stratejisini ayarlayın.",
"FreedomHappyEyeballs": "Özgürlük Dolu Gözler (IPv4/IPv6)",
"FreedomHappyEyeballsDesc": "Doğrudan (freedom) çıkış için çift yığınlı (dual-stack) arama — hem IPv4 hem de IPv6 desteği olan çıkış sunucularında kullanışlıdır.",
"FreedomHappyEyeballsTryDelayDesc": "Diğer adres ailesini denemeden önceki milisaniye. 150–250 ms iyi bir başlangıç noktasıdır.",
"RoutingStrategy": "Genel Yönlendirme Stratejisi",
"RoutingStrategyDesc": "Tüm istekleri çözmek için genel trafik yönlendirme stratejisini ayarlayın.",
"importRules": "Kuralları İçe Aktar",
"exportRules": "Kuralları Dışa Aktar",
"importOutbounds": "Giden Bağlantıları İçe Aktar",
"exportOutbounds": "Giden Bağlantıları Dışa Aktar",
"importInvalidJson": "Geçersiz JSON — bir dizi veya eşleşen anahtara sahip bir nesne bekleniyordu.",
"metricsListen": "Metrik Uç Noktası",
"metricsListenDesc": "Xray'in Prometheus tarzı metriklerini bu adres:port üzerinde sunar (ör. 127.0.0.1:11111). Devre dışı bırakmak için boş bırakın. localhost'a bağlayın ve ters proxy ile sunun — kimlik doğrulaması yoktur.",
"metricsTag": "Metrik Etiketi",
"Torrent": "BitTorrent Protokolünü Engelle",
"Inbounds": "Gelen Bağlantılar",
"Outbounds": "Giden Bağlantılar",
"Balancers": "Dengeleyiciler",
"balancerTagRequired": "Etiket zorunludur",
"balancerSelectorRequired": "En az bir giden bağlantı seçin",
"routeTester": "Rota Testi",
"routeTesterDesc": "Çalışan Xray'e hangi giden bağlantının bir isteği işleyeceğini sorun. Gerçek trafik gönderilmez — karar doğrudan canlı yönlendirme motorundan gelir.",
"routeTesterDest": "Alan adı veya IP",
"routeTesterPort": "Port",
"routeTesterInbound": "Gelen",
"routeTesterProtocol": "Algılanan protokol",
"routeTesterTest": "Rotayı Test Et",
"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.",
"Routings": "Yönlendirme Kuralları",
"logLevel": "Günlük Seviyesi",
"logLevelDesc": "Hata günlükleri için kayıt seviyesi; hangi detayda bilginin kaydedileceğini belirler.",
"accessLog": "Erişim Günlüğü",
"accessLogDesc": "Erişim günlüğü için dosya yolu. 'none' özel değeri erişim günlüklerini devre dışı bırakır.",
"errorLog": "Hata Günlüğü",
"errorLogDesc": "Hata günlüğü için dosya yolu. 'none' özel değeri hata günlüklerini devre dışı bırakır.",
"dnsLog": "DNS Günlüğü",
"dnsLogDesc": "DNS sorgu günlüklerini etkinleştirir.",
"maskAddress": "Adres Maskesi",
"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",
"statsInboundDownlink": "Gelen İndirme İstatistikleri",
"statsOutboundUplink": "Giden Yükleme İstatistikleri",
"statsOutboundDownlink": "Giden İndirme İstatistikleri",
"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ı",
"connIdleDesc": "Bağlantı bu kadar saniye boşta kaldıktan sonra kapatılır. Değerin düşürülmesi, yoğun sunucularda belleği ve dosya tanımlayıcılarını daha hızlı serbest bırakır (Xray varsayılanı: 300).",
"bufferSize": "Arabellek Boyutu",
"bufferSizeDesc": "Bağlantı başına dahili arabellek boyutu (KB). Düşük RAM'li sunucularda bellek kullanımını en aza indirmek için 0 olarak ayarlayın (Xray varsayılanı platforma bağlıdır).",
"bufferSizePlaceholder": "otomatik",
"seconds": "saniye",
"rules": {
"source": "Kaynak",
"dest": "Hedef",
"inbound": "Gelen Bağlantı",
"useComma": "Virgülle ayrılmış öğeler"
},
"routing": {
"dragToReorder": "Yeniden sıralamak için sürükleyin"
},
"geoBrowser": {
"title": "Geo kategorileri",
"openTooltip": "Geo kategorilerine göz at",
"database": "Veritabanı",
"searchCategory": "Kategori ara",
"searchEntries": "Kategori içinde filtrele",
"selectFound": "Bulunanları seç",
"selected": "Seçili: {count}",
"clearAll": "Tümünü Temizle",
"apply": "Uygula",
"emptySelection": "Kategorileri işaretleyin — kural belirteçlerine dönüşürler",
"pickCategory": "İçeriğini görmek için soldan bir kategori seçin",
"noMatches": "Hiçbir şey bulunamadı",
"noFiles": "Xray klasöründe geo veritabanı yok",
"noFilesHint": "Xray, geosite.dat ve geoip.dat dosyalarını indirdikten sonra görünürler",
"fileMeta": "{count} kategori · {size} · güncellendi {date}",
"entriesCount": "{count} kayıt",
"subnetsCount": "{count} alt ağ",
"shownRange": "{total} kayıttan {from}–{to} arası gösteriliyor",
"loadFailed": "Geo veritabanları yüklenemedi",
"checkFailed": "Bu değerler geo veritabanlarıyla doğrulanamadı",
"parseFailed": "Dosya bozuk veya geosite/geoip veritabanı değil",
"tooLarge": "Göz atmak için fazla büyük",
"unknownCategories": "Veritabanında yok: {tokens}",
"missingDatabase": "Veritabanı dosyası bulunamadı: {tokens} — Geodata bölümünden ekleyin",
"unknownAttribute": "Öznitelik bulunamadı, kural hiçbir şeyle eşleşmez: {tokens}",
"invalidToken": "Xray böyle bir kaydı kabul etmez: {tokens}",
"wrongKind": "Bu alan için yanlış veritabanı türü: {tokens}"
},
"ruleForm": {
"sourceIps": "Kaynak IP'ler",
"sourcePort": "Kaynak Port",
"vlessRoute": "VLESS Rotası",
"attributes": "Öznitelikler",
"value": "Değer",
"user": "Kullanıcı",
"userPlaceholder": "Kullanıcıları seçin",
"userEmpty": "Kullanılabilir kullanıcı yok",
"userLoadError": "Kullanıcılar yüklenemedi",
"inboundTags": "Gelen Bağlantı Etiketleri",
"outboundTag": "Giden Bağlantı Etiketi",
"balancerTag": "Dengeleyici Etiketi",
"balancerTagTooltip": "Trafiği yapılandırılmış yük dengeleyicilerden biri üzerinden yönlendirir"
"inbound": "Gelen Bağlantı"
},
"outboundForm": {
"tagDuplicate": "Etiket başka bir giden bağlantı tarafından kullanılıyor",
"tagRequired": "Etiket zorunludur",
"tagPlaceholder": "benzersiz-etiket",
"localIpPlaceholder": "yerel IP",
"dialerProxyPlaceholder": "Zincirlemek için bir giden bağlantı seçin",
"dialerProxyHint": "Bir proxy zinciri oluşturmak için bu giden bağlantıyı başka bir giden bağlantı (etikete göre) üzerinden bağlayın. Doğrudan bağlanmak için boş bırakın.",
"targetStrategyHint": "Bağlanmadan önce hedef alan adının nasıl çözümleneceği: AsIs (varsayılan) olduğu gibi gönderir, UseIP… çözümler ve başarısızsa geri döner, ForceIP… çözümleme zorunludur.",
"addressRequired": "Adres zorunludur",
"portRequired": "Port zorunludur",
"optional": "opsiyonel",
"udpOverTcp": "TCP Üzerinden UDP",
"uotVersion": "UoT Sürümü",
"inboundTag": "Gelen Bağlantı Etiketi",
"inboundTagPlaceholder": "yönlendirme kurallarında kullanılan gelen bağlantı etiketi",
"responseType": "Yanıt Tipi",
"rewriteNetwork": "Ağı Yeniden Yaz",
"unchanged": "(değişmedi)",
"unchangedAddress": "(değişmedi) örn. 1.1.1.1",
"rules": "Kurallar",
"ruleN": "Kural {n}",
"action": "Eylem",
"redirect": "Yönlendirme",
"finalRules": "Nihai Kurallar",
"overrideXrayPrivateIp": "Xray'in varsayılan özel IP bloğunu geçersiz kıl",
"blockDelay": "Engelleme Gecikmesi (ms)",
"reverseSniffing": "Ters Dinleme (Sniffing)",
"reserved": "Ayrılmış",
"minUploadInterval": "Min. Yükleme Aralığı (ms)",
"maxUploadSizeBytes": "Maks. Yükleme Boyutu (bayt)",
"uplinkChunkSize": "Uplink Chunk Boyutu",
"noGrpcHeader": "gRPC Başlığı Yok",
"maxConcurrency": "Maks. Eşzamanlılık",
"maxConnections": "Maks. Bağlantı",
"maxReuseTimes": "Maks. Yeniden Kullanım",
"maxRequestTimes": "Maks. İstek Sayısı",
"maxReusableSecs": "Maks. Yeniden Kullanılabilir Saniye",
"keepAlivePeriod": "Keep Alive Periyodu",
"authPassword": "Auth Parolası",
"visionTestpre": "Vision Testpre",
"serverNamePlaceholder": "sunucu adı",
"verifyPeerName": "Peer Adını Doğrula",
"pinnedSha256": "Sabitlenmiş SHA256",
"shortId": "Kısa Kimlik",
"sockopts": "Sockopts",
"keepAliveInterval": "Keep Alive Aralığı",
"markFwmark": "Mark (fwmark)",
"interface": "Arabirim",
"proxyProtocol": "Proxy Protocol",
"tcpUserTimeoutMs": "TCP User Timeout (ms)",
"tcpKeepAliveIdleS": "TCP keep-alive bekleme süresi (saniye)"
},
"outbound": {
"tag": "Etiket",
"outboundStatus": "Giden Bağlantı Durumu",
"sendThrough": "Üzerinden Gönder",
"targetStrategy": "Hedef Stratejisi",
"country": "Ülke",
"server": "Sunucu",
"city": "Şehir",
"allCities": "Tüm Şehirler",
"moveToTop": "En üste taşı"
},
"outboundSub": {
"manage": "Abonelikler",
"title": "Giden Bağlantı Abonelikleri",
"remark": "Açıklama (isteğe bağlı)",
"remarkPlaceholder": "örn. HK düğümleri",
"url": "Abonelik URL'si",
"urlPlaceholder": "https://... (bağlantıların base64 listesi)",
"tagPrefix": "Etiket öneki",
"tagPrefixPlaceholder": "hk-",
"interval": "Güncelleme aralığı",
"hours": "sa",
"minutes": "dk",
"intervalHint": "Varsayılan 10 dakika. Arka plan görevi sık sık kontrol eder; her abonelik yalnızca kendi güncelleme süresi dolduğunda yeniden getirilir.",
"enabled": "Etkin",
"allowPrivate": "Özel ağ adreslerine izin ver",
"allowPrivateHint": "Bu aboneliğin URL'si için localhost / LAN / özel IP adreslerine izin verir. Güvenlik nedeniyle varsayılan olarak kapalıdır — yalnızca güvenilen bir yerel kaynak için etkinleştirin.",
"prepend": "Manuel giden bağlantılarndan önce",
"prependHint": "Bu aboneliğin giden bağlantılarnı manuel olanlarınızın öncesine ekler, böylece birisi varsayılan giden bağlantı olabilir.",
"preview": "Önizleme",
"previewEmpty": "Bu URL'de hiçbir giden bağlantı bulunamadı.",
"refreshAll": "Tümünü yenile",
"statusOk": "Tamam",
"toastUpdated": "Abonelik güncellendi",
"addButton": "Ekle",
"active": "Aktif abonelikler",
"empty": "Henüz hiç abonelik yok. Yukarıdan bir tane ekleyin.",
"colRemark": "Açıklama",
"colLastFetch": "Son getirme",
"colEnabled": "Etkin",
"auto": "otomatik",
"never": "asla",
"refreshNow": "Şimdi yenile",
"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)",
"fromSubsDesc": "Aktif aboneliklerinizden içe aktarıldı. Bunları yukarıdaki Abonelikler panelinden yönetin.",
"toastLoadFailed": "Abonelikler yüklenemedi",
"toastUrlRequired": "Abonelik URL'si gereklidir",
"toastAdded": "Abonelik eklendi",
"toastAddFailed": "Abonelik eklenemedi",
"toastRefreshed": "Yenilendi",
"toastRefreshFailed": "Yenileme başarısız",
"toastDeleted": "Silindi",
"toastDeleteFailed": "Silme işlemi başarısız"
},
"pia": {
"menu": "PIA",
"username": "PIA kullanıcı adı",
"password": "PIA parolası",
"account": "Hesap",
"region": "Bölge",
"allRegions": "Tüm bölgeler",
"noServers": "Seçilen ülke için sunucu bulunamadı",
"outboundAdded": "PIA çıkışı eklendi",
"outboundUpdated": "PIA çıkışı güncellendi",
"addedServers": "Eklenen sunucular",
"alreadyAdded": "Bu sunucu zaten çıkış listesinde. Anahtarı yenilemek için {reset} kullanın.",
"provisionFailed": "PIA çıkışı oluşturulamadı. Yeniden deneyin."
},
"observatory": {
"deleteAlsoObservatory": "Bu, Observatory kullanan son dengeleyici, bu yüzden o da kaldırılacak.",
"deleteAlsoBurst": "Bu, Burst Observatory kullanan son dengeleyici, bu yüzden o da kaldırılacak."
},
"refCleanup": {
"header": "Bunu silmek yönlendirmenizi de günceller:",
"ruleRemoved": "Kural {label} — kaldırıldı (hedef kalmadı)",
"ruleModified": "Kural {label} — korundu (artık {keeps} kullanıyor)",
"balancerRemoved": "Dengeleyici {tag} — kaldırıldı (hedef kalmadı)"
},
"balancer": {
"balancerStrategy": "Strateji",
"balancerFallbackCycle": "Bu dengeleyiciyi yedek olarak ayarlayamazsınız — döngüsel bağımlılık oluşturur.",
"reservedPrefix": " _bl_ ön eki dahili dengeleyici loopback nesneleri için ayrılmıştır"
"keepAlivePeriod": "Keep Alive Periyodu"
},
"wireguard": {
"secretKey": "Gizli Anahtar",
@@ -1481,7 +1237,6 @@
"subnetIp": "Alt Ağ",
"subnetCidr": "Alt Ağ CIDR",
"allowedIPs": "İzin Verilen IP'ler",
"endpoint": "Uç Nokta",
"domainStrategy": "Alan Adı Stratejisi"
},
"amneziawg": {
@@ -1537,48 +1292,7 @@
},
"tun": {
"userLevel": "Kullanıcı Seviyesi"
},
"nord": {
"accessToken": "Access Token",
"privateKey": "Özel Anahtar",
"noServers": "Seçilen ülke için sunucu bulunamadı.",
"noPublicKey": "Seçilen sunucu NordLynx genel anahtarı yayınlamıyor.",
"outboundAdded": "NordVPN giden bağlantı eklendi.",
"outboundUpdated": "NordVPN giden bağlantı güncellendi."
},
"warp": {
"changeIp": "IP Değiştir",
"changeIpSuccess": "WARP IP adresi başarıyla değiştirildi!",
"autoUpdateIp": "IP Adresini Otomatik Güncelle",
"intervalDays": "Aralık (Gün)",
"intervalDesc": "Devre dışı bırakmak için 0. IP adresini otomatik olarak değiştirir.",
"licenseError": "WARP lisansı ayarlanamadı.",
"fetchFirst": "Önce WARP yapılandırmasını alın.",
"createAccount": "WARP Hesabı Oluştur",
"accessToken": "Access Token",
"deviceId": "Cihaz ID",
"licenseKey": "Lisans Anahtarı",
"privateKey": "Özel Anahtar",
"deleteAccount": "Hesabı Sil",
"settings": "Ayarlar",
"licenseKeyLabel": "WARP / WARP+ Lisans Anahtarı",
"key": "Anahtar",
"keyPlaceholder": "26 karakterli WARP+ anahtarı",
"accountInfo": "Hesap Bilgisi",
"deviceName": "Cihaz Adı",
"deviceModel": "Cihaz Modeli",
"deviceEnabled": "Cihaz Etkin",
"accountType": "Hesap Tipi",
"role": "Rol",
"warpPlusData": "WARP+ Veri",
"quota": "Kota",
"usage": "Kullanım",
"addOutbound": "Giden Bağlantı Ekle"
},
"dns": {},
"fakedns": {},
"defaultOutbound": "Varsayılan giden",
"defaultOutboundDesc": "Yönlendirme kuralıyla eşleşmeyen trafik bu gideni kullanır (listedeki ilk giden)."
}
},
"hosts": {
"addHost": "Host Ekle",
@@ -1876,6 +1590,5 @@
"chooseClient": "Gelen Bağlantı {{ .Inbound }} için bir Kullanıcı Seçin",
"chooseInbound": "Bir Gelen Bağlantı Seçin"
}
},
"email": {}
}
}