mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2026-11-15 09:35:00 +03:00
feat(tgbot): rebuild the Telegram bot around editable screens and inline lists (#6760)
The bot answered every action with a new message, so a chat filled with stale menus whose buttons still acted, and long client or inbound lists were paged through dozens of buttons. Each chat now has one live screen that is edited in place: the menu is grouped into Server, Clients, Traffic and Maintenance, lists open through inline search, the add-client flow starts from a draft card, QR codes arrive as one labelled sheet, and repeated notices collapse into one with a counter. A client's /start and /usage show only that client's own links and usage, groups are refused, and the settings page warns when the bot's inline mode is off. Admin topics, the indexed Telegram lookup and every locale, Slovak included, carry over.
This commit is contained in:
@@ -85,7 +85,6 @@
|
||||
"uploaded": "Diunggah",
|
||||
"expiry": "Kedaluwarsa",
|
||||
"totalQuota": "Kuota total",
|
||||
"individualLinks": "Tautan individual",
|
||||
"active": "Aktif",
|
||||
"inactive": "Nonaktif",
|
||||
"unlimited": "Tanpa batas",
|
||||
@@ -1830,6 +1829,11 @@
|
||||
"subIncyResolveDnsIp": "IP server DoH",
|
||||
"subIncyResolveDnsIpDesc": "IP server DoH untuk bootstrap.",
|
||||
"subIncyGroupRouting": "Perutean",
|
||||
"tgInlineMissing": "Inline mode is disabled",
|
||||
"tgInlineMissingDesc": "Lists in the bot open through inline search. Enable it in @BotFather with /setinline, otherwise tapping a search button does nothing.",
|
||||
"tgInlineRecheck": "Check again",
|
||||
"tgPrivacyOn": "Privasi grup aktif",
|
||||
"tgPrivacyOnDesc": "Bot ini hanya menjawab di obrolan pribadi, jadi grup sengaja diabaikan. Privasi grup hanya menentukan apakah bot boleh membaca pesan grup, yang tidak digunakan.",
|
||||
"subHostSortMode": "Urutan node langganan",
|
||||
"subHostSortInbound": "Urutan inbound (bawaan)",
|
||||
"subHostSortHosts": "Urutan host",
|
||||
@@ -2486,7 +2490,6 @@
|
||||
}
|
||||
},
|
||||
"tgbot": {
|
||||
"keyboardClosed": "❌ Keyboard ditutup!",
|
||||
"noResult": "❗ Tidak ada hasil!",
|
||||
"noQuery": "❌ Kueri tidak ditemukan! Silakan gunakan perintah lagi!",
|
||||
"wentWrong": "❌ Terjadi kesalahan!",
|
||||
@@ -2508,10 +2511,6 @@
|
||||
"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>",
|
||||
@@ -2520,14 +2519,7 @@
|
||||
"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",
|
||||
"usageDesc": "Lihat pemakaian klien: /usage email",
|
||||
"inboundDesc": "Cari inbound: /inbound nama (admin)",
|
||||
"restartDesc": "Mulai ulang inti Xray (admin)",
|
||||
"broadcastDesc": "Kirim pesan ke semua klien (admin)",
|
||||
"clearallDesc": "Reset trafik semua klien (admin)"
|
||||
"statusOk": "✅ Bot berfungsi!"
|
||||
},
|
||||
"messages": {
|
||||
"cpuThreshold": "Beban CPU {{ .Percent }}% melebihi batas {{ .Threshold }}%",
|
||||
@@ -2571,7 +2563,6 @@
|
||||
"inviteInvalid": "❗ Tautan undangan ini tidak valid atau sudah digunakan.\r\n",
|
||||
"inviteRateLimited": "⏳ Terlalu banyak percobaan undangan. Silakan coba lagi nanti.\r\n",
|
||||
"inviteRateLimitedAdmin": "⚠️ Percobaan undangan diblokir untuk {{ .User }} (<code>{{ .ID }}</code>): lebih dari {{ .Limit }} percobaan dalam satu jam. Seseorang mungkin sedang menebak ID langganan.",
|
||||
"inviteLink": "🔗 Tautan undangan untuk <code>{{ .Email }}</code>:\r\n<code>{{ .Link }}</code>\r\n\r\nOrang pertama yang membukanya akan tertaut ke klien ini.\r\n",
|
||||
"exhaustedCount": "🚨 Jumlah Habis {{ .Type }}:\r\n",
|
||||
"onlinesCount": "🌐 Klien Online: {{ .Count }}\r\n",
|
||||
"disabled": "🛑 Dinonaktifkan: {{ .Disabled }}\r\n",
|
||||
@@ -2580,13 +2571,11 @@
|
||||
"refreshedOn": "\r\n📋🔄 Diperbarui Pada: {{ .Time }}\r\n\r\n",
|
||||
"yes": "✅ Ya",
|
||||
"no": "❌ Tidak",
|
||||
"received_email": "📧📥 Email diperbarui.",
|
||||
"received_comment": "💬📥 Komentar diperbarui.",
|
||||
"email_prompt": "📧 Email Default: {{ .ClientEmail }}\n\nMasukkan email Anda.",
|
||||
"comment_prompt": "💬 Komentar Default: {{ .ClientComment }}\n\nMasukkan komentar Anda.",
|
||||
"tgid_prompt": "🆔 Pengguna TG default: {{ .ClientTGID }}\n\nKirim id numerik pengguna untuk melampirkan ke klien ini, atau kirim - / none untuk menghapus.",
|
||||
"cancel": "❌ Proses Dibatalkan! \n\nAnda dapat /start lagi kapan saja. 🔄",
|
||||
"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 🚫",
|
||||
"broadcastAskText": "📡 Siaran: kirimkan pesan untuk dikirimkan ke klien Anda — teks, foto, video, file, atau satu album lengkap.",
|
||||
"broadcastAlreadyRunning": "❗ Siaran sedang berjalan, tunggu hingga selesai.",
|
||||
@@ -2610,7 +2599,23 @@
|
||||
"eventNodeDown": "Node {{ .Name }} MATI",
|
||||
"eventNodeUp": "Node {{ .Name }} AKTIF",
|
||||
"eventLoginFallback": "Gagal masuk dari {{ .Source }}",
|
||||
"memoryThreshold": "Penggunaan memori {{ .Percent }}% melebihi ambang batas {{ .Threshold }}%"
|
||||
"memoryThreshold": "Penggunaan memori {{ .Percent }}% melebihi ambang batas {{ .Threshold }}%",
|
||||
"inboundsCount": "🔌 Inbounds: {{ .Count }}\r\n",
|
||||
"clientsCount": "👥 Clients: {{ .Count }}\r\n",
|
||||
"category_server": "🖥 Server",
|
||||
"category_clients": "👥 Klien",
|
||||
"category_traffic": "🚦 Trafik",
|
||||
"category_maintenance": "⚙️ Pemeliharaan",
|
||||
"inlineHint": "\r\n🔍 The list opens through search: tap Find and start typing.",
|
||||
"subURL": "🔗 Subscription: <code>{{ .URL }}</code>\r\n",
|
||||
"jsonURL": "🧩 JSON: <code>{{ .URL }}</code>\r\n",
|
||||
"inviteHint": "Send this link to the client: the first Telegram account to open it is bound to the client.",
|
||||
"qrLegendHeader": "🔳 Kode QR:",
|
||||
"qrLegendSubscription": "{{ .Code }}. Langganan",
|
||||
"qrLegendJSON": "{{ .Code }}. Langganan JSON",
|
||||
"qrLegendLink": "{{ .Code }}. Tautan aplikasi {{ .App }}",
|
||||
"backupFailed": "Tidak dapat membaca basis data; tidak ada cadangan yang dikirim.",
|
||||
"privateOnly": "🤖 Bot ini hanya berfungsi di obrolan pribadi. Silakan buka di pesan langsung."
|
||||
},
|
||||
"buttons": {
|
||||
"closeKeyboard": "❌ Tutup Papan Ketik",
|
||||
@@ -2622,13 +2627,15 @@
|
||||
"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",
|
||||
"dbBackup": "💾 Dapatkan Cadangan DB",
|
||||
"serverUsage": "📊 Penggunaan Server",
|
||||
"getInbounds": "🔌 Dapatkan Inbounds",
|
||||
"depleteSoon": "⚠️ Habis Sebentar",
|
||||
"onlines": "🟢 Klien Online",
|
||||
"catServer": "🖥 Server",
|
||||
"catClients": "👥 Klien",
|
||||
"catTraffic": "🚦 Trafik",
|
||||
"catMaintenance": "⚙️ Pemeliharaan",
|
||||
"refresh": "🔄 Perbarui",
|
||||
"clearIPs": "❌ Hapus IPs",
|
||||
"removeTGUser": "❌ Hapus Pengguna Telegram",
|
||||
@@ -2645,16 +2652,30 @@
|
||||
"confirmNumber": "✅ Konfirmasi: {{ .Num }}",
|
||||
"confirmNumberAdd": "✅ Konfirmasi menambahkan: {{ .Num }}",
|
||||
"limitTraffic": "🚧 Batas Lalu Lintas",
|
||||
"getBanLogs": "Dapatkan Log Pemblokiran",
|
||||
"allClients": "Semua Klien",
|
||||
"addClient": "Tambah Klien",
|
||||
"getBanLogs": "📄 Dapatkan Log Pemblokiran",
|
||||
"allClients": "👥 Semua Klien",
|
||||
"addClient": "➕ Tambah Klien",
|
||||
"submitDisable": "Kirim Sebagai Nonaktif ☑️",
|
||||
"submitEnable": "Kirim Sebagai Aktif ✅",
|
||||
"use_default": "🏷️ Gunakan Default",
|
||||
"change_email": "⚙️📧 Email",
|
||||
"change_comment": "⚙️💬 Komentar",
|
||||
"ResetAllTraffics": "Reset Semua Lalu Lintas",
|
||||
"SortedTrafficUsageReport": "Laporan Penggunaan Lalu Lintas yang Terurut"
|
||||
"ResetAllTraffics": "♻️ Reset Semua Lalu Lintas",
|
||||
"SortedTrafficUsageReport": "📈 Laporan Penggunaan Lalu Lintas yang Terurut",
|
||||
"restartXray": "♻️ Restart Xray",
|
||||
"back": "⬅️ Back",
|
||||
"hide": "🙈 Hide",
|
||||
"page": "Page {{ .Page }} of {{ .Pages }}",
|
||||
"searchInbounds": "🔍 Find inbound…",
|
||||
"searchClients": "🔍 Find client…",
|
||||
"inlineDisabled": "⚠️ Inline mode is off",
|
||||
"clientCard": "⬅️ Client card",
|
||||
"links": "🔗 Links",
|
||||
"individualLinks": "🔗 Individual links",
|
||||
"qrCode": "🔳 QR code",
|
||||
"broadcast": "📢 Siaran",
|
||||
"attachInbound": "Lampirkan inbound ({{ .Count }})",
|
||||
"attachDone": "✅ Selesai"
|
||||
},
|
||||
"answers": {
|
||||
"broadcastStarted": "🚀 Siaran dimulai.",
|
||||
@@ -2682,6 +2703,36 @@
|
||||
"chooseClient": "Pilih Klien untuk Inbound {{ .Inbound }}",
|
||||
"chooseInbound": "Pilih Inbound",
|
||||
"qrCodeForClient": "Kode QR untuk klien {{ .Email }}:"
|
||||
},
|
||||
"screens": {
|
||||
"panel": "Panel",
|
||||
"main": "Main",
|
||||
"status": "Server",
|
||||
"inbounds": "Inbounds",
|
||||
"clients": "Clients",
|
||||
"client": "Client",
|
||||
"links": "Links",
|
||||
"qr": "QR code",
|
||||
"wizard": "New client",
|
||||
"reports": "Report",
|
||||
"backup": "Backup",
|
||||
"onlines": "Online",
|
||||
"deplete": "Running out",
|
||||
"commands": "Commands",
|
||||
"broadcast": "Broadcast"
|
||||
},
|
||||
"inline": {
|
||||
"noneTitle": "Nothing found",
|
||||
"noneDesc": "Use @BotFather /setinline to enable the list.",
|
||||
"offTitle": "⚠️ Inline mode is disabled for this bot",
|
||||
"offBody": "Lists are browsed in inline mode. Enable it in @BotFather: /setinline, then tap Check again.",
|
||||
"recheck": "Check again",
|
||||
"expired": "kedaluwarsa",
|
||||
"fromFirstUse": "sejak pemakaian pertama"
|
||||
},
|
||||
"noValue": "—",
|
||||
"notices": {
|
||||
"repeat": "\r\n\r\n🔁 repeated {{ .Count }}× · last {{ .Time }}"
|
||||
}
|
||||
},
|
||||
"discord": {
|
||||
|
||||
Reference in New Issue
Block a user