mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2026-11-10 23:25:02 +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": "آپلود",
|
||||
"expiry": "تاریخ پایان",
|
||||
"totalQuota": "حجم کلی",
|
||||
"individualLinks": "لینکهای تکی",
|
||||
"active": "فعال",
|
||||
"inactive": "غیرفعال",
|
||||
"unlimited": "نامحدود",
|
||||
@@ -1830,6 +1829,11 @@
|
||||
"subIncyResolveDnsIp": "آیپی سرور DoH",
|
||||
"subIncyResolveDnsIpDesc": "آیپی سرور DoH برای بوتاسترپ.",
|
||||
"subIncyGroupRouting": "مسیریابی",
|
||||
"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": "حریم خصوصی گروه فعال است",
|
||||
"tgPrivacyOnDesc": "این ربات فقط در چت خصوصی پاسخ میدهد، بنابراین گروهها را عمداً نادیده میگیرد. حریم خصوصی گروه فقط تعیین میکند که ربات اجازه خواندن پیامهای گروه را دارد یا نه، که از آن استفاده نمیکند.",
|
||||
"subHostSortMode": "ترتیب گرههای اشتراک",
|
||||
"subHostSortInbound": "ترتیب ورودیها (پیشفرض)",
|
||||
"subHostSortHosts": "ترتیب میزبانها",
|
||||
@@ -2486,7 +2490,6 @@
|
||||
}
|
||||
},
|
||||
"tgbot": {
|
||||
"keyboardClosed": "❌ صفحه کلید بسته شد!",
|
||||
"noResult": "❗ نتیجه ای یافت نشد!",
|
||||
"noQuery": "❌ درخواست یافت نشد! لطفا دوباره تلاش کنید!",
|
||||
"wentWrong": "❌ مشکلی پیش آمد!",
|
||||
@@ -2508,10 +2511,6 @@
|
||||
"unknown": "❗ دستور ناشناخته",
|
||||
"pleaseChoose": "👇 لطفاً انتخاب کنید:\r\n",
|
||||
"help": "🤖 به این ربات خوش آمدید! این ربات برای ارائه دادههای خاص از سرور طراحی شده است و به شما امکان تغییرات لازم را میدهد.\r\n\r\n",
|
||||
"start": "👋 سلام <i>{{ .Firstname }}</i>.\r\n",
|
||||
"welcome": "🤖 به ربات مدیریت <b>{{ .Hostname }}</b> خوش آمدید.\r\n",
|
||||
"status": "✅ ربات در حالت عادی است!",
|
||||
"usage": "❗ لطفاً یک متن برای جستجو وارد کنید!",
|
||||
"getID": "🆔 شناسه شما: <code>{{ .ID }}</code>",
|
||||
"helpAdminCommands": "برای راهاندازی مجدد Xray Core:\r\n<code>/restart</code>\r\n\r\nبرای جستجوی ایمیل مشتری:\r\n<code>/usage [ایمیل]</code>\r\n\r\nبرای جستجوی ورودیها (با آمار مشتری):\r\n<code>/inbound [توضیحات]</code>\r\n\r\nشناسه گفتگوی تلگرام:\r\n<code>/id</code>",
|
||||
"helpClientCommands": "برای جستجوی آمار، از دستور زیر استفاده کنید:\r\n<code>/usage [ایمیل]</code>\r\n\r\nشناسه گفتگوی تلگرام:\r\n<code>/id</code>",
|
||||
@@ -2520,14 +2519,7 @@
|
||||
"restartFailed": "❗ خطا در عملیات.\r\n\r\n<code>خطا: {{ .Error }}</code>.",
|
||||
"xrayNotRunning": "❗ Xray Core در حال اجرا نیست.",
|
||||
"startDesc": "نمایش منوی اصلی",
|
||||
"helpDesc": "راهنمای ربات",
|
||||
"statusDesc": "بررسی وضعیت ربات",
|
||||
"idDesc": "نمایش شناسه تلگرام شما",
|
||||
"usageDesc": "مشاهده مصرف کاربر: /usage ایمیل",
|
||||
"inboundDesc": "جستجوی ورودیها: /inbound نام (مدیر)",
|
||||
"restartDesc": "راهاندازی مجدد هسته Xray (مدیر)",
|
||||
"broadcastDesc": "ارسال پیام به همه کاربران (مدیر)",
|
||||
"clearallDesc": "صفر کردن ترافیک همه کاربران (مدیر)"
|
||||
"statusOk": "✅ ربات سالم است!"
|
||||
},
|
||||
"messages": {
|
||||
"cpuThreshold": "بار پردازنده {{ .Percent }}% بیشتر از آستانه است {{ .Threshold }}%",
|
||||
@@ -2571,7 +2563,6 @@
|
||||
"inviteInvalid": "❗ این لینک دعوت نامعتبر است یا قبلاً استفاده شده است.\r\n",
|
||||
"inviteRateLimited": "⏳ تعداد تلاشهای دعوت بیش از حد مجاز است. لطفاً بعداً دوباره امتحان کنید.\r\n",
|
||||
"inviteRateLimitedAdmin": "⚠️ تلاشهای دعوت برای {{ .User }} (<code>{{ .ID }}</code>) مسدود شد: بیش از {{ .Limit }} تلاش در یک ساعت. ممکن است کسی در حال حدس زدن شناسههای اشتراک باشد.",
|
||||
"inviteLink": "🔗 لینک دعوت برای <code>{{ .Email }}</code>:\r\n<code>{{ .Link }}</code>\r\n\r\nاولین کسی که آن را باز کند به این کاربر متصل میشود.\r\n",
|
||||
"exhaustedCount": "🚨 تعداد {{ .Type }} بهاتمامرسیدهاست:\r\n",
|
||||
"onlinesCount": "🌐 کاربرانآنلاین: {{ .Count }}\r\n",
|
||||
"disabled": "🛑 غیرفعال: {{ .Disabled }}\r\n",
|
||||
@@ -2580,13 +2571,11 @@
|
||||
"refreshedOn": "\r\n📋🔄 تازهسازی شده در: {{ .Time }}\r\n\r\n",
|
||||
"yes": "✅ بله",
|
||||
"no": "❌ خیر",
|
||||
"received_email": "📧📥 ایمیل بهروزرسانی شد.",
|
||||
"received_comment": "💬📥 نظر بهروزرسانی شد.",
|
||||
"email_prompt": "📧 ایمیل پیشفرض: {{ .ClientEmail }}\n\nایمیل خود را وارد کنید.",
|
||||
"comment_prompt": "💬 نظر پیشفرض: {{ .ClientComment }}\n\nنظر خود را وارد کنید.",
|
||||
"tgid_prompt": "🆔 کاربر پیشفرض TG: {{ .ClientTGID }}\n\nشناسه عددی کاربر را برای اتصال به این کلاینت بفرستید، یا برای پاک کردن - / none را بفرستید.",
|
||||
"cancel": "❌ فرآیند لغو شد! \n\nمیتوانید هر زمان که خواستید /start را دوباره اجرا کنید. 🔄",
|
||||
"error_add_client": "⚠️ خطا:\n\n {{ .error }}",
|
||||
"using_default_value": "باشه، از مقدار پیشفرض استفاده میکنم. 😊",
|
||||
"incorrect_input": "ورودی شما معتبر نیست.\nعبارتها باید بدون فاصله باشند.\nمثال صحیح: aaaaaa\nمثال نادرست: aaa aaa 🚫",
|
||||
"broadcastAskText": "📤 ارسال گروهی: پیام خود را برای ارسال به کاربران بفرستید — متن، عکس، ویدیو، فایل یا یک آلبوم کامل.",
|
||||
"broadcastAlreadyRunning": "❗ یک ارسال گروهی در حال اجراست، تا پایان آن صبر کنید.",
|
||||
@@ -2610,7 +2599,23 @@
|
||||
"eventNodeDown": "نود {{ .Name }} قطع است",
|
||||
"eventNodeUp": "نود {{ .Name }} وصل است",
|
||||
"eventLoginFallback": "ورود ناموفق از {{ .Source }}",
|
||||
"memoryThreshold": "مصرف حافظه {{ .Percent }}% از حد آستانه {{ .Threshold }}% فراتر رفته است"
|
||||
"memoryThreshold": "مصرف حافظه {{ .Percent }}% از حد آستانه {{ .Threshold }}% فراتر رفته است",
|
||||
"inboundsCount": "🔌 Inbounds: {{ .Count }}\r\n",
|
||||
"clientsCount": "👥 Clients: {{ .Count }}\r\n",
|
||||
"category_server": "🖥 سرور",
|
||||
"category_clients": "👥 کاربران",
|
||||
"category_traffic": "🚦 ترافیک",
|
||||
"category_maintenance": "⚙️ نگهداری",
|
||||
"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": "🔳 کدهای QR:",
|
||||
"qrLegendSubscription": "{{ .Code }}. اشتراک",
|
||||
"qrLegendJSON": "{{ .Code }}. اشتراک JSON",
|
||||
"qrLegendLink": "{{ .Code }}. لینک برنامه {{ .App }}",
|
||||
"backupFailed": "خواندن پایگاه داده ممکن نشد؛ هیچ نسخه پشتیبانی ارسال نشد.",
|
||||
"privateOnly": "🤖 این ربات فقط در چت خصوصی کار میکند. لطفاً آن را در پیام مستقیم باز کنید."
|
||||
},
|
||||
"buttons": {
|
||||
"closeKeyboard": "❌ بستن کیبورد",
|
||||
@@ -2622,13 +2627,15 @@
|
||||
"confirmClearIps": "✅ تأیید پاکسازی آدرسهای آیپی؟",
|
||||
"confirmRemoveTGUser": "✅ تأیید حذف کاربر تلگرام؟",
|
||||
"confirmToggle": "✅ تایید فعال/غیرفعال کردن کاربر؟",
|
||||
"dbBackup": "دریافت پشتیبان",
|
||||
"serverUsage": "استفاده از سیستم",
|
||||
"getInbounds": "دریافت ورودیها",
|
||||
"depleteSoon": "بهزودی به پایان خواهد رسید",
|
||||
"clientUsage": "دریافت آمار کاربر",
|
||||
"onlines": "کاربران آنلاین",
|
||||
"commands": "دستورات",
|
||||
"dbBackup": "💾 دریافت پشتیبان",
|
||||
"serverUsage": "📊 استفاده از سیستم",
|
||||
"getInbounds": "🔌 دریافت ورودیها",
|
||||
"depleteSoon": "⚠️ بهزودی به پایان خواهد رسید",
|
||||
"onlines": "🟢 کاربران آنلاین",
|
||||
"catServer": "🖥 سرور",
|
||||
"catClients": "👥 کاربران",
|
||||
"catTraffic": "🚦 ترافیک",
|
||||
"catMaintenance": "⚙️ نگهداری",
|
||||
"refresh": "🔄 تازهسازی",
|
||||
"clearIPs": "❌ پاکسازی آدرسها",
|
||||
"removeTGUser": "❌ حذف کاربر تلگرام",
|
||||
@@ -2645,16 +2652,30 @@
|
||||
"confirmNumber": "✅ تایید: {{ .Num }}",
|
||||
"confirmNumberAdd": "✅ تایید اضافه کردن: {{ .Num }}",
|
||||
"limitTraffic": "🚧 محدودیت ترافیک",
|
||||
"getBanLogs": "گزارش های بلوک را دریافت کنید",
|
||||
"allClients": "همه مشتریان",
|
||||
"addClient": "افزودن مشتری",
|
||||
"getBanLogs": "📄 گزارش های بلوک را دریافت کنید",
|
||||
"allClients": "👥 همه مشتریان",
|
||||
"addClient": "➕ افزودن مشتری",
|
||||
"submitDisable": "ارسال به عنوان غیرفعال ☑️",
|
||||
"submitEnable": "ارسال به عنوان فعال ✅",
|
||||
"use_default": "🏷️ استفاده از پیشفرض",
|
||||
"change_email": "⚙️📧 ایمیل",
|
||||
"change_comment": "⚙️💬 نظر",
|
||||
"ResetAllTraffics": "بازنشانی همه ترافیکها",
|
||||
"SortedTrafficUsageReport": "گزارش استفاده از ترافیک مرتبشده"
|
||||
"ResetAllTraffics": "♻️ بازنشانی همه ترافیکها",
|
||||
"SortedTrafficUsageReport": "📈 گزارش استفاده از ترافیک مرتبشده",
|
||||
"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": "📢 همگانی",
|
||||
"attachInbound": "افزودن ورودی ({{ .Count }})",
|
||||
"attachDone": "✅ انجام شد"
|
||||
},
|
||||
"answers": {
|
||||
"broadcastStarted": "🚀 ارسال گروهی آغاز شد.",
|
||||
@@ -2682,6 +2703,36 @@
|
||||
"chooseClient": "یک مشتری برای ورودی {{ .Inbound }} انتخاب کنید",
|
||||
"chooseInbound": "یک ورودی انتخاب کنید",
|
||||
"qrCodeForClient": "کد QR برای کاربر {{ .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": "منقضی",
|
||||
"fromFirstUse": "از اولین استفاده"
|
||||
},
|
||||
"noValue": "—",
|
||||
"notices": {
|
||||
"repeat": "\r\n\r\n🔁 repeated {{ .Count }}× · last {{ .Time }}"
|
||||
}
|
||||
},
|
||||
"discord": {
|
||||
|
||||
Reference in New Issue
Block a user