Compare commits

...

6 commits

Author SHA1 Message Date
nistootsin
f92ba7ab13 update all files in web/translation/ 2025-03-21 18:18:52 +03:30
nistootsin
f717cbe40e restructrure the add client bot feature 2025-03-21 18:18:52 +03:30
nistootsin
8f9e4acd2c
Merge branch 'MHSanaei:main' into develop-bot/add_client_feature 2025-03-21 17:22:25 +03:30
Shishkevich D.
db140a1e9b
chore: improve russian translation (#2802)
* chore: improve russian translation

* chore: corrections in translation
2025-03-21 18:54:02 +07:00
mhsanaei
db945e2fbd
OS: Alma Linux 9.5+ 2025-03-21 12:49:23 +01:00
mhsanaei
667fac15f4
OS: Rocky Linux 9.5+ 2025-03-21 12:40:13 +01:00
20 changed files with 566 additions and 382 deletions

View file

@ -253,8 +253,8 @@ location /sub {
- Parch Linux - Parch Linux
- Manjaro - Manjaro
- Armbian - Armbian
- AlmaLinux 8.0+ - AlmaLinux 9.5+
- Rocky Linux 8+ - Rocky Linux 9.5+
- Oracle Linux 8+ - Oracle Linux 8+
- OpenSUSE Tubleweed - OpenSUSE Tubleweed
- Amazon Linux 2023 - Amazon Linux 2023

View file

@ -254,8 +254,8 @@ location /sub {
- Parch Linux - Parch Linux
- Manjaro - Manjaro
- Armbian - Armbian
- AlmaLinux 8.0+ - AlmaLinux 9.5+
- Rocky Linux 8+ - Rocky Linux 9.5+
- Oracle Linux 8+ - Oracle Linux 8+
- OpenSUSE Tubleweed - OpenSUSE Tubleweed
- Amazon Linux 2023 - Amazon Linux 2023

View file

@ -258,8 +258,8 @@ location /sub {
- Parch Linux - Parch Linux
- Manjaro - Manjaro
- Armbian - Armbian
- AlmaLinux 8.0+ - AlmaLinux 9.5+
- Rocky Linux 8+ - Rocky Linux 9.5+
- Oracle Linux 8+ - Oracle Linux 8+
- OpenSUSE Tubleweed - OpenSUSE Tubleweed
- Amazon Linux 2023 - Amazon Linux 2023

View file

@ -257,8 +257,8 @@ location /sub {
- Parch Linux - Parch Linux
- Manjaro - Manjaro
- Armbian - Armbian
- AlmaLinux 8.0+ - AlmaLinux 9.5+
- Rocky Linux 8+ - Rocky Linux 9.5+
- Oracle Linux 8+ - Oracle Linux 8+
- OpenSUSE Tubleweed - OpenSUSE Tubleweed
- Amazon Linux 2023 - Amazon Linux 2023

View file

@ -254,8 +254,8 @@ location /sub {
- Parch Linux - Parch Linux
- Manjaro - Manjaro
- Armbian - Armbian
- AlmaLinux 8.0+ - AlmaLinux 9.5+
- Rocky Linux 8+ - Rocky Linux 9.5+
- Oracle Linux 8+ - Oracle Linux 8+
- OpenSUSE Tubleweed - OpenSUSE Tubleweed
- Amazon Linux 2023 - Amazon Linux 2023

View file

@ -79,12 +79,12 @@ elif [[ "${release}" == "debian" ]]; then
echo -e "${red} Please use Debian 12 or higher ${plain}\n" && exit 1 echo -e "${red} Please use Debian 12 or higher ${plain}\n" && exit 1
fi fi
elif [[ "${release}" == "almalinux" ]]; then elif [[ "${release}" == "almalinux" ]]; then
if [[ ${os_version} -lt 80 ]]; then if [[ ${os_version} -lt 95 ]]; then
echo -e "${red} Please use AlmaLinux 8.0 or higher ${plain}\n" && exit 1 echo -e "${red} Please use AlmaLinux 9.5 or higher ${plain}\n" && exit 1
fi fi
elif [[ "${release}" == "rocky" ]]; then elif [[ "${release}" == "rocky" ]]; then
if [[ ${os_version} -lt 8 ]]; then if [[ ${os_version} -lt 95 ]]; then
echo -e "${red} Please use Rocky Linux 8 or higher ${plain}\n" && exit 1 echo -e "${red} Please use Rocky Linux 9.5 or higher ${plain}\n" && exit 1
fi fi
elif [[ "${release}" == "ol" ]]; then elif [[ "${release}" == "ol" ]]; then
if [[ ${os_version} -lt 8 ]]; then if [[ ${os_version} -lt 8 ]]; then
@ -106,8 +106,8 @@ else
echo "- Parch Linux" echo "- Parch Linux"
echo "- Manjaro" echo "- Manjaro"
echo "- Armbian" echo "- Armbian"
echo "- AlmaLinux 8.0+" echo "- AlmaLinux 9.5+"
echo "- Rocky Linux 8+" echo "- Rocky Linux 9.5+"
echo "- Oracle Linux 8+" echo "- Oracle Linux 8+"
echo "- OpenSUSE Tumbleweed" echo "- OpenSUSE Tumbleweed"
echo "- Amazon Linux 2023" echo "- Amazon Linux 2023"

View file

@ -10,6 +10,7 @@ import (
"net" "net"
"net/url" "net/url"
"os" "os"
"regexp"
"strconv" "strconv"
"strings" "strings"
"time" "time"
@ -270,61 +271,72 @@ func (t *Tgbot) OnReceive() {
if userState, exists := userStates[message.Chat.ID]; exists { if userState, exists := userStates[message.Chat.ID]; exists {
switch userState { switch userState {
case "awaiting_id": case "awaiting_id":
client_Id = message.Text client_Id = strings.TrimSpace(message.Text)
userStates[message.Chat.ID] = "awaiting_email" if t.isSingleWord(client_Id) {
t.SendMsgToTgbot(message.Chat.ID, t.I18nBot("tgbot.messages.received_id", "ClientId=="+client_Id), tu.ReplyKeyboardRemove()) userStates[message.Chat.ID] = "awaiting_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(message.Chat.ID, t.I18nBot("tgbot.messages.email_prompt", "ClientEmail=="+client_Email), cancel_btn_markup)
case "awaiting_password_tr":
client_TrPassword = message.Text
userStates[message.Chat.ID] = "awaiting_email"
t.SendMsgToTgbot(message.Chat.ID, t.I18nBot("tgbot.messages.received_password", "ClientPass=="+client_TrPassword), 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_password_sh":
client_ShPassword = message.Text
userStates[message.Chat.ID] = "awaiting_email"
t.SendMsgToTgbot(message.Chat.ID, t.I18nBot("tgbot.messages.received_password", "ClientPass=="+client_ShPassword), 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.BuildClientDataMessage()
inlineKeyboard := tu.InlineKeyboard( cancel_btn_markup := tu.InlineKeyboard(
tu.InlineKeyboardRow( tu.InlineKeyboardRow(
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.cancel")).WithCallbackData("add_client_cancel"), tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.use_default")).WithCallbackData("add_client_default_info"),
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.submitDisable")).WithCallbackData("add_client_submit_disable"),
), ),
) )
t.SendMsgToTgbot(message.Chat.ID, message_text, inlineKeyboard)
t.SendMsgToTgbot(message.Chat.ID, t.I18nBot("tgbot.messages.incorrect_input"), cancel_btn_markup)
} else {
t.SendMsgToTgbotDeleteAfter(message.Chat.ID, t.I18nBot("tgbot.messages.received_id"), 3, tu.ReplyKeyboardRemove())
delete(userStates, message.Chat.ID)
}
case "awaiting_password_tr":
client_TrPassword = strings.TrimSpace(message.Text)
if t.isSingleWord(client_TrPassword) {
userStates[message.Chat.ID] = "awaiting_password_tr"
cancel_btn_markup := tu.InlineKeyboard(
tu.InlineKeyboardRow(
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.use_default")).WithCallbackData("add_client_default_info"),
),
)
t.SendMsgToTgbot(message.Chat.ID, t.I18nBot("tgbot.messages.incorrect_input"), cancel_btn_markup)
} else {
t.SendMsgToTgbotDeleteAfter(message.Chat.ID, t.I18nBot("tgbot.messages.received_password"), 3, tu.ReplyKeyboardRemove())
delete(userStates, message.Chat.ID)
}
case "awaiting_password_sh":
client_ShPassword = strings.TrimSpace(message.Text)
if t.isSingleWord(client_ShPassword) {
userStates[message.Chat.ID] = "awaiting_password_sh"
cancel_btn_markup := tu.InlineKeyboard(
tu.InlineKeyboardRow(
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.use_default")).WithCallbackData("add_client_default_info"),
),
)
t.SendMsgToTgbot(message.Chat.ID, t.I18nBot("tgbot.messages.incorrect_input"), cancel_btn_markup)
} else {
t.SendMsgToTgbotDeleteAfter(message.Chat.ID, t.I18nBot("tgbot.messages.received_password"), 3, tu.ReplyKeyboardRemove())
delete(userStates, message.Chat.ID)
}
case "awaiting_email":
client_Email = strings.TrimSpace(message.Text)
if t.isSingleWord(client_Email) {
userStates[message.Chat.ID] = "awaiting_email"
cancel_btn_markup := tu.InlineKeyboard(
tu.InlineKeyboardRow(
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.use_default")).WithCallbackData("add_client_default_info"),
),
)
t.SendMsgToTgbot(message.Chat.ID, t.I18nBot("tgbot.messages.incorrect_input"), cancel_btn_markup)
} else {
t.SendMsgToTgbotDeleteAfter(message.Chat.ID, t.I18nBot("tgbot.messages.received_email"), 3, tu.ReplyKeyboardRemove())
delete(userStates, message.Chat.ID)
}
case "awaiting_comment":
client_Comment = strings.TrimSpace(message.Text)
t.SendMsgToTgbotDeleteAfter(message.Chat.ID, t.I18nBot("tgbot.messages.received_comment"), 3, tu.ReplyKeyboardRemove())
delete(userStates, message.Chat.ID) delete(userStates, message.Chat.ID)
} }
@ -1066,53 +1078,72 @@ func (t *Tgbot) answerCallback(callbackQuery *telego.CallbackQuery, isAdmin bool
} }
t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.buttons.addClient")) t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.buttons.addClient"))
t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.chooseInbound"), inbounds) t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.chooseInbound"), inbounds)
case "add_client_ch_default": case "add_client_refresh":
var prompt_state string messageId := callbackQuery.Message.GetMessageID()
var prompt_message string inbound, err := t.inboundService.GetInbound(receiver_inbound_ID)
if err != nil {
t.sendCallbackAnswerTgBot(callbackQuery.ID, err.Error())
return
}
message_text, err := t.BuildInboundClientDataMessage(inbound.Remark, inbound.Protocol)
t.addClient(chatId,message_text,messageId)
prompt_state ,prompt_message, _ = t.BuildClientChDefaultResponse() t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.clientRefreshSuccess", "Email=="+client_Email))
cancel_btn_markup := tu.InlineKeyboard( case "add_client_ch_default_email":
tu.InlineKeyboardRow(
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.use_default")).WithCallbackData("default_client_id_pass"),
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.cancel")).WithCallbackData("add_client_cancel"),
),
)
t.SendMsgToTgbot(chatId, prompt_message,cancel_btn_markup)
userStates[chatId] = prompt_state
case "default_client_id_pass":
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" userStates[chatId] = "awaiting_email"
case "default_client_email": cancel_btn_markup := tu.InlineKeyboard(
inlineKeyboard := tu.InlineKeyboard(
tu.InlineKeyboardRow( tu.InlineKeyboardRow(
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.use_default")).WithCallbackData("default_client_comment"), tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.use_default")).WithCallbackData("add_client_default_info"),
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.cancel")).WithCallbackData("add_client_cancel"),
), ),
) )
t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.messages.comment_prompt", "ClientComment=="+client_Comment),inlineKeyboard) prompt_message := t.I18nBot("tgbot.messages.id_prompt", "ClientId=="+client_Email)
t.SendMsgToTgbot(chatId, prompt_message, cancel_btn_markup)
case "add_client_ch_default_id":
userStates[chatId] = "awaiting_id"
cancel_btn_markup := tu.InlineKeyboard(
tu.InlineKeyboardRow(
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.use_default")).WithCallbackData("add_client_default_info"),
),
)
prompt_message := t.I18nBot("tgbot.messages.id_prompt", "ClientId=="+client_Id)
t.SendMsgToTgbot(chatId, prompt_message, cancel_btn_markup)
case "add_client_ch_default_pass_tr":
userStates[chatId] = "awaiting_password_tr"
cancel_btn_markup := tu.InlineKeyboard(
tu.InlineKeyboardRow(
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.use_default")).WithCallbackData("add_client_default_info"),
),
)
prompt_message := t.I18nBot("tgbot.messages.pass_prompt", "ClientPassword=="+client_TrPassword)
t.SendMsgToTgbot(chatId, prompt_message, cancel_btn_markup)
case "add_client_ch_default_pass_sh":
userStates[chatId] = "awaiting_password_sh"
cancel_btn_markup := tu.InlineKeyboard(
tu.InlineKeyboardRow(
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.use_default")).WithCallbackData("add_client_default_info"),
),
)
prompt_message := t.I18nBot("tgbot.messages.pass_prompt", "ClientPassword=="+client_ShPassword)
t.SendMsgToTgbot(chatId, prompt_message, cancel_btn_markup)
case "add_client_ch_default_comment":
userStates[chatId] = "awaiting_comment" userStates[chatId] = "awaiting_comment"
case "default_client_comment": cancel_btn_markup := tu.InlineKeyboard(
message_text, _ := t.BuildClientDataMessage()
inlineKeyboard := tu.InlineKeyboard(
tu.InlineKeyboardRow( tu.InlineKeyboardRow(
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.submitDisable")).WithCallbackData("add_client_submit_disable"), tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.use_default")).WithCallbackData("add_client_default_info"),
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.cancel")).WithCallbackData("add_client_cancel"),
), ),
) )
prompt_message := t.I18nBot("tgbot.messages.comment_prompt", "ClientComment=="+client_Comment)
t.SendMsgToTgbot(chatId, message_text, inlineKeyboard) t.SendMsgToTgbot(chatId, prompt_message, cancel_btn_markup)
case "add_client_ch_default_traffic":
userStates[chatId] = "awaiting_id"
case "add_client_ch_default_exp":
userStates[chatId] = "awaiting_id"
case "add_client_default_info":
t.SendMsgToTgbotDeleteAfter(chatId, t.I18nBot("tgbot.messages.using_default_value"), 3, tu.ReplyKeyboardRemove())
delete(userStates, chatId) delete(userStates, chatId)
case "add_client_cancel": case "add_client_cancel":
delete(userStates, chatId) delete(userStates, chatId)
t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.messages.cancel"), tu.ReplyKeyboardRemove()) t.SendMsgToTgbotDeleteAfter(chatId, t.I18nBot("tgbot.messages.cancel"), 5, tu.ReplyKeyboardRemove())
case "add_client_submit_disable": case "add_client_submit_disable":
client_Enable = false client_Enable = false
_, err := t.SubmitAddClient() _, err := t.SubmitAddClient()
@ -1120,38 +1151,12 @@ func (t *Tgbot) answerCallback(callbackQuery *telego.CallbackQuery, isAdmin bool
errorMessage := fmt.Sprintf("%v", err) errorMessage := fmt.Sprintf("%v", err)
t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.messages.error_add_client", "error=="+errorMessage), tu.ReplyKeyboardRemove()) t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.messages.error_add_client", "error=="+errorMessage), tu.ReplyKeyboardRemove())
} else { } else {
t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.messages.success_add_client"), tu.ReplyKeyboardRemove()) t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.successfulOperation"))
} }
} }
} }
func (t *Tgbot) BuildClientChDefaultResponse() (string,string,error) {
inbound, err := t.inboundService.GetInbound(receiver_inbound_ID)
if err != nil {
logger.Warning("getIboundClients run failed:", err)
return "", "",errors.New(t.I18nBot("tgbot.answers.getInboundsFailed"))
}
protocol := inbound.Protocol
switch protocol {
case model.VMESS, model.VLESS:
prompt := t.I18nBot("tgbot.messages.id_prompt", "ClientId=="+client_Id)
return "awaiting_id", prompt,errors.New("unknown protocol")
case model.Trojan:
prompt := t.I18nBot("tgbot.messages.pass_prompt", "ClientPassword=="+client_TrPassword)
return "awaiting_password_tr", prompt,errors.New("unknown protocol")
case model.Shadowsocks:
prompt := t.I18nBot("tgbot.messages.pass_prompt", "ClientPassword=="+client_ShPassword)
return "awaiting_password_sh", prompt,errors.New("unknown protocol")
default:
return "","", errors.New("unknown protocol")
}
}
func (t *Tgbot) BuildInboundClientDataMessage(inbound_remark string ,protocol model.Protocol) (string, error) { func (t *Tgbot) BuildInboundClientDataMessage(inbound_remark string ,protocol model.Protocol) (string, error) {
var message string var message string
@ -1201,7 +1206,6 @@ func (t *Tgbot) BuildClientDataMessage() (string, error) {
} }
func (t *Tgbot) BuildJSONForProtocol(protocol model.Protocol) (string, error) { func (t *Tgbot) BuildJSONForProtocol(protocol model.Protocol) (string, error) {
var jsonString string var jsonString string
@ -1940,12 +1944,31 @@ func (t *Tgbot) searchClient(chatId int64, email string, messageID ...int) {
} }
} }
func (t *Tgbot) addClient(chatId int64, msg string, messageID ...int) { func (t *Tgbot) addClient(chatId int64, msg string, messageID ...int) {
inbound, err := t.inboundService.GetInbound(receiver_inbound_ID)
if err != nil {
t.SendMsgToTgbot(chatId, err.Error())
return
}
protocol := inbound.Protocol
switch protocol {
case model.VMESS, model.VLESS:
inlineKeyboard := tu.InlineKeyboard( inlineKeyboard := tu.InlineKeyboard(
tu.InlineKeyboardRow( tu.InlineKeyboardRow(
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.change_default")).WithCallbackData("add_client_ch_default"), tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.refresh")).WithCallbackData("add_client_refresh"),
),
tu.InlineKeyboardRow(
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.change_email")).WithCallbackData("add_client_ch_default_email"),
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.change_id")).WithCallbackData("add_client_ch_default_id"),
),
tu.InlineKeyboardRow(
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.limitTraffic")).WithCallbackData("add_client_ch_default_traffic"),
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.resetExpire")).WithCallbackData("add_client_ch_default_exp"),
),
tu.InlineKeyboardRow(
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.change_comment")).WithCallbackData("add_client_ch_default_comment"),
), ),
tu.InlineKeyboardRow( tu.InlineKeyboardRow(
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.submitDisable")).WithCallbackData("add_client_submit_disable"), tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.submitDisable")).WithCallbackData("add_client_submit_disable"),
@ -1957,6 +1980,62 @@ func (t *Tgbot) addClient(chatId int64, msg string, messageID ...int) {
} else { } else {
t.SendMsgToTgbot(chatId, msg, inlineKeyboard) t.SendMsgToTgbot(chatId, msg, inlineKeyboard)
} }
case model.Trojan:
inlineKeyboard := tu.InlineKeyboard(
tu.InlineKeyboardRow(
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.refresh")).WithCallbackData("add_client_refresh"),
),
tu.InlineKeyboardRow(
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.change_email")).WithCallbackData("add_client_ch_default_email"),
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.change_password")).WithCallbackData("add_client_ch_default_pass_tr"),
),
tu.InlineKeyboardRow(
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.limitTraffic")).WithCallbackData("add_client_ch_default_traffic"),
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.resetExpire")).WithCallbackData("add_client_ch_default_exp"),
),
tu.InlineKeyboardRow(
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.change_comment")).WithCallbackData("add_client_ch_default_comment"),
),
tu.InlineKeyboardRow(
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.submitDisable")).WithCallbackData("add_client_submit_disable"),
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)
}
case model.Shadowsocks:
inlineKeyboard := tu.InlineKeyboard(
tu.InlineKeyboardRow(
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.refresh")).WithCallbackData("add_client_refresh"),
),
tu.InlineKeyboardRow(
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.change_email")).WithCallbackData("add_client_ch_default_email"),
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.change_password")).WithCallbackData("add_client_ch_default_pass_sh"),
),
tu.InlineKeyboardRow(
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.limitTraffic")).WithCallbackData("add_client_ch_default_traffic"),
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.resetExpire")).WithCallbackData("add_client_ch_default_exp"),
),
tu.InlineKeyboardRow(
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.change_comment")).WithCallbackData("add_client_ch_default_comment"),
),
tu.InlineKeyboardRow(
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.submitDisable")).WithCallbackData("add_client_submit_disable"),
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) { func (t *Tgbot) searchInbound(chatId int64, remark string) {
@ -2329,3 +2408,49 @@ func (t *Tgbot) editMessageTgBot(chatId int64, messageID int, text string, inlin
logger.Warning(err) logger.Warning(err)
} }
} }
func (t *Tgbot) SendMsgToTgbotDeleteAfter(chatId int64, msg string, delayInSeconds int, replyMarkup ...telego.ReplyMarkup) {
// Determine if replyMarkup was passed; otherwise, set it to nil
var replyMarkupParam telego.ReplyMarkup
if len(replyMarkup) > 0 {
replyMarkupParam = replyMarkup[0] // Use the first element
}
// Send the message
sentMsg, err := bot.SendMessage(&telego.SendMessageParams{
ChatID: tu.ID(chatId),
Text: msg,
ReplyMarkup: replyMarkupParam, // Use the correct replyMarkup value
})
if err != nil {
logger.Warning("Failed to send message:", err)
return
}
// Delete the sent message after the specified number of seconds
go func() {
time.Sleep(time.Duration(delayInSeconds) * time.Second) // Wait for the specified delay
t.deleteMessageTgBot(chatId, sentMsg.MessageID) // Delete the message
delete(userStates, chatId)
}()
}
func (t *Tgbot) deleteMessageTgBot(chatId int64, messageID int) {
params := telego.DeleteMessageParams{
ChatID: tu.ID(chatId),
MessageID: messageID,
}
if err := bot.DeleteMessage(&params); err != nil {
logger.Warning("Failed to delete message:", err)
} else {
logger.Info("Message deleted successfully")
}
}
func (t *Tgbot) isSingleWord(text string) bool {
text = strings.TrimSpace(text)
re := regexp.MustCompile(`\s+`)
return re.MatchString(text)
}

View file

@ -582,10 +582,10 @@
"yes" = "✅ Yes" "yes" = "✅ Yes"
"no" = "❌ No" "no" = "❌ No"
"received_id" = "🔑📥 Received ID: {{ .ClientId }}" "received_id" = "🔑📥 ID updated. Press refresh to see changes."
"received_password" = "🔑📥 Received Password: {{ .ClientPass }}" "received_password" = "🔑📥 Password updated. Press refresh to see changes."
"received_email" = "📧📥 Received Email: {{ .ClientEmail }}" "received_email" = "📧📥 Email updated. Press refresh to see changes."
"received_comment" = "💬📥 Received Comment: {{ .ClientComment }}" "received_comment" = "💬📥 Comment updated. Press refresh to see changes."
"id_prompt" = "🔑 Default ID: {{ .ClientId }}\n\nEnter your id." "id_prompt" = "🔑 Default ID: {{ .ClientId }}\n\nEnter your id."
"pass_prompt" = "🔑 Default Password: {{ .ClientPassword }}\n\nEnter your password." "pass_prompt" = "🔑 Default Password: {{ .ClientPassword }}\n\nEnter your password."
"email_prompt" = "📧 Default Email: {{ .ClientEmail }}\n\nEnter your email." "email_prompt" = "📧 Default Email: {{ .ClientEmail }}\n\nEnter your email."
@ -596,7 +596,8 @@
"client_data_pass" = "🔑 Password: {{ .ClientPass }}\n📧 Email: {{ .ClientEmail }}\n💬 Comment: {{ .ClientComment }}\n\nYou can add the client to inbound now!" "client_data_pass" = "🔑 Password: {{ .ClientPass }}\n📧 Email: {{ .ClientEmail }}\n💬 Comment: {{ .ClientComment }}\n\nYou can add the client to inbound now!"
"cancel" = "❌ Process Canceled! \n\nYou can /start again anytime. 🔄" "cancel" = "❌ Process Canceled! \n\nYou can /start again anytime. 🔄"
"error_add_client" = "⚠️ Error:\n\n {{ .error }}" "error_add_client" = "⚠️ Error:\n\n {{ .error }}"
"success_add_client" = "🏆 Success! \nYou can now modify it using the 'All Clients' inline button." "using_default_value" = "Okay, I'll stick with the default value. 😊"
"incorrect_input" ="Your input is not valid.\nThe phrases should be continuous without spaces.\nCorrect example: aaaaaa\nIncorrect example: aaa aaa 🚫"
[tgbot.buttons] [tgbot.buttons]
"closeKeyboard" = "❌ Close Keyboard" "closeKeyboard" = "❌ Close Keyboard"
@ -635,7 +636,10 @@
"addClient" = "Add Client" "addClient" = "Add Client"
"submitDisable" = "Submit As Disable ✅" "submitDisable" = "Submit As Disable ✅"
"use_default" = "🏷️ Use default" "use_default" = "🏷️ Use default"
"change_default" = "🔄⚙️ Change Default" "change_id" = "⚙️🔑 ID"
"change_password" = "⚙️🔑 Password"
"change_email" = "⚙️📧 Email"
"change_comment" = "⚙️💬 Comment"
[tgbot.answers] [tgbot.answers]
"successfulOperation" = "✅ Operation successful!" "successfulOperation" = "✅ Operation successful!"

View file

@ -584,21 +584,22 @@
"yes" = "✅ Sí" "yes" = "✅ Sí"
"no" = "❌ No" "no" = "❌ No"
"received_id" = "🔑📥 ID recibido: {{ .ClientId }}" "received_id" = "🔑📥 ID actualizada. Pulsa refrescar para ver los cambios."
"received_password" = "🔑📥 Contraseña recibida: {{ .ClientPass }}" "received_password" = "🔑📥 Contraseña actualizada. Pulsa refrescar para ver los cambios."
"received_email" = "📧📥 Correo electrónico recibido: {{ .ClientEmail }}" "received_email" = "📧📥 Correo electrónico actualizado. Pulsa refrescar para ver los cambios."
"received_comment" = "💬📥 Comentario recibido: {{ .ClientComment }}" "received_comment" = "💬📥 Comentario actualizado. Pulsa refrescar para ver los cambios."
"id_prompt" = "🔑 ID predeterminado: {{ .ClientId }}\n\nIntroduce tu ID." "id_prompt" = "🔑 ID predeterminado: {{ .ClientId }}\n\nIntroduce tu ID."
"pass_prompt" = "🔑 Contraseña predeterminada: {{ .ClientPassword }}\n\nIntroduce tu contraseña." "pass_prompt" = "🔑 Contraseña predeterminada: {{ .ClientPassword }}\n\nIntroduce tu contraseña."
"email_prompt" = "📧 Correo electrónico predeterminado: {{ .ClientEmail }}\n\nIntroduce tu correo electrónico." "email_prompt" = "📧 Correo electrónico predeterminado: {{ .ClientEmail }}\n\nIntroduce tu correo electrónico."
"comment_prompt" = "💬 Comentario predeterminado: {{ .ClientComment }}\n\nIntroduce tu comentario." "comment_prompt" = "💬 Comentario predeterminado: {{ .ClientComment }}\n\nIntroduce tu comentario."
"inbound_client_data_id" = "🔄 Inbound: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 Correo electrónico: {{ .ClientEmail }}\n💬 Comentario: {{ .ClientComment }}\n\n¡Ahora puedes agregar al cliente a inbound!" "inbound_client_data_id" = "🔄 Entrada: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 Correo electrónico: {{ .ClientEmail }}\n💬 Comentario: {{ .ClientComment }}\n\n¡Puedes añadir el cliente a la entrada ahora!"
"inbound_client_data_pass" = "🔄 Inbound: {{ .InboundRemark }}\n\n🔑 Contraseña: {{ .ClientPass }}\n📧 Correo electrónico: {{ .ClientEmail }}\n💬 Comentario: {{ .ClientComment }}\n\n¡Ahora puedes agregar al cliente a inbound!" "inbound_client_data_pass" = "🔄 Entrada: {{ .InboundRemark }}\n\n🔑 Contraseña: {{ .ClientPass }}\n📧 Correo electrónico: {{ .ClientEmail }}\n💬 Comentario: {{ .ClientComment }}\n\n¡Puedes añadir el cliente a la entrada ahora!"
"client_data_id" = "🔑 ID: {{ .ClientId }}\n📧 Correo electrónico: {{ .ClientEmail }}\n💬 Comentario: {{ .ClientComment }}\n\n¡Ahora puedes agregar al cliente a inbound!" "client_data_id" = "🔑 ID: {{ .ClientId }}\n📧 Correo electrónico: {{ .ClientEmail }}\n💬 Comentario: {{ .ClientComment }}\n\n¡Puedes añadir el cliente a la entrada ahora!"
"client_data_pass" = "🔑 Contraseña: {{ .ClientPass }}\n📧 Correo electrónico: {{ .ClientEmail }}\n💬 Comentario: {{ .ClientComment }}\n\n¡Ahora puedes agregar al cliente a inbound!" "client_data_pass" = "🔑 Contraseña: {{ .ClientPass }}\n📧 Correo electrónico: {{ .ClientEmail }}\n💬 Comentario: {{ .ClientComment }}\n\n¡Puedes añadir el cliente a la entrada ahora!"
"cancel" = "❌ ¡Proceso cancelado! \n\nPuedes usar /start en cualquier momento. 🔄" "cancel" = "❌ ¡Proceso cancelado! \n\nPuedes /start nuevamente en cualquier momento. 🔄"
"error_add_client" = "⚠️ Error:\n\n {{ .error }}" "error_add_client" = "⚠️ Error:\n\n {{ .error }}"
"success_add_client" = "🏆 ¡Éxito! \nAhora puedes modificarlo usando el botón en línea 'Todos los Clientes'." "using_default_value" = "Está bien, usaré el valor predeterminado. 😊"
"incorrect_input" = "Tu entrada no es válida.\nLas frases deben ser continuas sin espacios.\nEjemplo correcto: aaaaaa\nEjemplo incorrecto: aaa aaa 🚫"
[tgbot.buttons] [tgbot.buttons]
@ -637,8 +638,12 @@
"addClient" = "Añadir Cliente" "addClient" = "Añadir Cliente"
"submitDisable" = "Enviar como Deshabilitado ✅" "submitDisable" = "Enviar como Deshabilitado ✅"
"use_default" = "🏷️ Usar por defecto" "use_default" = "🏷️ Usar predeterminado"
"change_default" = "🔄⚙️ Cambiar por defecto" "change_id" = "⚙️🔑 ID"
"change_password" = "⚙️🔑 Contraseña"
"change_email" = "⚙️📧 Correo electrónico"
"change_comment" = "⚙️💬 Comentario"
[tgbot.answers] [tgbot.answers]
"successfulOperation" = "✅ ¡Exitosa!" "successfulOperation" = "✅ ¡Exitosa!"

View file

@ -584,21 +584,23 @@
"yes" = "✅ بله" "yes" = "✅ بله"
"no" = "❌ خیر" "no" = "❌ خیر"
"received_id" = "🔑📥 شناسه دریافت شده: {{ .ClientId }}" "received_id" = "🔑📥 ID به‌روزرسانی شد. لطفاً برای مشاهده تغییرات، دکمه رفرش را فشار دهید."
"received_password" = "🔑📥 رمز عبور دریافت شده: {{ .ClientPass }}" "received_password" = "🔑📥 رمز عبور به‌روزرسانی شد. لطفاً برای مشاهده تغییرات، دکمه رفرش را فشار دهید."
"received_email" = "📧📥 ایمیل دریافت شده: {{ .ClientEmail }}" "received_email" = "📧📥 ایمیل به‌روزرسانی شد. لطفاً برای مشاهده تغییرات، دکمه رفرش را فشار دهید."
"received_comment" = "💬📥 نظر دریافت شده: {{ .ClientComment }}" "received_comment" = "💬📥 نظر به‌روزرسانی شد. لطفاً برای مشاهده تغییرات، دکمه رفرش را فشار دهید."
"id_prompt" = "🔑 شناسه پیش‌فرض: {{ .ClientId }}\n\nشناسه خود را وارد کنید." "id_prompt" = "🔑 ID پیش‌فرض: {{ .ClientId }}\n\nلطفاً ID خود را وارد کنید."
"pass_prompt" = "🔑 رمز عبور پیش‌فرض: {{ .ClientPassword }}\n\nرمز عبور خود را وارد کنید." "pass_prompt" = "🔑 رمز عبور پیش‌فرض: {{ .ClientPassword }}\n\nلطفاً رمز عبور خود را وارد کنید."
"email_prompt" = "📧 ایمیل پیش‌فرض: {{ .ClientEmail }}\n\nایمیل خود را وارد کنید." "email_prompt" = "📧 ایمیل پیش‌فرض: {{ .ClientEmail }}\n\nلطفاً ایمیل خود را وارد کنید."
"comment_prompt" = "💬 نظر پیش‌فرض: {{ .ClientComment }}\n\nنظر خود را وارد کنید." "comment_prompt" = "💬 نظر پیش‌فرض: {{ .ClientComment }}\n\nلطفاً نظر خود را وارد کنید."
"inbound_client_data_id" = "🔄 ورودی: {{ .InboundRemark }}\n\n🔑 شناسه: {{ .ClientId }}\n📧 ایمیل: {{ .ClientEmail }}\n💬 نظر: {{ .ClientComment }}\n\nاکنون می‌توانید مشتری را به ورودی اضافه کنید!" "inbound_client_data_id" = "🔄 ورودی: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 ایمیل: {{ .ClientEmail }}\n💬 نظر: {{ .ClientComment }}\n\nشما می‌توانید مشتری را به ورودی اضافه کنید!"
"inbound_client_data_pass" = "🔄 ورودی: {{ .InboundRemark }}\n\n🔑 رمز عبور: {{ .ClientPass }}\n📧 ایمیل: {{ .ClientEmail }}\n💬 نظر: {{ .ClientComment }}\n\nاکنون می‌توانید مشتری را به ورودی اضافه کنید!" "inbound_client_data_pass" = "🔄 ورودی: {{ .InboundRemark }}\n\n🔑 رمز عبور: {{ .ClientPass }}\n📧 ایمیل: {{ .ClientEmail }}\n💬 نظر: {{ .ClientComment }}\n\nشما می‌توانید مشتری را به ورودی اضافه کنید!"
"client_data_id" = "🔑 شناسه: {{ .ClientId }}\n📧 ایمیل: {{ .ClientEmail }}\n💬 نظر: {{ .ClientComment }}\n\nاکنون می‌توانید مشتری را به ورودی اضافه کنید!" "client_data_id" = "🔑 ID: {{ .ClientId }}\n📧 ایمیل: {{ .ClientEmail }}\n💬 نظر: {{ .ClientComment }}\n\nشما می‌توانید مشتری را به ورودی اضافه کنید!"
"client_data_pass" = "🔑 رمز عبور: {{ .ClientPass }}\n📧 ایمیل: {{ .ClientEmail }}\n💬 نظر: {{ .ClientComment }}\n\nاکنون می‌توانید مشتری را به ورودی اضافه کنید!" "client_data_pass" = "🔑 رمز عبور: {{ .ClientPass }}\n📧 ایمیل: {{ .ClientEmail }}\n💬 نظر: {{ .ClientComment }}\n\nشما می‌توانید مشتری را به ورودی اضافه کنید!"
"cancel" = "❌ فرایند لغو شد! \n\nشما می‌توانید هر زمان که خواستید /start را اجرا کنید. 🔄" "cancel" = "❌ فرایند لغو شد! \n\nشما می‌توانید هر زمان با /start دوباره شروع کنید. 🔄"
"error_add_client" = "⚠️ خطا:\n\n {{ .error }}" "error_add_client" = "⚠️ خطا:\n\n {{ .error }}"
"success_add_client" = "🏆 موفقیت! اکنون می‌توانید آن را از طریق دکمه 'همه مشتریان' ویرایش کنید." "using_default_value" = "باشه، من با مقدار پیش‌فرض ادامه میدم. 😊"
"incorrect_input" = "ورودی شما نامعتبر است.\nعبارات باید پیوسته باشند بدون فاصله.\nمثال صحیح: aaaaaa\nمثال غلط: aaa aaa 🚫"
[tgbot.buttons] [tgbot.buttons]
@ -635,10 +637,14 @@
"getBanLogs" = "گزارش های بلوک را دریافت کنید" "getBanLogs" = "گزارش های بلوک را دریافت کنید"
"allClients" = "همه مشتریان" "allClients" = "همه مشتریان"
"addClient" = "افزودن مشتری" "addClient" = "اضافه کردن مشتری"
"submitDisable" = "ارسال به عنوان غیرفعال ✅" "submitDisable" = "ارسال به عنوان غیرفعال ✅"
"use_default" = "🏷️ استفاده از پیش‌فرض" "use_default" = "🏷️ استفاده از پیش‌فرض"
"change_default" = "🔄⚙️ تغییر پیش‌فرض" "change_id" = "⚙️🔑 شناسه"
"change_password" = "⚙️🔑 رمز عبور"
"change_email" = "⚙️📧 ایمیل"
"change_comment" = "⚙️💬 نظر"
[tgbot.answers] [tgbot.answers]
"successfulOperation" = "✅ انجام شد!" "successfulOperation" = "✅ انجام شد!"

View file

@ -583,22 +583,22 @@
"yes" = "✅ Ya" "yes" = "✅ Ya"
"no" = "❌ Tidak" "no" = "❌ Tidak"
"received_id" = "🔑📥 ID diperbarui. Tekan refresh untuk melihat perubahan."
"received_id" = "🔑📥 ID yang diterima: {{ .ClientId }}" "received_password" = "🔑📥 Kata sandi diperbarui. Tekan refresh untuk melihat perubahan."
"received_password" = "🔑📥 Kata sandi yang diterima: {{ .ClientPass }}" "received_email" = "📧📥 Email diperbarui. Tekan refresh untuk melihat perubahan."
"received_email" = "📧📥 Email yang diterima: {{ .ClientEmail }}" "received_comment" = "💬📥 Komentar diperbarui. Tekan refresh untuk melihat perubahan."
"received_comment" = "💬📥 Komentar yang diterima: {{ .ClientComment }}" "id_prompt" = "🔑 ID default: {{ .ClientId }}\n\nMasukkan ID Anda."
"id_prompt" = "🔑 ID Default: {{ .ClientId }}\n\nMasukkan ID Anda." "pass_prompt" = "🔑 Kata sandi default: {{ .ClientPassword }}\n\nMasukkan kata sandi Anda."
"pass_prompt" = "🔑 Kata Sandi Default: {{ .ClientPassword }}\n\nMasukkan kata sandi Anda." "email_prompt" = "📧 Email default: {{ .ClientEmail }}\n\nMasukkan email Anda."
"email_prompt" = "📧 Email Default: {{ .ClientEmail }}\n\nMasukkan email Anda." "comment_prompt" = "💬 Komentar default: {{ .ClientComment }}\n\nMasukkan komentar Anda."
"comment_prompt" = "💬 Komentar Default: {{ .ClientComment }}\n\nMasukkan komentar Anda." "inbound_client_data_id" = "🔄 Masuk: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 Email: {{ .ClientEmail }}\n💬 Komentar: {{ .ClientComment }}\n\nSekarang Anda dapat menambahkan klien ke inbound!"
"inbound_client_data_id" = "🔄 Masuk: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 Email: {{ .ClientEmail }}\n💬 Komentar: {{ .ClientComment }}\n\nAnda dapat menambahkan klien ke inbound sekarang!" "inbound_client_data_pass" = "🔄 Masuk: {{ .InboundRemark }}\n\n🔑 Kata sandi: {{ .ClientPass }}\n📧 Email: {{ .ClientEmail }}\n💬 Komentar: {{ .ClientComment }}\n\nSekarang Anda dapat menambahkan klien ke inbound!"
"inbound_client_data_pass" = "🔄 Masuk: {{ .InboundRemark }}\n\n🔑 Kata Sandi: {{ .ClientPass }}\n📧 Email: {{ .ClientEmail }}\n💬 Komentar: {{ .ClientComment }}\n\nAnda dapat menambahkan klien ke inbound sekarang!" "client_data_id" = "🔑 ID: {{ .ClientId }}\n📧 Email: {{ .ClientEmail }}\n💬 Komentar: {{ .ClientComment }}\n\nSekarang Anda dapat menambahkan klien ke inbound!"
"client_data_id" = "🔑 ID: {{ .ClientId }}\n📧 Email: {{ .ClientEmail }}\n💬 Komentar: {{ .ClientComment }}\n\nAnda dapat menambahkan klien ke inbound sekarang!" "client_data_pass" = "🔑 Kata sandi: {{ .ClientPass }}\n📧 Email: {{ .ClientEmail }}\n💬 Komentar: {{ .ClientComment }}\n\nSekarang Anda dapat menambahkan klien ke inbound!"
"client_data_pass" = "🔑 Kata Sandi: {{ .ClientPass }}\n📧 Email: {{ .ClientEmail }}\n💬 Komentar: {{ .ClientComment }}\n\nAnda dapat menambahkan klien ke inbound sekarang!" "cancel" = "❌ Proses dibatalkan! \n\nAnda dapat /start kapan saja. 🔄"
"cancel" = "❌ Proses Dibatalkan! \n\nAnda dapat memulai lagi kapan saja dengan /start. 🔄"
"error_add_client" = "⚠️ Kesalahan:\n\n {{ .error }}" "error_add_client" = "⚠️ Kesalahan:\n\n {{ .error }}"
"success_add_client" = "🏆 Berhasil! \nSekarang Anda dapat mengeditnya menggunakan tombol 'Semua Klien'." "using_default_value" = "Baik, saya akan tetap dengan nilai default. 😊"
"incorrect_input" = "Input Anda tidak valid.\nFrasa harus berurutan tanpa spasi.\nContoh yang benar: aaaaaa\nContoh yang salah: aaa aaa 🚫"
[tgbot.buttons] [tgbot.buttons]
@ -637,8 +637,12 @@
"addClient" = "Tambah Klien" "addClient" = "Tambah Klien"
"submitDisable" = "Kirim Sebagai Nonaktif ✅" "submitDisable" = "Kirim Sebagai Nonaktif ✅"
"use_default" = "🏷️ Gunakan Default" "use_default" = "🏷️ Gunakan default"
"change_default" = "🔄⚙️ Ubah Default" "change_id" = "⚙️🔑 ID"
"change_password" = "⚙️🔑 Kata Sandi"
"change_email" = "⚙️📧 Email"
"change_comment" = "⚙️💬 Komentar"
[tgbot.answers] [tgbot.answers]
"successfulOperation" = "✅ Operasi berhasil!" "successfulOperation" = "✅ Operasi berhasil!"

View file

@ -584,21 +584,22 @@
"yes" = "✅ はい" "yes" = "✅ はい"
"no" = "❌ いいえ" "no" = "❌ いいえ"
"received_id" = "🔑📥 受信したID: {{ .ClientId }}" "received_id" = "🔑📥 IDが更新されました。変更を見るにはリフレッシュを押してください。"
"received_password" = "🔑📥 受信したパスワード: {{ .ClientPass }}" "received_password" = "🔑📥 パスワードが更新されました。変更を見るにはリフレッシュを押してください。"
"received_email" = "📧📥 受信したメール: {{ .ClientEmail }}" "received_email" = "📧📥 メールが更新されました。変更を見るにはリフレッシュを押してください。"
"received_comment" = "💬📥 受信したコメント: {{ .ClientComment }}" "received_comment" = "💬📥 コメントが更新されました。変更を見るにはリフレッシュを押してください。"
"id_prompt" = "🔑 デフォルトID: {{ .ClientId }}\n\nIDを入力してください。" "id_prompt" = "🔑 デフォルトID: {{ .ClientId }}\n\nIDを入力してください。"
"pass_prompt" = "🔑 デフォルトパスワード: {{ .ClientPassword }}\n\nパスワードを入力してください。" "pass_prompt" = "🔑 デフォルトパスワード: {{ .ClientPassword }}\n\nパスワードを入力してください。"
"email_prompt" = "📧 デフォルトメール: {{ .ClientEmail }}\n\nメールアドレスを入力してください。" "email_prompt" = "📧 デフォルトメール: {{ .ClientEmail }}\n\nメールアドレスを入力してください。"
"comment_prompt" = "💬 デフォルトコメント: {{ .ClientComment }}\n\nコメントを入力してください。" "comment_prompt" = "💬 デフォルトコメント: {{ .ClientComment }}\n\nコメントを入力してください。"
"inbound_client_data_id" = "🔄 インバウンド: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 メール: {{ .ClientEmail }}\n💬 コメント: {{ .ClientComment }}\n\n今すぐクライアントをインバウンドに追加できます" "inbound_client_data_id" = "🔄 インバウンド: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 メール: {{ .ClientEmail }}\n💬 コメント: {{ .ClientComment }}\n\n今すぐクライアントをインバウンドに追加できます"
"inbound_client_data_pass" = "🔄 インバウンド: {{ .InboundRemark }}\n\n🔑 パスワード: {{ .ClientPass }}\n📧 メール: {{ .ClientEmail }}\n💬 コメント: {{ .ClientComment }}\n\n今すぐクライアントをインバウンドに追加できます" "inbound_client_data_pass" = "🔄 インバウンド: {{ .InboundRemark }}\n\n🔑 パスワード: {{ .ClientPass }}\n📧 メール: {{ .ClientEmail }}\n💬 コメント: {{ .ClientComment }}\n\n今すぐクライアントをインバウンドに追加できます"
"client_data_id" = "🔑 ID: {{ .ClientId }}\n📧 メール: {{ .ClientEmail }}\n💬 コメント: {{ .ClientComment }}\n\n今すぐクライアントをインバウンドに追加できます" "client_data_id" = "🔑 ID: {{ .ClientId }}\n📧 メール: {{ .ClientEmail }}\n💬 コメント: {{ .ClientComment }}\n\n今すぐクライアントをインバウンドに追加できます"
"client_data_pass" = "🔑 パスワード: {{ .ClientPass }}\n📧 メール: {{ .ClientEmail }}\n💬 コメント: {{ .ClientComment }}\n\n今すぐクライアントをインバウンドに追加できます" "client_data_pass" = "🔑 パスワード: {{ .ClientPass }}\n📧 メール: {{ .ClientEmail }}\n💬 コメント: {{ .ClientComment }}\n\n今すぐクライアントをインバウンドに追加できます"
"cancel" = "❌ プロセスがキャンセルされました!\n\nいつでも /start を使用できます。 🔄" "cancel" = "❌ 処理がキャンセルされました! \n\nいつでも/startを使用して再開できます。 🔄"
"error_add_client" = "⚠️ エラー:\n\n {{ .error }}" "error_add_client" = "⚠️ エラー:\n\n {{ .error }}"
"success_add_client" = "🏆 成功!\n「すべてのクライアント」ボタンを使用して、編集できます。" "using_default_value" = "わかりました、デフォルト値を使用します。😊"
"incorrect_input" = "入力が無効です。\nフレーズはスペースなしで連続している必要があります。\n正しい例: aaaaaa\n間違った例: aaa aaa 🚫"
[tgbot.buttons] [tgbot.buttons]
@ -638,7 +639,11 @@
"addClient" = "クライアントを追加" "addClient" = "クライアントを追加"
"submitDisable" = "無効として送信 ✅" "submitDisable" = "無効として送信 ✅"
"use_default" = "🏷️ デフォルトを使用" "use_default" = "🏷️ デフォルトを使用"
"change_default" = "🔄⚙️ デフォルトを変更" "change_id" = "⚙️🔑 ID"
"change_password" = "⚙️🔑 パスワード"
"change_email" = "⚙️📧 メール"
"change_comment" = "⚙️💬 コメント"
[tgbot.answers] [tgbot.answers]
"successfulOperation" = "✅ 成功!" "successfulOperation" = "✅ 成功!"

View file

@ -584,21 +584,22 @@
"yes" = "✅ Sim" "yes" = "✅ Sim"
"no" = "❌ Não" "no" = "❌ Não"
"received_id" = "🔑📥 ID recebido: {{ .ClientId }}" "received_id" = "🔑📥 ID atualizado. Pressione atualizar para ver as mudanças."
"received_password" = "🔑📥 Senha recebida: {{ .ClientPass }}" "received_password" = "🔑📥 Senha atualizada. Pressione atualizar para ver as mudanças."
"received_email" = "📧📥 E-mail recebido: {{ .ClientEmail }}" "received_email" = "📧📥 Email atualizado. Pressione atualizar para ver as mudanças."
"received_comment" = "💬📥 Comentário recebido: {{ .ClientComment }}" "received_comment" = "💬📥 Comentário atualizado. Pressione atualizar para ver as mudanças."
"id_prompt" = "🔑 ID padrão: {{ .ClientId }}\n\nDigite seu ID." "id_prompt" = "🔑 ID padrão: {{ .ClientId }}\n\nDigite seu ID."
"pass_prompt" = "🔑 Senha padrão: {{ .ClientPassword }}\n\nDigite sua senha." "pass_prompt" = "🔑 Senha padrão: {{ .ClientPassword }}\n\nDigite sua senha."
"email_prompt" = "📧 E-mail padrão: {{ .ClientEmail }}\n\nDigite seu e-mail." "email_prompt" = "📧 Email padrão: {{ .ClientEmail }}\n\nDigite seu email."
"comment_prompt" = "💬 Comentário padrão: {{ .ClientComment }}\n\nDigite seu comentário." "comment_prompt" = "💬 Comentário padrão: {{ .ClientComment }}\n\nDigite seu comentário."
"inbound_client_data_id" = "🔄 Entrada: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 E-mail: {{ .ClientEmail }}\n💬 Comentário: {{ .ClientComment }}\n\nAgora você pode adicionar o cliente à entrada!" "inbound_client_data_id" = "🔄 Entrada: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 Email: {{ .ClientEmail }}\n💬 Comentário: {{ .ClientComment }}\n\nVocê pode adicionar o cliente à entrada agora!"
"inbound_client_data_pass" = "🔄 Entrada: {{ .InboundRemark }}\n\n🔑 Senha: {{ .ClientPass }}\n📧 E-mail: {{ .ClientEmail }}\n💬 Comentário: {{ .ClientComment }}\n\nAgora você pode adicionar o cliente à entrada!" "inbound_client_data_pass" = "🔄 Entrada: {{ .InboundRemark }}\n\n🔑 Senha: {{ .ClientPass }}\n📧 Email: {{ .ClientEmail }}\n💬 Comentário: {{ .ClientComment }}\n\nVocê pode adicionar o cliente à entrada agora!"
"client_data_id" = "🔑 ID: {{ .ClientId }}\n📧 E-mail: {{ .ClientEmail }}\n💬 Comentário: {{ .ClientComment }}\n\nAgora você pode adicionar o cliente à entrada!" "client_data_id" = "🔑 ID: {{ .ClientId }}\n📧 Email: {{ .ClientEmail }}\n💬 Comentário: {{ .ClientComment }}\n\nVocê pode adicionar o cliente à entrada agora!"
"client_data_pass" = "🔑 Senha: {{ .ClientPass }}\n📧 E-mail: {{ .ClientEmail }}\n💬 Comentário: {{ .ClientComment }}\n\nAgora você pode adicionar o cliente à entrada!" "client_data_pass" = "🔑 Senha: {{ .ClientPass }}\n📧 Email: {{ .ClientEmail }}\n💬 Comentário: {{ .ClientComment }}\n\nVocê pode adicionar o cliente à entrada agora!"
"cancel" = "❌ Processo cancelado! \n\nVocê pode usar /start a qualquer momento. 🔄" "cancel" = "❌ Processo cancelado! \n\nVocê pode /start novamente a qualquer momento. 🔄"
"error_add_client" = "⚠️ Erro:\n\n {{ .error }}" "error_add_client" = "⚠️ Erro:\n\n {{ .error }}"
"success_add_client" = "🏆 Sucesso! \nAgora você pode editá-lo usando o botão 'Todos os Clientes'." "using_default_value" = "Ok, vou manter o valor padrão. 😊"
"incorrect_input" = "Sua entrada não é válida.\nAs frases devem ser contínuas sem espaços.\nExemplo correto: aaaaaa\nExemplo incorreto: aaa aaa 🚫"
[tgbot.buttons] [tgbot.buttons]
@ -638,7 +639,11 @@
"addClient" = "Adicionar Cliente" "addClient" = "Adicionar Cliente"
"submitDisable" = "Enviar como Desativado ✅" "submitDisable" = "Enviar como Desativado ✅"
"use_default" = "🏷️ Usar padrão" "use_default" = "🏷️ Usar padrão"
"change_default" = "🔄⚙️ Alterar Padrão" "change_id" = "⚙️🔑 ID"
"change_password" = "⚙️🔑 Senha"
"change_email" = "⚙️📧 E-mail"
"change_comment" = "⚙️💬 Comentário"
[tgbot.answers] [tgbot.answers]
"successfulOperation" = "✅ Operação bem-sucedida!" "successfulOperation" = "✅ Operação bem-sucedida!"

View file

@ -29,7 +29,7 @@
"copySuccess" = "Скопировано" "copySuccess" = "Скопировано"
"sure" = "Да" "sure" = "Да"
"encryption" = "Шифрование" "encryption" = "Шифрование"
"transmission" = "Протокол передачи" "transmission" = "Протокол"
"host" = "Хост" "host" = "Хост"
"path" = "Путь" "path" = "Путь"
"camouflage" = "Маскировка" "camouflage" = "Маскировка"
@ -67,11 +67,11 @@
"emptyReverseDesc" = "Нет добавленных обратных прокси." "emptyReverseDesc" = "Нет добавленных обратных прокси."
[menu] [menu]
"theme" = "Тема" "theme" = "Тема оформления"
"dark" = "Темная" "dark" = "Темная"
"ultraDark" = "Ультра темная" "ultraDark" = "Ультра темная"
"dashboard" = "Статус системы" "dashboard" = "Статус системы"
"inbounds" = "Подключения" "inbounds" = "Входящие подключения"
"settings" = "Настройки панели" "settings" = "Настройки панели"
"xray" = "Настройки Xray" "xray" = "Настройки Xray"
"logout" = "Выход" "logout" = "Выход"
@ -116,7 +116,7 @@
"xraySwitchVersionDialog" = "Переключить версию Xray" "xraySwitchVersionDialog" = "Переключить версию Xray"
"xraySwitchVersionDialogDesc" = "Вы точно хотите сменить версию Xray?" "xraySwitchVersionDialogDesc" = "Вы точно хотите сменить версию Xray?"
"dontRefresh" = "Установка в процессе. Не обновляйте страницу" "dontRefresh" = "Установка в процессе. Не обновляйте страницу"
"logs" = "Логи" "logs" = "Журнал"
"config" = "Конфигурация" "config" = "Конфигурация"
"backup" = "Резервная копия" "backup" = "Резервная копия"
"backupTitle" = "База данных резервных копий" "backupTitle" = "База данных резервных копий"
@ -126,10 +126,10 @@
"importDatabaseDesc" = "Нажмите, чтобы выбрать и загрузить файл .db с вашего устройства для восстановления базы данных из резервной копии." "importDatabaseDesc" = "Нажмите, чтобы выбрать и загрузить файл .db с вашего устройства для восстановления базы данных из резервной копии."
[pages.inbounds] [pages.inbounds]
"title" = "Подключения" "title" = "Входящие подключения"
"totalDownUp" = "Общий объем отправленного/полученного трафика" "totalDownUp" = "Объем отправленного/полученного трафика"
"totalUsage" = "Всего использовано" "totalUsage" = "Всего использовано"
"inboundCount" = "Количество подключений" "inboundCount" = "Всего входящих подключений"
"operate" = "Меню" "operate" = "Меню"
"enable" = "Включить" "enable" = "Включить"
"remark" = "Примечание" "remark" = "Примечание"
@ -139,20 +139,20 @@
"details" = "Подробнее" "details" = "Подробнее"
"transportConfig" = "Транспорт" "transportConfig" = "Транспорт"
"expireDate" = "Дата окончания" "expireDate" = "Дата окончания"
"resetTraffic" = "Сбросить трафик" "resetTraffic" = "Сброс статистики трафика"
"addInbound" = "Добавить подключение" "addInbound" = "Создать входящее подключение"
"generalActions" = "Общие действия" "generalActions" = "Общие действия"
"autoRefresh" = "Автообновление" "autoRefresh" = "Автообновление"
"autoRefreshInterval" = "Интервал" "autoRefreshInterval" = "Интервал"
"create" = "Создать" "create" = "Создать"
"update" = "Обновить" "update" = "Обновить"
"modifyInbound" = "Изменить подключение" "modifyInbound" = "Изменить входящее подключение"
"deleteInbound" = "Удалить подключение" "deleteInbound" = "Удалить входящее подключение"
"deleteInboundContent" = "Вы уверены, что хотите удалить подключение?" "deleteInboundContent" = "Вы уверены, что хотите удалить входящее подключение?"
"deleteClient" = "Удалить клиента" "deleteClient" = "Удалить клиента"
"deleteClientContent" = "Вы уверены, что хотите удалить клиента?" "deleteClientContent" = "Вы уверены, что хотите удалить клиента?"
"resetTrafficContent" = "Вы уверены, что хотите сбросить трафик?" "resetTrafficContent" = "Вы уверены, что хотите сбросить трафик?"
"copyLink" = "Копировать ключ" "copyLink" = "Копировать ссылку"
"address" = "Адрес" "address" = "Адрес"
"network" = "Сеть" "network" = "Сеть"
"destinationPort" = "Порт назначения" "destinationPort" = "Порт назначения"
@ -162,36 +162,36 @@
"totalFlow" = "Общий расход" "totalFlow" = "Общий расход"
"leaveBlankToNeverExpire" = "Оставьте пустым, чтобы не истекало" "leaveBlankToNeverExpire" = "Оставьте пустым, чтобы не истекало"
"noRecommendKeepDefault" = "Рекомендуется оставить настройки по умолчанию" "noRecommendKeepDefault" = "Рекомендуется оставить настройки по умолчанию"
"certificatePath" = "Путь к файлу" "certificatePath" = "Путь к сертификату"
"certificateContent" = "Содержимое файла" "certificateContent" = "Содержимое сертификата"
"publicKey" = "Публичный ключ" "publicKey" = "Публичный ключ"
"privatekey" = "Закрытый ключ" "privatekey" = "Закрытый ключ"
"clickOnQRcode" = "Нажмите на QR-код, чтобы скопировать" "clickOnQRcode" = "Нажмите на QR-код, чтобы скопировать"
"client" = "Клиент" "client" = "Клиент"
"export" = "Экспорт ключей" "export" = "Экспорт ссылок"
"clone" = "Клонировать" "clone" = "Клонировать"
"cloneInbound" = "Клонировать" "cloneInbound" = "Клонировать"
"cloneInboundContent" = "Будут клонированы все настройки подключений, за исключением списка клиентов, порта и IP-адреса прослушивания" "cloneInboundContent" = "Будут клонированы все настройки входящих подключений, за исключением списка клиентов, порта и IP-адреса прослушивания"
"cloneInboundOk" = "Клонировано" "cloneInboundOk" = "Клонировано"
"resetAllTraffic" = "Сбросить трафик всех подключений" "resetAllTraffic" = "Сброс статистики всего трафика"
"resetAllTrafficTitle" = "Сброс трафика всех подключений" "resetAllTrafficTitle" = "Сброс трафика всех подключений"
"resetAllTrafficContent" = "Вы уверены, что хотите сбросить трафик всех подключений?" "resetAllTrafficContent" = "Вы уверены, что хотите сбросить трафик всех входящих подключений?"
"resetInboundClientTraffics" = "Сбросить трафик пользователей" "resetInboundClientTraffics" = "Сброс входящего трафика клиента"
"resetInboundClientTrafficTitle" = "Сброс трафика пользователей" "resetInboundClientTrafficTitle" = "Сброс трафика клиентов"
"resetInboundClientTrafficContent" = "Вы уверены, что хотите сбросить весь трафик для этих пользователей?" "resetInboundClientTrafficContent" = "Вы уверены, что хотите сбросить весь трафик для этих клиентов?"
"resetAllClientTraffics" = "Сбросить трафик всех пользователей" "resetAllClientTraffics" = "Сброс трафик всех клиентов"
"resetAllClientTrafficTitle" = "Сброс трафика всех пользователей" "resetAllClientTrafficTitle" = "Сброс трафика всех клиентов"
"resetAllClientTrafficContent" = "Вы уверены, что хотите сбросить трафик всех пользователей?" "resetAllClientTrafficContent" = "Вы уверены, что хотите сбросить трафик всех клиентов?"
"delDepletedClients" = "Удалить отключенных пользователей" "delDepletedClients" = "Удалить отключенных клиентов"
"delDepletedClientsTitle" = "Удаление отключенных пользователей" "delDepletedClientsTitle" = "Удаление отключенных клиентов"
"delDepletedClientsContent" = "Вы уверены, что хотите удалить всех отключенных пользователей?" "delDepletedClientsContent" = "Вы уверены, что хотите удалить всех отключенных клиентов?"
"email" = "Email" "email" = "Email"
"emailDesc" = "Пожалуйста, укажите уникальный Email" "emailDesc" = "Пожалуйста, укажите уникальный Email"
"IPLimit" = "Лимит по IP" "IPLimit" = "Лимит по IP"
"IPLimitDesc" = "Ограничение количества подключений с одного IP (0 отключить)" "IPLimitDesc" = "Ограничение количества подключений с одного IP (0 отключить)"
"IPLimitlog" = "Лог IP-адресов" "IPLimitlog" = "Лог IP-адресов"
"IPLimitlogDesc" = "Лог IP-адресов (перед включением лога IP-адресов, вы должны очистить список)" "IPLimitlogDesc" = "Лог IP-адресов (перед включением лога IP-адресов, вы должны очистить список)"
"IPLimitlogclear" = "Очистить лог" "IPLimitlogclear" = "Очистить журнал"
"setDefaultCert" = "Установить сертификат с панели" "setDefaultCert" = "Установить сертификат с панели"
"telegramDesc" = "Пожалуйста, укажите ID чата Telegram. (используйте команду '/id' в боте) или (@userinfobot)" "telegramDesc" = "Пожалуйста, укажите ID чата Telegram. (используйте команду '/id' в боте) или (@userinfobot)"
"subscriptionDesc" = "Вы можете найти свою ссылку подписки в разделе 'Подробнее', также вы можете использовать одно и то же имя для нескольких конфигураций" "subscriptionDesc" = "Вы можете найти свою ссылку подписки в разделе 'Подробнее', также вы можете использовать одно и то же имя для нескольких конфигураций"
@ -200,14 +200,14 @@
"inboundData" = "Входящие данные" "inboundData" = "Входящие данные"
"exportInbound" = "Экспорт входящих" "exportInbound" = "Экспорт входящих"
"import" = "Импортировать" "import" = "Импортировать"
"importInbound" = "Импортировать подключение" "importInbound" = "Импорт входящего подключения"
[pages.client] [pages.client]
"add" = "Добавить пользователя" "add" = "Создать клиента"
"edit" = "Редактировать пользователя" "edit" = "Редактировать клиента"
"submitAdd" = "Добавить пользователя" "submitAdd" = "Добавить"
"submitEdit" = "Сохранить изменения" "submitEdit" = "Сохранить"
"clientCount" = "Количество пользователей" "clientCount" = "Количество клиентов"
"bulk" = "Добавить несколько" "bulk" = "Добавить несколько"
"method" = "Метод" "method" = "Метод"
"first" = "Первый" "first" = "Первый"
@ -344,12 +344,12 @@
"proxyAndServer" = "Прокси и сервер" "proxyAndServer" = "Прокси и сервер"
"intervals" = "Интервалы" "intervals" = "Интервалы"
"information" = "Информация" "information" = "Информация"
"language" = "Язык" "language" = "Язык интерфейса"
"telegramBotLanguage" = "Язык Telegram-бота" "telegramBotLanguage" = "Язык Telegram-бота"
[pages.xray] [pages.xray]
"title" = "Настройки Xray" "title" = "Настройки Xray"
"save" = "Сохранить настройки" "save" = "Сохранить"
"restart" = "Перезапустить Xray" "restart" = "Перезапустить Xray"
"basicTemplate" = "Базовый шаблон" "basicTemplate" = "Базовый шаблон"
"advancedTemplate" = "Расширенный шаблон" "advancedTemplate" = "Расширенный шаблон"
@ -358,16 +358,16 @@
"logConfigs" = "Журнал" "logConfigs" = "Журнал"
"logConfigsDesc" = "Логи могут замедлять работу сервера. Включайте только нужные вам виды логов при необходимости!" "logConfigsDesc" = "Логи могут замедлять работу сервера. Включайте только нужные вам виды логов при необходимости!"
"blockConfigs" = "Блокировка конфигураций" "blockConfigs" = "Блокировка конфигураций"
"blockConfigsDesc" = "Эти параметры не позволят пользователям подключаться к определенным протоколам и веб-сайтам" "blockConfigsDesc" = "Эти параметры не позволят клиентам подключаться к определенным протоколам и веб-сайтам"
"basicRouting" = "Базовые соединения" "basicRouting" = "Базовые соединения"
"blockConnectionsConfigsDesc" = "Эти параметры будут блокировать трафик в зависимости от запрашиваемой страны." "blockConnectionsConfigsDesc" = "Эти параметры будут блокировать трафик в зависимости от запрашиваемой страны."
"directConnectionsConfigsDesc" = "Прямое соединение гарантирует, что определенный трафик не будет перенаправлен через другой сервер." "directConnectionsConfigsDesc" = "Прямое соединение гарантирует, что определенный трафик не будет перенаправлен через другой сервер."
"blockips" = "Блокировать IP-адреса" "blockips" = "Заблокированные IP-адреса"
"blockdomains" = "Блокировать домены" "blockdomains" = "Заблокированные домены"
"directips" = "Прямые IP-адреса" "directips" = "Прямые IP-адреса"
"directdomains" = "Прямые домены" "directdomains" = "Прямые домены"
"ipv4Routing" = "Правила IPv4" "ipv4Routing" = "Правила IPv4"
"ipv4RoutingDesc" = "Эти параметры позволят пользователям маршрутизироваться к целевым доменам только через IPv4" "ipv4RoutingDesc" = "Эти параметры позволят клиентам маршрутизироваться к целевым доменам только через IPv4"
"warpRouting" = "Правила WARP" "warpRouting" = "Правила WARP"
"warpRoutingDesc" = "Внимание: перед использованием этих параметров установите WARP в режиме прокси-сервера socks5 на свой сервер, следуя инструкциям на GitHub панели. WARP будет направлять трафик на веб-сайты через серверы Cloudflare" "warpRoutingDesc" = "Внимание: перед использованием этих параметров установите WARP в режиме прокси-сервера socks5 на свой сервер, следуя инструкциям на GitHub панели. WARP будет направлять трафик на веб-сайты через серверы Cloudflare"
"Template" = "Шаблон конфигурации Xray" "Template" = "Шаблон конфигурации Xray"
@ -376,16 +376,16 @@
"FreedomStrategyDesc" = "Установка стратегии вывода сети в протоколе Freedom" "FreedomStrategyDesc" = "Установка стратегии вывода сети в протоколе Freedom"
"RoutingStrategy" = "Настройка стратегии маршрутизации доменов" "RoutingStrategy" = "Настройка стратегии маршрутизации доменов"
"RoutingStrategyDesc" = "Установка общей стратегии маршрутизации разрешения DNS" "RoutingStrategyDesc" = "Установка общей стратегии маршрутизации разрешения DNS"
"Torrent" = "Запрет использования BitTorrent" "Torrent" = "Заблокировать BitTorrent"
"TorrentDesc" = "Изменение шаблона конфигурации для предупреждения использования BitTorrent пользователями" "TorrentDesc" = "Запретить входящий/исходящий трафик, в котором фигурирует протокол BitTorrent"
"Family" = "Блокируйте вредоносное ПО и контент для взрослых" "Family" = "Семейный режим"
"FamilyDesc" = "DNS-преобразователи Cloudflare для блокировки вредоносного ПО и контента для взрослых в целях защиты семьи." "FamilyDesc" = "Использовать DNS-сервера Cloudflare для блокировки вредоносного ПО и контента для взрослых в целях защиты семьи."
"Inbounds" = "Входящие" "Inbounds" = "Входящее соединение"
"InboundsDesc" = "Изменение шаблона конфигурации для подключения определенных пользователей" "InboundsDesc" = "Изменение шаблона конфигурации для подключения определенных клиентов"
"Outbounds" = "Исходящие" "Outbounds" = "Исходящее соединение"
"Balancers" = "Балансировщик нагрузки" "Balancers" = "Балансировщик"
"OutboundsDesc" = "Изменение шаблона конфигурации, чтобы определить исходящие пути для этого сервера" "OutboundsDesc" = "Изменение шаблона конфигурации, чтобы определить исходящие пути для этого сервера"
"Routings" = "Правила маршрутизации" "Routings" = "Маршрутизация"
"RoutingsDesc" = "Важен приоритет каждого правила!" "RoutingsDesc" = "Важен приоритет каждого правила!"
"completeTemplate" = "Все" "completeTemplate" = "Все"
"logLevel" = "Уровень журнала" "logLevel" = "Уровень журнала"
@ -394,9 +394,9 @@
"accessLogDesc" = "Путь к файлу журнала доступа. Специальное значение «none» отключает журналы доступа." "accessLogDesc" = "Путь к файлу журнала доступа. Специальное значение «none» отключает журналы доступа."
"errorLog" = "Журнал ошибок" "errorLog" = "Журнал ошибок"
"errorLogDesc" = "Путь к файлу журнала ошибок. Специальное значение «none» отключает журналы ошибок." "errorLogDesc" = "Путь к файлу журнала ошибок. Специальное значение «none» отключает журналы ошибок."
"dnsLog" = "DNS Журнал" "dnsLog" = "Журнал DNS"
"dnsLogDesc" = "Включить логи запросов DNS" "dnsLogDesc" = "Включить логи запросов DNS"
"maskAddress" = "Маскировать Адрес" "maskAddress" = "Маскировка адреса"
"maskAddressDesc" = "При активации реальный IP-адрес заменяется на маскировочный в логах." "maskAddressDesc" = "При активации реальный IP-адрес заменяется на маскировочный в логах."
"statistics" = "Статистика" "statistics" = "Статистика"
"statsInboundUplink" = "Статистика входящего аплинка" "statsInboundUplink" = "Статистика входящего аплинка"
@ -411,23 +411,23 @@
[pages.xray.rules] [pages.xray.rules]
"first" = "Первый" "first" = "Первый"
"last" = "Последний" "last" = "Последний"
"up" = "Вверх" "up" = "Поднять вверх"
"down" = "Вниз" "down" = "Опустить вниз"
"source" = "Источник" "source" = "Источник"
"dest" = "Пункт назначения" "dest" = "Пункт назначения"
"inbound" = "Входящий" "inbound" = "Входящее соединение"
"outbound" = "Исходящий" "outbound" = "Исходящее соединение"
"balancer" = "Балансировщик" "balancer" = "Балансировщик"
"info" = "Информация" "info" = "Информация"
"add" = "Добавить правило" "add" = "Создать правило"
"edit" = "Редактировать правило" "edit" = "Редактировать правило"
"useComma" = "Элементы, разделённые запятыми" "useComma" = "Элементы, разделённые запятыми"
[pages.xray.outbound] [pages.xray.outbound]
"addOutbound" = "Добавить исходящий" "addOutbound" = "Создать исходящее соединение"
"addReverse" = "Добавить реверс" "addReverse" = "Создать обратный прокси"
"editOutbound" = "Изменить исходящий" "editOutbound" = "Изменить исходящее соединение"
"editReverse" = "Редактировать реверс" "editReverse" = "Редактировать обратное прокси"
"tag" = "Тег" "tag" = "Тег"
"tagDesc" = "Уникальный тег" "tagDesc" = "Уникальный тег"
"address" = "Адрес" "address" = "Адрес"
@ -444,7 +444,7 @@
"sendThrough" = "Отправить через" "sendThrough" = "Отправить через"
[pages.xray.balancer] [pages.xray.balancer]
"addBalancer" = "Добавить балансировщик" "addBalancer" = "Создать балансировщик"
"editBalancer" = "Редактировать балансировщик" "editBalancer" = "Редактировать балансировщик"
"balancerStrategy" = "Стратегия" "balancerStrategy" = "Стратегия"
"balancerSelectors" = "Селекторы" "balancerSelectors" = "Селекторы"
@ -463,7 +463,7 @@
[pages.xray.dns] [pages.xray.dns]
"enable" = "Включить DNS" "enable" = "Включить DNS"
"enableDesc" = "Включить встроенный DNS-сервер" "enableDesc" = "Включить встроенный DNS-сервер"
"tag" = "Входящий тег DNS" "tag" = "Название тега DNS"
"tagDesc" = "Этот тег будет доступен как входящий тег в правилах маршрутизации." "tagDesc" = "Этот тег будет доступен как входящий тег в правилах маршрутизации."
"clientIp" = "IP клиента" "clientIp" = "IP клиента"
"clientIpDesc" = "Используется для уведомления сервера о указанном местоположении IP во время DNS-запросов" "clientIpDesc" = "Используется для уведомления сервера о указанном местоположении IP во время DNS-запросов"
@ -475,14 +475,14 @@
"disableFallbackIfMatchDesc" = "Отключает резервные DNS-запросы при совпадении списка доменов DNS-сервера" "disableFallbackIfMatchDesc" = "Отключает резервные DNS-запросы при совпадении списка доменов DNS-сервера"
"strategy" = "Стратегия запроса" "strategy" = "Стратегия запроса"
"strategyDesc" = "Общая стратегия разрешения доменных имен" "strategyDesc" = "Общая стратегия разрешения доменных имен"
"add" = "Добавить сервер" "add" = "Создать DNS"
"edit" = "Редактировать сервер" "edit" = "Редактировать DNS"
"domains" = "Домены" "domains" = "Домены"
"expectIPs" = "Ожидаемые IP" "expectIPs" = "Ожидаемые IP"
[pages.xray.fakedns] [pages.xray.fakedns]
"add" = "Добавить поддельный DNS" "add" = "Создать Fake DNS"
"edit" = "Редактировать поддельный DNS" "edit" = "Редактировать Fake DNS"
"ipPool" = "Подсеть пула IP" "ipPool" = "Подсеть пула IP"
"poolSize" = "Размер пула" "poolSize" = "Размер пула"
@ -584,21 +584,22 @@
"yes" = "✅ Да" "yes" = "✅ Да"
"no" = "❌ Нет" "no" = "❌ Нет"
"received_id" = "🔑📥 Полученный ID: {{ .ClientId }}" "received_id" = "🔑📥 ID обновлен. Нажмите обновить, чтобы увидеть изменения."
"received_password" = "🔑📥 Полученный пароль: {{ .ClientPass }}" "received_password" = "🔑📥 Пароль обновлен. Нажмите обновить, чтобы увидеть изменения."
"received_email" = "📧📥 Полученный email: {{ .ClientEmail }}" "received_email" = "📧📥 Электронная почта обновлена. Нажмите обновить, чтобы увидеть изменения."
"received_comment" = "💬📥 Полученный комментарий: {{ .ClientComment }}" "received_comment" = "💬📥 Комментарий обновлен. Нажмите обновить, чтобы увидеть изменения."
"id_prompt" = "🔑 Стандартный ID: {{ .ClientId }}\n\nВведите ваш ID." "id_prompt" = "🔑 ID по умолчанию: {{ .ClientId }}\n\nВведите ваш ID."
"pass_prompt" = "🔑 Стандартный пароль: {{ .ClientPassword }}\n\nВведите ваш пароль." "pass_prompt" = "🔑 Пароль по умолчанию: {{ .ClientPassword }}\n\nВведите ваш пароль."
"email_prompt" = "📧 Стандартный email: {{ .ClientEmail }}\n\nВведите ваш email." "email_prompt" = "📧 Электронная почта по умолчанию: {{ .ClientEmail }}\n\nВведите ваш email."
"comment_prompt" = "💬 Стандартный комментарий: {{ .ClientComment }}\n\nВведите ваш комментарий." "comment_prompt" = "💬 Комментарий по умолчанию: {{ .ClientComment }}\n\nВведите ваш комментарий."
"inbound_client_data_id" = "🔄 Входящий: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 Email: {{ .ClientEmail }}\n💬 Комментарий: {{ .ClientComment }}\n\nТеперь вы можете добавить клиента во входящие!" "inbound_client_data_id" = "🔄 Входящие: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 Электронная почта: {{ .ClientEmail }}\n💬 Комментарий: {{ .ClientComment }}\n\nТеперь вы можете добавить клиента во входящие!"
"inbound_client_data_pass" = "🔄 Входящий: {{ .InboundRemark }}\n\n🔑 Пароль: {{ .ClientPass }}\n📧 Email: {{ .ClientEmail }}\n💬 Комментарий: {{ .ClientComment }}\n\nТеперь вы можете добавить клиента во входящие!" "inbound_client_data_pass" = "🔄 Входящие: {{ .InboundRemark }}\n\n🔑 Пароль: {{ .ClientPass }}\n📧 Электронная почта: {{ .ClientEmail }}\n💬 Комментарий: {{ .ClientComment }}\n\nТеперь вы можете добавить клиента во входящие!"
"client_data_id" = "🔑 ID: {{ .ClientId }}\n📧 Email: {{ .ClientEmail }}\n💬 Комментарий: {{ .ClientComment }}\n\nТеперь вы можете добавить клиента во входящие!" "client_data_id" = "🔑 ID: {{ .ClientId }}\n📧 Электронная почта: {{ .ClientEmail }}\n💬 Комментарий: {{ .ClientComment }}\n\nТеперь вы можете добавить клиента во входящие!"
"client_data_pass" = "🔑 Пароль: {{ .ClientPass }}\n📧 Email: {{ .ClientEmail }}\n💬 Комментарий: {{ .ClientComment }}\n\nТеперь вы можете добавить клиента во входящие!" "client_data_pass" = "🔑 Пароль: {{ .ClientPass }}\n📧 Электронная почта: {{ .ClientEmail }}\n💬 Комментарий: {{ .ClientComment }}\n\nТеперь вы можете добавить клиента во входящие!"
"cancel" = "❌ Процесс отменен! \n\nВы можете начать заново в любое время с помощью /start. 🔄" "cancel" = "❌ Процесс отменен! \n\nВы можете /start снова в любое время. 🔄"
"error_add_client" = "⚠️ Ошибка:\n\n {{ .error }}" "error_add_client" = "⚠️ Ошибка:\n\n {{ .error }}"
"success_add_client" = "🏆 Успех! \nТеперь вы можете изменить его, используя кнопку 'Все клиенты'." "using_default_value" = "Хорошо, я оставлю значение по умолчанию. 😊"
"incorrect_input" = "Ваш ввод недействителен.\nФразы должны быть непрерывными без пробелов.\nПравильный пример: aaaaaa\nНеправильный пример: aaa aaa 🚫"
[tgbot.buttons] [tgbot.buttons]
@ -632,13 +633,17 @@
"confirmNumber" = "✅ Подтвердить: {{ .Num }}" "confirmNumber" = "✅ Подтвердить: {{ .Num }}"
"confirmNumberAdd" = "✅ Подтвердить добавление: {{ .Num }}" "confirmNumberAdd" = "✅ Подтвердить добавление: {{ .Num }}"
"limitTraffic" = "🚧 Лимит трафика" "limitTraffic" = "🚧 Лимит трафика"
"getBanLogs" = "Логи блокировок" "getBanLogs" = "Журнал блокировок"
"allClients" = "Все клиенты" "allClients" = "Все клиенты"
"addClient" = "Добавить клиента" "addClient" = "Добавить клиента"
"submitDisable" = "Отправить как отключено ✅" "submitDisable" = "Отправить как отключенный ✅"
"use_default" = "🏷️ Использовать по умолчанию" "use_default" = "🏷️ Использовать по умолчанию"
"change_default" = "🔄⚙️ Изменить по умолчанию" "change_id" = "⚙️🔑 ID"
"change_password" = "⚙️🔑 Пароль"
"change_email" = "⚙️📧 Электронная почта"
"change_comment" = "⚙️💬 Комментарий"
[tgbot.answers] [tgbot.answers]
"successfulOperation" = "✅ Успешно!" "successfulOperation" = "✅ Успешно!"
@ -660,5 +665,5 @@
"enableSuccess" = "✅ {{ .Email }}: Включено успешно." "enableSuccess" = "✅ {{ .Email }}: Включено успешно."
"disableSuccess" = "✅ {{ .Email }}: Отключено успешно." "disableSuccess" = "✅ {{ .Email }}: Отключено успешно."
"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" = "Выберите подключение"

View file

@ -584,21 +584,22 @@
"yes" = "✅ Evet" "yes" = "✅ Evet"
"no" = "❌ Hayır" "no" = "❌ Hayır"
"received_id" = "🔑📥 Alınan Kimlik: {{ .ClientId }}" "received_id" = "🔑📥 ID güncellendi. Değişiklikleri görmek için yenileyin."
"received_password" = "🔑📥 Alınan Şifre: {{ .ClientPass }}" "received_password" = "🔑📥 Şifre güncellendi. Değişiklikleri görmek için yenileyin."
"received_email" = "📧📥 Alınan E-posta: {{ .ClientEmail }}" "received_email" = "📧📥 E-posta güncellendi. Değişiklikleri görmek için yenileyin."
"received_comment" = "💬📥 Alınan Yorum: {{ .ClientComment }}" "received_comment" = "💬📥 Yorum güncellendi. Değişiklikleri görmek için yenileyin."
"id_prompt" = "🔑 Varsayılan Kimlik: {{ .ClientId }}\n\nKimliğinizi girin." "id_prompt" = "🔑 Varsayılan ID: {{ .ClientId }}\n\nID'nizi girin."
"pass_prompt" = "🔑 Varsayılan Şifre: {{ .ClientPassword }}\n\nŞifrenizi girin." "pass_prompt" = "🔑 Varsayılan Şifre: {{ .ClientPassword }}\n\nŞifrenizi girin."
"email_prompt" = "📧 Varsayılan E-posta: {{ .ClientEmail }}\n\nE-posta adresinizi girin." "email_prompt" = "📧 Varsayılan E-posta: {{ .ClientEmail }}\n\nE-posta adresinizi girin."
"comment_prompt" = "💬 Varsayılan Yorum: {{ .ClientComment }}\n\nYorumunuzu girin." "comment_prompt" = "💬 Varsayılan Yorum: {{ .ClientComment }}\n\nYorumunuzu girin."
"inbound_client_data_id" = "🔄 Gelen: {{ .InboundRemark }}\n\n🔑 Kimlik: {{ .ClientId }}\n📧 E-posta: {{ .ClientEmail }}\n💬 Yorum: {{ .ClientComment }}\n\nArtık müşteriyi gelen kutusuna ekleyebilirsiniz!" "inbound_client_data_id" = "🔄 Gelen: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 E-posta: {{ .ClientEmail }}\n💬 Yorum: {{ .ClientComment }}\n\nŞimdi müşteri gelen kutusuna eklenebilir!"
"inbound_client_data_pass" = "🔄 Gelen: {{ .InboundRemark }}\n\n🔑 Şifre: {{ .ClientPass }}\n📧 E-posta: {{ .ClientEmail }}\n💬 Yorum: {{ .ClientComment }}\n\nArtık müşteriyi gelen kutusuna ekleyebilirsiniz!" "inbound_client_data_pass" = "🔄 Gelen: {{ .InboundRemark }}\n\n🔑 Şifre: {{ .ClientPass }}\n📧 E-posta: {{ .ClientEmail }}\n💬 Yorum: {{ .ClientComment }}\n\nŞimdi müşteri gelen kutusuna eklenebilir!"
"client_data_id" = "🔑 Kimlik: {{ .ClientId }}\n📧 E-posta: {{ .ClientEmail }}\n💬 Yorum: {{ .ClientComment }}\n\nArtık müşteriyi gelen kutusuna ekleyebilirsiniz!" "client_data_id" = "🔑 ID: {{ .ClientId }}\n📧 E-posta: {{ .ClientEmail }}\n💬 Yorum: {{ .ClientComment }}\n\nŞimdi müşteri gelen kutusuna eklenebilir!"
"client_data_pass" = "🔑 Şifre: {{ .ClientPass }}\n📧 E-posta: {{ .ClientEmail }}\n💬 Yorum: {{ .ClientComment }}\n\nArtık müşteriyi gelen kutusuna ekleyebilirsiniz!" "client_data_pass" = "🔑 Şifre: {{ .ClientPass }}\n📧 E-posta: {{ .ClientEmail }}\n💬 Yorum: {{ .ClientComment }}\n\nŞimdi müşteri gelen kutusuna eklenebilir!"
"cancel" = "❌ İşlem iptal edildi! \n\nİstediğiniz zaman /start kullanabilirsiniz. 🔄" "cancel" = "❌ İşlem iptal edildi! \n\nHer zaman /start ile tekrar başlayabilirsiniz. 🔄"
"error_add_client" = "⚠️ Hata:\n\n {{ .error }}" "error_add_client" = "⚠️ Hata:\n\n {{ .error }}"
"success_add_client" = "🏆 Başarılı! \nArtık 'Tüm Müşteriler' düğmesini kullanarak düzenleyebilirsiniz." "using_default_value" = "Tamam, varsayılan değeri kullanacağım. 😊"
"incorrect_input" = "Girdiğiniz geçersiz.\nCümleler boşluk olmadan ardışık olmalıdır.\nDoğru örnek: aaaaaa\nYanlış örnek: aaa aaa 🚫"
[tgbot.buttons] [tgbot.buttons]
@ -638,7 +639,11 @@
"addClient" = "Müşteri Ekle" "addClient" = "Müşteri Ekle"
"submitDisable" = "Devre Dışı Olarak Gönder ✅" "submitDisable" = "Devre Dışı Olarak Gönder ✅"
"use_default" = "🏷️ Varsayılanı Kullan" "use_default" = "🏷️ Varsayılanı Kullan"
"change_default" = "🔄⚙️ Varsayılanı Değiştir" "change_id" = "⚙️🔑 ID"
"change_password" = "⚙️🔑 Şifre"
"change_email" = "⚙️📧 E-posta"
"change_comment" = "⚙️💬 Yorum"
[tgbot.answers] [tgbot.answers]
"successfulOperation" = "✅ İşlem başarılı!" "successfulOperation" = "✅ İşlem başarılı!"

View file

@ -584,21 +584,22 @@
"yes" = "✅ Так" "yes" = "✅ Так"
"no" = "❌ Ні" "no" = "❌ Ні"
"received_id" = "🔑📥 Отриманий ID: {{ .ClientId }}" "received_id" = "🔑📥 ID оновлено. Натисніть оновити, щоб побачити зміни."
"received_password" = "🔑📥 Отриманий пароль: {{ .ClientPass }}" "received_password" = "🔑📥 Пароль оновлено. Натисніть оновити, щоб побачити зміни."
"received_email" = "📧📥 Отриманий email: {{ .ClientEmail }}" "received_email" = "📧📥 Електронну пошту оновлено. Натисніть оновити, щоб побачити зміни."
"received_comment" = "💬📥 Отриманий коментар: {{ .ClientComment }}" "received_comment" = "💬📥 Коментар оновлено. Натисніть оновити, щоб побачити зміни."
"id_prompt" = "🔑 Стандартний ID: {{ .ClientId }}\n\nВведіть ваш ID." "id_prompt" = "🔑 ID за замовчуванням: {{ .ClientId }}\n\nВведіть свій ID."
"pass_prompt" = "🔑 Стандартний пароль: {{ .ClientPassword }}\n\nВведіть ваш пароль." "pass_prompt" = "🔑 Пароль за замовчуванням: {{ .ClientPassword }}\n\nВведіть свій пароль."
"email_prompt" = "📧 Стандартний email: {{ .ClientEmail }}\n\nВведіть ваш email." "email_prompt" = "📧 Електронна пошта за замовчуванням: {{ .ClientEmail }}\n\nВведіть свою електронну пошту."
"comment_prompt" = "💬 Стандартний коментар: {{ .ClientComment }}\n\nВведіть ваш коментар." "comment_prompt" = "💬 Коментар за замовчуванням: {{ .ClientComment }}\n\nВведіть свій коментар."
"inbound_client_data_id" = "🔄 Вхідні: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 Email: {{ .ClientEmail }}\n💬 Коментар: {{ .ClientComment }}\n\nТепер ви можете додати клієнта до вхідних!" "inbound_client_data_id" = "🔄 Вхідні: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 Електронна пошта: {{ .ClientEmail }}\n💬 Коментар: {{ .ClientComment }}\n\nТепер ви можете додати клієнта до вхідних!"
"inbound_client_data_pass" = "🔄 Вхідні: {{ .InboundRemark }}\n\n🔑 Пароль: {{ .ClientPass }}\n📧 Email: {{ .ClientEmail }}\n💬 Коментар: {{ .ClientComment }}\n\nТепер ви можете додати клієнта до вхідних!" "inbound_client_data_pass" = "🔄 Вхідні: {{ .InboundRemark }}\n\n🔑 Пароль: {{ .ClientPass }}\n📧 Електронна пошта: {{ .ClientEmail }}\n💬 Коментар: {{ .ClientComment }}\n\nТепер ви можете додати клієнта до вхідних!"
"client_data_id" = "🔑 ID: {{ .ClientId }}\n📧 Email: {{ .ClientEmail }}\n💬 Коментар: {{ .ClientComment }}\n\nТепер ви можете додати клієнта до вхідних!" "client_data_id" = "🔑 ID: {{ .ClientId }}\n📧 Електронна пошта: {{ .ClientEmail }}\n💬 Коментар: {{ .ClientComment }}\n\nТепер ви можете додати клієнта до вхідних!"
"client_data_pass" = "🔑 Пароль: {{ .ClientPass }}\n📧 Email: {{ .ClientEmail }}\n💬 Коментар: {{ .ClientComment }}\n\nТепер ви можете додати клієнта до вхідних!" "client_data_pass" = "🔑 Пароль: {{ .ClientPass }}\n📧 Електронна пошта: {{ .ClientEmail }}\n💬 Коментар: {{ .ClientComment }}\n\nТепер ви можете додати клієнта до вхідних!"
"cancel" = "❌ Процес скасовано! \n\nВи можете використати /start у будь-який час. 🔄" "cancel" = "❌ Процес скасовано! \n\nВи можете /start знову в будь-який час. 🔄"
"error_add_client" = "⚠️ Помилка:\n\n {{ .error }}" "error_add_client" = "⚠️ Помилка:\n\n {{ .error }}"
"success_add_client" = "🏆 Успіх! \nТепер ви можете редагувати його за допомогою кнопки 'Усі клієнти'." "using_default_value" = "Добре, я залишу значення за замовчуванням. 😊"
"incorrect_input" = "Ваш ввід недійсний.\nФрази повинні йти без пробілів.\nПравильний приклад: aaaaaa\nНеправильний приклад: aaa aaa 🚫"
[tgbot.buttons] [tgbot.buttons]
@ -636,9 +637,13 @@
"allClients" = "Всі Клієнти" "allClients" = "Всі Клієнти"
"addClient" = "Додати клієнта" "addClient" = "Додати клієнта"
"submitDisable" = "Надіслати як вимкнено ✅" "submitDisable" = "Надіслати як вимкнене ✅"
"use_default" = "🏷️ Використати за замовчуванням" "use_default" = "🏷️ Використовувати за замовчуванням"
"change_default" = "🔄⚙️ Змінити за замовчуванням" "change_id" = "⚙️🔑 ID"
"change_password" = "⚙️🔑 Пароль"
"change_email" = "⚙️📧 Електронна пошта"
"change_comment" = "⚙️💬 Коментар"
[tgbot.answers] [tgbot.answers]
"successfulOperation" = "✅ Операція успішна!" "successfulOperation" = "✅ Операція успішна!"

View file

@ -584,21 +584,22 @@
"yes" = "✅ Có" "yes" = "✅ Có"
"no" = "❌ Không" "no" = "❌ Không"
"received_id" = "🔑📥 ID nhận được: {{ .ClientId }}" "received_id" = "🔑📥 ID đã được cập nhật. Nhấn làm mới để xem thay đổi."
"received_password" = "🔑📥 Mật khẩu nhận được: {{ .ClientPass }}" "received_password" = "🔑📥 Mật khẩu đã được cập nhật. Nhấn làm mới để xem thay đổi."
"received_email" = "📧📥 Email nhận được: {{ .ClientEmail }}" "received_email" = "📧📥 Email đã được cập nhật. Nhấn làm mới để xem thay đổi."
"received_comment" = "💬📥 Bình luận nhận được: {{ .ClientComment }}" "received_comment" = "💬📥 Bình luận đã được cập nhật. Nhấn làm mới để xem thay đổi."
"id_prompt" = "🔑 ID mặc định: {{ .ClientId }}\n\nNhập ID của bạn." "id_prompt" = "🔑 ID mặc định: {{ .ClientId }}\n\nNhập ID của bạn."
"pass_prompt" = "🔑 Mật khẩu mặc định: {{ .ClientPassword }}\n\nNhập mật khẩu của bạn." "pass_prompt" = "🔑 Mật khẩu mặc định: {{ .ClientPassword }}\n\nNhập mật khẩu của bạn."
"email_prompt" = "📧 Email mặc định: {{ .ClientEmail }}\n\nNhập email 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." "comment_prompt" = "💬 Bình luận mặc định: {{ .ClientComment }}\n\nNhập bình luận của bạn."
"inbound_client_data_id" = "🔄 Dữ liệu đến: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 Email: {{ .ClientEmail }}\n💬 Bình luận: {{ .ClientComment }}\n\nBạn có thể thêm khách hàng vào danh sách đến ngay bây giờ!" "inbound_client_data_id" = "🔄 Dữ liệu đến: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 Email: {{ .ClientEmail }}\n💬 Bình luận: {{ .ClientComment }}\n\nBạn có thể thêm khách hàng vào inbound ngay bây giờ!"
"inbound_client_data_pass" = "🔄 Dữ liệu đến: {{ .InboundRemark }}\n\n🔑 Mật khẩu: {{ .ClientPass }}\n📧 Email: {{ .ClientEmail }}\n💬 Bình luận: {{ .ClientComment }}\n\nBạn có thể thêm khách hàng vào danh sách đến ngay bây giờ!" "inbound_client_data_pass" = "🔄 Dữ liệu đến: {{ .InboundRemark }}\n\n🔑 Mật khẩu: {{ .ClientPass }}\n📧 Email: {{ .ClientEmail }}\n💬 Bình luận: {{ .ClientComment }}\n\nBạn có thể thêm khách hàng vào inbound ngay bây giờ!"
"client_data_id" = "🔑 ID: {{ .ClientId }}\n📧 Email: {{ .ClientEmail }}\n💬 Bình luận: {{ .ClientComment }}\n\nBạn có thể thêm khách hàng vào danh sách đến ngay bây giờ!" "client_data_id" = "🔑 ID: {{ .ClientId }}\n📧 Email: {{ .ClientEmail }}\n💬 Bình luận: {{ .ClientComment }}\n\nBạn có thể thêm khách hàng vào inbound ngay bây giờ!"
"client_data_pass" = "🔑 Mật khẩu: {{ .ClientPass }}\n📧 Email: {{ .ClientEmail }}\n💬 Bình luận: {{ .ClientComment }}\n\nBạn có thể thêm khách hàng vào danh sách đến ngay bây giờ!" "client_data_pass" = "🔑 Mật khẩu: {{ .ClientPass }}\n📧 Email: {{ .ClientEmail }}\n💬 Bình luận: {{ .ClientComment }}\n\nBạn có thể thêm khách hàng vào inbound ngay bây giờ!"
"cancel" = "❌ Quá trình đã bị hủy! \n\nBạn có thể sử dụng /start bất cứ lúc nào. 🔄" "cancel" = "❌ Quá trình đã hủy! \n\nBạn có thể /start lại bất cứ lúc nào. 🔄"
"error_add_client" = "⚠️ Lỗi:\n\n {{ .error }}" "error_add_client" = "⚠️ Lỗi:\n\n {{ .error }}"
"success_add_client" = "🏆 Thành công! \nGiờ đây bạn có thể chỉnh sửa bằng nút 'Tất Cả Khách Hàng'." "using_default_value" = "Được rồi, tôi sẽ giữ giá trị mặc định. 😊"
"incorrect_input" = "Dữ liệu bạn nhập không hợp lệ.\nCác cụm từ phải liên tiếp mà không có khoảng trắng.\nVí dụ đúng: aaaaaa\nVí dụ sai: aaa aaa 🚫"
[tgbot.buttons] [tgbot.buttons]
@ -638,7 +639,11 @@
"addClient" = "Thêm Khách Hàng" "addClient" = "Thêm Khách Hàng"
"submitDisable" = "Gửi Dưới Dạng Tắt ✅" "submitDisable" = "Gửi Dưới Dạng Tắt ✅"
"use_default" = "🏷️ Sử dụng mặc định" "use_default" = "🏷️ Sử dụng mặc định"
"change_default" = "🔄⚙️ Thay đổi mặc định" "change_id" = "⚙️🔑 ID"
"change_password" = "⚙️🔑 Mật khẩu"
"change_email" = "⚙️📧 Email"
"change_comment" = "⚙️💬 Bình luận"
[tgbot.answers] [tgbot.answers]
"successfulOperation" = "✅ Thành công!" "successfulOperation" = "✅ Thành công!"

View file

@ -584,21 +584,22 @@
"yes" = "✅ 是的" "yes" = "✅ 是的"
"no" = "❌ 没有" "no" = "❌ 没有"
"received_id" = "🔑📥 接收到的ID: {{ .ClientId }}" "received_id" = "🔑📥 ID 已更新。请点击刷新查看更改。"
"received_password" = "🔑📥 接收到的密码: {{ .ClientPass }}" "received_password" = "🔑📥 密码已更新。请点击刷新查看更改。"
"received_email" = "📧📥 接收到的电子邮件: {{ .ClientEmail }}" "received_email" = "📧📥 电子邮件已更新。请点击刷新查看更改。"
"received_comment" = "💬📥 接收到的评论: {{ .ClientComment }}" "received_comment" = "💬📥 评论已更新。请点击刷新查看更改。"
"id_prompt" = "🔑 默认 ID: {{ .ClientId }}\n\n请输入您的 ID。" "id_prompt" = "🔑 默认 ID: {{ .ClientId }}\n\n请输入您的 ID。"
"pass_prompt" = "🔑 默认密码: {{ .ClientPassword }}\n\n请输入您的密码。" "pass_prompt" = "🔑 默认密码: {{ .ClientPassword }}\n\n请输入您的密码。"
"email_prompt" = "📧 默认电子邮件: {{ .ClientEmail }}\n\n请输入您的电子邮件。" "email_prompt" = "📧 默认电子邮件: {{ .ClientEmail }}\n\n请输入您的电子邮件。"
"comment_prompt" = "💬 默认评论: {{ .ClientComment }}\n\n请输入您的评论。" "comment_prompt" = "💬 默认评论: {{ .ClientComment }}\n\n请输入您的评论。"
"inbound_client_data_id" = "🔄 传入数据: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 电子邮件: {{ .ClientEmail }}\n💬 评论: {{ .ClientComment }}\n\n您现在可以将客户添加到传入列表" "inbound_client_data_id" = "🔄 传入数据: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 电子邮件: {{ .ClientEmail }}\n💬 评论: {{ .ClientComment }}\n\n现在可以将客户添加到传入数据中"
"inbound_client_data_pass" = "🔄 传入数据: {{ .InboundRemark }}\n\n🔑 密码: {{ .ClientPass }}\n📧 电子邮件: {{ .ClientEmail }}\n💬 评论: {{ .ClientComment }}\n\n您现在可以将客户添加到传入列表" "inbound_client_data_pass" = "🔄 传入数据: {{ .InboundRemark }}\n\n🔑 密码: {{ .ClientPass }}\n📧 电子邮件: {{ .ClientEmail }}\n💬 评论: {{ .ClientComment }}\n\n现在可以将客户添加到传入数据中"
"client_data_id" = "🔑 ID: {{ .ClientId }}\n📧 电子邮件: {{ .ClientEmail }}\n💬 评论: {{ .ClientComment }}\n\n您现在可以将客户添加到传入列表" "client_data_id" = "🔑 ID: {{ .ClientId }}\n📧 电子邮件: {{ .ClientEmail }}\n💬 评论: {{ .ClientComment }}\n\n现在可以将客户添加到传入数据中"
"client_data_pass" = "🔑 密码: {{ .ClientPass }}\n📧 电子邮件: {{ .ClientEmail }}\n💬 评论: {{ .ClientComment }}\n\n您现在可以将客户添加到传入列表" "client_data_pass" = "🔑 密码: {{ .ClientPass }}\n📧 电子邮件: {{ .ClientEmail }}\n💬 评论: {{ .ClientComment }}\n\n现在可以将客户添加到传入数据中"
"cancel" = "❌ 过程已取消!\n\n您可以随时使用 /start。 🔄" "cancel" = "❌ 过程已取消! \n\n您可以随时重新开始 /start。 🔄"
"error_add_client" = "⚠️ 错误:\n\n {{ .error }}" "error_add_client" = "⚠️ 错误:\n\n {{ .error }}"
"success_add_client" = "🏆 成功!\n您现在可以使用'所有客户'按钮进行修改。" "using_default_value" = "好的,我将使用默认值。😊"
"incorrect_input" = "您的输入无效。\n短语应连续无空格。\n正确示例: aaaaaa\n错误示例: aaa aaa 🚫"
[tgbot.buttons] [tgbot.buttons]
@ -638,7 +639,11 @@
"addClient" = "添加客户" "addClient" = "添加客户"
"submitDisable" = "提交为禁用 ✅" "submitDisable" = "提交为禁用 ✅"
"use_default" = "🏷️ 使用默认" "use_default" = "🏷️ 使用默认"
"change_default" = "🔄⚙️ 更改默认" "change_id" = "⚙️🔑 ID"
"change_password" = "⚙️🔑 密码"
"change_email" = "⚙️📧 邮箱"
"change_comment" = "⚙️💬 评论"
[tgbot.answers] [tgbot.answers]
"successfulOperation" = "✅ 成功!" "successfulOperation" = "✅ 成功!"

View file

@ -584,21 +584,22 @@
"yes" = "✅ 是的" "yes" = "✅ 是的"
"no" = "❌ 沒有" "no" = "❌ 沒有"
"received_id" = "🔑📥 接收到的 ID: {{ .ClientId }}" "received_id" = "🔑📥 ID 已更新。請按刷新查看變更。"
"received_password" = "🔑📥 接收到的密碼: {{ .ClientPass }}" "received_password" = "🔑📥 密碼已更新。請按刷新查看變更。"
"received_email" = "📧📥 接收到的電子郵件: {{ .ClientEmail }}" "received_email" = "📧📥 電子郵件已更新。請按刷新查看變更。"
"received_comment" = "💬📥 接收到的評論: {{ .ClientComment }}" "received_comment" = "💬📥 評論已更新。請按刷新查看變更。"
"id_prompt" = "🔑 預設 ID: {{ .ClientId }}\n\n請輸入您的 ID。" "id_prompt" = "🔑 預設 ID: {{ .ClientId }}\n\n請輸入您的 ID。"
"pass_prompt" = "🔑 預設密碼: {{ .ClientPassword }}\n\n請輸入您的密碼。" "pass_prompt" = "🔑 預設密碼: {{ .ClientPassword }}\n\n請輸入您的密碼。"
"email_prompt" = "📧 預設電子郵件: {{ .ClientEmail }}\n\n請輸入您的電子郵件。" "email_prompt" = "📧 預設電子郵件: {{ .ClientEmail }}\n\n請輸入您的電子郵件。"
"comment_prompt" = "💬 預設評論: {{ .ClientComment }}\n\n請輸入您的評論。" "comment_prompt" = "💬 預設評論: {{ .ClientComment }}\n\n請輸入您的評論。"
"inbound_client_data_id" = "🔄 傳入數據: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 電子郵件: {{ .ClientEmail }}\n💬 評論: {{ .ClientComment }}\n\n您現在可以將客戶添加到傳入列表" "inbound_client_data_id" = "🔄 進來資料: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 電子郵件: {{ .ClientEmail }}\n💬 評論: {{ .ClientComment }}\n\n現在您可以將客戶添加到進來資料中"
"inbound_client_data_pass" = "🔄 傳入數據: {{ .InboundRemark }}\n\n🔑 密碼: {{ .ClientPass }}\n📧 電子郵件: {{ .ClientEmail }}\n💬 評論: {{ .ClientComment }}\n\n您現在可以將客戶添加到傳入列表" "inbound_client_data_pass" = "🔄 進來資料: {{ .InboundRemark }}\n\n🔑 密碼: {{ .ClientPass }}\n📧 電子郵件: {{ .ClientEmail }}\n💬 評論: {{ .ClientComment }}\n\n現在您可以將客戶添加到進來資料中"
"client_data_id" = "🔑 ID: {{ .ClientId }}\n📧 電子郵件: {{ .ClientEmail }}\n💬 評論: {{ .ClientComment }}\n\n您現在可以將客戶添加到傳入列表" "client_data_id" = "🔑 ID: {{ .ClientId }}\n📧 電子郵件: {{ .ClientEmail }}\n💬 評論: {{ .ClientComment }}\n\n現在您可以將客戶添加到進來資料中"
"client_data_pass" = "🔑 密碼: {{ .ClientPass }}\n📧 電子郵件: {{ .ClientEmail }}\n💬 評論: {{ .ClientComment }}\n\n您現在可以將客戶添加到傳入列表" "client_data_pass" = "🔑 密碼: {{ .ClientPass }}\n📧 電子郵件: {{ .ClientEmail }}\n💬 評論: {{ .ClientComment }}\n\n現在您可以將客戶添加到進來資料中"
"cancel" = "❌ 過程已取消!\n\n您可以隨時使用 /start。 🔄" "cancel" = "❌ 處理已取消! \n\n您可以隨時重新開始 /start。 🔄"
"error_add_client" = "⚠️ 錯誤:\n\n {{ .error }}" "error_add_client" = "⚠️ 錯誤:\n\n {{ .error }}"
"success_add_client" = "🏆 成功!\n您現在可以使用'所有客戶'按鈕進行修改。" "using_default_value" = "好的,我會使用預設值。😊"
"incorrect_input" = "您的輸入無效。\n短語應該連貫而不應有空格。\n正確範例: aaaaaa\n錯誤範例: aaa aaa 🚫"
[tgbot.buttons] [tgbot.buttons]
@ -638,7 +639,11 @@
"addClient" = "新增客戶" "addClient" = "新增客戶"
"submitDisable" = "提交為停用 ✅" "submitDisable" = "提交為停用 ✅"
"use_default" = "🏷️ 使用預設" "use_default" = "🏷️ 使用預設"
"change_default" = "🔄⚙️ 更改預設" "change_id" = "⚙️🔑 ID"
"change_password" = "⚙️🔑 密碼"
"change_email" = "⚙️📧 電子郵件"
"change_comment" = "⚙️💬 評論"
[tgbot.answers] [tgbot.answers]
"successfulOperation" = "✅ 成功!" "successfulOperation" = "✅ 成功!"

12
x-ui.sh
View file

@ -76,12 +76,12 @@ elif [[ "${release}" == "debian" ]]; then
echo -e "${red} Please use Debian 12 or higher ${plain}\n" && exit 1 echo -e "${red} Please use Debian 12 or higher ${plain}\n" && exit 1
fi fi
elif [[ "${release}" == "almalinux" ]]; then elif [[ "${release}" == "almalinux" ]]; then
if [[ ${os_version} -lt 80 ]]; then if [[ ${os_version} -lt 95 ]]; then
echo -e "${red} Please use AlmaLinux 8.0 or higher ${plain}\n" && exit 1 echo -e "${red} Please use AlmaLinux 9.5 or higher ${plain}\n" && exit 1
fi fi
elif [[ "${release}" == "rocky" ]]; then elif [[ "${release}" == "rocky" ]]; then
if [[ ${os_version} -lt 8 ]]; then if [[ ${os_version} -lt 95 ]]; then
echo -e "${red} Please use Rocky Linux 8 or higher ${plain}\n" && exit 1 echo -e "${red} Please use Rocky Linux 9.5 or higher ${plain}\n" && exit 1
fi fi
elif [[ "${release}" == "ol" ]]; then elif [[ "${release}" == "ol" ]]; then
if [[ ${os_version} -lt 8 ]]; then if [[ ${os_version} -lt 8 ]]; then
@ -103,8 +103,8 @@ else
echo "- Parch Linux" echo "- Parch Linux"
echo "- Manjaro" echo "- Manjaro"
echo "- Armbian" echo "- Armbian"
echo "- AlmaLinux 8.0+" echo "- AlmaLinux 9.5+"
echo "- Rocky Linux 8+" echo "- Rocky Linux 9.5+"
echo "- Oracle Linux 8+" echo "- Oracle Linux 8+"
echo "- OpenSUSE Tumbleweed" echo "- OpenSUSE Tumbleweed"
echo "- Amazon Linux 2023" echo "- Amazon Linux 2023"