i18n(panel): migrate hardcoded panel strings to en-US and translate all locales

Surface ~400 hardcoded English labels, tooltips, placeholders, dt/divider
text, modal okText/cancelText, and Spin loading from the panel pages
(clients/groups/inbounds/nodes/settings/xray/sub/index) into
web/translation/en-US.json under existing pages.<page>.* namespaces, with
JSX swapped to t(...). Brand and protocol identifiers (TLS, MTU, SNI,
NordVPN, Cloudflare WARP, etc.) stay literal.

Sync all 12 non-English locales (ar-EG, es-ES, fa-IR, id-ID, ja-JP,
pt-BR, ru-RU, tr-TR, uk-UA, vi-VN, zh-CN, zh-TW) to match en-US's
structure and translate the 521 new key paths per locale. Every locale
file now has 1539 lines, mirroring en-US ordering.

Also remove a dead duplicate "info": "Info" key under pages.inbounds
that collided with the new pages.inbounds.info.* object.

Backend: bulk attach/detach errors in web/service/client.go now route
through logger.Warningf (so they appear under /panel/api/server/logs/)
instead of only living on the response payload.
This commit is contained in:
MHSanaei
2026-05-28 18:03:07 +02:00
parent 0829f1ecd4
commit 72b97efa8a
34 changed files with 6391 additions and 1125 deletions
+448 -31
View File
@@ -8,15 +8,22 @@
"save": "Simpan",
"logout": "Keluar",
"create": "Buat",
"add": "Tambah",
"remove": "Hapus",
"update": "Perbarui",
"copy": "Salin",
"copied": "Tersalin",
"more": "lainnya",
"download": "Unduh",
"remark": "Catatan",
"enable": "Aktifkan",
"protocol": "Protokol",
"search": "Cari",
"filter": "Filter",
"all": "Semua",
"from": "Dari",
"to": "Ke",
"done": "Selesai",
"loading": "Memuat...",
"refresh": "Segarkan",
"clear": "Bersihkan",
@@ -27,7 +34,7 @@
"check": "Centang",
"indefinite": "Tak Terbatas",
"unlimited": "Tanpa Batas",
"none": "None",
"none": "Tidak ada",
"qrCode": "Kode QR",
"info": "Informasi Lebih Lanjut",
"edit": "Edit",
@@ -40,8 +47,8 @@
"useIPv4ForHost": "Gunakan IPv4 untuk host",
"transmission": "Transmisi",
"host": "Host",
"path": "Jalur",
"camouflage": "Obfuscation",
"path": "Path",
"camouflage": "Obfuskasi",
"status": "Status",
"enabled": "Aktif",
"disabled": "Nonaktif",
@@ -95,8 +102,9 @@
"dark": "Gelap",
"ultraDark": "Sangat Gelap",
"dashboard": "Ikhtisar",
"inbounds": "Masuk",
"inbounds": "Inbound",
"clients": "Klien",
"groups": "Grup",
"nodes": "Node",
"settings": "Pengaturan Panel",
"xray": "Konfigurasi Xray",
@@ -128,8 +136,8 @@
"memory": "RAM",
"threads": "Thread",
"xrayStatus": "Xray",
"stopXray": "Stop",
"restartXray": "Restart",
"stopXray": "Hentikan",
"restartXray": "Mulai ulang",
"xraySwitch": "Versi",
"xrayUpdates": "Pembaruan Xray",
"xraySwitchClick": "Pilih versi yang ingin Anda pindah.",
@@ -143,7 +151,7 @@
"xrayStatusUnknown": "Tidak diketahui",
"xrayStatusRunning": "Berjalan",
"xrayStatusStop": "Berhenti",
"xrayStatusError": "Kesalahan",
"xrayStatusError": "Error",
"xrayErrorPopoverTitle": "Terjadi kesalahan saat menjalankan Xray",
"operationHours": "Waktu Aktif",
"systemHistoryTitle": "Riwayat Sistem",
@@ -241,7 +249,7 @@
"getConfigError": "Terjadi kesalahan saat mengambil file konfigurasi"
},
"inbounds": {
"title": "Masuk",
"title": "Inbound",
"totalDownUp": "Total Terkirim/Diterima",
"totalUsage": "Penggunaan Total",
"inboundCount": "Total Masuk",
@@ -270,14 +278,14 @@
},
"protocol": "Protokol",
"port": "Port",
"portMap": "Port Mapping",
"traffic": "Traffic",
"portMap": "Pemetaan port",
"traffic": "Trafik",
"details": "Rincian",
"transportConfig": "Transport",
"expireDate": "Durasi",
"createdAt": "Dibuat",
"updatedAt": "Diperbarui",
"resetTraffic": "Reset Traffic",
"resetTraffic": "Reset trafik",
"addInbound": "Tambahkan Masuk",
"generalActions": "Tindakan Umum",
"modifyInbound": "Ubah Masuk",
@@ -292,6 +300,24 @@
"delAllClients": "Hapus Semua Klien",
"delAllClientsConfirmTitle": "Hapus semua {count} klien dari \"{remark}\"?",
"delAllClientsConfirmContent": "Menghapus setiap klien dari inbound ini dan menghapus catatan trafiknya. Inbound itu sendiri dipertahankan. Tindakan ini tidak dapat dibatalkan.",
"attachClients": "Lampirkan klien ke…",
"addClientsToGroup": "Tambah klien ke grup…",
"attachClientsTitle": "Lampirkan klien dari «{remark}»",
"attachClientsDesc": "Melampirkan {count} klien yang sama (UUID/kata sandi sama dan trafik bersama) ke inbound terpilih. Tetap ada di inbound ini juga.",
"attachClientsTargets": "Inbound tujuan",
"attachClientsNoTargets": "Tidak ada inbound kompatibel lain untuk dilampirkan.",
"attachClientsResult": "Dilampirkan {attached}, dilewati {skipped}.",
"attachClientsResultMixed": "Dilampirkan {attached}, dilewati {skipped}, error {errors}.",
"attachClientsSelectLabel": "Klien untuk dilampirkan",
"attachClientsSearchPlaceholder": "Cari email atau komentar",
"attachClientsStatusDisabled": "Dinonaktifkan",
"attachClientsSelectedCount": "{selected} dari {total} dipilih",
"detachClients": "Lepas klien",
"detachClientsTitle": "Lepas klien dari «{remark}»",
"detachClientsDesc": "Menghapus klien terpilih hanya dari inbound ini. Catatan klien tetap dipertahankan (gunakan Delete untuk menghapus sepenuhnya). Sumber memiliki total {count} klien.",
"detachClientsResult": "Dilepas {detached}, dilewati {skipped}.",
"detachClientsResultMixed": "Dilepas {detached}, dilewati {skipped}, error {errors}.",
"detachClientsSelectLabel": "Klien untuk dilepas",
"exportLinksTitle": "Ekspor tautan inbound",
"exportSubsTitle": "Ekspor tautan langganan",
"exportAllLinksTitle": "Ekspor semua tautan inbound",
@@ -306,7 +332,7 @@
"destinationPort": "Port Tujuan",
"targetAddress": "Alamat Target",
"monitorDesc": "Biarkan kosong untuk mendengarkan semua IP",
"meansNoLimit": "= Unlimited. (unit: GB)",
"meansNoLimit": "= Tanpa batas. (satuan: GB)",
"totalFlow": "Total Aliran",
"leaveBlankToNeverExpire": "Biarkan kosong untuk tidak pernah kedaluwarsa",
"noRecommendKeepDefault": "Disarankan untuk tetap menggunakan pengaturan default",
@@ -341,6 +367,7 @@
"IPLimitlogDesc": "Log histori IP. (untuk mengaktifkan masuk setelah menonaktifkan, hapus log)",
"IPLimitlogclear": "Hapus Log",
"setDefaultCert": "Atur Sertifikat dari Panel",
"setDefaultCertEmpty": "Tidak ada sertifikat yang dikonfigurasi untuk panel. Atur dulu di Pengaturan.",
"streamTab": "Stream",
"securityTab": "Keamanan",
"sniffingTab": "Sniffing",
@@ -369,7 +396,6 @@
},
"telegramDesc": "Harap berikan ID Obrolan Telegram. (gunakan perintah '/id' di bot) atau ({'@'}userinfobot)",
"subscriptionDesc": "Untuk menemukan URL langganan Anda, buka 'Rincian'. Selain itu, Anda dapat menggunakan nama yang sama untuk beberapa klien.",
"info": "Info",
"same": "Sama",
"inboundData": "Data Masuk",
"exportInbound": "Ekspor Masuk",
@@ -406,6 +432,139 @@
"getNewmldsa65Error": "Terjadi kesalahan saat mendapatkan sertifikat mldsa65.",
"getNewVlessEncError": "Terjadi kesalahan saat mendapatkan sertifikat VlessEnc."
},
"form": {
"moveUp": "Naik",
"moveDown": "Turun",
"addAll": "Tambah semua",
"addAllFallbackTooltip": "Tambahkan baris fallback untuk setiap inbound yang memenuhi syarat dan belum terhubung",
"peers": "Peers",
"addPeer": "Tambah peer",
"keepAlive": "Keep-alive",
"autoSystemRoutesTooltip": "Hanya Windows. CIDR ditambahkan otomatis ke tabel routing sistem agar trafik yang cocok melewati TUN.",
"autoOutboundsInterface": "Interface outbound otomatis",
"autoOutboundsInterfaceTooltip": "Interface fisik untuk trafik outbound. Gunakan 'auto' untuk deteksi; otomatis aktif saat Auto system routes diatur.",
"rewriteAddress": "Tulis ulang alamat",
"rewritePort": "Tulis ulang port",
"allowedNetwork": "Jaringan yang diizinkan",
"followRedirect": "Ikuti redirect",
"accounts": "Akun",
"allowTransparent": "Izinkan transparan",
"encryptionMethod": "Metode enkripsi",
"visionTestseed": "Vision testseed",
"version": "Versi",
"udpIdleTimeout": "UDP idle timeout (d)",
"masquerade": "Masquerade",
"type": "Tipe",
"upstreamUrl": "URL Upstream",
"rewriteHost": "Tulis ulang Host",
"skipTlsVerify": "Lewati verifikasi TLS",
"directory": "Direktori",
"statusCode": "Kode status",
"body": "Body",
"headers": "Header",
"proxyProtocol": "Proxy Protocol",
"requestVersion": "Versi permintaan",
"requestMethod": "Metode permintaan",
"requestPath": "Path permintaan",
"requestHeaders": "Header permintaan",
"responseVersion": "Versi respons",
"responseStatus": "Status respons",
"responseReason": "Alasan respons",
"responseHeaders": "Header respons",
"heartbeatPeriod": "Periode heartbeat",
"serviceName": "Nama layanan",
"authority": "Authority",
"multiMode": "Multi Mode",
"maxBufferedUpload": "Maks. upload ter-buffer",
"maxUploadSize": "Ukuran upload maks. (Byte)",
"streamUpServer": "Stream-Up Server",
"serverMaxHeaderBytes": "Maks. byte header server",
"paddingBytes": "Byte Padding",
"uplinkHttpMethod": "Metode HTTP Uplink",
"paddingObfsMode": "Mode obfs Padding",
"paddingKey": "Padding Key",
"paddingHeader": "Padding Header",
"paddingPlacement": "Posisi Padding",
"paddingMethod": "Metode Padding",
"sessionPlacement": "Session Placement",
"sessionKey": "Session Key",
"sequencePlacement": "Sequence Placement",
"sequenceKey": "Sequence Key",
"uplinkDataPlacement": "Uplink Data Placement",
"uplinkDataKey": "Uplink Data Key",
"noSseHeader": "Tanpa header SSE",
"ttiMs": "TTI (ms)",
"uplinkMbps": "Uplink (MB/s)",
"downlinkMbps": "Downlink (MB/s)",
"cwndMultiplier": "Pengganda CWND",
"maxSendingWindow": "Maks. jendela pengiriman",
"externalProxy": "Proxy eksternal",
"sniPlaceholder": "SNI (default = host)",
"fingerprint": "Fingerprint",
"defaultOption": "Default",
"routeMark": "Route Mark",
"tcpKeepAliveInterval": "TCP Keep Alive Interval",
"tcpKeepAliveIdle": "TCP Keep Alive Idle",
"tcpMaxSeg": "TCP Max Seg",
"tcpUserTimeout": "TCP User Timeout",
"tcpWindowClamp": "TCP Window Clamp",
"tcpFastOpen": "TCP Fast Open",
"multipathTcp": "Multipath TCP",
"penetrate": "Penetrate",
"v6Only": "Hanya V6",
"tcpCongestion": "TCP Congestion",
"dialerProxy": "Dialer Proxy",
"trustedXForwardedFor": "X-Forwarded-For tepercaya",
"addressPortStrategy": "Strategi alamat+port",
"tryDelayMs": "Penundaan percobaan (ms)",
"prioritizeIPv6": "Prioritaskan IPv6",
"interleave": "Interleave",
"maxConcurrentTry": "Maks. percobaan bersamaan",
"customSockopt": "Sockopt kustom",
"addCustomOption": "Tambah opsi kustom",
"serverNameIndication": "SNI",
"cipherSuites": "Cipher Suites",
"autoOption": "Otomatis",
"minMaxVersion": "Versi Min/Maks",
"rejectUnknownSni": "Tolak SNI tidak dikenal",
"disableSystemRoot": "Nonaktifkan System Root",
"sessionResumption": "Lanjutkan sesi",
"oneTimeLoading": "Pemuatan sekali",
"usageOption": "Opsi penggunaan",
"buildChain": "Bangun rantai",
"echKey": "ECH key",
"echConfig": "Konfig ECH",
"getNewEchCert": "Dapatkan sertifikat ECH baru",
"show": "Tampilkan",
"xver": "Xver",
"target": "Target",
"maxTimeDiff": "Maks. selisih waktu (ms)",
"minClientVer": "Min. versi klien",
"maxClientVer": "Maks. versi klien",
"shortIds": "Short IDs",
"spiderX": "SpiderX",
"getNewCert": "Dapatkan sertifikat baru",
"mldsa65Seed": "mldsa65 Seed",
"mldsa65Verify": "mldsa65 Verify",
"getNewSeed": "Dapatkan Seed baru"
},
"info": {
"mode": "Mode",
"grpcServiceName": "grpc serviceName",
"grpcMultiMode": "grpc multiMode",
"interfaceName": "Nama interface",
"mtu": "MTU",
"gateway": "Gateway",
"dns": "DNS",
"outboundsInterface": "Interface outbound",
"autoSystemRoutes": "Rute sistem otomatis",
"followRedirect": "FollowRedirect",
"auth": "Auth",
"noKernelTun": "TUN tanpa kernel",
"keepAlive": "Keep alive",
"peerNumber": "Peer {n}",
"peerNumberConfig": "Konfig Peer {n}"
},
"stream": {
"general": {
"request": "Permintaan",
@@ -456,6 +615,20 @@
"days": "Hari",
"renew": "Perpanjangan otomatis",
"renewDesc": "Perpanjangan otomatis setelah kedaluwarsa. (0 = nonaktif) (satuan: hari)",
"searchPlaceholder": "Cari email, komentar, sub ID, UUID, kata sandi, auth…",
"filterTitle": "Filter klien",
"clearAllFilters": "Hapus semua",
"sortOldest": "Terlama dulu",
"sortNewest": "Terbaru dulu",
"sortRecentlyUpdated": "Baru saja diperbarui",
"sortRecentlyOnline": "Baru saja online",
"sortEmailAZ": "Email A→Z",
"sortEmailZA": "Email Z→A",
"sortMostTraffic": "Trafik terbanyak",
"sortHighestRemaining": "Tersisa terbanyak",
"sortExpiringSoonest": "Segera kedaluwarsa",
"has": "Memiliki",
"hasNot": "Tidak memiliki",
"title": "Klien",
"actions": "Aksi",
"totalGB": "Total Kirim/Terima (GB)",
@@ -466,6 +639,9 @@
"subId": "ID Langganan",
"online": "Online",
"email": "Email",
"group": "Grup",
"groupDesc": "Label logis untuk mengelompokkan klien terkait (mis. tim, pelanggan, wilayah). Dapat difilter dari toolbar.",
"groupPlaceholder": "mis. customer-a",
"comment": "Komentar",
"traffic": "Lalu lintas",
"offline": "Offline",
@@ -489,11 +665,45 @@
"resetAllTraffics": "Reset lalu lintas semua klien",
"resetAllTrafficsTitle": "Reset lalu lintas semua klien?",
"resetAllTrafficsContent": "Penghitung kirim/terima setiap klien turun ke nol. Kuota dan kedaluwarsa tidak terpengaruh. Tidak dapat dibatalkan.",
"empty": "Belum ada klien — tambahkan satu untuk memulai.",
"deleteConfirmTitle": "Hapus klien {email}?",
"deleteConfirmContent": "Tindakan ini menghapus klien dari setiap inbound terlampir dan menghapus catatan lalu lintasnya. Tidak dapat dibatalkan.",
"deleteSelected": "Hapus ({count})",
"adjustSelected": "Sesuaikan ({count})",
"subLinksSelected": "Tautan sub ({count})",
"addToGroupTitle": "Tambahkan {count} klien ke grup",
"addToGroupTooltip": "Pilih grup yang ada atau ketik nama baru. Gunakan Ungroup untuk menghapus klien dari grup saat ini.",
"addToGroupPlaceholder": "Nama grup",
"addToGroupSuccessToast": "{count} klien ditambahkan ke {group}",
"ungroupSuccessToast": "Grup dihapus dari {count} klien",
"ungroup": "Lepaskan grup",
"ungroupConfirmTitle": "Hapus {count} klien dari grupnya?",
"ungroupConfirmContent": "Menghapus label grup dari setiap klien terpilih. Klien tetap dipertahankan (gunakan Delete untuk menghapus sepenuhnya).",
"addToGroup": "Tambahkan ke grup",
"attach": "Lampirkan",
"adjust": "Atur",
"subLinks": "Tautan sub",
"selectedCount": "{count} dipilih",
"attachSelected": "Lampirkan ({count})",
"attachToInboundsTitle": "Lampirkan {count} klien ke inbound",
"attachToInboundsDesc": "Melampirkan {count} klien terpilih (UUID/kata sandi sama dan trafik bersama) ke inbound terpilih. Lampiran yang ada tetap dipertahankan.",
"attachToInboundsTargets": "Inbound tujuan",
"attachToInboundsNoTargets": "Tidak ada inbound multi-pengguna untuk dilampirkan.",
"detachSelected": "Lepas ({count})",
"detach": "Lepas",
"detachFromInboundsTitle": "Lepas {count} klien dari inbound",
"detachFromInboundsDesc": "Menghapus {count} klien terpilih dari inbound terpilih. Pasangan di mana klien tidak terlampir akan dilewati secara diam-diam. Catatan klien dipertahankan (gunakan Delete untuk menghapus sepenuhnya).",
"detachFromInboundsTargets": "Inbound untuk dilepas",
"detachFromInboundsNoTargets": "Tidak ada inbound multi-pengguna.",
"detachFromInboundsResult": "Dilepas {detached}, dilewati {skipped}.",
"detachFromInboundsResultMixed": "Dilepas {detached}, dilewati {skipped}, error {errors}.",
"subLinksTitle": "Tautan sub ({count})",
"subLinkColumn": "URL Langganan",
"subJsonLinkColumn": "URL JSON Langganan",
"subLinksCopyAll": "Salin semua",
"subLinksCopiedAll": "{count} tautan disalin",
"subLinksEmpty": "Tidak ada klien terpilih yang memiliki ID langganan.",
"subLinksDisabled": "Layanan langganan dinonaktifkan.",
"subLinksDisabledHint": "Aktifkan langganan di Pengaturan Panel → Langganan untuk membuat tautan.",
"bulkDeleteConfirmTitle": "Hapus {count} klien?",
"bulkDeleteConfirmContent": "Setiap klien yang dipilih dihapus dari semua inbound terlampir dan catatan lalu lintasnya dihapus. Tidak dapat dibatalkan.",
"bulkAdjustTitle": "Sesuaikan {count} klien",
@@ -505,9 +715,10 @@
"delDepletedConfirmTitle": "Hapus klien yang habis?",
"delDepletedConfirmContent": "Hapus setiap klien yang kuota lalu lintasnya habis atau yang masa berlakunya telah berakhir. Tidak dapat dibatalkan.",
"auth": "Auth",
"hysteriaAuth": "Auth Hysteria",
"hysteriaAuth": "Hysteria Auth",
"uuid": "UUID",
"flow": "Flow",
"vmessSecurity": "Keamanan VMess",
"reverseTag": "Reverse tag",
"reverseTagPlaceholder": "Reverse tag opsional",
"telegramId": "ID pengguna Telegram",
@@ -528,10 +739,48 @@
"delDepleted": "{count} klien habis dihapus"
}
},
"groups": {
"title": "Grup",
"name": "Nama",
"clientCount": "Klien di grup",
"totalGroups": "Total grup",
"totalGroupedClients": "Klien dengan grup",
"emptyGroups": "Grup kosong",
"addGroup": "Tambah grup",
"createSuccess": "Grup «{name}» dibuat.",
"rename": "Ubah nama",
"renameTitle": "Ubah nama {name}",
"renameCollision": "Grup bernama «{name}» sudah ada.",
"renameSuccess": "Grup diubah namanya pada {count} klien.",
"deleteConfirmTitle": "Hapus grup {name}?",
"deleteConfirmContent": "Ini menghapus grup dan label-nya dari {count} klien. Klien itu sendiri tidak dihapus.",
"deleteSuccess": "Grup dihapus dari {count} klien.",
"resetTraffic": "Reset trafik",
"resetConfirmTitle": "Reset trafik grup {name}?",
"resetConfirmContent": "Ini mengatur ulang up/down ke 0 untuk semua {count} klien di grup ini.",
"resetSuccess": "Trafik direset untuk {count} klien.",
"adjustSuccess": "{count} klien di {name} disesuaikan.",
"emptyForAction": "Grup ini belum memiliki klien.",
"deleteGroupOnly": "Hapus grup (pertahankan klien)",
"deleteClients": "Hapus klien di grup",
"deleteClientsConfirmTitle": "Hapus semua klien di {name}?",
"deleteClientsConfirmContent": "Ini akan menghapus {count} klien secara permanen beserta catatan trafiknya. Label grup juga dihapus. Tidak dapat dibatalkan.",
"deleteClientsSuccess": "{count} klien dihapus.",
"deleteClientsMixed": "{ok} dihapus, {failed} dilewati",
"addToGroup": "Tambah klien…",
"addToGroupTitle": "Tambah klien ke grup «{name}»",
"addToGroupDesc": "Pilih klien untuk ditambahkan ke grup ini. Lampiran inbound yang ada tetap dipertahankan; hanya label grup yang berubah. Klien yang sudah ada di grup ini tidak ditampilkan.",
"addToGroupEmpty": "Tidak ada klien lain untuk ditambahkan.",
"addToGroupResult": "{count} klien ditambahkan ke {name}.",
"removeFromGroup": "Hapus klien…",
"removeFromGroupTitle": "Hapus klien dari grup «{name}»",
"removeFromGroupDesc": "Pilih anggota untuk dihapus dari grup ini. Klien tetap dipertahankan (gunakan «Hapus klien di grup» untuk menghapus sepenuhnya).",
"removeFromGroupResult": "{count} klien dihapus dari {name}."
},
"nodes": {
"title": "Node",
"addNode": "Tambah Node",
"editNode": "Edit Node",
"editNode": "Edit node",
"totalNodes": "Total Node",
"onlineNodes": "Online",
"offlineNodes": "Offline",
@@ -543,7 +792,7 @@
"scheme": "Skema",
"address": "Alamat",
"port": "Port",
"basePath": "Base Path",
"basePath": "Path dasar",
"apiToken": "Token API",
"apiTokenPlaceholder": "Token dari halaman Pengaturan panel jarak jauh",
"apiTokenHint": "Panel jarak jauh menampilkan token API-nya di Pengaturan → Token API.",
@@ -590,7 +839,7 @@
"title": "Pengaturan Panel",
"save": "Simpan",
"infoDesc": "Setiap perubahan yang dibuat di sini perlu disimpan. Harap restart panel untuk menerapkan perubahan.",
"restartPanel": "Restart Panel",
"restartPanel": "Mulai ulang panel",
"restartPanelDesc": "Apakah Anda yakin ingin merestart panel? Jika Anda tidak dapat mengakses panel setelah merestart, lihat info log panel di server.",
"restartPanelSuccess": "Panel berhasil dimulai ulang",
"actions": "Tindakan",
@@ -615,10 +864,12 @@
"publicKeyPathDesc": "Path berkas kunci publik untuk panel web. (dimulai dengan /)",
"privateKeyPath": "Path Kunci Privat",
"privateKeyPathDesc": "Path berkas kunci privat untuk panel web. (dimulai dengan /)",
"panelUrlPath": "URI Path",
"panelUrlPath": "Path URI",
"panelUrlPathDesc": "URI path untuk panel web. (dimulai dengan / dan diakhiri dengan /)",
"pageSize": "Ukuran Halaman",
"pageSizeDesc": "Tentukan ukuran halaman untuk tabel masuk. (0 = nonaktif)",
"panelProxy": "Proxy jaringan panel",
"panelProxyDesc": "Mengarahkan permintaan keluar panel sendiri (pembaruan geo, pemeriksaan versi Xray/panel, Telegram) melalui proxy ini untuk melewati pemfilteran GitHub/Telegram di sisi server. Menerima socks5:// atau http(s)://, mis. inbound SOCKS lokal Xray. Kosongkan untuk koneksi langsung.",
"remarkModel": "Model Catatan & Karakter Pemisah",
"datepicker": "Jenis Kalender",
"datepickerPlaceholder": "Pilih tanggal",
@@ -634,7 +885,7 @@
"telegramTokenDesc": "Token bot Telegram yang diperoleh dari '{'@'}BotFather'.",
"telegramProxy": "Proxy SOCKS",
"telegramProxyDesc": "Mengaktifkan proxy SOCKS5 untuk terhubung ke Telegram. (sesuaikan pengaturan sesuai panduan)",
"telegramAPIServer": "Telegram API Server",
"telegramAPIServer": "Server API Telegram",
"telegramAPIServerDesc": "Server API Telegram yang akan digunakan. Biarkan kosong untuk menggunakan server default.",
"telegramChatId": "ID Obrolan Admin",
"telegramChatIdDesc": "ID Obrolan Admin Telegram. (dipisahkan koma)(dapatkan di sini {'@'}userinfobot) atau (gunakan perintah '/id' di bot)",
@@ -658,6 +909,8 @@
"subEnable": "Aktifkan Layanan Langganan",
"subEnableDesc": "Mengaktifkan layanan langganan.",
"subJsonEnable": "Aktifkan/Nonaktifkan endpoint langganan JSON secara mandiri.",
"subJsonEnableTitle": "Langganan JSON",
"subClashEnableTitle": "Langganan Clash / Mihomo",
"subTitle": "Judul Langganan",
"subTitleDesc": "Judul yang ditampilkan di klien VPN",
"subSupportUrl": "URL Dukungan",
@@ -678,7 +931,7 @@
"subCertPathDesc": "Path berkas kunci publik untuk layanan langganan. (dimulai dengan /)",
"subKeyPath": "Path Kunci Privat",
"subKeyPathDesc": "Path berkas kunci privat untuk layanan langganan. (dimulai dengan /)",
"subPath": "URI Path",
"subPath": "Path URI",
"subPathDesc": "URI path untuk layanan langganan. (dimulai dengan / dan diakhiri dengan /)",
"subDomain": "Domain Pendengar",
"subDomainDesc": "Nama domain untuk layanan langganan. (biarkan kosong untuk mendengarkan semua domain dan IP)",
@@ -693,7 +946,7 @@
"subURI": "URI Proxy Terbalik",
"subURIDesc": "Path URI dari URL langganan untuk digunakan di belakang proxy.",
"externalTrafficInformEnable": "Informasikan API eksternal pada setiap pembaruan lalu lintas.",
"externalTrafficInformEnableDesc": "Inform external API on every traffic update.",
"externalTrafficInformEnableDesc": "Beritahu API eksternal setiap kali ada pembaruan trafik.",
"externalTrafficInformURI": "Lalu Lintas Eksternal Menginformasikan URI",
"externalTrafficInformURIDesc": "Pembaruan lalu lintas dikirim ke URI ini.",
"restartXrayOnClientDisable": "Nyalakan Ulang Xray Setelah Nonaktif Otomatis",
@@ -703,6 +956,54 @@
"fragmentSett": "Pengaturan Fragmentasi",
"noisesDesc": "Aktifkan Noises.",
"noisesSett": "Pengaturan Noises",
"trustedProxyCidrs": "CIDR proxy tepercaya",
"trustedProxyCidrsDesc": "IP/CIDR (dipisahkan koma) yang diizinkan mengatur header forwarded host, proto, dan client IP.",
"ldap": {
"enable": "Aktifkan sinkronisasi LDAP",
"host": "LDAP host",
"port": "Port LDAP",
"useTls": "Gunakan TLS (LDAPS)",
"bindDn": "Bind DN",
"passwordConfigured": "Terkonfigurasi; biarkan kosong untuk mempertahankan kata sandi saat ini.",
"passwordUnconfigured": "Tidak terkonfigurasi.",
"passwordPlaceholder": "Terkonfigurasi — masukkan nilai baru untuk menggantikan",
"baseDn": "Base DN",
"userFilter": "Filter pengguna",
"userAttr": "Atribut pengguna (username/email)",
"vlessField": "Atribut flag VLESS",
"flagField": "Atribut flag umum (opsional)",
"flagFieldDesc": "Jika diatur, menimpa flag VLESS — mis. shadowInactive.",
"truthyValues": "Nilai truthy",
"truthyValuesDesc": "Dipisahkan koma; default: true,1,yes,on",
"invertFlag": "Balik flag",
"invertFlagDesc": "Aktifkan saat atribut berarti «dinonaktifkan» (mis. shadowInactive).",
"syncSchedule": "Jadwal sinkronisasi",
"syncScheduleDesc": "String mirip cron, mis. @every 1m",
"inboundTags": "Tag inbound",
"inboundTagsDesc": "Inbound di mana sinkronisasi LDAP dapat membuat/menghapus klien secara otomatis.",
"noInbounds": "Tidak ada inbound. Buat dulu di Inbound.",
"autoCreate": "Buat klien otomatis",
"autoDelete": "Hapus klien otomatis",
"defaultTotalGb": "Total default (GB)",
"defaultExpiryDays": "Kedaluwarsa default (hari)",
"defaultIpLimit": "Batas IP default"
},
"subFormats": {
"packets": "Paket",
"length": "Panjang",
"interval": "Interval",
"maxSplit": "Maks. pembagian",
"noises": "Noise",
"noiseItem": "Noise №{n}",
"type": "Tipe",
"packet": "Paket",
"delayMs": "Penundaan (ms)",
"applyTo": "Terapkan ke",
"addNoise": "+ Noise",
"concurrency": "Konkurensi",
"xudpConcurrency": "Konkurensi xudp",
"xudpUdp443": "xudp UDP 443"
},
"mux": "Mux",
"muxDesc": "Mengirimkan beberapa aliran data independen dalam aliran data yang sudah ada.",
"muxSett": "Pengaturan Mux",
@@ -756,8 +1057,11 @@
"xray": {
"title": "Konfigurasi Xray",
"save": "Simpan",
"restart": "Restart Xray",
"restart": "Mulai ulang Xray",
"restartSuccess": "Xray berhasil diluncurkan ulang",
"restartOutputTitle": "Output mulai ulang Xray",
"restartConfirmTitle": "Mulai ulang xray?",
"restartConfirmContent": "Memuat ulang layanan xray dengan konfigurasi tersimpan.",
"stopSuccess": "Xray telah berhasil dihentikan",
"restartError": "Terjadi kesalahan saat memulai ulang Xray.",
"stopError": "Terjadi kesalahan saat menghentikan Xray.",
@@ -765,7 +1069,7 @@
"advancedTemplate": "Lanjutan",
"generalConfigs": "Strategi Umum",
"generalConfigsDesc": "Opsi ini akan menentukan penyesuaian strategi umum.",
"logConfigs": "Catatan",
"logConfigs": "Log",
"logConfigsDesc": "Log dapat mempengaruhi efisiensi server Anda. Disarankan untuk mengaktifkannya dengan bijak hanya jika diperlukan",
"blockConfigsDesc": "Opsi ini akan memblokir lalu lintas berdasarkan protokol dan situs web yang diminta.",
"basicRouting": "Perutean Dasar",
@@ -790,10 +1094,12 @@
"outboundTestUrl": "URL tes outbound",
"outboundTestUrlDesc": "URL yang digunakan saat menguji konektivitas outbound",
"Torrent": "Blokir Protokol BitTorrent",
"Inbounds": "Masuk",
"Inbounds": "Inbound",
"InboundsDesc": "Menerima klien tertentu.",
"Outbounds": "Keluar",
"Outbounds": "Outbound",
"Balancers": "Penyeimbang",
"balancerTagRequired": "Tag wajib diisi",
"balancerSelectorRequired": "Pilih setidaknya satu outbound",
"OutboundsDesc": "Atur jalur lalu lintas keluar.",
"Routings": "Aturan Pengalihan",
"RoutingsDesc": "Prioritas setiap aturan penting!",
@@ -832,6 +1138,73 @@
"edit": "Edit Aturan",
"useComma": "Item yang dipisahkan koma"
},
"routing": {
"dragToReorder": "Seret untuk mengurutkan ulang"
},
"ruleForm": {
"sourceIps": "IP sumber",
"sourcePort": "Port sumber",
"vlessRoute": "Rute VLESS",
"attributes": "Atribut",
"value": "Nilai",
"user": "Pengguna",
"inboundTags": "Tag inbound",
"outboundTag": "Tag outbound",
"balancerTag": "Tag balancer",
"balancerTagTooltip": "Mengarahkan trafik melalui salah satu balancer yang dikonfigurasi"
},
"outboundForm": {
"tagDuplicate": "Tag sudah digunakan oleh outbound lain",
"tagRequired": "Tag wajib diisi",
"tagPlaceholder": "tag-unik",
"localIpPlaceholder": "IP lokal",
"addressRequired": "Alamat wajib diisi",
"portRequired": "Port wajib diisi",
"optional": "opsional",
"udpOverTcp": "UDP over TCP",
"uotVersion": "Versi UoT",
"inboundTag": "Tag inbound",
"inboundTagPlaceholder": "tag inbound yang digunakan dalam aturan routing",
"responseType": "Tipe respons",
"rewriteNetwork": "Tulis ulang jaringan",
"unchanged": "(tidak berubah)",
"unchangedAddress": "(tidak berubah) mis. 1.1.1.1",
"rules": "Aturan",
"ruleN": "Aturan {n}",
"action": "Aksi",
"redirect": "Redirect",
"fragment": "Fragment",
"finalRules": "Aturan akhir",
"overrideXrayPrivateIp": "Timpa blok IP privat default Xray",
"blockDelay": "Penundaan blokir (ms)",
"reverseSniffing": "Sniffing terbalik",
"workers": "Workers",
"reserved": "Dicadangkan",
"minUploadInterval": "Min. interval upload (ms)",
"maxUploadSizeBytes": "Ukuran upload maks. (byte)",
"uplinkChunkSize": "Ukuran chunk Uplink",
"noGrpcHeader": "Tanpa header gRPC",
"maxConcurrency": "Maks. konkurensi",
"maxConnections": "Maks. koneksi",
"maxReuseTimes": "Maks. pemakaian ulang",
"maxRequestTimes": "Maks. permintaan",
"maxReusableSecs": "Maks. detik dapat dipakai ulang",
"keepAlivePeriod": "Periode keep alive",
"authPassword": "Kata sandi auth",
"visionTestpre": "Vision testpre",
"serverNamePlaceholder": "nama server",
"verifyPeerName": "Verifikasi nama peer",
"pinnedSha256": "SHA256 pinned",
"shortId": "Short ID",
"sockopts": "Sockopts",
"keepAliveInterval": "Interval keep alive",
"markFwmark": "Mark (fwmark)",
"interface": "Interface",
"ipv6Only": "Hanya IPv6",
"acceptProxyProtocol": "Terima proxy protocol",
"tcpUserTimeoutMs": "TCP user timeout (ms)",
"tcpKeepAliveIdleS": "TCP keep-alive idle (d)"
},
"outbound": {
"addOutbound": "Tambahkan Keluar",
"addReverse": "Tambahkan Revers",
@@ -846,7 +1219,7 @@
"reverse": "Revers",
"domain": "Domain",
"type": "Tipe",
"bridge": "Jembatan",
"bridge": "Bridge",
"portal": "Portal",
"link": "Tautan",
"intercon": "Interkoneksi",
@@ -860,6 +1233,8 @@
"testSuccess": "Tes berhasil",
"testFailed": "Tes gagal",
"testError": "Gagal menguji outbound",
"testModeTooltip": "TCP: probe dial-only cepat. HTTP: permintaan penuh via xray.",
"testAll": "Tes semua",
"nordvpn": "NordVPN",
"accessToken": "Token Akses",
"country": "Negara",
@@ -874,8 +1249,18 @@
"editBalancer": "Sunting Penyeimbang",
"balancerStrategy": "Strategi",
"balancerSelectors": "Penyeleksi",
"tag": "Menandai",
"tag": "Tag",
"tagDesc": "Label Unik",
"tagDuplicate": "Tag sudah digunakan oleh balancer lain",
"tagPlaceholder": "tag balancer unik",
"selector": "Selector",
"fallback": "Fallback",
"expected": "Diharapkan",
"expectedPlaceholder": "jumlah node optimal",
"maxRtt": "Maks. RTT",
"tolerance": "Toleransi",
"baselines": "Baselines",
"costs": "Costs",
"balancerDesc": "BalancerTag dan outboundTag tidak dapat digunakan secara bersamaan. Jika digunakan secara bersamaan, hanya outboundTag yang akan berfungsi."
},
"wireguard": {
@@ -892,6 +1277,38 @@
"userLevel": "Level Pengguna",
"userLevelDesc": "Semua koneksi yang dibuat melalui inbound ini akan menggunakan level pengguna ini. Standar adalah 0"
},
"nord": {
"accessToken": "Access token",
"privateKey": "Kunci privat",
"noServers": "Tidak ada server ditemukan untuk negara yang dipilih",
"noPublicKey": "Server yang dipilih tidak mengumumkan kunci publik NordLynx.",
"outboundAdded": "Outbound NordVPN ditambahkan",
"outboundUpdated": "Outbound NordVPN diperbarui"
},
"warp": {
"licenseError": "Gagal mengatur lisensi WARP.",
"fetchFirst": "Ambil konfig WARP terlebih dahulu.",
"createAccount": "Buat akun WARP",
"accessToken": "Access token",
"deviceId": "ID perangkat",
"licenseKey": "Kunci lisensi",
"privateKey": "Kunci privat",
"deleteAccount": "Hapus akun",
"settings": "Pengaturan",
"licenseKeyLabel": "Kunci lisensi WARP / WARP+",
"key": "Kunci",
"keyPlaceholder": "kunci WARP+ 26 karakter",
"accountInfo": "Info akun",
"deviceName": "Nama perangkat",
"deviceModel": "Model perangkat",
"deviceEnabled": "Perangkat aktif",
"accountType": "Tipe akun",
"role": "Peran",
"warpPlusData": "Data WARP+",
"quota": "Kuota",
"usage": "Penggunaan",
"addOutbound": "Tambah outbound"
},
"dns": {
"enable": "Aktifkan DNS",
"enableDesc": "Aktifkan server DNS bawaan",
@@ -911,7 +1328,7 @@
"strategyDesc": "Strategi keseluruhan untuk menyelesaikan nama domain",
"add": "Tambahkan Server",
"edit": "Sunting Server",
"domains": "Domains",
"domains": "Domain",
"expectIPs": "IP yang Diharapkan",
"unexpectIPs": "IP tak terduga",
"useSystemHosts": "Gunakan Hosts Sistem",
@@ -1042,7 +1459,7 @@
"inbound_client_data_id": "🔄 Masuk: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 Email: {{ .ClientEmail }}\n📊 Lalu lintas: {{ .ClientTraffic }}\n📅 Tanggal Kedaluwarsa: {{ .ClientExp }}\n🌐 Batas IP: {{ .IpLimit }}\n💬 Komentar: {{ .ClientComment }}\n\nSekarang kamu bisa menambahkan klien ke inbound!",
"inbound_client_data_pass": "🔄 Masuk: {{ .InboundRemark }}\n\n🔑 Kata sandi: {{ .ClientPass }}\n📧 Email: {{ .ClientEmail }}\n📊 Lalu lintas: {{ .ClientTraffic }}\n📅 Tanggal Kedaluwarsa: {{ .ClientExp }}\n🌐 Batas IP: {{ .IpLimit }}\n💬 Komentar: {{ .ClientComment }}\n\nSekarang kamu bisa menambahkan klien ke inbound!",
"cancel": "❌ Proses Dibatalkan! \n\nAnda dapat /start lagi kapan saja. 🔄",
"error_add_client": "⚠️ Kesalahan:\n\n {{ .error }}",
"error_add_client": "⚠️ Error:\n\n {{ .error }}",
"using_default_value": "Oke, saya akan tetap menggunakan nilai default. 😊",
"incorrect_input": "Masukan Anda tidak valid.\nFrasa harus berlanjut tanpa spasi.\nContoh benar: aaaaaa\nContoh salah: aaa aaa 🚫",
"AreYouSure": "Apakah kamu yakin? 🤔",
@@ -1119,4 +1536,4 @@
"chooseInbound": "Pilih Inbound"
}
}
}
}