mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2025-08-23 03:16:52 +00:00
Implement broadcast messaging feature in Tgbot, allowing messages to be sent to all users or specific users based on email. Update translations for new messaging options and error handling. Enhance user interaction with inline keyboard buttons for selecting users and inbounds.
This commit is contained in:
parent
de5314c01f
commit
19fdb643f7
14 changed files with 410 additions and 24 deletions
|
@ -11,6 +11,7 @@ import (
|
||||||
"net/url"
|
"net/url"
|
||||||
"os"
|
"os"
|
||||||
"regexp"
|
"regexp"
|
||||||
|
"sort"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
@ -393,6 +394,112 @@ func (t *Tgbot) OnReceive() {
|
||||||
inbound, _ := t.inboundService.GetInbound(receiver_inbound_ID)
|
inbound, _ := t.inboundService.GetInbound(receiver_inbound_ID)
|
||||||
message_text, _ := t.BuildInboundClientDataMessage(inbound.Remark, inbound.Protocol)
|
message_text, _ := t.BuildInboundClientDataMessage(inbound.Remark, inbound.Protocol)
|
||||||
t.addClient(message.Chat.ID, message_text)
|
t.addClient(message.Chat.ID, message_text)
|
||||||
|
case "awaiting_broadcast_message":
|
||||||
|
smsg := message.Text
|
||||||
|
delete(userStates, message.Chat.ID)
|
||||||
|
|
||||||
|
inbounds, err := t.inboundService.GetAllInbounds()
|
||||||
|
if err != nil {
|
||||||
|
t.SendMsgToTgbot(message.Chat.ID, t.I18nBot("tgbot.inboundError")+err.Error(), tu.ReplyKeyboardRemove())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
var allClients []model.Client
|
||||||
|
for _, inbound := range inbounds {
|
||||||
|
clients, err := t.inboundService.GetClients(inbound)
|
||||||
|
if err != nil {
|
||||||
|
t.SendMsgToTgbot(message.Chat.ID, t.I18nBot("tgbot.clientError")+err.Error(), tu.ReplyKeyboardRemove())
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
allClients = append(allClients, clients...)
|
||||||
|
}
|
||||||
|
|
||||||
|
count := 0
|
||||||
|
for _, client := range allClients {
|
||||||
|
if client.TgID != 0 {
|
||||||
|
t.SendMsgToTgbot(client.TgID, smsg)
|
||||||
|
count++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
resultMsg := fmt.Sprintf(t.I18nBot("tgbot.broadcastMessageSent"), "Count=="+strconv.Itoa(count))
|
||||||
|
t.SendMsgToTgbot(message.Chat.ID, resultMsg, tu.ReplyKeyboardRemove())
|
||||||
|
case "awaiting_choose_user":
|
||||||
|
inboundIdStr, ok := userStates[message.Chat.ID+1000000000]
|
||||||
|
if !ok {
|
||||||
|
inbounds, err := t.inboundService.GetAllInbounds()
|
||||||
|
if err != nil || len(inbounds) == 0 {
|
||||||
|
t.SendMsgToTgbot(message.Chat.ID, t.I18nBot("tgbot.answers.getInboundsFailed"), tu.ReplyKeyboardRemove())
|
||||||
|
delete(userStates, message.Chat.ID)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
var buttons []telego.InlineKeyboardButton
|
||||||
|
for _, inbound := range inbounds {
|
||||||
|
btnText := inbound.Remark
|
||||||
|
callback := t.encodeQuery("broadcast_choose_inbound " + strconv.Itoa(inbound.Id))
|
||||||
|
buttons = append(buttons, tu.InlineKeyboardButton(btnText).WithCallbackData(callback))
|
||||||
|
}
|
||||||
|
keyboard := tu.InlineKeyboardGrid(tu.InlineKeyboardCols(2, buttons...))
|
||||||
|
t.SendMsgToTgbot(message.Chat.ID, t.I18nBot("tgbot.answers.chooseBroadcastInbound"), keyboard)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
email := strings.TrimSpace(message.Text)
|
||||||
|
inboundId, _ := strconv.Atoi(inboundIdStr)
|
||||||
|
inbound, err := t.inboundService.GetInbound(inboundId)
|
||||||
|
if err != nil {
|
||||||
|
t.SendMsgToTgbot(message.Chat.ID, t.I18nBot("tgbot.answers.getInboundsFailed"), tu.ReplyKeyboardRemove())
|
||||||
|
delete(userStates, message.Chat.ID)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
clients, err := t.inboundService.GetClients(inbound)
|
||||||
|
if err != nil {
|
||||||
|
t.SendMsgToTgbot(message.Chat.ID, t.I18nBot("tgbot.answers.getClientsFailed"), tu.ReplyKeyboardRemove())
|
||||||
|
delete(userStates, message.Chat.ID)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
var found *model.Client
|
||||||
|
for _, c := range clients {
|
||||||
|
if c.Email == email {
|
||||||
|
found = &c
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if found == nil {
|
||||||
|
t.SendMsgToTgbot(message.Chat.ID, t.I18nBot("tgbot.answers.broadcastUserNotFound"), tu.ReplyKeyboardRemove())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if found.TgID == 0 {
|
||||||
|
t.SendMsgToTgbot(message.Chat.ID, t.I18nBot("tgbot.answers.broadcastUserNoTgId"), tu.ReplyKeyboardRemove())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
userStates[message.Chat.ID+2000000000] = email
|
||||||
|
userStates[message.Chat.ID] = "awaiting_broadcast_message_user"
|
||||||
|
t.SendMsgToTgbot(message.Chat.ID, t.I18nBot("tgbot.answers.broadcastEnterText"), tu.ForceReply())
|
||||||
|
return
|
||||||
|
case "awaiting_broadcast_message_user":
|
||||||
|
email := userStates[message.Chat.ID+2000000000]
|
||||||
|
inboundIdStr := userStates[message.Chat.ID+1000000000]
|
||||||
|
inboundId, _ := strconv.Atoi(inboundIdStr)
|
||||||
|
inbound, _ := t.inboundService.GetInbound(inboundId)
|
||||||
|
clients, _ := t.inboundService.GetClients(inbound)
|
||||||
|
var found *model.Client
|
||||||
|
for _, c := range clients {
|
||||||
|
if c.Email == email {
|
||||||
|
found = &c
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if found != nil && found.TgID != 0 {
|
||||||
|
t.SendMsgToTgbot(found.TgID, message.Text)
|
||||||
|
msg := t.I18nBot("tgbot.answers.broadcastSentToUser", "Email=="+email)
|
||||||
|
t.SendMsgToTgbot(message.Chat.ID, msg, tu.ReplyKeyboardRemove())
|
||||||
|
} else {
|
||||||
|
t.SendMsgToTgbot(message.Chat.ID, t.I18nBot("tgbot.answers.broadcastUserNoTgId"), tu.ReplyKeyboardRemove())
|
||||||
|
}
|
||||||
|
delete(userStates, message.Chat.ID)
|
||||||
|
delete(userStates, message.Chat.ID+1000000000)
|
||||||
|
delete(userStates, message.Chat.ID+2000000000)
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
@ -1157,8 +1264,6 @@ func (t *Tgbot) answerCallback(callbackQuery *telego.CallbackQuery, isAdmin bool
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.errorOperation"))
|
|
||||||
t.searchClient(chatId, email, callbackQuery.Message.GetMessageID())
|
|
||||||
case "clear_ips":
|
case "clear_ips":
|
||||||
inlineKeyboard := tu.InlineKeyboard(
|
inlineKeyboard := tu.InlineKeyboard(
|
||||||
tu.InlineKeyboardRow(
|
tu.InlineKeyboardRow(
|
||||||
|
@ -1617,6 +1722,113 @@ func (t *Tgbot) answerCallback(callbackQuery *telego.CallbackQuery, isAdmin bool
|
||||||
t.SendMsgToTgbot(chatId, msg, tu.ReplyKeyboardRemove())
|
t.SendMsgToTgbot(chatId, msg, tu.ReplyKeyboardRemove())
|
||||||
|
|
||||||
}
|
}
|
||||||
|
case "message_send":
|
||||||
|
inlineKeyboard := tu.InlineKeyboard(
|
||||||
|
tu.InlineKeyboardRow(
|
||||||
|
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.msgUser")).WithCallbackData(t.encodeQuery("message_send_user")),
|
||||||
|
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.msgAll")).WithCallbackData(t.encodeQuery("message_send_all")),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
msg := t.I18nBot("tgbot.messages.chooseSend")
|
||||||
|
t.SendMsgToTgbot(chatId, msg, inlineKeyboard)
|
||||||
|
case "message_send_all":
|
||||||
|
msg := t.I18nBot("tgbot.messages.enterMessageText")
|
||||||
|
t.SendMsgToTgbot(chatId, msg, tu.ForceReply())
|
||||||
|
userStates[chatId] = "awaiting_broadcast_message"
|
||||||
|
case "message_send_user":
|
||||||
|
inbounds, err := t.inboundService.GetAllInbounds()
|
||||||
|
if err != nil || len(inbounds) == 0 {
|
||||||
|
t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.getInboundsFailed"), tu.ReplyKeyboardRemove())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
var buttons []telego.InlineKeyboardButton
|
||||||
|
for _, inbound := range inbounds {
|
||||||
|
btnText := inbound.Remark
|
||||||
|
callback := t.encodeQuery("broadcast_choose_inbound " + strconv.Itoa(inbound.Id))
|
||||||
|
buttons = append(buttons, tu.InlineKeyboardButton(btnText).WithCallbackData(callback))
|
||||||
|
}
|
||||||
|
keyboard := tu.InlineKeyboardGrid(tu.InlineKeyboardCols(2, buttons...))
|
||||||
|
t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.chooseBroadcastInbound"), keyboard)
|
||||||
|
userStates[chatId] = "awaiting_choose_user"
|
||||||
|
return
|
||||||
|
case "broadcast_choose_inbound":
|
||||||
|
dataArray := strings.Split(callbackQuery.Data, " ")
|
||||||
|
inboundId, _ := strconv.Atoi(dataArray[1])
|
||||||
|
userStates[chatId+1000000000] = strconv.Itoa(inboundId)
|
||||||
|
inbound, err := t.inboundService.GetInbound(inboundId)
|
||||||
|
if err != nil {
|
||||||
|
t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.getInboundsFailed"), tu.ReplyKeyboardRemove())
|
||||||
|
delete(userStates, chatId)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
clients, err := t.inboundService.GetClients(inbound)
|
||||||
|
if err != nil {
|
||||||
|
t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.getClientsFailed"), tu.ReplyKeyboardRemove())
|
||||||
|
delete(userStates, chatId)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
topClients := make([]model.Client, 0, 9)
|
||||||
|
currentTgId := chatId
|
||||||
|
sort.Slice(clients, func(i, j int) bool {
|
||||||
|
return clients[i].TotalGB > clients[j].TotalGB
|
||||||
|
})
|
||||||
|
for _, c := range clients {
|
||||||
|
if len(topClients) >= 9 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
if c.TgID != 0 && c.TgID != currentTgId {
|
||||||
|
topClients = append(topClients, c)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var userButtons []telego.InlineKeyboardButton
|
||||||
|
for _, c := range topClients {
|
||||||
|
userButtons = append(userButtons, tu.InlineKeyboardButton(c.Email).WithCallbackData(t.encodeQuery("broadcast_choose_user "+c.Email)))
|
||||||
|
}
|
||||||
|
userButtons = append(userButtons, tu.InlineKeyboardButton("Ввести email").WithCallbackData(t.encodeQuery("broadcast_enter_email")))
|
||||||
|
keyboardUsers := tu.InlineKeyboardGrid(tu.InlineKeyboardCols(1, userButtons...))
|
||||||
|
t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.chooseBroadcastUser"), keyboardUsers)
|
||||||
|
userStates[chatId] = "awaiting_choose_user"
|
||||||
|
return
|
||||||
|
case "broadcast_choose_user":
|
||||||
|
inboundIdStr := userStates[chatId+1000000000]
|
||||||
|
inboundId, _ := strconv.Atoi(inboundIdStr)
|
||||||
|
inbound, err := t.inboundService.GetInbound(inboundId)
|
||||||
|
dataArray := strings.Split(callbackQuery.Data, " ")
|
||||||
|
if err != nil {
|
||||||
|
t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.getInboundsFailed"), tu.ReplyKeyboardRemove())
|
||||||
|
delete(userStates, chatId)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
email := dataArray[1]
|
||||||
|
clients, err := t.inboundService.GetClients(inbound)
|
||||||
|
if err != nil {
|
||||||
|
t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.getClientsFailed"), tu.ReplyKeyboardRemove())
|
||||||
|
delete(userStates, chatId)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
var found *model.Client
|
||||||
|
for _, c := range clients {
|
||||||
|
if c.Email == email {
|
||||||
|
found = &c
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if found == nil {
|
||||||
|
t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.broadcastUserNotFound"), tu.ReplyKeyboardRemove())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if found.TgID == 0 {
|
||||||
|
t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.broadcastUserNoTgId"), tu.ReplyKeyboardRemove())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
userStates[chatId+2000000000] = email
|
||||||
|
userStates[chatId] = "awaiting_broadcast_message_user"
|
||||||
|
t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.broadcastEnterText"), tu.ForceReply())
|
||||||
|
return
|
||||||
|
case "broadcast_enter_email":
|
||||||
|
userStates[chatId] = "awaiting_choose_user"
|
||||||
|
t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.chooseUser"), tu.ForceReply())
|
||||||
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1799,6 +2011,9 @@ func (t *Tgbot) SendAnswer(chatId int64, msg string, isAdmin bool) {
|
||||||
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.allClients")).WithCallbackData(t.encodeQuery("get_inbounds")),
|
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.allClients")).WithCallbackData(t.encodeQuery("get_inbounds")),
|
||||||
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.addClient")).WithCallbackData(t.encodeQuery("add_client")),
|
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.addClient")).WithCallbackData(t.encodeQuery("add_client")),
|
||||||
),
|
),
|
||||||
|
tu.InlineKeyboardRow(
|
||||||
|
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.msgSend")).WithCallbackData(t.encodeQuery("message_send")),
|
||||||
|
),
|
||||||
// TODOOOOOOOOOOOOOO: Add restart button here.
|
// TODOOOOOOOOOOOOOO: Add restart button here.
|
||||||
)
|
)
|
||||||
numericKeyboardClient := tu.InlineKeyboard(
|
numericKeyboardClient := tu.InlineKeyboard(
|
||||||
|
|
|
@ -260,7 +260,6 @@
|
||||||
"resetInboundClientTrafficSuccess" = "تم إعادة تعيين حركة المرور"
|
"resetInboundClientTrafficSuccess" = "تم إعادة تعيين حركة المرور"
|
||||||
"trafficGetError" = "خطأ في الحصول على حركات المرور"
|
"trafficGetError" = "خطأ في الحصول على حركات المرور"
|
||||||
"getNewX25519CertError" = "حدث خطأ أثناء الحصول على شهادة X25519."
|
"getNewX25519CertError" = "حدث خطأ أثناء الحصول على شهادة X25519."
|
||||||
"getNewmldsa65Error" = "حدث خطاء في الحصول على mldsa65."
|
|
||||||
|
|
||||||
[pages.inbounds.stream.general]
|
[pages.inbounds.stream.general]
|
||||||
"request" = "طلب"
|
"request" = "طلب"
|
||||||
|
@ -699,6 +698,9 @@
|
||||||
"limitTraffic" = "🚧 حد الترافيك"
|
"limitTraffic" = "🚧 حد الترافيك"
|
||||||
"getBanLogs" = "احصل على سجلات الحظر"
|
"getBanLogs" = "احصل على سجلات الحظر"
|
||||||
"allClients" = "كل العملاء"
|
"allClients" = "كل العملاء"
|
||||||
|
"msgSend" = "💬 إرسال الإشعارات"
|
||||||
|
"msgUser" = "👤 للمستخدم"
|
||||||
|
"msgAll" = "👥 لجميع مستخدمي البوت"
|
||||||
|
|
||||||
"addClient" = "إضافة عميل"
|
"addClient" = "إضافة عميل"
|
||||||
"submitDisable" = "إرسال كمعطّل ☑️"
|
"submitDisable" = "إرسال كمعطّل ☑️"
|
||||||
|
@ -734,3 +736,14 @@
|
||||||
"askToAddUserId" = "مافيش إعدادات ليك!\r\nاطلب من الأدمن يضيف الـ Telegram ChatID الخاص بيك في إعداداتك.\r\n\r\nالـ ChatID بتاعك: <code>{{ .TgUserID }}</code>"
|
"askToAddUserId" = "مافيش إعدادات ليك!\r\nاطلب من الأدمن يضيف الـ Telegram ChatID الخاص بيك في إعداداتك.\r\n\r\nالـ ChatID بتاعك: <code>{{ .TgUserID }}</code>"
|
||||||
"chooseClient" = "اختار عميل للإدخال {{ .Inbound }}"
|
"chooseClient" = "اختار عميل للإدخال {{ .Inbound }}"
|
||||||
"chooseInbound" = "اختار الإدخال"
|
"chooseInbound" = "اختار الإدخال"
|
||||||
|
|
||||||
|
"enterText" = "أدخل نص الرسالة المطلوب لإرساله لجميع المستخدمين"
|
||||||
|
"inboundError" = "❌ حدث خطأ أثناء جلب بيانات الإدخال"
|
||||||
|
"clientError" = "❌ حدث خطأ أثناء جلب المستخدمين"
|
||||||
|
"broadcastMessageSent" = "تم إرسال الرسالة إلى {{ .Count }} مستخدمًا"
|
||||||
|
"chooseBroadcastInbound" = "اختر الإدخال للإرسال الجماعي"
|
||||||
|
"chooseBroadcastUser" = "اختر المستخدم للإرسال الجماعي أو أدخل البريد الإلكتروني يدويًا"
|
||||||
|
"broadcastUserNotFound" = "❌ لم يتم العثور على مستخدم بهذا البريد الإلكتروني في الإدخال المحدد."
|
||||||
|
"broadcastUserNoTgId" = "❌ المستخدم لا يحتوي على معرف Telegram، لا يمكن الإرسال الجماعي."
|
||||||
|
"broadcastEnterText" = "أدخل نص الرسالة للمستخدم المحدد"
|
||||||
|
"broadcastSentToUser" = "تم إرسال الرسالة إلى المستخدم: {{ .Email }}"
|
||||||
|
|
|
@ -258,7 +258,7 @@
|
||||||
"resetInboundClientTrafficSuccess" = "Traffic has been reset."
|
"resetInboundClientTrafficSuccess" = "Traffic has been reset."
|
||||||
"trafficGetError" = "Error getting traffics."
|
"trafficGetError" = "Error getting traffics."
|
||||||
"getNewX25519CertError" = "Error while obtaining the X25519 certificate."
|
"getNewX25519CertError" = "Error while obtaining the X25519 certificate."
|
||||||
"getNewmldsa65Error" = "Error while obtaining mldsa65."
|
|
||||||
|
|
||||||
[pages.inbounds.stream.general]
|
[pages.inbounds.stream.general]
|
||||||
"request" = "Request"
|
"request" = "Request"
|
||||||
|
@ -697,6 +697,9 @@
|
||||||
"limitTraffic" = "🚧 Traffic Limit"
|
"limitTraffic" = "🚧 Traffic Limit"
|
||||||
"getBanLogs" = "Get Ban Logs"
|
"getBanLogs" = "Get Ban Logs"
|
||||||
"allClients" = "All Clients"
|
"allClients" = "All Clients"
|
||||||
|
"msgSend" = "💬 Send Notifications"
|
||||||
|
"msgUser" = "👤 To User"
|
||||||
|
"msgAll" = "👥 To All Bot Users"
|
||||||
|
|
||||||
"addClient" = "Add Client"
|
"addClient" = "Add Client"
|
||||||
"submitDisable" = "Submit As Disable ☑️"
|
"submitDisable" = "Submit As Disable ☑️"
|
||||||
|
@ -731,3 +734,14 @@
|
||||||
"askToAddUserId" = "Your configuration is not found!\r\nPlease ask your admin to use your Telegram ChatID in your configuration(s).\r\n\r\nYour ChatID: <code>{{ .TgUserID }}</code>"
|
"askToAddUserId" = "Your configuration is not found!\r\nPlease ask your admin to use your Telegram ChatID in your configuration(s).\r\n\r\nYour ChatID: <code>{{ .TgUserID }}</code>"
|
||||||
"chooseClient" = "Choose a Client for Inbound {{ .Inbound }}"
|
"chooseClient" = "Choose a Client for Inbound {{ .Inbound }}"
|
||||||
"chooseInbound" = "Choose an Inbound"
|
"chooseInbound" = "Choose an Inbound"
|
||||||
|
|
||||||
|
"enterText" = "Enter the desired message text to send to all users"
|
||||||
|
"inboundError" = "❌ Error getting inbounds"
|
||||||
|
"clientError" = "❌ Error getting users"
|
||||||
|
"broadcastMessageSent" = "Message sent to {{ .Count }} users"
|
||||||
|
"chooseBroadcastInbound" = "Choose inbound for broadcast"
|
||||||
|
"chooseBroadcastUser" = "Choose user for broadcast or enter email manually"
|
||||||
|
"broadcastUserNotFound" = "❌ User with this email not found in the selected inbound."
|
||||||
|
"broadcastUserNoTgId" = "❌ User does not have a Telegram ID, broadcast not possible."
|
||||||
|
"broadcastEnterText" = "Enter the message text for the selected user"
|
||||||
|
"broadcastSentToUser" = "Message sent to user: {{ .Email }}"
|
||||||
|
|
|
@ -262,7 +262,6 @@
|
||||||
"resetInboundClientTrafficSuccess" = "El tráfico ha sido reiniciado"
|
"resetInboundClientTrafficSuccess" = "El tráfico ha sido reiniciado"
|
||||||
"trafficGetError" = "Error al obtener los tráficos"
|
"trafficGetError" = "Error al obtener los tráficos"
|
||||||
"getNewX25519CertError" = "Error al obtener el certificado X25519."
|
"getNewX25519CertError" = "Error al obtener el certificado X25519."
|
||||||
"getNewmldsa65Error" = "Error al obtener el certificado mldsa65."
|
|
||||||
|
|
||||||
[pages.inbounds.stream.general]
|
[pages.inbounds.stream.general]
|
||||||
"request" = "Pedido"
|
"request" = "Pedido"
|
||||||
|
@ -701,6 +700,9 @@
|
||||||
"limitTraffic" = "🚧 Límite de tráfico"
|
"limitTraffic" = "🚧 Límite de tráfico"
|
||||||
"getBanLogs" = "Registros de prohibición"
|
"getBanLogs" = "Registros de prohibición"
|
||||||
"allClients" = "Todos los Clientes"
|
"allClients" = "Todos los Clientes"
|
||||||
|
"msgSend" = "💬 Enviar notificaciones"
|
||||||
|
"msgUser" = "👤 A usuario"
|
||||||
|
"msgAll" = "👥 A todos los usuarios del bot"
|
||||||
|
|
||||||
"addClient" = "Añadir cliente"
|
"addClient" = "Añadir cliente"
|
||||||
"submitDisable" = "Enviar como deshabilitado ☑️"
|
"submitDisable" = "Enviar como deshabilitado ☑️"
|
||||||
|
@ -736,3 +738,14 @@
|
||||||
"askToAddUserId" = "¡No se encuentra su configuración!\r\nPor favor, pídale a su administrador que use su ChatID de usuario de Telegram en su(s) configuración(es).\r\n\r\nSu ChatID de usuario: <code>{{ .TgUserID }}</code>"
|
"askToAddUserId" = "¡No se encuentra su configuración!\r\nPor favor, pídale a su administrador que use su ChatID de usuario de Telegram en su(s) configuración(es).\r\n\r\nSu ChatID de usuario: <code>{{ .TgUserID }}</code>"
|
||||||
"chooseClient" = "Elige un Cliente para Inbound {{ .Inbound }}"
|
"chooseClient" = "Elige un Cliente para Inbound {{ .Inbound }}"
|
||||||
"chooseInbound" = "Elige un Inbound"
|
"chooseInbound" = "Elige un Inbound"
|
||||||
|
|
||||||
|
"enterText" = "Introduce el texto del mensaje que deseas enviar a todos los usuarios"
|
||||||
|
"inboundError" = "❌ Error al obtener los inbounds"
|
||||||
|
"clientError" = "❌ Error al obtener los usuarios"
|
||||||
|
"broadcastMessageSent" = "Mensaje enviado a {{ .Count }} usuarios"
|
||||||
|
"chooseBroadcastInbound" = "Elige el inbound para el broadcast"
|
||||||
|
"chooseBroadcastUser" = "Elige el usuario para el broadcast o introduce el correo electrónico manualmente"
|
||||||
|
"broadcastUserNotFound" = "❌ No se encontró un usuario con este correo electrónico en el inbound seleccionado."
|
||||||
|
"broadcastUserNoTgId" = "❌ El usuario no tiene Telegram ID, no es posible el broadcast."
|
||||||
|
"broadcastEnterText" = "Introduce el texto del mensaje para el usuario seleccionado"
|
||||||
|
"broadcastSentToUser" = "Mensaje enviado al usuario: {{ .Email }}"
|
||||||
|
|
|
@ -262,7 +262,6 @@
|
||||||
"resetInboundClientTrafficSuccess" = "ترافیک بازنشانی شد"
|
"resetInboundClientTrafficSuccess" = "ترافیک بازنشانی شد"
|
||||||
"trafficGetError" = "خطا در دریافت ترافیکها"
|
"trafficGetError" = "خطا در دریافت ترافیکها"
|
||||||
"getNewX25519CertError" = "خطا در دریافت گواهی X25519."
|
"getNewX25519CertError" = "خطا در دریافت گواهی X25519."
|
||||||
"getNewmldsa65Error" = "خطا در دریافت گواهی mldsa65."
|
|
||||||
|
|
||||||
[pages.inbounds.stream.general]
|
[pages.inbounds.stream.general]
|
||||||
"request" = "درخواست"
|
"request" = "درخواست"
|
||||||
|
@ -701,6 +700,9 @@
|
||||||
"limitTraffic" = "🚧 محدودیت ترافیک"
|
"limitTraffic" = "🚧 محدودیت ترافیک"
|
||||||
"getBanLogs" = "گزارش های بلوک را دریافت کنید"
|
"getBanLogs" = "گزارش های بلوک را دریافت کنید"
|
||||||
"allClients" = "همه مشتریان"
|
"allClients" = "همه مشتریان"
|
||||||
|
"msgSend" = "💬 ارسال اعلانها"
|
||||||
|
"msgUser" = "👤 به کاربر"
|
||||||
|
"msgAll" = "👥 به همه کاربران ربات"
|
||||||
|
|
||||||
"addClient" = "افزودن مشتری"
|
"addClient" = "افزودن مشتری"
|
||||||
"submitDisable" = "ارسال به عنوان غیرفعال ☑️"
|
"submitDisable" = "ارسال به عنوان غیرفعال ☑️"
|
||||||
|
@ -736,3 +738,14 @@
|
||||||
"askToAddUserId" = "پیکربندی شما یافت نشد!\r\nلطفاً از مدیر خود بخواهید که شناسه کاربر تلگرام خود را در پیکربندی (های) خود استفاده کند.\r\n\r\nشناسه کاربری شما: <code>{{ .TgUserID }}</code>"
|
"askToAddUserId" = "پیکربندی شما یافت نشد!\r\nلطفاً از مدیر خود بخواهید که شناسه کاربر تلگرام خود را در پیکربندی (های) خود استفاده کند.\r\n\r\nشناسه کاربری شما: <code>{{ .TgUserID }}</code>"
|
||||||
"chooseClient" = "یک مشتری برای ورودی {{ .Inbound }} انتخاب کنید"
|
"chooseClient" = "یک مشتری برای ورودی {{ .Inbound }} انتخاب کنید"
|
||||||
"chooseInbound" = "یک ورودی انتخاب کنید"
|
"chooseInbound" = "یک ورودی انتخاب کنید"
|
||||||
|
|
||||||
|
"enterText" = "متن پیام مورد نظر برای ارسال به همه کاربران را وارد کنید"
|
||||||
|
"inboundError" = "❌ خطا در دریافت ورودیها"
|
||||||
|
"clientError" = "❌ خطا در دریافت کاربران"
|
||||||
|
"broadcastMessageSent" = "پیام به {{ .Count }} کاربر ارسال شد"
|
||||||
|
"chooseBroadcastInbound" = "ورودی را برای ارسال انتخاب کنید"
|
||||||
|
"chooseBroadcastUser" = "کاربر را برای ارسال انتخاب کنید یا ایمیل را به صورت دستی وارد کنید"
|
||||||
|
"broadcastUserNotFound" = "❌ کاربری با این ایمیل در ورودی انتخاب شده یافت نشد."
|
||||||
|
"broadcastUserNoTgId" = "❌ کاربر Telegram ID ندارد، ارسال پیام ممکن نیست."
|
||||||
|
"broadcastEnterText" = "متن پیام برای کاربر انتخاب شده را وارد کنید"
|
||||||
|
"broadcastSentToUser" = "پیام به کاربر ارسال شد: {{ .Email }}"
|
||||||
|
|
|
@ -262,7 +262,6 @@
|
||||||
"resetInboundClientTrafficSuccess" = "Lalu lintas telah direset"
|
"resetInboundClientTrafficSuccess" = "Lalu lintas telah direset"
|
||||||
"trafficGetError" = "Gagal mendapatkan data lalu lintas"
|
"trafficGetError" = "Gagal mendapatkan data lalu lintas"
|
||||||
"getNewX25519CertError" = "Terjadi kesalahan saat mendapatkan sertifikat X25519."
|
"getNewX25519CertError" = "Terjadi kesalahan saat mendapatkan sertifikat X25519."
|
||||||
"getNewmldsa65Error" = "Terjadi kesalahan saat mendapatkan sertifikat mldsa65."
|
|
||||||
|
|
||||||
[pages.inbounds.stream.general]
|
[pages.inbounds.stream.general]
|
||||||
"request" = "Permintaan"
|
"request" = "Permintaan"
|
||||||
|
@ -702,6 +701,9 @@
|
||||||
"limitTraffic" = "🚧 Batas Lalu Lintas"
|
"limitTraffic" = "🚧 Batas Lalu Lintas"
|
||||||
"getBanLogs" = "Dapatkan Log Pemblokiran"
|
"getBanLogs" = "Dapatkan Log Pemblokiran"
|
||||||
"allClients" = "Semua Klien"
|
"allClients" = "Semua Klien"
|
||||||
|
"msgSend" = "💬 Kirim Notifikasi"
|
||||||
|
"msgUser" = "👤 Ke Pengguna"
|
||||||
|
"msgAll" = "👥 Ke Semua Pengguna Bot"
|
||||||
|
|
||||||
"addClient" = "Tambah Klien"
|
"addClient" = "Tambah Klien"
|
||||||
"submitDisable" = "Kirim Sebagai Nonaktif ☑️"
|
"submitDisable" = "Kirim Sebagai Nonaktif ☑️"
|
||||||
|
@ -737,3 +739,14 @@
|
||||||
"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>"
|
"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 }}"
|
"chooseClient" = "Pilih Klien untuk Inbound {{ .Inbound }}"
|
||||||
"chooseInbound" = "Pilih Inbound"
|
"chooseInbound" = "Pilih Inbound"
|
||||||
|
|
||||||
|
"enterText" = "Masukkan teks pesan yang diinginkan untuk dikirim ke semua pengguna"
|
||||||
|
"inboundError" = "❌ Terjadi kesalahan saat mengambil data inbound"
|
||||||
|
"clientError" = "❌ Terjadi kesalahan saat mengambil pengguna"
|
||||||
|
"broadcastMessageSent" = "Pesan telah dikirim ke {{ .Count }} pengguna"
|
||||||
|
"chooseBroadcastInbound" = "Pilih inbound untuk siaran"
|
||||||
|
"chooseBroadcastUser" = "Pilih pengguna untuk siaran atau masukkan email secara manual"
|
||||||
|
"broadcastUserNotFound" = "❌ Pengguna dengan email ini tidak ditemukan di inbound yang dipilih."
|
||||||
|
"broadcastUserNoTgId" = "❌ Pengguna tidak memiliki Telegram ID, siaran tidak dapat dilakukan."
|
||||||
|
"broadcastEnterText" = "Masukkan teks pesan untuk pengguna yang dipilih"
|
||||||
|
"broadcastSentToUser" = "Pesan telah dikirim ke pengguna: {{ .Email }}"
|
||||||
|
|
|
@ -262,7 +262,6 @@
|
||||||
"resetInboundClientTrafficSuccess" = "トラフィックがリセットされました"
|
"resetInboundClientTrafficSuccess" = "トラフィックがリセットされました"
|
||||||
"trafficGetError" = "トラフィックの取得中にエラーが発生しました"
|
"trafficGetError" = "トラフィックの取得中にエラーが発生しました"
|
||||||
"getNewX25519CertError" = "X25519証明書の取得中にエラーが発生しました。"
|
"getNewX25519CertError" = "X25519証明書の取得中にエラーが発生しました。"
|
||||||
"getNewmldsa65Error" = "mldsa65証明書の取得中にエラーが発生しました。"
|
|
||||||
|
|
||||||
[pages.inbounds.stream.general]
|
[pages.inbounds.stream.general]
|
||||||
"request" = "リクエスト"
|
"request" = "リクエスト"
|
||||||
|
@ -701,6 +700,9 @@
|
||||||
"limitTraffic" = "🚧 トラフィック制限"
|
"limitTraffic" = "🚧 トラフィック制限"
|
||||||
"getBanLogs" = "禁止ログ"
|
"getBanLogs" = "禁止ログ"
|
||||||
"allClients" = "すべてのクライアント"
|
"allClients" = "すべてのクライアント"
|
||||||
|
"msgSend" = "💬 通知を送信"
|
||||||
|
"msgUser" = "👤 ユーザーへ"
|
||||||
|
"msgAll" = "👥 すべてのボットユーザーへ"
|
||||||
|
|
||||||
"addClient" = "クライアントを追加"
|
"addClient" = "クライアントを追加"
|
||||||
"submitDisable" = "無効として送信 ☑️"
|
"submitDisable" = "無効として送信 ☑️"
|
||||||
|
@ -736,3 +738,14 @@
|
||||||
"askToAddUserId" = "設定が見つかりませんでした!\r\n管理者に問い合わせて、設定にTelegramユーザーのChatIDを使用してください。\r\n\r\nあなたのユーザーChatID:<code>{{ .TgUserID }}</code>"
|
"askToAddUserId" = "設定が見つかりませんでした!\r\n管理者に問い合わせて、設定にTelegramユーザーのChatIDを使用してください。\r\n\r\nあなたのユーザーChatID:<code>{{ .TgUserID }}</code>"
|
||||||
"chooseClient" = "インバウンド {{ .Inbound }} のクライアントを選択"
|
"chooseClient" = "インバウンド {{ .Inbound }} のクライアントを選択"
|
||||||
"chooseInbound" = "インバウンドを選択"
|
"chooseInbound" = "インバウンドを選択"
|
||||||
|
|
||||||
|
"enterText" = "すべてのユーザーに送信するメッセージのテキストを入力してください"
|
||||||
|
"inboundError" = "❌ インバウンドの取得中にエラーが発生しました"
|
||||||
|
"clientError" = "❌ ユーザーの取得中にエラーが発生しました"
|
||||||
|
"broadcastMessageSent" = "メッセージは{{ .Count }}人のユーザーに送信されました"
|
||||||
|
"chooseBroadcastInbound" = "ブロードキャスト用のインバウンドを選択"
|
||||||
|
"chooseBroadcastUser" = "ブロードキャスト用のユーザーを選択するか、メールアドレスを手動で入力してください"
|
||||||
|
"broadcastUserNotFound" = "❌ 選択したインバウンドにこのメールアドレスのユーザーが見つかりません。"
|
||||||
|
"broadcastUserNoTgId" = "❌ ユーザーにTelegram IDが設定されていないため、ブロードキャストできません。"
|
||||||
|
"broadcastEnterText" = "選択したユーザーに送信するメッセージのテキストを入力してください"
|
||||||
|
"broadcastSentToUser" = "メッセージはユーザーに送信されました: {{ .Email }}"
|
||||||
|
|
|
@ -262,7 +262,6 @@
|
||||||
"resetInboundClientTrafficSuccess" = "O tráfego foi reiniciado"
|
"resetInboundClientTrafficSuccess" = "O tráfego foi reiniciado"
|
||||||
"trafficGetError" = "Erro ao obter tráfegos"
|
"trafficGetError" = "Erro ao obter tráfegos"
|
||||||
"getNewX25519CertError" = "Erro ao obter o certificado X25519."
|
"getNewX25519CertError" = "Erro ao obter o certificado X25519."
|
||||||
"getNewmldsa65Error" = "Erro ao obter o certificado mldsa65."
|
|
||||||
|
|
||||||
[pages.inbounds.stream.general]
|
[pages.inbounds.stream.general]
|
||||||
"request" = "Requisição"
|
"request" = "Requisição"
|
||||||
|
@ -701,6 +700,9 @@
|
||||||
"limitTraffic" = "🚧 Limite de tráfego"
|
"limitTraffic" = "🚧 Limite de tráfego"
|
||||||
"getBanLogs" = "Obter logs de banimento"
|
"getBanLogs" = "Obter logs de banimento"
|
||||||
"allClients" = "Todos os clientes"
|
"allClients" = "Todos os clientes"
|
||||||
|
"msgSend" = "💬 Enviar Notificações"
|
||||||
|
"msgUser" = "👤 Para Usuário"
|
||||||
|
"msgAll" = "👥 Para Todos os Usuários do Bot"
|
||||||
|
|
||||||
"addClient" = "Adicionar Cliente"
|
"addClient" = "Adicionar Cliente"
|
||||||
"submitDisable" = "Enviar como Desativado ☑️"
|
"submitDisable" = "Enviar como Desativado ☑️"
|
||||||
|
@ -736,3 +738,14 @@
|
||||||
"askToAddUserId" = "Sua configuração não foi encontrada!\r\nPeça ao seu administrador para usar seu Telegram ChatID em suas configurações.\r\n\r\nSeu ChatID: <code>{{ .TgUserID }}</code>"
|
"askToAddUserId" = "Sua configuração não foi encontrada!\r\nPeça ao seu administrador para usar seu Telegram ChatID em suas configurações.\r\n\r\nSeu ChatID: <code>{{ .TgUserID }}</code>"
|
||||||
"chooseClient" = "Escolha um cliente para Inbound {{ .Inbound }}"
|
"chooseClient" = "Escolha um cliente para Inbound {{ .Inbound }}"
|
||||||
"chooseInbound" = "Escolha um Inbound"
|
"chooseInbound" = "Escolha um Inbound"
|
||||||
|
|
||||||
|
"enterText" = "Digite o texto da mensagem desejada para enviar a todos os usuários"
|
||||||
|
"inboundError" = "❌ Erro ao obter inbounds"
|
||||||
|
"clientError" = "❌ Erro ao obter usuários"
|
||||||
|
"broadcastMessageSent" = "Mensagem enviada para {{ .Count }} usuários"
|
||||||
|
"chooseBroadcastInbound" = "Escolha o inbound para broadcast"
|
||||||
|
"chooseBroadcastUser" = "Escolha o usuário para broadcast ou insira o e-mail manualmente"
|
||||||
|
"broadcastUserNotFound" = "❌ Usuário com este e-mail não encontrado no inbound selecionado."
|
||||||
|
"broadcastUserNoTgId" = "❌ O usuário não possui Telegram ID, broadcast não é possível."
|
||||||
|
"broadcastEnterText" = "Digite o texto da mensagem para o usuário selecionado"
|
||||||
|
"broadcastSentToUser" = "Mensagem enviada para o usuário: {{ .Email }}"
|
||||||
|
|
|
@ -262,7 +262,6 @@
|
||||||
"resetInboundClientTrafficSuccess" = "Трафик сброшен"
|
"resetInboundClientTrafficSuccess" = "Трафик сброшен"
|
||||||
"trafficGetError" = "Ошибка получения данных о трафике"
|
"trafficGetError" = "Ошибка получения данных о трафике"
|
||||||
"getNewX25519CertError" = "Ошибка при получении сертификата X25519."
|
"getNewX25519CertError" = "Ошибка при получении сертификата X25519."
|
||||||
"getNewmldsa65Error" = "Ошибка при получении сертификата mldsa65."
|
|
||||||
|
|
||||||
[pages.inbounds.stream.general]
|
[pages.inbounds.stream.general]
|
||||||
"request" = "Запрос"
|
"request" = "Запрос"
|
||||||
|
@ -701,6 +700,9 @@
|
||||||
"limitTraffic" = "🚧 Лимит трафика"
|
"limitTraffic" = "🚧 Лимит трафика"
|
||||||
"getBanLogs" = "📄 Лог банов"
|
"getBanLogs" = "📄 Лог банов"
|
||||||
"allClients" = "👥 Все клиенты"
|
"allClients" = "👥 Все клиенты"
|
||||||
|
"msgSend" = "💬 Отправка уведомлений"
|
||||||
|
"msgUser" = "👤 Пользователю"
|
||||||
|
"msgAll" = "👥 Всем пользовтелям бота"
|
||||||
|
|
||||||
"addClient" = "➕ Новый клиент"
|
"addClient" = "➕ Новый клиент"
|
||||||
"submitDisable" = "Добавить отключенным ☑️"
|
"submitDisable" = "Добавить отключенным ☑️"
|
||||||
|
@ -709,7 +711,7 @@
|
||||||
"change_id" = "⚙️🔑 ID"
|
"change_id" = "⚙️🔑 ID"
|
||||||
"change_password" = "⚙️🔑 Пароль"
|
"change_password" = "⚙️🔑 Пароль"
|
||||||
"change_email" = "⚙️📧 Email"
|
"change_email" = "⚙️📧 Email"
|
||||||
"change_comment" = "⚙️💬 Комментарий"
|
"change_comment" = "⚙️💬 Комментарий"
|
||||||
"ResetAllTraffics" = "Сбросить весь трафик"
|
"ResetAllTraffics" = "Сбросить весь трафик"
|
||||||
"SortedTrafficUsageReport" = "Отсортированный отчет об использовании трафика"
|
"SortedTrafficUsageReport" = "Отсортированный отчет об использовании трафика"
|
||||||
|
|
||||||
|
@ -736,3 +738,15 @@
|
||||||
"askToAddUserId" = "❌ Ваша конфигурация не найдена!\r\n💭 Пожалуйста, попросите администратора использовать ваш Telegram User ID в конфигурации.\r\n\r\n🆔 Ваш User ID: <code>{{ .TgUserID }}</code>"
|
"askToAddUserId" = "❌ Ваша конфигурация не найдена!\r\n💭 Пожалуйста, попросите администратора использовать ваш Telegram User ID в конфигурации.\r\n\r\n🆔 Ваш User ID: <code>{{ .TgUserID }}</code>"
|
||||||
"chooseClient" = "Выберите клиента для инбаунда {{ .Inbound }}"
|
"chooseClient" = "Выберите клиента для инбаунда {{ .Inbound }}"
|
||||||
"chooseInbound" = "Выберите инбаунд"
|
"chooseInbound" = "Выберите инбаунд"
|
||||||
|
"chooseSend" = "Выберите способ отправки уведомления"
|
||||||
|
"chooseUser" = "Выберите пользователя или отправьте его email"
|
||||||
|
"enterText" = "Введите желаемый текст сообщения для отправки всем пользователям"
|
||||||
|
"inboundError" = "❌ Ошибка получения инбаундов"
|
||||||
|
"clientError" = "❌ Ошибка получения пользователей"
|
||||||
|
"broadcastMessageSent" = "Сообщение отправлено {{ .Count }} пользователям"
|
||||||
|
"chooseBroadcastInbound" = "Выберите инбаунд для рассылки"
|
||||||
|
"chooseBroadcastUser" = "Выберите пользователя для рассылки или введите email вручную"
|
||||||
|
"broadcastUserNotFound" = "❌ Пользователь с таким email не найден в выбранном инбаунде."
|
||||||
|
"broadcastUserNoTgId" = " ❌ У пользователя не указан Telegram ID, рассылка невозможна."
|
||||||
|
"broadcastEnterText" = "Введите текст сообщения для выбранного пользователя"
|
||||||
|
"broadcastSentToUser" = "Сообщение отправлено пользователю: {{ .Email }}"
|
|
@ -262,7 +262,6 @@
|
||||||
"resetInboundClientTrafficSuccess" = "Trafik sıfırlandı"
|
"resetInboundClientTrafficSuccess" = "Trafik sıfırlandı"
|
||||||
"trafficGetError" = "Trafik bilgisi alınırken hata oluştu"
|
"trafficGetError" = "Trafik bilgisi alınırken hata oluştu"
|
||||||
"getNewX25519CertError" = "X25519 sertifikası alınırken hata oluştu."
|
"getNewX25519CertError" = "X25519 sertifikası alınırken hata oluştu."
|
||||||
"getNewmldsa65Error" = "mldsa65 sertifikası alınırken hata oluştu."
|
|
||||||
|
|
||||||
[pages.inbounds.stream.general]
|
[pages.inbounds.stream.general]
|
||||||
"request" = "İstek"
|
"request" = "İstek"
|
||||||
|
@ -701,6 +700,9 @@
|
||||||
"limitTraffic" = "🚧 Trafik Sınırı"
|
"limitTraffic" = "🚧 Trafik Sınırı"
|
||||||
"getBanLogs" = "Yasak Günlüklerini Al"
|
"getBanLogs" = "Yasak Günlüklerini Al"
|
||||||
"allClients" = "Tüm Müşteriler"
|
"allClients" = "Tüm Müşteriler"
|
||||||
|
"msgSend" = "💬 Bildirimleri Gönder"
|
||||||
|
"msgUser" = "👤 Kullanıcıya"
|
||||||
|
"msgAll" = "👥 Tüm Bot Kullanıcılarına"
|
||||||
|
|
||||||
"addClient" = "Müşteri Ekle"
|
"addClient" = "Müşteri Ekle"
|
||||||
"submitDisable" = "Devre Dışı Olarak Gönder ☑️"
|
"submitDisable" = "Devre Dışı Olarak Gönder ☑️"
|
||||||
|
@ -736,3 +738,14 @@
|
||||||
"askToAddUserId" = "Yapılandırmanız bulunamadı!\r\nLütfen yöneticinizden yapılandırmalarınıza Telegram ChatID'nizi eklemesini isteyin.\r\n\r\nKullanıcı ChatID'niz: <code>{{ .TgUserID }}</code>"
|
"askToAddUserId" = "Yapılandırmanız bulunamadı!\r\nLütfen yöneticinizden yapılandırmalarınıza Telegram ChatID'nizi eklemesini isteyin.\r\n\r\nKullanıcı ChatID'niz: <code>{{ .TgUserID }}</code>"
|
||||||
"chooseClient" = "Gelen {{ .Inbound }} için bir Müşteri Seçin"
|
"chooseClient" = "Gelen {{ .Inbound }} için bir Müşteri Seçin"
|
||||||
"chooseInbound" = "Bir Gelen Seçin"
|
"chooseInbound" = "Bir Gelen Seçin"
|
||||||
|
|
||||||
|
"enterText" = "Tüm kullanıcılara göndermek için istenen mesaj metnini girin"
|
||||||
|
"inboundError" = "❌ Girişler alınırken hata oluştu"
|
||||||
|
"clientError" = "❌ Kullanıcılar alınırken hata oluştu"
|
||||||
|
"broadcastMessageSent" = "Mesaj {{ .Count }} kullanıcıya gönderildi"
|
||||||
|
"chooseBroadcastInbound" = "Yayın için giriş seçin"
|
||||||
|
"chooseBroadcastUser" = "Yayın için kullanıcı seçin veya e-postayı manuel girin"
|
||||||
|
"broadcastUserNotFound" = "❌ Seçilen girişte bu e-postaya sahip kullanıcı bulunamadı."
|
||||||
|
"broadcastUserNoTgId" = "❌ Kullanıcının Telegram ID'si yok, yayın yapılamaz."
|
||||||
|
"broadcastEnterText" = "Seçilen kullanıcı için mesaj metnini girin"
|
||||||
|
"broadcastSentToUser" = "Mesaj kullanıcıya gönderildi: {{ .Email }}"
|
||||||
|
|
|
@ -91,7 +91,7 @@
|
||||||
"invalidFormData" = "Формат вхідних даних недійсний."
|
"invalidFormData" = "Формат вхідних даних недійсний."
|
||||||
"emptyUsername" = "Потрібне ім'я користувача"
|
"emptyUsername" = "Потрібне ім'я користувача"
|
||||||
"emptyPassword" = "Потрібен пароль"
|
"emptyPassword" = "Потрібен пароль"
|
||||||
"wrongUsernameOrPassword" = "Невірне ім’я користувача, пароль або код двофакторної аутентифікації."
|
"wrongUsernameOrPassword" = "Невірне ім'я користувача, пароль або код двофакторної аутентифікації."
|
||||||
"successLogin" = "Ви успішно увійшли до свого облікового запису."
|
"successLogin" = "Ви успішно увійшли до свого облікового запису."
|
||||||
|
|
||||||
[pages.index]
|
[pages.index]
|
||||||
|
@ -262,7 +262,6 @@
|
||||||
"resetInboundClientTrafficSuccess" = "Трафік скинуто"
|
"resetInboundClientTrafficSuccess" = "Трафік скинуто"
|
||||||
"trafficGetError" = "Помилка отримання даних про трафік"
|
"trafficGetError" = "Помилка отримання даних про трафік"
|
||||||
"getNewX25519CertError" = "Помилка при отриманні сертифіката X25519."
|
"getNewX25519CertError" = "Помилка при отриманні сертифіката X25519."
|
||||||
"getNewmldsa65Error" = "Помилка при отриманні сертифіката mldsa65."
|
|
||||||
|
|
||||||
[pages.inbounds.stream.general]
|
[pages.inbounds.stream.general]
|
||||||
"request" = "Запит"
|
"request" = "Запит"
|
||||||
|
@ -298,11 +297,11 @@
|
||||||
"panelPort" = "Порт прослуховування"
|
"panelPort" = "Порт прослуховування"
|
||||||
"panelPortDesc" = "Номер порту для веб-панелі. (має бути невикористаний порт)"
|
"panelPortDesc" = "Номер порту для веб-панелі. (має бути невикористаний порт)"
|
||||||
"publicKeyPath" = "Шлях відкритого ключа"
|
"publicKeyPath" = "Шлях відкритого ключа"
|
||||||
"publicKeyPathDesc" = "Шлях до файлу відкритого ключа для веб-панелі. (починається з ‘/‘)"
|
"publicKeyPathDesc" = "Шлях до файлу відкритого ключа для веб-панелі. (починається з '//')"
|
||||||
"privateKeyPath" = "Шлях приватного ключа"
|
"privateKeyPath" = "Шлях приватного ключа"
|
||||||
"privateKeyPathDesc" = "Шлях до файлу приватного ключа для веб-панелі. (починається з ‘/‘)"
|
"privateKeyPathDesc" = "Шлях до файлу приватного ключа для веб-панелі. (починається з '//')"
|
||||||
"panelUrlPath" = "Шлях URL"
|
"panelUrlPath" = "Шлях URL"
|
||||||
"panelUrlPathDesc" = "Шлях URL для веб-панелі. (починається з ‘/‘ і закінчується ‘/‘)"
|
"panelUrlPathDesc" = "Шлях URL для веб-панелі. (починається з '//' і закінчується '//')"
|
||||||
"pageSize" = "Розмір сторінки"
|
"pageSize" = "Розмір сторінки"
|
||||||
"pageSizeDesc" = "Визначити розмір сторінки для вхідної таблиці. (0 = вимкнено)"
|
"pageSizeDesc" = "Визначити розмір сторінки для вхідної таблиці. (0 = вимкнено)"
|
||||||
"remarkModel" = "Модель зауваження та роздільний символ"
|
"remarkModel" = "Модель зауваження та роздільний символ"
|
||||||
|
@ -350,11 +349,11 @@
|
||||||
"subPort" = "Слухати порт"
|
"subPort" = "Слухати порт"
|
||||||
"subPortDesc" = "Номер порту для служби підписки. (має бути невикористаний порт)"
|
"subPortDesc" = "Номер порту для служби підписки. (має бути невикористаний порт)"
|
||||||
"subCertPath" = "Шлях відкритого ключа"
|
"subCertPath" = "Шлях відкритого ключа"
|
||||||
"subCertPathDesc" = "Шлях до файлу відкритого ключа для служби підписки. (починається з ‘/‘)"
|
"subCertPathDesc" = "Шлях до файлу відкритого ключа для служби підписки. (починається з '//')"
|
||||||
"subKeyPath" = "Шлях приватного ключа"
|
"subKeyPath" = "Шлях приватного ключа"
|
||||||
"subKeyPathDesc" = "Шлях до файлу приватного ключа для служби підписки. (починається з ‘/‘)"
|
"subKeyPathDesc" = "Шлях до файлу приватного ключа для служби підписки. (починається з '//')"
|
||||||
"subPath" = "Шлях URI"
|
"subPath" = "Шлях URI"
|
||||||
"subPathDesc" = "Шлях URI для служби підписки. (починається з ‘/‘ і закінчується ‘/‘)"
|
"subPathDesc" = "Шлях URI для служби підписки. (починається з '//' і закінчується '//')"
|
||||||
"subDomain" = "Домен прослуховування"
|
"subDomain" = "Домен прослуховування"
|
||||||
"subDomainDesc" = "Ім'я домену для служби підписки. (залиште порожнім, щоб слухати всі домени та IP-адреси)"
|
"subDomainDesc" = "Ім'я домену для служби підписки. (залиште порожнім, щоб слухати всі домени та IP-адреси)"
|
||||||
"subUpdates" = "Інтервали оновлення"
|
"subUpdates" = "Інтервали оновлення"
|
||||||
|
@ -378,7 +377,7 @@
|
||||||
"muxDesc" = "Передавати кілька незалежних потоків даних у межах встановленого потоку даних."
|
"muxDesc" = "Передавати кілька незалежних потоків даних у межах встановленого потоку даних."
|
||||||
"muxSett" = "Налаштування Mux"
|
"muxSett" = "Налаштування Mux"
|
||||||
"direct" = "Пряме підключення"
|
"direct" = "Пряме підключення"
|
||||||
"directDesc" = "Безпосередньо встановлює з’єднання з доменами або діапазонами IP певної країни."
|
"directDesc" = "Безпосередньо встановлює з'єднання з доменами або діапазонами IP певної країни."
|
||||||
"notifications" = "Сповіщення"
|
"notifications" = "Сповіщення"
|
||||||
"certs" = "Сертифікати"
|
"certs" = "Сертифікати"
|
||||||
"externalTraffic" = "Зовнішній трафік"
|
"externalTraffic" = "Зовнішній трафік"
|
||||||
|
@ -701,6 +700,9 @@
|
||||||
"limitTraffic" = "🚧 Ліміт трафіку"
|
"limitTraffic" = "🚧 Ліміт трафіку"
|
||||||
"getBanLogs" = "Отримати журнали заборон"
|
"getBanLogs" = "Отримати журнали заборон"
|
||||||
"allClients" = "Всі Клієнти"
|
"allClients" = "Всі Клієнти"
|
||||||
|
"msgSend" = "💬 Надіслати сповіщення"
|
||||||
|
"msgUser" = "👤 Користувачу"
|
||||||
|
"msgAll" = "👥 Усім користувачам бота"
|
||||||
|
|
||||||
"addClient" = "Додати клієнта"
|
"addClient" = "Додати клієнта"
|
||||||
"submitDisable" = "Надіслати як вимкнено ☑️"
|
"submitDisable" = "Надіслати як вимкнено ☑️"
|
||||||
|
@ -736,3 +738,14 @@
|
||||||
"askToAddUserId" = "Вашу конфігурацію не знайдено!\r\nБудь ласка, попросіть свого адміністратора використовувати ваш ідентифікатор Telegram у вашій конфігурації.\r\n\r\nВаш ідентифікатор користувача: <code>{{ .TgUserID }}</code>"
|
"askToAddUserId" = "Вашу конфігурацію не знайдено!\r\nБудь ласка, попросіть свого адміністратора використовувати ваш ідентифікатор Telegram у вашій конфігурації.\r\n\r\nВаш ідентифікатор користувача: <code>{{ .TgUserID }}</code>"
|
||||||
"chooseClient" = "Виберіть клієнта для Вхідного {{ .Inbound }}"
|
"chooseClient" = "Виберіть клієнта для Вхідного {{ .Inbound }}"
|
||||||
"chooseInbound" = "Виберіть Вхідний"
|
"chooseInbound" = "Виберіть Вхідний"
|
||||||
|
|
||||||
|
"enterText" = "Введіть бажаний текст повідомлення для надсилання всім користувачам"
|
||||||
|
"inboundError" = "❌ Помилка отримання вхідних"
|
||||||
|
"clientError" = "❌ Помилка отримання користувачів"
|
||||||
|
"broadcastMessageSent" = "Повідомлення надіслано {{ .Count }} користувачам"
|
||||||
|
"chooseBroadcastInbound" = "Оберіть вхідний для розсилки"
|
||||||
|
"chooseBroadcastUser" = "Оберіть користувача для розсилки або введіть email вручну"
|
||||||
|
"broadcastUserNotFound" = "❌ Користувача з таким email не знайдено у вибраному вхідному."
|
||||||
|
"broadcastUserNoTgId" = "❌ У користувача не вказано Telegram ID, розсилка неможлива."
|
||||||
|
"broadcastEnterText" = "Введіть текст повідомлення для вибраного користувача"
|
||||||
|
"broadcastSentToUser" = "Повідомлення надіслано користувачу: {{ .Email }}"
|
||||||
|
|
|
@ -262,7 +262,6 @@
|
||||||
"resetInboundClientTrafficSuccess" = "Đã đặt lại lưu lượng"
|
"resetInboundClientTrafficSuccess" = "Đã đặt lại lưu lượng"
|
||||||
"trafficGetError" = "Lỗi khi lấy thông tin lưu lượng"
|
"trafficGetError" = "Lỗi khi lấy thông tin lưu lượng"
|
||||||
"getNewX25519CertError" = "Lỗi khi lấy chứng chỉ X25519."
|
"getNewX25519CertError" = "Lỗi khi lấy chứng chỉ X25519."
|
||||||
"getNewmldsa65Error" = "Lỗi khi lấy chúng tôi mldsa65."
|
|
||||||
|
|
||||||
[pages.inbounds.stream.general]
|
[pages.inbounds.stream.general]
|
||||||
"request" = "Lời yêu cầu"
|
"request" = "Lời yêu cầu"
|
||||||
|
@ -701,6 +700,9 @@
|
||||||
"limitTraffic" = "🚧 Giới hạn lưu lượng"
|
"limitTraffic" = "🚧 Giới hạn lưu lượng"
|
||||||
"getBanLogs" = "Cấm nhật ký"
|
"getBanLogs" = "Cấm nhật ký"
|
||||||
"allClients" = "Tất cả Khách hàng"
|
"allClients" = "Tất cả Khách hàng"
|
||||||
|
"msgSend" = "💬 Gửi thông báo"
|
||||||
|
"msgUser" = "👤 Đến người dùng"
|
||||||
|
"msgAll" = "👥 Đến tất cả người dùng bot"
|
||||||
|
|
||||||
"addClient" = "Thêm Khách Hàng"
|
"addClient" = "Thêm Khách Hàng"
|
||||||
"submitDisable" = "Gửi Dưới Dạng Vô Hiệu ☑️"
|
"submitDisable" = "Gửi Dưới Dạng Vô Hiệu ☑️"
|
||||||
|
@ -736,3 +738,14 @@
|
||||||
"askToAddUserId" = "Cấu hình của bạn không được tìm thấy!\r\nVui lòng yêu cầu Quản trị viên sử dụng ID người dùng telegram của bạn trong cấu hình của bạn.\r\n\r\nID người dùng của bạn: <code>{{ .TgUserID }}</code>"
|
"askToAddUserId" = "Cấu hình của bạn không được tìm thấy!\r\nVui lòng yêu cầu Quản trị viên sử dụng ID người dùng telegram của bạn trong cấu hình của bạn.\r\n\r\nID người dùng của bạn: <code>{{ .TgUserID }}</code>"
|
||||||
"chooseClient" = "Chọn một Khách hàng cho Inbound {{ .Inbound }}"
|
"chooseClient" = "Chọn một Khách hàng cho Inbound {{ .Inbound }}"
|
||||||
"chooseInbound" = "Chọn một Inbound"
|
"chooseInbound" = "Chọn một Inbound"
|
||||||
|
|
||||||
|
"enterText" = "Nhập nội dung tin nhắn muốn gửi cho tất cả người dùng"
|
||||||
|
"inboundError" = "❌ Lỗi khi lấy dữ liệu inbound"
|
||||||
|
"clientError" = "❌ Lỗi khi lấy người dùng"
|
||||||
|
"broadcastMessageSent" = "Tin nhắn đã được gửi đến {{ .Count }} người dùng"
|
||||||
|
"chooseBroadcastInbound" = "Chọn inbound để gửi broadcast"
|
||||||
|
"chooseBroadcastUser" = "Chọn người dùng để gửi broadcast hoặc nhập email thủ công"
|
||||||
|
"broadcastUserNotFound" = "❌ Không tìm thấy người dùng với email này trong inbound đã chọn."
|
||||||
|
"broadcastUserNoTgId" = "❌ Người dùng không có Telegram ID, không thể gửi broadcast."
|
||||||
|
"broadcastEnterText" = "Nhập nội dung tin nhắn cho người dùng đã chọn"
|
||||||
|
"broadcastSentToUser" = "Tin nhắn đã được gửi đến người dùng: {{ .Email }}"
|
||||||
|
|
|
@ -262,7 +262,6 @@
|
||||||
"resetInboundClientTrafficSuccess" = "流量已重置"
|
"resetInboundClientTrafficSuccess" = "流量已重置"
|
||||||
"trafficGetError" = "获取流量数据时出错"
|
"trafficGetError" = "获取流量数据时出错"
|
||||||
"getNewX25519CertError" = "获取X25519证书时出错。"
|
"getNewX25519CertError" = "获取X25519证书时出错。"
|
||||||
"getNewmldsa65Error" = "获取mldsa65证书时出错。"
|
|
||||||
|
|
||||||
[pages.inbounds.stream.general]
|
[pages.inbounds.stream.general]
|
||||||
"request" = "请求"
|
"request" = "请求"
|
||||||
|
@ -701,6 +700,9 @@
|
||||||
"limitTraffic" = "🚧 流量限制"
|
"limitTraffic" = "🚧 流量限制"
|
||||||
"getBanLogs" = "禁止日志"
|
"getBanLogs" = "禁止日志"
|
||||||
"allClients" = "所有客户"
|
"allClients" = "所有客户"
|
||||||
|
"msgSend" = "💬 发送通知"
|
||||||
|
"msgUser" = "👤 给用户"
|
||||||
|
"msgAll" = "👥 给所有机器人用户"
|
||||||
|
|
||||||
"addClient" = "添加客户"
|
"addClient" = "添加客户"
|
||||||
"submitDisable" = "提交为禁用 ☑️"
|
"submitDisable" = "提交为禁用 ☑️"
|
||||||
|
@ -736,3 +738,14 @@
|
||||||
"askToAddUserId" = "未找到您的配置!\r\n请向管理员询问,在您的配置中使用您的 Telegram 用户 ChatID。\r\n\r\n您的用户 ChatID:<code>{{ .TgUserID }}</code>"
|
"askToAddUserId" = "未找到您的配置!\r\n请向管理员询问,在您的配置中使用您的 Telegram 用户 ChatID。\r\n\r\n您的用户 ChatID:<code>{{ .TgUserID }}</code>"
|
||||||
"chooseClient" = "为入站 {{ .Inbound }} 选择一个客户"
|
"chooseClient" = "为入站 {{ .Inbound }} 选择一个客户"
|
||||||
"chooseInbound" = "选择一个入站"
|
"chooseInbound" = "选择一个入站"
|
||||||
|
|
||||||
|
"enterText" = "请输入要发送给所有用户的消息文本"
|
||||||
|
"inboundError" = "❌ 获取入站信息出错"
|
||||||
|
"clientError" = "❌ 获取用户出错"
|
||||||
|
"broadcastMessageSent" = "消息已发送给 {{ .Count }} 位用户"
|
||||||
|
"chooseBroadcastInbound" = "选择用于广播的入站"
|
||||||
|
"chooseBroadcastUser" = "选择用于广播的用户或手动输入邮箱"
|
||||||
|
"broadcastUserNotFound" = "❌ 在所选入站中未找到该邮箱的用户。"
|
||||||
|
"broadcastUserNoTgId" = "❌ 用户未设置 Telegram ID,无法广播。"
|
||||||
|
"broadcastEnterText" = "请输入为所选用户发送的消息文本"
|
||||||
|
"broadcastSentToUser" = "消息已发送给用户: {{ .Email }}"
|
||||||
|
|
|
@ -264,7 +264,6 @@
|
||||||
"resetInboundClientTrafficSuccess" = "流量已重置"
|
"resetInboundClientTrafficSuccess" = "流量已重置"
|
||||||
"trafficGetError" = "取得流量資料時發生錯誤"
|
"trafficGetError" = "取得流量資料時發生錯誤"
|
||||||
"getNewX25519CertError" = "取得X25519憑證時發生錯誤。"
|
"getNewX25519CertError" = "取得X25519憑證時發生錯誤。"
|
||||||
"getNewmldsa65Error" = "取得mldsa65憑證時發生錯誤。"
|
|
||||||
|
|
||||||
[pages.inbounds.stream.general]
|
[pages.inbounds.stream.general]
|
||||||
"request" = "請求"
|
"request" = "請求"
|
||||||
|
@ -703,6 +702,9 @@
|
||||||
"limitTraffic" = "🚧 流量限制"
|
"limitTraffic" = "🚧 流量限制"
|
||||||
"getBanLogs" = "禁止日誌"
|
"getBanLogs" = "禁止日誌"
|
||||||
"allClients" = "所有客戶"
|
"allClients" = "所有客戶"
|
||||||
|
"msgSend" = "💬 發送通知"
|
||||||
|
"msgUser" = "👤 給使用者"
|
||||||
|
"msgAll" = "👥 給所有機器人使用者"
|
||||||
|
|
||||||
"addClient" = "新增客戶"
|
"addClient" = "新增客戶"
|
||||||
"submitDisable" = "以停用方式送出 ☑️"
|
"submitDisable" = "以停用方式送出 ☑️"
|
||||||
|
@ -738,3 +740,14 @@
|
||||||
"askToAddUserId" = "未找到您的配置!\r\n請向管理員詢問,在您的配置中使用您的 Telegram 使用者 ChatID。\r\n\r\n您的使用者 ChatID:<code>{{ .TgUserID }}</code>"
|
"askToAddUserId" = "未找到您的配置!\r\n請向管理員詢問,在您的配置中使用您的 Telegram 使用者 ChatID。\r\n\r\n您的使用者 ChatID:<code>{{ .TgUserID }}</code>"
|
||||||
"chooseClient" = "為入站 {{ .Inbound }} 選擇一個客戶"
|
"chooseClient" = "為入站 {{ .Inbound }} 選擇一個客戶"
|
||||||
"chooseInbound" = "選擇一個入站"
|
"chooseInbound" = "選擇一個入站"
|
||||||
|
|
||||||
|
"enterText" = "請輸入要發送給所有用戶的訊息內容"
|
||||||
|
"inboundError" = "❌ 取得入站資料時發生錯誤"
|
||||||
|
"clientError" = "❌ 取得用戶時發生錯誤"
|
||||||
|
"broadcastMessageSent" = "訊息已發送給 {{ .Count }} 位用戶"
|
||||||
|
"chooseBroadcastInbound" = "選擇要廣播的入站"
|
||||||
|
"chooseBroadcastUser" = "選擇要廣播的用戶或手動輸入電子郵件"
|
||||||
|
"broadcastUserNotFound" = "❌ 在所選入站中找不到該電子郵件的用戶。"
|
||||||
|
"broadcastUserNoTgId" = "❌ 用戶未設置 Telegram ID,無法廣播。"
|
||||||
|
"broadcastEnterText" = "請輸入要發送給所選用戶的訊息內容"
|
||||||
|
"broadcastSentToUser" = "訊息已發送給用戶: {{ .Email }}"
|
||||||
|
|
Loading…
Reference in a new issue