2026-05-08 12:54:07 +00:00
{
"username" : "Nama Pengguna" ,
"password" : "Kata Sandi" ,
"login" : "Masuk" ,
"confirm" : "Konfirmasi" ,
"cancel" : "Batal" ,
"close" : "Tutup" ,
"save" : "Simpan" ,
"logout" : "Keluar" ,
"create" : "Buat" ,
"update" : "Perbarui" ,
"copy" : "Salin" ,
"copied" : "Tersalin" ,
"download" : "Unduh" ,
"remark" : "Catatan" ,
"enable" : "Aktifkan" ,
"protocol" : "Protokol" ,
"search" : "Cari" ,
"filter" : "Filter" ,
"loading" : "Memuat..." ,
"second" : "Detik" ,
"minute" : "Menit" ,
"hour" : "Jam" ,
"day" : "Hari" ,
"check" : "Centang" ,
"indefinite" : "Tak Terbatas" ,
"unlimited" : "Tanpa Batas" ,
"none" : "None" ,
"qrCode" : "Kode QR" ,
"info" : "Informasi Lebih Lanjut" ,
"edit" : "Edit" ,
"delete" : "Hapus" ,
"reset" : "Reset" ,
"noData" : "Tidak ada data." ,
"copySuccess" : "Berhasil Disalin" ,
"sure" : "Yakin" ,
"encryption" : "Enkripsi" ,
"useIPv4ForHost" : "Gunakan IPv4 untuk host" ,
"transmission" : "Transmisi" ,
"host" : "Host" ,
"path" : "Jalur" ,
"camouflage" : "Obfuscation" ,
"status" : "Status" ,
"enabled" : "Aktif" ,
"disabled" : "Nonaktif" ,
"depleted" : "Habis" ,
"depletingSoon" : "Akan Habis" ,
"offline" : "Offline" ,
"online" : "Online" ,
"domainName" : "Nama Domain" ,
"monitor" : "IP Pemantauan" ,
"certificate" : "Sertifikat Digital" ,
"fail" : "Gagal" ,
"comment" : "Komentar" ,
"success" : "Berhasil" ,
"lastOnline" : "Terakhir online" ,
"getVersion" : "Dapatkan Versi" ,
"install" : "Instal" ,
"clients" : "Klien" ,
"usage" : "Penggunaan" ,
"twoFactorCode" : "Kode" ,
"remained" : "Tersisa" ,
"security" : "Keamanan" ,
"secAlertTitle" : "Peringatan keamanan" ,
"secAlertSsl" : "Koneksi ini tidak aman. Harap hindari memasukkan informasi sensitif sampai TLS diaktifkan untuk perlindungan data." ,
"secAlertConf" : "Beberapa pengaturan rentan terhadap serangan. Disarankan untuk memperkuat protokol keamanan guna mencegah pelanggaran potensial." ,
"secAlertSSL" : "Panel kekurangan koneksi yang aman. Harap instal sertifikat TLS untuk perlindungan data." ,
"secAlertPanelPort" : "Port default panel rentan. Harap konfigurasi port acak atau tertentu." ,
"secAlertPanelURI" : "Jalur URI default panel tidak aman. Harap konfigurasi jalur URI kompleks." ,
"secAlertSubURI" : "Jalur URI default langganan tidak aman. Harap konfigurasi jalur URI kompleks." ,
"secAlertSubJsonURI" : "Jalur URI default JSON langganan tidak aman. Harap konfigurasikan jalur URI kompleks." ,
"emptyDnsDesc" : "Tidak ada server DNS yang ditambahkan." ,
"emptyFakeDnsDesc" : "Tidak ada server Fake DNS yang ditambahkan." ,
"emptyBalancersDesc" : "Tidak ada penyeimbang yang ditambahkan." ,
"emptyReverseDesc" : "Tidak ada proxy terbalik yang ditambahkan." ,
"somethingWentWrong" : "Terjadi kesalahan" ,
"subscription" : {
"title" : "Info langganan" ,
"subId" : "ID langganan" ,
"status" : "Status" ,
"downloaded" : "Diunduh" ,
"uploaded" : "Diunggah" ,
"expiry" : "Kedaluwarsa" ,
"totalQuota" : "Kuota total" ,
"individualLinks" : "Tautan individual" ,
"active" : "Aktif" ,
"inactive" : "Nonaktif" ,
"unlimited" : "Tanpa batas" ,
"noExpiry" : "Tanpa kedaluwarsa"
} ,
"menu" : {
"theme" : "Tema" ,
"dark" : "Gelap" ,
"ultraDark" : "Sangat Gelap" ,
"dashboard" : "Ikhtisar" ,
"inbounds" : "Masuk" ,
"settings" : "Pengaturan Panel" ,
"xray" : "Konfigurasi Xray" ,
"logout" : "Keluar" ,
"link" : "Kelola"
} ,
"pages" : {
"login" : {
"hello" : "Halo" ,
"title" : "Selamat Datang" ,
"loginAgain" : "Sesi Anda telah berakhir, harap masuk kembali" ,
"toasts" : {
"invalidFormData" : "Format data input tidak valid." ,
"emptyUsername" : "Nama Pengguna diperlukan" ,
"emptyPassword" : "Kata Sandi diperlukan" ,
"wrongUsernameOrPassword" : "Username, kata sandi, atau kode dua faktor tidak valid." ,
"successLogin" : "Anda telah berhasil masuk ke akun Anda."
}
} ,
"index" : {
"title" : "Ikhtisar" ,
"cpu" : "CPU" ,
"logicalProcessors" : "Prosesor logis" ,
"frequency" : "Frekuensi" ,
"swap" : "Swap" ,
"storage" : "Penyimpanan" ,
"memory" : "RAM" ,
"threads" : "Thread" ,
"xrayStatus" : "Xray" ,
"stopXray" : "Stop" ,
"restartXray" : "Restart" ,
"xraySwitch" : "Versi" ,
"xraySwitchClick" : "Pilih versi yang ingin Anda pindah." ,
"xraySwitchClickDesk" : "Pilih dengan hati-hati, karena versi yang lebih lama mungkin tidak kompatibel dengan konfigurasi saat ini." ,
"xrayUpdates" : "Pembaruan Xray" ,
"updatePanel" : "Perbarui Panel" ,
"panelUpdateDesc" : "Ini akan memperbarui 3X-UI ke rilis terbaru dan me-restart layanan panel." ,
"currentPanelVersion" : "Versi panel saat ini" ,
"latestPanelVersion" : "Versi panel terbaru" ,
"panelUpToDate" : "Panel sudah terbaru" ,
"upToDate" : "Terbaru" ,
"xrayStatusUnknown" : "Tidak diketahui" ,
"xrayStatusRunning" : "Berjalan" ,
"xrayStatusStop" : "Berhenti" ,
"xrayStatusError" : "Kesalahan" ,
"xrayErrorPopoverTitle" : "Terjadi kesalahan saat menjalankan Xray" ,
"operationHours" : "Waktu Aktif" ,
feat(stats): system history modal + per-node CPU/Mem trends across all locales
Backend
- web/service/metric_history.go: generic in-memory ring buffer with two
singletons — system-wide (cpu/mem/netUp/netDown/online/load1/5/15)
and per-node (cpu/mem) keyed by node id
- ServerService.AppendStatusSample writes all 8 metrics every 2s on the
same tick; AppendCpuSample/AggregateCpuHistory kept for back-compat
- NodeService.UpdateHeartbeat appends cpu/mem only on online ticks so
offline gaps render as missing data, not phantom dips
- New routes: GET /panel/api/server/history/:metric/:bucket and
GET /panel/api/nodes/history/:id/:metric/:bucket, both whitelisted
Frontend
- Sparkline component generalized: arbitrary value range (auto-scale
when valueMax=null), pluggable yFormatter/tooltipFormatter for B/s,
client counts, load averages
- SystemHistoryModal replaces CpuHistoryModal with tabs for every
metric; opened from a tag on the 3X-UI card next to Documentation
- NodeHistoryPanel: expandable row on the Nodes table showing per-node
CPU and Mem trends, refreshed every 15s
Localization
- Backfill systemHistoryTitle / trendLast2Min / pages.inbounds.{node,
deployTo, localPanel} and the entire pages.nodes block (51 keys
including statusValues + toasts) into all 11 non-en/fa locales:
ar-EG, es-ES, id-ID, ja-JP, pt-BR, ru-RU, tr-TR, uk-UA, vi-VN,
zh-CN, zh-TW
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-09 14:24:57 +00:00
"systemHistoryTitle" : "Riwayat Sistem" ,
"trendLast2Min" : "2 menit terakhir" ,
2026-05-08 12:54:07 +00:00
"systemLoad" : "Beban Sistem" ,
"systemLoadDesc" : "Rata-rata beban sistem selama 1, 5, dan 15 menit terakhir" ,
"connectionCount" : "Statistik Koneksi" ,
"ipAddresses" : "Alamat IP" ,
"toggleIpVisibility" : "Alihkan visibilitas IP" ,
"overallSpeed" : "Kecepatan keseluruhan" ,
"upload" : "Unggah" ,
"download" : "Unduh" ,
"totalData" : "Total data" ,
"sent" : "Dikirim" ,
"received" : "Diterima" ,
"documentation" : "Dokumentasi" ,
"xraySwitchVersionDialog" : "Apakah Anda yakin ingin mengubah versi Xray?" ,
"xraySwitchVersionDialogDesc" : "Ini akan mengubah versi Xray ke #version#." ,
"xraySwitchVersionPopover" : "Xray berhasil diperbarui" ,
"panelUpdateDialog" : "Apakah Anda benar-benar ingin memperbarui panel?" ,
"panelUpdateDialogDesc" : "Ini akan memperbarui 3X-UI ke #version# dan me-restart layanan panel." ,
"panelUpdateCheckPopover" : "Pemeriksaan pembaruan panel gagal" ,
"panelUpdateStartedPopover" : "Pembaruan panel dimulai" ,
"geofileUpdateDialog" : "Apakah Anda yakin ingin memperbarui geofile?" ,
"geofileUpdateDialogDesc" : "Ini akan memperbarui file #filename#." ,
"geofilesUpdateDialogDesc" : "Ini akan memperbarui semua berkas." ,
"geofilesUpdateAll" : "Perbarui semua" ,
"geofileUpdatePopover" : "Geofile berhasil diperbarui" ,
"dontRefresh" : "Instalasi sedang berlangsung, harap jangan menyegarkan halaman ini" ,
"logs" : "Log" ,
"config" : "Konfigurasi" ,
"backup" : "Cadangan" ,
2026-05-08 15:53:45 +00:00
"backupTitle" : "Cadangan & Pulihkan" ,
2026-05-08 12:54:07 +00:00
"exportDatabase" : "Cadangkan" ,
"exportDatabaseDesc" : "Klik untuk mengunduh file .db yang berisi cadangan dari database Anda saat ini ke perangkat Anda." ,
"importDatabase" : "Pulihkan" ,
"importDatabaseDesc" : "Klik untuk memilih dan mengunggah file .db dari perangkat Anda untuk memulihkan database dari cadangan." ,
"importDatabaseSuccess" : "Database berhasil diimpor" ,
"importDatabaseError" : "Terjadi kesalahan saat mengimpor database" ,
"readDatabaseError" : "Terjadi kesalahan saat membaca database" ,
"getDatabaseError" : "Terjadi kesalahan saat mengambil database" ,
"getConfigError" : "Terjadi kesalahan saat mengambil file konfigurasi" ,
"customGeoTitle" : "GeoSite / GeoIP kustom" ,
"customGeoAdd" : "Tambah" ,
"customGeoType" : "Jenis" ,
"customGeoAlias" : "Alias" ,
"customGeoUrl" : "URL" ,
"customGeoEnabled" : "Aktif" ,
"customGeoLastUpdated" : "Terakhir diperbarui" ,
"customGeoExtColumn" : "Routing (ext:…)" ,
"customGeoToastUpdateAll" : "Semua sumber kustom telah diperbarui" ,
"customGeoActions" : "Aksi" ,
"customGeoEdit" : "Edit" ,
"customGeoDelete" : "Hapus" ,
"customGeoDownload" : "Perbarui sekarang" ,
"customGeoModalAdd" : "Tambah geo kustom" ,
"customGeoModalEdit" : "Edit geo kustom" ,
"customGeoModalSave" : "Simpan" ,
"customGeoDeleteConfirm" : "Hapus sumber geo kustom ini?" ,
"customGeoRoutingHint" : "Pada aturan routing gunakan kolom nilai sebagai ext:file.dat:tag (ganti tag)." ,
"customGeoInvalidId" : "ID sumber tidak valid" ,
"customGeoAliasesError" : "Gagal memuat alias geo kustom" ,
"customGeoValidationAlias" : "Alias hanya huruf kecil, angka, - dan _" ,
"customGeoValidationUrl" : "URL harus diawali http:// atau https://" ,
"customGeoAliasPlaceholder" : "a-z 0-9 _ -" ,
"customGeoAliasLabelSuffix" : " (kustom)" ,
"customGeoToastList" : "Daftar geo kustom" ,
"customGeoToastAdd" : "Tambah geo kustom" ,
"customGeoToastUpdate" : "Perbarui geo kustom" ,
"customGeoToastDelete" : "Geofile kustom “{{ .fileName }}” dihapus" ,
"customGeoToastDownload" : "Geofile “{{ .fileName }}” diperbarui" ,
"customGeoErrInvalidType" : "Jenis harus geosite atau geoip" ,
"customGeoErrAliasRequired" : "Alias wajib diisi" ,
"customGeoErrAliasPattern" : "Alias berisi karakter yang tidak diizinkan" ,
"customGeoErrAliasReserved" : "Alias ini dicadangkan" ,
"customGeoErrUrlRequired" : "URL wajib diisi" ,
"customGeoErrInvalidUrl" : "URL tidak valid" ,
"customGeoErrUrlScheme" : "URL harus memakai http atau https" ,
"customGeoErrUrlHost" : "Host URL tidak valid" ,
"customGeoErrDuplicateAlias" : "Alias ini sudah dipakai untuk jenis ini" ,
"customGeoErrNotFound" : "Sumber geo kustom tidak ditemukan" ,
"customGeoErrDownload" : "Unduh gagal" ,
"customGeoErrUpdateAllIncomplete" : "Satu atau lebih sumber geo kustom gagal diperbarui" ,
"customGeoEmpty" : "Belum ada sumber geo kustom — klik Tambah untuk membuatnya"
} ,
"inbounds" : {
"allTimeTraffic" : "Total Lalu Lintas" ,
"allTimeTrafficUsage" : "Total Penggunaan Sepanjang Waktu" ,
"title" : "Masuk" ,
"totalDownUp" : "Total Terkirim/Diterima" ,
"totalUsage" : "Penggunaan Total" ,
"inboundCount" : "Total Masuk" ,
"operate" : "Menu" ,
"enable" : "Aktifkan" ,
"remark" : "Catatan" ,
feat(stats): system history modal + per-node CPU/Mem trends across all locales
Backend
- web/service/metric_history.go: generic in-memory ring buffer with two
singletons — system-wide (cpu/mem/netUp/netDown/online/load1/5/15)
and per-node (cpu/mem) keyed by node id
- ServerService.AppendStatusSample writes all 8 metrics every 2s on the
same tick; AppendCpuSample/AggregateCpuHistory kept for back-compat
- NodeService.UpdateHeartbeat appends cpu/mem only on online ticks so
offline gaps render as missing data, not phantom dips
- New routes: GET /panel/api/server/history/:metric/:bucket and
GET /panel/api/nodes/history/:id/:metric/:bucket, both whitelisted
Frontend
- Sparkline component generalized: arbitrary value range (auto-scale
when valueMax=null), pluggable yFormatter/tooltipFormatter for B/s,
client counts, load averages
- SystemHistoryModal replaces CpuHistoryModal with tabs for every
metric; opened from a tag on the 3X-UI card next to Documentation
- NodeHistoryPanel: expandable row on the Nodes table showing per-node
CPU and Mem trends, refreshed every 15s
Localization
- Backfill systemHistoryTitle / trendLast2Min / pages.inbounds.{node,
deployTo, localPanel} and the entire pages.nodes block (51 keys
including statusValues + toasts) into all 11 non-en/fa locales:
ar-EG, es-ES, id-ID, ja-JP, pt-BR, ru-RU, tr-TR, uk-UA, vi-VN,
zh-CN, zh-TW
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-09 14:24:57 +00:00
"node" : "Node" ,
"deployTo" : "Terapkan ke" ,
"localPanel" : "Panel lokal" ,
2026-05-08 12:54:07 +00:00
"protocol" : "Protokol" ,
"port" : "Port" ,
"portMap" : "Port Mapping" ,
"traffic" : "Traffic" ,
"details" : "Rincian" ,
"transportConfig" : "Transport" ,
"expireDate" : "Durasi" ,
"createdAt" : "Dibuat" ,
"updatedAt" : "Diperbarui" ,
"resetTraffic" : "Reset Traffic" ,
"addInbound" : "Tambahkan Masuk" ,
"generalActions" : "Tindakan Umum" ,
"autoRefresh" : "Pembaruan otomatis" ,
"autoRefreshInterval" : "Interval" ,
"modifyInbound" : "Ubah Masuk" ,
"deleteInbound" : "Hapus Masuk" ,
"deleteInboundContent" : "Apakah Anda yakin ingin menghapus masuk?" ,
"deleteClient" : "Hapus Klien" ,
"deleteClientContent" : "Apakah Anda yakin ingin menghapus klien?" ,
"resetTrafficContent" : "Apakah Anda yakin ingin mereset traffic?" ,
"copyLink" : "Salin URL" ,
"address" : "Alamat" ,
"network" : "Jaringan" ,
"destinationPort" : "Port Tujuan" ,
"targetAddress" : "Alamat Target" ,
"monitorDesc" : "Biarkan kosong untuk mendengarkan semua IP" ,
"meansNoLimit" : "= Unlimited. (unit: GB)" ,
"totalFlow" : "Total Aliran" ,
"leaveBlankToNeverExpire" : "Biarkan kosong untuk tidak pernah kedaluwarsa" ,
"noRecommendKeepDefault" : "Disarankan untuk tetap menggunakan pengaturan default" ,
"certificatePath" : "Path Berkas" ,
"certificateContent" : "Konten Berkas" ,
"publicKey" : "Kunci Publik" ,
"privatekey" : "Kunci Pribadi" ,
"clickOnQRcode" : "Klik pada Kode QR untuk Menyalin" ,
"client" : "Klien" ,
"export" : "Ekspor Semua URL" ,
"clone" : "Duplikat" ,
"cloneInbound" : "Duplikat" ,
"cloneInboundContent" : "Semua pengaturan masuk ini, kecuali Port, Listening IP, dan Klien, akan diterapkan pada duplikat." ,
"cloneInboundOk" : "Duplikat" ,
"resetAllTraffic" : "Reset Semua Traffic Masuk" ,
"resetAllTrafficTitle" : "Reset Semua Traffic Masuk" ,
"resetAllTrafficContent" : "Apakah Anda yakin ingin mereset traffic semua masuk?" ,
"resetInboundClientTraffics" : "Reset Traffic Klien Masuk" ,
"resetInboundClientTrafficTitle" : "Reset Traffic Klien Masuk" ,
"resetInboundClientTrafficContent" : "Apakah Anda yakin ingin mereset traffic klien masuk ini?" ,
"resetAllClientTraffics" : "Reset Traffic Semua Klien" ,
"resetAllClientTrafficTitle" : "Reset Traffic Semua Klien" ,
"resetAllClientTrafficContent" : "Apakah Anda yakin ingin mereset traffic semua klien?" ,
"delDepletedClients" : "Hapus Klien Habis" ,
"delDepletedClientsTitle" : "Hapus Klien Habis" ,
"delDepletedClientsContent" : "Apakah Anda yakin ingin menghapus semua klien yang habis?" ,
"email" : "Email" ,
"emailDesc" : "Harap berikan alamat email yang unik." ,
"IPLimit" : "Batas IP" ,
"IPLimitDesc" : "Menonaktifkan masuk jika jumlah melebihi nilai yang ditetapkan. (0 = nonaktif)" ,
"IPLimitlog" : "Log IP" ,
"IPLimitlogDesc" : "Log histori IP. (untuk mengaktifkan masuk setelah menonaktifkan, hapus log)" ,
"IPLimitlogclear" : "Hapus Log" ,
"setDefaultCert" : "Atur Sertifikat dari Panel" ,
2026-05-08 15:20:30 +00:00
"telegramDesc" : "Harap berikan ID Obrolan Telegram. (gunakan perintah '/id' di bot) atau ({'@'}userinfobot)" ,
2026-05-08 12:54:07 +00:00
"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" ,
"import" : "Impor" ,
"importInbound" : "Impor Masuk" ,
"periodicTrafficResetTitle" : "Reset Trafik Berkala" ,
"periodicTrafficResetDesc" : "Reset otomatis penghitung trafik pada interval tertentu" ,
"lastReset" : "Reset Terakhir" ,
"periodicTrafficReset" : {
"never" : "Tidak Pernah" ,
"daily" : "Harian" ,
"weekly" : "Mingguan" ,
"monthly" : "Bulanan" ,
"hourly" : "Setiap jam"
} ,
"toasts" : {
"obtain" : "Dapatkan" ,
"updateSuccess" : "Pembaruan berhasil" ,
"logCleanSuccess" : "Log telah dibersihkan" ,
"inboundsUpdateSuccess" : "Inbound berhasil diperbarui" ,
"inboundUpdateSuccess" : "Inbound berhasil diperbarui" ,
"inboundCreateSuccess" : "Inbound berhasil dibuat" ,
"inboundDeleteSuccess" : "Inbound berhasil dihapus" ,
"inboundClientAddSuccess" : "Klien inbound telah ditambahkan" ,
"inboundClientDeleteSuccess" : "Klien inbound telah dihapus" ,
"inboundClientUpdateSuccess" : "Klien inbound telah diperbarui" ,
"delDepletedClientsSuccess" : "Semua klien yang habis telah dihapus" ,
"resetAllClientTrafficSuccess" : "Semua lalu lintas klien telah direset" ,
"resetAllTrafficSuccess" : "Semua lalu lintas telah direset" ,
"resetInboundClientTrafficSuccess" : "Lalu lintas telah direset" ,
"trafficGetError" : "Gagal mendapatkan data lalu lintas" ,
"getNewX25519CertError" : "Terjadi kesalahan saat mendapatkan sertifikat X25519." ,
"getNewmldsa65Error" : "Terjadi kesalahan saat mendapatkan sertifikat mldsa65." ,
"getNewVlessEncError" : "Terjadi kesalahan saat mendapatkan sertifikat VlessEnc."
} ,
"stream" : {
"general" : {
"request" : "Permintaan" ,
"response" : "Respons" ,
"name" : "Nama" ,
"value" : "Nilai"
} ,
"tcp" : {
"version" : "Versi" ,
"method" : "Metode" ,
"path" : "Path" ,
"status" : "Status" ,
"statusDescription" : "Deskripsi Status" ,
"requestHeader" : "Header Permintaan" ,
"responseHeader" : "Header Respons"
}
}
} ,
"client" : {
"add" : "Tambah Klien" ,
"edit" : "Edit Klien" ,
"submitAdd" : "Tambah Klien" ,
"submitEdit" : "Simpan Perubahan" ,
"clientCount" : "Jumlah Klien" ,
"bulk" : "Tambahkan Massal" ,
"copyFromInbound" : "Salin klien dari inbound" ,
"copyToInbound" : "Salin klien ke" ,
"copySelected" : "Salin yang dipilih" ,
"copySource" : "Sumber" ,
"copyEmailPreview" : "Pratinjau email hasil" ,
"copySelectSourceFirst" : "Silakan pilih inbound sumber terlebih dahulu." ,
"copyResult" : "Hasil penyalinan" ,
"copyResultSuccess" : "Berhasil disalin" ,
"copyResultNone" : "Tidak ada yang disalin: tidak ada klien yang dipilih atau sumber kosong" ,
"copyResultErrors" : "Kesalahan penyalinan" ,
"copyFlowLabel" : "Flow untuk klien baru (VLESS)" ,
"copyFlowHint" : "Diterapkan ke semua klien yang disalin. Biarkan kosong untuk melewati." ,
"selectAll" : "Pilih semua" ,
"clearAll" : "Hapus semua" ,
"method" : "Metode" ,
"first" : "Pertama" ,
"last" : "Terakhir" ,
"prefix" : "Awalan" ,
"postfix" : "Akhiran" ,
"delayedStart" : "Mulai Awal" ,
"expireDays" : "Durasi" ,
"days" : "Hari" ,
"renew" : "Perpanjang Otomatis" ,
"renewDesc" : "Perpanjangan otomatis setelah kedaluwarsa. (0 = nonaktif)(unit: hari)"
} ,
feat(stats): system history modal + per-node CPU/Mem trends across all locales
Backend
- web/service/metric_history.go: generic in-memory ring buffer with two
singletons — system-wide (cpu/mem/netUp/netDown/online/load1/5/15)
and per-node (cpu/mem) keyed by node id
- ServerService.AppendStatusSample writes all 8 metrics every 2s on the
same tick; AppendCpuSample/AggregateCpuHistory kept for back-compat
- NodeService.UpdateHeartbeat appends cpu/mem only on online ticks so
offline gaps render as missing data, not phantom dips
- New routes: GET /panel/api/server/history/:metric/:bucket and
GET /panel/api/nodes/history/:id/:metric/:bucket, both whitelisted
Frontend
- Sparkline component generalized: arbitrary value range (auto-scale
when valueMax=null), pluggable yFormatter/tooltipFormatter for B/s,
client counts, load averages
- SystemHistoryModal replaces CpuHistoryModal with tabs for every
metric; opened from a tag on the 3X-UI card next to Documentation
- NodeHistoryPanel: expandable row on the Nodes table showing per-node
CPU and Mem trends, refreshed every 15s
Localization
- Backfill systemHistoryTitle / trendLast2Min / pages.inbounds.{node,
deployTo, localPanel} and the entire pages.nodes block (51 keys
including statusValues + toasts) into all 11 non-en/fa locales:
ar-EG, es-ES, id-ID, ja-JP, pt-BR, ru-RU, tr-TR, uk-UA, vi-VN,
zh-CN, zh-TW
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-09 14:24:57 +00:00
"nodes" : {
"title" : "Node" ,
"addNode" : "Tambah Node" ,
"editNode" : "Edit Node" ,
"totalNodes" : "Total Node" ,
"onlineNodes" : "Online" ,
"offlineNodes" : "Offline" ,
"avgLatency" : "Latensi Rata-rata" ,
"name" : "Nama" ,
"namePlaceholder" : "mis. de-frankfurt-1" ,
"addressPlaceholder" : "panel.example.com atau 1.2.3.4" ,
"remark" : "Catatan" ,
"scheme" : "Skema" ,
"address" : "Alamat" ,
"port" : "Port" ,
"basePath" : "Base Path" ,
"apiToken" : "Token API" ,
"apiTokenPlaceholder" : "Token dari halaman Pengaturan panel jarak jauh" ,
"apiTokenHint" : "Panel jarak jauh menampilkan token API-nya di Pengaturan → Token API." ,
"regenerate" : "Buat Ulang Token" ,
"regenerateConfirm" : "Membuat ulang akan membatalkan token saat ini. Setiap panel pusat yang menggunakannya akan kehilangan akses sampai diperbarui. Lanjutkan?" ,
"enable" : "Aktif" ,
"status" : "Status" ,
"cpu" : "CPU" ,
"mem" : "Memori" ,
"uptime" : "Uptime" ,
"latency" : "Latensi" ,
"lastHeartbeat" : "Heartbeat Terakhir" ,
"xrayVersion" : "Versi Xray" ,
"actions" : "Aksi" ,
"refresh" : "Segarkan" ,
"probe" : "Probe Sekarang" ,
"testConnection" : "Tes Koneksi" ,
"connectionOk" : "Koneksi OK ({ms} ms)" ,
"connectionFailed" : "Koneksi gagal" ,
"never" : "tidak pernah" ,
"justNow" : "baru saja" ,
"deleteConfirmTitle" : "Hapus node \"{name}\"?" ,
"deleteConfirmContent" : "Ini menghentikan pemantauan node. Panel jarak jauh itu sendiri tidak terpengaruh." ,
"statusValues" : {
"online" : "Online" ,
"offline" : "Offline" ,
"unknown" : "Tidak diketahui"
} ,
"toasts" : {
"list" : "Gagal memuat node" ,
"obtain" : "Gagal memuat node" ,
"add" : "Tambah node" ,
"update" : "Perbarui node" ,
"delete" : "Hapus node" ,
"deleted" : "Node dihapus" ,
"test" : "Tes koneksi" ,
"fillRequired" : "Nama, alamat, port, dan token API wajib diisi" ,
"probeFailed" : "Probe gagal"
}
} ,
2026-05-08 12:54:07 +00:00
"settings" : {
"title" : "Pengaturan Panel" ,
"save" : "Simpan" ,
"infoDesc" : "Setiap perubahan yang dibuat di sini perlu disimpan. Harap restart panel untuk menerapkan perubahan." ,
"restartPanel" : "Restart 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" ,
"resetDefaultConfig" : "Reset ke Default" ,
"panelSettings" : "Umum" ,
"securitySettings" : "Otentikasi" ,
"TGBotSettings" : "Bot Telegram" ,
"panelListeningIP" : "IP Pendengar" ,
"panelListeningIPDesc" : "Alamat IP untuk panel web. (biarkan kosong untuk mendengarkan semua IP)" ,
"panelListeningDomain" : "Domain Pendengar" ,
"panelListeningDomainDesc" : "Nama domain untuk panel web. (biarkan kosong untuk mendengarkan semua domain dan IP)" ,
"panelPort" : "Port Pendengar" ,
"panelPortDesc" : "Nomor port untuk panel web. (harus menjadi port yang tidak digunakan)" ,
"publicKeyPath" : "Path Kunci Publik" ,
"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" ,
"panelUrlPathDesc" : "URI path untuk panel web. (dimulai dengan ‘ /‘ dan diakhiri dengan ‘ /‘ )" ,
"pageSize" : "Ukuran Halaman" ,
"pageSizeDesc" : "Tentukan ukuran halaman untuk tabel masuk. (0 = nonaktif)" ,
"remarkModel" : "Model Catatan & Karakter Pemisah" ,
"datepicker" : "Jenis Kalender" ,
"datepickerPlaceholder" : "Pilih tanggal" ,
"datepickerDescription" : "Tugas terjadwal akan berjalan berdasarkan kalender ini." ,
"sampleRemark" : "Contoh Catatan" ,
"oldUsername" : "Username Saat Ini" ,
"currentPassword" : "Kata Sandi Saat Ini" ,
"newUsername" : "Username Baru" ,
"newPassword" : "Kata Sandi Baru" ,
"telegramBotEnable" : "Aktifkan Bot Telegram" ,
"telegramBotEnableDesc" : "Mengaktifkan bot Telegram." ,
"telegramToken" : "Token Telegram" ,
2026-05-08 15:20:30 +00:00
"telegramTokenDesc" : "Token bot Telegram yang diperoleh dari '{'@'}BotFather'." ,
2026-05-08 12:54:07 +00:00
"telegramProxy" : "Proxy SOCKS" ,
"telegramProxyDesc" : "Mengaktifkan proxy SOCKS5 untuk terhubung ke Telegram. (sesuaikan pengaturan sesuai panduan)" ,
"telegramAPIServer" : "Telegram API Server" ,
"telegramAPIServerDesc" : "Server API Telegram yang akan digunakan. Biarkan kosong untuk menggunakan server default." ,
"telegramChatId" : "ID Obrolan Admin" ,
2026-05-08 15:20:30 +00:00
"telegramChatIdDesc" : "ID Obrolan Admin Telegram. (dipisahkan koma)(dapatkan di sini {'@'}userinfobot) atau (gunakan perintah '/id' di bot)" ,
2026-05-08 12:54:07 +00:00
"telegramNotifyTime" : "Waktu Notifikasi" ,
"telegramNotifyTimeDesc" : "Waktu notifikasi bot Telegram yang diatur untuk laporan berkala. (gunakan format waktu crontab)" ,
"tgNotifyBackup" : "Cadangan Database" ,
"tgNotifyBackupDesc" : "Kirim berkas cadangan database dengan laporan." ,
"tgNotifyLogin" : "Notifikasi Login" ,
"tgNotifyLoginDesc" : "Dapatkan notifikasi tentang username, alamat IP, dan waktu setiap kali seseorang mencoba masuk ke panel web Anda." ,
"sessionMaxAge" : "Durasi Sesi" ,
"sessionMaxAgeDesc" : "Durasi di mana Anda dapat tetap masuk. (unit: menit)" ,
"expireTimeDiff" : "Notifikasi Tanggal Kedaluwarsa" ,
"expireTimeDiffDesc" : "Dapatkan notifikasi tentang tanggal kedaluwarsa saat mencapai ambang batas ini. (unit: hari)" ,
"trafficDiff" : "Notifikasi Batas Traffic" ,
"trafficDiffDesc" : "Dapatkan notifikasi tentang batas traffic saat mencapai ambang batas ini. (unit: GB)" ,
"tgNotifyCpu" : "Notifikasi Beban CPU" ,
"tgNotifyCpuDesc" : "Dapatkan notifikasi jika beban CPU melebihi ambang batas ini. (unit: %)" ,
"timeZone" : "Zone Waktu" ,
"timeZoneDesc" : "Tugas terjadwal akan berjalan berdasarkan zona waktu ini." ,
"subSettings" : "Langganan" ,
"subEnable" : "Aktifkan Layanan Langganan" ,
"subEnableDesc" : "Mengaktifkan layanan langganan." ,
"subJsonEnable" : "Aktifkan/Nonaktifkan endpoint langganan JSON secara mandiri." ,
"subTitle" : "Judul Langganan" ,
"subTitleDesc" : "Judul yang ditampilkan di klien VPN" ,
"subSupportUrl" : "URL Dukungan" ,
"subSupportUrlDesc" : "Tautan dukungan teknis yang ditampilkan di klien VPN" ,
"subProfileUrl" : "URL Profil" ,
"subProfileUrlDesc" : "Tautan ke situs web Anda yang ditampilkan di klien VPN" ,
"subAnnounce" : "Pengumuman" ,
"subAnnounceDesc" : "Teks pengumuman yang ditampilkan di klien VPN" ,
"subEnableRouting" : "Aktifkan perutean" ,
"subEnableRoutingDesc" : "Pengaturan global untuk mengaktifkan perutean (routing) di klien VPN. (Hanya untuk Happ)" ,
"subRoutingRules" : "Aturan routing" ,
"subRoutingRulesDesc" : "Aturan routing global untuk klien VPN. (Hanya untuk Happ)" ,
"subListen" : "IP Pendengar" ,
"subListenDesc" : "Alamat IP untuk layanan langganan. (biarkan kosong untuk mendengarkan semua IP)" ,
"subPort" : "Port Pendengar" ,
"subPortDesc" : "Nomor port untuk layanan langganan. (harus menjadi port yang tidak digunakan)" ,
"subCertPath" : "Path Kunci Publik" ,
"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" ,
"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)" ,
"subUpdates" : "Interval Pembaruan" ,
"subUpdatesDesc" : "Interval pembaruan URL langganan dalam aplikasi klien. (unit: jam)" ,
"subEncrypt" : "Encode" ,
"subEncryptDesc" : "Konten yang dikembalikan dari layanan langganan akan dienkripsi Base64." ,
"subShowInfo" : "Tampilkan Info Penggunaan" ,
"subShowInfoDesc" : "Sisa traffic dan tanggal akan ditampilkan di aplikasi klien." ,
"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." ,
"externalTrafficInformURI" : "Lalu Lintas Eksternal Menginformasikan URI" ,
"externalTrafficInformURIDesc" : "Pembaruan lalu lintas dikirim ke URI ini." ,
"restartXrayOnClientDisable" : "Nyalakan Ulang Xray Setelah Nonaktif Otomatis" ,
"restartXrayOnClientDisableDesc" : "Saat klien otomatis dinonaktifkan karena kedaluwarsa atau batas trafik, mulai ulang Xray." ,
"fragment" : "Fragmentasi" ,
"fragmentDesc" : "Aktifkan fragmentasi untuk paket hello TLS" ,
"fragmentSett" : "Pengaturan Fragmentasi" ,
"noisesDesc" : "Aktifkan Noises." ,
"noisesSett" : "Pengaturan Noises" ,
"mux" : "Mux" ,
"muxDesc" : "Mengirimkan beberapa aliran data independen dalam aliran data yang sudah ada." ,
"muxSett" : "Pengaturan Mux" ,
"direct" : "Koneksi langsung" ,
"directDesc" : "Secara langsung membuat koneksi dengan domain atau rentang IP negara tertentu." ,
"notifications" : "Notifikasi" ,
"certs" : "Sertifikat" ,
"externalTraffic" : "Lalu Lintas Eksternal" ,
"dateAndTime" : "Tanggal dan Waktu" ,
"proxyAndServer" : "Proxy dan Server" ,
"intervals" : "Interval" ,
"information" : "Informasi" ,
"language" : "Bahasa" ,
"telegramBotLanguage" : "Bahasa Bot Telegram" ,
"security" : {
"admin" : "Kredensial admin" ,
"twoFactor" : "Autentikasi dua faktor" ,
"twoFactorEnable" : "Aktifkan 2FA" ,
"twoFactorEnableDesc" : "Menambahkan lapisan autentikasi tambahan untuk keamanan lebih." ,
"twoFactorModalSetTitle" : "Aktifkan autentikasi dua faktor" ,
"twoFactorModalDeleteTitle" : "Nonaktifkan autentikasi dua faktor" ,
"twoFactorModalSteps" : "Untuk menyiapkan autentikasi dua faktor, lakukan beberapa langkah:" ,
"twoFactorModalFirstStep" : "1. Pindai kode QR ini di aplikasi autentikasi atau salin token di dekat kode QR dan tempelkan ke aplikasi" ,
"twoFactorModalSecondStep" : "2. Masukkan kode dari aplikasi" ,
"twoFactorModalRemoveStep" : "Masukkan kode dari aplikasi untuk menghapus autentikasi dua faktor." ,
"twoFactorModalChangeCredentialsTitle" : "Ubah kredensial" ,
"twoFactorModalChangeCredentialsStep" : "Masukkan kode dari aplikasi untuk mengubah kredensial administrator." ,
"twoFactorModalSetSuccess" : "Autentikasi dua faktor telah berhasil dibuat" ,
"twoFactorModalDeleteSuccess" : "Autentikasi dua faktor telah berhasil dihapus" ,
"twoFactorModalError" : "Kode salah"
} ,
"toasts" : {
"modifySettings" : "Parameter telah diubah." ,
"getSettings" : "Terjadi kesalahan saat mengambil parameter." ,
"modifyUserError" : "Terjadi kesalahan saat mengubah kredensial administrator." ,
"modifyUser" : "Anda telah berhasil mengubah kredensial administrator." ,
"originalUserPassIncorrect" : "Username atau password saat ini tidak valid" ,
"userPassMustBeNotEmpty" : "Username dan password baru tidak boleh kosong" ,
"getOutboundTrafficError" : "Gagal mendapatkan lalu lintas keluar" ,
"resetOutboundTrafficError" : "Gagal mereset lalu lintas keluar"
}
} ,
"xray" : {
"title" : "Konfigurasi Xray" ,
"save" : "Simpan" ,
"restart" : "Restart Xray" ,
"restartSuccess" : "Xray berhasil diluncurkan ulang" ,
"stopSuccess" : "Xray telah berhasil dihentikan" ,
"restartError" : "Terjadi kesalahan saat memulai ulang Xray." ,
"stopError" : "Terjadi kesalahan saat menghentikan Xray." ,
"basicTemplate" : "Dasar" ,
"advancedTemplate" : "Lanjutan" ,
"generalConfigs" : "Strategi Umum" ,
"generalConfigsDesc" : "Opsi ini akan menentukan penyesuaian strategi umum." ,
"logConfigs" : "Catatan" ,
"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" ,
"blockConnectionsConfigsDesc" : "Opsi ini akan memblokir lalu lintas berdasarkan negara yang diminta." ,
"directConnectionsConfigsDesc" : "Koneksi langsung memastikan bahwa lalu lintas tertentu tidak dialihkan melalui server lain." ,
"blockips" : "Blokir IP" ,
"blockdomains" : "Blokir Domain" ,
"directips" : "IP Langsung" ,
"directdomains" : "Domain Langsung" ,
"ipv4Routing" : "Perutean IPv4" ,
"ipv4RoutingDesc" : "Opsi ini akan mengalihkan lalu lintas berdasarkan tujuan tertentu melalui IPv4." ,
"warpRouting" : "Perutean WARP" ,
"warpRoutingDesc" : "Opsi ini akan mengalihkan lalu lintas berdasarkan tujuan tertentu melalui WARP." ,
"nordRouting" : "Routing NordVPN" ,
"nordRoutingDesc" : "Opsi ini akan mengalihkan lalu lintas berdasarkan tujuan tertentu melalui NordVPN." ,
"Template" : "Template Konfigurasi Xray Lanjutan" ,
"TemplateDesc" : "File konfigurasi Xray akhir akan dibuat berdasarkan template ini." ,
"FreedomStrategy" : "Strategi Protokol Freedom" ,
"FreedomStrategyDesc" : "Atur strategi output untuk jaringan dalam Protokol Freedom." ,
"RoutingStrategy" : "Strategi Pengalihan Keseluruhan" ,
"RoutingStrategyDesc" : "Atur strategi pengalihan lalu lintas keseluruhan untuk menyelesaikan semua permintaan." ,
"outboundTestUrl" : "URL tes outbound" ,
"outboundTestUrlDesc" : "URL yang digunakan saat menguji konektivitas outbound" ,
"Torrent" : "Blokir Protokol BitTorrent" ,
"Inbounds" : "Masuk" ,
"InboundsDesc" : "Menerima klien tertentu." ,
"Outbounds" : "Keluar" ,
"Balancers" : "Penyeimbang" ,
"OutboundsDesc" : "Atur jalur lalu lintas keluar." ,
"Routings" : "Aturan Pengalihan" ,
"RoutingsDesc" : "Prioritas setiap aturan penting!" ,
"completeTemplate" : "Semua" ,
"logLevel" : "Tingkat Log" ,
"logLevelDesc" : "Tingkat log untuk log kesalahan, menunjukkan informasi yang perlu dicatat." ,
"accessLog" : "Log Akses" ,
"accessLogDesc" : "Jalur file untuk log akses. Nilai khusus 'tidak ada' menonaktifkan log akses" ,
"errorLog" : "Catatan eror" ,
"errorLogDesc" : "Jalur file untuk log kesalahan. Nilai khusus 'tidak ada' menonaktifkan log kesalahan" ,
"dnsLog" : "Log DNS" ,
"dnsLogDesc" : "Apakah akan mengaktifkan log kueri DNS" ,
"maskAddress" : "Alamat Masker" ,
"maskAddressDesc" : "Masker alamat IP, ketika diaktifkan, akan secara otomatis mengganti alamat IP yang muncul di log." ,
"statistics" : "Statistik" ,
"statsInboundUplink" : "Statistik Unggah Masuk" ,
"statsInboundUplinkDesc" : "Mengaktifkan pengumpulan statistik untuk lalu lintas unggah dari semua proxy masuk." ,
"statsInboundDownlink" : "Statistik Unduh Masuk" ,
"statsInboundDownlinkDesc" : "Mengaktifkan pengumpulan statistik untuk lalu lintas unduh dari semua proxy masuk." ,
"statsOutboundUplink" : "Statistik Unggah Keluar" ,
"statsOutboundUplinkDesc" : "Mengaktifkan pengumpulan statistik untuk lalu lintas unggah dari semua proxy keluar." ,
"statsOutboundDownlink" : "Statistik Unduh Keluar" ,
"statsOutboundDownlinkDesc" : "Mengaktifkan pengumpulan statistik untuk lalu lintas unduh dari semua proxy keluar." ,
"rules" : {
"first" : "Pertama" ,
"last" : "Terakhir" ,
"up" : "Naik" ,
"down" : "Turun" ,
"source" : "Sumber" ,
"dest" : "Tujuan" ,
"inbound" : "Masuk" ,
"outbound" : "Keluar" ,
"balancer" : "Pengimbang" ,
"info" : "Info" ,
"add" : "Tambahkan Aturan" ,
"edit" : "Edit Aturan" ,
"useComma" : "Item yang dipisahkan koma"
} ,
"outbound" : {
"addOutbound" : "Tambahkan Keluar" ,
"addReverse" : "Tambahkan Revers" ,
"editOutbound" : "Edit Keluar" ,
"editReverse" : "Edit Revers" ,
"reverseTag" : "Tag Revers" ,
"reverseTagDesc" : "Tag outbound proxy revers sederhana VLESS. Kosongkan untuk menonaktifkan." ,
"reverseTagPlaceholder" : "tag outbound (kosong untuk menonaktifkan)" ,
"tag" : "Tag" ,
"tagDesc" : "Tag Unik" ,
"address" : "Alamat" ,
"reverse" : "Revers" ,
"domain" : "Domain" ,
"type" : "Tipe" ,
"bridge" : "Jembatan" ,
"portal" : "Portal" ,
"link" : "Tautan" ,
"intercon" : "Interkoneksi" ,
"settings" : "Pengaturan" ,
"accountInfo" : "Informasi Akun" ,
"outboundStatus" : "Status Keluar" ,
"sendThrough" : "Kirim Melalui" ,
"test" : "Tes" ,
"testResult" : "Hasil Tes" ,
"testing" : "Menguji koneksi..." ,
"testSuccess" : "Tes berhasil" ,
"testFailed" : "Tes gagal" ,
"testError" : "Gagal menguji outbound" ,
"nordvpn" : "NordVPN" ,
"accessToken" : "Token Akses" ,
"country" : "Negara" ,
"server" : "Server" ,
"city" : "Kota" ,
"allCities" : "Semua Kota" ,
"privateKey" : "Kunci Privat" ,
"load" : "Beban"
} ,
"balancer" : {
"addBalancer" : "Tambahkan Penyeimbang" ,
"editBalancer" : "Sunting Penyeimbang" ,
"balancerStrategy" : "Strategi" ,
"balancerSelectors" : "Penyeleksi" ,
"tag" : "Menandai" ,
"tagDesc" : "Label Unik" ,
"balancerDesc" : "BalancerTag dan outboundTag tidak dapat digunakan secara bersamaan. Jika digunakan secara bersamaan, hanya outboundTag yang akan berfungsi."
} ,
"wireguard" : {
"secretKey" : "Kunci Rahasia" ,
"publicKey" : "Kunci Publik" ,
"allowedIPs" : "IP yang Diizinkan" ,
"endpoint" : "Titik Akhir" ,
"psk" : "Kunci Pra-Bagi" ,
"domainStrategy" : "Strategi Domain"
} ,
"tun" : {
"nameDesc" : "Nama antarmuka TUN. Standar adalah 'xray0'" ,
"mtuDesc" : "Unit Transmisi Maksimum. Ukuran maksimum paket data. Standar adalah 1500" ,
"userLevel" : "Level Pengguna" ,
"userLevelDesc" : "Semua koneksi yang dibuat melalui inbound ini akan menggunakan level pengguna ini. Standar adalah 0"
} ,
"dns" : {
"enable" : "Aktifkan DNS" ,
"enableDesc" : "Aktifkan server DNS bawaan" ,
"tag" : "Tanda DNS Masuk" ,
"tagDesc" : "Tanda ini akan tersedia sebagai tanda masuk dalam aturan penataan." ,
"clientIp" : "IP Klien" ,
"clientIpDesc" : "Digunakan untuk memberi tahu server tentang lokasi IP yang ditentukan selama kueri DNS" ,
"disableCache" : "Nonaktifkan cache" ,
"disableCacheDesc" : "Menonaktifkan caching DNS" ,
"disableFallback" : "Nonaktifkan Fallback" ,
"disableFallbackDesc" : "Menonaktifkan kueri DNS fallback" ,
"disableFallbackIfMatch" : "Nonaktifkan Fallback Jika Cocok" ,
"disableFallbackIfMatchDesc" : "Menonaktifkan kueri DNS fallback ketika daftar domain yang cocok dari server DNS terpenuhi" ,
"enableParallelQuery" : "Aktifkan Kueri Paralel" ,
"enableParallelQueryDesc" : "Aktifkan kueri DNS paralel ke beberapa server untuk resolusi yang lebih cepat" ,
"strategy" : "Strategi Kueri" ,
"strategyDesc" : "Strategi keseluruhan untuk menyelesaikan nama domain" ,
"add" : "Tambahkan Server" ,
"edit" : "Sunting Server" ,
"domains" : "Domains" ,
"expectIPs" : "IP yang Diharapkan" ,
"unexpectIPs" : "IP tak terduga" ,
"useSystemHosts" : "Gunakan Hosts Sistem" ,
"useSystemHostsDesc" : "Gunakan file hosts dari sistem yang terinstal" ,
"usePreset" : "Gunakan templat" ,
"dnsPresetTitle" : "Templat DNS" ,
"dnsPresetFamily" : "Keluarga"
} ,
"fakedns" : {
"add" : "Tambahkan DNS Palsu" ,
"edit" : "Edit DNS Palsu" ,
"ipPool" : "Subnet Kumpulan IP" ,
"poolSize" : "Ukuran Kolam"
}
}
} ,
"tgbot" : {
"keyboardClosed" : "❌ Keyboard ditutup!" ,
"noResult" : "❗ Tidak ada hasil!" ,
"noQuery" : "❌ Kueri tidak ditemukan! Silakan gunakan perintah lagi!" ,
"wentWrong" : "❌ Terjadi kesalahan!" ,
"noIpRecord" : "❗ Tidak ada Catatan IP!" ,
"noInbounds" : "❗ Tidak ada inbound yang ditemukan!" ,
"unlimited" : "♾ Tidak terbatas (Reset)" ,
"add" : "Tambah" ,
"month" : "Bulan" ,
"months" : "Bulan" ,
"day" : "Hari" ,
"days" : "Hari" ,
"hours" : "Jam" ,
"minutes" : "Menit" ,
"unknown" : "Tidak diketahui" ,
"inbounds" : "Inbound" ,
"clients" : "Klien" ,
"offline" : "🔴 Offline" ,
"online" : "🟢 Online" ,
"commands" : {
"unknown" : "❗ Perintah tidak dikenal." ,
"pleaseChoose" : "👇 Harap pilih:\r\n" ,
"help" : "🤖 Selamat datang di bot ini! Ini dirancang untuk menyediakan data tertentu dari panel web dan memungkinkan Anda melakukan modifikasi sesuai kebutuhan.\r\n\r\n" ,
"start" : "👋 Halo <i>{{ .Firstname }}</i>.\r\n" ,
"welcome" : "🤖 Selamat datang di <b>{{.Hostname }}</b> bot managemen.\r\n" ,
"status" : "✅ Bot dalam keadaan baik!" ,
"usage" : "❗ Harap berikan teks untuk mencari!" ,
"getID" : "🆔 ID Anda: <code>{{ .ID }}</code>" ,
"helpAdminCommands" : "Untuk memulai ulang Xray Core:\r\n<code>/restart</code>\r\n\r\nUntuk mencari email klien:\r\n<code>/usage [Email]</code>\r\n\r\nUntuk mencari inbound (dengan statistik klien):\r\n<code>/inbound [Catatan]</code>\r\n\r\nID Obrolan Telegram:\r\n<code>/id</code>" ,
"helpClientCommands" : "Untuk mencari statistik, gunakan perintah berikut:\r\n<code>/usage [Email]</code>\r\n\r\nID Obrolan Telegram:\r\n<code>/id</code>" ,
"restartUsage" : "\r\n\r\n<code>/restart</code>" ,
"restartSuccess" : "✅ Operasi berhasil!" ,
"restartFailed" : "❗ Kesalahan dalam operasi.\r\n\r\n<code>Error: {{ .Error }}</code>." ,
"xrayNotRunning" : "❗ Xray Core tidak berjalan." ,
"startDesc" : "Tampilkan menu utama" ,
"helpDesc" : "Bantuan bot" ,
"statusDesc" : "Periksa status bot" ,
"idDesc" : "Tampilkan ID Telegram Anda"
} ,
"messages" : {
"cpuThreshold" : "🔴 Beban CPU {{ .Percent }}% melebihi batas {{ .Threshold }}%" ,
"selectUserFailed" : "❌ Kesalahan dalam pemilihan pengguna!" ,
"userSaved" : "✅ Pengguna Telegram tersimpan." ,
"loginSuccess" : "✅ Berhasil masuk ke panel.\r\n" ,
"loginFailed" : "❗️ Gagal masuk ke panel.\r\n" ,
"2faFailed" : "2FA Gagal" ,
"report" : "🕰 Laporan Terjadwal: {{ .RunTime }}\r\n" ,
"datetime" : "⏰ Tanggal & Waktu: {{ .DateTime }}\r\n" ,
"hostname" : "💻 Host: {{ .Hostname }}\r\n" ,
"version" : "🚀 Versi 3X-UI: {{ .Version }}\r\n" ,
"xrayVersion" : "📡 Versi Xray: {{ .XrayVersion }}\r\n" ,
"ipv6" : "🌐 IPv6: {{ .IPv6 }}\r\n" ,
"ipv4" : "🌐 IPv4: {{ .IPv4 }}\r\n" ,
"ip" : "🌐 IP: {{ .IP }}\r\n" ,
"ips" : "🔢 IP:\r\n{{ .IPs }}\r\n" ,
"serverUpTime" : "⏳ Waktu Aktif: {{ .UpTime }} {{ .Unit }}\r\n" ,
"serverLoad" : "📈 Beban Sistem: {{ .Load1 }}, {{ .Load2 }}, {{ .Load3 }}\r\n" ,
"serverMemory" : "📋 RAM: {{ .Current }}/{{ .Total }}\r\n" ,
"tcpCount" : "🔹 TCP: {{ .Count }}\r\n" ,
"udpCount" : "🔸 UDP: {{ .Count }}\r\n" ,
"traffic" : "🚦 Lalu Lintas: {{ .Total }} (↑{{ .Upload }},↓{{ .Download }})\r\n" ,
"xrayStatus" : "ℹ ️ Status: {{ .State }}\r\n" ,
"username" : "👤 Nama Pengguna: {{ .Username }}\r\n" ,
"reason" : "❗️ Alasan: {{ .Reason }}\r\n" ,
"time" : "⏰ Waktu: {{ .Time }}\r\n" ,
"inbound" : "📍 Inbound: {{ .Remark }}\r\n" ,
"port" : "🔌 Port: {{ .Port }}\r\n" ,
"expire" : "📅 Tanggal Kadaluarsa: {{ .Time }}\r\n" ,
"expireIn" : "📅 Kadaluarsa Dalam: {{ .Time }}\r\n" ,
"active" : "💡 Aktif: {{ .Enable }}\r\n" ,
"enabled" : "🚨 Diaktifkan: {{ .Enable }}\r\n" ,
"online" : "🌐 Status Koneksi: {{ .Status }}\r\n" ,
"lastOnline" : "🔙 Terakhir online: {{ .Time }}\r\n" ,
"email" : "📧 Email: {{ .Email }}\r\n" ,
"upload" : "🔼 Unggah: ↑{{ .Upload }}\r\n" ,
"download" : "🔽 Unduh: ↓{{ .Download }}\r\n" ,
"total" : "📊 Total: ↑↓{{ .UpDown }} / {{ .Total }}\r\n" ,
"TGUser" : "👤 Pengguna Telegram: {{ .TelegramID }}\r\n" ,
"exhaustedMsg" : "🚨 Habis {{ .Type }}:\r\n" ,
"exhaustedCount" : "🚨 Jumlah Habis {{ .Type }}:\r\n" ,
"onlinesCount" : "🌐 Klien Online: {{ .Count }}\r\n" ,
"disabled" : "🛑 Dinonaktifkan: {{ .Disabled }}\r\n" ,
"depleteSoon" : "🔜 Habis Sebentar: {{ .Deplete }}\r\n\r\n" ,
"backupTime" : "🗄 Waktu Backup: {{ .Time }}\r\n" ,
"refreshedOn" : "\r\n📋🔄 Diperbarui Pada: {{ .Time }}\r\n\r\n" ,
"yes" : "✅ Ya" ,
"no" : "❌ Tidak" ,
"received_id" : "🔑📥 ID diperbarui." ,
"received_password" : "🔑📥 Kata sandi diperbarui." ,
"received_email" : "📧📥 Email diperbarui." ,
"received_comment" : "💬📥 Komentar diperbarui." ,
"id_prompt" : "🔑 ID Default: {{ .ClientId }}\n\nMasukkan ID Anda." ,
"pass_prompt" : "🔑 Kata Sandi Default: {{ .ClientPassword }}\n\nMasukkan kata sandi Anda." ,
"email_prompt" : "📧 Email Default: {{ .ClientEmail }}\n\nMasukkan email Anda." ,
"comment_prompt" : "💬 Komentar Default: {{ .ClientComment }}\n\nMasukkan komentar Anda." ,
"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 }}" ,
"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? 🤔" ,
"SuccessResetTraffic" : "📧 Email: {{ .ClientEmail }}\n🏁 Hasil: ✅ Berhasil" ,
"FailedResetTraffic" : "📧 Email: {{ .ClientEmail }}\n🏁 Hasil: ❌ Gagal \n\n🛠️ Kesalahan: [ {{ .ErrorMessage }} ]" ,
"FinishProcess" : "🔚 Proses reset traffic selesai untuk semua klien."
} ,
"buttons" : {
"closeKeyboard" : "❌ Tutup Papan Ketik" ,
"cancel" : "❌ Batal" ,
"cancelReset" : "❌ Batal Reset" ,
"cancelIpLimit" : "❌ Batal Batas IP" ,
"confirmResetTraffic" : "✅ Konfirmasi Reset Lalu Lintas?" ,
"confirmClearIps" : "✅ Konfirmasi Hapus IPs?" ,
"confirmRemoveTGUser" : "✅ Konfirmasi Hapus Pengguna Telegram?" ,
"confirmToggle" : "✅ Konfirmasi Aktifkan/Nonaktifkan Pengguna?" ,
"dbBackup" : "Dapatkan Cadangan DB" ,
"serverUsage" : "Penggunaan Server" ,
"getInbounds" : "Dapatkan Inbounds" ,
"depleteSoon" : "Habis Sebentar" ,
"clientUsage" : "Dapatkan Penggunaan" ,
"onlines" : "Klien Online" ,
"commands" : "Perintah" ,
"refresh" : "🔄 Perbarui" ,
"clearIPs" : "❌ Hapus IPs" ,
"removeTGUser" : "❌ Hapus Pengguna Telegram" ,
"selectTGUser" : "👤 Pilih Pengguna Telegram" ,
"selectOneTGUser" : "👤 Pilih Pengguna Telegram:" ,
"resetTraffic" : "📈 Reset Lalu Lintas" ,
"resetExpire" : "📅 Ubah Tanggal Kadaluarsa" ,
"ipLog" : "🔢 Log IP" ,
"ipLimit" : "🔢 Batas IP" ,
"setTGUser" : "👤 Set Pengguna Telegram" ,
"toggle" : "🔘 Aktifkan / Nonaktifkan" ,
"custom" : "🔢 Kustom" ,
"confirmNumber" : "✅ Konfirmasi: {{ .Num }}" ,
"confirmNumberAdd" : "✅ Konfirmasi menambahkan: {{ .Num }}" ,
"limitTraffic" : "🚧 Batas Lalu Lintas" ,
"getBanLogs" : "Dapatkan Log Pemblokiran" ,
"allClients" : "Semua Klien" ,
"addClient" : "Tambah Klien" ,
"submitDisable" : "Kirim Sebagai Nonaktif ☑️" ,
"submitEnable" : "Kirim Sebagai Aktif ✅" ,
"use_default" : "🏷️ Gunakan Default" ,
"change_id" : "⚙️🔑 ID" ,
"change_password" : "⚙️🔑 Kata Sandi" ,
"change_email" : "⚙️📧 Email" ,
"change_comment" : "⚙️💬 Komentar" ,
"ResetAllTraffics" : "Reset Semua Lalu Lintas" ,
"SortedTrafficUsageReport" : "Laporan Penggunaan Lalu Lintas yang Terurut"
} ,
"answers" : {
"successfulOperation" : "✅ Operasi berhasil!" ,
"errorOperation" : "❗ Kesalahan dalam operasi." ,
"getInboundsFailed" : "❌ Gagal mendapatkan inbounds." ,
"getClientsFailed" : "❌ Gagal mendapatkan klien." ,
"canceled" : "❌ {{ .Email }}: Operasi dibatalkan." ,
"clientRefreshSuccess" : "✅ {{ .Email }}: Klien diperbarui dengan berhasil." ,
"IpRefreshSuccess" : "✅ {{ .Email }}: IP diperbarui dengan berhasil." ,
"TGIdRefreshSuccess" : "✅ {{ .Email }}: Pengguna Telegram Klien diperbarui dengan berhasil." ,
"resetTrafficSuccess" : "✅ {{ .Email }}: Lalu lintas direset dengan berhasil." ,
"setTrafficLimitSuccess" : "✅ {{ .Email }}: Batas lalu lintas disimpan dengan berhasil." ,
"expireResetSuccess" : "✅ {{ .Email }}: Hari kadaluarsa direset dengan berhasil." ,
"resetIpSuccess" : "✅ {{ .Email }}: Batas IP {{ .Count }} disimpan dengan berhasil." ,
"clearIpSuccess" : "✅ {{ .Email }}: IP dihapus dengan berhasil." ,
"getIpLog" : "✅ {{ .Email }}: Dapatkan Log IP." ,
"getUserInfo" : "✅ {{ .Email }}: Dapatkan Info Pengguna Telegram." ,
"removedTGUserSuccess" : "✅ {{ .Email }}: Pengguna Telegram dihapus dengan berhasil." ,
"enableSuccess" : "✅ {{ .Email }}: Diaktifkan dengan berhasil." ,
"disableSuccess" : "✅ {{ .Email }}: Dinonaktifkan dengan berhasil." ,
"askToAddUserId" : "Konfigurasi Anda tidak ditemukan!\r\nSilakan minta admin Anda untuk menggunakan ChatID Telegram Anda dalam konfigurasi Anda.\r\n\r\nChatID Pengguna Anda: <code>{{ .TgUserID }}</code>" ,
"chooseClient" : "Pilih Klien untuk Inbound {{ .Inbound }}" ,
"chooseInbound" : "Pilih Inbound"
}
}
}