mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2025-05-15 20:58:06 +00:00
Add feature to add clients to inbound:
- Implement buttons for adding new clients - Handle client addition process (submission remains to be completed) - Support for multiple languages
This commit is contained in:
parent
cac00224db
commit
7eb62855ac
13 changed files with 446 additions and 50 deletions
|
@ -1,6 +1,8 @@
|
|||
package service
|
||||
|
||||
import (
|
||||
"crypto/rand"
|
||||
"math/big"
|
||||
"embed"
|
||||
"errors"
|
||||
"fmt"
|
||||
|
@ -20,8 +22,7 @@ import (
|
|||
"x-ui/web/locale"
|
||||
"x-ui/xray"
|
||||
|
||||
"slices"
|
||||
|
||||
"github.com/google/uuid"
|
||||
"github.com/mymmrac/telego"
|
||||
th "github.com/mymmrac/telego/telegohandler"
|
||||
tu "github.com/mymmrac/telego/telegoutil"
|
||||
|
@ -30,14 +31,33 @@ import (
|
|||
)
|
||||
|
||||
var (
|
||||
bot *telego.Bot
|
||||
botHandler *th.BotHandler
|
||||
adminIds []int64
|
||||
isRunning bool
|
||||
hostname string
|
||||
hashStorage *global.HashStorage
|
||||
bot *telego.Bot
|
||||
botHandler *th.BotHandler
|
||||
adminIds []int64
|
||||
isRunning bool
|
||||
hostname string
|
||||
hashStorage *global.HashStorage
|
||||
handler *th.Handler
|
||||
|
||||
// clients data to adding new client
|
||||
receiver_inbound_ID int
|
||||
client_Id string
|
||||
client_Flow string
|
||||
client_Email string
|
||||
client_LimitIP int
|
||||
client_TotalGB int64
|
||||
client_ExpiryTime int64
|
||||
client_Enable bool
|
||||
client_TgID string
|
||||
client_SubID string
|
||||
client_Comment string
|
||||
client_Reset int
|
||||
)
|
||||
|
||||
|
||||
var userStates = make(map[int64]string)
|
||||
|
||||
|
||||
type LoginStatus byte
|
||||
|
||||
const (
|
||||
|
@ -46,6 +66,8 @@ const (
|
|||
EmptyTelegramUserID = int64(0)
|
||||
)
|
||||
|
||||
const charset = "abcdefghijklmnopqrstuvwxyz0123456789"
|
||||
|
||||
type Tgbot struct {
|
||||
inboundService InboundService
|
||||
settingService SettingService
|
||||
|
@ -54,6 +76,7 @@ type Tgbot struct {
|
|||
lastStatus *Status
|
||||
}
|
||||
|
||||
|
||||
func (t *Tgbot) NewTgbot() *Tgbot {
|
||||
return new(Tgbot)
|
||||
}
|
||||
|
@ -223,36 +246,83 @@ func (t *Tgbot) OnReceive() {
|
|||
botHandler, _ = th.NewBotHandler(bot, updates)
|
||||
|
||||
botHandler.HandleMessage(func(_ *telego.Bot, message telego.Message) {
|
||||
delete(userStates, message.Chat.ID)
|
||||
t.SendMsgToTgbot(message.Chat.ID, t.I18nBot("tgbot.keyboardClosed"), tu.ReplyKeyboardRemove())
|
||||
}, th.TextEqual(t.I18nBot("tgbot.buttons.closeKeyboard")))
|
||||
|
||||
botHandler.HandleMessage(func(_ *telego.Bot, message telego.Message) {
|
||||
delete(userStates, message.Chat.ID)
|
||||
t.answerCommand(&message, message.Chat.ID, checkAdmin(message.From.ID))
|
||||
}, th.AnyCommand())
|
||||
|
||||
botHandler.HandleCallbackQuery(func(_ *telego.Bot, query telego.CallbackQuery) {
|
||||
delete(userStates,query.Message.GetChat().ID)
|
||||
t.answerCallback(&query, checkAdmin(query.From.ID))
|
||||
}, th.AnyCallbackQueryWithMessage())
|
||||
|
||||
botHandler.HandleMessage(func(_ *telego.Bot, message telego.Message) {
|
||||
if message.UsersShared != nil {
|
||||
if checkAdmin(message.From.ID) {
|
||||
for _, sharedUser := range message.UsersShared.Users {
|
||||
userID := sharedUser.UserID
|
||||
needRestart, err := t.inboundService.SetClientTelegramUserID(message.UsersShared.RequestID, userID)
|
||||
if needRestart {
|
||||
t.xrayService.SetToNeedRestart()
|
||||
if userState, exists := userStates[message.Chat.ID]; exists {
|
||||
switch userState {
|
||||
case "awaiting_id":
|
||||
client_Id = message.Text
|
||||
userStates[message.Chat.ID] = "awaiting_email"
|
||||
t.SendMsgToTgbot(message.Chat.ID, t.I18nBot("tgbot.messages.received_id", "ClientId=="+client_Id), tu.ReplyKeyboardRemove())
|
||||
cancel_btn_markup := tu.InlineKeyboard(
|
||||
tu.InlineKeyboardRow(
|
||||
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.use_default")).WithCallbackData("default_client_email"),
|
||||
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.cancel")).WithCallbackData("add_client_cancel"),
|
||||
),
|
||||
)
|
||||
t.SendMsgToTgbot(message.Chat.ID, t.I18nBot("tgbot.messages.email_prompt", "ClientEmail=="+client_Email), cancel_btn_markup)
|
||||
case "awaiting_email":
|
||||
client_Email = message.Text
|
||||
userStates[message.Chat.ID] = "awaiting_comment"
|
||||
t.SendMsgToTgbot(message.Chat.ID, t.I18nBot("tgbot.messages.received_email", "ClientEmail=="+client_Email), tu.ReplyKeyboardRemove())
|
||||
cancel_btn_markup := tu.InlineKeyboard(
|
||||
tu.InlineKeyboardRow(
|
||||
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.use_default")).WithCallbackData("default_client_comment"),
|
||||
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.cancel")).WithCallbackData("add_client_cancel"),
|
||||
),
|
||||
)
|
||||
t.SendMsgToTgbot(message.Chat.ID, t.I18nBot("tgbot.messages.comment_prompt", "ClientComment=="+client_Comment), cancel_btn_markup)
|
||||
case "awaiting_comment":
|
||||
client_Comment = message.Text
|
||||
t.SendMsgToTgbot(message.Chat.ID, t.I18nBot("tgbot.messages.received_comment", "ClientComment=="+client_Comment), tu.ReplyKeyboardRemove())
|
||||
message_text := t.I18nBot("tgbot.messages.client_data", "ClientId=="+client_Id,"ClientEmail=="+client_Email,"ClientComment=="+client_Comment)
|
||||
|
||||
inlineKeyboard := tu.InlineKeyboard(
|
||||
tu.InlineKeyboardRow(
|
||||
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.submitEnable")).WithCallbackData("add_client_submit_enable"),
|
||||
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.submitDisable")).WithCallbackData("add_client_submit_disable"),
|
||||
),
|
||||
tu.InlineKeyboardRow(
|
||||
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.cancel")).WithCallbackData("add_client_cancel"),
|
||||
),
|
||||
)
|
||||
t.SendMsgToTgbot(message.Chat.ID, message_text, inlineKeyboard)
|
||||
delete(userStates, message.Chat.ID)
|
||||
}
|
||||
|
||||
} else {
|
||||
if message.UsersShared != nil {
|
||||
if checkAdmin(message.From.ID) {
|
||||
for _, sharedUser := range message.UsersShared.Users {
|
||||
userID := sharedUser.UserID
|
||||
needRestart, err := t.inboundService.SetClientTelegramUserID(message.UsersShared.RequestID, userID)
|
||||
if needRestart {
|
||||
t.xrayService.SetToNeedRestart()
|
||||
}
|
||||
output := ""
|
||||
if err != nil {
|
||||
output += t.I18nBot("tgbot.messages.selectUserFailed")
|
||||
} else {
|
||||
output += t.I18nBot("tgbot.messages.userSaved")
|
||||
}
|
||||
t.SendMsgToTgbot(message.Chat.ID, output, tu.ReplyKeyboardRemove())
|
||||
}
|
||||
output := ""
|
||||
if err != nil {
|
||||
output += t.I18nBot("tgbot.messages.selectUserFailed")
|
||||
} else {
|
||||
output += t.I18nBot("tgbot.messages.userSaved")
|
||||
}
|
||||
t.SendMsgToTgbot(message.Chat.ID, output, tu.ReplyKeyboardRemove())
|
||||
} else {
|
||||
t.SendMsgToTgbot(message.Chat.ID, t.I18nBot("tgbot.noResult"), tu.ReplyKeyboardRemove())
|
||||
}
|
||||
} else {
|
||||
t.SendMsgToTgbot(message.Chat.ID, t.I18nBot("tgbot.noResult"), tu.ReplyKeyboardRemove())
|
||||
}
|
||||
}
|
||||
}, th.AnyMessage())
|
||||
|
@ -344,6 +414,16 @@ func (t *Tgbot) sendResponse(chatId int64, msg string, onlyMessage, isAdmin bool
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
func (t *Tgbot) randomLowerAndNum(length int) string {
|
||||
bytes := make([]byte, length)
|
||||
for i := range bytes {
|
||||
randomIndex, _ := rand.Int(rand.Reader, big.NewInt(int64(len(charset))))
|
||||
bytes[i] = charset[randomIndex.Int64()]
|
||||
}
|
||||
return string(bytes)
|
||||
}
|
||||
|
||||
func (t *Tgbot) answerCallback(callbackQuery *telego.CallbackQuery, isAdmin bool) {
|
||||
chatId := callbackQuery.Message.GetChat().ID
|
||||
|
||||
|
@ -838,7 +918,23 @@ func (t *Tgbot) answerCallback(callbackQuery *telego.CallbackQuery, isAdmin bool
|
|||
return
|
||||
}
|
||||
t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.chooseClient", "Inbound=="+inbound.Remark), clients)
|
||||
|
||||
case "add_client_to":
|
||||
inboundId := dataArray[1]
|
||||
inboundIdInt, err := strconv.Atoi(inboundId)
|
||||
if err != nil {
|
||||
t.sendCallbackAnswerTgBot(callbackQuery.ID, err.Error())
|
||||
return
|
||||
}
|
||||
receiver_inbound_ID = inboundIdInt
|
||||
inbound, err := t.inboundService.GetInbound(inboundIdInt)
|
||||
if err != nil {
|
||||
t.sendCallbackAnswerTgBot(callbackQuery.ID, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
message := t.I18nBot("tgbot.messages.inbound_client_data", "InboundRemark=="+inbound.Remark,"ClientId=="+client_Id,"ClientEmail=="+client_Email,"ClientComment=="+client_Comment)
|
||||
|
||||
t.addClient(chatId, message)
|
||||
}
|
||||
return
|
||||
} else {
|
||||
|
@ -892,11 +988,82 @@ func (t *Tgbot) answerCallback(callbackQuery *telego.CallbackQuery, isAdmin bool
|
|||
case "commands":
|
||||
t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.buttons.commands"))
|
||||
t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.commands.helpAdminCommands"))
|
||||
case "add_client":
|
||||
// assign default values to clients variables
|
||||
client_Id = uuid.New().String() // button
|
||||
client_Flow = ""
|
||||
client_Email = t.randomLowerAndNum(8) // button
|
||||
client_LimitIP = 0
|
||||
client_TotalGB = 0
|
||||
client_ExpiryTime = 0
|
||||
client_Enable = true // button
|
||||
client_TgID = ""
|
||||
client_SubID = t.randomLowerAndNum(16)
|
||||
client_Comment = "" // button
|
||||
client_Reset = 0 // button
|
||||
|
||||
inbounds, err := t.getInboundsAddClient()
|
||||
if err != nil {
|
||||
t.sendCallbackAnswerTgBot(callbackQuery.ID, err.Error())
|
||||
return
|
||||
}
|
||||
t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.buttons.addClient"))
|
||||
t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.chooseInbound"), inbounds)
|
||||
case "add_client_ch_default":
|
||||
cancel_btn_markup := tu.InlineKeyboard(
|
||||
tu.InlineKeyboardRow(
|
||||
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.use_default")).WithCallbackData("default_client_id"),
|
||||
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.cancel")).WithCallbackData("add_client_cancel"),
|
||||
),
|
||||
)
|
||||
t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.messages.id_prompt", "ClientId=="+client_Id),cancel_btn_markup)
|
||||
userStates[chatId] = "awaiting_id"
|
||||
case "default_client_id":
|
||||
cancel_btn_markup := tu.InlineKeyboard(
|
||||
tu.InlineKeyboardRow(
|
||||
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.use_default")).WithCallbackData("default_client_email"),
|
||||
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.cancel")).WithCallbackData("add_client_cancel"),
|
||||
),
|
||||
)
|
||||
t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.messages.email_prompt", "ClientEmail=="+client_Email),cancel_btn_markup)
|
||||
userStates[chatId] = "awaiting_email"
|
||||
case "default_client_email":
|
||||
inlineKeyboard := tu.InlineKeyboard(
|
||||
tu.InlineKeyboardRow(
|
||||
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.use_default")).WithCallbackData("default_client_comment"),
|
||||
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.cancel")).WithCallbackData("add_client_cancel"),
|
||||
),
|
||||
)
|
||||
t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.messages.comment_prompt", "ClientComment=="+client_Comment),inlineKeyboard)
|
||||
userStates[chatId] = "awaiting_comment"
|
||||
case "default_client_comment":
|
||||
message_text := t.I18nBot("tgbot.messages.client_data", "ClientId=="+client_Id,"ClientEmail=="+client_Email,"ClientComment=="+client_Comment)
|
||||
|
||||
inlineKeyboard := tu.InlineKeyboard(
|
||||
tu.InlineKeyboardRow(
|
||||
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.submitEnable")).WithCallbackData("add_client_submit_enable"),
|
||||
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.submitDisable")).WithCallbackData("add_client_submit_disable"),
|
||||
),
|
||||
tu.InlineKeyboardRow(
|
||||
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.cancel")).WithCallbackData("add_client_cancel"),
|
||||
),
|
||||
)
|
||||
|
||||
t.SendMsgToTgbot(chatId, message_text, inlineKeyboard)
|
||||
delete(userStates, chatId)
|
||||
case "add_client_cancel":
|
||||
delete(userStates, chatId)
|
||||
t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.messages.cancel"), tu.ReplyKeyboardRemove())
|
||||
}
|
||||
}
|
||||
|
||||
func checkAdmin(tgId int64) bool {
|
||||
return slices.Contains(adminIds, tgId)
|
||||
for _, adminId := range adminIds {
|
||||
if adminId == tgId {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (t *Tgbot) SendAnswer(chatId int64, msg string, isAdmin bool) {
|
||||
|
@ -915,7 +1082,10 @@ func (t *Tgbot) SendAnswer(chatId int64, msg string, isAdmin bool) {
|
|||
tu.InlineKeyboardRow(
|
||||
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.commands")).WithCallbackData(t.encodeQuery("commands")),
|
||||
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.onlines")).WithCallbackData(t.encodeQuery("onlines")),
|
||||
),
|
||||
tu.InlineKeyboardRow(
|
||||
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.allClients")).WithCallbackData(t.encodeQuery("get_inbounds")),
|
||||
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.addClient")).WithCallbackData(t.encodeQuery("add_client")),
|
||||
),
|
||||
// TODOOOOOOOOOOOOOO: Add restart button here.
|
||||
)
|
||||
|
@ -1161,39 +1331,45 @@ func (t *Tgbot) getInboundUsages() string {
|
|||
}
|
||||
return info
|
||||
}
|
||||
|
||||
func (t *Tgbot) getInbounds() (*telego.InlineKeyboardMarkup, error) {
|
||||
func (t *Tgbot) getInboundsKeyboard(action string) (*telego.InlineKeyboardMarkup, error) {
|
||||
inbounds, err := t.inboundService.GetAllInbounds()
|
||||
var buttons []telego.InlineKeyboardButton
|
||||
|
||||
if err != nil {
|
||||
logger.Warning("GetAllInbounds run failed:", err)
|
||||
return nil, errors.New(t.I18nBot("tgbot.answers.getInboundsFailed"))
|
||||
} else {
|
||||
if len(inbounds) > 0 {
|
||||
for _, inbound := range inbounds {
|
||||
status := "❌"
|
||||
if inbound.Enable {
|
||||
status = "✅"
|
||||
}
|
||||
buttons = append(buttons, tu.InlineKeyboardButton(fmt.Sprintf("%v - %v", inbound.Remark, status)).WithCallbackData(t.encodeQuery("get_clients "+strconv.Itoa(inbound.Id))))
|
||||
}
|
||||
} else {
|
||||
logger.Warning("GetAllInbounds run failed:", err)
|
||||
return nil, errors.New(t.I18nBot("tgbot.answers.getInboundsFailed"))
|
||||
}
|
||||
|
||||
}
|
||||
cols := 0
|
||||
if len(buttons) < 6 {
|
||||
cols = 3
|
||||
} else {
|
||||
|
||||
if len(inbounds) == 0 {
|
||||
logger.Warning("No inbounds found")
|
||||
return nil, errors.New(t.I18nBot("tgbot.answers.getInboundsFailed"))
|
||||
}
|
||||
|
||||
var buttons []telego.InlineKeyboardButton
|
||||
for _, inbound := range inbounds {
|
||||
status := "❌"
|
||||
if inbound.Enable {
|
||||
status = "✅"
|
||||
}
|
||||
callbackData := t.encodeQuery(fmt.Sprintf("%s %d", action, inbound.Id))
|
||||
buttons = append(buttons, tu.InlineKeyboardButton(fmt.Sprintf("%v - %v", inbound.Remark, status)).WithCallbackData(callbackData))
|
||||
}
|
||||
|
||||
cols := 3
|
||||
if len(buttons) >= 6 {
|
||||
cols = 2
|
||||
}
|
||||
|
||||
keyboard := tu.InlineKeyboardGrid(tu.InlineKeyboardCols(cols, buttons...))
|
||||
return keyboard, nil
|
||||
}
|
||||
|
||||
func (t *Tgbot) getInbounds() (*telego.InlineKeyboardMarkup, error) {
|
||||
return t.getInboundsKeyboard("get_clients")
|
||||
}
|
||||
|
||||
func (t *Tgbot) getInboundsAddClient() (*telego.InlineKeyboardMarkup, error) {
|
||||
return t.getInboundsKeyboard("add_client_to")
|
||||
}
|
||||
|
||||
func (t *Tgbot) getInboundClients(id int) (*telego.InlineKeyboardMarkup, error) {
|
||||
inbound, err := t.inboundService.GetInbound(id)
|
||||
if err != nil {
|
||||
|
@ -1484,6 +1660,28 @@ func (t *Tgbot) searchClient(chatId int64, email string, messageID ...int) {
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
func (t *Tgbot) addClient(chatId int64, msg string, messageID ...int) {
|
||||
|
||||
inlineKeyboard := tu.InlineKeyboard(
|
||||
tu.InlineKeyboardRow(
|
||||
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.change_default")).WithCallbackData("add_client_ch_default"),
|
||||
),
|
||||
tu.InlineKeyboardRow(
|
||||
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.submitEnable")).WithCallbackData("add_client_submit_enable"),
|
||||
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.submitDisable")).WithCallbackData("add_client_submit_disable"),
|
||||
),
|
||||
tu.InlineKeyboardRow(
|
||||
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.cancel")).WithCallbackData("add_client_cancel"),
|
||||
),
|
||||
)
|
||||
if len(messageID) > 0 {
|
||||
t.editMessageTgBot(chatId, messageID[0], msg, inlineKeyboard)
|
||||
} else {
|
||||
t.SendMsgToTgbot(chatId, msg, inlineKeyboard)
|
||||
}
|
||||
}
|
||||
|
||||
func (t *Tgbot) searchInbound(chatId int64, remark string) {
|
||||
inbounds, err := t.inboundService.SearchInbounds(remark)
|
||||
if err != nil {
|
||||
|
@ -1689,7 +1887,12 @@ func (t *Tgbot) notifyExhausted() {
|
|||
}
|
||||
|
||||
func int64Contains(slice []int64, item int64) bool {
|
||||
return slices.Contains(slice, item)
|
||||
for _, s := range slice {
|
||||
if s == item {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (t *Tgbot) onlineClients(chatId int64, messageID ...int) {
|
||||
|
@ -1848,4 +2051,4 @@ func (t *Tgbot) editMessageTgBot(chatId int64, messageID int, text string, inlin
|
|||
if _, err := bot.EditMessageText(¶ms); err != nil {
|
||||
logger.Warning(err)
|
||||
}
|
||||
}
|
||||
}
|
|
@ -572,6 +572,16 @@
|
|||
"yes" = "✅ Yes"
|
||||
"no" = "❌ No"
|
||||
|
||||
"received_id" = "🔑📥 Received ID: {{ .ClientId }}"
|
||||
"received_email" = "📧📥 Received Email: {{ .ClientEmail }}"
|
||||
"received_comment" = "💬📥 Received Comment: {{ .ClientComment }}"
|
||||
"id_prompt" = "🔑 Default ID: {{ .ClientId }}\n\nEnter your id."
|
||||
"email_prompt" = "📧 Default Email: {{ .ClientEmail }}\n\nEnter your email."
|
||||
"comment_prompt" = "💬 Default Comment: {{ .ClientComment }}\n\nEnter your Comment."
|
||||
"inbound_client_data" = "🔄 Inbound: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 Email: {{ .ClientEmail }}\n💬 Comment: {{ .ClientComment }}\n\nYou can add the client to inbound now!"
|
||||
"client_data" = "🔑 ID: {{ .ClientId }}\n📧 Email: {{ .ClientEmail }}\n💬 Comment: {{ .ClientComment }}\n\nYou can add the client to inbound now!"
|
||||
"cancel" = "❌ Process Canceled! \n\nYou can /start again anytime. 🔄"
|
||||
|
||||
[tgbot.buttons]
|
||||
"closeKeyboard" = "❌ Close Keyboard"
|
||||
"cancel" = "❌ Cancel"
|
||||
|
@ -606,6 +616,12 @@
|
|||
"getBanLogs" = "Get Ban Logs"
|
||||
"allClients" = "All Clients"
|
||||
|
||||
"addClient" = "Add Client"
|
||||
"submitEnable" = "Submit As Enable ✅"
|
||||
"submitDisable" = "Submit As Disable 🚫"
|
||||
"use_default" = "🏷️ Use default"
|
||||
"change_default" = "🔄⚙️ Change Default"
|
||||
|
||||
[tgbot.answers]
|
||||
"successfulOperation" = "✅ Operation successful!"
|
||||
"errorOperation" = "❗ Error in operation."
|
||||
|
|
|
@ -572,6 +572,16 @@
|
|||
"yes" = "✅ Sí"
|
||||
"no" = "❌ No"
|
||||
|
||||
"received_id" = "🔑📥 ID recibido: {{ .ClientId }}"
|
||||
"received_email" = "📧📥 Correo recibido: {{ .ClientEmail }}"
|
||||
"received_comment" = "💬📥 Comentario recibido: {{ .ClientComment }}"
|
||||
"id_prompt" = "🔑 ID predeterminado: {{ .ClientId }}\n\nIntroduce tu ID."
|
||||
"email_prompt" = "📧 Correo predeterminado: {{ .ClientEmail }}\n\nIntroduce tu correo."
|
||||
"comment_prompt" = "💬 Comentario predeterminado: {{ .ClientComment }}\n\nIntroduce tu comentario."
|
||||
"inbound_client_data" = "🔄 Entrada: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 Correo: {{ .ClientEmail }}\n💬 Comentario: {{ .ClientComment }}\n\n¡Puedes añadir el cliente a la entrada ahora!"
|
||||
"client_data" = "🔑 ID: {{ .ClientId }}\n📧 Correo: {{ .ClientEmail }}\n💬 Comentario: {{ .ClientComment }}\n\n¡Puedes añadir el cliente a la entrada ahora!"
|
||||
"cancel" = "❌ ¡Proceso cancelado! \n\nPuedes /start de nuevo en cualquier momento. 🔄"
|
||||
|
||||
[tgbot.buttons]
|
||||
"closeKeyboard" = "❌ Cerrar Teclado"
|
||||
"cancel" = "❌ Cancelar"
|
||||
|
@ -606,6 +616,12 @@
|
|||
"getBanLogs" = "Registros de prohibición"
|
||||
"allClients" = "Todos los Clientes"
|
||||
|
||||
"addClient" = "Añadir Cliente"
|
||||
"submitEnable" = "Enviar como Habilitado ✅"
|
||||
"submitDisable" = "Enviar como Deshabilitado 🚫"
|
||||
"use_default" = "🏷️ Usar por defecto"
|
||||
"change_default" = "🔄⚙️ Cambiar por defecto"
|
||||
|
||||
[tgbot.answers]
|
||||
"successfulOperation" = "✅ ¡Exitosa!"
|
||||
"errorOperation" = "❗ Error en la Operación."
|
||||
|
|
|
@ -572,6 +572,16 @@
|
|||
"yes" = "✅ بله"
|
||||
"no" = "❌ خیر"
|
||||
|
||||
"received_id" = "🔑📥 شناسه دریافت شده: {{ .ClientId }}"
|
||||
"received_email" = "📧📥 ایمیل دریافت شده: {{ .ClientEmail }}"
|
||||
"received_comment" = "💬📥 کامنت دریافت شده: {{ .ClientComment }}"
|
||||
"id_prompt" = "🔑 شناسه پیشفرض: {{ .ClientId }}\n\nشناسه خود را وارد کنید."
|
||||
"email_prompt" = "📧 ایمیل پیشفرض: {{ .ClientEmail }}\n\nایمیل خود را وارد کنید."
|
||||
"comment_prompt" = "💬 کامنت پیشفرض: {{ .ClientComment }}\n\nکامنت خود را وارد کنید."
|
||||
"inbound_client_data" = "🔄 ورودی: {{ .InboundRemark }}\n\n🔑 شناسه: {{ .ClientId }}\n📧 ایمیل: {{ .ClientEmail }}\n💬 کامنت: {{ .ClientComment }}\n\nهماکنون میتوانید مشتری را به ورودی اضافه کنید!"
|
||||
"client_data" = "🔑 شناسه: {{ .ClientId }}\n📧 ایمیل: {{ .ClientEmail }}\n💬 کامنت: {{ .ClientComment }}\n\nهماکنون میتوانید مشتری را به ورودی اضافه کنید!"
|
||||
"cancel" = "❌ فرآیند لغو شد! \n\nشما میتوانید هر زمان دوباره /start کنید. 🔄"
|
||||
|
||||
[tgbot.buttons]
|
||||
"closeKeyboard" = "❌ بستن کیبورد"
|
||||
"cancel" = "❌ لغو"
|
||||
|
@ -606,6 +616,12 @@
|
|||
"getBanLogs" = "گزارش های بلوک را دریافت کنید"
|
||||
"allClients" = "همه مشتریان"
|
||||
|
||||
"addClient" = "افزودن مشتری"
|
||||
"submitEnable" = "ارسال به عنوان فعال ✅"
|
||||
"submitDisable" = "ارسال به عنوان غیرفعال 🚫"
|
||||
"use_default" = "🏷️ استفاده از پیشفرض"
|
||||
"change_default" = "🔄⚙️ تغییر پیشفرض"
|
||||
|
||||
[tgbot.answers]
|
||||
"successfulOperation" = "✅ انجام شد!"
|
||||
"errorOperation" = "❗ خطا در عملیات."
|
||||
|
|
|
@ -571,6 +571,17 @@
|
|||
"yes" = "✅ Ya"
|
||||
"no" = "❌ Tidak"
|
||||
|
||||
|
||||
"received_id" = "🔑📥 ID diterima: {{ .ClientId }}"
|
||||
"received_email" = "📧📥 Email diterima: {{ .ClientEmail }}"
|
||||
"received_comment" = "💬📥 Komentar diterima: {{ .ClientComment }}"
|
||||
"id_prompt" = "🔑 ID default: {{ .ClientId }}\n\nMasukkan ID Anda."
|
||||
"email_prompt" = "📧 Email default: {{ .ClientEmail }}\n\nMasukkan email Anda."
|
||||
"comment_prompt" = "💬 Komentar default: {{ .ClientComment }}\n\nMasukkan komentar Anda."
|
||||
"inbound_client_data" = "🔄 Masuk: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 Email: {{ .ClientEmail }}\n💬 Komentar: {{ .ClientComment }}\n\nSekarang Anda bisa menambahkan klien ke inbound!"
|
||||
"client_data" = "🔑 ID: {{ .ClientId }}\n📧 Email: {{ .ClientEmail }}\n💬 Komentar: {{ .ClientComment }}\n\nSekarang Anda bisa menambahkan klien ke inbound!"
|
||||
"cancel" = "❌ Proses dibatalkan! \n\nAnda bisa /start lagi kapan saja. 🔄"
|
||||
|
||||
[tgbot.buttons]
|
||||
"closeKeyboard" = "❌ Tutup Papan Ketik"
|
||||
"cancel" = "❌ Batal"
|
||||
|
@ -605,6 +616,12 @@
|
|||
"getBanLogs" = "Dapatkan Log Pemblokiran"
|
||||
"allClients" = "Semua Klien"
|
||||
|
||||
"addClient" = "Tambah Klien"
|
||||
"submitEnable" = "Kirim Sebagai Aktif ✅"
|
||||
"submitDisable" = "Kirim Sebagai Nonaktif 🚫"
|
||||
"use_default" = "🏷️ Gunakan Default"
|
||||
"change_default" = "🔄⚙️ Ubah Default"
|
||||
|
||||
[tgbot.answers]
|
||||
"successfulOperation" = "✅ Operasi berhasil!"
|
||||
"errorOperation" = "❗ Kesalahan dalam operasi."
|
||||
|
|
|
@ -572,6 +572,16 @@
|
|||
"yes" = "✅ はい"
|
||||
"no" = "❌ いいえ"
|
||||
|
||||
"received_id" = "🔑📥 受け取ったID: {{ .ClientId }}"
|
||||
"received_email" = "📧📥 受け取ったメール: {{ .ClientEmail }}"
|
||||
"received_comment" = "💬📥 受け取ったコメント: {{ .ClientComment }}"
|
||||
"id_prompt" = "🔑 デフォルトID: {{ .ClientId }}\n\nIDを入力してください。"
|
||||
"email_prompt" = "📧 デフォルトメール: {{ .ClientEmail }}\n\nメールアドレスを入力してください。"
|
||||
"comment_prompt" = "💬 デフォルトコメント: {{ .ClientComment }}\n\nコメントを入力してください。"
|
||||
"inbound_client_data" = "🔄 受信データ: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 メール: {{ .ClientEmail }}\n💬 コメント: {{ .ClientComment }}\n\nクライアントを受信リストに追加できます!"
|
||||
"client_data" = "🔑 ID: {{ .ClientId }}\n📧 メール: {{ .ClientEmail }}\n💬 コメント: {{ .ClientComment }}\n\nクライアントを受信リストに追加できます!"
|
||||
"cancel" = "❌ 処理がキャンセルされました! \n\nいつでも/startでやり直せます。 🔄"
|
||||
|
||||
[tgbot.buttons]
|
||||
"closeKeyboard" = "❌ キーボードを閉じる"
|
||||
"cancel" = "❌ キャンセル"
|
||||
|
@ -606,6 +616,12 @@
|
|||
"getBanLogs" = "禁止ログ"
|
||||
"allClients" = "すべてのクライアント"
|
||||
|
||||
"addClient" = "クライアントを追加"
|
||||
"submitEnable" = "有効として送信 ✅"
|
||||
"submitDisable" = "無効として送信 🚫"
|
||||
"use_default" = "🏷️ デフォルトを使用"
|
||||
"change_default" = "🔄⚙️ デフォルトを変更"
|
||||
|
||||
[tgbot.answers]
|
||||
"successfulOperation" = "✅ 成功!"
|
||||
"errorOperation" = "❗ 操作エラー。"
|
||||
|
|
|
@ -572,6 +572,16 @@
|
|||
"yes" = "✅ Sim"
|
||||
"no" = "❌ Não"
|
||||
|
||||
"received_id" = "🔑📥 ID recebido: {{ .ClientId }}"
|
||||
"received_email" = "📧📥 E-mail recebido: {{ .ClientEmail }}"
|
||||
"received_comment" = "💬📥 Comentário recebido: {{ .ClientComment }}"
|
||||
"id_prompt" = "🔑 ID padrão: {{ .ClientId }}\n\nDigite seu ID."
|
||||
"email_prompt" = "📧 E-mail padrão: {{ .ClientEmail }}\n\nDigite seu e-mail."
|
||||
"comment_prompt" = "💬 Comentário padrão: {{ .ClientComment }}\n\nDigite seu comentário."
|
||||
"inbound_client_data" = "🔄 Entrada: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 E-mail: {{ .ClientEmail }}\n💬 Comentário: {{ .ClientComment }}\n\nVocê pode adicionar o cliente à entrada agora!"
|
||||
"client_data" = "🔑 ID: {{ .ClientId }}\n📧 E-mail: {{ .ClientEmail }}\n💬 Comentário: {{ .ClientComment }}\n\nVocê pode adicionar o cliente à entrada agora!"
|
||||
"cancel" = "❌ Processo cancelado! \n\nVocê pode /start novamente a qualquer momento. 🔄"
|
||||
|
||||
[tgbot.buttons]
|
||||
"closeKeyboard" = "❌ Fechar teclado"
|
||||
"cancel" = "❌ Cancelar"
|
||||
|
@ -606,6 +616,12 @@
|
|||
"getBanLogs" = "Obter logs de banimento"
|
||||
"allClients" = "Todos os clientes"
|
||||
|
||||
"addClient" = "Adicionar Cliente"
|
||||
"submitEnable" = "Enviar como Ativado ✅"
|
||||
"submitDisable" = "Enviar como Desativado 🚫"
|
||||
"use_default" = "🏷️ Usar padrão"
|
||||
"change_default" = "🔄⚙️ Alterar Padrão"
|
||||
|
||||
[tgbot.answers]
|
||||
"successfulOperation" = "✅ Operação bem-sucedida!"
|
||||
"errorOperation" = "❗ Erro na operação."
|
||||
|
|
|
@ -572,6 +572,16 @@
|
|||
"yes" = "✅ Да"
|
||||
"no" = "❌ Нет"
|
||||
|
||||
"received_id" = "🔑📥 Полученный ID: {{ .ClientId }}"
|
||||
"received_email" = "📧📥 Полученный email: {{ .ClientEmail }}"
|
||||
"received_comment" = "💬📥 Полученный комментарий: {{ .ClientComment }}"
|
||||
"id_prompt" = "🔑 Стандартный ID: {{ .ClientId }}\n\nВведите ваш ID."
|
||||
"email_prompt" = "📧 Стандартный email: {{ .ClientEmail }}\n\nВведите ваш email."
|
||||
"comment_prompt" = "💬 Стандартный комментарий: {{ .ClientComment }}\n\nВведите ваш комментарий."
|
||||
"inbound_client_data" = "🔄 Входящие: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 Email: {{ .ClientEmail }}\n💬 Комментарий: {{ .ClientComment }}\n\nТеперь вы можете добавить клиента в входящие!"
|
||||
"client_data" = "🔑 ID: {{ .ClientId }}\n📧 Email: {{ .ClientEmail }}\n💬 Комментарий: {{ .ClientComment }}\n\nТеперь вы можете добавить клиента в входящие!"
|
||||
"cancel" = "❌ Процесс отменен! \n\nВы можете снова запустить /start в любое время. 🔄"
|
||||
|
||||
[tgbot.buttons]
|
||||
"closeKeyboard" = "❌ Закрыть клавиатуру"
|
||||
"cancel" = "❌ Отмена"
|
||||
|
@ -606,6 +616,12 @@
|
|||
"getBanLogs" = "Логи блокировок"
|
||||
"allClients" = "Все клиенты"
|
||||
|
||||
"addClient" = "Добавить клиента"
|
||||
"submitEnable" = "Отправить как включено ✅"
|
||||
"submitDisable" = "Отправить как отключено 🚫"
|
||||
"use_default" = "🏷️ Использовать по умолчанию"
|
||||
"change_default" = "🔄⚙️ Изменить по умолчанию"
|
||||
|
||||
[tgbot.answers]
|
||||
"successfulOperation" = "✅ Успешно!"
|
||||
"errorOperation" = "❗ Ошибка в операции."
|
||||
|
|
|
@ -572,6 +572,16 @@
|
|||
"yes" = "✅ Evet"
|
||||
"no" = "❌ Hayır"
|
||||
|
||||
"received_id" = "🔑📥 Alınan ID: {{ .ClientId }}"
|
||||
"received_email" = "📧📥 Alınan E-posta: {{ .ClientEmail }}"
|
||||
"received_comment" = "💬📥 Alınan Yorum: {{ .ClientComment }}"
|
||||
"id_prompt" = "🔑 Varsayılan ID: {{ .ClientId }}\n\nID'nizi girin."
|
||||
"email_prompt" = "📧 Varsayılan E-posta: {{ .ClientEmail }}\n\nE-posta adresinizi girin."
|
||||
"comment_prompt" = "💬 Varsayılan Yorum: {{ .ClientComment }}\n\nYorumunuzu girin."
|
||||
"inbound_client_data" = "🔄 Giriş: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 E-posta: {{ .ClientEmail }}\n💬 Yorum: {{ .ClientComment }}\n\nŞimdi müşteri girişine ekleyebilirsiniz!"
|
||||
"client_data" = "🔑 ID: {{ .ClientId }}\n📧 E-posta: {{ .ClientEmail }}\n💬 Yorum: {{ .ClientComment }}\n\nŞimdi müşteri girişine ekleyebilirsiniz!"
|
||||
"cancel" = "❌ İşlem iptal edildi! \n\nİstediğiniz zaman /start komutunu tekrar verebilirsiniz. 🔄"
|
||||
|
||||
[tgbot.buttons]
|
||||
"closeKeyboard" = "❌ Klavyeyi Kapat"
|
||||
"cancel" = "❌ İptal"
|
||||
|
@ -606,6 +616,12 @@
|
|||
"getBanLogs" = "Yasak Günlüklerini Al"
|
||||
"allClients" = "Tüm Müşteriler"
|
||||
|
||||
"addClient" = "Müşteri Ekle"
|
||||
"submitEnable" = "Etkin Olarak Gönder ✅"
|
||||
"submitDisable" = "Devre Dışı Olarak Gönder 🚫"
|
||||
"use_default" = "🏷️ Varsayılanı Kullan"
|
||||
"change_default" = "🔄⚙️ Varsayılanı Değiştir"
|
||||
|
||||
[tgbot.answers]
|
||||
"successfulOperation" = "✅ İşlem başarılı!"
|
||||
"errorOperation" = "❗ İşlemde hata."
|
||||
|
|
|
@ -572,6 +572,16 @@
|
|||
"yes" = "✅ Так"
|
||||
"no" = "❌ Ні"
|
||||
|
||||
"received_id" = "🔑📥 Отриманий ID: {{ .ClientId }}"
|
||||
"received_email" = "📧📥 Отриманий Email: {{ .ClientEmail }}"
|
||||
"received_comment" = "💬📥 Отриманий коментар: {{ .ClientComment }}"
|
||||
"id_prompt" = "🔑 За замовчуванням ID: {{ .ClientId }}\n\nВведіть ваш ID."
|
||||
"email_prompt" = "📧 За замовчуванням Email: {{ .ClientEmail }}\n\nВведіть ваш email."
|
||||
"comment_prompt" = "💬 За замовчуванням коментар: {{ .ClientComment }}\n\nВведіть ваш коментар."
|
||||
"inbound_client_data" = "🔄 Вхідні дані: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 Email: {{ .ClientEmail }}\n💬 Коментар: {{ .ClientComment }}\n\nЗараз ви можете додати клієнта до вхідних!"
|
||||
"client_data" = "🔑 ID: {{ .ClientId }}\n📧 Email: {{ .ClientEmail }}\n💬 Коментар: {{ .ClientComment }}\n\nЗараз ви можете додати клієнта до вхідних!"
|
||||
"cancel" = "❌ Процес скасовано! \n\nВи можете /start знову в будь-який час. 🔄"
|
||||
|
||||
[tgbot.buttons]
|
||||
"closeKeyboard" = "❌ Закрити клавіатуру"
|
||||
"cancel" = "❌ Скасувати"
|
||||
|
@ -606,6 +616,12 @@
|
|||
"getBanLogs" = "Отримати журнали заборон"
|
||||
"allClients" = "Всі Клієнти"
|
||||
|
||||
"addClient" = "Додати клієнта"
|
||||
"submitEnable" = "Надіслати як увімкнено ✅"
|
||||
"submitDisable" = "Надіслати як вимкнено 🚫"
|
||||
"use_default" = "🏷️ Використати за замовчуванням"
|
||||
"change_default" = "🔄⚙️ Змінити за замовчуванням"
|
||||
|
||||
[tgbot.answers]
|
||||
"successfulOperation" = "✅ Операція успішна!"
|
||||
"errorOperation" = "❗ Помилка в роботі."
|
||||
|
|
|
@ -572,6 +572,16 @@
|
|||
"yes" = "✅ Có"
|
||||
"no" = "❌ Không"
|
||||
|
||||
"received_id" = "🔑📥 ID nhận được: {{ .ClientId }}"
|
||||
"received_email" = "📧📥 Email nhận được: {{ .ClientEmail }}"
|
||||
"received_comment" = "💬📥 Nhận được bình luận: {{ .ClientComment }}"
|
||||
"id_prompt" = "🔑 ID mặc định: {{ .ClientId }}\n\nNhập ID của bạn."
|
||||
"email_prompt" = "📧 Email mặc định: {{ .ClientEmail }}\n\nNhập email của bạn."
|
||||
"comment_prompt" = "💬 Bình luận mặc định: {{ .ClientComment }}\n\nNhập bình luận của bạn."
|
||||
"inbound_client_data" = "🔄 Dữ liệu đến: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 Email: {{ .ClientEmail }}\n💬 Bình luận: {{ .ClientComment }}\n\nBây giờ bạn có thể thêm khách hàng vào danh sách đến!"
|
||||
"client_data" = "🔑 ID: {{ .ClientId }}\n📧 Email: {{ .ClientEmail }}\n💬 Bình luận: {{ .ClientComment }}\n\nBây giờ bạn có thể thêm khách hàng vào danh sách đến!"
|
||||
"cancel" = "❌ Quá trình bị hủy! \n\nBạn có thể /start lại bất cứ lúc nào. 🔄"
|
||||
|
||||
[tgbot.buttons]
|
||||
"closeKeyboard" = "❌ Đóng Bàn Phím"
|
||||
"cancel" = "❌ Hủy"
|
||||
|
@ -606,6 +616,12 @@
|
|||
"getBanLogs" = "Cấm nhật ký"
|
||||
"allClients" = "Tất cả Khách hàng"
|
||||
|
||||
"addClient" = "Thêm Khách Hàng"
|
||||
"submitEnable" = "Gửi Dưới Dạng Bật ✅"
|
||||
"submitDisable" = "Gửi Dưới Dạng Tắt 🚫"
|
||||
"use_default" = "🏷️ Sử dụng mặc định"
|
||||
"change_default" = "🔄⚙️ Thay đổi mặc định"
|
||||
|
||||
[tgbot.answers]
|
||||
"successfulOperation" = "✅ Thành công!"
|
||||
"errorOperation" = "❗ Lỗi Trong Quá Trình Thực Hiện."
|
||||
|
|
|
@ -572,6 +572,16 @@
|
|||
"yes" = "✅ 是的"
|
||||
"no" = "❌ 没有"
|
||||
|
||||
"received_id" = "🔑📥 接收到的ID: {{ .ClientId }}"
|
||||
"received_email" = "📧📥 接收到的邮件: {{ .ClientEmail }}"
|
||||
"received_comment" = "💬📥 接收到的评论: {{ .ClientComment }}"
|
||||
"id_prompt" = "🔑 默认ID: {{ .ClientId }}\n\n请输入您的ID。"
|
||||
"email_prompt" = "📧 默认邮件: {{ .ClientEmail }}\n\n请输入您的邮箱。"
|
||||
"comment_prompt" = "💬 默认评论: {{ .ClientComment }}\n\n请输入您的评论。"
|
||||
"inbound_client_data" = "🔄 入站数据: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 邮件: {{ .ClientEmail }}\n💬 评论: {{ .ClientComment }}\n\n现在您可以将客户添加到入站!"
|
||||
"client_data" = "🔑 ID: {{ .ClientId }}\n📧 邮件: {{ .ClientEmail }}\n💬 评论: {{ .ClientComment }}\n\n现在您可以将客户添加到入站!"
|
||||
"cancel" = "❌ 过程已取消! \n\n您可以随时 /start 重新开始。 🔄"
|
||||
|
||||
[tgbot.buttons]
|
||||
"closeKeyboard" = "❌ 关闭键盘"
|
||||
"cancel" = "❌ 取消"
|
||||
|
@ -606,6 +616,12 @@
|
|||
"getBanLogs" = "禁止日志"
|
||||
"allClients" = "所有客户"
|
||||
|
||||
"addClient" = "添加客户"
|
||||
"submitEnable" = "提交为启用 ✅"
|
||||
"submitDisable" = "提交为禁用 🚫"
|
||||
"use_default" = "🏷️ 使用默认"
|
||||
"change_default" = "🔄⚙️ 更改默认"
|
||||
|
||||
[tgbot.answers]
|
||||
"successfulOperation" = "✅ 成功!"
|
||||
"errorOperation" = "❗ 操作错误。"
|
||||
|
|
|
@ -572,6 +572,16 @@
|
|||
"yes" = "✅ 是的"
|
||||
"no" = "❌ 沒有"
|
||||
|
||||
"received_id" = "🔑📥 接收到的ID: {{ .ClientId }}"
|
||||
"received_email" = "📧📥 接收到的電子郵件: {{ .ClientEmail }}"
|
||||
"received_comment" = "💬📥 接收到的評論: {{ .ClientComment }}"
|
||||
"id_prompt" = "🔑 預設ID: {{ .ClientId }}\n\n請輸入您的ID。"
|
||||
"email_prompt" = "📧 預設電子郵件: {{ .ClientEmail }}\n\n請輸入您的電子郵件。"
|
||||
"comment_prompt" = "💬 預設評論: {{ .ClientComment }}\n\n請輸入您的評論。"
|
||||
"inbound_client_data" = "🔄 進站數據: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 電子郵件: {{ .ClientEmail }}\n💬 評論: {{ .ClientComment }}\n\n您現在可以將客戶加入進站!"
|
||||
"client_data" = "🔑 ID: {{ .ClientId }}\n📧 電子郵件: {{ .ClientEmail }}\n💬 評論: {{ .ClientComment }}\n\n您現在可以將客戶加入進站!"
|
||||
"cancel" = "❌ 處理已取消! \n\n您隨時可以 /start 再次開始。 🔄"
|
||||
|
||||
[tgbot.buttons]
|
||||
"closeKeyboard" = "❌ 關閉鍵盤"
|
||||
"cancel" = "❌ 取消"
|
||||
|
@ -606,6 +616,12 @@
|
|||
"getBanLogs" = "禁止日誌"
|
||||
"allClients" = "所有客戶"
|
||||
|
||||
"addClient" = "新增客戶"
|
||||
"submitEnable" = "提交為啟用 ✅"
|
||||
"submitDisable" = "提交為停用 🚫"
|
||||
"use_default" = "🏷️ 使用預設"
|
||||
"change_default" = "🔄⚙️ 更改預設"
|
||||
|
||||
[tgbot.answers]
|
||||
"successfulOperation" = "✅ 成功!"
|
||||
"errorOperation" = "❗ 操作錯誤。"
|
||||
|
|
Loading…
Reference in a new issue