diff --git a/web/controller/setting.go b/web/controller/setting.go index 7c4ec7b1..886c4d72 100644 --- a/web/controller/setting.go +++ b/web/controller/setting.go @@ -6,6 +6,7 @@ import ( "github.com/mhsanaei/3x-ui/v3/util/crypto" "github.com/mhsanaei/3x-ui/v3/web/entity" + "github.com/mhsanaei/3x-ui/v3/web/locale" "github.com/mhsanaei/3x-ui/v3/web/service" "github.com/mhsanaei/3x-ui/v3/web/session" @@ -77,6 +78,9 @@ func (a *SettingController) updateSetting(c *gin.Context) { return } err = a.settingService.UpdateAllSetting(allSetting) + if err == nil { + locale.UpdateBotLocalizer(allSetting.TgLang) + } jsonMsg(c, I18nWeb(c, "pages.settings.toasts.modifySettings"), err) } diff --git a/web/locale/locale.go b/web/locale/locale.go index c530f5ae..150e82b7 100644 --- a/web/locale/locale.go +++ b/web/locale/locale.go @@ -111,11 +111,20 @@ func initTGBotLocalizer(settingService SettingService) error { if err != nil { return err } + logger.Infof("Initializing TG Bot localizer with language: %s", botLang) LocalizerBot = i18n.NewLocalizer(i18nBundle, botLang) return nil } +// UpdateBotLocalizer dynamically updates the bot localizer language. +func UpdateBotLocalizer(botLang string) { + if i18nBundle != nil { + logger.Infof("Updating TG Bot localizer with language: %s", botLang) + LocalizerBot = i18n.NewLocalizer(i18nBundle, botLang) + } +} + // LocalizerMiddleware returns a Gin middleware that sets up localization for web requests. // It determines the user's language from cookies or Accept-Language header, // creates a localizer instance, and stores it in the Gin context for use in handlers. @@ -161,7 +170,9 @@ func loadTranslationsFromDisk(bundle *i18n.Bundle) error { if err != nil { return err } - _, err = bundle.ParseMessageFileBytes(data, path) + filename := d.Name() + logger.Infof("Parsing translation file from disk: %s", filename) + _, err = bundle.ParseMessageFileBytes(data, filename) return err }) } @@ -183,7 +194,9 @@ func parseTranslationFiles(i18nFS embed.FS, i18nBundle *i18n.Bundle) error { return err } - _, err = i18nBundle.ParseMessageFileBytes(data, path) + filename := d.Name() + logger.Infof("Parsing translation file from embed: %s (path: %s)", filename, path) + _, err = i18nBundle.ParseMessageFileBytes(data, filename) return err }) if err != nil { diff --git a/web/service/tgbot.go b/web/service/tgbot.go index 4ec7a295..8cc28793 100644 --- a/web/service/tgbot.go +++ b/web/service/tgbot.go @@ -6,10 +6,8 @@ import ( "embed" "encoding/base64" "encoding/json" - "errors" "fmt" "html" - "io" "math/big" "net" "net/http" @@ -17,13 +15,13 @@ import ( "os" "regexp" "slices" + "sort" "strconv" "strings" "sync" "time" "github.com/mhsanaei/3x-ui/v3/config" - "github.com/mhsanaei/3x-ui/v3/database" "github.com/mhsanaei/3x-ui/v3/database/model" "github.com/mhsanaei/3x-ui/v3/logger" "github.com/mhsanaei/3x-ui/v3/util/common" @@ -74,24 +72,52 @@ var ( } // 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 - client_Security string - client_ShPassword string - client_TrPassword string - client_Method string + clientStates map[int64]*ClientState + clientStatesMutex sync.RWMutex ) + +type ClientState struct { + ReceiverInboundID int + Id string + Flow string + Email string + LimitIP int + TotalGB int64 + ExpiryTime int64 + Enable bool + TgID string + SubID string + Comment string + Reset int + Security string + ShPassword string + TrPassword string + Method string +} + +func (t *Tgbot) getClientState(chatId int64) *ClientState { + clientStatesMutex.RLock() + state, exists := clientStates[chatId] + clientStatesMutex.RUnlock() + if !exists { + clientStatesMutex.Lock() + if clientStates == nil { + clientStates = make(map[int64]*ClientState) + } + state = &ClientState{} + clientStates[chatId] = state + clientStatesMutex.Unlock() + } + return state +} + +func (t *Tgbot) clearClientState(chatId int64) { + clientStatesMutex.Lock() + delete(clientStates, chatId) + clientStatesMutex.Unlock() +} + var userStates = make(map[int64]string) // LoginStatus represents the result of a login attempt. @@ -482,6 +508,7 @@ func (t *Tgbot) OnReceive() { }, th.TextEqual(t.I18nBot("tgbot.buttons.closeKeyboard"))) h.HandleMessage(func(ctx *th.Context, message telego.Message) error { + logger.Debug("Telegram command received:", message.Text) // Use goroutine with worker pool for concurrent command processing go func() { messageWorkerPool <- struct{}{} // Acquire worker @@ -494,6 +521,7 @@ func (t *Tgbot) OnReceive() { }, th.AnyCommand()) h.HandleCallbackQuery(func(ctx *th.Context, query telego.CallbackQuery) error { + logger.Debug("Telegram callback received:", query.Data) // Use goroutine with worker pool for concurrent callback processing go func() { messageWorkerPool <- struct{}{} // Acquire worker @@ -506,20 +534,23 @@ func (t *Tgbot) OnReceive() { }, th.AnyCallbackQueryWithMessage()) h.HandleMessage(func(ctx *th.Context, message telego.Message) error { - if userState, exists := userStates[message.Chat.ID]; exists { + logger.Debug("Telegram message received:", message.Text) + chatId := message.Chat.ID + state := t.getClientState(chatId) + if userState, exists := userStates[chatId]; exists { switch userState { case "awaiting_id": - if client_Id == strings.TrimSpace(message.Text) { + if state.Id == strings.TrimSpace(message.Text) { t.SendMsgToTgbotDeleteAfter(message.Chat.ID, t.I18nBot("tgbot.messages.using_default_value"), 3, tu.ReplyKeyboardRemove()) delete(userStates, message.Chat.ID) - inbound, _ := t.inboundService.GetInbound(receiver_inbound_ID) - message_text, _ := t.BuildInboundClientDataMessage(inbound.Remark, inbound.Protocol) + inbound, _ := t.inboundService.GetInbound(state.ReceiverInboundID) + message_text, _ := t.BuildInboundClientDataMessage(chatId, inbound.Remark, inbound.Protocol) t.addClient(message.Chat.ID, message_text) return nil } - client_Id = strings.TrimSpace(message.Text) - if t.isSingleWord(client_Id) { + state.Id = strings.TrimSpace(message.Text) + if t.isSingleWord(state.Id) { userStates[message.Chat.ID] = "awaiting_id" cancel_btn_markup := tu.InlineKeyboard( @@ -532,18 +563,18 @@ func (t *Tgbot) OnReceive() { } else { t.SendMsgToTgbotDeleteAfter(message.Chat.ID, t.I18nBot("tgbot.messages.received_id"), 3, tu.ReplyKeyboardRemove()) delete(userStates, message.Chat.ID) - inbound, _ := t.inboundService.GetInbound(receiver_inbound_ID) - message_text, _ := t.BuildInboundClientDataMessage(inbound.Remark, inbound.Protocol) + inbound, _ := t.inboundService.GetInbound(state.ReceiverInboundID) + message_text, _ := t.BuildInboundClientDataMessage(chatId, inbound.Remark, inbound.Protocol) t.addClient(message.Chat.ID, message_text) } case "awaiting_subid": newSubID := strings.TrimSpace(message.Text) - if client_SubID == newSubID { + if state.SubID == newSubID { t.SendMsgToTgbotDeleteAfter(message.Chat.ID, t.I18nBot("tgbot.messages.using_default_value"), 3, tu.ReplyKeyboardRemove()) delete(userStates, message.Chat.ID) - inbound, _ := t.inboundService.GetInbound(receiver_inbound_ID) - message_text, _ := t.BuildInboundClientDataMessage(inbound.Remark, inbound.Protocol) + inbound, _ := t.inboundService.GetInbound(state.ReceiverInboundID) + message_text, _ := t.BuildInboundClientDataMessage(chatId, inbound.Remark, inbound.Protocol) t.addClient(message.Chat.ID, message_text) return nil } @@ -561,22 +592,22 @@ func (t *Tgbot) OnReceive() { t.SendMsgToTgbot(message.Chat.ID, t.I18nBot("tgbot.messages.invalid_subid"), cancel_btn_markup) } else { - client_SubID = newSubID + state.SubID = newSubID t.SendMsgToTgbotDeleteAfter(message.Chat.ID, t.I18nBot("tgbot.messages.received_subid"), 3, tu.ReplyKeyboardRemove()) delete(userStates, message.Chat.ID) - inbound, _ := t.inboundService.GetInbound(receiver_inbound_ID) - message_text, _ := t.BuildInboundClientDataMessage(inbound.Remark, inbound.Protocol) + inbound, _ := t.inboundService.GetInbound(state.ReceiverInboundID) + message_text, _ := t.BuildInboundClientDataMessage(chatId, inbound.Remark, inbound.Protocol) t.addClient(message.Chat.ID, message_text) } case "awaiting_password_tr": - if client_TrPassword == strings.TrimSpace(message.Text) { + if state.TrPassword == strings.TrimSpace(message.Text) { t.SendMsgToTgbotDeleteAfter(message.Chat.ID, t.I18nBot("tgbot.messages.using_default_value"), 3, tu.ReplyKeyboardRemove()) delete(userStates, message.Chat.ID) return nil } - client_TrPassword = strings.TrimSpace(message.Text) - if t.isSingleWord(client_TrPassword) { + state.TrPassword = strings.TrimSpace(message.Text) + if t.isSingleWord(state.TrPassword) { userStates[message.Chat.ID] = "awaiting_password_tr" cancel_btn_markup := tu.InlineKeyboard( @@ -589,19 +620,19 @@ func (t *Tgbot) OnReceive() { } else { t.SendMsgToTgbotDeleteAfter(message.Chat.ID, t.I18nBot("tgbot.messages.received_password"), 3, tu.ReplyKeyboardRemove()) delete(userStates, message.Chat.ID) - inbound, _ := t.inboundService.GetInbound(receiver_inbound_ID) - message_text, _ := t.BuildInboundClientDataMessage(inbound.Remark, inbound.Protocol) + inbound, _ := t.inboundService.GetInbound(state.ReceiverInboundID) + message_text, _ := t.BuildInboundClientDataMessage(chatId, inbound.Remark, inbound.Protocol) t.addClient(message.Chat.ID, message_text) } case "awaiting_password_sh": - if client_ShPassword == strings.TrimSpace(message.Text) { + if state.ShPassword == strings.TrimSpace(message.Text) { t.SendMsgToTgbotDeleteAfter(message.Chat.ID, t.I18nBot("tgbot.messages.using_default_value"), 3, tu.ReplyKeyboardRemove()) delete(userStates, message.Chat.ID) return nil } - client_ShPassword = strings.TrimSpace(message.Text) - if t.isSingleWord(client_ShPassword) { + state.ShPassword = strings.TrimSpace(message.Text) + if t.isSingleWord(state.ShPassword) { userStates[message.Chat.ID] = "awaiting_password_sh" cancel_btn_markup := tu.InlineKeyboard( @@ -614,19 +645,19 @@ func (t *Tgbot) OnReceive() { } else { t.SendMsgToTgbotDeleteAfter(message.Chat.ID, t.I18nBot("tgbot.messages.received_password"), 3, tu.ReplyKeyboardRemove()) delete(userStates, message.Chat.ID) - inbound, _ := t.inboundService.GetInbound(receiver_inbound_ID) - message_text, _ := t.BuildInboundClientDataMessage(inbound.Remark, inbound.Protocol) + inbound, _ := t.inboundService.GetInbound(state.ReceiverInboundID) + message_text, _ := t.BuildInboundClientDataMessage(chatId, inbound.Remark, inbound.Protocol) t.addClient(message.Chat.ID, message_text) } case "awaiting_email": - if client_Email == strings.TrimSpace(message.Text) { + if state.Email == strings.TrimSpace(message.Text) { t.SendMsgToTgbotDeleteAfter(message.Chat.ID, t.I18nBot("tgbot.messages.using_default_value"), 3, tu.ReplyKeyboardRemove()) delete(userStates, message.Chat.ID) return nil } - client_Email = strings.TrimSpace(message.Text) - if t.isSingleWord(client_Email) { + state.Email = strings.TrimSpace(message.Text) + if t.isSingleWord(state.Email) { userStates[message.Chat.ID] = "awaiting_email" cancel_btn_markup := tu.InlineKeyboard( @@ -639,22 +670,22 @@ func (t *Tgbot) OnReceive() { } else { t.SendMsgToTgbotDeleteAfter(message.Chat.ID, t.I18nBot("tgbot.messages.received_email"), 3, tu.ReplyKeyboardRemove()) delete(userStates, message.Chat.ID) - inbound, _ := t.inboundService.GetInbound(receiver_inbound_ID) - message_text, _ := t.BuildInboundClientDataMessage(inbound.Remark, inbound.Protocol) + inbound, _ := t.inboundService.GetInbound(state.ReceiverInboundID) + message_text, _ := t.BuildInboundClientDataMessage(chatId, inbound.Remark, inbound.Protocol) t.addClient(message.Chat.ID, message_text) } case "awaiting_comment": - if client_Comment == strings.TrimSpace(message.Text) { + if state.Comment == strings.TrimSpace(message.Text) { t.SendMsgToTgbotDeleteAfter(message.Chat.ID, t.I18nBot("tgbot.messages.using_default_value"), 3, tu.ReplyKeyboardRemove()) delete(userStates, message.Chat.ID) return nil } - client_Comment = strings.TrimSpace(message.Text) + state.Comment = strings.TrimSpace(message.Text) t.SendMsgToTgbotDeleteAfter(message.Chat.ID, t.I18nBot("tgbot.messages.received_comment"), 3, tu.ReplyKeyboardRemove()) delete(userStates, message.Chat.ID) - inbound, _ := t.inboundService.GetInbound(receiver_inbound_ID) - message_text, _ := t.BuildInboundClientDataMessage(inbound.Remark, inbound.Protocol) + inbound, _ := t.inboundService.GetInbound(state.ReceiverInboundID) + message_text, _ := t.BuildInboundClientDataMessage(chatId, inbound.Remark, inbound.Protocol) t.addClient(message.Chat.ID, message_text) } @@ -687,6 +718,71 @@ func (t *Tgbot) OnReceive() { }() } +func checkAdmin(tgId int64) bool { + for _, adminId := range adminIds { + if adminId == tgId { + return true + } + } + return false +} + +// SendAnswer sends a response message with an inline keyboard to the specified chat. +func (t *Tgbot) SendAnswer(chatId int64, msg string, isAdmin bool) { + numericKeyboard := tu.InlineKeyboard( + tu.InlineKeyboardRow( + tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.SortedTrafficUsageReport")).WithCallbackData(t.encodeQuery("get_sorted_traffic_usage_report")), + ), + tu.InlineKeyboardRow( + tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.serverUsage")).WithCallbackData(t.encodeQuery("get_usage")), + tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.ResetAllTraffics")).WithCallbackData(t.encodeQuery("reset_all_traffics")), + ), + tu.InlineKeyboardRow( + tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.dbBackup")).WithCallbackData(t.encodeQuery("get_backup")), + tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.getInbounds")).WithCallbackData(t.encodeQuery("inbounds")), + ), + tu.InlineKeyboardRow( + tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.depleteSoon")).WithCallbackData(t.encodeQuery("deplete_soon")), + tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.getBanLogs")).WithCallbackData(t.encodeQuery("get_banlogs")), + ), + 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")), + ), + tu.InlineKeyboardRow( + tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.onlines")).WithCallbackData(t.encodeQuery("onlines")), + tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.commands")).WithCallbackData(t.encodeQuery("commands")), + ), + tu.InlineKeyboardRow( + tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.selectTGUser")).WithCallbackData(t.encodeQuery("admin_client_tg_user_links")), + ), + tu.InlineKeyboardRow( + tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.resetTraffic")).WithCallbackData(t.encodeQuery("admin_client_individual_links")), + tu.InlineKeyboardButton(t.I18nBot("qrCode")).WithCallbackData(t.encodeQuery("admin_client_qr_links")), + ), + ) + + clientKeyboard := tu.InlineKeyboard( + tu.InlineKeyboardRow( + tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.clientUsage")).WithCallbackData(t.encodeQuery("client_traffic")), + tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.commands")).WithCallbackData(t.encodeQuery("client_commands")), + ), + tu.InlineKeyboardRow( + tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.selectTGUser")).WithCallbackData(t.encodeQuery("client_sub_links")), + ), + tu.InlineKeyboardRow( + tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.resetTraffic")).WithCallbackData(t.encodeQuery("client_individual_links")), + tu.InlineKeyboardButton(t.I18nBot("qrCode")).WithCallbackData(t.encodeQuery("client_qr_links")), + ), + ) + + if isAdmin { + t.SendMsgToTgbot(chatId, msg, numericKeyboard) + } else { + t.SendMsgToTgbot(chatId, msg, clientKeyboard) + } +} + // answerCommand processes incoming command messages from Telegram users. func (t *Tgbot) answerCommand(message *telego.Message, chatId int64, isAdmin bool) { msg, onlyMessage := "", false @@ -796,15 +892,116 @@ func (t *Tgbot) randomShadowSocksPassword() string { // answerCallback processes callback queries from inline keyboards. func (t *Tgbot) answerCallback(callbackQuery *telego.CallbackQuery, isAdmin bool) { chatId := callbackQuery.Message.GetChat().ID + state := t.getClientState(chatId) - if isAdmin { - // get query from hash storage - decodedQuery, err := t.decodeQuery(callbackQuery.Data) + // get query from hash storage + decodedQuery, err := t.decodeQuery(callbackQuery.Data) if err != nil { t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.noQuery")) return } - dataArray := strings.Split(decodedQuery, " ") + dataArray := strings.Split(decodedQuery, " ") + cmd := dataArray[0] + + if isAdmin { + switch cmd { + case "admin_client_sub_links": + inbounds, _ := t.inboundService.GetAllInbounds() + var buttons []telego.InlineKeyboardButton + for _, inbound := range inbounds { + buttons = append(buttons, tu.InlineKeyboardButton(inbound.Remark).WithCallbackData(t.encodeQuery("get_clients_for_sub "+fmt.Sprint(inbound.Id)))) + } + t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.chooseInbound"), tu.InlineKeyboard(tu.InlineKeyboardCols(1, buttons...)...)) + return + case "admin_client_tg_user_links": + inbounds, _ := t.inboundService.GetAllInbounds() + var buttons []telego.InlineKeyboardButton + for _, inbound := range inbounds { + buttons = append(buttons, tu.InlineKeyboardButton(inbound.Remark).WithCallbackData(t.encodeQuery("get_clients_for_tg_user "+fmt.Sprint(inbound.Id)))) + } + t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.chooseInbound"), tu.InlineKeyboard(tu.InlineKeyboardCols(1, buttons...)...)) + return + case "admin_client_individual_links": + inbounds, _ := t.inboundService.GetAllInbounds() + var buttons []telego.InlineKeyboardButton + for _, inbound := range inbounds { + buttons = append(buttons, tu.InlineKeyboardButton(inbound.Remark).WithCallbackData(t.encodeQuery("get_clients_for_individual "+fmt.Sprint(inbound.Id)))) + } + t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.chooseInbound"), tu.InlineKeyboard(tu.InlineKeyboardCols(1, buttons...)...)) + return + case "admin_client_qr_links": + inbounds, _ := t.inboundService.GetAllInbounds() + var buttons []telego.InlineKeyboardButton + for _, inbound := range inbounds { + buttons = append(buttons, tu.InlineKeyboardButton(inbound.Remark).WithCallbackData(t.encodeQuery("get_clients_for_qr "+fmt.Sprint(inbound.Id)))) + } + t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.chooseInbound"), tu.InlineKeyboard(tu.InlineKeyboardCols(1, buttons...)...)) + return + case "get_inbounds": + t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.buttons.allClients")) + inbounds, _ := t.inboundService.GetAllInbounds() + var buttons []telego.InlineKeyboardButton + for _, inbound := range inbounds { + buttons = append(buttons, tu.InlineKeyboardButton(inbound.Remark).WithCallbackData(t.encodeQuery("get_clients "+fmt.Sprint(inbound.Id)))) + } + t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.chooseInbound"), tu.InlineKeyboard(tu.InlineKeyboardCols(1, buttons...)...)) + return + case "get_sorted_traffic_usage_report": + t.deleteMessageTgBot(chatId, callbackQuery.Message.GetMessageID()) + emails, err := t.inboundService.getAllEmails() + if err != nil { + t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.errorOperation"), tu.ReplyKeyboardRemove()) + return + } + traffics := make([]*xray.ClientTraffic, 0, len(emails)) + for _, email := range emails { + traffic, err := t.inboundService.GetClientTrafficByEmail(email) + if err == nil && traffic != nil { + traffics = append(traffics, traffic) + } + } + sort.Slice(traffics, func(i, j int) bool { + return traffics[i].Up+traffics[i].Down > traffics[j].Up+traffics[j].Down + }) + var output strings.Builder + output.WriteString("📊 " + t.I18nBot("tgbot.buttons.SortedTrafficUsageReport") + ":\n\n") + for i, traffic := range traffics { + if i >= 50 { + break + } + output.WriteString(t.clientInfoMsg(traffic, true, false, false, false, false, false)) + output.WriteString("\n") + } + t.SendMsgToTgbot(chatId, output.String()) + return + case "reset_all_traffics": + inlineKeyboard := tu.InlineKeyboard( + tu.InlineKeyboardRow( + tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.cancelReset")).WithCallbackData(t.encodeQuery("reset_all_traffics_cancel")), + ), + tu.InlineKeyboardRow( + tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.confirmResetTraffic")).WithCallbackData(t.encodeQuery("reset_all_traffics_c")), + ), + ) + t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.messages.AreYouSure"), inlineKeyboard) + return + case "reset_all_traffics_c": + t.deleteMessageTgBot(chatId, callbackQuery.Message.GetMessageID()) + emails, err := t.inboundService.getAllEmails() + if err != nil { + t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.errorOperation"), tu.ReplyKeyboardRemove()) + return + } + for _, email := range emails { + _ = t.inboundService.ResetClientTrafficByEmail(email) + } + t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.messages.FinishProcess"), tu.ReplyKeyboardRemove()) + return + case "reset_all_traffics_cancel": + t.deleteMessageTgBot(chatId, callbackQuery.Message.GetMessageID()) + t.SendMsgToTgbotDeleteAfter(chatId, t.I18nBot("tgbot.messages.cancel"), 1, tu.ReplyKeyboardRemove()) + return + } if len(dataArray) >= 2 && len(dataArray[1]) > 0 { email := dataArray[1] @@ -823,6 +1020,20 @@ func (t *Tgbot) answerCallback(callbackQuery *telego.CallbackQuery, isAdmin bool } inbound, _ := t.inboundService.GetInbound(inboundIdInt) t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.chooseClient", "Inbound=="+inbound.Remark), clientsKB) + case "get_clients_for_tg_user": + inboundId := dataArray[1] + inboundIdInt, err := strconv.Atoi(inboundId) + if err != nil { + t.sendCallbackAnswerTgBot(callbackQuery.ID, err.Error()) + return + } + clientsKB, err := t.getInboundClientsFor(inboundIdInt, "tg_user") + if err != nil { + t.sendCallbackAnswerTgBot(callbackQuery.ID, err.Error()) + return + } + inbound, _ := t.inboundService.GetInbound(inboundIdInt) + t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.chooseClient", "Inbound=="+inbound.Remark), clientsKB) case "get_clients_for_individual": inboundId := dataArray[1] inboundIdInt, err := strconv.Atoi(inboundId) @@ -1011,14 +1222,14 @@ func (t *Tgbot) answerCallback(callbackQuery *telego.CallbackQuery, isAdmin bool t.searchClient(chatId, email, callbackQuery.Message.GetMessageID()) case "add_client_limit_traffic_c": limitTraffic, _ := strconv.ParseInt(dataArray[1], 10, 64) - client_TotalGB = limitTraffic * 1024 * 1024 * 1024 + state.TotalGB = limitTraffic * 1024 * 1024 * 1024 messageId := callbackQuery.Message.GetMessageID() - inbound, err := t.inboundService.GetInbound(receiver_inbound_ID) + inbound, err := t.inboundService.GetInbound(state.ReceiverInboundID) if err != nil { t.sendCallbackAnswerTgBot(callbackQuery.ID, err.Error()) return } - message_text, err := t.BuildInboundClientDataMessage(inbound.Remark, inbound.Protocol) + message_text, err := t.BuildInboundClientDataMessage(chatId, inbound.Remark, inbound.Protocol) if err != nil { t.sendCallbackAnswerTgBot(callbackQuery.ID, err.Error()) return @@ -1219,27 +1430,27 @@ func (t *Tgbot) answerCallback(callbackQuery *telego.CallbackQuery, isAdmin bool t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.errorOperation")) t.searchClient(chatId, email, callbackQuery.Message.GetMessageID()) case "add_client_reset_exp_c": - client_ExpiryTime = 0 + state.ExpiryTime = 0 days, _ := strconv.ParseInt(dataArray[1], 10, 64) var date int64 - if client_ExpiryTime > 0 { - if client_ExpiryTime-time.Now().Unix()*1000 < 0 { + if state.ExpiryTime > 0 { + if state.ExpiryTime-time.Now().Unix()*1000 < 0 { date = -int64(days * 24 * 60 * 60000) } else { - date = client_ExpiryTime + int64(days*24*60*60000) + date = state.ExpiryTime + int64(days*24*60*60000) } } else { - date = client_ExpiryTime - int64(days*24*60*60000) + date = state.ExpiryTime - int64(days*24*60*60000) } - client_ExpiryTime = date + state.ExpiryTime = date messageId := callbackQuery.Message.GetMessageID() - inbound, err := t.inboundService.GetInbound(receiver_inbound_ID) + inbound, err := t.inboundService.GetInbound(state.ReceiverInboundID) if err != nil { t.sendCallbackAnswerTgBot(callbackQuery.ID, err.Error()) return } - message_text, err := t.BuildInboundClientDataMessage(inbound.Remark, inbound.Protocol) + message_text, err := t.BuildInboundClientDataMessage(chatId, inbound.Remark, inbound.Protocol) if err != nil { t.sendCallbackAnswerTgBot(callbackQuery.ID, err.Error()) return @@ -1418,16 +1629,16 @@ func (t *Tgbot) answerCallback(callbackQuery *telego.CallbackQuery, isAdmin bool case "add_client_ip_limit_c": if len(dataArray) == 2 { count, _ := strconv.Atoi(dataArray[1]) - client_LimitIP = count + state.LimitIP = count } messageId := callbackQuery.Message.GetMessageID() - inbound, err := t.inboundService.GetInbound(receiver_inbound_ID) + inbound, err := t.inboundService.GetInbound(state.ReceiverInboundID) if err != nil { t.sendCallbackAnswerTgBot(callbackQuery.ID, err.Error()) return } - message_text, err := t.BuildInboundClientDataMessage(inbound.Remark, inbound.Protocol) + message_text, err := t.BuildInboundClientDataMessage(chatId, inbound.Remark, inbound.Protocol) if err != nil { t.sendCallbackAnswerTgBot(callbackQuery.ID, err.Error()) return @@ -1590,21 +1801,21 @@ func (t *Tgbot) answerCallback(callbackQuery *telego.CallbackQuery, isAdmin bool t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.chooseClient", "Inbound=="+inbound.Remark), clients) case "add_client_to": // assign default values to clients variables - client_Id = uuid.New().String() - client_Flow = "" - client_Email = t.randomLowerAndNum(8) - client_LimitIP = 0 - client_TotalGB = 0 - client_ExpiryTime = 0 - client_Enable = true - client_TgID = "" - client_SubID = t.randomLowerAndNum(16) - client_Comment = "" - client_Reset = 0 - client_Security = "auto" - client_ShPassword = t.randomShadowSocksPassword() - client_TrPassword = t.randomLowerAndNum(10) - client_Method = "" + state.Id = uuid.New().String() + state.Flow = "" + state.Email = t.randomLowerAndNum(8) + state.LimitIP = 0 + state.TotalGB = 0 + state.ExpiryTime = 0 + state.Enable = true + state.TgID = "" + state.SubID = t.randomLowerAndNum(16) + state.Comment = "" + state.Reset = 0 + state.Security = "auto" + state.ShPassword = t.randomShadowSocksPassword() + state.TrPassword = t.randomLowerAndNum(10) + state.Method = "" inboundId := dataArray[1] inboundIdInt, err := strconv.Atoi(inboundId) @@ -1612,14 +1823,14 @@ func (t *Tgbot) answerCallback(callbackQuery *telego.CallbackQuery, isAdmin bool t.sendCallbackAnswerTgBot(callbackQuery.ID, err.Error()) return } - receiver_inbound_ID = inboundIdInt + state.ReceiverInboundID = inboundIdInt inbound, err := t.inboundService.GetInbound(inboundIdInt) if err != nil { t.sendCallbackAnswerTgBot(callbackQuery.ID, err.Error()) return } - message_text, err := t.BuildInboundClientDataMessage(inbound.Remark, inbound.Protocol) + message_text, err := t.BuildInboundClientDataMessage(chatId, inbound.Remark, inbound.Protocol) if err != nil { t.sendCallbackAnswerTgBot(callbackQuery.ID, err.Error()) return @@ -1627,45 +1838,10 @@ func (t *Tgbot) answerCallback(callbackQuery *telego.CallbackQuery, isAdmin bool t.addClient(callbackQuery.Message.GetChat().ID, message_text) } - return - } else { - switch callbackQuery.Data { - case "get_inbounds": - inbounds, err := t.getInbounds() - if err != nil { - t.sendCallbackAnswerTgBot(callbackQuery.ID, err.Error()) - return - - } - t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.buttons.allClients")) - t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.chooseInbound"), inbounds) - case "admin_client_sub_links": - inbounds, err := t.getInboundsFor("get_clients_for_sub") - if err != nil { - t.sendCallbackAnswerTgBot(callbackQuery.ID, err.Error()) - return - } - t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.chooseInbound"), inbounds) - case "admin_client_individual_links": - inbounds, err := t.getInboundsFor("get_clients_for_individual") - if err != nil { - t.sendCallbackAnswerTgBot(callbackQuery.ID, err.Error()) - return - } - t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.chooseInbound"), inbounds) - case "admin_client_qr_links": - inbounds, err := t.getInboundsFor("get_clients_for_qr") - if err != nil { - t.sendCallbackAnswerTgBot(callbackQuery.ID, err.Error()) - return - } - t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.chooseInbound"), inbounds) - } - } } - switch callbackQuery.Data { + switch cmd { case "get_usage": t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.buttons.serverUsage")) t.getServerUsage(chatId) @@ -1741,7 +1917,7 @@ func (t *Tgbot) answerCallback(callbackQuery *telego.CallbackQuery, isAdmin bool tgUserID := callbackQuery.From.ID traffics, err := t.inboundService.GetClientTrafficTgBot(tgUserID) if err != nil { - t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.errorOccurred")+"\r\n"+err.Error()) + t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.errorOperation")+"\r\n"+err.Error()) return } if len(traffics) == 0 { @@ -1769,21 +1945,21 @@ func (t *Tgbot) answerCallback(callbackQuery *telego.CallbackQuery, isAdmin bool t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.commands.helpAdminCommands")) case "add_client": // assign default values to clients variables - client_Id = uuid.New().String() - client_Flow = "" - client_Email = t.randomLowerAndNum(8) - client_LimitIP = 0 - client_TotalGB = 0 - client_ExpiryTime = 0 - client_Enable = true - client_TgID = "" - client_SubID = t.randomLowerAndNum(16) - client_Comment = "" - client_Reset = 0 - client_Security = "auto" - client_ShPassword = t.randomShadowSocksPassword() - client_TrPassword = t.randomLowerAndNum(10) - client_Method = "" + state.Id = uuid.New().String() + state.Flow = "" + state.Email = t.randomLowerAndNum(8) + state.LimitIP = 0 + state.TotalGB = 0 + state.ExpiryTime = 0 + state.Enable = true + state.TgID = "" + state.SubID = t.randomLowerAndNum(16) + state.Comment = "" + state.Reset = 0 + state.Security = "auto" + state.ShPassword = t.randomShadowSocksPassword() + state.TrPassword = t.randomLowerAndNum(10) + state.Method = "" inbounds, err := t.getInboundsAddClient() if err != nil { @@ -1800,7 +1976,7 @@ func (t *Tgbot) answerCallback(callbackQuery *telego.CallbackQuery, isAdmin bool tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.use_default")).WithCallbackData("add_client_default_info"), ), ) - prompt_message := t.I18nBot("tgbot.messages.email_prompt", "ClientEmail=="+client_Email) + prompt_message := t.I18nBot("tgbot.messages.email_prompt", "ClientEmail=="+state.Email) t.SendMsgToTgbot(chatId, prompt_message, cancel_btn_markup) case "add_client_ch_default_subid": t.deleteMessageTgBot(chatId, callbackQuery.Message.GetMessageID()) @@ -1810,7 +1986,7 @@ func (t *Tgbot) answerCallback(callbackQuery *telego.CallbackQuery, isAdmin bool tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.use_default")).WithCallbackData("add_client_default_info"), ), ) - prompt_message := t.I18nBot("tgbot.messages.subid_prompt", "ClientSubId=="+client_SubID) + prompt_message := t.I18nBot("tgbot.messages.subid_prompt", "ClientSubId=="+state.SubID) t.SendMsgToTgbot(chatId, prompt_message, cancel_btn_markup) case "add_client_ch_default_flow": @@ -1819,7 +1995,7 @@ func (t *Tgbot) answerCallback(callbackQuery *telego.CallbackQuery, isAdmin bool tu.InlineKeyboardButton("xtls-rprx-vision").WithCallbackData("set_flow_vision"), ), tu.InlineKeyboardRow( - tu.InlineKeyboardButton("xtls-rprx-vision-udp443").WithCallbackData("set_flow_vision_udp443"), + tu.InlineKeyboardButton("xtls-rprx-vision_udp443").WithCallbackData("set_flow_vision_udp443"), ), tu.InlineKeyboardRow( tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.flow_none")).WithCallbackData("set_flow_none"), @@ -1831,26 +2007,26 @@ func (t *Tgbot) answerCallback(callbackQuery *telego.CallbackQuery, isAdmin bool t.editMessageCallbackTgBot(chatId, callbackQuery.Message.GetMessageID(), inlineKeyboard) case "set_flow_vision": - client_Flow = "xtls-rprx-vision" + state.Flow = "xtls-rprx-vision" messageId := callbackQuery.Message.GetMessageID() - inbound, _ := t.inboundService.GetInbound(receiver_inbound_ID) - message_text, _ := t.BuildInboundClientDataMessage(inbound.Remark, inbound.Protocol) + inbound, _ := t.inboundService.GetInbound(state.ReceiverInboundID) + message_text, _ := t.BuildInboundClientDataMessage(chatId, inbound.Remark, inbound.Protocol) t.addClient(chatId, message_text, messageId) t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.successfulOperation")) case "set_flow_vision_udp443": - client_Flow = "xtls-rprx-vision-udp443" + state.Flow = "xtls-rprx-vision-udp443" messageId := callbackQuery.Message.GetMessageID() - inbound, _ := t.inboundService.GetInbound(receiver_inbound_ID) - message_text, _ := t.BuildInboundClientDataMessage(inbound.Remark, inbound.Protocol) + inbound, _ := t.inboundService.GetInbound(state.ReceiverInboundID) + message_text, _ := t.BuildInboundClientDataMessage(chatId, inbound.Remark, inbound.Protocol) t.addClient(chatId, message_text, messageId) t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.successfulOperation")) case "set_flow_none": - client_Flow = "" + state.Flow = "" messageId := callbackQuery.Message.GetMessageID() - inbound, _ := t.inboundService.GetInbound(receiver_inbound_ID) - message_text, _ := t.BuildInboundClientDataMessage(inbound.Remark, inbound.Protocol) + inbound, _ := t.inboundService.GetInbound(state.ReceiverInboundID) + message_text, _ := t.BuildInboundClientDataMessage(chatId, inbound.Remark, inbound.Protocol) t.addClient(chatId, message_text, messageId) t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.successfulOperation")) case "add_client_ch_default_id": @@ -1861,7 +2037,7 @@ func (t *Tgbot) answerCallback(callbackQuery *telego.CallbackQuery, isAdmin bool tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.use_default")).WithCallbackData("add_client_default_info"), ), ) - prompt_message := t.I18nBot("tgbot.messages.id_prompt", "ClientId=="+client_Id) + prompt_message := t.I18nBot("tgbot.messages.id_prompt", "ClientId=="+state.Id) t.SendMsgToTgbot(chatId, prompt_message, cancel_btn_markup) case "add_client_ch_default_pass_tr": t.deleteMessageTgBot(chatId, callbackQuery.Message.GetMessageID()) @@ -1871,7 +2047,7 @@ func (t *Tgbot) answerCallback(callbackQuery *telego.CallbackQuery, isAdmin bool tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.use_default")).WithCallbackData("add_client_default_info"), ), ) - prompt_message := t.I18nBot("tgbot.messages.pass_prompt", "ClientPassword=="+client_TrPassword) + prompt_message := t.I18nBot("tgbot.messages.pass_prompt", "ClientPassword=="+state.TrPassword) t.SendMsgToTgbot(chatId, prompt_message, cancel_btn_markup) case "add_client_ch_default_pass_sh": t.deleteMessageTgBot(chatId, callbackQuery.Message.GetMessageID()) @@ -1881,7 +2057,7 @@ func (t *Tgbot) answerCallback(callbackQuery *telego.CallbackQuery, isAdmin bool tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.use_default")).WithCallbackData("add_client_default_info"), ), ) - prompt_message := t.I18nBot("tgbot.messages.pass_prompt", "ClientPassword=="+client_ShPassword) + prompt_message := t.I18nBot("tgbot.messages.pass_prompt", "ClientPassword=="+state.ShPassword) t.SendMsgToTgbot(chatId, prompt_message, cancel_btn_markup) case "add_client_ch_default_comment": t.deleteMessageTgBot(chatId, callbackQuery.Message.GetMessageID()) @@ -1891,7 +2067,7 @@ func (t *Tgbot) answerCallback(callbackQuery *telego.CallbackQuery, isAdmin bool tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.use_default")).WithCallbackData("add_client_default_info"), ), ) - prompt_message := t.I18nBot("tgbot.messages.comment_prompt", "ClientComment=="+client_Comment) + prompt_message := t.I18nBot("tgbot.messages.comment_prompt", "ClientComment=="+state.Comment) t.SendMsgToTgbot(chatId, prompt_message, cancel_btn_markup) case "add_client_ch_default_traffic": inlineKeyboard := tu.InlineKeyboard( @@ -1984,8 +2160,8 @@ func (t *Tgbot) answerCallback(callbackQuery *telego.CallbackQuery, isAdmin bool t.deleteMessageTgBot(chatId, callbackQuery.Message.GetMessageID()) t.SendMsgToTgbotDeleteAfter(chatId, t.I18nBot("tgbot.messages.using_default_value"), 3, tu.ReplyKeyboardRemove()) delete(userStates, chatId) - inbound, _ := t.inboundService.GetInbound(receiver_inbound_ID) - message_text, _ := t.BuildInboundClientDataMessage(inbound.Remark, inbound.Protocol) + inbound, _ := t.inboundService.GetInbound(state.ReceiverInboundID) + message_text, _ := t.BuildInboundClientDataMessage(chatId, inbound.Remark, inbound.Protocol) t.addClient(chatId, message_text) case "add_client_cancel": delete(userStates, chatId) @@ -1993,12 +2169,27 @@ func (t *Tgbot) answerCallback(callbackQuery *telego.CallbackQuery, isAdmin bool t.SendMsgToTgbotDeleteAfter(chatId, t.I18nBot("tgbot.messages.cancel"), 3, tu.ReplyKeyboardRemove()) case "add_client_default_traffic_exp": messageId := callbackQuery.Message.GetMessageID() - inbound, err := t.inboundService.GetInbound(receiver_inbound_ID) + inbound, err := t.inboundService.GetInbound(state.ReceiverInboundID) if err != nil { t.sendCallbackAnswerTgBot(callbackQuery.ID, err.Error()) return } - message_text, err := t.BuildInboundClientDataMessage(inbound.Remark, inbound.Protocol) + message_text, err := t.BuildInboundClientDataMessage(chatId, inbound.Remark, inbound.Protocol) + if err != nil { + t.sendCallbackAnswerTgBot(callbackQuery.ID, err.Error()) + return + } + + t.addClient(callbackQuery.Message.GetChat().ID, message_text, messageId) + t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.successfulOperation")) + case "add_client_default_ip_limit": + messageId := callbackQuery.Message.GetMessageID() + inbound, err := t.inboundService.GetInbound(state.ReceiverInboundID) + if err != nil { + t.sendCallbackAnswerTgBot(callbackQuery.ID, err.Error()) + return + } + message_text, err := t.BuildInboundClientDataMessage(chatId, inbound.Remark, inbound.Protocol) if err != nil { t.sendCallbackAnswerTgBot(callbackQuery.ID, err.Error()) return @@ -2007,26 +2198,30 @@ func (t *Tgbot) answerCallback(callbackQuery *telego.CallbackQuery, isAdmin bool t.addClient(callbackQuery.Message.GetChat().ID, message_text, messageId) t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.successfulOperation")) case "add_client_submit_enable": - client_Enable = true + state.Enable = true t.submitAddClient(callbackQuery) case "add_client_submit_disable": - client_Enable = false + state.Enable = false t.submitAddClient(callbackQuery) } - } - func (t *Tgbot) submitAddClient(callbackQuery *telego.CallbackQuery) { chatId := callbackQuery.Message.GetChat().ID - success, err := t.SubmitAddClient() - if success { + needRestart, err := t.SubmitAddClient(chatId) + if err == nil { t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.successfulOperation")) t.deleteMessageTgBot(chatId, callbackQuery.Message.GetMessageID()) - t.SendMsgToTgbotDeleteAfter(chatId, t.I18nBot("tgbot.messages.clientAdded"), 3, tu.ReplyKeyboardRemove()) - t.xrayService.SetToNeedRestart() + t.SendMsgToTgbotDeleteAfter(chatId, t.I18nBot("tgbot.answers.successfulOperation"), 3, tu.ReplyKeyboardRemove()) + if needRestart { + t.xrayService.SetToNeedRestart() + } } else { - t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.errorOccurred")) - t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.errorOccurred")+"\r\n"+err.Error()) + t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.errorOperation")) + errMsg := "" + if err != nil { + errMsg = "\r\n" + err.Error() + } + t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.errorOperation")+errMsg) } } @@ -2034,7 +2229,7 @@ func (t *Tgbot) submitAddClient(callbackQuery *telego.CallbackQuery) { func (t *Tgbot) getCommonClientButtons() [][]telego.InlineKeyboardButton { return [][]telego.InlineKeyboardButton{ tu.InlineKeyboardRow( - tu.InlineKeyboardButton("📝 Sub ID").WithCallbackData("add_client_ch_default_subid"), + tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.change_subid")).WithCallbackData("add_client_ch_default_subid"), ), tu.InlineKeyboardRow( tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.limitTraffic")).WithCallbackData("add_client_ch_default_traffic"), @@ -2056,7 +2251,8 @@ func (t *Tgbot) getCommonClientButtons() [][]telego.InlineKeyboardButton { // addClient handles the process of adding a new client to an inbound. func (t *Tgbot) addClient(chatId int64, msg string, messageID ...int) { - inbound, err := t.inboundService.GetInbound(receiver_inbound_ID) + state := t.getClientState(chatId) + inbound, err := t.inboundService.GetInbound(state.ReceiverInboundID) if err != nil { t.SendMsgToTgbot(chatId, err.Error()) return @@ -2087,10 +2283,10 @@ func (t *Tgbot) addClient(chatId int64, msg string, messageID ...int) { } if canUseFlow { protocolRows = append(protocolRows, tu.InlineKeyboardRow( - tu.InlineKeyboardButton("🌊 Flow").WithCallbackData("add_client_ch_default_flow"), + tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.change_flow")).WithCallbackData("add_client_ch_default_flow"), )) } else { - client_Flow = "" + state.Flow = "" } } case model.Trojan: @@ -2179,22 +2375,19 @@ func (t *Tgbot) getExhausted(chatId int64) { inbounds, _ := t.inboundService.GetAllInbounds() for _, inbound := range inbounds { if !inbound.Enable { - disabledInbounds = append(disabledInbounds, inbound) + disabledInbounds = append(disabledInbounds, *inbound) continue } if (inbound.Total > 0 && inbound.Total-(inbound.Up+inbound.Down) < trDiff) || (inbound.ExpiryTime > 0 && inbound.ExpiryTime-now < exDiff) { - exhaustedInbounds = append(exhaustedInbounds, inbound) + exhaustedInbounds = append(exhaustedInbounds, *inbound) } clients, _ := t.inboundService.GetClients(inbound) for _, client := range clients { if !client.Enable { - disabledClients = append(disabledClients, client) + disabledClients = append(disabledClients, xray.ClientTraffic{Email: client.Email}) continue } - if (client.Total > 0 && client.Total-(client.Up+client.Down) < trDiff) || (client.ExpiryTime > 0 && client.ExpiryTime-now < exDiff) { - exhaustedClients = append(exhaustedClients, client) - } } } @@ -2330,20 +2523,27 @@ func (t *Tgbot) sendClientSubLinks(chatId int64, email string) { return } - subUrl, err := t.settingService.GetSubUrl() + subUrl, err := t.settingService.GetSubURI() if err != nil || subUrl == "" { t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.messages.subUrlNotSet")) return } msg := t.I18nBot("tgbot.messages.subLinks", "Email=="+email) - msg += fmt.Sprintf("\n`%s/sub/%s`", subUrl, traffic.SubId) + msg += fmt.Sprintf("\n`%s%s`", subUrl, traffic.SubId) t.SendMsgToTgbot(chatId, msg) } // sendClientIndividualLinks sends individual xray links for a client. func (t *Tgbot) sendClientIndividualLinks(chatId int64, email string) { - links, err := t.inboundService.GetClientLinksByEmail(email) + traffic, err := t.inboundService.GetClientTrafficByEmail(email) + if err != nil || traffic == nil { + t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.noResult")) + return + } + + host, _ := t.settingService.GetWebDomain() + links, err := t.inboundService.GetClientLinks(host, traffic.InboundId, email) if err != nil || len(links) == 0 { t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.noResult")) return @@ -2358,9 +2558,14 @@ func (t *Tgbot) sendClientIndividualLinks(chatId int64, email string) { // sendClientQRLinks sends QR codes for a client's links. func (t *Tgbot) sendClientQRLinks(chatId int64, email string) { - links, err := t.inboundService.GetClientLinksByEmail(email) + traffic, err := t.inboundService.GetClientTrafficByEmail(email) + if err != nil || traffic == nil { + return + } + + host, _ := t.settingService.GetWebDomain() + links, err := t.inboundService.GetClientLinks(host, traffic.InboundId, email) if err != nil || len(links) == 0 { - t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.noResult")) return } @@ -2375,27 +2580,32 @@ func (t *Tgbot) sendClientQRLinks(chatId int64, email string) { // onlineClients retrieves and sends information about currently online clients. func (t *Tgbot) onlineClients(chatId int64, messageID ...int) { - onlineClients := t.xrayService.GetOnlineClients() - msg := "" - if len(onlineClients) == 0 { - msg = t.I18nBot("tgbot.messages.noOnlines") - } else { - msg = "👥 " + t.I18nBot("tgbot.buttons.onlines") + ":\n" - for _, email := range onlineClients { - msg += fmt.Sprintf("- %s\n", email) - } + if !p.IsRunning() { + return } - inlineKeyboard := tu.InlineKeyboard( - tu.InlineKeyboardRow( - tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.refresh")).WithCallbackData(t.encodeQuery("onlines_refresh")), - ), - ) + onlines := p.GetOnlineClients() + onlinesCount := len(onlines) + output := t.I18nBot("tgbot.messages.onlinesCount", "Count=="+fmt.Sprint(onlinesCount)) + keyboard := tu.InlineKeyboard(tu.InlineKeyboardRow( + tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.refresh")).WithCallbackData(t.encodeQuery("onlines_refresh")))) + + if onlinesCount > 0 { + var buttons []telego.InlineKeyboardButton + for _, online := range onlines { + buttons = append(buttons, tu.InlineKeyboardButton(online).WithCallbackData(t.encodeQuery("client_get_usage "+online))) + } + cols := 2 + if onlinesCount >= 10 { + cols = 3 + } + keyboard.InlineKeyboard = append(keyboard.InlineKeyboard, tu.InlineKeyboardCols(cols, buttons...)...) + } if len(messageID) > 0 { - t.editMessageTgBot(chatId, messageID[0], msg, inlineKeyboard) + t.editMessageTgBot(chatId, messageID[0], output, keyboard) } else { - t.SendMsgToTgbot(chatId, msg, inlineKeyboard) + t.SendMsgToTgbot(chatId, output, keyboard) } } @@ -2409,10 +2619,10 @@ func (t *Tgbot) getServerUsage(chatId int64, messageID ...int) { msg := "📊 " + t.I18nBot("tgbot.buttons.serverUsage") + ":\n" msg += t.I18nBot("tgbot.messages.cpu", "Usage=="+fmt.Sprintf("%.2f", status.Cpu)) - msg += t.I18nBot("tgbot.messages.mem", "Usage=="+common.FormatTraffic(status.Mem.Used), "Total=="+common.FormatTraffic(status.Mem.Total)) - msg += t.I18nBot("tgbot.messages.swap", "Usage=="+common.FormatTraffic(status.Swap.Used), "Total=="+common.FormatTraffic(status.Swap.Total)) - msg += t.I18nBot("tgbot.messages.disk", "Usage=="+common.FormatTraffic(status.Disk.Used), "Total=="+common.FormatTraffic(status.Disk.Total)) - msg += t.I18nBot("tgbot.messages.uptime", "Time=="+common.FormatDuration(status.Uptime)) + msg += t.I18nBot("tgbot.messages.mem", "Usage=="+common.FormatTraffic(int64(status.Mem.Current)), "Total=="+common.FormatTraffic(int64(status.Mem.Total))) + msg += t.I18nBot("tgbot.messages.swap", "Usage=="+common.FormatTraffic(int64(status.Swap.Current)), "Total=="+common.FormatTraffic(int64(status.Swap.Total))) + msg += t.I18nBot("tgbot.messages.disk", "Usage=="+common.FormatTraffic(int64(status.Disk.Current)), "Total=="+common.FormatTraffic(int64(status.Disk.Total))) + msg += t.I18nBot("tgbot.messages.uptime", "Time=="+strconv.FormatUint(status.Uptime/86400, 10)) inlineKeyboard := tu.InlineKeyboard( tu.InlineKeyboardRow( @@ -2440,13 +2650,13 @@ func (t *Tgbot) getInboundUsages() string { // getClientUsage retrieves and sends the usage statistics for a client by its Telegram ID or email. func (t *Tgbot) getClientUsage(chatId int64, tgUserID int64, email ...string) { - var traffics []xray.ClientTraffic + var traffics []*xray.ClientTraffic var err error if len(email) > 0 { traffic, err := t.inboundService.GetClientTrafficByEmail(email[0]) if err == nil && traffic != nil { - traffics = append(traffics, *traffic) + traffics = append(traffics, traffic) } } else { traffics, err = t.inboundService.GetClientTrafficTgBot(tgUserID) @@ -2458,61 +2668,51 @@ func (t *Tgbot) getClientUsage(chatId int64, tgUserID int64, email ...string) { } for _, traffic := range traffics { - t.SendMsgToTgbot(chatId, t.clientInfoMsg(&traffic, true, true, true, true, true, false)) + t.SendMsgToTgbot(chatId, t.clientInfoMsg(traffic, true, true, true, true, true, false)) } } // searchClientIps retrieves and sends the IP log for a client by email. func (t *Tgbot) searchClientIps(chatId int64, email string, messageID ...int) { - ips, err := t.inboundService.GetClientIps(email) + ips, err := t.inboundService.GetInboundClientIps(email) if err != nil { t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.wentWrong")) return } - msg := t.I18nBot("tgbot.answers.getIpLog", "Email=="+email) + "\n" - if len(ips) == 0 { - msg += t.I18nBot("tgbot.messages.noIps") - } else { - for _, ip := range ips { - msg += fmt.Sprintf("- `%s`\n", ip) - } - } + output := t.I18nBot("tgbot.messages.email", "Email=="+email) + "\n" + ips inlineKeyboard := tu.InlineKeyboard( tu.InlineKeyboardRow( tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.refresh")).WithCallbackData(t.encodeQuery("ips_refresh "+email)), ), tu.InlineKeyboardRow( - tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.clearIps")).WithCallbackData(t.encodeQuery("clear_ips "+email)), - ), - tu.InlineKeyboardRow( - tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.cancel")).WithCallbackData(t.encodeQuery("ips_cancel "+email)), + tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.clearIPs")).WithCallbackData(t.encodeQuery("clear_ips "+email)), ), ) if len(messageID) > 0 { - t.editMessageTgBot(chatId, messageID[0], msg, inlineKeyboard) + t.editMessageTgBot(chatId, messageID[0], output, inlineKeyboard) } else { - t.SendMsgToTgbot(chatId, msg, inlineKeyboard) + t.SendMsgToTgbot(chatId, output, inlineKeyboard) } } // clientTelegramUserInfo retrieves and sends Telegram user info for a client. func (t *Tgbot) clientTelegramUserInfo(chatId int64, email string, messageID ...int) { - traffic, err := t.inboundService.GetClientTrafficByEmail(email) - if err != nil || traffic == nil { + traffic, client, err := t.inboundService.GetClientByEmail(email) + if err != nil || client == nil { t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.noResult")) return } - msg := t.I18nBot("tgbot.answers.getUserInfo", "Email=="+email) + "\n" - if traffic.TgId == 0 { - msg += t.I18nBot("tgbot.messages.noTGUser") - } else { - msg += t.I18nBot("tgbot.messages.tgUser", "ID=="+strconv.FormatInt(traffic.TgId, 10)) + tgId := "None" + if client.TgID != 0 { + tgId = strconv.FormatInt(client.TgID, 10) } + output := t.I18nBot("tgbot.messages.email", "Email=="+email) + "\nTelegram ID: " + tgId + inlineKeyboard := tu.InlineKeyboard( tu.InlineKeyboardRow( tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.refresh")).WithCallbackData(t.encodeQuery("tgid_refresh "+email)), @@ -2520,85 +2720,119 @@ func (t *Tgbot) clientTelegramUserInfo(chatId int64, email string, messageID ... tu.InlineKeyboardRow( tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.removeTGUser")).WithCallbackData(t.encodeQuery("tgid_remove "+email)), ), - tu.InlineKeyboardRow( - tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.cancel")).WithCallbackData(t.encodeQuery("tgid_cancel "+email)), - ), ) if len(messageID) > 0 { - t.editMessageTgBot(chatId, messageID[0], msg, inlineKeyboard) + t.editMessageTgBot(chatId, messageID[0], output, inlineKeyboard) } else { - t.SendMsgToTgbot(chatId, msg, inlineKeyboard) + t.SendMsgToTgbot(chatId, output, inlineKeyboard) } + + requestUsers := &telego.KeyboardButtonRequestUsers{ + RequestID: int32(traffic.Id), + UserIsBot: new(bool), // false + } + keyboard := tu.Keyboard( + tu.KeyboardRow( + tu.KeyboardButton(t.I18nBot("tgbot.buttons.selectTGUser")).WithRequestUsers(requestUsers), + ), + tu.KeyboardRow( + tu.KeyboardButton(t.I18nBot("tgbot.buttons.closeKeyboard")), + ), + ).WithIsPersistent().WithResizeKeyboard() + t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.buttons.selectOneTGUser"), keyboard) } // sendBackup sends a database backup file to the specified chat. func (t *Tgbot) sendBackup(chatId int64) { dbPath := config.GetDBPath() file, err := os.Open(dbPath) - if err != nil { - t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.wentWrong")) - return - } - defer file.Close() - - doc := tu.Document(tu.ID(chatId), tu.File(file)) - _, err = bot.SendDocument(doc) - if err != nil { - t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.wentWrong")) + if err == nil { + defer file.Close() + doc := tu.Document(tu.ID(chatId), tu.FileFromReader(file, "x-ui.db")) + _, _ = bot.SendDocument(context.Background(), doc) } } // sendBanLogs sends the ban logs to the specified chat. -func (t *Tgbot) sendBanLogs(chatId int64, isAdmin bool) { - // Implementation depends on how ban logs are stored. - // This is a placeholder. - t.SendMsgToTgbot(chatId, "Ban logs feature is not implemented yet.") +func (t *Tgbot) sendBanLogs(chatId int64, dt bool) { + file, err := os.Open(xray.GetIPLimitBannedLogPath()) + if err == nil { + defer file.Close() + stat, _ := file.Stat() + if stat.Size() > 0 { + doc := tu.Document(tu.ID(chatId), tu.FileFromReader(file, "ban.log")) + _, _ = bot.SendDocument(context.Background(), doc) + return + } + } + t.SendMsgToTgbot(chatId, "🚫 "+t.I18nBot("tgbot.noResult")) } // SendPhotoToTgbot sends a photo to the Telegram bot. func (t *Tgbot) SendPhotoToTgbot(chatId int64, photo []byte, caption string) { - photoMsg := tu.Photo(tu.ID(chatId), tu.File(io.NopCloser(strings.NewReader(string(photo))))) + reader := strings.NewReader(string(photo)) + photoMsg := tu.Photo(tu.ID(chatId), tu.FileFromReader(reader, "qr.png")) photoMsg.Caption = caption - _, _ = bot.SendPhoto(photoMsg) + photoMsg.ParseMode = "HTML" + _, _ = bot.SendPhoto(context.Background(), photoMsg) } // sendCallbackAnswerTgBot sends an answer to a callback query. func (t *Tgbot) sendCallbackAnswerTgBot(callbackQueryID string, text string) { - _ = bot.AnswerCallbackQuery(tu.CallbackQueryAnswer(callbackQueryID).WithText(text)) + _ = bot.AnswerCallbackQuery(context.Background(), &telego.AnswerCallbackQueryParams{ + CallbackQueryID: callbackQueryID, + Text: text, + }) } // editMessageTgBot edits an existing message in the Telegram bot. -func (t *Tgbot) editMessageTgBot(chatId int64, messageID int, text string, replyMarkup ...telego.ReplyMarkup) { - editMsg := tu.EditMessageText(tu.ID(chatId), messageID, text) - if len(replyMarkup) > 0 { - editMsg.ReplyMarkup = replyMarkup[0].(*telego.InlineKeyboardMarkup) +func (t *Tgbot) editMessageTgBot(chatId int64, messageID int, text string, replyMarkup ...*telego.InlineKeyboardMarkup) { + editMsg := &telego.EditMessageTextParams{ + ChatID: tu.ID(chatId), + MessageID: messageID, + Text: text, + ParseMode: "HTML", } - _, _ = bot.EditMessageText(editMsg) + if len(replyMarkup) > 0 { + editMsg.ReplyMarkup = replyMarkup[0] + } + _, _ = bot.EditMessageText(context.Background(), editMsg) } // editMessageCallbackTgBot edits a message's reply markup based on a callback query. -func (t *Tgbot) editMessageCallbackTgBot(chatId int64, messageID int, replyMarkup telego.ReplyMarkup) { - editMsg := tu.EditMessageReplyMarkup(tu.ID(chatId), messageID) - editMsg.ReplyMarkup = replyMarkup.(*telego.InlineKeyboardMarkup) - _, _ = bot.EditMessageReplyMarkup(editMsg) +func (t *Tgbot) editMessageCallbackTgBot(chatId int64, messageID int, replyMarkup *telego.InlineKeyboardMarkup) { + editMsg := &telego.EditMessageReplyMarkupParams{ + ChatID: tu.ID(chatId), + MessageID: messageID, + ReplyMarkup: replyMarkup, + } + _, _ = bot.EditMessageReplyMarkup(context.Background(), editMsg) } // deleteMessageTgBot deletes a message in the Telegram bot. func (t *Tgbot) deleteMessageTgBot(chatId int64, messageID int) { - _ = bot.DeleteMessage(&telego.DeleteMessageParams{ChatID: tu.ID(chatId), MessageID: messageID}) + _ = bot.DeleteMessage(context.Background(), &telego.DeleteMessageParams{ChatID: tu.ID(chatId), MessageID: messageID}) } // SendMsgToTgbotDeleteAfter sends a message and deletes it after a specified time. func (t *Tgbot) SendMsgToTgbotDeleteAfter(chatId int64, msg string, seconds int, replyMarkup ...telego.ReplyMarkup) { - sentMsg, err := bot.SendMessage(tu.Message(tu.ID(chatId), msg)) + var replyMarkupParam telego.ReplyMarkup + if len(replyMarkup) > 0 { + replyMarkupParam = replyMarkup[0] + } + + sentMsg, err := bot.SendMessage(context.Background(), &telego.SendMessageParams{ + ChatID: tu.ID(chatId), + Text: msg, + ParseMode: "HTML", + ReplyMarkup: replyMarkupParam, + }) if err == nil { - if len(replyMarkup) > 0 { - // update markup - } go func() { time.Sleep(time.Duration(seconds) * time.Second) t.deleteMessageTgBot(chatId, sentMsg.MessageID) + delete(userStates, chatId) }() } } @@ -2609,47 +2843,365 @@ func (t *Tgbot) isSingleWord(s string) bool { } // BuildInboundClientDataMessage builds a message with the current client configuration. -func (t *Tgbot) BuildInboundClientDataMessage(remark string, protocol model.Protocol) (string, error) { +func (t *Tgbot) BuildInboundClientDataMessage(chatId int64, remark string, protocol model.Protocol) (string, error) { + state := t.getClientState(chatId) msg := fmt.Sprintf("📝 *%s* (%s)\n\n", remark, protocol) - msg += fmt.Sprintf("📧 Email: `%s`\n", client_Email) + msg += fmt.Sprintf("📧 %s: `%s`\n", t.I18nBot("pages.inbounds.email"), state.Email) switch protocol { case model.VMESS, model.VLESS: - msg += fmt.Sprintf("🆔 ID: `%s`\n", client_Id) - if protocol == model.VLESS && client_Flow != "" { - msg += fmt.Sprintf("🌊 Flow: `%s`\n", client_Flow) + msg += fmt.Sprintf("🆔 %s: `%s`\n", "ID", state.Id) + if protocol == model.VLESS && state.Flow != "" { + msg += fmt.Sprintf("🌊 %s `%s`\n", t.I18nBot("tgbot.messages.client_flow"), state.Flow) } case model.Trojan: - msg += fmt.Sprintf("🔑 Password: `%s`\n", client_TrPassword) + msg += fmt.Sprintf("🔑 %s: `%s`\n", t.I18nBot("password"), state.TrPassword) case model.Shadowsocks: - msg += fmt.Sprintf("🔑 Password: `%s`\n", client_ShPassword) + msg += fmt.Sprintf("🔑 %s: `%s`\n", t.I18nBot("password"), state.ShPassword) } - msg += fmt.Sprintf("📝 Sub ID: `%s`\n", client_SubID) + msg += fmt.Sprintf("📝 %s `%s`\n", t.I18nBot("tgbot.messages.client_subid"), state.SubID) trafficLimit := t.I18nBot("tgbot.unlimited") - if client_TotalGB > 0 { - trafficLimit = common.FormatTraffic(client_TotalGB) + if state.TotalGB > 0 { + trafficLimit = common.FormatTraffic(state.TotalGB) } - msg += fmt.Sprintf("📊 Traffic Limit: %s\n", trafficLimit) + msg += fmt.Sprintf("📊 %s: %s\n", t.I18nBot("tgbot.buttons.limitTraffic"), trafficLimit) expireTime := t.I18nBot("tgbot.unlimited") - if client_ExpiryTime < 0 { - expireTime = fmt.Sprintf("%d %s", -client_ExpiryTime/(24*60*60*1000), t.I18nBot("tgbot.days")) - } else if client_ExpiryTime > 0 { - expireTime = time.Unix(client_ExpiryTime/1000, 0).Format("2006-01-02 15:04:05") + if state.ExpiryTime < 0 { + expireTime = fmt.Sprintf("%d %s", -state.ExpiryTime/(24*60*60*1000), t.I18nBot("tgbot.days")) + } else if state.ExpiryTime > 0 { + expireTime = time.Unix(state.ExpiryTime/1000, 0).Format("2006-01-02 15:04:05") } - msg += fmt.Sprintf("📅 Expire Time: %s\n", expireTime) + msg += fmt.Sprintf("📅 %s: %s\n", t.I18nBot("pages.client.expireDate"), expireTime) ipLimit := t.I18nBot("tgbot.unlimited") - if client_LimitIP > 0 { - ipLimit = strconv.Itoa(client_LimitIP) + if state.LimitIP > 0 { + ipLimit = strconv.Itoa(state.LimitIP) } - msg += fmt.Sprintf("🚫 IP Limit: %s\n", ipLimit) + msg += fmt.Sprintf("🚫 %s: %s\n", t.I18nBot("pages.inbounds.IPLimit"), ipLimit) - if client_Comment != "" { - msg += fmt.Sprintf("💬 Comment: %s\n", client_Comment) + if state.Comment != "" { + msg += fmt.Sprintf("💬 %s: %s\n", t.I18nBot("comment"), state.Comment) } return msg, nil } + +func (t *Tgbot) getInbounds() (*telego.InlineKeyboardMarkup, error) { + inbounds, err := t.inboundService.GetAllInbounds() + if err != nil { + return nil, err + } + var buttons []telego.InlineKeyboardButton + for _, inbound := range inbounds { + buttons = append(buttons, tu.InlineKeyboardButton(inbound.Remark).WithCallbackData(t.encodeQuery("get_clients "+strconv.Itoa(inbound.Id)))) + } + cols := 1 + if len(buttons) >= 6 { + cols = 2 + } + keyboard := tu.InlineKeyboardGrid(tu.InlineKeyboardCols(cols, buttons...)) + return keyboard, nil +} + +func (t *Tgbot) getInboundClients(id int) (*telego.InlineKeyboardMarkup, error) { + inbound, err := t.inboundService.GetInbound(id) + if err != nil { + return nil, err + } + clients, err := t.inboundService.GetClients(inbound) + if err != nil { + return nil, err + } + var buttons []telego.InlineKeyboardButton + for _, client := range clients { + buttons = append(buttons, tu.InlineKeyboardButton(client.Email).WithCallbackData(t.encodeQuery("client_get_usage "+client.Email))) + } + cols := 2 + if len(buttons) >= 10 { + cols = 3 + } + keyboard := tu.InlineKeyboardGrid(tu.InlineKeyboardCols(cols, buttons...)) + return keyboard, nil +} + +func (t *Tgbot) getInboundsAddClient() (*telego.InlineKeyboardMarkup, error) { + inbounds, err := t.inboundService.GetAllInbounds() + if err != nil { + return nil, err + } + var buttons []telego.InlineKeyboardButton + for _, inbound := range inbounds { + buttons = append(buttons, tu.InlineKeyboardButton(inbound.Remark).WithCallbackData(t.encodeQuery("add_client_to "+strconv.Itoa(inbound.Id)))) + } + cols := 1 + if len(buttons) >= 6 { + cols = 2 + } + keyboard := tu.InlineKeyboardGrid(tu.InlineKeyboardCols(cols, buttons...)) + return keyboard, nil +} + +func (t *Tgbot) clientInfoMsg(traffic *xray.ClientTraffic, showTraffic, showExpiry, showIP, showTG, showOnline, showRefresh bool) string { + msg := "" + msg += t.I18nBot("tgbot.messages.email", "Email=="+traffic.Email) + if showTraffic { + msg += t.I18nBot("tgbot.messages.traffic", "Total=="+common.FormatTraffic(traffic.Up+traffic.Down), "Upload=="+common.FormatTraffic(traffic.Up), "Download=="+common.FormatTraffic(traffic.Down)) + limit := t.I18nBot("tgbot.unlimited") + if traffic.Total > 0 { + limit = common.FormatTraffic(traffic.Total) + } + msg += t.I18nBot("tgbot.messages.total", "UpDown=="+common.FormatTraffic(traffic.Up+traffic.Down), "Total=="+limit) + } + if showExpiry { + if traffic.ExpiryTime == 0 { + msg += t.I18nBot("tgbot.messages.expire", "Time=="+t.I18nBot("tgbot.unlimited")) + } else { + msg += t.I18nBot("tgbot.messages.expire", "Time=="+time.Unix(traffic.ExpiryTime/1000, 0).Format("2006-01-02 15:04:05")) + } + } + if showOnline { + status := t.I18nBot("tgbot.offline") + if p != nil && slices.Contains(p.GetOnlineClients(), traffic.Email) { + status = t.I18nBot("tgbot.online") + } + msg += t.I18nBot("tgbot.messages.online", "Status=="+status) + } + return msg + "\r\n" +} + +func (t *Tgbot) SendMsgToTgbot(chatId int64, msg string, replyMarkup ...telego.ReplyMarkup) { + if !isRunning { + return + } + params := &telego.SendMessageParams{ + ChatID: tu.ID(chatId), + Text: msg, + ParseMode: "HTML", + } + if len(replyMarkup) > 0 { + params.ReplyMarkup = replyMarkup[0] + } + _, _ = bot.SendMessage(context.Background(), params) +} + +func (t *Tgbot) SubmitAddClient(chatId int64) (bool, error) { + state := t.getClientState(chatId) + client := model.Client{ + ID: state.Id, + Flow: state.Flow, + Email: state.Email, + LimitIP: state.LimitIP, + TotalGB: state.TotalGB, + ExpiryTime: state.ExpiryTime, + Enable: state.Enable, + TgID: 0, + SubID: state.SubID, + Comment: state.Comment, + Reset: state.Reset, + } + + settings, _ := json.Marshal(map[string][]model.Client{ + "clients": {client}, + }) + + inbound := &model.Inbound{ + Id: state.ReceiverInboundID, + Settings: string(settings), + } + + return t.inboundService.AddInboundClient(inbound) +} + +func (t *Tgbot) SendMsgToTgbotAdmins(msg string, replyMarkup ...telego.ReplyMarkup) { + if len(replyMarkup) > 0 { + for _, adminId := range adminIds { + t.SendMsgToTgbot(adminId, msg, replyMarkup[0]) + } + } else { + for _, adminId := range adminIds { + t.SendMsgToTgbot(adminId, msg) + } + } +} + +func (t *Tgbot) SendReport() { + runTime, err := t.settingService.GetTgbotRuntime() + if err == nil && len(runTime) > 0 { + msg := "" + msg += t.I18nBot("tgbot.messages.report", "RunTime=="+runTime) + msg += t.I18nBot("tgbot.messages.datetime", "DateTime=="+time.Now().Format("2006-01-02 15:04:05")) + t.SendMsgToTgbotAdmins(msg) + } + + info := t.sendServerUsage() + t.SendMsgToTgbotAdmins(info) + + t.sendExhaustedToAdmins() + t.notifyExhausted() + + backupEnable, err := t.settingService.GetTgBotBackup() + if err == nil && backupEnable { + t.SendBackupToAdmins() + } +} + +func (t *Tgbot) SendBackupToAdmins() { + if !t.IsRunning() { + return + } + for i, adminId := range adminIds { + t.sendBackup(int64(adminId)) + if i < len(adminIds)-1 { + time.Sleep(1 * time.Second) + } + } +} + +func (t *Tgbot) sendExhaustedToAdmins() { + if !t.IsRunning() { + return + } + for _, adminId := range adminIds { + t.getExhausted(int64(adminId)) + } +} + +func (t *Tgbot) sendServerUsage() string { + return t.prepareServerUsageInfo() +} + +func (t *Tgbot) prepareServerUsageInfo() string { + if cachedStats, found := t.getCachedServerStats(); found { + return cachedStats + } + + info, ipv4, ipv6 := "", "", "" + + if cachedStatus, found := t.getCachedStatus(); found { + t.lastStatus = cachedStatus + } else { + t.lastStatus = t.serverService.GetStatus(t.lastStatus) + t.setCachedStatus(t.lastStatus) + } + onlines := p.GetOnlineClients() + + info += t.I18nBot("tgbot.messages.hostname", "Hostname=="+hostname) + info += t.I18nBot("tgbot.messages.version", "Version=="+config.GetVersion()) + info += t.I18nBot("tgbot.messages.xrayVersion", "XrayVersion=="+fmt.Sprint(t.lastStatus.Xray.Version)) + + interfaces, err := net.Interfaces() + if err == nil { + for _, i := range interfaces { + if (i.Flags & net.FlagUp) != 0 { + addrs, _ := i.Addrs() + for _, address := range addrs { + if ipnet, ok := address.(*net.IPNet); ok && !ipnet.IP.IsLoopback() { + if ipnet.IP.To4() != nil { + ipv4 += ipnet.IP.String() + " " + } else if ipnet.IP.To16() != nil && !ipnet.IP.IsLinkLocalUnicast() { + ipv6 += ipnet.IP.String() + " " + } + } + } + } + } + info += t.I18nBot("tgbot.messages.ipv4", "IPv4=="+ipv4) + info += t.I18nBot("tgbot.messages.ipv6", "IPv6=="+ipv6) + } + + info += t.I18nBot("tgbot.messages.serverUpTime", "UpTime=="+strconv.FormatUint(t.lastStatus.Uptime/86400, 10), "Unit=="+t.I18nBot("tgbot.days")) + info += t.I18nBot("tgbot.messages.serverLoad", "Load1=="+strconv.FormatFloat(t.lastStatus.Loads[0], 'f', 2, 64), "Load2=="+strconv.FormatFloat(t.lastStatus.Loads[1], 'f', 2, 64), "Load3=="+strconv.FormatFloat(t.lastStatus.Loads[2], 'f', 2, 64)) + info += t.I18nBot("tgbot.messages.serverMemory", "Current=="+common.FormatTraffic(int64(t.lastStatus.Mem.Current)), "Total=="+common.FormatTraffic(int64(t.lastStatus.Mem.Total))) + info += t.I18nBot("tgbot.messages.onlinesCount", "Count=="+fmt.Sprint(len(onlines))) + info += t.I18nBot("tgbot.messages.tcpCount", "Count=="+strconv.Itoa(t.lastStatus.TcpCount)) + info += t.I18nBot("tgbot.messages.udpCount", "Count=="+strconv.Itoa(t.lastStatus.UdpCount)) + info += t.I18nBot("tgbot.messages.traffic", "Total=="+common.FormatTraffic(int64(t.lastStatus.NetTraffic.Sent+t.lastStatus.NetTraffic.Recv)), "Upload=="+common.FormatTraffic(int64(t.lastStatus.NetTraffic.Sent)), "Download=="+common.FormatTraffic(int64(t.lastStatus.NetTraffic.Recv))) + info += t.I18nBot("tgbot.messages.xrayStatus", "State=="+fmt.Sprint(t.lastStatus.Xray.State)) + + t.setCachedServerStats(info) + return info +} + +func (t *Tgbot) UserLoginNotify(attempt LoginAttempt) { + if !t.IsRunning() { + return + } + loginNotifyEnabled, err := t.settingService.GetTgBotLoginNotify() + if err != nil || !loginNotifyEnabled { + return + } + msg := "" + switch attempt.Status { + case LoginSuccess: + msg += t.I18nBot("tgbot.messages.loginSuccess") + case LoginFail: + msg += t.I18nBot("tgbot.messages.loginFailed") + if attempt.Reason != "" { + msg += t.I18nBot("tgbot.messages.reason", "Reason=="+attempt.Reason) + } + } + msg += t.I18nBot("tgbot.messages.hostname", "Hostname=="+hostname) + msg += t.I18nBot("tgbot.messages.username", "Username=="+attempt.Username) + msg += t.I18nBot("tgbot.messages.ip", "IP=="+attempt.IP) + msg += t.I18nBot("tgbot.messages.time", "Time=="+attempt.Time) + t.SendMsgToTgbotAdmins(msg) +} + +func (t *Tgbot) notifyExhausted() { + trDiff := int64(0) + exDiff := int64(0) + now := time.Now().Unix() * 1000 + TrafficThreshold, err := t.settingService.GetTrafficDiff() + if err == nil && TrafficThreshold > 0 { + trDiff = int64(TrafficThreshold) * 1073741824 + } + ExpireThreshold, err := t.settingService.GetExpireDiff() + if err == nil && ExpireThreshold > 0 { + exDiff = int64(ExpireThreshold) * 86400000 + } + inbounds, _ := t.inboundService.GetAllInbounds() + + var chatIDsDone []int64 + for _, inbound := range inbounds { + if inbound.Enable { + clients, err := t.inboundService.GetClients(inbound) + if err == nil { + for _, client := range clients { + if client.TgID != 0 && !int64Contains(chatIDsDone, client.TgID) && !checkAdmin(client.TgID) { + traffics, err := t.inboundService.GetClientTrafficTgBot(client.TgID) + if err == nil && len(traffics) > 0 { + var exhausted []xray.ClientTraffic + for _, tr := range traffics { + if tr.Enable { + if (tr.ExpiryTime > 0 && tr.ExpiryTime-now < exDiff) || (tr.Total > 0 && tr.Total-(tr.Up+tr.Down) < trDiff) { + exhausted = append(exhausted, *tr) + } + } + } + if len(exhausted) > 0 { + output := t.I18nBot("tgbot.messages.exhaustedCount", "Type=="+t.I18nBot("tgbot.clients")) + for _, ex := range exhausted { + output += t.clientInfoMsg(&ex, true, false, false, true, true, false) + } + t.SendMsgToTgbot(client.TgID, output) + } + chatIDsDone = append(chatIDsDone, client.TgID) + } + } + } + } + } + } +} + +func int64Contains(slice []int64, item int64) bool { + for _, s := range slice { + if s == item { + return true + } + } + return false +} diff --git a/web/translation/ar-EG.json b/web/translation/ar-EG.json index 7ab23c2c..e32116aa 100644 --- a/web/translation/ar-EG.json +++ b/web/translation/ar-EG.json @@ -1,750 +1,604 @@ { - "username": "اسم المستخدم", - "password": "الباسورد", - "login": "تسجيل الدخول", - "confirm": "تأكيد", - "cancel": "إلغاء", - "close": "إغلاق", - "save": "حفظ", - "logout": "تسجيل خروج", - "create": "إنشاء", - "update": "تحديث", - "copy": "نسخ", - "copied": "اتنسخ", - "download": "تحميل", - "remark": "ملاحظة", - "enable": "مفعل", - "protocol": "بروتوكول", - "search": "بحث", - "filter": "فلترة", - "loading": "جاري التحميل...", - "second": "ثانية", - "minute": "دقيقة", - "hour": "ساعة", - "day": "يوم", - "check": "شيك", - "indefinite": "غير محدد", - "unlimited": "غير محدود", - "none": "مفيش", - "qrCode": "كود QR", - "info": "معلومات أكتر", - "edit": "تعديل", - "delete": "مسح", - "reset": "إعادة ضبط", - "noData": "لا توجد بيانات.", - "copySuccess": "اتنسخ بنجاح", - "sure": "متأكد؟", - "encryption": "تشفير", - "useIPv4ForHost": "استخدم IPv4 للمضيف", - "transmission": "نقل", - "host": "المستضيف", - "path": "مسار", "camouflage": "تمويه", - "status": "الحالة", - "enabled": "مفعل", - "disabled": "معطل", + "cancel": "إلغاء", + "certificate": "شهادة رقمية", + "check": "شيك", + "clients": "عملاء", + "close": "إغلاق", + "comment": "تعليق", + "confirm": "تأكيد", + "copied": "اتنسخ", + "copy": "نسخ", + "copySuccess": "اتنسخ بنجاح", + "create": "إنشاء", + "day": "يوم", + "delete": "مسح", "depleted": "خلص", "depletingSoon": "هينتهي قريب", - "offline": "أوفلاين", - "online": "أونلاين", + "disabled": "معطل", "domainName": "اسم الدومين", - "monitor": "المسمع IP", - "certificate": "شهادة رقمية", - "fail": "فشل", - "comment": "تعليق", - "success": "تم بنجاح", - "lastOnline": "آخر متصل", - "getVersion": "جيب النسخة", - "install": "تثبيت", - "clients": "عملاء", - "usage": "استخدام", - "twoFactorCode": "الكود", - "remained": "المتبقي", - "security": "أمان", - "secAlertTitle": "تنبيه أمني", - "secAlertSsl": "الاتصال ده مش آمن. ابعد عن إدخال معلومات حساسة لغاية ما تشغل TLS لحماية البيانات.", - "secAlertConf": "بعض الإعدادات معرضة لهجمات. ينصح بتعزيز بروتوكولات الأمان عشان تمنع الاختراقات المحتملة.", - "secAlertSSL": "البانل مش مؤمن. حمّل شهادة TLS لحماية البيانات.", - "secAlertPanelPort": "بورت البانل الافتراضي معرض للخطر. ياريت تغير لبورت عشوائي أو محدد.", - "secAlertPanelURI": "مسار URI الافتراضي للبانل مش آمن. ياريت تضبط مسار URI معقد.", - "secAlertSubURI": "مسار URI الافتراضي للاشتراك مش آمن. ياريت تضبط مسار URI معقد.", - "secAlertSubJsonURI": "مسار URI الافتراضي لاشتراك JSON مش آمن. ياريت تضبط مسار URI معقد.", + "download": "تحميل", + "edit": "تعديل", + "emptyBalancersDesc": "مفيش موازن تحميل مضاف.", "emptyDnsDesc": "مفيش سيرفر DNS مضاف.", "emptyFakeDnsDesc": "مفيش سيرفر Fake DNS مضاف.", - "emptyBalancersDesc": "مفيش موازن تحميل مضاف.", "emptyReverseDesc": "مفيش بروكسي عكسي مضاف.", - "somethingWentWrong": "حدث خطأ ما", - "subscription": { - "title": "معلومات الاشتراك", - "subId": "معرّف الاشتراك", - "status": "الحالة", - "downloaded": "التنزيل", - "uploaded": "الرفع", - "expiry": "تاريخ الانتهاء", - "totalQuota": "الحصة الإجمالية", - "individualLinks": "روابط فردية", - "active": "نشط", - "inactive": "غير نشط", - "unlimited": "غير محدود", - "noExpiry": "بدون انتهاء" - }, + "enable": "مفعل", + "enabled": "مفعل", + "encryption": "تشفير", + "fail": "فشل", + "filter": "فلترة", + "getVersion": "جيب النسخة", + "host": "المستضيف", + "hour": "ساعة", + "indefinite": "غير محدد", + "info": "معلومات أكتر", + "install": "تثبيت", + "lastOnline": "آخر متصل", + "loading": "جاري التحميل...", + "login": "تسجيل الدخول", + "logout": "تسجيل خروج", "menu": { - "theme": "الثيم", + "apiDocs": "توثيق API", "dark": "داكن", - "ultraDark": "داكن جدًا", "dashboard": "نظرة عامة", "inbounds": "الإدخالات", + "link": "إدارة", + "logout": "تسجيل خروج", "nodes": "النودز", "settings": "إعدادات البانل", - "xray": "إعدادات Xray", - "apiDocs": "توثيق API", - "logout": "تسجيل خروج", - "link": "إدارة" + "theme": "الثيم", + "ultraDark": "داكن جدًا", + "xray": "إعدادات Xray" }, + "minute": "دقيقة", + "monitor": "المسمع IP", + "noData": "لا توجد بيانات.", + "none": "مفيش", + "offline": "أوفلاين", + "online": "أونلاين", "pages": { - "login": { - "hello": "أهلا", - "title": "أهلاً وسهلاً", - "loginAgain": "انتهت صلاحية الجلسة، سجل دخول تاني", - "toasts": { - "invalidFormData": "تنسيق البيانات المدخلة مش صحيح.", - "emptyUsername": "اسم المستخدم مطلوب", - "emptyPassword": "الباسورد مطلوب", - "wrongUsernameOrPassword": "اسم المستخدم أو كلمة المرور أو كود المصادقة الثنائية غير صحيح.", - "successLogin": "لقد تم تسجيل الدخول إلى حسابك بنجاح." - } - }, - "index": { - "title": "نظرة عامة", - "cpu": "المعالج", - "logicalProcessors": "المعالجات المنطقية", - "frequency": "التردد", - "swap": "Swap", - "storage": "تخزين", - "memory": "رام", - "threads": "خيوط المعالجة", - "xrayStatus": "Xray", - "stopXray": "إيقاف", - "restartXray": "إعادة تشغيل", - "xraySwitch": "النسخة", - "xraySwitchClick": "اختار النسخة اللي عايز تتحول لها.", - "xraySwitchClickDesk": "اختار بحذر، النسخ القديمة ممكن ما تتوافقش مع الإعدادات الحالية.", - "xrayUpdates": "تحديثات Xray", - "updatePanel": "تحديث البانل", - "panelUpdateDesc": "ده هيحدث 3X-UI لآخر إصدار وهيعيد تشغيل خدمة البانل.", - "currentPanelVersion": "إصدار البانل الحالي", - "latestPanelVersion": "أحدث إصدار للبانل", - "panelUpToDate": "البانل محدث لآخر إصدار", - "upToDate": "محدث", - "xrayStatusUnknown": "مش معروف", - "xrayStatusRunning": "شغالة", - "xrayStatusStop": "متوقفة", - "xrayStatusError": "فيها غلطة", - "xrayErrorPopoverTitle": "حصل خطأ أثناء تشغيل Xray", - "operationHours": "مدة التشغيل", - "systemHistoryTitle": "تاريخ النظام", - "charts": "الرسوم البيانية", - "xrayMetricsTitle": "مقاييس Xray", - "xrayMetricsDisabled": "نقطة نهاية مقاييس Xray غير مهيأة", - "xrayMetricsHint": "أضف كتلة metrics على المستوى الأعلى في إعدادات xray مع tag باسم metrics_out و listen على 127.0.0.1:11111، ثم أعد تشغيل xray.", - "xrayObservatoryEmpty": "لا توجد بيانات Observatory بعد", - "xrayObservatoryHint": "أضف كتلة observatory إلى إعدادات xray مع قائمة وسوم outbound للفحص، ثم أعد تشغيل xray.", - "xrayObservatoryTagPlaceholder": "اختر outbound", - "xrayObservatoryAlive": "نشط", - "xrayObservatoryDead": "غير متصل", - "xrayObservatoryLastSeen": "آخر مشاهدة", - "xrayObservatoryLastTry": "آخر محاولة", - "trendLast2Min": "آخر دقيقتين", - "systemLoad": "تحميل النظام", - "systemLoadDesc": "متوسط تحميل النظام في الدقائق 1, 5, و15", - "connectionCount": "إحصائيات الاتصال", - "ipAddresses": "عناوين IP", - "toggleIpVisibility": "بدل إظهار IP", - "overallSpeed": "السرعة الكلية", - "upload": "رفع", - "download": "تنزيل", - "totalData": "إجمالي البيانات", - "sent": "مرسل", - "received": "مستقبل", - "documentation": "التوثيق", - "xraySwitchVersionDialog": "هل تريد حقًا تغيير إصدار Xray؟", - "xraySwitchVersionDialogDesc": "سيؤدي هذا إلى تغيير إصدار Xray إلى #version#.", - "xraySwitchVersionPopover": "تم تحديث Xray بنجاح", - "panelUpdateDialog": "هل فعلاً عايز تحدث البانل؟", - "panelUpdateDialogDesc": "ده هيحدث 3X-UI للإصدار #version# وهيعيد تشغيل البانل.", - "panelUpdateCheckPopover": "فشل التحقق من تحديث البانل", - "panelUpdateStartedPopover": "بدأ تحديث البانل", - "geofileUpdateDialog": "هل تريد حقًا تحديث ملف الجغرافيا؟", - "geofileUpdateDialogDesc": "سيؤدي هذا إلى تحديث ملف #filename#.", - "geofilesUpdateDialogDesc": "سيؤدي هذا إلى تحديث كافة الملفات.", - "geofilesUpdateAll": "تحديث الكل", - "geofileUpdatePopover": "تم تحديث ملف الجغرافيا بنجاح", - "dontRefresh": "التثبيت شغال، متعملش Refresh للصفحة", - "logs": "السجلات", - "config": "الإعدادات", - "backup": "نسخة احتياطية", - "backupTitle": "نسخ احتياطي واستعادة", - "exportDatabase": "اخزن نسخة", - "exportDatabaseDesc": "اضغط عشان تحمل ملف .db يحتوي على نسخة احتياطية لقاعدة البيانات الحالية على جهازك.", - "importDatabase": "استرجاع", - "importDatabaseDesc": "اضغط عشان تختار وتحمل ملف .db من جهازك لاسترجاع قاعدة البيانات من نسخة احتياطية.", - "importDatabaseSuccess": "تم استيراد قاعدة البيانات بنجاح", - "importDatabaseError": "حدث خطأ أثناء استيراد قاعدة البيانات", - "readDatabaseError": "حدث خطأ أثناء قراءة قاعدة البيانات", - "getDatabaseError": "حدث خطأ أثناء استرجاع قاعدة البيانات", - "getConfigError": "حدث خطأ أثناء استرجاع ملف الإعدادات", - "customGeoTitle": "GeoSite / GeoIP مخصص", - "customGeoAdd": "إضافة", - "customGeoType": "النوع", - "customGeoAlias": "الاسم المستعار", - "customGeoUrl": "URL", - "customGeoEnabled": "مفعّل", - "customGeoLastUpdated": "آخر تحديث", - "customGeoExtColumn": "التوجيه (ext:…)", - "customGeoToastUpdateAll": "تم تحديث جميع المصادر المخصصة", - "customGeoActions": "إجراءات", - "customGeoEdit": "تعديل", - "customGeoDelete": "حذف", - "customGeoDownload": "تحديث الآن", - "customGeoModalAdd": "إضافة geo مخصص", - "customGeoModalEdit": "تعديل geo مخصص", - "customGeoModalSave": "حفظ", - "customGeoDeleteConfirm": "حذف مصدر geo المخصص هذا؟", - "customGeoRoutingHint": "في قواعد التوجيه استخدم العمود كـ ext:file.dat:tag (استبدل tag).", - "customGeoInvalidId": "معرّف المورد غير صالح", - "customGeoAliasesError": "تعذّر تحميل أسماء geo المخصصة", - "customGeoValidationAlias": "الاسم المستعار: أحرف صغيرة وأرقام و - و _ فقط", - "customGeoValidationUrl": "يجب أن يبدأ الرابط بـ http:// أو https://", - "customGeoAliasPlaceholder": "a-z 0-9 _ -", - "customGeoAliasLabelSuffix": " (مخصص)", - "customGeoToastList": "قائمة geo المخصص", - "customGeoToastAdd": "إضافة geo مخصص", - "customGeoToastUpdate": "تحديث geo مخصص", - "customGeoToastDelete": "تم حذف geofile «{{ .fileName }}» المخصص", - "customGeoToastDownload": "تم تحديث geofile «{{ .fileName }}»", - "customGeoErrInvalidType": "يجب أن يكون النوع geosite أو geoip", - "customGeoErrAliasRequired": "الاسم المستعار مطلوب", - "customGeoErrAliasPattern": "الاسم المستعار يحتوي على أحرف غير مسموحة", - "customGeoErrAliasReserved": "هذا الاسم محجوز", - "customGeoErrUrlRequired": "الرابط مطلوب", - "customGeoErrInvalidUrl": "الرابط غير صالح", - "customGeoErrUrlScheme": "يجب أن يستخدم الرابط http أو https", - "customGeoErrUrlHost": "مضيف الرابط غير صالح", - "customGeoErrDuplicateAlias": "هذا الاسم مستخدم مسبقاً لهذا النوع", - "customGeoErrNotFound": "مصدر geo المخصص غير موجود", - "customGeoErrDownload": "فشل التنزيل", - "customGeoErrUpdateAllIncomplete": "تعذر تحديث مصدر واحد أو أكثر من مصادر geo المخصصة", - "customGeoEmpty": "لا توجد مصادر geo مخصصة بعد — انقر على «إضافة» لإنشاء واحد" + "client": { + "add": "أضف عميل", + "bulk": "إضافة بالجملة", + "clearAll": "مسح الكل", + "clientCount": "عدد العملاء", + "copyEmailPreview": "معاينة البريد الإلكتروني الناتج", + "copyFlowHint": "يُطبَّق على جميع العملاء المنسوخين. اتركه فارغاً لتخطيه.", + "copyFlowLabel": "Flow للعملاء الجدد (VLESS)", + "copyFromInbound": "نسخ العملاء من الـ Inbound", + "copyResult": "نتيجة النسخ", + "copyResultErrors": "أخطاء النسخ", + "copyResultNone": "لا يوجد شيء للنسخ: لم يتم اختيار أي عميل أو أن المصدر فارغ", + "copyResultSuccess": "تم النسخ بنجاح", + "copySelectSourceFirst": "الرجاء اختيار الـ Inbound المصدر أولاً.", + "copySelected": "نسخ المحدد", + "copySource": "المصدر", + "copyToInbound": "نسخ العملاء إلى", + "days": "يوم/أيام", + "delayedStart": "ابدأ بعد أول استخدام", + "edit": "تعديل عميل", + "expireDays": "المدة", + "first": "أول واحد", + "last": "آخر واحد", + "method": "طريقة", + "postfix": "لاحقة", + "prefix": "بادئة", + "renew": "تجديد تلقائي", + "renewDesc": "تجديد تلقائي بعد انتهاء الصلاحية. (0 = تعطيل)(الوحدة: يوم)", + "selectAll": "تحديد الكل", + "submitAdd": "أضف العميل", + "submitEdit": "احفظ التعديلات" }, "inbounds": { - "allTimeTraffic": "إجمالي حركة المرور", - "allTimeTrafficUsage": "إجمالي الاستخدام طوال الوقت", - "title": "الإدخالات", - "totalDownUp": "إجمالي المرسل/المستقبل", - "totalUsage": "إجمالي الاستخدام", - "inboundCount": "عدد الإدخالات", - "operate": "القائمة", - "enable": "مفعل", - "remark": "ملاحظة", - "node": "نود", - "deployTo": "نشر على", - "localPanel": "بانل محلي", - "protocol": "بروتوكول", - "port": "بورت", - "portMap": "خريطة البورت", - "traffic": "الترافيك", - "details": "تفاصيل", - "transportConfig": "نقل", - "expireDate": "المدة", - "createdAt": "تاريخ الإنشاء", - "updatedAt": "تاريخ التحديث", - "resetTraffic": "إعادة ضبط الترافيك", - "addInbound": "أضف إدخال", - "generalActions": "إجراءات عامة", - "modifyInbound": "تعديل الإدخال", - "deleteInbound": "حذف الإدخال", - "deleteInboundContent": "متأكد إنك عايز تحذف الإدخال؟", - "deleteClient": "حذف العميل", - "deleteClientContent": "متأكد إنك عايز تحذف العميل؟", - "resetTrafficContent": "متأكد إنك عايز تعيد ضبط الترافيك؟", - "copyLink": "انسخ الرابط", - "address": "العنوان", - "network": "الشبكة", - "destinationPort": "بورت الوجهة", - "targetAddress": "عنوان الهدف", - "monitorDesc": "سيبها فاضية لو عايز تستمع على كل الـ IPs", - "meansNoLimit": "= غير محدود. (الوحدة: جيجابايت)", - "totalFlow": "إجمالي التدفق", - "leaveBlankToNeverExpire": "سيبها فاضية عشان ماتنتهيش", - "noRecommendKeepDefault": "ننصح باستخدام الافتراضي", - "certificatePath": "مسار الملف", - "certificateContent": "محتوى الملف", - "publicKey": "المفتاح العام", - "privatekey": "المفتاح الخاص", - "clickOnQRcode": "اضغط على كود QR للنسخ", - "client": "عميل", - "export": "تصدير كل الروابط", - "clone": "استنساخ", - "cloneInbound": "استنساخ الإدخال", - "cloneInboundContent": "كل إعدادات الإدخال ده، غير البورت، IP الاستماع، والعملاء، هتتطبق على الاستنساخ.", - "cloneInboundOk": "استنساخ", - "resetAllTraffic": "إعادة ضبط ترافيك كل الإدخالات", - "resetAllTrafficTitle": "إعادة ضبط ترافيك كل الإدخالات", - "resetAllTrafficContent": "متأكد إنك عايز تعيد ضبط الترافيك لكل الإدخالات؟", - "resetInboundClientTraffics": "إعادة ضبط ترافيك العملاء", - "resetInboundClientTrafficTitle": "إعادة ضبط ترافيك العملاء", - "resetInboundClientTrafficContent": "متأكد إنك عايز تعيد ضبط ترافيك عملاء الإدخال ده؟", - "resetAllClientTraffics": "إعادة ضبط ترافيك كل العملاء", - "resetAllClientTrafficTitle": "إعادة ضبط ترافيك كل العملاء", - "resetAllClientTrafficContent": "متأكد إنك عايز تعيد ضبط ترافيك كل العملاء؟", - "delDepletedClients": "حذف العملاء اللي خلصت", - "delDepletedClientsTitle": "حذف العملاء اللي خلصت", - "delDepletedClientsContent": "متأكد إنك عايز تحذف كل العملاء اللي خلصت؟", - "email": "الإيميل", - "emailDesc": "ادخل إيميل فريد.", "IPLimit": "تحديد IP", "IPLimitDesc": "بيعطل الإدخال لو العدد زاد عن القيمة المحددة. (0 = تعطيل)", "IPLimitlog": "سجل IP", "IPLimitlogDesc": "سجل تاريخ الـ IPs. (عشان تفعل الإدخال بعد التعطيل، امسح السجل)", "IPLimitlogclear": "امسح السجل", - "setDefaultCert": "استخدم شهادة البانل", - "telegramDesc": "ادخل ID شات Telegram. (استخدم '/id' في البوت) أو ({'@'}userinfobot)", - "subscriptionDesc": "عشان تلاقي رابط الاشتراك، ادخل على 'التفاصيل'. وكمان ممكن تستخدم نفس الاسم لعدة عملاء.", - "info": "معلومات", - "same": "نفسه", - "inboundData": "بيانات الإدخال", + "addInbound": "أضف إدخال", + "address": "العنوان", + "allTimeTraffic": "إجمالي حركة المرور", + "allTimeTrafficUsage": "إجمالي الاستخدام طوال الوقت", + "certificateContent": "محتوى الملف", + "certificatePath": "مسار الملف", + "clickOnQRcode": "اضغط على كود QR للنسخ", + "client": "عميل", + "clone": "استنساخ", + "cloneInbound": "استنساخ الإدخال", + "cloneInboundContent": "كل إعدادات الإدخال ده، غير البورت، IP الاستماع، والعملاء، هتتطبق على الاستنساخ.", + "cloneInboundOk": "استنساخ", + "copyLink": "انسخ الرابط", + "createdAt": "تاريخ الإنشاء", + "delDepletedClients": "حذف العملاء اللي خلصت", + "delDepletedClientsContent": "متأكد إنك عايز تحذف كل العملاء اللي خلصت؟", + "delDepletedClientsTitle": "حذف العملاء اللي خلصت", + "deleteClient": "حذف العميل", + "deleteClientContent": "متأكد إنك عايز تحذف العميل؟", + "deleteInbound": "حذف الإدخال", + "deleteInboundContent": "متأكد إنك عايز تحذف الإدخال؟", + "deployTo": "نشر على", + "destinationPort": "بورت الوجهة", + "details": "تفاصيل", + "email": "الإيميل", + "emailDesc": "ادخل إيميل فريد.", + "enable": "مفعل", + "expireDate": "المدة", + "export": "تصدير كل الروابط", "exportInbound": "تصدير الإدخال", + "generalActions": "إجراءات عامة", "import": "استيراد", "importInbound": "استيراد إدخال", - "periodicTrafficResetTitle": "إعادة تعيين حركة المرور", - "periodicTrafficResetDesc": "إعادة تعيين عداد حركة المرور تلقائيًا في فترات محددة", + "inboundCount": "عدد الإدخالات", + "inboundData": "بيانات الإدخال", + "info": "معلومات", "lastReset": "آخر إعادة تعيين", + "leaveBlankToNeverExpire": "سيبها فاضية عشان ماتنتهيش", + "localPanel": "بانل محلي", + "meansNoLimit": "= غير محدود. (الوحدة: جيجابايت)", + "modifyInbound": "تعديل الإدخال", + "monitorDesc": "سيبها فاضية لو عايز تستمع على كل الـ IPs", + "network": "الشبكة", + "noRecommendKeepDefault": "ننصح باستخدام الافتراضي", + "node": "نود", + "operate": "القائمة", "periodicTrafficReset": { - "never": "أبداً", "daily": "يومياً", - "weekly": "أسبوعياً", + "hourly": "كل ساعة", "monthly": "شهرياً", - "hourly": "كل ساعة" + "never": "أبداً", + "weekly": "أسبوعياً" }, + "periodicTrafficResetDesc": "إعادة تعيين عداد حركة المرور تلقائيًا في فترات محددة", + "periodicTrafficResetTitle": "إعادة تعيين حركة المرور", + "port": "بورت", + "portMap": "خريطة البورت", + "privatekey": "المفتاح الخاص", + "protocol": "بروتوكول", + "publicKey": "المفتاح العام", + "remark": "ملاحظة", + "resetAllClientTrafficContent": "متأكد إنك عايز تعيد ضبط ترافيك كل العملاء؟", + "resetAllClientTrafficTitle": "إعادة ضبط ترافيك كل العملاء", + "resetAllClientTraffics": "إعادة ضبط ترافيك كل العملاء", + "resetAllTraffic": "إعادة ضبط ترافيك كل الإدخالات", + "resetAllTrafficContent": "متأكد إنك عايز تعيد ضبط الترافيك لكل الإدخالات؟", + "resetAllTrafficTitle": "إعادة ضبط ترافيك كل الإدخالات", + "resetInboundClientTrafficContent": "متأكد إنك عايز تعيد ضبط ترافيك عملاء الإدخال ده؟", + "resetInboundClientTrafficTitle": "إعادة ضبط ترافيك العملاء", + "resetInboundClientTraffics": "إعادة ضبط ترافيك العملاء", + "resetTraffic": "إعادة ضبط الترافيك", + "resetTrafficContent": "متأكد إنك عايز تعيد ضبط الترافيك؟", + "same": "نفسه", + "setDefaultCert": "استخدم شهادة البانل", + "stream": { + "general": { + "name": "اسم", + "request": "طلب", + "response": "رد", + "value": "قيمة" + }, + "tcp": { + "method": "طريقة", + "path": "مسار", + "requestHeader": "رأس الطلب", + "responseHeader": "رأس الرد", + "status": "الحالة", + "statusDescription": "وصف الحالة", + "version": "نسخة" + } + }, + "subscriptionDesc": "عشان تلاقي رابط الاشتراك، ادخل على 'التفاصيل'. وكمان ممكن تستخدم نفس الاسم لعدة عملاء.", + "targetAddress": "عنوان الهدف", + "telegramDesc": "ادخل ID شات Telegram. (استخدم '/id' في البوت) أو ({'@'}userinfobot)", + "title": "الإدخالات", "toasts": { - "obtain": "تم الحصول عليه", - "updateSuccess": "تم التحديث بنجاح", - "logCleanSuccess": "تم مسح السجل", - "inboundsUpdateSuccess": "تم تحديث الواردات بنجاح", - "inboundUpdateSuccess": "تم تحديث الوارد بنجاح", - "inboundCreateSuccess": "تم إنشاء الوارد بنجاح", - "inboundDeleteSuccess": "تم حذف الوارد بنجاح", + "delDepletedClientsSuccess": "تم حذف جميع العملاء المستنفذين", + "getNewVlessEncError": "حدث خطأ أثناء الحصول على VlessEnc.", + "getNewX25519CertError": "حدث خطأ أثناء الحصول على شهادة X25519.", + "getNewmldsa65Error": "حدث خطاء في الحصول على mldsa65.", "inboundClientAddSuccess": "تمت إضافة عميل(عملاء) وارد", "inboundClientDeleteSuccess": "تم حذف عميل وارد", "inboundClientUpdateSuccess": "تم تحديث عميل وارد", - "delDepletedClientsSuccess": "تم حذف جميع العملاء المستنفذين", + "inboundCreateSuccess": "تم إنشاء الوارد بنجاح", + "inboundDeleteSuccess": "تم حذف الوارد بنجاح", + "inboundUpdateSuccess": "تم تحديث الوارد بنجاح", + "inboundsUpdateSuccess": "تم تحديث الواردات بنجاح", + "logCleanSuccess": "تم مسح السجل", + "obtain": "تم الحصول عليه", "resetAllClientTrafficSuccess": "تم إعادة تعيين كل حركة المرور من العميل", "resetAllTrafficSuccess": "تم إعادة تعيين كل حركة المرور", "resetInboundClientTrafficSuccess": "تم إعادة تعيين حركة المرور", "trafficGetError": "خطأ في الحصول على حركات المرور", - "getNewX25519CertError": "حدث خطأ أثناء الحصول على شهادة X25519.", - "getNewmldsa65Error": "حدث خطاء في الحصول على mldsa65.", - "getNewVlessEncError": "حدث خطأ أثناء الحصول على VlessEnc." + "updateSuccess": "تم التحديث بنجاح" }, - "stream": { - "general": { - "request": "طلب", - "response": "رد", - "name": "اسم", - "value": "قيمة" - }, - "tcp": { - "version": "نسخة", - "method": "طريقة", - "path": "مسار", - "status": "الحالة", - "statusDescription": "وصف الحالة", - "requestHeader": "رأس الطلب", - "responseHeader": "رأس الرد" - } - } + "totalDownUp": "إجمالي المرسل/المستقبل", + "totalFlow": "إجمالي التدفق", + "totalUsage": "إجمالي الاستخدام", + "traffic": "الترافيك", + "transportConfig": "نقل", + "updatedAt": "تاريخ التحديث" }, - "client": { - "add": "أضف عميل", - "edit": "تعديل عميل", - "submitAdd": "أضف العميل", - "submitEdit": "احفظ التعديلات", - "clientCount": "عدد العملاء", - "bulk": "إضافة بالجملة", - "copyFromInbound": "نسخ العملاء من الـ Inbound", - "copyToInbound": "نسخ العملاء إلى", - "copySelected": "نسخ المحدد", - "copySource": "المصدر", - "copyEmailPreview": "معاينة البريد الإلكتروني الناتج", - "copySelectSourceFirst": "الرجاء اختيار الـ Inbound المصدر أولاً.", - "copyResult": "نتيجة النسخ", - "copyResultSuccess": "تم النسخ بنجاح", - "copyResultNone": "لا يوجد شيء للنسخ: لم يتم اختيار أي عميل أو أن المصدر فارغ", - "copyResultErrors": "أخطاء النسخ", - "copyFlowLabel": "Flow للعملاء الجدد (VLESS)", - "copyFlowHint": "يُطبَّق على جميع العملاء المنسوخين. اتركه فارغاً لتخطيه.", - "selectAll": "تحديد الكل", - "clearAll": "مسح الكل", - "method": "طريقة", - "first": "أول واحد", - "last": "آخر واحد", - "prefix": "بادئة", - "postfix": "لاحقة", - "delayedStart": "ابدأ بعد أول استخدام", - "expireDays": "المدة", - "days": "يوم/أيام", - "renew": "تجديد تلقائي", - "renewDesc": "تجديد تلقائي بعد انتهاء الصلاحية. (0 = تعطيل)(الوحدة: يوم)" + "index": { + "backup": "نسخة احتياطية", + "backupTitle": "نسخ احتياطي واستعادة", + "charts": "الرسوم البيانية", + "config": "الإعدادات", + "connectionCount": "إحصائيات الاتصال", + "cpu": "المعالج", + "currentPanelVersion": "إصدار البانل الحالي", + "customGeoActions": "إجراءات", + "customGeoAdd": "إضافة", + "customGeoAlias": "الاسم المستعار", + "customGeoAliasLabelSuffix": " (مخصص)", + "customGeoAliasPlaceholder": "a-z 0-9 _ -", + "customGeoAliasesError": "تعذّر تحميل أسماء geo المخصصة", + "customGeoDelete": "حذف", + "customGeoDeleteConfirm": "حذف مصدر geo المخصص هذا؟", + "customGeoDownload": "تحديث الآن", + "customGeoEdit": "تعديل", + "customGeoEmpty": "لا توجد مصادر geo مخصصة بعد — انقر على «إضافة» لإنشاء واحد", + "customGeoEnabled": "مفعّل", + "customGeoErrAliasPattern": "الاسم المستعار يحتوي على أحرف غير مسموحة", + "customGeoErrAliasRequired": "الاسم المستعار مطلوب", + "customGeoErrAliasReserved": "هذا الاسم محجوز", + "customGeoErrDownload": "فشل التنزيل", + "customGeoErrDuplicateAlias": "هذا الاسم مستخدم مسبقاً لهذا النوع", + "customGeoErrInvalidType": "يجب أن يكون النوع geosite أو geoip", + "customGeoErrInvalidUrl": "الرابط غير صالح", + "customGeoErrNotFound": "مصدر geo المخصص غير موجود", + "customGeoErrUpdateAllIncomplete": "تعذر تحديث مصدر واحد أو أكثر من مصادر geo المخصصة", + "customGeoErrUrlHost": "مضيف الرابط غير صالح", + "customGeoErrUrlRequired": "الرابط مطلوب", + "customGeoErrUrlScheme": "يجب أن يستخدم الرابط http أو https", + "customGeoExtColumn": "التوجيه (ext:…)", + "customGeoInvalidId": "معرّف المورد غير صالح", + "customGeoLastUpdated": "آخر تحديث", + "customGeoModalAdd": "إضافة geo مخصص", + "customGeoModalEdit": "تعديل geo مخصص", + "customGeoModalSave": "حفظ", + "customGeoRoutingHint": "في قواعد التوجيه استخدم العمود كـ ext:file.dat:tag (استبدل tag).", + "customGeoTitle": "GeoSite / GeoIP مخصص", + "customGeoToastAdd": "إضافة geo مخصص", + "customGeoToastDelete": "تم حذف geofile «{{ .fileName }}» المخصص", + "customGeoToastDownload": "تم تحديث geofile «{{ .fileName }}»", + "customGeoToastList": "قائمة geo المخصص", + "customGeoToastUpdate": "تحديث geo مخصص", + "customGeoToastUpdateAll": "تم تحديث جميع المصادر المخصصة", + "customGeoType": "النوع", + "customGeoUrl": "URL", + "customGeoValidationAlias": "الاسم المستعار: أحرف صغيرة وأرقام و - و _ فقط", + "customGeoValidationUrl": "يجب أن يبدأ الرابط بـ http:// أو https://", + "documentation": "التوثيق", + "dontRefresh": "التثبيت شغال، متعملش Refresh للصفحة", + "download": "تنزيل", + "exportDatabase": "اخزن نسخة", + "exportDatabaseDesc": "اضغط عشان تحمل ملف .db يحتوي على نسخة احتياطية لقاعدة البيانات الحالية على جهازك.", + "frequency": "التردد", + "geofileUpdateDialog": "هل تريد حقًا تحديث ملف الجغرافيا؟", + "geofileUpdateDialogDesc": "سيؤدي هذا إلى تحديث ملف #filename#.", + "geofileUpdatePopover": "تم تحديث ملف الجغرافيا بنجاح", + "geofilesUpdateAll": "تحديث الكل", + "geofilesUpdateDialogDesc": "سيؤدي هذا إلى تحديث كافة الملفات.", + "getConfigError": "حدث خطأ أثناء استرجاع ملف الإعدادات", + "getDatabaseError": "حدث خطأ أثناء استرجاع قاعدة البيانات", + "importDatabase": "استرجاع", + "importDatabaseDesc": "اضغط عشان تختار وتحمل ملف .db من جهازك لاسترجاع قاعدة البيانات من نسخة احتياطية.", + "importDatabaseError": "حدث خطأ أثناء استيراد قاعدة البيانات", + "importDatabaseSuccess": "تم استيراد قاعدة البيانات بنجاح", + "ipAddresses": "عناوين IP", + "latestPanelVersion": "أحدث إصدار للبانل", + "logicalProcessors": "المعالجات المنطقية", + "logs": "السجلات", + "memory": "رام", + "operationHours": "مدة التشغيل", + "overallSpeed": "السرعة الكلية", + "panelUpToDate": "البانل محدث لآخر إصدار", + "panelUpdateCheckPopover": "فشل التحقق من تحديث البانل", + "panelUpdateDesc": "ده هيحدث 3X-UI لآخر إصدار وهيعيد تشغيل خدمة البانل.", + "panelUpdateDialog": "هل فعلاً عايز تحدث البانل؟", + "panelUpdateDialogDesc": "ده هيحدث 3X-UI للإصدار #version# وهيعيد تشغيل البانل.", + "panelUpdateStartedPopover": "بدأ تحديث البانل", + "readDatabaseError": "حدث خطأ أثناء قراءة قاعدة البيانات", + "received": "مستقبل", + "restartXray": "إعادة تشغيل", + "sent": "مرسل", + "stopXray": "إيقاف", + "storage": "تخزين", + "swap": "Swap", + "systemHistoryTitle": "تاريخ النظام", + "systemLoad": "تحميل النظام", + "systemLoadDesc": "متوسط تحميل النظام في الدقائق 1, 5, و15", + "threads": "خيوط المعالجة", + "title": "نظرة عامة", + "toggleIpVisibility": "بدل إظهار IP", + "totalData": "إجمالي البيانات", + "trendLast2Min": "آخر دقيقتين", + "upToDate": "محدث", + "updatePanel": "تحديث البانل", + "upload": "رفع", + "xrayErrorPopoverTitle": "حصل خطأ أثناء تشغيل Xray", + "xrayMetricsDisabled": "نقطة نهاية مقاييس Xray غير مهيأة", + "xrayMetricsHint": "أضف كتلة metrics على المستوى الأعلى في إعدادات xray مع tag باسم metrics_out و listen على 127.0.0.1:11111، ثم أعد تشغيل xray.", + "xrayMetricsTitle": "مقاييس Xray", + "xrayObservatoryAlive": "نشط", + "xrayObservatoryDead": "غير متصل", + "xrayObservatoryEmpty": "لا توجد بيانات Observatory بعد", + "xrayObservatoryHint": "أضف كتلة observatory إلى إعدادات xray مع قائمة وسوم outbound للفحص، ثم أعد تشغيل xray.", + "xrayObservatoryLastSeen": "آخر مشاهدة", + "xrayObservatoryLastTry": "آخر محاولة", + "xrayObservatoryTagPlaceholder": "اختر outbound", + "xrayStatus": "Xray", + "xrayStatusError": "فيها غلطة", + "xrayStatusRunning": "شغالة", + "xrayStatusStop": "متوقفة", + "xrayStatusUnknown": "مش معروف", + "xraySwitch": "النسخة", + "xraySwitchClick": "اختار النسخة اللي عايز تتحول لها.", + "xraySwitchClickDesk": "اختار بحذر، النسخ القديمة ممكن ما تتوافقش مع الإعدادات الحالية.", + "xraySwitchVersionDialog": "هل تريد حقًا تغيير إصدار Xray؟", + "xraySwitchVersionDialogDesc": "سيؤدي هذا إلى تغيير إصدار Xray إلى #version#.", + "xraySwitchVersionPopover": "تم تحديث Xray بنجاح", + "xrayUpdates": "تحديثات Xray" + }, + "login": { + "hello": "أهلا", + "loginAgain": "انتهت صلاحية الجلسة، سجل دخول تاني", + "title": "أهلاً وسهلاً", + "toasts": { + "emptyPassword": "الباسورد مطلوب", + "emptyUsername": "اسم المستخدم مطلوب", + "invalidFormData": "تنسيق البيانات المدخلة مش صحيح.", + "successLogin": "لقد تم تسجيل الدخول إلى حسابك بنجاح.", + "wrongUsernameOrPassword": "اسم المستخدم أو كلمة المرور أو كود المصادقة الثنائية غير صحيح." + } }, "nodes": { - "title": "النودز", + "actions": "العمليات", "addNode": "إضافة نود", - "editNode": "تعديل نود", - "totalNodes": "إجمالي النودز", - "onlineNodes": "أونلاين", - "offlineNodes": "أوفلاين", + "address": "العنوان", + "addressPlaceholder": "panel.example.com أو 1.2.3.4", + "apiToken": "توكن API", + "apiTokenHint": "البانل البعيد بيعرض توكن API بتاعه في الإعدادات → توكن API.", + "apiTokenPlaceholder": "التوكن من صفحة إعدادات البانل البعيد", "avgLatency": "متوسط الكمون", + "basePath": "المسار الأساسي", + "connectionFailed": "فشل الاتصال", + "connectionOk": "الاتصال شغال ({ms} ms)", + "cpu": "المعالج", + "deleteConfirmContent": "ده هيوقّف مراقبة النود. البانل البعيد نفسه مش هيتأثر.", + "deleteConfirmTitle": "تحذف النود \"{name}\"؟", + "editNode": "تعديل نود", + "enable": "مفعل", + "justNow": "دلوقتي", + "lastHeartbeat": "آخر نبضة", + "latency": "الكمون", + "mem": "الذاكرة", "name": "الاسم", "namePlaceholder": "مثال: de-frankfurt-1", - "addressPlaceholder": "panel.example.com أو 1.2.3.4", - "remark": "ملاحظة", - "scheme": "البروتوكول", - "address": "العنوان", + "never": "أبدًا", + "offlineNodes": "أوفلاين", + "onlineNodes": "أونلاين", "port": "البورت", - "basePath": "المسار الأساسي", - "apiToken": "توكن API", - "apiTokenPlaceholder": "التوكن من صفحة إعدادات البانل البعيد", - "apiTokenHint": "البانل البعيد بيعرض توكن API بتاعه في الإعدادات → توكن API.", + "probe": "فحص فوري", "regenerate": "تجديد التوكن", "regenerateConfirm": "تجديد التوكن هيلغي التوكن الحالي. أي بانل مركزي بيستخدمه هيفقد الصلاحية لحد ما تحدّث التوكن. تكمّل؟", - "enable": "مفعل", + "remark": "ملاحظة", + "scheme": "البروتوكول", "status": "الحالة", - "cpu": "المعالج", - "mem": "الذاكرة", - "uptime": "مدة التشغيل", - "latency": "الكمون", - "lastHeartbeat": "آخر نبضة", - "xrayVersion": "إصدار Xray", - "actions": "العمليات", - "probe": "فحص فوري", - "testConnection": "اختبار الاتصال", - "connectionOk": "الاتصال شغال ({ms} ms)", - "connectionFailed": "فشل الاتصال", - "never": "أبدًا", - "justNow": "دلوقتي", - "deleteConfirmTitle": "تحذف النود \"{name}\"؟", - "deleteConfirmContent": "ده هيوقّف مراقبة النود. البانل البعيد نفسه مش هيتأثر.", "statusValues": { - "online": "أونلاين", "offline": "أوفلاين", + "online": "أونلاين", "unknown": "غير معروف" }, + "testConnection": "اختبار الاتصال", + "title": "النودز", "toasts": { - "list": "فشل تحميل النودز", - "obtain": "فشل تحميل النود", "add": "إضافة نود", - "update": "تحديث النود", "delete": "حذف النود", "deleted": "اتمسح النود", - "test": "اختبار الاتصال", "fillRequired": "الاسم والعنوان والبورت وتوكن API كلهم مطلوبين", - "probeFailed": "فشل الفحص" - } + "list": "فشل تحميل النودز", + "obtain": "فشل تحميل النود", + "probeFailed": "فشل الفحص", + "test": "اختبار الاتصال", + "update": "تحديث النود" + }, + "totalNodes": "إجمالي النودز", + "uptime": "مدة التشغيل", + "xrayVersion": "إصدار Xray" }, "settings": { - "title": "إعدادات البانل", - "save": "حفظ", - "infoDesc": "كل تغيير هتعمله هنا لازم يتخزن. ياريت تعيد تشغيل البانل عشان التعديلات تتفعل.", - "restartPanel": "إعادة تشغيل البانل", - "restartPanelDesc": "متأكد إنك عايز تعيد تشغيل البانل؟ لو ماقدرتش تدخل بعد إعادة التشغيل، شوف سجل البانل على السيرفر.", - "restartPanelSuccess": "تم إعادة تشغيل اللوحة بنجاح", - "actions": "إجراءات", - "resetDefaultConfig": "استرجاع الافتراضي", - "panelSettings": "عام", - "securitySettings": "المصادقة", "TGBotSettings": "بوت Telegram", - "panelListeningIP": "IP الاستماع", - "panelListeningIPDesc": "عنوان IP للبانل. (سيبه فاضي عشان يستمع على كل الـ IPs)", - "panelListeningDomain": "دومين الاستماع", - "panelListeningDomainDesc": "اسم الدومين للبانل. (سيبه فاضي عشان يستمع على كل الدومينات والـ IPs)", - "panelPort": "بورت الاستماع", - "panelPortDesc": "رقم البورت للبانل. (لازم يكون بورت فاضي)", - "publicKeyPath": "مسار المفتاح العام", - "publicKeyPathDesc": "مسار ملف المفتاح العام للبانل. (يبدأ بـ '/')", - "privateKeyPath": "مسار المفتاح الخاص", - "privateKeyPathDesc": "مسار ملف المفتاح الخاص للبانل. (يبدأ بـ '/')", - "panelUrlPath": "مسار URI", - "panelUrlPathDesc": "مسار URI للبانل. (يبدأ بـ '/' وبينتهي بـ '/')", - "pageSize": "حجم الصفحة", - "pageSizeDesc": "حدد حجم الصفحة لجدول الإدخالات. (0 = تعطيل)", - "remarkModel": "نموذج الملاحظة وحرف الفصل", - "datepicker": "نوع التقويم", - "datepickerPlaceholder": "اختار التاريخ", - "datepickerDescription": "المهام المجدولة هتشتغل بناءً على التقويم ده.", - "sampleRemark": "مثال للملاحظة", - "oldUsername": "اسم المستخدم الحالي", + "actions": "إجراءات", + "certs": "الشهادات", "currentPassword": "الباسورد الحالي", - "newUsername": "اسم المستخدم الجديد", - "newPassword": "الباسورد الجديد", - "telegramBotEnable": "تفعيل بوت Telegram", - "telegramBotEnableDesc": "يفعل بوت Telegram.", - "telegramToken": "توكن Telegram", - "telegramTokenDesc": "توكن البوت اللي جبت من '{'@'}BotFather'.", - "telegramProxy": "بروكسي SOCKS", - "telegramProxyDesc": "يفعل بروكسي SOCKS5 للاتصال بـ Telegram. (اضبط الإعدادات حسب الدليل)", - "telegramAPIServer": "سيرفر Telegram API", - "telegramAPIServerDesc": "سيرفر Telegram API المستخدم. سيبه فاضي لاستخدام الافتراضي.", - "telegramChatId": "ID شات الأدمن", - "telegramChatIdDesc": "ID شات الأدمن في Telegram. (مفصول بفواصل)(تقدر تجيبه من {'@'}userinfobot) أو (استخدم '/id' في البوت)", - "telegramNotifyTime": "وقت الإشعار", - "telegramNotifyTimeDesc": "وقت إشعار البوت للتقارير الدورية. (استخدم صيغة وقت crontab)", - "tgNotifyBackup": "نسخة احتياطية لقاعدة البيانات", - "tgNotifyBackupDesc": "ابعت ملف النسخة الاحتياطية لقاعدة البيانات مع التقرير.", - "tgNotifyLogin": "إشعار بتسجيل الدخول", - "tgNotifyLoginDesc": "استقبل إشعار بكل محاولة تسجيل دخول للبانل مع اسم المستخدم، الـ IP، والوقت.", - "sessionMaxAge": "مدة الجلسة", - "sessionMaxAgeDesc": "المدة اللي تفضل فيها مسجل دخول. (الوحدة: دقيقة)", + "dateAndTime": "التاريخ والوقت", + "datepicker": "نوع التقويم", + "datepickerDescription": "المهام المجدولة هتشتغل بناءً على التقويم ده.", + "datepickerPlaceholder": "اختار التاريخ", + "direct": "اتصال مباشر", + "directDesc": "ينشئ اتصال مباشر مع الدومينات أو نطاقات IP لدولة معينة.", "expireTimeDiff": "تنبيه بتاريخ الانتهاء", "expireTimeDiffDesc": "استقبل تنبيه قبل ما توصل لتاريخ الانتهاء بالمدة المحددة. (الوحدة: يوم)", - "trafficDiff": "تنبيه حد الترافيك", - "trafficDiffDesc": "استقبل تنبيه عند وصول الترافيك للحد المحدد. (الوحدة: جيجابايت)", - "tgNotifyCpu": "تنبيه حمل المعالج", - "tgNotifyCpuDesc": "استقبل تنبيه لو حمل المعالج عدى الحد المحدد. (الوحدة: %)", - "timeZone": "المنطقة الزمنية", - "timeZoneDesc": "المهام المجدولة هتشتغل بناءً على المنطقة الزمنية دي.", - "subSettings": "الاشتراك", - "subEnable": "تفعيل خدمة الاشتراك", - "subEnableDesc": "يفعل خدمة الاشتراك.", - "subJsonEnable": "تمكين/تعطيل نقطة نهاية اشتراك JSON بشكل مستقل.", - "subTitle": "عنوان الاشتراك", - "subTitleDesc": "العنوان اللي هيظهر في عميل VPN", - "subSupportUrl": "رابط الدعم", - "subSupportUrlDesc": "رابط الدعم الفني المعروض في عميل VPN", - "subProfileUrl": "رابط الملف الشخصي", - "subProfileUrlDesc": "رابط لموقعك الإلكتروني يظهر في عميل VPN", - "subAnnounce": "إعلان", - "subAnnounceDesc": "نص الإعلان المعروض في عميل VPN", - "subEnableRouting": "تفعيل التوجيه", - "subEnableRoutingDesc": "إعداد عام لتمكين التوجيه (Routing) في عميل VPN. (فقط لـ Happ)", - "subRoutingRules": "قواعد التوجيه", - "subRoutingRulesDesc": "قواعد التوجيه العامة لعميل VPN. (فقط لـ Happ)", - "subListen": "IP الاستماع", - "subListenDesc": "عنوان IP لخدمة الاشتراك. (سيبه فاضي عشان يستمع على كل الـ IPs)", - "subPort": "بورت الاستماع", - "subPortDesc": "رقم البورت لخدمة الاشتراك. (لازم يكون بورت فاضي)", - "subCertPath": "مسار المفتاح العام", - "subCertPathDesc": "مسار ملف المفتاح العام لخدمة الاشتراك. (يبدأ بـ '/')", - "subKeyPath": "مسار المفتاح الخاص", - "subKeyPathDesc": "مسار ملف المفتاح الخاص لخدمة الاشتراك. (يبدأ بـ '/')", - "subPath": "مسار URI", - "subPathDesc": "مسار URI لخدمة الاشتراك. (يبدأ بـ '/' وبينتهي بـ '/')", - "subDomain": "دومين الاستماع", - "subDomainDesc": "اسم الدومين لخدمة الاشتراك. (سيبه فاضي عشان يستمع على كل الدومينات والـ IPs)", - "subUpdates": "فترات التحديث", - "subUpdatesDesc": "فترات تحديث رابط الاشتراك في تطبيقات العملاء. (الوحدة: ساعة)", - "subEncrypt": "تشفير", - "subEncryptDesc": "المحتوى اللي هيترجع من خدمة الاشتراك هيكون مشفر بـ Base64.", - "subShowInfo": "اظهر معلومات الاستخدام", - "subShowInfoDesc": "هيظهر الترافيك المتبقي والتاريخ في تطبيقات العملاء.", - "subURI": "مسار البروكسي العكسي", - "subURIDesc": "مسار URI لرابط الاشتراك عشان تستخدمه ورا البروكسي.", + "externalTraffic": "الترافيك الخارجي", "externalTrafficInformEnable": "تنبيه الترافيك الخارجي", "externalTrafficInformEnableDesc": "يبعت تنبيه لـ API خارجي مع كل تحديث للترافيك.", "externalTrafficInformURI": "مسار تنبيه الترافيك الخارجي", "externalTrafficInformURIDesc": "تحديثات الترافيك هتتبعت للمسار ده.", - "restartXrayOnClientDisable": "إعادة تشغيل Xray بعد التعطيل التلقائي", - "restartXrayOnClientDisableDesc": "عند تعطيل العميل تلقائيا بسبب انتهاء الصلاحية أو حد حركة المرور، أعد تشغيل Xray.", "fragment": "تجزئة", "fragmentDesc": "يفعل تجزئة لحزمة TLS hello.", "fragmentSett": "إعدادات التجزئة", - "noisesDesc": "يفعل التشويش.", - "noisesSett": "إعدادات التشويش", + "infoDesc": "كل تغيير هتعمله هنا لازم يتخزن. ياريت تعيد تشغيل البانل عشان التعديلات تتفعل.", + "information": "المعلومات", + "intervals": "الفترات", + "language": "اللغة", "mux": "MUX", "muxDesc": "ينقل أكثر من تيار بيانات مستقل خلال تيار بيانات واحد قائم.", "muxSett": "إعدادات MUX", - "direct": "اتصال مباشر", - "directDesc": "ينشئ اتصال مباشر مع الدومينات أو نطاقات IP لدولة معينة.", + "newPassword": "الباسورد الجديد", + "newUsername": "اسم المستخدم الجديد", + "noisesDesc": "يفعل التشويش.", + "noisesSett": "إعدادات التشويش", "notifications": "الإشعارات", - "certs": "الشهادات", - "externalTraffic": "الترافيك الخارجي", - "dateAndTime": "التاريخ والوقت", + "oldUsername": "اسم المستخدم الحالي", + "pageSize": "حجم الصفحة", + "pageSizeDesc": "حدد حجم الصفحة لجدول الإدخالات. (0 = تعطيل)", + "panelListeningDomain": "دومين الاستماع", + "panelListeningDomainDesc": "اسم الدومين للبانل. (سيبه فاضي عشان يستمع على كل الدومينات والـ IPs)", + "panelListeningIP": "IP الاستماع", + "panelListeningIPDesc": "عنوان IP للبانل. (سيبه فاضي عشان يستمع على كل الـ IPs)", + "panelPort": "بورت الاستماع", + "panelPortDesc": "رقم البورت للبانل. (لازم يكون بورت فاضي)", + "panelSettings": "عام", + "panelUrlPath": "مسار URI", + "panelUrlPathDesc": "مسار URI للبانل. (يبدأ بـ '/' وبينتهي بـ '/')", + "privateKeyPath": "مسار المفتاح الخاص", + "privateKeyPathDesc": "مسار ملف المفتاح الخاص للبانل. (يبدأ بـ '/')", "proxyAndServer": "البروكسي والسيرفر", - "intervals": "الفترات", - "information": "المعلومات", - "language": "اللغة", - "telegramBotLanguage": "لغة بوت Telegram", + "publicKeyPath": "مسار المفتاح العام", + "publicKeyPathDesc": "مسار ملف المفتاح العام للبانل. (يبدأ بـ '/')", + "remarkModel": "نموذج الملاحظة وحرف الفصل", + "resetDefaultConfig": "استرجاع الافتراضي", + "restartPanel": "إعادة تشغيل البانل", + "restartPanelDesc": "متأكد إنك عايز تعيد تشغيل البانل؟ لو ماقدرتش تدخل بعد إعادة التشغيل، شوف سجل البانل على السيرفر.", + "restartPanelSuccess": "تم إعادة تشغيل اللوحة بنجاح", + "restartXrayOnClientDisable": "إعادة تشغيل Xray بعد التعطيل التلقائي", + "restartXrayOnClientDisableDesc": "عند تعطيل العميل تلقائيا بسبب انتهاء الصلاحية أو حد حركة المرور، أعد تشغيل Xray.", + "sampleRemark": "مثال للملاحظة", + "save": "حفظ", "security": { "admin": "بيانات الأدمن", "twoFactor": "المصادقة الثنائية", "twoFactorEnable": "تفعيل المصادقة الثنائية", "twoFactorEnableDesc": "يضيف طبقة إضافية من المصادقة لتعزيز الأمان.", - "twoFactorModalSetTitle": "تفعيل المصادقة الثنائية", - "twoFactorModalDeleteTitle": "تعطيل المصادقة الثنائية", - "twoFactorModalSteps": "لإعداد المصادقة الثنائية، قم ببعض الخطوات:", - "twoFactorModalFirstStep": "1. امسح رمز QR هذا في تطبيق المصادقة أو انسخ الرمز الموجود بجانب رمز QR والصقه في التطبيق", - "twoFactorModalSecondStep": "2. أدخل الرمز من التطبيق", - "twoFactorModalRemoveStep": "أدخل الرمز من التطبيق لإزالة المصادقة الثنائية.", - "twoFactorModalChangeCredentialsTitle": "تغيير بيانات الاعتماد", "twoFactorModalChangeCredentialsStep": "أدخل الرمز من التطبيق لتغيير بيانات اعتماد المسؤول.", - "twoFactorModalSetSuccess": "تم إنشاء المصادقة الثنائية بنجاح", + "twoFactorModalChangeCredentialsTitle": "تغيير بيانات الاعتماد", "twoFactorModalDeleteSuccess": "تم حذف المصادقة الثنائية بنجاح", - "twoFactorModalError": "رمز خاطئ" + "twoFactorModalDeleteTitle": "تعطيل المصادقة الثنائية", + "twoFactorModalError": "رمز خاطئ", + "twoFactorModalFirstStep": "1. امسح رمز QR هذا في تطبيق المصادقة أو انسخ الرمز الموجود بجانب رمز QR والصقه في التطبيق", + "twoFactorModalRemoveStep": "أدخل الرمز من التطبيق لإزالة المصادقة الثنائية.", + "twoFactorModalSecondStep": "2. أدخل الرمز من التطبيق", + "twoFactorModalSetSuccess": "تم إنشاء المصادقة الثنائية بنجاح", + "twoFactorModalSetTitle": "تفعيل المصادقة الثنائية", + "twoFactorModalSteps": "لإعداد المصادقة الثنائية، قم ببعض الخطوات:" }, + "securitySettings": "المصادقة", + "sessionMaxAge": "مدة الجلسة", + "sessionMaxAgeDesc": "المدة اللي تفضل فيها مسجل دخول. (الوحدة: دقيقة)", + "subAnnounce": "إعلان", + "subAnnounceDesc": "نص الإعلان المعروض في عميل VPN", + "subCertPath": "مسار المفتاح العام", + "subCertPathDesc": "مسار ملف المفتاح العام لخدمة الاشتراك. (يبدأ بـ '/')", + "subDomain": "دومين الاستماع", + "subDomainDesc": "اسم الدومين لخدمة الاشتراك. (سيبه فاضي عشان يستمع على كل الدومينات والـ IPs)", + "subEnable": "تفعيل خدمة الاشتراك", + "subEnableDesc": "يفعل خدمة الاشتراك.", + "subEnableRouting": "تفعيل التوجيه", + "subEnableRoutingDesc": "إعداد عام لتمكين التوجيه (Routing) في عميل VPN. (فقط لـ Happ)", + "subEncrypt": "تشفير", + "subEncryptDesc": "المحتوى اللي هيترجع من خدمة الاشتراك هيكون مشفر بـ Base64.", + "subJsonEnable": "تمكين/تعطيل نقطة نهاية اشتراك JSON بشكل مستقل.", + "subKeyPath": "مسار المفتاح الخاص", + "subKeyPathDesc": "مسار ملف المفتاح الخاص لخدمة الاشتراك. (يبدأ بـ '/')", + "subListen": "IP الاستماع", + "subListenDesc": "عنوان IP لخدمة الاشتراك. (سيبه فاضي عشان يستمع على كل الـ IPs)", + "subPath": "مسار URI", + "subPathDesc": "مسار URI لخدمة الاشتراك. (يبدأ بـ '/' وبينتهي بـ '/')", + "subPort": "بورت الاستماع", + "subPortDesc": "رقم البورت لخدمة الاشتراك. (لازم يكون بورت فاضي)", + "subProfileUrl": "رابط الملف الشخصي", + "subProfileUrlDesc": "رابط لموقعك الإلكتروني يظهر في عميل VPN", + "subRoutingRules": "قواعد التوجيه", + "subRoutingRulesDesc": "قواعد التوجيه العامة لعميل VPN. (فقط لـ Happ)", + "subSettings": "الاشتراك", + "subShowInfo": "اظهر معلومات الاستخدام", + "subShowInfoDesc": "هيظهر الترافيك المتبقي والتاريخ في تطبيقات العملاء.", + "subSupportUrl": "رابط الدعم", + "subSupportUrlDesc": "رابط الدعم الفني المعروض في عميل VPN", + "subTitle": "عنوان الاشتراك", + "subTitleDesc": "العنوان اللي هيظهر في عميل VPN", + "subURI": "مسار البروكسي العكسي", + "subURIDesc": "مسار URI لرابط الاشتراك عشان تستخدمه ورا البروكسي.", + "subUpdates": "فترات التحديث", + "subUpdatesDesc": "فترات تحديث رابط الاشتراك في تطبيقات العملاء. (الوحدة: ساعة)", + "telegramAPIServer": "سيرفر Telegram API", + "telegramAPIServerDesc": "سيرفر Telegram API المستخدم. سيبه فاضي لاستخدام الافتراضي.", + "telegramBotEnable": "تفعيل بوت Telegram", + "telegramBotEnableDesc": "يفعل بوت Telegram.", + "telegramBotLanguage": "لغة بوت Telegram", + "telegramChatId": "ID شات الأدمن", + "telegramChatIdDesc": "ID شات الأدمن في Telegram. (مفصول بفواصل)(تقدر تجيبه من {'@'}userinfobot) أو (استخدم '/id' في البوت)", + "telegramNotifyTime": "وقت الإشعار", + "telegramNotifyTimeDesc": "وقت إشعار البوت للتقارير الدورية. (استخدم صيغة وقت crontab)", + "telegramProxy": "بروكسي SOCKS", + "telegramProxyDesc": "يفعل بروكسي SOCKS5 للاتصال بـ Telegram. (اضبط الإعدادات حسب الدليل)", + "telegramToken": "توكن Telegram", + "telegramTokenDesc": "توكن البوت اللي جبت من '{'@'}BotFather'.", + "tgNotifyBackup": "نسخة احتياطية لقاعدة البيانات", + "tgNotifyBackupDesc": "ابعت ملف النسخة الاحتياطية لقاعدة البيانات مع التقرير.", + "tgNotifyCpu": "تنبيه حمل المعالج", + "tgNotifyCpuDesc": "استقبل تنبيه لو حمل المعالج عدى الحد المحدد. (الوحدة: %)", + "tgNotifyLogin": "إشعار بتسجيل الدخول", + "tgNotifyLoginDesc": "استقبل إشعار بكل محاولة تسجيل دخول للبانل مع اسم المستخدم، الـ IP، والوقت.", + "timeZone": "المنطقة الزمنية", + "timeZoneDesc": "المهام المجدولة هتشتغل بناءً على المنطقة الزمنية دي.", + "title": "إعدادات البانل", "toasts": { - "modifySettings": "تم تغيير المعلمات.", - "getSettings": "حدث خطأ أثناء استرداد المعلمات.", - "modifyUserError": "حدث خطأ أثناء تغيير بيانات اعتماد المسؤول.", - "modifyUser": "لقد قمت بتغيير بيانات اعتماد المسؤول بنجاح.", - "originalUserPassIncorrect": "اسم المستخدم أو الباسورد الحالي غير صحيح", - "userPassMustBeNotEmpty": "اسم المستخدم والباسورد الجديدين فاضيين", "getOutboundTrafficError": "خطأ في الحصول على حركات المرور الصادرة", - "resetOutboundTrafficError": "خطأ في إعادة تعيين حركات المرور الصادرة" - } + "getSettings": "حدث خطأ أثناء استرداد المعلمات.", + "modifySettings": "تم تغيير المعلمات.", + "modifyUser": "لقد قمت بتغيير بيانات اعتماد المسؤول بنجاح.", + "modifyUserError": "حدث خطأ أثناء تغيير بيانات اعتماد المسؤول.", + "originalUserPassIncorrect": "اسم المستخدم أو الباسورد الحالي غير صحيح", + "resetOutboundTrafficError": "خطأ في إعادة تعيين حركات المرور الصادرة", + "userPassMustBeNotEmpty": "اسم المستخدم والباسورد الجديدين فاضيين" + }, + "trafficDiff": "تنبيه حد الترافيك", + "trafficDiffDesc": "استقبل تنبيه عند وصول الترافيك للحد المحدد. (الوحدة: جيجابايت)" }, "xray": { - "title": "إعدادات Xray", - "save": "احفظ", - "restart": "أعد تشغيل Xray", - "restartSuccess": "تم إعادة تشغيل Xray بنجاح", - "stopSuccess": "تم إيقاف Xray بنجاح", - "restartError": "حدث خطأ أثناء إعادة تشغيل Xray.", - "stopError": "حدث خطأ أثناء إيقاف Xray.", - "basicTemplate": "أساسي", - "advancedTemplate": "متقدم", - "generalConfigs": "إعدادات عامة", - "generalConfigsDesc": "الخيارات دي هتحدد التعديلات العامة.", - "logConfigs": "السجلات", - "logConfigsDesc": "السجلات ممكن تأثر على كفاءة السيرفر. ننصح بتفعيلها بحكمة لما تكون محتاجها.", - "blockConfigsDesc": "الخيارات دي هتحجب الترافيك بناءً على بروتوكولات ومواقع محددة.", - "basicRouting": "توجيه أساسي", - "blockConnectionsConfigsDesc": "الخيارات دي هتحجب الترافيك بناءً على الدولة المطلوبة.", - "directConnectionsConfigsDesc": "الاتصال المباشر بيضمن إن الترافيك المعين مايمرش من سيرفر تاني.", - "blockips": "حظر IPs", - "blockdomains": "حظر دومينات", - "directips": "اتصالات مباشرة لـ IPs", - "directdomains": "اتصالات مباشرة للدومينات", - "ipv4Routing": "توجيه IPv4", - "ipv4RoutingDesc": "الخيارات دي هتوجه الترافيك بناءً على وجهة معينة عبر IPv4.", - "warpRouting": "توجيه WARP", - "warpRoutingDesc": "الخيارات دي هتوجه الترافيك بناءً على وجهة معينة عبر WARP.", - "nordRouting": "توجيه NordVPN", - "nordRoutingDesc": "الخيارات دي هتوجه الترافيك بناءً على وجهة معينة عبر NordVPN.", - "Template": "قالب إعدادات Xray المتقدم", - "TemplateDesc": "ملف إعدادات Xray النهائي هيتولد بناءً على القالب ده.", + "Balancers": "موازنات التحميل", "FreedomStrategy": "استراتيجية بروتوكول الحرية", "FreedomStrategyDesc": "اختار استراتيجية المخرجات للشبكة في بروتوكول الحرية.", - "RoutingStrategy": "استراتيجية التوجيه العامة", - "RoutingStrategyDesc": "حدد استراتيجية التوجيه الإجمالية لحل كل الطلبات.", - "outboundTestUrl": "رابط اختبار المخرج", - "outboundTestUrlDesc": "الرابط المستخدم عند اختبار اتصال المخرج", - "Torrent": "حظر بروتوكول التورنت", "Inbounds": "الإدخالات", "InboundsDesc": "قبول العملاء المعينين.", "Outbounds": "المخرجات", - "Balancers": "موازنات التحميل", "OutboundsDesc": "حدد مسار الترافيك الصادر.", + "RoutingStrategy": "استراتيجية التوجيه العامة", + "RoutingStrategyDesc": "حدد استراتيجية التوجيه الإجمالية لحل كل الطلبات.", "Routings": "قواعد التوجيه", "RoutingsDesc": "أولوية كل قاعدة مهمة جداً!", - "completeTemplate": "الكل", - "logLevel": "مستوى السجلات", - "logLevelDesc": "مستوى السجل الخاص بالأخطاء، اللي بيوضح المعلومات المطلوبة للتسجيل.", + "Template": "قالب إعدادات Xray المتقدم", + "TemplateDesc": "ملف إعدادات Xray النهائي هيتولد بناءً على القالب ده.", + "Torrent": "حظر بروتوكول التورنت", "accessLog": "سجل الوصول", "accessLogDesc": "مسار ملف سجل الوصول. القيمة الخاصة 'none' بتعطل سجل الوصول.", - "errorLog": "سجل الأخطاء", - "errorLogDesc": "مسار ملف سجل الأخطاء. القيمة الخاصة 'none' بتعطل سجل الأخطاء.", - "dnsLog": "سجل DNS", - "dnsLogDesc": "لو هتسجل استعلامات DNS.", - "maskAddress": "إخفاء العنوان", - "maskAddressDesc": "إخفاء عنوان الـ IP؛ لو مفعل، هيستبدل تلقائياً عنوان IP اللي بيظهر في السجل.", - "statistics": "إحصائيات", - "statsInboundUplink": "إحصائيات رفع الإدخال", - "statsInboundUplinkDesc": "تفعيل جمع الإحصائيات لترافيك الرفع لكل بروكسي من الإدخالات.", - "statsInboundDownlink": "إحصائيات تنزيل الإدخال", - "statsInboundDownlinkDesc": "تفعيل جمع الإحصائيات لترافيك التنزيل لكل بروكسي من الإدخالات.", - "statsOutboundUplink": "إحصائيات رفع المخرجات", - "statsOutboundUplinkDesc": "تفعيل جمع الإحصائيات لترافيك الرفع لكل بروكسي من المخرجات.", - "statsOutboundDownlink": "إحصائيات تنزيل المخرجات", - "statsOutboundDownlinkDesc": "تفعيل جمع الإحصائيات لترافيك التنزيل لكل بروكسي من المخرجات.", - "rules": { - "first": "أول", - "last": "آخر", - "up": "فوق", - "down": "تحت", - "source": "المصدر", - "dest": "الوجهة", - "inbound": "إدخال", - "outbound": "مخرج", - "balancer": "موازن", - "info": "معلومات", - "add": "أضف قاعدة", - "edit": "عدل القاعدة", - "useComma": "عناصر مفصولة بفواصل" - }, - "outbound": { - "addOutbound": "أضف مخرج", - "addReverse": "أضف عكسي", - "editOutbound": "عدل المخرج", - "editReverse": "عدل العكسي", - "reverseTag": "وسم العكسي", - "reverseTagDesc": "وسم الخروج لبروكسي VLESS العكسي البسيط. اتركه فارغاً لتعطيله.", - "reverseTagPlaceholder": "وسم الخروج (اتركه فارغاً للتعطيل)", - "tag": "تاج", - "tagDesc": "تاج فريد", - "address": "العنوان", - "reverse": "عكسي", - "domain": "دومين", - "type": "النوع", - "bridge": "جسر", - "portal": "بوابة", - "link": "رابط", - "intercon": "تواصل", - "settings": "إعدادات", - "accountInfo": "معلومات الحساب", - "outboundStatus": "حالة المخرج", - "sendThrough": "أرسل من خلال", - "test": "اختبار", - "testResult": "نتيجة الاختبار", - "testing": "جاري اختبار الاتصال...", - "testSuccess": "الاختبار ناجح", - "testFailed": "فشل الاختبار", - "testError": "فشل اختبار المخرج", - "nordvpn": "NordVPN", - "accessToken": "رمز الوصول", - "country": "الدولة", - "server": "الخادم", - "city": "المدينة", - "allCities": "كل المدن", - "privateKey": "المفتاح الخاص", - "load": "الحمل" - }, + "advancedTemplate": "متقدم", "balancer": { "addBalancer": "أضف موازن تحميل", - "editBalancer": "عدل موازن التحميل", - "balancerStrategy": "استراتيجية الموازن", + "balancerDesc": "ماينفعش تستخدم balancerTag و outboundTag مع بعض. لو اتستخدموا مع بعض، outboundTag هو اللي هيشتغل.", "balancerSelectors": "المحددات", + "balancerStrategy": "استراتيجية الموازن", + "editBalancer": "عدل موازن التحميل", "tag": "تاج", - "tagDesc": "تاج فريد", - "balancerDesc": "ماينفعش تستخدم balancerTag و outboundTag مع بعض. لو اتستخدموا مع بعض، outboundTag هو اللي هيشتغل." - }, - "wireguard": { - "secretKey": "المفتاح السري", - "publicKey": "المفتاح العام", - "allowedIPs": "عناوين IP المسموح بها", - "endpoint": "النهاية", - "psk": "المفتاح المشترك", - "domainStrategy": "استراتيجية الدومين" - }, - "tun": { - "nameDesc": "اسم واجهة TUN. القيمة الافتراضية هي 'xray0'", - "mtuDesc": "وحدة النقل الأقصى. الحد الأقصى لحجم حزم البيانات. القيمة الافتراضية هي 1500", - "userLevel": "مستوى المستخدم", - "userLevelDesc": "ستستخدم جميع الاتصالات المُرسلة عبر هذا الإدخال مستوى المستخدم هذا. القيمة الافتراضية هي 0" + "tagDesc": "تاج فريد" }, + "basicRouting": "توجيه أساسي", + "basicTemplate": "أساسي", + "blockConfigsDesc": "الخيارات دي هتحجب الترافيك بناءً على بروتوكولات ومواقع محددة.", + "blockConnectionsConfigsDesc": "الخيارات دي هتحجب الترافيك بناءً على الدولة المطلوبة.", + "blockdomains": "حظر دومينات", + "blockips": "حظر IPs", + "completeTemplate": "الكل", + "directConnectionsConfigsDesc": "الاتصال المباشر بيضمن إن الترافيك المعين مايمرش من سيرفر تاني.", + "directdomains": "اتصالات مباشرة للدومينات", + "directips": "اتصالات مباشرة لـ IPs", "dns": { - "enable": "فعل DNS", - "enableDesc": "فعل سيرفر DNS المدمج", - "tag": "تاج إدخال DNS", - "tagDesc": "التاج ده هيبقى متاح كإدخال في قواعد التوجيه.", + "add": "أضف سيرفر", + "clearAll": "حذف الكل", + "clearAllConfirm": "سيؤدي هذا إلى إزالة جميع خوادم DNS من القائمة. لا يمكن التراجع عن هذا الإجراء.", + "clearAllTitle": "حذف جميع خوادم DNS؟", "clientIp": "IP العميل", "clientIpDesc": "بيحدد موقع العميل خلال استعلامات DNS", "disableCache": "تعطيل الكاش", @@ -753,217 +607,371 @@ "disableFallbackDesc": "بيعطل استعلامات DNS الاحتياطية", "disableFallbackIfMatch": "تعطيل النسخ الاحتياطي عند التطابق", "disableFallbackIfMatchDesc": "بيعطل استعلامات DNS الاحتياطية لما يتحقق تطابق مع قائمة الدومينات", + "dnsPresetFamily": "العائلي", + "dnsPresetTitle": "قوالب DNS", + "domains": "الدومينات", + "edit": "عدل السيرفر", + "enable": "فعل DNS", + "enableDesc": "فعل سيرفر DNS المدمج", "enableParallelQuery": "تفعيل الاستعلام المتوازي", "enableParallelQueryDesc": "تفعيل استعلامات DNS المتوازية لعدة خوادم لحل أسرع", - "strategy": "استراتيجية الاستعلام", - "strategyDesc": "الاستراتيجية العامة لحل أسماء الدومين", - "add": "أضف سيرفر", - "edit": "عدل السيرفر", - "domains": "الدومينات", "expectIPs": "العناوين المتوقعة", - "unexpectIPs": "عناوين IP غير متوقعة", - "useSystemHosts": "استخدام ملف Hosts الخاص بالنظام", - "useSystemHostsDesc": "استخدام ملف hosts من نظام مثبت", - "usePreset": "استخدام النموذج", - "dnsPresetTitle": "قوالب DNS", - "dnsPresetFamily": "العائلي", - "serveStale": "تقديم النتائج المنتهية", - "serveStaleDesc": "إرجاع نتائج الكاش المنتهية الصلاحية أثناء التحديث في الخلفية", - "serveExpiredTTL": "مدة صلاحية النتائج المنتهية", - "serveExpiredTTLDesc": "مدة صلاحية إدخالات الكاش المنتهية بالثواني؛ 0 = لا تنتهي أبدًا", - "timeoutMs": "المهلة (مللي ثانية)", - "skipFallback": "تخطي الاحتياطي", "finalQuery": "الاستعلام النهائي", "hosts": "Hosts", "hostsAdd": "إضافة Host", - "hostsEmpty": "لم يتم تعريف أي Host", "hostsDomain": "النطاق (مثل domain:example.com)", + "hostsEmpty": "لم يتم تعريف أي Host", "hostsValues": "عنوان IP أو نطاق — اكتب واضغط Enter", - "clearAll": "حذف الكل", - "clearAllTitle": "حذف جميع خوادم DNS؟", - "clearAllConfirm": "سيؤدي هذا إلى إزالة جميع خوادم DNS من القائمة. لا يمكن التراجع عن هذا الإجراء." + "serveExpiredTTL": "مدة صلاحية النتائج المنتهية", + "serveExpiredTTLDesc": "مدة صلاحية إدخالات الكاش المنتهية بالثواني؛ 0 = لا تنتهي أبدًا", + "serveStale": "تقديم النتائج المنتهية", + "serveStaleDesc": "إرجاع نتائج الكاش المنتهية الصلاحية أثناء التحديث في الخلفية", + "skipFallback": "تخطي الاحتياطي", + "strategy": "استراتيجية الاستعلام", + "strategyDesc": "الاستراتيجية العامة لحل أسماء الدومين", + "tag": "تاج إدخال DNS", + "tagDesc": "التاج ده هيبقى متاح كإدخال في قواعد التوجيه.", + "timeoutMs": "المهلة (مللي ثانية)", + "unexpectIPs": "عناوين IP غير متوقعة", + "usePreset": "استخدام النموذج", + "useSystemHosts": "استخدام ملف Hosts الخاص بالنظام", + "useSystemHostsDesc": "استخدام ملف hosts من نظام مثبت" }, + "dnsLog": "سجل DNS", + "dnsLogDesc": "لو هتسجل استعلامات DNS.", + "errorLog": "سجل الأخطاء", + "errorLogDesc": "مسار ملف سجل الأخطاء. القيمة الخاصة 'none' بتعطل سجل الأخطاء.", "fakedns": { "add": "أضف Fake DNS", "edit": "عدل Fake DNS", "ipPool": "نطاق IP Pool", "poolSize": "حجم المجموعة" + }, + "generalConfigs": "إعدادات عامة", + "generalConfigsDesc": "الخيارات دي هتحدد التعديلات العامة.", + "ipv4Routing": "توجيه IPv4", + "ipv4RoutingDesc": "الخيارات دي هتوجه الترافيك بناءً على وجهة معينة عبر IPv4.", + "logConfigs": "السجلات", + "logConfigsDesc": "السجلات ممكن تأثر على كفاءة السيرفر. ننصح بتفعيلها بحكمة لما تكون محتاجها.", + "logLevel": "مستوى السجلات", + "logLevelDesc": "مستوى السجل الخاص بالأخطاء، اللي بيوضح المعلومات المطلوبة للتسجيل.", + "maskAddress": "إخفاء العنوان", + "maskAddressDesc": "إخفاء عنوان الـ IP؛ لو مفعل، هيستبدل تلقائياً عنوان IP اللي بيظهر في السجل.", + "nordRouting": "توجيه NordVPN", + "nordRoutingDesc": "الخيارات دي هتوجه الترافيك بناءً على وجهة معينة عبر NordVPN.", + "outbound": { + "accessToken": "رمز الوصول", + "accountInfo": "معلومات الحساب", + "addOutbound": "أضف مخرج", + "addReverse": "أضف عكسي", + "address": "العنوان", + "allCities": "كل المدن", + "bridge": "جسر", + "city": "المدينة", + "country": "الدولة", + "domain": "دومين", + "editOutbound": "عدل المخرج", + "editReverse": "عدل العكسي", + "intercon": "تواصل", + "link": "رابط", + "load": "الحمل", + "nordvpn": "NordVPN", + "outboundStatus": "حالة المخرج", + "portal": "بوابة", + "privateKey": "المفتاح الخاص", + "reverse": "عكسي", + "reverseTag": "وسم العكسي", + "reverseTagDesc": "وسم الخروج لبروكسي VLESS العكسي البسيط. اتركه فارغاً لتعطيله.", + "reverseTagPlaceholder": "وسم الخروج (اتركه فارغاً للتعطيل)", + "sendThrough": "أرسل من خلال", + "server": "الخادم", + "settings": "إعدادات", + "tag": "تاج", + "tagDesc": "تاج فريد", + "test": "اختبار", + "testError": "فشل اختبار المخرج", + "testFailed": "فشل الاختبار", + "testResult": "نتيجة الاختبار", + "testSuccess": "الاختبار ناجح", + "testing": "جاري اختبار الاتصال...", + "type": "النوع" + }, + "outboundTestUrl": "رابط اختبار المخرج", + "outboundTestUrlDesc": "الرابط المستخدم عند اختبار اتصال المخرج", + "restart": "أعد تشغيل Xray", + "restartError": "حدث خطأ أثناء إعادة تشغيل Xray.", + "restartSuccess": "تم إعادة تشغيل Xray بنجاح", + "rules": { + "add": "أضف قاعدة", + "balancer": "موازن", + "dest": "الوجهة", + "down": "تحت", + "edit": "عدل القاعدة", + "first": "أول", + "inbound": "إدخال", + "info": "معلومات", + "last": "آخر", + "outbound": "مخرج", + "source": "المصدر", + "up": "فوق", + "useComma": "عناصر مفصولة بفواصل" + }, + "save": "احفظ", + "statistics": "إحصائيات", + "statsInboundDownlink": "إحصائيات تنزيل الإدخال", + "statsInboundDownlinkDesc": "تفعيل جمع الإحصائيات لترافيك التنزيل لكل بروكسي من الإدخالات.", + "statsInboundUplink": "إحصائيات رفع الإدخال", + "statsInboundUplinkDesc": "تفعيل جمع الإحصائيات لترافيك الرفع لكل بروكسي من الإدخالات.", + "statsOutboundDownlink": "إحصائيات تنزيل المخرجات", + "statsOutboundDownlinkDesc": "تفعيل جمع الإحصائيات لترافيك التنزيل لكل بروكسي من المخرجات.", + "statsOutboundUplink": "إحصائيات رفع المخرجات", + "statsOutboundUplinkDesc": "تفعيل جمع الإحصائيات لترافيك الرفع لكل بروكسي من المخرجات.", + "stopError": "حدث خطأ أثناء إيقاف Xray.", + "stopSuccess": "تم إيقاف Xray بنجاح", + "title": "إعدادات Xray", + "tun": { + "mtuDesc": "وحدة النقل الأقصى. الحد الأقصى لحجم حزم البيانات. القيمة الافتراضية هي 1500", + "nameDesc": "اسم واجهة TUN. القيمة الافتراضية هي 'xray0'", + "userLevel": "مستوى المستخدم", + "userLevelDesc": "ستستخدم جميع الاتصالات المُرسلة عبر هذا الإدخال مستوى المستخدم هذا. القيمة الافتراضية هي 0" + }, + "warpRouting": "توجيه WARP", + "warpRoutingDesc": "الخيارات دي هتوجه الترافيك بناءً على وجهة معينة عبر WARP.", + "wireguard": { + "allowedIPs": "عناوين IP المسموح بها", + "domainStrategy": "استراتيجية الدومين", + "endpoint": "النهاية", + "psk": "المفتاح المشترك", + "publicKey": "المفتاح العام", + "secretKey": "المفتاح السري" } } }, + "password": "الباسورد", + "path": "مسار", + "protocol": "بروتوكول", + "qrCode": "كود QR", + "remained": "المتبقي", + "remark": "ملاحظة", + "reset": "إعادة ضبط", + "save": "حفظ", + "search": "بحث", + "secAlertConf": "بعض الإعدادات معرضة لهجمات. ينصح بتعزيز بروتوكولات الأمان عشان تمنع الاختراقات المحتملة.", + "secAlertPanelPort": "بورت البانل الافتراضي معرض للخطر. ياريت تغير لبورت عشوائي أو محدد.", + "secAlertPanelURI": "مسار URI الافتراضي للبانل مش آمن. ياريت تضبط مسار URI معقد.", + "secAlertSSL": "البانل مش مؤمن. حمّل شهادة TLS لحماية البيانات.", + "secAlertSsl": "الاتصال ده مش آمن. ابعد عن إدخال معلومات حساسة لغاية ما تشغل TLS لحماية البيانات.", + "secAlertSubJsonURI": "مسار URI الافتراضي لاشتراك JSON مش آمن. ياريت تضبط مسار URI معقد.", + "secAlertSubURI": "مسار URI الافتراضي للاشتراك مش آمن. ياريت تضبط مسار URI معقد.", + "secAlertTitle": "تنبيه أمني", + "second": "ثانية", + "security": "أمان", + "somethingWentWrong": "حدث خطأ ما", + "status": "الحالة", + "subscription": { + "active": "نشط", + "downloaded": "التنزيل", + "expiry": "تاريخ الانتهاء", + "inactive": "غير نشط", + "individualLinks": "روابط فردية", + "noExpiry": "بدون انتهاء", + "status": "الحالة", + "subId": "معرّف الاشتراك", + "title": "معلومات الاشتراك", + "totalQuota": "الحصة الإجمالية", + "unlimited": "غير محدود", + "uploaded": "الرفع" + }, + "success": "تم بنجاح", + "sure": "متأكد؟", "tgbot": { - "keyboardClosed": "❌ لوحة المفاتيح مغلقة!", - "noResult": "❗ لا يوجد نتائج!", - "noQuery": "❌ لم يتم العثور على الاستعلام! يرجى استخدام الأمر مرة أخرى!", - "wentWrong": "❌ حدث خطأ ما!", - "noIpRecord": "❗ لا يوجد سجل IP!", - "noInbounds": "❗ لم يتم العثور على أي وارد!", - "unlimited": "♾ غير محدود (إعادة تعيين)", "add": "إضافة", - "month": "شهر", - "months": "أشهر", - "day": "يوم", - "days": "أيام", - "hours": "ساعات", - "minutes": "دقائق", - "unknown": "غير معروف", - "inbounds": "الواردات", - "clients": "العملاء", - "offline": "🔴 غير متصل", - "online": "🟢 متصل", - "commands": { - "unknown": "❗ أمر مش معروف.", - "pleaseChoose": "👇 من فضلك اختار:\r\n", - "help": "🤖 أهلا بيك في البوت! البوت ده معمول عشان يديك بيانات معينة من البانل ويسمحلك بالتعديلات.", - "start": "👋 أهلا {{ .Firstname }}.\r\n", - "welcome": "🤖 أهلا بيك في بوت إدارة {{ .Hostname }}.\r\n", - "status": "✅ البوت شغال!", - "usage": "❗ من فضلك ادخل نص للتبحث عنه!", - "getID": "🆔 الـ ID بتاعك: {{ .ID }}", - "helpAdminCommands": "عشان تعيد تشغيل Xray Core:\r\n/restart\r\n\r\nعشان تدور على إيميل عميل:\r\n/usage [Email]\r\n\r\nعشان تدور على إدخالات (مع إحصائيات العملاء):\r\n/inbound [Remark]\r\n\r\nID شات Telegram:\r\n/id", - "helpClientCommands": "عشان تدور على الإحصائيات، استخدم الأمر ده:\r\n\r\n/usage [Email]\r\n\r\nID شات Telegram:\r\n/id", - "restartUsage": "\r\n\r\n/restart", - "restartSuccess": "✅ العملية نجحت!", - "restartFailed": "❗ حصل خطأ في العملية.\r\n\r\nError: {{ .Error }}.", - "xrayNotRunning": "❗ Xray Core مش شغال.", - "startDesc": "عرض القائمة الرئيسية", - "helpDesc": "مساعدة البوت", - "statusDesc": "التحقق من حالة البوت", - "idDesc": "عرض معرف Telegram الخاص بك" - }, - "messages": { - "cpuThreshold": "🔴 حمل المعالج {{ .Percent }}% عدى الحد المسموح ({{ .Threshold }}%)", - "selectUserFailed": "❌ حصل خطأ في اختيار المستخدم!", - "userSaved": "✅ حفظت بيانات مستخدم Telegram.", - "loginSuccess": "✅ تسجيل الدخول للبانل تم بنجاح.\r\n", - "loginFailed": "❗️فشل محاولة تسجيل الدخول للبانل.\r\n", - "2faFailed": "فشل 2FA", - "report": "🕰 التقارير المجدولة: {{ .RunTime }}\r\n", - "datetime": "⏰ التاريخ والوقت: {{ .DateTime }}\r\n", - "hostname": "💻 السيرفر: {{ .Hostname }}\r\n", - "version": "🚀 نسخة 3X-UI: {{ .Version }}\r\n", - "xrayVersion": "📡 نسخة Xray: {{ .XrayVersion }}\r\n", - "ipv6": "🌐 IPv6: {{ .IPv6 }}\r\n", - "ipv4": "🌐 IPv4: {{ .IPv4 }}\r\n", - "ip": "🌐 IP: {{ .IP }}\r\n", - "ips": "🔢 عناوين IP:\r\n{{ .IPs }}\r\n", - "serverUpTime": "⏳ وقت التشغيل: {{ .UpTime }} {{ .Unit }}\r\n", - "serverLoad": "📈 تحميل النظام: {{ .Load1 }}, {{ .Load2 }}, {{ .Load3 }}\r\n", - "serverMemory": "📋 الرام: {{ .Current }}/{{ .Total }}\r\n", - "tcpCount": "🔹 TCP: {{ .Count }}\r\n", - "udpCount": "🔸 UDP: {{ .Count }}\r\n", - "traffic": "🚦 الترافيك: {{ .Total }} (↑{{ .Upload }},↓{{ .Download }})\r\n", - "xrayStatus": "ℹ️ الحالة: {{ .State }}\r\n", - "username": "👤 اسم المستخدم: {{ .Username }}\r\n", - "reason": "❗️ السبب: {{ .Reason }}\r\n", - "time": "⏰ الوقت: {{ .Time }}\r\n", - "inbound": "📍 الإدخال: {{ .Remark }}\r\n", - "port": "🔌 البورت: {{ .Port }}\r\n", - "expire": "📅 تاريخ الانتهاء: {{ .Time }}\r\n", - "expireIn": "📅 هيخلص بعد: {{ .Time }}\r\n", - "active": "💡 مفعل: {{ .Enable }}\r\n", - "enabled": "🚨 مفعل: {{ .Enable }}\r\n", - "online": "🌐 حالة الاتصال: {{ .Status }}\r\n", - "lastOnline": "🔙 آخر متصل: {{ .Time }}\r\n", - "email": "📧 الإيميل: {{ .Email }}\r\n", - "upload": "🔼 رفع: ↑{{ .Upload }}\r\n", - "download": "🔽 تنزيل: ↓{{ .Download }}\r\n", - "total": "📊 الإجمالي: ↑↓{{ .UpDown }} / {{ .Total }}\r\n", - "TGUser": "👤 مستخدم Telegram: {{ .TelegramID }}\r\n", - "exhaustedMsg": "🚨 نفذ {{ .Type }}:\r\n", - "exhaustedCount": "🚨 عدد النفاذ لـ {{ .Type }}:\r\n", - "onlinesCount": "🌐 العملاء الأونلاين: {{ .Count }}\r\n", - "disabled": "🛑 معطل: {{ .Disabled }}\r\n", - "depleteSoon": "🔜 هينتهي قريب: {{ .Deplete }}\r\n\r\n", - "backupTime": "🗄 وقت النسخة الاحتياطية: {{ .Time }}\r\n", - "refreshedOn": "\r\n📋🔄 اتحدّث في: {{ .Time }}\r\n\r\n", - "yes": "✅ أيوه", - "no": "❌ لأ", - "received_id": "🔑📥 الـ ID اتحدث.", - "received_password": "🔑📥 الباسورد اتحدث.", - "received_email": "📧📥 الإيميل اتحدث.", - "received_comment": "💬📥 التعليق اتحدث.", - "id_prompt": "🔑 الـ ID الافتراضي: {{ .ClientId }}\n\nادخل الـ ID بتاعك.", - "pass_prompt": "🔑 الباسورد الافتراضي: {{ .ClientPassword }}\n\nادخل الباسورد بتاعك.", - "email_prompt": "📧 الإيميل الافتراضي: {{ .ClientEmail }}\n\nادخل الإيميل بتاعك.", - "comment_prompt": "💬 التعليق الافتراضي: {{ .ClientComment }}\n\nادخل تعليقك.", - "inbound_client_data_id": "🔄 الدخول: {{ .InboundRemark }}\n\n🔑 المعرف: {{ .ClientId }}\n📧 البريد الإلكتروني: {{ .ClientEmail }}\n📊 الترافيك: {{ .ClientTraffic }}\n📅 تاريخ الانتهاء: {{ .ClientExp }}\n🌐 حدّ IP: {{ .IpLimit }}\n💬 تعليق: {{ .ClientComment }}\n\nدلوقتي تقدر تضيف العميل على الدخول!", - "inbound_client_data_pass": "🔄 الدخول: {{ .InboundRemark }}\n\n🔑 كلمة المرور: {{ .ClientPass }}\n📧 البريد الإلكتروني: {{ .ClientEmail }}\n📊 الترافيك: {{ .ClientTraffic }}\n📅 تاريخ الانتهاء: {{ .ClientExp }}\n🌐 حدّ IP: {{ .IpLimit }}\n💬 تعليق: {{ .ClientComment }}\n\nدلوقتي تقدر تضيف العميل على الدخول!", - "cancel": "❌ العملية اتلغت! \n\nممكن تبدأ من /start في أي وقت. 🔄", - "error_add_client": "⚠️ حصل خطأ:\n\n {{ .error }}", - "using_default_value": "تمام، هشيل على القيمة الافتراضية. 😊", - "incorrect_input": "المدخلات مش صحيحة.\nالكلمات لازم تكون متصلة من غير فراغات.\nمثال صحيح: aaaaaa\nمثال غلط: aaa aaa 🚫", - "AreYouSure": "إنت متأكد؟ 🤔", - "SuccessResetTraffic": "📧 البريد الإلكتروني: {{ .ClientEmail }}\n🏁 النتيجة: ✅ تم بنجاح", - "FailedResetTraffic": "📧 البريد الإلكتروني: {{ .ClientEmail }}\n🏁 النتيجة: ❌ فشل \n\n🛠️ الخطأ: [ {{ .ErrorMessage }} ]", - "FinishProcess": "🔚 عملية إعادة ضبط الترافيك خلصت لكل العملاء." - }, - "buttons": { - "closeKeyboard": "❌ اقفل الكيبورد", - "cancel": "❌ إلغاء", - "cancelReset": "❌ إلغاء إعادة الضبط", - "cancelIpLimit": "❌ إلغاء حد الـ IP", - "confirmResetTraffic": "✅ تأكيد إعادة ضبط الترافيك؟", - "confirmClearIps": "✅ تأكيد مسح الـ IPs؟", - "confirmRemoveTGUser": "✅ تأكيد حذف مستخدم Telegram؟", - "confirmToggle": "✅ تأكيد تفعيل/تعطيل المستخدم؟", - "dbBackup": "احصل على نسخة DB", - "serverUsage": "استخدام السيرفر", - "getInbounds": "احصل على الإدخالات", - "depleteSoon": "هينتهي قريب", - "clientUsage": "استخدام العميل", - "onlines": "العملاء الأونلاين", - "commands": "الأوامر", - "refresh": "🔄 تجديد", - "clearIPs": "❌ مسح الـ IPs", - "removeTGUser": "❌ حذف مستخدم Telegram", - "selectTGUser": "👤 اختار مستخدم Telegram", - "selectOneTGUser": "👤 اختار مستخدم Telegram:", - "resetTraffic": "📈 إعادة ضبط الترافيك", - "resetExpire": "📅 تغيير تاريخ الانتهاء", - "ipLog": "🔢 سجل الـ IP", - "ipLimit": "🔢 حد الـ IP", - "setTGUser": "👤 ضبط مستخدم Telegram", - "toggle": "🔘 تفعيل / تعطيل", - "custom": "🔢 مخصص", - "confirmNumber": "✅ تأكيد: {{ .Num }}", - "confirmNumberAdd": "✅ تأكيد إضافة: {{ .Num }}", - "limitTraffic": "🚧 حد الترافيك", - "getBanLogs": "احصل على سجلات الحظر", - "allClients": "كل العملاء", - "addClient": "إضافة عميل", - "submitDisable": "إرسال كمعطّل ☑️", - "submitEnable": "إرسال كمفعّل ✅", - "use_default": "🏷️ استخدام الإعدادات الافتراضية", - "change_id": "⚙️🔑 المعرّف", - "change_password": "⚙️🔑 كلمة السر", - "change_email": "⚙️📧 البريد الإلكتروني", - "change_comment": "⚙️💬 تعليق", - "ResetAllTraffics": "إعادة ضبط جميع الترافيك", - "SortedTrafficUsageReport": "تقرير استخدام الترافيك المرتب" - }, "answers": { - "successfulOperation": "✅ العملية نجحت!", - "errorOperation": "❗ حصل خطأ في العملية.", - "getInboundsFailed": "❌ فشل الحصول على الإدخالات.", - "getClientsFailed": "❌ فشل الحصول على العملاء.", - "canceled": "❌ {{ .Email }}: العملية اتلغت.", - "clientRefreshSuccess": "✅ {{ .Email }}: العميل اتحدث بنجاح.", "IpRefreshSuccess": "✅ {{ .Email }}: الـ IPs اتحدثت بنجاح.", "TGIdRefreshSuccess": "✅ {{ .Email }}: مستخدم Telegram اتحدث بنجاح.", - "resetTrafficSuccess": "✅ {{ .Email }}: الترافيك اتظبط بنجاح.", - "setTrafficLimitSuccess": "✅ {{ .Email }}: حد الترافيك اتسجل بنجاح.", - "expireResetSuccess": "✅ {{ .Email }}: أيام الانتهاء اتظبطت بنجاح.", - "resetIpSuccess": "✅ {{ .Email }}: حد الـ IP ({{ .Count }}) اتسجل بنجاح.", + "askToAddUserId": "مافيش إعدادات ليك!\r\nاطلب من الأدمن يضيف الـ Telegram ChatID الخاص بيك في إعداداتك.\r\n\r\nالـ ChatID بتاعك: \u003ccode\u003e{{ .TgUserID }}\u003c/code\u003e", + "canceled": "❌ {{ .Email }}: العملية اتلغت.", + "chooseClient": "اختار عميل للإدخال {{ .Inbound }}", + "chooseInbound": "اختار الإدخال", "clearIpSuccess": "✅ {{ .Email }}: الـ IPs اتمسحت بنجاح.", + "clientRefreshSuccess": "✅ {{ .Email }}: العميل اتحدث بنجاح.", + "disableSuccess": "✅ {{ .Email }}: اتعطل بنجاح.", + "enableSuccess": "✅ {{ .Email }}: اتفعل بنجاح.", + "errorOperation": "❗ حصل خطأ في العملية.", + "expireResetSuccess": "✅ {{ .Email }}: أيام الانتهاء اتظبطت بنجاح.", + "getClientsFailed": "❌ فشل الحصول على العملاء.", + "getInboundsFailed": "❌ فشل الحصول على الإدخالات.", "getIpLog": "✅ {{ .Email }}: سجل الـ IP اتجاب.", "getUserInfo": "✅ {{ .Email }}: بيانات مستخدم Telegram اتجاب.", "removedTGUserSuccess": "✅ {{ .Email }}: مستخدم Telegram اتحذف بنجاح.", - "enableSuccess": "✅ {{ .Email }}: اتفعل بنجاح.", - "disableSuccess": "✅ {{ .Email }}: اتعطل بنجاح.", - "askToAddUserId": "مافيش إعدادات ليك!\r\nاطلب من الأدمن يضيف الـ Telegram ChatID الخاص بيك في إعداداتك.\r\n\r\nالـ ChatID بتاعك: {{ .TgUserID }}", - "chooseClient": "اختار عميل للإدخال {{ .Inbound }}", - "chooseInbound": "اختار الإدخال" - } - } -} + "resetIpSuccess": "✅ {{ .Email }}: حد الـ IP ({{ .Count }}) اتسجل بنجاح.", + "resetTrafficSuccess": "✅ {{ .Email }}: الترافيك اتظبط بنجاح.", + "setTrafficLimitSuccess": "✅ {{ .Email }}: حد الترافيك اتسجل بنجاح.", + "successfulOperation": "✅ العملية نجحت!" + }, + "buttons": { + "ResetAllTraffics": "إعادة ضبط جميع الترافيك", + "SortedTrafficUsageReport": "تقرير استخدام الترافيك المرتب", + "addClient": "إضافة عميل", + "allClients": "كل العملاء", + "cancel": "❌ إلغاء", + "cancelIpLimit": "❌ إلغاء حد الـ IP", + "cancelReset": "❌ إلغاء إعادة الضبط", + "change_comment": "⚙️💬 تعليق", + "change_email": "⚙️📧 البريد الإلكتروني", + "change_flow": "🌊 Flow", + "change_id": "⚙️🔑 المعرّف", + "change_password": "⚙️🔑 كلمة السر", + "change_subid": "📝 Sub ID", + "clearIPs": "❌ مسح الـ IPs", + "clientUsage": "استخدام العميل", + "closeKeyboard": "❌ اقفل الكيبورد", + "commands": "الأوامر", + "confirmClearIps": "✅ تأكيد مسح الـ IPs؟", + "confirmNumber": "✅ تأكيد: {{ .Num }}", + "confirmNumberAdd": "✅ تأكيد إضافة: {{ .Num }}", + "confirmRemoveTGUser": "✅ تأكيد حذف مستخدم Telegram؟", + "confirmResetTraffic": "✅ تأكيد إعادة ضبط الترافيك؟", + "confirmToggle": "✅ تأكيد تفعيل/تعطيل المستخدم؟", + "custom": "🔢 مخصص", + "dbBackup": "احصل على نسخة DB", + "depleteSoon": "هينتهي قريب", + "flow_none": "None", + "getBanLogs": "احصل على سجلات الحظر", + "getInbounds": "احصل على الإدخالات", + "ipLimit": "🔢 حد الـ IP", + "ipLog": "🔢 سجل الـ IP", + "limitTraffic": "🚧 حد الترافيك", + "onlines": "العملاء الأونلاين", + "refresh": "🔄 تجديد", + "removeTGUser": "❌ حذف مستخدم Telegram", + "resetExpire": "📅 تغيير تاريخ الانتهاء", + "resetTraffic": "📈 إعادة ضبط الترافيك", + "selectOneTGUser": "👤 اختار مستخدم Telegram:", + "selectTGUser": "👤 اختار مستخدم Telegram", + "serverUsage": "استخدام السيرفر", + "setTGUser": "👤 ضبط مستخدم Telegram", + "submitDisable": "إرسال كمعطّل ☑️", + "submitEnable": "إرسال كمفعّل ✅", + "toggle": "🔘 تفعيل / تعطيل", + "use_default": "🏷️ استخدام الإعدادات الافتراضية" + }, + "clients": "العملاء", + "commands": { + "getID": "🆔 الـ ID بتاعك: \u003ccode\u003e{{ .ID }}\u003c/code\u003e", + "help": "🤖 أهلا بيك في البوت! البوت ده معمول عشان يديك بيانات معينة من البانل ويسمحلك بالتعديلات.", + "helpAdminCommands": "عشان تعيد تشغيل Xray Core:\r\n\u003ccode\u003e/restart\u003c/code\u003e\r\n\r\nعشان تدور على إيميل عميل:\r\n\u003ccode\u003e/usage [Email]\u003c/code\u003e\r\n\r\nعشان تدور على إدخالات (مع إحصائيات العملاء):\r\n\u003ccode\u003e/inbound [Remark]\u003c/code\u003e\r\n\r\nID شات Telegram:\r\n\u003ccode\u003e/id\u003c/code\u003e", + "helpClientCommands": "عشان تدور على الإحصائيات، استخدم الأمر ده:\r\n\r\n\u003ccode\u003e/usage [Email]\u003c/code\u003e\r\n\r\nID شات Telegram:\r\n\u003ccode\u003e/id\u003c/code\u003e", + "helpDesc": "مساعدة البوت", + "idDesc": "عرض معرف Telegram الخاص بك", + "pleaseChoose": "👇 من فضلك اختار:\r\n", + "restartFailed": "❗ حصل خطأ في العملية.\r\n\r\n\u003ccode\u003eError: {{ .Error }}\u003c/code\u003e.", + "restartSuccess": "✅ العملية نجحت!", + "restartUsage": "\r\n\r\n\u003ccode\u003e/restart\u003c/code\u003e", + "start": "👋 أهلا \u003ci\u003e{{ .Firstname }}\u003c/i\u003e.\r\n", + "startDesc": "عرض القائمة الرئيسية", + "status": "✅ البوت شغال!", + "statusDesc": "التحقق من حالة البوت", + "unknown": "❗ أمر مش معروف.", + "usage": "❗ من فضلك ادخل نص للتبحث عنه!", + "welcome": "🤖 أهلا بيك في بوت إدارة \u003cb\u003e{{ .Hostname }}\u003c/b\u003e.\r\n", + "xrayNotRunning": "❗ Xray Core مش شغال." + }, + "day": "يوم", + "days": "أيام", + "hours": "ساعات", + "inbounds": "الواردات", + "keyboardClosed": "❌ لوحة المفاتيح مغلقة!", + "messages": { + "2faFailed": "فشل 2FA", + "AreYouSure": "إنت متأكد؟ 🤔", + "FailedResetTraffic": "📧 البريد الإلكتروني: {{ .ClientEmail }}\n🏁 النتيجة: ❌ فشل \n\n🛠️ الخطأ: [ {{ .ErrorMessage }} ]", + "FinishProcess": "🔚 عملية إعادة ضبط الترافيك خلصت لكل العملاء.", + "SuccessResetTraffic": "📧 البريد الإلكتروني: {{ .ClientEmail }}\n🏁 النتيجة: ✅ تم بنجاح", + "TGUser": "👤 مستخدم Telegram: {{ .TelegramID }}\r\n", + "active": "💡 مفعل: {{ .Enable }}\r\n", + "backupTime": "🗄 وقت النسخة الاحتياطية: {{ .Time }}\r\n", + "cancel": "❌ العملية اتلغت! \n\nممكن تبدأ من /start في أي وقت. 🔄", + "client_flow": "Flow:", + "client_subid": "Sub ID:", + "comment_prompt": "💬 التعليق الافتراضي: {{ .ClientComment }}\n\nادخل تعليقك.", + "cpuThreshold": "🔴 حمل المعالج {{ .Percent }}% عدى الحد المسموح ({{ .Threshold }}%)", + "datetime": "⏰ التاريخ والوقت: {{ .DateTime }}\r\n", + "depleteSoon": "🔜 هينتهي قريب: {{ .Deplete }}\r\n\r\n", + "disabled": "🛑 معطل: {{ .Disabled }}\r\n", + "download": "🔽 تنزيل: ↓{{ .Download }}\r\n", + "email": "📧 الإيميل: {{ .Email }}\r\n", + "email_prompt": "📧 الإيميل الافتراضي: {{ .ClientEmail }}\n\nادخل الإيميل بتاعك.", + "enabled": "🚨 مفعل: {{ .Enable }}\r\n", + "error_add_client": "⚠️ حصل خطأ:\n\n {{ .error }}", + "exhaustedCount": "🚨 عدد النفاذ لـ {{ .Type }}:\r\n", + "exhaustedMsg": "🚨 نفذ {{ .Type }}:\r\n", + "expire": "📅 تاريخ الانتهاء: {{ .Time }}\r\n", + "expireIn": "📅 هيخلص بعد: {{ .Time }}\r\n", + "hostname": "💻 السيرفر: {{ .Hostname }}\r\n", + "id_prompt": "🔑 الـ ID الافتراضي: {{ .ClientId }}\n\nادخل الـ ID بتاعك.", + "inbound": "📍 الإدخال: {{ .Remark }}\r\n", + "inbound_client_data_id": "🔄 الدخول: {{ .InboundRemark }}\n\n🔑 المعرف: {{ .ClientId }}\n📧 البريد الإلكتروني: {{ .ClientEmail }}\n📊 الترافيك: {{ .ClientTraffic }}\n📅 تاريخ الانتهاء: {{ .ClientExp }}\n🌐 حدّ IP: {{ .IpLimit }}\n💬 تعليق: {{ .ClientComment }}\n\nدلوقتي تقدر تضيف العميل على الدخول!", + "inbound_client_data_pass": "🔄 الدخول: {{ .InboundRemark }}\n\n🔑 كلمة المرور: {{ .ClientPass }}\n📧 البريد الإلكتروني: {{ .ClientEmail }}\n📊 الترافيك: {{ .ClientTraffic }}\n📅 تاريخ الانتهاء: {{ .ClientExp }}\n🌐 حدّ IP: {{ .IpLimit }}\n💬 تعليق: {{ .ClientComment }}\n\nدلوقتي تقدر تضيف العميل على الدخول!", + "incorrect_input": "المدخلات مش صحيحة.\nالكلمات لازم تكون متصلة من غير فراغات.\nمثال صحيح: aaaaaa\nمثال غلط: aaa aaa 🚫", + "invalid_subid": "Invalid format.\nSub ID can only contain letters, numbers, hyphens (-), and underscores (_).\nSpaces and special characters are not allowed. 🚫", + "ip": "🌐 IP: {{ .IP }}\r\n", + "ips": "🔢 عناوين IP:\r\n{{ .IPs }}\r\n", + "ipv4": "🌐 IPv4: {{ .IPv4 }}\r\n", + "ipv6": "🌐 IPv6: {{ .IPv6 }}\r\n", + "lastOnline": "🔙 آخر متصل: {{ .Time }}\r\n", + "loginFailed": "❗️فشل محاولة تسجيل الدخول للبانل.\r\n", + "loginSuccess": "✅ تسجيل الدخول للبانل تم بنجاح.\r\n", + "no": "❌ لأ", + "online": "🌐 حالة الاتصال: {{ .Status }}\r\n", + "onlinesCount": "🌐 العملاء الأونلاين: {{ .Count }}\r\n", + "pass_prompt": "🔑 الباسورد الافتراضي: {{ .ClientPassword }}\n\nادخل الباسورد بتاعك.", + "port": "🔌 البورت: {{ .Port }}\r\n", + "reason": "❗️ السبب: {{ .Reason }}\r\n", + "received_comment": "💬📥 التعليق اتحدث.", + "received_email": "📧📥 الإيميل اتحدث.", + "received_id": "🔑📥 الـ ID اتحدث.", + "received_password": "🔑📥 الباسورد اتحدث.", + "received_subid": "Sub ID updated successfully!", + "refreshedOn": "\r\n📋🔄 اتحدّث في: {{ .Time }}\r\n\r\n", + "report": "🕰 التقارير المجدولة: {{ .RunTime }}\r\n", + "selectUserFailed": "❌ حصل خطأ في اختيار المستخدم!", + "serverLoad": "📈 تحميل النظام: {{ .Load1 }}, {{ .Load2 }}, {{ .Load3 }}\r\n", + "serverMemory": "📋 الرام: {{ .Current }}/{{ .Total }}\r\n", + "serverUpTime": "⏳ وقت التشغيل: {{ .UpTime }} {{ .Unit }}\r\n", + "subid_prompt": "Please enter new Sub ID:\nCurrent: {{.ClientSubId}}", + "tcpCount": "🔹 TCP: {{ .Count }}\r\n", + "time": "⏰ الوقت: {{ .Time }}\r\n", + "total": "📊 الإجمالي: ↑↓{{ .UpDown }} / {{ .Total }}\r\n", + "traffic": "🚦 الترافيك: {{ .Total }} (↑{{ .Upload }},↓{{ .Download }})\r\n", + "udpCount": "🔸 UDP: {{ .Count }}\r\n", + "upload": "🔼 رفع: ↑{{ .Upload }}\r\n", + "userSaved": "✅ حفظت بيانات مستخدم Telegram.", + "username": "👤 اسم المستخدم: {{ .Username }}\r\n", + "using_default_value": "تمام، هشيل على القيمة الافتراضية. 😊", + "version": "🚀 نسخة 3X-UI: {{ .Version }}\r\n", + "xrayStatus": "ℹ️ الحالة: {{ .State }}\r\n", + "xrayVersion": "📡 نسخة Xray: {{ .XrayVersion }}\r\n", + "yes": "✅ أيوه" + }, + "minutes": "دقائق", + "month": "شهر", + "months": "أشهر", + "noInbounds": "❗ لم يتم العثور على أي وارد!", + "noIpRecord": "❗ لا يوجد سجل IP!", + "noQuery": "❌ لم يتم العثور على الاستعلام! يرجى استخدام الأمر مرة أخرى!", + "noResult": "❗ لا يوجد نتائج!", + "offline": "🔴 غير متصل", + "online": "🟢 متصل", + "unknown": "غير معروف", + "unlimited": "♾ غير محدود (إعادة تعيين)", + "wentWrong": "❌ حدث خطأ ما!" + }, + "transmission": "نقل", + "twoFactorCode": "الكود", + "unlimited": "غير محدود", + "update": "تحديث", + "usage": "استخدام", + "useIPv4ForHost": "استخدم IPv4 للمضيف", + "username": "اسم المستخدم" +} \ No newline at end of file diff --git a/web/translation/en-US.json b/web/translation/en-US.json index 3479537e..35587bbf 100644 --- a/web/translation/en-US.json +++ b/web/translation/en-US.json @@ -873,6 +873,11 @@ "exhaustedMsg": "🚨 Exhausted {{ .Type }}:\r\n", "exhaustedCount": "🚨 Exhausted {{ .Type }} count:\r\n", "onlinesCount": "🌐 Online Clients: {{ .Count }}\r\n", + "cpu": "CPU: {{ .Usage }}%\r\n", + "mem": "RAM: {{ .Usage }}/{{ .Total }}\r\n", + "swap": "Swap: {{ .Usage }}/{{ .Total }}\r\n", + "disk": "Disk: {{ .Usage }}/{{ .Total }}\r\n", + "uptime": "Uptime: {{ .Time }}\r\n", "disabled": "🛑 Disabled: {{ .Disabled }}\r\n", "depleteSoon": "🔜 Deplete Soon: {{ .Deplete }}\r\n\r\n", "backupTime": "🗄 Backup Time: {{ .Time }}\r\n", @@ -947,6 +952,8 @@ "change_subid": "📝 Sub ID", "change_flow": "🌊 Flow", "flow_none": "None", + "qrCode": "QR Code", + "selectTGUser": "Select Telegram User", "ResetAllTraffics": "Reset All Traffics", "SortedTrafficUsageReport": "Sorted Traffic Usage Report" }, diff --git a/web/translation/es-ES.json b/web/translation/es-ES.json index 2e610b2b..2cdad6cb 100644 --- a/web/translation/es-ES.json +++ b/web/translation/es-ES.json @@ -1,750 +1,604 @@ { - "username": "Nombre de Usuario", - "password": "Contraseña", - "login": "Acceder", - "confirm": "Confirmar", - "cancel": "Cancelar", - "close": "Cerrar", - "save": "Guardar", - "logout": "Cerrar Sesión", - "create": "Crear", - "update": "Actualizar", - "copy": "Copiar", - "copied": "Copiado", - "download": "Descargar", - "remark": "Notas", - "enable": "Habilitar", - "protocol": "Protocolo", - "search": "Buscar", - "filter": "Filtrar", - "loading": "Cargando...", - "second": "Segundo", - "minute": "Minuto", - "hour": "Hora", - "day": "Día", - "check": "Verificar", - "indefinite": "Indefinido", - "unlimited": "Ilimitado", - "none": "None", - "qrCode": "Código QR", - "info": "Más Información", - "edit": "Editar", - "delete": "Eliminar", - "reset": "Restablecer", - "noData": "Sin datos", - "copySuccess": "Copiado exitosamente", - "sure": "Seguro", - "encryption": "Encriptación", - "useIPv4ForHost": "Usar IPv4 para el host", - "transmission": "Transmisión", - "host": "Host", - "path": "Path", "camouflage": "Camuflaje", - "status": "Estado", - "enabled": "Habilitado", - "disabled": "Deshabilitado", + "cancel": "Cancelar", + "certificate": "Certificado Digital", + "check": "Verificar", + "clients": "Clientes", + "close": "Cerrar", + "comment": "Comentario", + "confirm": "Confirmar", + "copied": "Copiado", + "copy": "Copiar", + "copySuccess": "Copiado exitosamente", + "create": "Crear", + "day": "Día", + "delete": "Eliminar", "depleted": "Agotado", "depletingSoon": "Agotándose", - "offline": "fuera de línea", - "online": "en línea", + "disabled": "Deshabilitado", "domainName": "Nombre de dominio", - "monitor": "Listening IP", - "certificate": "Certificado Digital", - "fail": "Falló", - "comment": "Comentario", - "success": "Éxito", - "lastOnline": "Última conexión", - "getVersion": "Obtener versión", - "install": "Instalar", - "clients": "Clientes", - "usage": "Uso", - "twoFactorCode": "Código", - "remained": "Restante", - "security": "Seguridad", - "secAlertTitle": "Alerta de Seguridad", - "secAlertSsl": "Esta conexión no es segura. Por favor, evite ingresar información sensible hasta que se active TLS para la protección de datos.", - "secAlertConf": "Ciertas configuraciones son vulnerables a ataques. Se recomienda reforzar los protocolos de seguridad para prevenir posibles violaciones.", - "secAlertSSL": "El panel carece de una conexión segura. Por favor, instale un certificado TLS para la protección de datos.", - "secAlertPanelPort": "El puerto predeterminado del panel es vulnerable. Por favor, configure un puerto aleatorio o específico.", - "secAlertPanelURI": "La ruta URI predeterminada del panel no es segura. Por favor, configure una ruta URI compleja.", - "secAlertSubURI": "La ruta URI predeterminada de la suscripción no es segura. Por favor, configure una ruta URI compleja.", - "secAlertSubJsonURI": "La ruta URI JSON predeterminada de la suscripción no es segura. Por favor, configure una ruta URI compleja.", + "download": "Descargar", + "edit": "Editar", + "emptyBalancersDesc": "No hay balanceadores añadidos.", "emptyDnsDesc": "No hay servidores DNS añadidos.", "emptyFakeDnsDesc": "No hay servidores Fake DNS añadidos.", - "emptyBalancersDesc": "No hay balanceadores añadidos.", "emptyReverseDesc": "No hay proxies inversos añadidos.", - "somethingWentWrong": "Algo salió mal", - "subscription": { - "title": "Información de suscripción", - "subId": "ID de suscripción", - "status": "Estado", - "downloaded": "Descargado", - "uploaded": "Subido", - "expiry": "Caducidad", - "totalQuota": "Cuota total", - "individualLinks": "Enlaces individuales", - "active": "Activo", - "inactive": "Inactivo", - "unlimited": "Ilimitado", - "noExpiry": "Sin caducidad" - }, + "enable": "Habilitar", + "enabled": "Habilitado", + "encryption": "Encriptación", + "fail": "Falló", + "filter": "Filtrar", + "getVersion": "Obtener versión", + "host": "Host", + "hour": "Hora", + "indefinite": "Indefinido", + "info": "Más Información", + "install": "Instalar", + "lastOnline": "Última conexión", + "loading": "Cargando...", + "login": "Acceder", + "logout": "Cerrar Sesión", "menu": { - "theme": "Tema", + "apiDocs": "Documentación de la API", "dark": "Oscuro", - "ultraDark": "Ultra Oscuro", "dashboard": "Estado del Sistema", "inbounds": "Entradas", + "link": "Gestionar", + "logout": "Cerrar Sesión", "nodes": "Nodos", "settings": "Configuraciones", - "xray": "Ajustes Xray", - "apiDocs": "Documentación de la API", - "logout": "Cerrar Sesión", - "link": "Gestionar" + "theme": "Tema", + "ultraDark": "Ultra Oscuro", + "xray": "Ajustes Xray" }, + "minute": "Minuto", + "monitor": "Listening IP", + "noData": "Sin datos", + "none": "None", + "offline": "fuera de línea", + "online": "en línea", "pages": { - "login": { - "hello": "Hola", - "title": "Bienvenido", - "loginAgain": "El límite de tiempo de inicio de sesión ha expirado. Por favor, inicia sesión nuevamente.", - "toasts": { - "invalidFormData": "El formato de los datos de entrada es inválido.", - "emptyUsername": "Por favor ingresa el nombre de usuario.", - "emptyPassword": "Por favor ingresa la contraseña.", - "wrongUsernameOrPassword": "Nombre de usuario, contraseña o código de dos factores incorrecto.", - "successLogin": "Has iniciado sesión en tu cuenta correctamente." - } - }, - "index": { - "title": "Estado del Sistema", - "cpu": "CPU", - "logicalProcessors": "Procesadores lógicos", - "frequency": "Frecuencia", - "swap": "Memoria Virtual", - "storage": "Almacenamiento", - "memory": "RAM", - "threads": "Hilos", - "xrayStatus": "Xray", - "stopXray": "Detener", - "restartXray": "Reiniciar", - "xraySwitch": "Versión", - "xraySwitchClick": "Elige la versión a la que deseas cambiar.", - "xraySwitchClickDesk": "Elige sabiamente, ya que las versiones anteriores pueden no ser compatibles con las configuraciones actuales.", - "xrayUpdates": "Actualizaciones de Xray", - "updatePanel": "Actualizar panel", - "panelUpdateDesc": "Esto actualizará 3X-UI a la última versión y reiniciará el servicio del panel.", - "currentPanelVersion": "Versión actual del panel", - "latestPanelVersion": "Última versión del panel", - "panelUpToDate": "El panel está actualizado", - "upToDate": "Actualizado", - "xrayStatusUnknown": "Desconocido", - "xrayStatusRunning": "En ejecución", - "xrayStatusStop": "Detenido", - "xrayStatusError": "Error", - "xrayErrorPopoverTitle": "Se produjo un error al ejecutar Xray", - "operationHours": "Tiempo de Funcionamiento", - "systemHistoryTitle": "Historial del Sistema", - "charts": "Gráficos", - "xrayMetricsTitle": "Métricas de Xray", - "xrayMetricsDisabled": "Endpoint de métricas de Xray no configurado", - "xrayMetricsHint": "Añade un bloque metrics de nivel superior a la configuración de xray con tag metrics_out y listen 127.0.0.1:11111, luego reinicia xray.", - "xrayObservatoryEmpty": "Aún no hay datos de Observatory", - "xrayObservatoryHint": "Añade un bloque observatory a la configuración de xray listando los tags de outbound a sondear, luego reinicia xray.", - "xrayObservatoryTagPlaceholder": "Seleccionar outbound", - "xrayObservatoryAlive": "Activo", - "xrayObservatoryDead": "Caído", - "xrayObservatoryLastSeen": "Visto por última vez", - "xrayObservatoryLastTry": "Último intento", - "trendLast2Min": "Últimos 2 minutos", - "systemLoad": "Carga del Sistema", - "systemLoadDesc": "promedio de carga del sistema en los últimos 1, 5 y 15 minutos", - "connectionCount": "Número de Conexiones", - "ipAddresses": "Direcciones IP", - "toggleIpVisibility": "Alternar visibilidad de la IP", - "overallSpeed": "Velocidad general", - "upload": "Subida", - "download": "Descarga", - "totalData": "Datos totales", - "sent": "Enviado", - "received": "Recibido", - "documentation": "Documentación", - "xraySwitchVersionDialog": "¿Realmente deseas cambiar la versión de Xray?", - "xraySwitchVersionDialogDesc": "Esto cambiará la versión de Xray a #version#.", - "xraySwitchVersionPopover": "Xray se actualizó correctamente", - "panelUpdateDialog": "¿Deseas actualizar el panel?", - "panelUpdateDialogDesc": "Esto actualizará 3X-UI a la versión #version# y reiniciará el servicio del panel.", - "panelUpdateCheckPopover": "Fallo al comprobar actualización del panel", - "panelUpdateStartedPopover": "Actualización del panel iniciada", - "geofileUpdateDialog": "¿Realmente deseas actualizar el geofichero?", - "geofileUpdateDialogDesc": "Esto actualizará el archivo #filename#.", - "geofilesUpdateDialogDesc": "Esto actualizará todos los archivos.", - "geofilesUpdateAll": "Actualizar todo", - "geofileUpdatePopover": "Geofichero actualizado correctamente", - "dontRefresh": "La instalación está en progreso, por favor no actualices esta página.", - "logs": "Registros", - "config": "Configuración", - "backup": "Сopia de Seguridad", - "backupTitle": "Copia & Restauración", - "exportDatabase": "Copia de seguridad", - "exportDatabaseDesc": "Haz clic para descargar un archivo .db que contiene una copia de seguridad de tu base de datos actual en tu dispositivo.", - "importDatabase": "Restaurar", - "importDatabaseDesc": "Haz clic para seleccionar y cargar un archivo .db desde tu dispositivo para restaurar tu base de datos desde una copia de seguridad.", - "importDatabaseSuccess": "La base de datos se ha importado correctamente", - "importDatabaseError": "Ocurrió un error al importar la base de datos", - "readDatabaseError": "Ocurrió un error al leer la base de datos", - "getDatabaseError": "Ocurrió un error al obtener la base de datos", - "getConfigError": "Ocurrió un error al obtener el archivo de configuración", - "customGeoTitle": "GeoSite / GeoIP personalizados", - "customGeoAdd": "Añadir", - "customGeoType": "Tipo", - "customGeoAlias": "Alias", - "customGeoUrl": "URL", - "customGeoEnabled": "Activado", - "customGeoLastUpdated": "Última actualización", - "customGeoExtColumn": "Enrutamiento (ext:…)", - "customGeoToastUpdateAll": "Todas las fuentes personalizadas se actualizaron", - "customGeoActions": "Acciones", - "customGeoEdit": "Editar", - "customGeoDelete": "Eliminar", - "customGeoDownload": "Actualizar ahora", - "customGeoModalAdd": "Añadir geo personalizado", - "customGeoModalEdit": "Editar geo personalizado", - "customGeoModalSave": "Guardar", - "customGeoDeleteConfirm": "¿Eliminar esta fuente geo personalizada?", - "customGeoRoutingHint": "En reglas de enrutamiento use la columna de valor como ext:archivo.dat:etiqueta (sustituya la etiqueta).", - "customGeoInvalidId": "Id de recurso no válido", - "customGeoAliasesError": "No se pudieron cargar los alias geo personalizados", - "customGeoValidationAlias": "El alias solo puede contener letras minúsculas, dígitos, - y _", - "customGeoValidationUrl": "La URL debe comenzar con http:// o https://", - "customGeoAliasPlaceholder": "a-z 0-9 _ -", - "customGeoAliasLabelSuffix": " (personalizado)", - "customGeoToastList": "Lista de geo personalizado", - "customGeoToastAdd": "Añadir geo personalizado", - "customGeoToastUpdate": "Actualizar geo personalizado", - "customGeoToastDelete": "Geofile personalizado «{{ .fileName }}» eliminado", - "customGeoToastDownload": "Geofile «{{ .fileName }}» actualizado", - "customGeoErrInvalidType": "El tipo debe ser geosite o geoip", - "customGeoErrAliasRequired": "El alias es obligatorio", - "customGeoErrAliasPattern": "El alias contiene caracteres no permitidos", - "customGeoErrAliasReserved": "Este alias está reservado", - "customGeoErrUrlRequired": "La URL es obligatoria", - "customGeoErrInvalidUrl": "La URL no es válida", - "customGeoErrUrlScheme": "La URL debe usar http o https", - "customGeoErrUrlHost": "El host de la URL no es válido", - "customGeoErrDuplicateAlias": "Este alias ya se usa para este tipo", - "customGeoErrNotFound": "Fuente geo personalizada no encontrada", - "customGeoErrDownload": "Error de descarga", - "customGeoErrUpdateAllIncomplete": "No se pudieron actualizar una o más fuentes geo personalizadas", - "customGeoEmpty": "Aún no hay fuentes geo personalizadas — haz clic en Añadir para crear una" + "client": { + "add": "Agregar Cliente", + "bulk": "Agregar en Lote", + "clearAll": "Limpiar todo", + "clientCount": "Número de Clientes", + "copyEmailPreview": "Vista previa del email resultante", + "copyFlowHint": "Se aplica a todos los clientes copiados. Déjelo vacío para omitir.", + "copyFlowLabel": "Flow para nuevos clientes (VLESS)", + "copyFromInbound": "Copiar clientes desde entrada", + "copyResult": "Resultado de la copia", + "copyResultErrors": "Errores al copiar", + "copyResultNone": "Nada que copiar: ningún cliente seleccionado o el origen está vacío", + "copyResultSuccess": "Copiado correctamente", + "copySelectSourceFirst": "Seleccione primero una entrada de origen.", + "copySelected": "Copiar seleccionados", + "copySource": "Origen", + "copyToInbound": "Copiar clientes a", + "days": "Día(s)", + "delayedStart": "Iniciar después del primer uso", + "edit": "Editar Cliente", + "expireDays": "Duración", + "first": "Primero", + "last": "Último", + "method": "Método", + "postfix": "Sufijo", + "prefix": "Prefijo", + "renew": "Renovación automática", + "renewDesc": "Renovación automática después de la expiración. (0 = desactivar) (unidad: día)", + "selectAll": "Seleccionar todo", + "submitAdd": "Agregar Cliente", + "submitEdit": "Guardar Cambios" }, "inbounds": { - "allTimeTraffic": "Tráfico Total", - "allTimeTrafficUsage": "Uso de datos histórico", - "title": "Entradas", - "totalDownUp": "Subidas/Descargas Totales", - "totalUsage": "Uso Total", - "inboundCount": "Número de Entradas", - "operate": "Menú", - "enable": "Habilitar", - "remark": "Notas", - "node": "Nodo", - "deployTo": "Desplegar en", - "localPanel": "Panel local", - "protocol": "Protocolo", - "port": "Puerto", - "portMap": "Puertos de Destino", - "traffic": "Tráfico", - "details": "Detalles", - "transportConfig": "Transporte", - "expireDate": "Fecha de Expiración", - "createdAt": "Creado", - "updatedAt": "Actualizado", - "resetTraffic": "Restablecer Tráfico", - "addInbound": "Agregar Entrada", - "generalActions": "Acciones Generales", - "modifyInbound": "Modificar Entrada", - "deleteInbound": "Eliminar Entrada", - "deleteInboundContent": "¿Confirmar eliminación de entrada?", - "deleteClient": "Eliminar cliente", - "deleteClientContent": "¿Está seguro de que desea eliminar el cliente?", - "resetTrafficContent": "¿Confirmar restablecimiento de tráfico?", - "copyLink": "Copiar Enlace", - "address": "Dirección", - "network": "Red", - "destinationPort": "Puerto de Destino", - "targetAddress": "Dirección de Destino", - "monitorDesc": "Dejar en blanco por defecto", - "meansNoLimit": " = illimitata. (unidad: GB)", - "totalFlow": "Flujo Total", - "leaveBlankToNeverExpire": "Dejar en Blanco para Nunca Expirar", - "noRecommendKeepDefault": "No hay requisitos especiales para mantener la configuración predeterminada", - "certificatePath": "Ruta Cert", - "certificateContent": "Datos Cert", - "publicKey": "Clave Pública", - "privatekey": "Clave Privada", - "clickOnQRcode": "Haz clic en el Código QR para Copiar", - "client": "Cliente", - "export": "Exportar Enlaces", - "clone": "Clonar", - "cloneInbound": "Clonar Entradas", - "cloneInboundContent": "Se aplicarán todas las configuraciones de esta entrada, excepto el Puerto, la IP de Escucha y los Clientes, al clon.", - "cloneInboundOk": "Clonar", - "resetAllTraffic": "Restablecer Tráfico de Todas las Entradas", - "resetAllTrafficTitle": "Restablecer tráfico de todas las entradas", - "resetAllTrafficContent": "¿Estás seguro de que deseas restablecer el tráfico de todas las entradas?", - "resetInboundClientTraffics": "Restablecer Tráfico de Clientes", - "resetInboundClientTrafficTitle": "Restablecer todo el tráfico de clientes", - "resetInboundClientTrafficContent": "¿Estás seguro de que deseas restablecer todo el tráfico para los clientes de esta entrada?", - "resetAllClientTraffics": "Restablecer Tráfico de Todos los Clientes", - "resetAllClientTrafficTitle": "Restablecer todo el tráfico de clientes", - "resetAllClientTrafficContent": "¿Estás seguro de que deseas restablecer todo el tráfico para todos los clientes?", - "delDepletedClients": "Eliminar Clientes Agotados", - "delDepletedClientsTitle": "Eliminar clientes agotados", - "delDepletedClientsContent": "¿Estás seguro de que deseas eliminar todos los clientes agotados?", - "email": "Email", - "emailDesc": "Por favor proporciona una dirección de correo electrónico única.", "IPLimit": "Límite de IP", "IPLimitDesc": "Desactiva la entrada si la cantidad supera el valor ingresado (ingresa 0 para desactivar el límite de IP).", "IPLimitlog": "Registro de IP", "IPLimitlogDesc": "Registro de historial de IPs (antes de habilitar la entrada después de que haya sido desactivada por el límite de IP, debes borrar el registro).", "IPLimitlogclear": "Limpiar el Registro", - "setDefaultCert": "Establecer certificado desde el panel", - "telegramDesc": "Por favor, proporciona el ID de Chat de Telegram. (usa el comando '/id' en el bot) o ({'@'}userinfobot)", - "subscriptionDesc": "Puedes encontrar tu enlace de suscripción en Detalles, también puedes usar el mismo nombre para varias configuraciones.", - "info": "Info", - "same": "misma", - "inboundData": "Datos de entrada", + "addInbound": "Agregar Entrada", + "address": "Dirección", + "allTimeTraffic": "Tráfico Total", + "allTimeTrafficUsage": "Uso de datos histórico", + "certificateContent": "Datos Cert", + "certificatePath": "Ruta Cert", + "clickOnQRcode": "Haz clic en el Código QR para Copiar", + "client": "Cliente", + "clone": "Clonar", + "cloneInbound": "Clonar Entradas", + "cloneInboundContent": "Se aplicarán todas las configuraciones de esta entrada, excepto el Puerto, la IP de Escucha y los Clientes, al clon.", + "cloneInboundOk": "Clonar", + "copyLink": "Copiar Enlace", + "createdAt": "Creado", + "delDepletedClients": "Eliminar Clientes Agotados", + "delDepletedClientsContent": "¿Estás seguro de que deseas eliminar todos los clientes agotados?", + "delDepletedClientsTitle": "Eliminar clientes agotados", + "deleteClient": "Eliminar cliente", + "deleteClientContent": "¿Está seguro de que desea eliminar el cliente?", + "deleteInbound": "Eliminar Entrada", + "deleteInboundContent": "¿Confirmar eliminación de entrada?", + "deployTo": "Desplegar en", + "destinationPort": "Puerto de Destino", + "details": "Detalles", + "email": "Email", + "emailDesc": "Por favor proporciona una dirección de correo electrónico única.", + "enable": "Habilitar", + "expireDate": "Fecha de Expiración", + "export": "Exportar Enlaces", "exportInbound": "Exportación entrante", + "generalActions": "Acciones Generales", "import": "Importar", "importInbound": "Importar un entrante", - "periodicTrafficResetTitle": "Reset de Tráfico", - "periodicTrafficResetDesc": "Reiniciar automáticamente el contador de tráfico en intervalos especificados", + "inboundCount": "Número de Entradas", + "inboundData": "Datos de entrada", + "info": "Info", "lastReset": "Último reinicio", + "leaveBlankToNeverExpire": "Dejar en Blanco para Nunca Expirar", + "localPanel": "Panel local", + "meansNoLimit": " = illimitata. (unidad: GB)", + "modifyInbound": "Modificar Entrada", + "monitorDesc": "Dejar en blanco por defecto", + "network": "Red", + "noRecommendKeepDefault": "No hay requisitos especiales para mantener la configuración predeterminada", + "node": "Nodo", + "operate": "Menú", "periodicTrafficReset": { - "never": "Nunca", "daily": "Diariamente", - "weekly": "Semanalmente", + "hourly": "Cada hora", "monthly": "Mensualmente", - "hourly": "Cada hora" + "never": "Nunca", + "weekly": "Semanalmente" }, + "periodicTrafficResetDesc": "Reiniciar automáticamente el contador de tráfico en intervalos especificados", + "periodicTrafficResetTitle": "Reset de Tráfico", + "port": "Puerto", + "portMap": "Puertos de Destino", + "privatekey": "Clave Privada", + "protocol": "Protocolo", + "publicKey": "Clave Pública", + "remark": "Notas", + "resetAllClientTrafficContent": "¿Estás seguro de que deseas restablecer todo el tráfico para todos los clientes?", + "resetAllClientTrafficTitle": "Restablecer todo el tráfico de clientes", + "resetAllClientTraffics": "Restablecer Tráfico de Todos los Clientes", + "resetAllTraffic": "Restablecer Tráfico de Todas las Entradas", + "resetAllTrafficContent": "¿Estás seguro de que deseas restablecer el tráfico de todas las entradas?", + "resetAllTrafficTitle": "Restablecer tráfico de todas las entradas", + "resetInboundClientTrafficContent": "¿Estás seguro de que deseas restablecer todo el tráfico para los clientes de esta entrada?", + "resetInboundClientTrafficTitle": "Restablecer todo el tráfico de clientes", + "resetInboundClientTraffics": "Restablecer Tráfico de Clientes", + "resetTraffic": "Restablecer Tráfico", + "resetTrafficContent": "¿Confirmar restablecimiento de tráfico?", + "same": "misma", + "setDefaultCert": "Establecer certificado desde el panel", + "stream": { + "general": { + "name": "Nombre", + "request": "Pedido", + "response": "Respuesta", + "value": "Valor" + }, + "tcp": { + "method": "Método", + "path": "Camino", + "requestHeader": "Encabezado de solicitud", + "responseHeader": "Encabezado de respuesta", + "status": "Estado", + "statusDescription": "Descripción de la Situación", + "version": "Versión" + } + }, + "subscriptionDesc": "Puedes encontrar tu enlace de suscripción en Detalles, también puedes usar el mismo nombre para varias configuraciones.", + "targetAddress": "Dirección de Destino", + "telegramDesc": "Por favor, proporciona el ID de Chat de Telegram. (usa el comando '/id' en el bot) o ({'@'}userinfobot)", + "title": "Entradas", "toasts": { - "obtain": "Recibir", - "updateSuccess": "La actualización fue exitosa", - "logCleanSuccess": "El registro ha sido limpiado", - "inboundsUpdateSuccess": "Entradas actualizadas correctamente", - "inboundUpdateSuccess": "Entrada actualizada correctamente", - "inboundCreateSuccess": "Entrada creada correctamente", - "inboundDeleteSuccess": "Entrada eliminada correctamente", + "delDepletedClientsSuccess": "Todos los clientes con tráfico agotado fueron eliminados", + "getNewVlessEncError": "Error al obtener el certificado VlessEnc.", + "getNewX25519CertError": "Error al obtener el certificado X25519.", + "getNewmldsa65Error": "Error al obtener el certificado mldsa65.", "inboundClientAddSuccess": "Cliente(s) de entrada añadido(s)", "inboundClientDeleteSuccess": "Cliente de entrada eliminado", "inboundClientUpdateSuccess": "Cliente de entrada actualizado", - "delDepletedClientsSuccess": "Todos los clientes con tráfico agotado fueron eliminados", + "inboundCreateSuccess": "Entrada creada correctamente", + "inboundDeleteSuccess": "Entrada eliminada correctamente", + "inboundUpdateSuccess": "Entrada actualizada correctamente", + "inboundsUpdateSuccess": "Entradas actualizadas correctamente", + "logCleanSuccess": "El registro ha sido limpiado", + "obtain": "Recibir", "resetAllClientTrafficSuccess": "Todo el tráfico del cliente ha sido reiniciado", "resetAllTrafficSuccess": "Todo el tráfico ha sido reiniciado", "resetInboundClientTrafficSuccess": "El tráfico ha sido reiniciado", "trafficGetError": "Error al obtener los tráficos", - "getNewX25519CertError": "Error al obtener el certificado X25519.", - "getNewmldsa65Error": "Error al obtener el certificado mldsa65.", - "getNewVlessEncError": "Error al obtener el certificado VlessEnc." + "updateSuccess": "La actualización fue exitosa" }, - "stream": { - "general": { - "request": "Pedido", - "response": "Respuesta", - "name": "Nombre", - "value": "Valor" - }, - "tcp": { - "version": "Versión", - "method": "Método", - "path": "Camino", - "status": "Estado", - "statusDescription": "Descripción de la Situación", - "requestHeader": "Encabezado de solicitud", - "responseHeader": "Encabezado de respuesta" - } - } + "totalDownUp": "Subidas/Descargas Totales", + "totalFlow": "Flujo Total", + "totalUsage": "Uso Total", + "traffic": "Tráfico", + "transportConfig": "Transporte", + "updatedAt": "Actualizado" }, - "client": { - "add": "Agregar Cliente", - "edit": "Editar Cliente", - "submitAdd": "Agregar Cliente", - "submitEdit": "Guardar Cambios", - "clientCount": "Número de Clientes", - "bulk": "Agregar en Lote", - "copyFromInbound": "Copiar clientes desde entrada", - "copyToInbound": "Copiar clientes a", - "copySelected": "Copiar seleccionados", - "copySource": "Origen", - "copyEmailPreview": "Vista previa del email resultante", - "copySelectSourceFirst": "Seleccione primero una entrada de origen.", - "copyResult": "Resultado de la copia", - "copyResultSuccess": "Copiado correctamente", - "copyResultNone": "Nada que copiar: ningún cliente seleccionado o el origen está vacío", - "copyResultErrors": "Errores al copiar", - "copyFlowLabel": "Flow para nuevos clientes (VLESS)", - "copyFlowHint": "Se aplica a todos los clientes copiados. Déjelo vacío para omitir.", - "selectAll": "Seleccionar todo", - "clearAll": "Limpiar todo", - "method": "Método", - "first": "Primero", - "last": "Último", - "prefix": "Prefijo", - "postfix": "Sufijo", - "delayedStart": "Iniciar después del primer uso", - "expireDays": "Duración", - "days": "Día(s)", - "renew": "Renovación automática", - "renewDesc": "Renovación automática después de la expiración. (0 = desactivar) (unidad: día)" + "index": { + "backup": "Сopia de Seguridad", + "backupTitle": "Copia \u0026 Restauración", + "charts": "Gráficos", + "config": "Configuración", + "connectionCount": "Número de Conexiones", + "cpu": "CPU", + "currentPanelVersion": "Versión actual del panel", + "customGeoActions": "Acciones", + "customGeoAdd": "Añadir", + "customGeoAlias": "Alias", + "customGeoAliasLabelSuffix": " (personalizado)", + "customGeoAliasPlaceholder": "a-z 0-9 _ -", + "customGeoAliasesError": "No se pudieron cargar los alias geo personalizados", + "customGeoDelete": "Eliminar", + "customGeoDeleteConfirm": "¿Eliminar esta fuente geo personalizada?", + "customGeoDownload": "Actualizar ahora", + "customGeoEdit": "Editar", + "customGeoEmpty": "Aún no hay fuentes geo personalizadas — haz clic en Añadir para crear una", + "customGeoEnabled": "Activado", + "customGeoErrAliasPattern": "El alias contiene caracteres no permitidos", + "customGeoErrAliasRequired": "El alias es obligatorio", + "customGeoErrAliasReserved": "Este alias está reservado", + "customGeoErrDownload": "Error de descarga", + "customGeoErrDuplicateAlias": "Este alias ya se usa para este tipo", + "customGeoErrInvalidType": "El tipo debe ser geosite o geoip", + "customGeoErrInvalidUrl": "La URL no es válida", + "customGeoErrNotFound": "Fuente geo personalizada no encontrada", + "customGeoErrUpdateAllIncomplete": "No se pudieron actualizar una o más fuentes geo personalizadas", + "customGeoErrUrlHost": "El host de la URL no es válido", + "customGeoErrUrlRequired": "La URL es obligatoria", + "customGeoErrUrlScheme": "La URL debe usar http o https", + "customGeoExtColumn": "Enrutamiento (ext:…)", + "customGeoInvalidId": "Id de recurso no válido", + "customGeoLastUpdated": "Última actualización", + "customGeoModalAdd": "Añadir geo personalizado", + "customGeoModalEdit": "Editar geo personalizado", + "customGeoModalSave": "Guardar", + "customGeoRoutingHint": "En reglas de enrutamiento use la columna de valor como ext:archivo.dat:etiqueta (sustituya la etiqueta).", + "customGeoTitle": "GeoSite / GeoIP personalizados", + "customGeoToastAdd": "Añadir geo personalizado", + "customGeoToastDelete": "Geofile personalizado «{{ .fileName }}» eliminado", + "customGeoToastDownload": "Geofile «{{ .fileName }}» actualizado", + "customGeoToastList": "Lista de geo personalizado", + "customGeoToastUpdate": "Actualizar geo personalizado", + "customGeoToastUpdateAll": "Todas las fuentes personalizadas se actualizaron", + "customGeoType": "Tipo", + "customGeoUrl": "URL", + "customGeoValidationAlias": "El alias solo puede contener letras minúsculas, dígitos, - y _", + "customGeoValidationUrl": "La URL debe comenzar con http:// o https://", + "documentation": "Documentación", + "dontRefresh": "La instalación está en progreso, por favor no actualices esta página.", + "download": "Descarga", + "exportDatabase": "Copia de seguridad", + "exportDatabaseDesc": "Haz clic para descargar un archivo .db que contiene una copia de seguridad de tu base de datos actual en tu dispositivo.", + "frequency": "Frecuencia", + "geofileUpdateDialog": "¿Realmente deseas actualizar el geofichero?", + "geofileUpdateDialogDesc": "Esto actualizará el archivo #filename#.", + "geofileUpdatePopover": "Geofichero actualizado correctamente", + "geofilesUpdateAll": "Actualizar todo", + "geofilesUpdateDialogDesc": "Esto actualizará todos los archivos.", + "getConfigError": "Ocurrió un error al obtener el archivo de configuración", + "getDatabaseError": "Ocurrió un error al obtener la base de datos", + "importDatabase": "Restaurar", + "importDatabaseDesc": "Haz clic para seleccionar y cargar un archivo .db desde tu dispositivo para restaurar tu base de datos desde una copia de seguridad.", + "importDatabaseError": "Ocurrió un error al importar la base de datos", + "importDatabaseSuccess": "La base de datos se ha importado correctamente", + "ipAddresses": "Direcciones IP", + "latestPanelVersion": "Última versión del panel", + "logicalProcessors": "Procesadores lógicos", + "logs": "Registros", + "memory": "RAM", + "operationHours": "Tiempo de Funcionamiento", + "overallSpeed": "Velocidad general", + "panelUpToDate": "El panel está actualizado", + "panelUpdateCheckPopover": "Fallo al comprobar actualización del panel", + "panelUpdateDesc": "Esto actualizará 3X-UI a la última versión y reiniciará el servicio del panel.", + "panelUpdateDialog": "¿Deseas actualizar el panel?", + "panelUpdateDialogDesc": "Esto actualizará 3X-UI a la versión #version# y reiniciará el servicio del panel.", + "panelUpdateStartedPopover": "Actualización del panel iniciada", + "readDatabaseError": "Ocurrió un error al leer la base de datos", + "received": "Recibido", + "restartXray": "Reiniciar", + "sent": "Enviado", + "stopXray": "Detener", + "storage": "Almacenamiento", + "swap": "Memoria Virtual", + "systemHistoryTitle": "Historial del Sistema", + "systemLoad": "Carga del Sistema", + "systemLoadDesc": "promedio de carga del sistema en los últimos 1, 5 y 15 minutos", + "threads": "Hilos", + "title": "Estado del Sistema", + "toggleIpVisibility": "Alternar visibilidad de la IP", + "totalData": "Datos totales", + "trendLast2Min": "Últimos 2 minutos", + "upToDate": "Actualizado", + "updatePanel": "Actualizar panel", + "upload": "Subida", + "xrayErrorPopoverTitle": "Se produjo un error al ejecutar Xray", + "xrayMetricsDisabled": "Endpoint de métricas de Xray no configurado", + "xrayMetricsHint": "Añade un bloque metrics de nivel superior a la configuración de xray con tag metrics_out y listen 127.0.0.1:11111, luego reinicia xray.", + "xrayMetricsTitle": "Métricas de Xray", + "xrayObservatoryAlive": "Activo", + "xrayObservatoryDead": "Caído", + "xrayObservatoryEmpty": "Aún no hay datos de Observatory", + "xrayObservatoryHint": "Añade un bloque observatory a la configuración de xray listando los tags de outbound a sondear, luego reinicia xray.", + "xrayObservatoryLastSeen": "Visto por última vez", + "xrayObservatoryLastTry": "Último intento", + "xrayObservatoryTagPlaceholder": "Seleccionar outbound", + "xrayStatus": "Xray", + "xrayStatusError": "Error", + "xrayStatusRunning": "En ejecución", + "xrayStatusStop": "Detenido", + "xrayStatusUnknown": "Desconocido", + "xraySwitch": "Versión", + "xraySwitchClick": "Elige la versión a la que deseas cambiar.", + "xraySwitchClickDesk": "Elige sabiamente, ya que las versiones anteriores pueden no ser compatibles con las configuraciones actuales.", + "xraySwitchVersionDialog": "¿Realmente deseas cambiar la versión de Xray?", + "xraySwitchVersionDialogDesc": "Esto cambiará la versión de Xray a #version#.", + "xraySwitchVersionPopover": "Xray se actualizó correctamente", + "xrayUpdates": "Actualizaciones de Xray" + }, + "login": { + "hello": "Hola", + "loginAgain": "El límite de tiempo de inicio de sesión ha expirado. Por favor, inicia sesión nuevamente.", + "title": "Bienvenido", + "toasts": { + "emptyPassword": "Por favor ingresa la contraseña.", + "emptyUsername": "Por favor ingresa el nombre de usuario.", + "invalidFormData": "El formato de los datos de entrada es inválido.", + "successLogin": "Has iniciado sesión en tu cuenta correctamente.", + "wrongUsernameOrPassword": "Nombre de usuario, contraseña o código de dos factores incorrecto." + } }, "nodes": { - "title": "Nodos", + "actions": "Acciones", "addNode": "Agregar nodo", - "editNode": "Editar nodo", - "totalNodes": "Total de nodos", - "onlineNodes": "En línea", - "offlineNodes": "Desconectado", + "address": "Dirección", + "addressPlaceholder": "panel.example.com o 1.2.3.4", + "apiToken": "Token de API", + "apiTokenHint": "El panel remoto expone su token de API en Configuración → Token de API.", + "apiTokenPlaceholder": "Token desde la página de Configuración del panel remoto", "avgLatency": "Latencia media", + "basePath": "Ruta base", + "connectionFailed": "Conexión fallida", + "connectionOk": "Conexión correcta ({ms} ms)", + "cpu": "CPU", + "deleteConfirmContent": "Esto detiene la monitorización del nodo. El panel remoto en sí no se ve afectado.", + "deleteConfirmTitle": "¿Eliminar el nodo \"{name}\"?", + "editNode": "Editar nodo", + "enable": "Habilitado", + "justNow": "ahora mismo", + "lastHeartbeat": "Último latido", + "latency": "Latencia", + "mem": "Memoria", "name": "Nombre", "namePlaceholder": "p. ej. de-frankfurt-1", - "addressPlaceholder": "panel.example.com o 1.2.3.4", - "remark": "Notas", - "scheme": "Esquema", - "address": "Dirección", + "never": "nunca", + "offlineNodes": "Desconectado", + "onlineNodes": "En línea", "port": "Puerto", - "basePath": "Ruta base", - "apiToken": "Token de API", - "apiTokenPlaceholder": "Token desde la página de Configuración del panel remoto", - "apiTokenHint": "El panel remoto expone su token de API en Configuración → Token de API.", + "probe": "Sondear ahora", "regenerate": "Regenerar token", "regenerateConfirm": "Regenerar invalida el token actual. Cualquier panel central que lo use perderá el acceso hasta que se actualice. ¿Continuar?", - "enable": "Habilitado", + "remark": "Notas", + "scheme": "Esquema", "status": "Estado", - "cpu": "CPU", - "mem": "Memoria", - "uptime": "Tiempo activo", - "latency": "Latencia", - "lastHeartbeat": "Último latido", - "xrayVersion": "Versión de Xray", - "actions": "Acciones", - "probe": "Sondear ahora", - "testConnection": "Probar conexión", - "connectionOk": "Conexión correcta ({ms} ms)", - "connectionFailed": "Conexión fallida", - "never": "nunca", - "justNow": "ahora mismo", - "deleteConfirmTitle": "¿Eliminar el nodo \"{name}\"?", - "deleteConfirmContent": "Esto detiene la monitorización del nodo. El panel remoto en sí no se ve afectado.", "statusValues": { - "online": "En línea", "offline": "Desconectado", + "online": "En línea", "unknown": "Desconocido" }, + "testConnection": "Probar conexión", + "title": "Nodos", "toasts": { - "list": "Error al cargar los nodos", - "obtain": "Error al cargar el nodo", "add": "Agregar nodo", - "update": "Actualizar nodo", "delete": "Eliminar nodo", "deleted": "Nodo eliminado", - "test": "Probar conexión", "fillRequired": "El nombre, la dirección, el puerto y el token de API son obligatorios", - "probeFailed": "Sondeo fallido" - } + "list": "Error al cargar los nodos", + "obtain": "Error al cargar el nodo", + "probeFailed": "Sondeo fallido", + "test": "Probar conexión", + "update": "Actualizar nodo" + }, + "totalNodes": "Total de nodos", + "uptime": "Tiempo activo", + "xrayVersion": "Versión de Xray" }, "settings": { - "title": "Configuraciones", - "save": "Guardar", - "infoDesc": "Cada cambio realizado aquí debe ser guardado. Por favor, reinicie el panel para aplicar los cambios.", - "restartPanel": "Reiniciar Panel", - "restartPanelDesc": "¿Está seguro de que desea reiniciar el panel? Haga clic en Aceptar para reiniciar después de 3 segundos. Si no puede acceder al panel después de reiniciar, por favor, consulte la información de registro del panel en el servidor.", - "restartPanelSuccess": "El panel se reinició correctamente", - "actions": "Acciones", - "resetDefaultConfig": "Restablecer a Configuración Predeterminada", - "panelSettings": "Configuraciones del Panel", - "securitySettings": "Configuraciones de Seguridad", "TGBotSettings": "Configuraciones de Bot de Telegram", - "panelListeningIP": "IP de Escucha del Panel", - "panelListeningIPDesc": "Dejar en blanco por defecto para monitorear todas las IPs.", - "panelListeningDomain": "Dominio de Escucha del Panel", - "panelListeningDomainDesc": "Dejar en blanco por defecto para monitorear todos los dominios e IPs.", - "panelPort": "Puerto del Panel", - "panelPortDesc": "El puerto utilizado para mostrar este panel.", - "publicKeyPath": "Ruta del Archivo de Clave Pública del Certificado del Panel", - "publicKeyPathDesc": "Complete con una ruta absoluta que comience con.", - "privateKeyPath": "Ruta del Archivo de Clave Privada del Certificado del Panel", - "privateKeyPathDesc": "Complete con una ruta absoluta que comience con.", - "panelUrlPath": "Ruta Raíz de la URL del Panel", - "panelUrlPathDesc": "Debe empezar con '/' y terminar con.", - "pageSize": "Tamaño de paginación", - "pageSizeDesc": "Defina el tamaño de página para la tabla de entradas. Establezca 0 para desactivar", - "remarkModel": "Modelo de observación y carácter de separación", - "datepicker": "selector de fechas", - "datepickerPlaceholder": "Seleccionar fecha", - "datepickerDescription": "El tipo de calendario selector especifica la fecha de vencimiento", - "sampleRemark": "Observación de muestra", - "oldUsername": "Nombre de Usuario Actual", + "actions": "Acciones", + "certs": "Certificados", "currentPassword": "Contraseña Actual", - "newUsername": "Nuevo Nombre de Usuario", - "newPassword": "Nueva Contraseña", - "telegramBotEnable": "Habilitar bot de Telegram", - "telegramBotEnableDesc": "Conéctese a las funciones de este panel a través del bot de Telegram.", - "telegramToken": "Token de Telegram", - "telegramTokenDesc": "Debe obtener el token del administrador de bots de Telegram {'@'}botfather.", - "telegramProxy": "Socks5 Proxy", - "telegramProxyDesc": "Si necesita el proxy Socks5 para conectarse a Telegram. Ajuste su configuración según la guía.", - "telegramAPIServer": "API Server de Telegram", - "telegramAPIServerDesc": "El servidor API de Telegram a utilizar. Déjelo en blanco para utilizar el servidor predeterminado.", - "telegramChatId": "IDs de Chat de Telegram para Administradores", - "telegramChatIdDesc": "IDs de Chat múltiples separados por comas. Use {'@'}userinfobot o use el comando '/id' en el bot para obtener sus IDs de Chat.", - "telegramNotifyTime": "Hora de Notificación del Bot de Telegram", - "telegramNotifyTimeDesc": "Usar el formato de tiempo de Crontab.", - "tgNotifyBackup": "Respaldo de Base de Datos", - "tgNotifyBackupDesc": "Incluir archivo de respaldo de base de datos con notificación de informe.", - "tgNotifyLogin": "Notificación de Inicio de Sesión", - "tgNotifyLoginDesc": "Muestra el nombre de usuario, dirección IP y hora cuando alguien intenta iniciar sesión en su panel.", - "sessionMaxAge": "Edad Máxima de Sesión", - "sessionMaxAgeDesc": "La duración de una sesión de inicio de sesión (unidad: minutos).", + "dateAndTime": "Fecha y Hora", + "datepicker": "selector de fechas", + "datepickerDescription": "El tipo de calendario selector especifica la fecha de vencimiento", + "datepickerPlaceholder": "Seleccionar fecha", + "direct": "Conexión Directa", + "directDesc": "Establece conexiones directas con dominios o rangos de IP de un país específico.", "expireTimeDiff": "Umbral de Expiración para Notificación", "expireTimeDiffDesc": "Reciba notificaciones sobre la expiración de la cuenta antes del umbral (unidad: días).", - "trafficDiff": "Umbral de Tráfico para Notificación", - "trafficDiffDesc": "Reciba notificaciones sobre el agotamiento del tráfico antes de alcanzar el umbral (unidad: GB).", - "tgNotifyCpu": "Umbral de Alerta de Porcentaje de CPU", - "tgNotifyCpuDesc": "Reciba notificaciones si el uso de la CPU supera este umbral (unidad: %).", - "timeZone": "Zona Horaria", - "timeZoneDesc": "Las tareas programadas se ejecutan de acuerdo con la hora en esta zona horaria.", - "subSettings": "Suscripción", - "subEnable": "Habilitar Servicio", - "subEnableDesc": "Función de suscripción con configuración separada.", - "subJsonEnable": "Habilitar/Deshabilitar el endpoint de suscripción JSON de forma independiente.", - "subTitle": "Título de la Suscripción", - "subTitleDesc": "Título mostrado en el cliente VPN", - "subSupportUrl": "URL de soporte", - "subSupportUrlDesc": "Enlace de soporte técnico mostrado en el cliente VPN", - "subProfileUrl": "URL del perfil", - "subProfileUrlDesc": "Un enlace a tu sitio web mostrado en el cliente VPN", - "subAnnounce": "Anuncio", - "subAnnounceDesc": "El texto del anuncio mostrado en el cliente VPN", - "subEnableRouting": "Habilitar enrutamiento", - "subEnableRoutingDesc": "Configuración global para habilitar el enrutamiento en el cliente VPN. (Solo para Happ)", - "subRoutingRules": "Reglas de enrutamiento", - "subRoutingRulesDesc": "Reglas de enrutamiento globales para el cliente VPN. (Solo para Happ)", - "subListen": "Listening IP", - "subListenDesc": "Dejar en blanco por defecto para monitorear todas las IPs.", - "subPort": "Puerto de Suscripción", - "subPortDesc": "El número de puerto para el servicio de suscripción debe estar sin usar en el servidor.", - "subCertPath": "Ruta del Archivo de Clave Pública del Certificado de Suscripción", - "subCertPathDesc": "Complete con una ruta absoluta que comience con '/'", - "subKeyPath": "Ruta del Archivo de Clave Privada del Certificado de Suscripción", - "subKeyPathDesc": "Complete con una ruta absoluta que comience con '/'", - "subPath": "Ruta Raíz de la URL de Suscripción", - "subPathDesc": "Debe empezar con '/' y terminar con '/'", - "subDomain": "Dominio de Escucha", - "subDomainDesc": "Dejar en blanco por defecto para monitorear todos los dominios e IPs.", - "subUpdates": "Intervalos de Actualización de Suscripción", - "subUpdatesDesc": "Horas de intervalo entre actualizaciones en la aplicación del cliente.", - "subEncrypt": "Encriptar configuraciones", - "subEncryptDesc": "Encriptar las configuraciones devueltas en la suscripción.", - "subShowInfo": "Mostrar información de uso", - "subShowInfoDesc": "Mostrar tráfico restante y fecha después del nombre de configuración.", - "subURI": "URI de proxy inverso", + "externalTraffic": "Tráfico Externo", "externalTrafficInformEnable": "Informe de tráfico externo", "externalTrafficInformEnableDesc": "Informar a la API externa sobre cada actualización de tráfico.", "externalTrafficInformURI": "URI de información de tráfico externo", "externalTrafficInformURIDesc": "Las actualizaciones de tráfico se envían a este URI.", - "restartXrayOnClientDisable": "Reiniciar Xray tras desactivación automática", - "restartXrayOnClientDisableDesc": "Cuando un cliente se desactive automáticamente por vencimiento o límite de tráfico, reiniciar Xray.", - "subURIDesc": "Cambiar el URI base de la URL de suscripción para usar detrás de los servidores proxy", "fragment": "Fragmentación", "fragmentDesc": "Habilitar la fragmentación para el paquete de saludo de TLS", "fragmentSett": "Configuración de Fragmentación", - "noisesDesc": "Activar Sonidos", - "noisesSett": "Configuración de Sonidos", + "infoDesc": "Cada cambio realizado aquí debe ser guardado. Por favor, reinicie el panel para aplicar los cambios.", + "information": "Información", + "intervals": "Intervalos", + "language": "Idioma", "mux": "Mux", "muxDesc": "Transmite múltiples flujos de datos independientes dentro de un flujo de datos establecido.", "muxSett": "Configuración Mux", - "direct": "Conexión Directa", - "directDesc": "Establece conexiones directas con dominios o rangos de IP de un país específico.", + "newPassword": "Nueva Contraseña", + "newUsername": "Nuevo Nombre de Usuario", + "noisesDesc": "Activar Sonidos", + "noisesSett": "Configuración de Sonidos", "notifications": "Notificaciones", - "certs": "Certificados", - "externalTraffic": "Tráfico Externo", - "dateAndTime": "Fecha y Hora", + "oldUsername": "Nombre de Usuario Actual", + "pageSize": "Tamaño de paginación", + "pageSizeDesc": "Defina el tamaño de página para la tabla de entradas. Establezca 0 para desactivar", + "panelListeningDomain": "Dominio de Escucha del Panel", + "panelListeningDomainDesc": "Dejar en blanco por defecto para monitorear todos los dominios e IPs.", + "panelListeningIP": "IP de Escucha del Panel", + "panelListeningIPDesc": "Dejar en blanco por defecto para monitorear todas las IPs.", + "panelPort": "Puerto del Panel", + "panelPortDesc": "El puerto utilizado para mostrar este panel.", + "panelSettings": "Configuraciones del Panel", + "panelUrlPath": "Ruta Raíz de la URL del Panel", + "panelUrlPathDesc": "Debe empezar con '/' y terminar con.", + "privateKeyPath": "Ruta del Archivo de Clave Privada del Certificado del Panel", + "privateKeyPathDesc": "Complete con una ruta absoluta que comience con.", "proxyAndServer": "Proxy y Servidor", - "intervals": "Intervalos", - "information": "Información", - "language": "Idioma", - "telegramBotLanguage": "Idioma del Bot de Telegram", + "publicKeyPath": "Ruta del Archivo de Clave Pública del Certificado del Panel", + "publicKeyPathDesc": "Complete con una ruta absoluta que comience con.", + "remarkModel": "Modelo de observación y carácter de separación", + "resetDefaultConfig": "Restablecer a Configuración Predeterminada", + "restartPanel": "Reiniciar Panel", + "restartPanelDesc": "¿Está seguro de que desea reiniciar el panel? Haga clic en Aceptar para reiniciar después de 3 segundos. Si no puede acceder al panel después de reiniciar, por favor, consulte la información de registro del panel en el servidor.", + "restartPanelSuccess": "El panel se reinició correctamente", + "restartXrayOnClientDisable": "Reiniciar Xray tras desactivación automática", + "restartXrayOnClientDisableDesc": "Cuando un cliente se desactive automáticamente por vencimiento o límite de tráfico, reiniciar Xray.", + "sampleRemark": "Observación de muestra", + "save": "Guardar", "security": { "admin": "Credenciales de administrador", "twoFactor": "Autenticación de dos factores", "twoFactorEnable": "Habilitar 2FA", "twoFactorEnableDesc": "Añade una capa adicional de autenticación para mayor seguridad.", - "twoFactorModalSetTitle": "Activar autenticación de dos factores", - "twoFactorModalDeleteTitle": "Desactivar autenticación de dos factores", - "twoFactorModalSteps": "Para configurar la autenticación de dos factores, sigue estos pasos:", - "twoFactorModalFirstStep": "1. Escanea este código QR en la aplicación de autenticación o copia el token cerca del código QR y pégalo en la aplicación", - "twoFactorModalSecondStep": "2. Ingresa el código de la aplicación", - "twoFactorModalRemoveStep": "Ingresa el código de la aplicación para eliminar la autenticación de dos factores.", - "twoFactorModalChangeCredentialsTitle": "Cambiar credenciales", "twoFactorModalChangeCredentialsStep": "Ingrese el código de la aplicación para cambiar las credenciales del administrador.", - "twoFactorModalSetSuccess": "La autenticación de dos factores se ha establecido con éxito", + "twoFactorModalChangeCredentialsTitle": "Cambiar credenciales", "twoFactorModalDeleteSuccess": "La autenticación de dos factores se ha eliminado con éxito", - "twoFactorModalError": "Código incorrecto" + "twoFactorModalDeleteTitle": "Desactivar autenticación de dos factores", + "twoFactorModalError": "Código incorrecto", + "twoFactorModalFirstStep": "1. Escanea este código QR en la aplicación de autenticación o copia el token cerca del código QR y pégalo en la aplicación", + "twoFactorModalRemoveStep": "Ingresa el código de la aplicación para eliminar la autenticación de dos factores.", + "twoFactorModalSecondStep": "2. Ingresa el código de la aplicación", + "twoFactorModalSetSuccess": "La autenticación de dos factores se ha establecido con éxito", + "twoFactorModalSetTitle": "Activar autenticación de dos factores", + "twoFactorModalSteps": "Para configurar la autenticación de dos factores, sigue estos pasos:" }, + "securitySettings": "Configuraciones de Seguridad", + "sessionMaxAge": "Edad Máxima de Sesión", + "sessionMaxAgeDesc": "La duración de una sesión de inicio de sesión (unidad: minutos).", + "subAnnounce": "Anuncio", + "subAnnounceDesc": "El texto del anuncio mostrado en el cliente VPN", + "subCertPath": "Ruta del Archivo de Clave Pública del Certificado de Suscripción", + "subCertPathDesc": "Complete con una ruta absoluta que comience con '/'", + "subDomain": "Dominio de Escucha", + "subDomainDesc": "Dejar en blanco por defecto para monitorear todos los dominios e IPs.", + "subEnable": "Habilitar Servicio", + "subEnableDesc": "Función de suscripción con configuración separada.", + "subEnableRouting": "Habilitar enrutamiento", + "subEnableRoutingDesc": "Configuración global para habilitar el enrutamiento en el cliente VPN. (Solo para Happ)", + "subEncrypt": "Encriptar configuraciones", + "subEncryptDesc": "Encriptar las configuraciones devueltas en la suscripción.", + "subJsonEnable": "Habilitar/Deshabilitar el endpoint de suscripción JSON de forma independiente.", + "subKeyPath": "Ruta del Archivo de Clave Privada del Certificado de Suscripción", + "subKeyPathDesc": "Complete con una ruta absoluta que comience con '/'", + "subListen": "Listening IP", + "subListenDesc": "Dejar en blanco por defecto para monitorear todas las IPs.", + "subPath": "Ruta Raíz de la URL de Suscripción", + "subPathDesc": "Debe empezar con '/' y terminar con '/'", + "subPort": "Puerto de Suscripción", + "subPortDesc": "El número de puerto para el servicio de suscripción debe estar sin usar en el servidor.", + "subProfileUrl": "URL del perfil", + "subProfileUrlDesc": "Un enlace a tu sitio web mostrado en el cliente VPN", + "subRoutingRules": "Reglas de enrutamiento", + "subRoutingRulesDesc": "Reglas de enrutamiento globales para el cliente VPN. (Solo para Happ)", + "subSettings": "Suscripción", + "subShowInfo": "Mostrar información de uso", + "subShowInfoDesc": "Mostrar tráfico restante y fecha después del nombre de configuración.", + "subSupportUrl": "URL de soporte", + "subSupportUrlDesc": "Enlace de soporte técnico mostrado en el cliente VPN", + "subTitle": "Título de la Suscripción", + "subTitleDesc": "Título mostrado en el cliente VPN", + "subURI": "URI de proxy inverso", + "subURIDesc": "Cambiar el URI base de la URL de suscripción para usar detrás de los servidores proxy", + "subUpdates": "Intervalos de Actualización de Suscripción", + "subUpdatesDesc": "Horas de intervalo entre actualizaciones en la aplicación del cliente.", + "telegramAPIServer": "API Server de Telegram", + "telegramAPIServerDesc": "El servidor API de Telegram a utilizar. Déjelo en blanco para utilizar el servidor predeterminado.", + "telegramBotEnable": "Habilitar bot de Telegram", + "telegramBotEnableDesc": "Conéctese a las funciones de este panel a través del bot de Telegram.", + "telegramBotLanguage": "Idioma del Bot de Telegram", + "telegramChatId": "IDs de Chat de Telegram para Administradores", + "telegramChatIdDesc": "IDs de Chat múltiples separados por comas. Use {'@'}userinfobot o use el comando '/id' en el bot para obtener sus IDs de Chat.", + "telegramNotifyTime": "Hora de Notificación del Bot de Telegram", + "telegramNotifyTimeDesc": "Usar el formato de tiempo de Crontab.", + "telegramProxy": "Socks5 Proxy", + "telegramProxyDesc": "Si necesita el proxy Socks5 para conectarse a Telegram. Ajuste su configuración según la guía.", + "telegramToken": "Token de Telegram", + "telegramTokenDesc": "Debe obtener el token del administrador de bots de Telegram {'@'}botfather.", + "tgNotifyBackup": "Respaldo de Base de Datos", + "tgNotifyBackupDesc": "Incluir archivo de respaldo de base de datos con notificación de informe.", + "tgNotifyCpu": "Umbral de Alerta de Porcentaje de CPU", + "tgNotifyCpuDesc": "Reciba notificaciones si el uso de la CPU supera este umbral (unidad: %).", + "tgNotifyLogin": "Notificación de Inicio de Sesión", + "tgNotifyLoginDesc": "Muestra el nombre de usuario, dirección IP y hora cuando alguien intenta iniciar sesión en su panel.", + "timeZone": "Zona Horaria", + "timeZoneDesc": "Las tareas programadas se ejecutan de acuerdo con la hora en esta zona horaria.", + "title": "Configuraciones", "toasts": { - "modifySettings": "Los parámetros han sido modificados.", - "getSettings": "Ocurrió un error al obtener los parámetros.", - "modifyUserError": "Ocurrió un error al cambiar las credenciales del administrador.", - "modifyUser": "Has cambiado exitosamente las credenciales del administrador.", - "originalUserPassIncorrect": "Nombre de usuario o contraseña original incorrectos", - "userPassMustBeNotEmpty": "El nuevo nombre de usuario y la nueva contraseña no pueden estar vacíos", "getOutboundTrafficError": "Error al obtener el tráfico saliente", - "resetOutboundTrafficError": "Error al reiniciar el tráfico saliente" - } + "getSettings": "Ocurrió un error al obtener los parámetros.", + "modifySettings": "Los parámetros han sido modificados.", + "modifyUser": "Has cambiado exitosamente las credenciales del administrador.", + "modifyUserError": "Ocurrió un error al cambiar las credenciales del administrador.", + "originalUserPassIncorrect": "Nombre de usuario o contraseña original incorrectos", + "resetOutboundTrafficError": "Error al reiniciar el tráfico saliente", + "userPassMustBeNotEmpty": "El nuevo nombre de usuario y la nueva contraseña no pueden estar vacíos" + }, + "trafficDiff": "Umbral de Tráfico para Notificación", + "trafficDiffDesc": "Reciba notificaciones sobre el agotamiento del tráfico antes de alcanzar el umbral (unidad: GB)." }, "xray": { - "title": "Xray Configuración", - "save": "Guardar configuración", - "restart": "Reiniciar Xray", - "restartSuccess": "Xray se ha reiniciado correctamente", - "stopSuccess": "Xray se ha detenido correctamente", - "restartError": "Ocurrió un error al reiniciar Xray.", - "stopError": "Ocurrió un error al detener Xray.", - "basicTemplate": "Perfil Básico", - "advancedTemplate": "Perfil Avanzado", - "generalConfigs": "Configuraciones Generales", - "generalConfigsDesc": "Estas opciones proporcionarán ajustes generales.", - "logConfigs": "Registro", - "logConfigsDesc": "Los registros pueden afectar la eficiencia de su servidor. Se recomienda habilitarlos sabiamente solo en caso de sus necesidades.", - "blockConfigsDesc": "Estas opciones evitarán que los usuarios se conecten a protocolos y sitios web específicos.", - "basicRouting": "Enrutamiento Básico", - "blockConnectionsConfigsDesc": "Estas opciones bloquearán el tráfico según el país solicitado específico.", - "directConnectionsConfigsDesc": "Una conexión directa asegura que el tráfico específico no sea enrutado a través de otro servidor.", - "blockips": "Bloquear IPs", - "blockdomains": "Bloquear Dominios", - "directips": "IPs Directas", - "directdomains": "Dominios Directos", - "ipv4Routing": "Enrutamiento IPv4", - "ipv4RoutingDesc": "Estas opciones solo enrutarán a los dominios objetivo a través de IPv4.", - "warpRouting": "Enrutamiento WARP", - "warpRoutingDesc": "Precaución: Antes de usar estas opciones, instale WARP en modo de proxy socks5 en su servidor siguiendo los pasos en el GitHub del panel. WARP enrutará el tráfico a los sitios web a través de los servidores de Cloudflare.", - "nordRouting": "Enrutamiento NordVPN", - "nordRoutingDesc": "Estas opciones enrutarán el tráfico basado en un destino específico a través de NordVPN.", - "Template": "Plantilla de Configuración de Xray", - "TemplateDesc": "Genera el archivo de configuración final de Xray basado en esta plantilla.", + "Balancers": "Equilibradores", "FreedomStrategy": "Configurar Estrategia para el Protocolo Freedom", "FreedomStrategyDesc": "Establece la estrategia de salida de la red en el Protocolo Freedom.", - "RoutingStrategy": "Configurar Estrategia de Enrutamiento de Dominios", - "RoutingStrategyDesc": "Establece la estrategia general de enrutamiento para la resolución de DNS.", - "outboundTestUrl": "URL de prueba de outbound", - "outboundTestUrlDesc": "URL usada al probar la conectividad del outbound", - "Torrent": "Prohibir Uso de BitTorrent", "Inbounds": "Entrante", "InboundsDesc": "Cambia la plantilla de configuración para aceptar clientes específicos.", "Outbounds": "Salidas", - "Balancers": "Equilibradores", "OutboundsDesc": "Cambia la plantilla de configuración para definir formas de salida para este servidor.", + "RoutingStrategy": "Configurar Estrategia de Enrutamiento de Dominios", + "RoutingStrategyDesc": "Establece la estrategia general de enrutamiento para la resolución de DNS.", "Routings": "Reglas de enrutamiento", "RoutingsDesc": "¡La prioridad de cada regla es importante!", - "completeTemplate": "Todos", - "logLevel": "Nivel de registro", - "logLevelDesc": "El nivel de registro para registros de errores, que indica la información que debe registrarse.", + "Template": "Plantilla de Configuración de Xray", + "TemplateDesc": "Genera el archivo de configuración final de Xray basado en esta plantilla.", + "Torrent": "Prohibir Uso de BitTorrent", "accessLog": "Registro de acceso", "accessLogDesc": "La ruta del archivo para el registro de acceso. El valor especial 'ninguno' deshabilita los registros de acceso", - "errorLog": "Registro de Errores", - "errorLogDesc": "La ruta del archivo para el registro de errores. El valor especial 'none' desactiva los registros de errores.", - "dnsLog": "Registro DNS", - "dnsLogDesc": "Si habilitar los registros de consulta DNS", - "maskAddress": "Enmascarar Dirección", - "maskAddressDesc": "Máscara de dirección IP, cuando se habilita, reemplazará automáticamente la dirección IP que aparece en el registro.", - "statistics": "Estadísticas", - "statsInboundUplink": "Estadísticas de Subida de Entrada", - "statsInboundUplinkDesc": "Habilita la recopilación de estadísticas para el tráfico ascendente de todos los proxies de entrada.", - "statsInboundDownlink": "Estadísticas de Bajada de Entrada", - "statsInboundDownlinkDesc": "Habilita la recopilación de estadísticas para el tráfico descendente de todos los proxies de entrada.", - "statsOutboundUplink": "Estadísticas de Subida de Salida", - "statsOutboundUplinkDesc": "Habilita la recopilación de estadísticas para el tráfico ascendente de todos los proxies de salida.", - "statsOutboundDownlink": "Estadísticas de Bajada de Salida", - "statsOutboundDownlinkDesc": "Habilita la recopilación de estadísticas para el tráfico descendente de todos los proxies de salida.", - "rules": { - "first": "Primero", - "last": "Último", - "up": "Arriba", - "down": "Abajo", - "source": "Fuente", - "dest": "Destino", - "inbound": "Entrante", - "outbound": "Saliente", - "balancer": "Equilibrador", - "info": "Información", - "add": "Agregar Regla", - "edit": "Editar Regla", - "useComma": "Elementos separados por comas" - }, - "outbound": { - "addOutbound": "Agregar salida", - "addReverse": "Agregar reverso", - "editOutbound": "Editar salida", - "editReverse": "Editar reverso", - "reverseTag": "Etiqueta Reverso", - "reverseTagDesc": "Etiqueta de salida del proxy inverso simple VLESS. Dejar vacío para deshabilitar. Cuando se establece, las conexiones de este cliente pueden usarse como túnel de proxy inverso.", - "reverseTagPlaceholder": "etiqueta de salida (vacío para deshabilitar)", - "tag": "Etiqueta", - "tagDesc": "etiqueta única", - "address": "Dirección", - "reverse": "Reverso", - "domain": "Dominio", - "type": "Tipo", - "bridge": "puente", - "portal": "portal", - "link": "Enlace", - "intercon": "Interconexión", - "settings": "Configuración", - "accountInfo": "Información de la Cuenta", - "outboundStatus": "Estado de Salida", - "sendThrough": "Enviar a través de", - "test": "Probar", - "testResult": "Resultado de la prueba", - "testing": "Probando conexión...", - "testSuccess": "Prueba exitosa", - "testFailed": "Prueba fallida", - "testError": "Error al probar la salida", - "nordvpn": "NordVPN", - "accessToken": "Token de acceso", - "country": "País", - "server": "Servidor", - "city": "Ciudad", - "allCities": "Todas las ciudades", - "privateKey": "Clave privada", - "load": "Carga" - }, + "advancedTemplate": "Perfil Avanzado", "balancer": { "addBalancer": "Agregar equilibrador", - "editBalancer": "Editar balanceador", - "balancerStrategy": "Estrategia", + "balancerDesc": "No es posible utilizar balancerTag y outboundTag al mismo tiempo. Si se utilizan al mismo tiempo, sólo funcionará outboundTag.", "balancerSelectors": "Selectores", + "balancerStrategy": "Estrategia", + "editBalancer": "Editar balanceador", "tag": "Etiqueta", - "tagDesc": "etiqueta única", - "balancerDesc": "No es posible utilizar balancerTag y outboundTag al mismo tiempo. Si se utilizan al mismo tiempo, sólo funcionará outboundTag." - }, - "wireguard": { - "secretKey": "Llave secreta", - "publicKey": "Llave pública", - "allowedIPs": "IP permitidas", - "endpoint": "Punto final", - "psk": "Clave precompartida", - "domainStrategy": "Estrategia de dominio" - }, - "tun": { - "nameDesc": "El nombre de la interfaz TUN. El valor predeterminado es 'xray0'", - "mtuDesc": "Unidad Máxima de Transmisión. El tamaño máximo de los paquetes de datos. El valor predeterminado es 1500", - "userLevel": "Nivel de Usuario", - "userLevelDesc": "Todas las conexiones realizadas a través de este entrada utilizarán este nivel de usuario. El valor predeterminado es 0" + "tagDesc": "etiqueta única" }, + "basicRouting": "Enrutamiento Básico", + "basicTemplate": "Perfil Básico", + "blockConfigsDesc": "Estas opciones evitarán que los usuarios se conecten a protocolos y sitios web específicos.", + "blockConnectionsConfigsDesc": "Estas opciones bloquearán el tráfico según el país solicitado específico.", + "blockdomains": "Bloquear Dominios", + "blockips": "Bloquear IPs", + "completeTemplate": "Todos", + "directConnectionsConfigsDesc": "Una conexión directa asegura que el tráfico específico no sea enrutado a través de otro servidor.", + "directdomains": "Dominios Directos", + "directips": "IPs Directas", "dns": { - "enable": "Habilitar DNS", - "enableDesc": "Habilitar servidor DNS incorporado", - "tag": "Etiqueta de Entrada DNS", - "tagDesc": "Esta etiqueta estará disponible como una etiqueta de entrada en las reglas de enrutamiento.", + "add": "Agregar Servidor", + "clearAll": "Eliminar todos", + "clearAllConfirm": "Esto eliminará todos los servidores DNS de la lista. No se puede deshacer.", + "clearAllTitle": "¿Eliminar todos los servidores DNS?", "clientIp": "IP del cliente", "clientIpDesc": "Se utiliza para notificar al servidor la ubicación IP especificada durante las consultas DNS", "disableCache": "Desactivar caché", @@ -753,217 +607,371 @@ "disableFallbackDesc": "Desactiva las consultas DNS de respaldo", "disableFallbackIfMatch": "Desactivar respaldo si coincide", "disableFallbackIfMatchDesc": "Desactiva las consultas DNS de respaldo cuando se acierta en la lista de dominios coincidentes del servidor DNS", + "dnsPresetFamily": "Familiar", + "dnsPresetTitle": "Plantillas DNS", + "domains": "Dominios", + "edit": "Editar Servidor", + "enable": "Habilitar DNS", + "enableDesc": "Habilitar servidor DNS incorporado", "enableParallelQuery": "Habilitar consulta paralela", "enableParallelQueryDesc": "Habilitar consultas DNS paralelas a múltiples servidores para una resolución más rápida", - "strategy": "Estrategia de Consulta", - "strategyDesc": "Estrategia general para resolver nombres de dominio", - "add": "Agregar Servidor", - "edit": "Editar Servidor", - "domains": "Dominios", "expectIPs": "IPs esperadas", - "unexpectIPs": "IPs inesperadas", - "useSystemHosts": "Usar Hosts del sistema", - "useSystemHostsDesc": "Usar el archivo hosts de un sistema instalado", - "usePreset": "Usar plantilla", - "dnsPresetTitle": "Plantillas DNS", - "dnsPresetFamily": "Familiar", - "serveStale": "Servir caducados", - "serveStaleDesc": "Devolver resultados caducados de la caché mientras se actualiza en segundo plano", - "serveExpiredTTL": "TTL de caducados", - "serveExpiredTTLDesc": "Validez (segundos) de las entradas caducadas en la caché; 0 = nunca caduca", - "timeoutMs": "Tiempo de espera (ms)", - "skipFallback": "Omitir respaldo", "finalQuery": "Consulta final", "hosts": "Hosts", "hostsAdd": "Agregar Host", - "hostsEmpty": "No hay Hosts definidos", "hostsDomain": "Dominio (ej. domain:example.com)", + "hostsEmpty": "No hay Hosts definidos", "hostsValues": "IP o dominio — escribe y presiona Enter", - "clearAll": "Eliminar todos", - "clearAllTitle": "¿Eliminar todos los servidores DNS?", - "clearAllConfirm": "Esto eliminará todos los servidores DNS de la lista. No se puede deshacer." + "serveExpiredTTL": "TTL de caducados", + "serveExpiredTTLDesc": "Validez (segundos) de las entradas caducadas en la caché; 0 = nunca caduca", + "serveStale": "Servir caducados", + "serveStaleDesc": "Devolver resultados caducados de la caché mientras se actualiza en segundo plano", + "skipFallback": "Omitir respaldo", + "strategy": "Estrategia de Consulta", + "strategyDesc": "Estrategia general para resolver nombres de dominio", + "tag": "Etiqueta de Entrada DNS", + "tagDesc": "Esta etiqueta estará disponible como una etiqueta de entrada en las reglas de enrutamiento.", + "timeoutMs": "Tiempo de espera (ms)", + "unexpectIPs": "IPs inesperadas", + "usePreset": "Usar plantilla", + "useSystemHosts": "Usar Hosts del sistema", + "useSystemHostsDesc": "Usar el archivo hosts de un sistema instalado" }, + "dnsLog": "Registro DNS", + "dnsLogDesc": "Si habilitar los registros de consulta DNS", + "errorLog": "Registro de Errores", + "errorLogDesc": "La ruta del archivo para el registro de errores. El valor especial 'none' desactiva los registros de errores.", "fakedns": { "add": "Agregar DNS Falso", "edit": "Editar DNS Falso", "ipPool": "Subred del grupo de IP", "poolSize": "Tamaño del grupo" + }, + "generalConfigs": "Configuraciones Generales", + "generalConfigsDesc": "Estas opciones proporcionarán ajustes generales.", + "ipv4Routing": "Enrutamiento IPv4", + "ipv4RoutingDesc": "Estas opciones solo enrutarán a los dominios objetivo a través de IPv4.", + "logConfigs": "Registro", + "logConfigsDesc": "Los registros pueden afectar la eficiencia de su servidor. Se recomienda habilitarlos sabiamente solo en caso de sus necesidades.", + "logLevel": "Nivel de registro", + "logLevelDesc": "El nivel de registro para registros de errores, que indica la información que debe registrarse.", + "maskAddress": "Enmascarar Dirección", + "maskAddressDesc": "Máscara de dirección IP, cuando se habilita, reemplazará automáticamente la dirección IP que aparece en el registro.", + "nordRouting": "Enrutamiento NordVPN", + "nordRoutingDesc": "Estas opciones enrutarán el tráfico basado en un destino específico a través de NordVPN.", + "outbound": { + "accessToken": "Token de acceso", + "accountInfo": "Información de la Cuenta", + "addOutbound": "Agregar salida", + "addReverse": "Agregar reverso", + "address": "Dirección", + "allCities": "Todas las ciudades", + "bridge": "puente", + "city": "Ciudad", + "country": "País", + "domain": "Dominio", + "editOutbound": "Editar salida", + "editReverse": "Editar reverso", + "intercon": "Interconexión", + "link": "Enlace", + "load": "Carga", + "nordvpn": "NordVPN", + "outboundStatus": "Estado de Salida", + "portal": "portal", + "privateKey": "Clave privada", + "reverse": "Reverso", + "reverseTag": "Etiqueta Reverso", + "reverseTagDesc": "Etiqueta de salida del proxy inverso simple VLESS. Dejar vacío para deshabilitar. Cuando se establece, las conexiones de este cliente pueden usarse como túnel de proxy inverso.", + "reverseTagPlaceholder": "etiqueta de salida (vacío para deshabilitar)", + "sendThrough": "Enviar a través de", + "server": "Servidor", + "settings": "Configuración", + "tag": "Etiqueta", + "tagDesc": "etiqueta única", + "test": "Probar", + "testError": "Error al probar la salida", + "testFailed": "Prueba fallida", + "testResult": "Resultado de la prueba", + "testSuccess": "Prueba exitosa", + "testing": "Probando conexión...", + "type": "Tipo" + }, + "outboundTestUrl": "URL de prueba de outbound", + "outboundTestUrlDesc": "URL usada al probar la conectividad del outbound", + "restart": "Reiniciar Xray", + "restartError": "Ocurrió un error al reiniciar Xray.", + "restartSuccess": "Xray se ha reiniciado correctamente", + "rules": { + "add": "Agregar Regla", + "balancer": "Equilibrador", + "dest": "Destino", + "down": "Abajo", + "edit": "Editar Regla", + "first": "Primero", + "inbound": "Entrante", + "info": "Información", + "last": "Último", + "outbound": "Saliente", + "source": "Fuente", + "up": "Arriba", + "useComma": "Elementos separados por comas" + }, + "save": "Guardar configuración", + "statistics": "Estadísticas", + "statsInboundDownlink": "Estadísticas de Bajada de Entrada", + "statsInboundDownlinkDesc": "Habilita la recopilación de estadísticas para el tráfico descendente de todos los proxies de entrada.", + "statsInboundUplink": "Estadísticas de Subida de Entrada", + "statsInboundUplinkDesc": "Habilita la recopilación de estadísticas para el tráfico ascendente de todos los proxies de entrada.", + "statsOutboundDownlink": "Estadísticas de Bajada de Salida", + "statsOutboundDownlinkDesc": "Habilita la recopilación de estadísticas para el tráfico descendente de todos los proxies de salida.", + "statsOutboundUplink": "Estadísticas de Subida de Salida", + "statsOutboundUplinkDesc": "Habilita la recopilación de estadísticas para el tráfico ascendente de todos los proxies de salida.", + "stopError": "Ocurrió un error al detener Xray.", + "stopSuccess": "Xray se ha detenido correctamente", + "title": "Xray Configuración", + "tun": { + "mtuDesc": "Unidad Máxima de Transmisión. El tamaño máximo de los paquetes de datos. El valor predeterminado es 1500", + "nameDesc": "El nombre de la interfaz TUN. El valor predeterminado es 'xray0'", + "userLevel": "Nivel de Usuario", + "userLevelDesc": "Todas las conexiones realizadas a través de este entrada utilizarán este nivel de usuario. El valor predeterminado es 0" + }, + "warpRouting": "Enrutamiento WARP", + "warpRoutingDesc": "Precaución: Antes de usar estas opciones, instale WARP en modo de proxy socks5 en su servidor siguiendo los pasos en el GitHub del panel. WARP enrutará el tráfico a los sitios web a través de los servidores de Cloudflare.", + "wireguard": { + "allowedIPs": "IP permitidas", + "domainStrategy": "Estrategia de dominio", + "endpoint": "Punto final", + "psk": "Clave precompartida", + "publicKey": "Llave pública", + "secretKey": "Llave secreta" } } }, + "password": "Contraseña", + "path": "Path", + "protocol": "Protocolo", + "qrCode": "Código QR", + "remained": "Restante", + "remark": "Notas", + "reset": "Restablecer", + "save": "Guardar", + "search": "Buscar", + "secAlertConf": "Ciertas configuraciones son vulnerables a ataques. Se recomienda reforzar los protocolos de seguridad para prevenir posibles violaciones.", + "secAlertPanelPort": "El puerto predeterminado del panel es vulnerable. Por favor, configure un puerto aleatorio o específico.", + "secAlertPanelURI": "La ruta URI predeterminada del panel no es segura. Por favor, configure una ruta URI compleja.", + "secAlertSSL": "El panel carece de una conexión segura. Por favor, instale un certificado TLS para la protección de datos.", + "secAlertSsl": "Esta conexión no es segura. Por favor, evite ingresar información sensible hasta que se active TLS para la protección de datos.", + "secAlertSubJsonURI": "La ruta URI JSON predeterminada de la suscripción no es segura. Por favor, configure una ruta URI compleja.", + "secAlertSubURI": "La ruta URI predeterminada de la suscripción no es segura. Por favor, configure una ruta URI compleja.", + "secAlertTitle": "Alerta de Seguridad", + "second": "Segundo", + "security": "Seguridad", + "somethingWentWrong": "Algo salió mal", + "status": "Estado", + "subscription": { + "active": "Activo", + "downloaded": "Descargado", + "expiry": "Caducidad", + "inactive": "Inactivo", + "individualLinks": "Enlaces individuales", + "noExpiry": "Sin caducidad", + "status": "Estado", + "subId": "ID de suscripción", + "title": "Información de suscripción", + "totalQuota": "Cuota total", + "unlimited": "Ilimitado", + "uploaded": "Subido" + }, + "success": "Éxito", + "sure": "Seguro", "tgbot": { - "keyboardClosed": "❌ Teclado cerrado!", - "noResult": "❗ ¡Sin resultados!", - "noQuery": "❌ ¡Consulta no encontrada! ¡Por favor, use el comando nuevamente!", - "wentWrong": "❌ ¡Algo salió mal!", - "noIpRecord": "❗ ¡No hay registro de IP!", - "noInbounds": "❗ ¡No se encontraron entradas!", - "unlimited": "♾ Ilimitado (Restablecer)", "add": "Añadir", - "month": "Mes", - "months": "Meses", - "day": "Día", - "days": "Días", - "hours": "Horas", - "minutes": "Minutos", - "unknown": "Desconocido", - "inbounds": "Entradas", - "clients": "Clientes", - "offline": "🔴 Desconectado", - "online": "🟢 En línea", - "commands": { - "unknown": "❗ Comando desconocido", - "pleaseChoose": "👇 Por favor elige:\r\n", - "help": "🤖 ¡Bienvenido a este bot! Está diseñado para ofrecerte datos específicos del servidor y te permite hacer modificaciones según sea necesario.\r\n\r\n", - "start": "👋 Hola {{ .Firstname }}.\r\n", - "welcome": "🤖 Bienvenido al bot de gestión de {{ .Hostname }}.\r\n", - "status": "✅ ¡El bot está bien!", - "usage": "❗ ¡Por favor proporciona un texto para buscar!", - "getID": "🆔 Tu ID: {{ .ID }}", - "helpAdminCommands": "Para reiniciar Xray Core:\r\n/restart\r\n\r\nPara buscar un correo electrónico de cliente:\r\n/usage [Correo electrónico]\r\n\r\nPara buscar entradas (con estadísticas de cliente):\r\n/inbound [Observación]\r\n\r\nID de Chat de Telegram:\r\n/id", - "helpClientCommands": "Para buscar estadísticas, utiliza el siguiente comando:\r\n/usage [Correo electrónico]\r\n\r\nID de Chat de Telegram:\r\n/id", - "restartUsage": "\r\n\r\n/restart", - "restartSuccess": "✅ ¡Operación exitosa!", - "restartFailed": "❗ Error en la operación.\r\n\r\nError: {{ .Error }}.", - "xrayNotRunning": "❗ Xray Core no está en ejecución.", - "startDesc": "Mostrar el menú principal", - "helpDesc": "Ayuda del bot", - "statusDesc": "Comprobar el estado del bot", - "idDesc": "Mostrar tu ID de Telegram" - }, - "messages": { - "cpuThreshold": "🔴 El uso de CPU {{ .Percent }}% es mayor que el umbral {{ .Threshold }}%", - "selectUserFailed": "❌ ¡Error al seleccionar usuario!", - "userSaved": "✅ Usuario de Telegram guardado.", - "loginSuccess": "✅ Has iniciado sesión en el panel con éxito.\r\n", - "loginFailed": "❗️ Falló el inicio de sesión en el panel.\r\n", - "2faFailed": "Error de 2FA", - "report": "🕰 Informes programados: {{ .RunTime }}\r\n", - "datetime": "⏰ Fecha y Hora: {{ .DateTime }}\r\n", - "hostname": "💻 Nombre del Host: {{ .Hostname }}\r\n", - "version": "🚀 Versión de X-UI: {{ .Version }}\r\n", - "xrayVersion": "📡 Versión de Xray: {{ .XrayVersion }}\r\n", - "ipv6": "🌐 IPv6: {{ .IPv6 }}\r\n", - "ipv4": "🌐 IPv4: {{ .IPv4 }}\r\n", - "ip": "🌐 IP: {{ .IP }}\r\n", - "ips": "🔢 IPs:\r\n{{ .IPs }}\r\n", - "serverUpTime": "⏳ Tiempo de actividad del servidor: {{ .UpTime }} {{ .Unit }}\r\n", - "serverLoad": "📈 Carga del servidor: {{ .Load1 }}, {{ .Load2 }}, {{ .Load3 }}\r\n", - "serverMemory": "📋 Memoria del servidor: {{ .Current }}/{{ .Total }}\r\n", - "tcpCount": "🔹 Conteo de TCP: {{ .Count }}\r\n", - "udpCount": "🔸 Conteo de UDP: {{ .Count }}\r\n", - "traffic": "🚦 Tráfico: {{ .Total }} (↑{{ .Upload }},↓{{ .Download }})\r\n", - "xrayStatus": "ℹ️ Estado de Xray: {{ .State }}\r\n", - "username": "👤 Nombre de usuario: {{ .Username }}\r\n", - "reason": "❗️ Motivo: {{ .Reason }}\r\n", - "time": "⏰ Hora: {{ .Time }}\r\n", - "inbound": "📍 Inbound: {{ .Remark }}\r\n", - "port": "🔌 Puerto: {{ .Port }}\r\n", - "expire": "📅 Fecha de Vencimiento: {{ .Time }}\r\n", - "expireIn": "📅 Vence en: {{ .Time }}\r\n", - "active": "💡 Activo: {{ .Enable }}\r\n", - "enabled": "🚨 Habilitado: {{ .Enable }}\r\n", - "online": "🌐 Estado de conexión: {{ .Status }}\r\n", - "lastOnline": "🔙 Última conexión: {{ .Time }}\r\n", - "email": "📧 Email: {{ .Email }}\r\n", - "upload": "🔼 Subida: ↑{{ .Upload }}\r\n", - "download": "🔽 Bajada: ↓{{ .Download }}\r\n", - "total": "📊 Total: ↑↓{{ .UpDown }} / {{ .Total }}\r\n", - "TGUser": "👤 Usuario de Telegram: {{ .TelegramID }}\r\n", - "exhaustedMsg": "🚨 Agotado {{ .Type }}:\r\n", - "exhaustedCount": "🚨 Cantidad de Agotados {{ .Type }}:\r\n", - "onlinesCount": "🌐 Clientes en línea: {{ .Count }}\r\n", - "disabled": "🛑 Desactivado: {{ .Disabled }}\r\n", - "depleteSoon": "🔜 Se agotará pronto: {{ .Deplete }}\r\n\r\n", - "backupTime": "🗄 Hora de la Copia de Seguridad: {{ .Time }}\r\n", - "refreshedOn": "\r\n📋🔄 Actualizado en: {{ .Time }}\r\n\r\n", - "yes": "✅ Sí", - "no": "❌ No", - "received_id": "🔑📥 ID actualizado.", - "received_password": "🔑📥 Contraseña actualizada.", - "received_email": "📧📥 Correo electrónico actualizado.", - "received_comment": "💬📥 Comentario actualizado.", - "id_prompt": "🔑 ID predeterminado: {{ .ClientId }}\n\nIntroduce tu ID.", - "pass_prompt": "🔑 Contraseña predeterminada: {{ .ClientPassword }}\n\nIntroduce tu contraseña.", - "email_prompt": "📧 Correo electrónico predeterminado: {{ .ClientEmail }}\n\nIntroduce tu correo electrónico.", - "comment_prompt": "💬 Comentario predeterminado: {{ .ClientComment }}\n\nIntroduce tu comentario.", - "inbound_client_data_id": "🔄 Entrada: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 Correo: {{ .ClientEmail }}\n📊 Tráfico: {{ .ClientTraffic }}\n📅 Fecha de expiración: {{ .ClientExp }}\n🌐 Límite de IP: {{ .IpLimit }}\n💬 Comentario: {{ .ClientComment }}\n\n¡Ahora puedes agregar al cliente a la entrada!", - "inbound_client_data_pass": "🔄 Entrada: {{ .InboundRemark }}\n\n🔑 Contraseña: {{ .ClientPass }}\n📧 Correo: {{ .ClientEmail }}\n📊 Tráfico: {{ .ClientTraffic }}\n📅 Fecha de expiración: {{ .ClientExp }}\n🌐 Límite de IP: {{ .IpLimit }}\n💬 Comentario: {{ .ClientComment }}\n\n¡Ahora puedes agregar al cliente a la entrada!", - "cancel": "❌ ¡Proceso cancelado! \n\nPuedes /start de nuevo en cualquier momento. 🔄", - "error_add_client": "⚠️ Error:\n\n {{ .error }}", - "using_default_value": "Está bien, me quedaré con 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 🚫", - "AreYouSure": "¿Estás seguro? 🤔", - "SuccessResetTraffic": "📧 Correo: {{ .ClientEmail }}\n🏁 Resultado: ✅ Éxito", - "FailedResetTraffic": "📧 Correo: {{ .ClientEmail }}\n🏁 Resultado: ❌ Fallido \n\n🛠️ Error: [ {{ .ErrorMessage }} ]", - "FinishProcess": "🔚 Proceso de reinicio de tráfico finalizado para todos los clientes." - }, - "buttons": { - "closeKeyboard": "❌ Cerrar Teclado", - "cancel": "❌ Cancelar", - "cancelReset": "❌ Cancelar Reinicio", - "cancelIpLimit": "❌ Cancelar Límite de IP", - "confirmResetTraffic": "✅ ¿Confirmar Reinicio de Tráfico?", - "confirmClearIps": "✅ ¿Confirmar Limpiar IPs?", - "confirmRemoveTGUser": "✅ ¿Confirmar Eliminar Usuario de Telegram?", - "confirmToggle": "✅ ¿Confirmar habilitar/deshabilitar usuario?", - "dbBackup": "Obtener Copia de Seguridad de BD", - "serverUsage": "Uso del Servidor", - "getInbounds": "Obtener Entradas", - "depleteSoon": "Pronto se Agotará", - "clientUsage": "Obtener Uso", - "onlines": "Clientes en línea", - "commands": "Comandos", - "refresh": "🔄 Actualizar", - "clearIPs": "❌ Limpiar IPs", - "removeTGUser": "❌ Eliminar Usuario de Telegram", - "selectTGUser": "👤 Seleccionar Usuario de Telegram", - "selectOneTGUser": "👤 Selecciona un usuario de telegram:", - "resetTraffic": "📈 Reiniciar Tráfico", - "resetExpire": "📅 Cambiar fecha de Vencimiento", - "ipLog": "🔢 Registro de IP", - "ipLimit": "🔢 Límite de IP", - "setTGUser": "👤 Establecer Usuario de Telegram", - "toggle": "🔘 Habilitar / Deshabilitar", - "custom": "🔢 Costumbre", - "confirmNumber": "✅ Confirmar: {{ .Num }}", - "confirmNumberAdd": "✅ Confirmar agregando: {{ .Num }}", - "limitTraffic": "🚧 Límite de tráfico", - "getBanLogs": "Registros de prohibición", - "allClients": "Todos los Clientes", - "addClient": "Añadir cliente", - "submitDisable": "Enviar como deshabilitado ☑️", - "submitEnable": "Enviar como habilitado ✅", - "use_default": "🏷️ Usar por defecto", - "change_id": "⚙️🔑 ID", - "change_password": "⚙️🔑 Contraseña", - "change_email": "⚙️📧 Correo electrónico", - "change_comment": "⚙️💬 Comentario", - "ResetAllTraffics": "Reiniciar todo el tráfico", - "SortedTrafficUsageReport": "Informe de uso de tráfico ordenado" - }, "answers": { - "successfulOperation": "✅ ¡Exitosa!", - "errorOperation": "❗ Error en la Operación.", - "getInboundsFailed": "❌ Error al obtener las entradas", - "getClientsFailed": "❌ No se pudo obtener los clientes.", - "canceled": "❌ {{ .Email }} : Operación cancelada.", - "clientRefreshSuccess": "✅ {{ .Email }} : Cliente actualizado exitosamente.", "IpRefreshSuccess": "✅ {{ .Email }} : IPs actualizadas exitosamente.", "TGIdRefreshSuccess": "✅ {{ .Email }} : Usuario de Telegram del cliente actualizado exitosamente.", - "resetTrafficSuccess": "✅ {{ .Email }} : Tráfico reiniciado exitosamente.", - "setTrafficLimitSuccess": "✅ {{ .Email }} : Límite de Tráfico guardado exitosamente.", - "expireResetSuccess": "✅ {{ .Email }} : Días de vencimiento reiniciados exitosamente.", - "resetIpSuccess": "✅ {{ .Email }} : Límite de IP {{ .Count }} guardado exitosamente.", + "askToAddUserId": "¡No se encuentra su configuración!\r\nPor favor, pídale a su administrador que use su ChatID de usuario de Telegram en su(s) configuración(es).\r\n\r\nSu ChatID de usuario: \u003ccode\u003e{{ .TgUserID }}\u003c/code\u003e", + "canceled": "❌ {{ .Email }} : Operación cancelada.", + "chooseClient": "Elige un Cliente para Inbound {{ .Inbound }}", + "chooseInbound": "Elige un Inbound", "clearIpSuccess": "✅ {{ .Email }} : IPs limpiadas exitosamente.", + "clientRefreshSuccess": "✅ {{ .Email }} : Cliente actualizado exitosamente.", + "disableSuccess": "✅ {{ .Email }} : Deshabilitado exitosamente.", + "enableSuccess": "✅ {{ .Email }} : Habilitado exitosamente.", + "errorOperation": "❗ Error en la Operación.", + "expireResetSuccess": "✅ {{ .Email }} : Días de vencimiento reiniciados exitosamente.", + "getClientsFailed": "❌ No se pudo obtener los clientes.", + "getInboundsFailed": "❌ Error al obtener las entradas", "getIpLog": "✅ {{ .Email }} : Obtener Registro de IP.", "getUserInfo": "✅ {{ .Email }} : Obtener Información de Usuario de Telegram.", "removedTGUserSuccess": "✅ {{ .Email }} : Usuario de Telegram eliminado exitosamente.", - "enableSuccess": "✅ {{ .Email }} : Habilitado exitosamente.", - "disableSuccess": "✅ {{ .Email }} : Deshabilitado exitosamente.", - "askToAddUserId": "¡No se encuentra su configuración!\r\nPor favor, pídale a su administrador que use su ChatID de usuario de Telegram en su(s) configuración(es).\r\n\r\nSu ChatID de usuario: {{ .TgUserID }}", - "chooseClient": "Elige un Cliente para Inbound {{ .Inbound }}", - "chooseInbound": "Elige un Inbound" - } - } -} + "resetIpSuccess": "✅ {{ .Email }} : Límite de IP {{ .Count }} guardado exitosamente.", + "resetTrafficSuccess": "✅ {{ .Email }} : Tráfico reiniciado exitosamente.", + "setTrafficLimitSuccess": "✅ {{ .Email }} : Límite de Tráfico guardado exitosamente.", + "successfulOperation": "✅ ¡Exitosa!" + }, + "buttons": { + "ResetAllTraffics": "Reiniciar todo el tráfico", + "SortedTrafficUsageReport": "Informe de uso de tráfico ordenado", + "addClient": "Añadir cliente", + "allClients": "Todos los Clientes", + "cancel": "❌ Cancelar", + "cancelIpLimit": "❌ Cancelar Límite de IP", + "cancelReset": "❌ Cancelar Reinicio", + "change_comment": "⚙️💬 Comentario", + "change_email": "⚙️📧 Correo electrónico", + "change_flow": "🌊 Flow", + "change_id": "⚙️🔑 ID", + "change_password": "⚙️🔑 Contraseña", + "change_subid": "📝 Sub ID", + "clearIPs": "❌ Limpiar IPs", + "clientUsage": "Obtener Uso", + "closeKeyboard": "❌ Cerrar Teclado", + "commands": "Comandos", + "confirmClearIps": "✅ ¿Confirmar Limpiar IPs?", + "confirmNumber": "✅ Confirmar: {{ .Num }}", + "confirmNumberAdd": "✅ Confirmar agregando: {{ .Num }}", + "confirmRemoveTGUser": "✅ ¿Confirmar Eliminar Usuario de Telegram?", + "confirmResetTraffic": "✅ ¿Confirmar Reinicio de Tráfico?", + "confirmToggle": "✅ ¿Confirmar habilitar/deshabilitar usuario?", + "custom": "🔢 Costumbre", + "dbBackup": "Obtener Copia de Seguridad de BD", + "depleteSoon": "Pronto se Agotará", + "flow_none": "None", + "getBanLogs": "Registros de prohibición", + "getInbounds": "Obtener Entradas", + "ipLimit": "🔢 Límite de IP", + "ipLog": "🔢 Registro de IP", + "limitTraffic": "🚧 Límite de tráfico", + "onlines": "Clientes en línea", + "refresh": "🔄 Actualizar", + "removeTGUser": "❌ Eliminar Usuario de Telegram", + "resetExpire": "📅 Cambiar fecha de Vencimiento", + "resetTraffic": "📈 Reiniciar Tráfico", + "selectOneTGUser": "👤 Selecciona un usuario de telegram:", + "selectTGUser": "👤 Seleccionar Usuario de Telegram", + "serverUsage": "Uso del Servidor", + "setTGUser": "👤 Establecer Usuario de Telegram", + "submitDisable": "Enviar como deshabilitado ☑️", + "submitEnable": "Enviar como habilitado ✅", + "toggle": "🔘 Habilitar / Deshabilitar", + "use_default": "🏷️ Usar por defecto" + }, + "clients": "Clientes", + "commands": { + "getID": "🆔 Tu ID: \u003ccode\u003e{{ .ID }}\u003c/code\u003e", + "help": "🤖 ¡Bienvenido a este bot! Está diseñado para ofrecerte datos específicos del servidor y te permite hacer modificaciones según sea necesario.\r\n\r\n", + "helpAdminCommands": "Para reiniciar Xray Core:\r\n\u003ccode\u003e/restart\u003c/code\u003e\r\n\r\nPara buscar un correo electrónico de cliente:\r\n\u003ccode\u003e/usage [Correo electrónico]\u003c/code\u003e\r\n\r\nPara buscar entradas (con estadísticas de cliente):\r\n\u003ccode\u003e/inbound [Observación]\u003c/code\u003e\r\n\r\nID de Chat de Telegram:\r\n\u003ccode\u003e/id\u003c/code\u003e", + "helpClientCommands": "Para buscar estadísticas, utiliza el siguiente comando:\r\n\u003ccode\u003e/usage [Correo electrónico]\u003c/code\u003e\r\n\r\nID de Chat de Telegram:\r\n\u003ccode\u003e/id\u003c/code\u003e", + "helpDesc": "Ayuda del bot", + "idDesc": "Mostrar tu ID de Telegram", + "pleaseChoose": "👇 Por favor elige:\r\n", + "restartFailed": "❗ Error en la operación.\r\n\r\n\u003ccode\u003eError: {{ .Error }}\u003c/code\u003e.", + "restartSuccess": "✅ ¡Operación exitosa!", + "restartUsage": "\r\n\r\n\u003ccode\u003e/restart\u003c/code\u003e", + "start": "👋 Hola \u003ci\u003e{{ .Firstname }}\u003c/i\u003e.\r\n", + "startDesc": "Mostrar el menú principal", + "status": "✅ ¡El bot está bien!", + "statusDesc": "Comprobar el estado del bot", + "unknown": "❗ Comando desconocido", + "usage": "❗ ¡Por favor proporciona un texto para buscar!", + "welcome": "🤖 Bienvenido al bot de gestión de \u003cb\u003e{{ .Hostname }}\u003c/b\u003e.\r\n", + "xrayNotRunning": "❗ Xray Core no está en ejecución." + }, + "day": "Día", + "days": "Días", + "hours": "Horas", + "inbounds": "Entradas", + "keyboardClosed": "❌ Teclado cerrado!", + "messages": { + "2faFailed": "Error de 2FA", + "AreYouSure": "¿Estás seguro? 🤔", + "FailedResetTraffic": "📧 Correo: {{ .ClientEmail }}\n🏁 Resultado: ❌ Fallido \n\n🛠️ Error: [ {{ .ErrorMessage }} ]", + "FinishProcess": "🔚 Proceso de reinicio de tráfico finalizado para todos los clientes.", + "SuccessResetTraffic": "📧 Correo: {{ .ClientEmail }}\n🏁 Resultado: ✅ Éxito", + "TGUser": "👤 Usuario de Telegram: {{ .TelegramID }}\r\n", + "active": "💡 Activo: {{ .Enable }}\r\n", + "backupTime": "🗄 Hora de la Copia de Seguridad: {{ .Time }}\r\n", + "cancel": "❌ ¡Proceso cancelado! \n\nPuedes /start de nuevo en cualquier momento. 🔄", + "client_flow": "Flow:", + "client_subid": "Sub ID:", + "comment_prompt": "💬 Comentario predeterminado: {{ .ClientComment }}\n\nIntroduce tu comentario.", + "cpuThreshold": "🔴 El uso de CPU {{ .Percent }}% es mayor que el umbral {{ .Threshold }}%", + "datetime": "⏰ Fecha y Hora: {{ .DateTime }}\r\n", + "depleteSoon": "🔜 Se agotará pronto: {{ .Deplete }}\r\n\r\n", + "disabled": "🛑 Desactivado: {{ .Disabled }}\r\n", + "download": "🔽 Bajada: ↓{{ .Download }}\r\n", + "email": "📧 Email: {{ .Email }}\r\n", + "email_prompt": "📧 Correo electrónico predeterminado: {{ .ClientEmail }}\n\nIntroduce tu correo electrónico.", + "enabled": "🚨 Habilitado: {{ .Enable }}\r\n", + "error_add_client": "⚠️ Error:\n\n {{ .error }}", + "exhaustedCount": "🚨 Cantidad de Agotados {{ .Type }}:\r\n", + "exhaustedMsg": "🚨 Agotado {{ .Type }}:\r\n", + "expire": "📅 Fecha de Vencimiento: {{ .Time }}\r\n", + "expireIn": "📅 Vence en: {{ .Time }}\r\n", + "hostname": "💻 Nombre del Host: {{ .Hostname }}\r\n", + "id_prompt": "🔑 ID predeterminado: {{ .ClientId }}\n\nIntroduce tu ID.", + "inbound": "📍 Inbound: {{ .Remark }}\r\n", + "inbound_client_data_id": "🔄 Entrada: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 Correo: {{ .ClientEmail }}\n📊 Tráfico: {{ .ClientTraffic }}\n📅 Fecha de expiración: {{ .ClientExp }}\n🌐 Límite de IP: {{ .IpLimit }}\n💬 Comentario: {{ .ClientComment }}\n\n¡Ahora puedes agregar al cliente a la entrada!", + "inbound_client_data_pass": "🔄 Entrada: {{ .InboundRemark }}\n\n🔑 Contraseña: {{ .ClientPass }}\n📧 Correo: {{ .ClientEmail }}\n📊 Tráfico: {{ .ClientTraffic }}\n📅 Fecha de expiración: {{ .ClientExp }}\n🌐 Límite de IP: {{ .IpLimit }}\n💬 Comentario: {{ .ClientComment }}\n\n¡Ahora puedes agregar al cliente a la entrada!", + "incorrect_input": "Tu entrada no es válida.\nLas frases deben ser continuas sin espacios.\nEjemplo correcto: aaaaaa\nEjemplo incorrecto: aaa aaa 🚫", + "invalid_subid": "Invalid format.\nSub ID can only contain letters, numbers, hyphens (-), and underscores (_).\nSpaces and special characters are not allowed. 🚫", + "ip": "🌐 IP: {{ .IP }}\r\n", + "ips": "🔢 IPs:\r\n{{ .IPs }}\r\n", + "ipv4": "🌐 IPv4: {{ .IPv4 }}\r\n", + "ipv6": "🌐 IPv6: {{ .IPv6 }}\r\n", + "lastOnline": "🔙 Última conexión: {{ .Time }}\r\n", + "loginFailed": "❗️ Falló el inicio de sesión en el panel.\r\n", + "loginSuccess": "✅ Has iniciado sesión en el panel con éxito.\r\n", + "no": "❌ No", + "online": "🌐 Estado de conexión: {{ .Status }}\r\n", + "onlinesCount": "🌐 Clientes en línea: {{ .Count }}\r\n", + "pass_prompt": "🔑 Contraseña predeterminada: {{ .ClientPassword }}\n\nIntroduce tu contraseña.", + "port": "🔌 Puerto: {{ .Port }}\r\n", + "reason": "❗️ Motivo: {{ .Reason }}\r\n", + "received_comment": "💬📥 Comentario actualizado.", + "received_email": "📧📥 Correo electrónico actualizado.", + "received_id": "🔑📥 ID actualizado.", + "received_password": "🔑📥 Contraseña actualizada.", + "received_subid": "Sub ID updated successfully!", + "refreshedOn": "\r\n📋🔄 Actualizado en: {{ .Time }}\r\n\r\n", + "report": "🕰 Informes programados: {{ .RunTime }}\r\n", + "selectUserFailed": "❌ ¡Error al seleccionar usuario!", + "serverLoad": "📈 Carga del servidor: {{ .Load1 }}, {{ .Load2 }}, {{ .Load3 }}\r\n", + "serverMemory": "📋 Memoria del servidor: {{ .Current }}/{{ .Total }}\r\n", + "serverUpTime": "⏳ Tiempo de actividad del servidor: {{ .UpTime }} {{ .Unit }}\r\n", + "subid_prompt": "Please enter new Sub ID:\nCurrent: {{.ClientSubId}}", + "tcpCount": "🔹 Conteo de TCP: {{ .Count }}\r\n", + "time": "⏰ Hora: {{ .Time }}\r\n", + "total": "📊 Total: ↑↓{{ .UpDown }} / {{ .Total }}\r\n", + "traffic": "🚦 Tráfico: {{ .Total }} (↑{{ .Upload }},↓{{ .Download }})\r\n", + "udpCount": "🔸 Conteo de UDP: {{ .Count }}\r\n", + "upload": "🔼 Subida: ↑{{ .Upload }}\r\n", + "userSaved": "✅ Usuario de Telegram guardado.", + "username": "👤 Nombre de usuario: {{ .Username }}\r\n", + "using_default_value": "Está bien, me quedaré con el valor predeterminado. 😊", + "version": "🚀 Versión de X-UI: {{ .Version }}\r\n", + "xrayStatus": "ℹ️ Estado de Xray: {{ .State }}\r\n", + "xrayVersion": "📡 Versión de Xray: {{ .XrayVersion }}\r\n", + "yes": "✅ Sí" + }, + "minutes": "Minutos", + "month": "Mes", + "months": "Meses", + "noInbounds": "❗ ¡No se encontraron entradas!", + "noIpRecord": "❗ ¡No hay registro de IP!", + "noQuery": "❌ ¡Consulta no encontrada! ¡Por favor, use el comando nuevamente!", + "noResult": "❗ ¡Sin resultados!", + "offline": "🔴 Desconectado", + "online": "🟢 En línea", + "unknown": "Desconocido", + "unlimited": "♾ Ilimitado (Restablecer)", + "wentWrong": "❌ ¡Algo salió mal!" + }, + "transmission": "Transmisión", + "twoFactorCode": "Código", + "unlimited": "Ilimitado", + "update": "Actualizar", + "usage": "Uso", + "useIPv4ForHost": "Usar IPv4 para el host", + "username": "Nombre de Usuario" +} \ No newline at end of file diff --git a/web/translation/id-ID.json b/web/translation/id-ID.json index c651d64f..905761b3 100644 --- a/web/translation/id-ID.json +++ b/web/translation/id-ID.json @@ -1,750 +1,604 @@ { - "username": "Nama Pengguna", - "password": "Kata Sandi", - "login": "Masuk", - "confirm": "Konfirmasi", - "cancel": "Batal", - "close": "Tutup", - "save": "Simpan", - "logout": "Keluar", - "create": "Buat", - "update": "Perbarui", - "copy": "Salin", - "copied": "Tersalin", - "download": "Unduh", - "remark": "Catatan", - "enable": "Aktifkan", - "protocol": "Protokol", - "search": "Cari", - "filter": "Filter", - "loading": "Memuat...", - "second": "Detik", - "minute": "Menit", - "hour": "Jam", - "day": "Hari", - "check": "Centang", - "indefinite": "Tak Terbatas", - "unlimited": "Tanpa Batas", - "none": "None", - "qrCode": "Kode QR", - "info": "Informasi Lebih Lanjut", - "edit": "Edit", - "delete": "Hapus", - "reset": "Reset", - "noData": "Tidak ada data.", - "copySuccess": "Berhasil Disalin", - "sure": "Yakin", - "encryption": "Enkripsi", - "useIPv4ForHost": "Gunakan IPv4 untuk host", - "transmission": "Transmisi", - "host": "Host", - "path": "Jalur", "camouflage": "Obfuscation", - "status": "Status", - "enabled": "Aktif", - "disabled": "Nonaktif", + "cancel": "Batal", + "certificate": "Sertifikat Digital", + "check": "Centang", + "clients": "Klien", + "close": "Tutup", + "comment": "Komentar", + "confirm": "Konfirmasi", + "copied": "Tersalin", + "copy": "Salin", + "copySuccess": "Berhasil Disalin", + "create": "Buat", + "day": "Hari", + "delete": "Hapus", "depleted": "Habis", "depletingSoon": "Akan Habis", - "offline": "Offline", - "online": "Online", + "disabled": "Nonaktif", "domainName": "Nama Domain", - "monitor": "IP Pemantauan", - "certificate": "Sertifikat Digital", - "fail": "Gagal", - "comment": "Komentar", - "success": "Berhasil", - "lastOnline": "Terakhir online", - "getVersion": "Dapatkan Versi", - "install": "Instal", - "clients": "Klien", - "usage": "Penggunaan", - "twoFactorCode": "Kode", - "remained": "Tersisa", - "security": "Keamanan", - "secAlertTitle": "Peringatan keamanan", - "secAlertSsl": "Koneksi ini tidak aman. Harap hindari memasukkan informasi sensitif sampai TLS diaktifkan untuk perlindungan data.", - "secAlertConf": "Beberapa pengaturan rentan terhadap serangan. Disarankan untuk memperkuat protokol keamanan guna mencegah pelanggaran potensial.", - "secAlertSSL": "Panel kekurangan koneksi yang aman. Harap instal sertifikat TLS untuk perlindungan data.", - "secAlertPanelPort": "Port default panel rentan. Harap konfigurasi port acak atau tertentu.", - "secAlertPanelURI": "Jalur URI default panel tidak aman. Harap konfigurasi jalur URI kompleks.", - "secAlertSubURI": "Jalur URI default langganan tidak aman. Harap konfigurasi jalur URI kompleks.", - "secAlertSubJsonURI": "Jalur URI default JSON langganan tidak aman. Harap konfigurasikan jalur URI kompleks.", + "download": "Unduh", + "edit": "Edit", + "emptyBalancersDesc": "Tidak ada penyeimbang yang ditambahkan.", "emptyDnsDesc": "Tidak ada server DNS yang ditambahkan.", "emptyFakeDnsDesc": "Tidak ada server Fake DNS yang ditambahkan.", - "emptyBalancersDesc": "Tidak ada penyeimbang yang ditambahkan.", "emptyReverseDesc": "Tidak ada proxy terbalik yang ditambahkan.", - "somethingWentWrong": "Terjadi kesalahan", - "subscription": { - "title": "Info langganan", - "subId": "ID langganan", - "status": "Status", - "downloaded": "Diunduh", - "uploaded": "Diunggah", - "expiry": "Kedaluwarsa", - "totalQuota": "Kuota total", - "individualLinks": "Tautan individual", - "active": "Aktif", - "inactive": "Nonaktif", - "unlimited": "Tanpa batas", - "noExpiry": "Tanpa kedaluwarsa" - }, + "enable": "Aktifkan", + "enabled": "Aktif", + "encryption": "Enkripsi", + "fail": "Gagal", + "filter": "Filter", + "getVersion": "Dapatkan Versi", + "host": "Host", + "hour": "Jam", + "indefinite": "Tak Terbatas", + "info": "Informasi Lebih Lanjut", + "install": "Instal", + "lastOnline": "Terakhir online", + "loading": "Memuat...", + "login": "Masuk", + "logout": "Keluar", "menu": { - "theme": "Tema", + "apiDocs": "Dokumentasi API", "dark": "Gelap", - "ultraDark": "Sangat Gelap", "dashboard": "Ikhtisar", "inbounds": "Masuk", + "link": "Kelola", + "logout": "Keluar", "nodes": "Node", "settings": "Pengaturan Panel", - "xray": "Konfigurasi Xray", - "apiDocs": "Dokumentasi API", - "logout": "Keluar", - "link": "Kelola" + "theme": "Tema", + "ultraDark": "Sangat Gelap", + "xray": "Konfigurasi Xray" }, + "minute": "Menit", + "monitor": "IP Pemantauan", + "noData": "Tidak ada data.", + "none": "None", + "offline": "Offline", + "online": "Online", "pages": { - "login": { - "hello": "Halo", - "title": "Selamat Datang", - "loginAgain": "Sesi Anda telah berakhir, harap masuk kembali", - "toasts": { - "invalidFormData": "Format data input tidak valid.", - "emptyUsername": "Nama Pengguna diperlukan", - "emptyPassword": "Kata Sandi diperlukan", - "wrongUsernameOrPassword": "Username, kata sandi, atau kode dua faktor tidak valid.", - "successLogin": "Anda telah berhasil masuk ke akun Anda." - } - }, - "index": { - "title": "Ikhtisar", - "cpu": "CPU", - "logicalProcessors": "Prosesor logis", - "frequency": "Frekuensi", - "swap": "Swap", - "storage": "Penyimpanan", - "memory": "RAM", - "threads": "Thread", - "xrayStatus": "Xray", - "stopXray": "Stop", - "restartXray": "Restart", - "xraySwitch": "Versi", - "xraySwitchClick": "Pilih versi yang ingin Anda pindah.", - "xraySwitchClickDesk": "Pilih dengan hati-hati, karena versi yang lebih lama mungkin tidak kompatibel dengan konfigurasi saat ini.", - "xrayUpdates": "Pembaruan Xray", - "updatePanel": "Perbarui Panel", - "panelUpdateDesc": "Ini akan memperbarui 3X-UI ke rilis terbaru dan me-restart layanan panel.", - "currentPanelVersion": "Versi panel saat ini", - "latestPanelVersion": "Versi panel terbaru", - "panelUpToDate": "Panel sudah terbaru", - "upToDate": "Terbaru", - "xrayStatusUnknown": "Tidak diketahui", - "xrayStatusRunning": "Berjalan", - "xrayStatusStop": "Berhenti", - "xrayStatusError": "Kesalahan", - "xrayErrorPopoverTitle": "Terjadi kesalahan saat menjalankan Xray", - "operationHours": "Waktu Aktif", - "systemHistoryTitle": "Riwayat Sistem", - "charts": "Grafik", - "xrayMetricsTitle": "Metrik Xray", - "xrayMetricsDisabled": "Endpoint metrik Xray belum dikonfigurasi", - "xrayMetricsHint": "Tambahkan blok metrics tingkat atas ke konfigurasi xray dengan tag metrics_out dan listen 127.0.0.1:11111, lalu mulai ulang xray.", - "xrayObservatoryEmpty": "Belum ada data Observatory", - "xrayObservatoryHint": "Tambahkan blok observatory ke konfigurasi xray yang mencantumkan tag outbound untuk diuji, lalu mulai ulang xray.", - "xrayObservatoryTagPlaceholder": "Pilih outbound", - "xrayObservatoryAlive": "Aktif", - "xrayObservatoryDead": "Mati", - "xrayObservatoryLastSeen": "Terakhir terlihat", - "xrayObservatoryLastTry": "Percobaan terakhir", - "trendLast2Min": "2 menit terakhir", - "systemLoad": "Beban Sistem", - "systemLoadDesc": "Rata-rata beban sistem selama 1, 5, dan 15 menit terakhir", - "connectionCount": "Statistik Koneksi", - "ipAddresses": "Alamat IP", - "toggleIpVisibility": "Alihkan visibilitas IP", - "overallSpeed": "Kecepatan keseluruhan", - "upload": "Unggah", - "download": "Unduh", - "totalData": "Total data", - "sent": "Dikirim", - "received": "Diterima", - "documentation": "Dokumentasi", - "xraySwitchVersionDialog": "Apakah Anda yakin ingin mengubah versi Xray?", - "xraySwitchVersionDialogDesc": "Ini akan mengubah versi Xray ke #version#.", - "xraySwitchVersionPopover": "Xray berhasil diperbarui", - "panelUpdateDialog": "Apakah Anda benar-benar ingin memperbarui panel?", - "panelUpdateDialogDesc": "Ini akan memperbarui 3X-UI ke #version# dan me-restart layanan panel.", - "panelUpdateCheckPopover": "Pemeriksaan pembaruan panel gagal", - "panelUpdateStartedPopover": "Pembaruan panel dimulai", - "geofileUpdateDialog": "Apakah Anda yakin ingin memperbarui geofile?", - "geofileUpdateDialogDesc": "Ini akan memperbarui file #filename#.", - "geofilesUpdateDialogDesc": "Ini akan memperbarui semua berkas.", - "geofilesUpdateAll": "Perbarui semua", - "geofileUpdatePopover": "Geofile berhasil diperbarui", - "dontRefresh": "Instalasi sedang berlangsung, harap jangan menyegarkan halaman ini", - "logs": "Log", - "config": "Konfigurasi", - "backup": "Cadangan", - "backupTitle": "Cadangan & Pulihkan", - "exportDatabase": "Cadangkan", - "exportDatabaseDesc": "Klik untuk mengunduh file .db yang berisi cadangan dari database Anda saat ini ke perangkat Anda.", - "importDatabase": "Pulihkan", - "importDatabaseDesc": "Klik untuk memilih dan mengunggah file .db dari perangkat Anda untuk memulihkan database dari cadangan.", - "importDatabaseSuccess": "Database berhasil diimpor", - "importDatabaseError": "Terjadi kesalahan saat mengimpor database", - "readDatabaseError": "Terjadi kesalahan saat membaca database", - "getDatabaseError": "Terjadi kesalahan saat mengambil database", - "getConfigError": "Terjadi kesalahan saat mengambil file konfigurasi", - "customGeoTitle": "GeoSite / GeoIP kustom", - "customGeoAdd": "Tambah", - "customGeoType": "Jenis", - "customGeoAlias": "Alias", - "customGeoUrl": "URL", - "customGeoEnabled": "Aktif", - "customGeoLastUpdated": "Terakhir diperbarui", - "customGeoExtColumn": "Routing (ext:…)", - "customGeoToastUpdateAll": "Semua sumber kustom telah diperbarui", - "customGeoActions": "Aksi", - "customGeoEdit": "Edit", - "customGeoDelete": "Hapus", - "customGeoDownload": "Perbarui sekarang", - "customGeoModalAdd": "Tambah geo kustom", - "customGeoModalEdit": "Edit geo kustom", - "customGeoModalSave": "Simpan", - "customGeoDeleteConfirm": "Hapus sumber geo kustom ini?", - "customGeoRoutingHint": "Pada aturan routing gunakan kolom nilai sebagai ext:file.dat:tag (ganti tag).", - "customGeoInvalidId": "ID sumber tidak valid", - "customGeoAliasesError": "Gagal memuat alias geo kustom", - "customGeoValidationAlias": "Alias hanya huruf kecil, angka, - dan _", - "customGeoValidationUrl": "URL harus diawali http:// atau https://", - "customGeoAliasPlaceholder": "a-z 0-9 _ -", - "customGeoAliasLabelSuffix": " (kustom)", - "customGeoToastList": "Daftar geo kustom", - "customGeoToastAdd": "Tambah geo kustom", - "customGeoToastUpdate": "Perbarui geo kustom", - "customGeoToastDelete": "Geofile kustom “{{ .fileName }}” dihapus", - "customGeoToastDownload": "Geofile “{{ .fileName }}” diperbarui", - "customGeoErrInvalidType": "Jenis harus geosite atau geoip", - "customGeoErrAliasRequired": "Alias wajib diisi", - "customGeoErrAliasPattern": "Alias berisi karakter yang tidak diizinkan", - "customGeoErrAliasReserved": "Alias ini dicadangkan", - "customGeoErrUrlRequired": "URL wajib diisi", - "customGeoErrInvalidUrl": "URL tidak valid", - "customGeoErrUrlScheme": "URL harus memakai http atau https", - "customGeoErrUrlHost": "Host URL tidak valid", - "customGeoErrDuplicateAlias": "Alias ini sudah dipakai untuk jenis ini", - "customGeoErrNotFound": "Sumber geo kustom tidak ditemukan", - "customGeoErrDownload": "Unduh gagal", - "customGeoErrUpdateAllIncomplete": "Satu atau lebih sumber geo kustom gagal diperbarui", - "customGeoEmpty": "Belum ada sumber geo kustom — klik Tambah untuk membuatnya" + "client": { + "add": "Tambah Klien", + "bulk": "Tambahkan Massal", + "clearAll": "Hapus semua", + "clientCount": "Jumlah Klien", + "copyEmailPreview": "Pratinjau email hasil", + "copyFlowHint": "Diterapkan ke semua klien yang disalin. Biarkan kosong untuk melewati.", + "copyFlowLabel": "Flow untuk klien baru (VLESS)", + "copyFromInbound": "Salin klien dari inbound", + "copyResult": "Hasil penyalinan", + "copyResultErrors": "Kesalahan penyalinan", + "copyResultNone": "Tidak ada yang disalin: tidak ada klien yang dipilih atau sumber kosong", + "copyResultSuccess": "Berhasil disalin", + "copySelectSourceFirst": "Silakan pilih inbound sumber terlebih dahulu.", + "copySelected": "Salin yang dipilih", + "copySource": "Sumber", + "copyToInbound": "Salin klien ke", + "days": "Hari", + "delayedStart": "Mulai Awal", + "edit": "Edit Klien", + "expireDays": "Durasi", + "first": "Pertama", + "last": "Terakhir", + "method": "Metode", + "postfix": "Akhiran", + "prefix": "Awalan", + "renew": "Perpanjang Otomatis", + "renewDesc": "Perpanjangan otomatis setelah kedaluwarsa. (0 = nonaktif)(unit: hari)", + "selectAll": "Pilih semua", + "submitAdd": "Tambah Klien", + "submitEdit": "Simpan Perubahan" }, "inbounds": { - "allTimeTraffic": "Total Lalu Lintas", - "allTimeTrafficUsage": "Total Penggunaan Sepanjang Waktu", - "title": "Masuk", - "totalDownUp": "Total Terkirim/Diterima", - "totalUsage": "Penggunaan Total", - "inboundCount": "Total Masuk", - "operate": "Menu", - "enable": "Aktifkan", - "remark": "Catatan", - "node": "Node", - "deployTo": "Terapkan ke", - "localPanel": "Panel lokal", - "protocol": "Protokol", - "port": "Port", - "portMap": "Port Mapping", - "traffic": "Traffic", - "details": "Rincian", - "transportConfig": "Transport", - "expireDate": "Durasi", - "createdAt": "Dibuat", - "updatedAt": "Diperbarui", - "resetTraffic": "Reset Traffic", - "addInbound": "Tambahkan Masuk", - "generalActions": "Tindakan Umum", - "modifyInbound": "Ubah Masuk", - "deleteInbound": "Hapus Masuk", - "deleteInboundContent": "Apakah Anda yakin ingin menghapus masuk?", - "deleteClient": "Hapus Klien", - "deleteClientContent": "Apakah Anda yakin ingin menghapus klien?", - "resetTrafficContent": "Apakah Anda yakin ingin mereset traffic?", - "copyLink": "Salin URL", - "address": "Alamat", - "network": "Jaringan", - "destinationPort": "Port Tujuan", - "targetAddress": "Alamat Target", - "monitorDesc": "Biarkan kosong untuk mendengarkan semua IP", - "meansNoLimit": "= Unlimited. (unit: GB)", - "totalFlow": "Total Aliran", - "leaveBlankToNeverExpire": "Biarkan kosong untuk tidak pernah kedaluwarsa", - "noRecommendKeepDefault": "Disarankan untuk tetap menggunakan pengaturan default", - "certificatePath": "Path Berkas", - "certificateContent": "Konten Berkas", - "publicKey": "Kunci Publik", - "privatekey": "Kunci Pribadi", - "clickOnQRcode": "Klik pada Kode QR untuk Menyalin", - "client": "Klien", - "export": "Ekspor Semua URL", - "clone": "Duplikat", - "cloneInbound": "Duplikat", - "cloneInboundContent": "Semua pengaturan masuk ini, kecuali Port, Listening IP, dan Klien, akan diterapkan pada duplikat.", - "cloneInboundOk": "Duplikat", - "resetAllTraffic": "Reset Semua Traffic Masuk", - "resetAllTrafficTitle": "Reset Semua Traffic Masuk", - "resetAllTrafficContent": "Apakah Anda yakin ingin mereset traffic semua masuk?", - "resetInboundClientTraffics": "Reset Traffic Klien Masuk", - "resetInboundClientTrafficTitle": "Reset Traffic Klien Masuk", - "resetInboundClientTrafficContent": "Apakah Anda yakin ingin mereset traffic klien masuk ini?", - "resetAllClientTraffics": "Reset Traffic Semua Klien", - "resetAllClientTrafficTitle": "Reset Traffic Semua Klien", - "resetAllClientTrafficContent": "Apakah Anda yakin ingin mereset traffic semua klien?", - "delDepletedClients": "Hapus Klien Habis", - "delDepletedClientsTitle": "Hapus Klien Habis", - "delDepletedClientsContent": "Apakah Anda yakin ingin menghapus semua klien yang habis?", - "email": "Email", - "emailDesc": "Harap berikan alamat email yang unik.", "IPLimit": "Batas IP", "IPLimitDesc": "Menonaktifkan masuk jika jumlah melebihi nilai yang ditetapkan. (0 = nonaktif)", "IPLimitlog": "Log IP", "IPLimitlogDesc": "Log histori IP. (untuk mengaktifkan masuk setelah menonaktifkan, hapus log)", "IPLimitlogclear": "Hapus Log", - "setDefaultCert": "Atur Sertifikat dari Panel", - "telegramDesc": "Harap berikan ID Obrolan Telegram. (gunakan perintah '/id' di bot) atau ({'@'}userinfobot)", - "subscriptionDesc": "Untuk menemukan URL langganan Anda, buka 'Rincian'. Selain itu, Anda dapat menggunakan nama yang sama untuk beberapa klien.", - "info": "Info", - "same": "Sama", - "inboundData": "Data Masuk", + "addInbound": "Tambahkan Masuk", + "address": "Alamat", + "allTimeTraffic": "Total Lalu Lintas", + "allTimeTrafficUsage": "Total Penggunaan Sepanjang Waktu", + "certificateContent": "Konten Berkas", + "certificatePath": "Path Berkas", + "clickOnQRcode": "Klik pada Kode QR untuk Menyalin", + "client": "Klien", + "clone": "Duplikat", + "cloneInbound": "Duplikat", + "cloneInboundContent": "Semua pengaturan masuk ini, kecuali Port, Listening IP, dan Klien, akan diterapkan pada duplikat.", + "cloneInboundOk": "Duplikat", + "copyLink": "Salin URL", + "createdAt": "Dibuat", + "delDepletedClients": "Hapus Klien Habis", + "delDepletedClientsContent": "Apakah Anda yakin ingin menghapus semua klien yang habis?", + "delDepletedClientsTitle": "Hapus Klien Habis", + "deleteClient": "Hapus Klien", + "deleteClientContent": "Apakah Anda yakin ingin menghapus klien?", + "deleteInbound": "Hapus Masuk", + "deleteInboundContent": "Apakah Anda yakin ingin menghapus masuk?", + "deployTo": "Terapkan ke", + "destinationPort": "Port Tujuan", + "details": "Rincian", + "email": "Email", + "emailDesc": "Harap berikan alamat email yang unik.", + "enable": "Aktifkan", + "expireDate": "Durasi", + "export": "Ekspor Semua URL", "exportInbound": "Ekspor Masuk", + "generalActions": "Tindakan Umum", "import": "Impor", "importInbound": "Impor Masuk", - "periodicTrafficResetTitle": "Reset Trafik Berkala", - "periodicTrafficResetDesc": "Reset otomatis penghitung trafik pada interval tertentu", + "inboundCount": "Total Masuk", + "inboundData": "Data Masuk", + "info": "Info", "lastReset": "Reset Terakhir", + "leaveBlankToNeverExpire": "Biarkan kosong untuk tidak pernah kedaluwarsa", + "localPanel": "Panel lokal", + "meansNoLimit": "= Unlimited. (unit: GB)", + "modifyInbound": "Ubah Masuk", + "monitorDesc": "Biarkan kosong untuk mendengarkan semua IP", + "network": "Jaringan", + "noRecommendKeepDefault": "Disarankan untuk tetap menggunakan pengaturan default", + "node": "Node", + "operate": "Menu", "periodicTrafficReset": { - "never": "Tidak Pernah", "daily": "Harian", - "weekly": "Mingguan", + "hourly": "Setiap jam", "monthly": "Bulanan", - "hourly": "Setiap jam" + "never": "Tidak Pernah", + "weekly": "Mingguan" }, + "periodicTrafficResetDesc": "Reset otomatis penghitung trafik pada interval tertentu", + "periodicTrafficResetTitle": "Reset Trafik Berkala", + "port": "Port", + "portMap": "Port Mapping", + "privatekey": "Kunci Pribadi", + "protocol": "Protokol", + "publicKey": "Kunci Publik", + "remark": "Catatan", + "resetAllClientTrafficContent": "Apakah Anda yakin ingin mereset traffic semua klien?", + "resetAllClientTrafficTitle": "Reset Traffic Semua Klien", + "resetAllClientTraffics": "Reset Traffic Semua Klien", + "resetAllTraffic": "Reset Semua Traffic Masuk", + "resetAllTrafficContent": "Apakah Anda yakin ingin mereset traffic semua masuk?", + "resetAllTrafficTitle": "Reset Semua Traffic Masuk", + "resetInboundClientTrafficContent": "Apakah Anda yakin ingin mereset traffic klien masuk ini?", + "resetInboundClientTrafficTitle": "Reset Traffic Klien Masuk", + "resetInboundClientTraffics": "Reset Traffic Klien Masuk", + "resetTraffic": "Reset Traffic", + "resetTrafficContent": "Apakah Anda yakin ingin mereset traffic?", + "same": "Sama", + "setDefaultCert": "Atur Sertifikat dari Panel", + "stream": { + "general": { + "name": "Nama", + "request": "Permintaan", + "response": "Respons", + "value": "Nilai" + }, + "tcp": { + "method": "Metode", + "path": "Path", + "requestHeader": "Header Permintaan", + "responseHeader": "Header Respons", + "status": "Status", + "statusDescription": "Deskripsi Status", + "version": "Versi" + } + }, + "subscriptionDesc": "Untuk menemukan URL langganan Anda, buka 'Rincian'. Selain itu, Anda dapat menggunakan nama yang sama untuk beberapa klien.", + "targetAddress": "Alamat Target", + "telegramDesc": "Harap berikan ID Obrolan Telegram. (gunakan perintah '/id' di bot) atau ({'@'}userinfobot)", + "title": "Masuk", "toasts": { - "obtain": "Dapatkan", - "updateSuccess": "Pembaruan berhasil", - "logCleanSuccess": "Log telah dibersihkan", - "inboundsUpdateSuccess": "Inbound berhasil diperbarui", - "inboundUpdateSuccess": "Inbound berhasil diperbarui", - "inboundCreateSuccess": "Inbound berhasil dibuat", - "inboundDeleteSuccess": "Inbound berhasil dihapus", + "delDepletedClientsSuccess": "Semua klien yang habis telah dihapus", + "getNewVlessEncError": "Terjadi kesalahan saat mendapatkan sertifikat VlessEnc.", + "getNewX25519CertError": "Terjadi kesalahan saat mendapatkan sertifikat X25519.", + "getNewmldsa65Error": "Terjadi kesalahan saat mendapatkan sertifikat mldsa65.", "inboundClientAddSuccess": "Klien inbound telah ditambahkan", "inboundClientDeleteSuccess": "Klien inbound telah dihapus", "inboundClientUpdateSuccess": "Klien inbound telah diperbarui", - "delDepletedClientsSuccess": "Semua klien yang habis telah dihapus", + "inboundCreateSuccess": "Inbound berhasil dibuat", + "inboundDeleteSuccess": "Inbound berhasil dihapus", + "inboundUpdateSuccess": "Inbound berhasil diperbarui", + "inboundsUpdateSuccess": "Inbound berhasil diperbarui", + "logCleanSuccess": "Log telah dibersihkan", + "obtain": "Dapatkan", "resetAllClientTrafficSuccess": "Semua lalu lintas klien telah direset", "resetAllTrafficSuccess": "Semua lalu lintas telah direset", "resetInboundClientTrafficSuccess": "Lalu lintas telah direset", "trafficGetError": "Gagal mendapatkan data lalu lintas", - "getNewX25519CertError": "Terjadi kesalahan saat mendapatkan sertifikat X25519.", - "getNewmldsa65Error": "Terjadi kesalahan saat mendapatkan sertifikat mldsa65.", - "getNewVlessEncError": "Terjadi kesalahan saat mendapatkan sertifikat VlessEnc." + "updateSuccess": "Pembaruan berhasil" }, - "stream": { - "general": { - "request": "Permintaan", - "response": "Respons", - "name": "Nama", - "value": "Nilai" - }, - "tcp": { - "version": "Versi", - "method": "Metode", - "path": "Path", - "status": "Status", - "statusDescription": "Deskripsi Status", - "requestHeader": "Header Permintaan", - "responseHeader": "Header Respons" - } - } + "totalDownUp": "Total Terkirim/Diterima", + "totalFlow": "Total Aliran", + "totalUsage": "Penggunaan Total", + "traffic": "Traffic", + "transportConfig": "Transport", + "updatedAt": "Diperbarui" }, - "client": { - "add": "Tambah Klien", - "edit": "Edit Klien", - "submitAdd": "Tambah Klien", - "submitEdit": "Simpan Perubahan", - "clientCount": "Jumlah Klien", - "bulk": "Tambahkan Massal", - "copyFromInbound": "Salin klien dari inbound", - "copyToInbound": "Salin klien ke", - "copySelected": "Salin yang dipilih", - "copySource": "Sumber", - "copyEmailPreview": "Pratinjau email hasil", - "copySelectSourceFirst": "Silakan pilih inbound sumber terlebih dahulu.", - "copyResult": "Hasil penyalinan", - "copyResultSuccess": "Berhasil disalin", - "copyResultNone": "Tidak ada yang disalin: tidak ada klien yang dipilih atau sumber kosong", - "copyResultErrors": "Kesalahan penyalinan", - "copyFlowLabel": "Flow untuk klien baru (VLESS)", - "copyFlowHint": "Diterapkan ke semua klien yang disalin. Biarkan kosong untuk melewati.", - "selectAll": "Pilih semua", - "clearAll": "Hapus semua", - "method": "Metode", - "first": "Pertama", - "last": "Terakhir", - "prefix": "Awalan", - "postfix": "Akhiran", - "delayedStart": "Mulai Awal", - "expireDays": "Durasi", - "days": "Hari", - "renew": "Perpanjang Otomatis", - "renewDesc": "Perpanjangan otomatis setelah kedaluwarsa. (0 = nonaktif)(unit: hari)" + "index": { + "backup": "Cadangan", + "backupTitle": "Cadangan \u0026 Pulihkan", + "charts": "Grafik", + "config": "Konfigurasi", + "connectionCount": "Statistik Koneksi", + "cpu": "CPU", + "currentPanelVersion": "Versi panel saat ini", + "customGeoActions": "Aksi", + "customGeoAdd": "Tambah", + "customGeoAlias": "Alias", + "customGeoAliasLabelSuffix": " (kustom)", + "customGeoAliasPlaceholder": "a-z 0-9 _ -", + "customGeoAliasesError": "Gagal memuat alias geo kustom", + "customGeoDelete": "Hapus", + "customGeoDeleteConfirm": "Hapus sumber geo kustom ini?", + "customGeoDownload": "Perbarui sekarang", + "customGeoEdit": "Edit", + "customGeoEmpty": "Belum ada sumber geo kustom — klik Tambah untuk membuatnya", + "customGeoEnabled": "Aktif", + "customGeoErrAliasPattern": "Alias berisi karakter yang tidak diizinkan", + "customGeoErrAliasRequired": "Alias wajib diisi", + "customGeoErrAliasReserved": "Alias ini dicadangkan", + "customGeoErrDownload": "Unduh gagal", + "customGeoErrDuplicateAlias": "Alias ini sudah dipakai untuk jenis ini", + "customGeoErrInvalidType": "Jenis harus geosite atau geoip", + "customGeoErrInvalidUrl": "URL tidak valid", + "customGeoErrNotFound": "Sumber geo kustom tidak ditemukan", + "customGeoErrUpdateAllIncomplete": "Satu atau lebih sumber geo kustom gagal diperbarui", + "customGeoErrUrlHost": "Host URL tidak valid", + "customGeoErrUrlRequired": "URL wajib diisi", + "customGeoErrUrlScheme": "URL harus memakai http atau https", + "customGeoExtColumn": "Routing (ext:…)", + "customGeoInvalidId": "ID sumber tidak valid", + "customGeoLastUpdated": "Terakhir diperbarui", + "customGeoModalAdd": "Tambah geo kustom", + "customGeoModalEdit": "Edit geo kustom", + "customGeoModalSave": "Simpan", + "customGeoRoutingHint": "Pada aturan routing gunakan kolom nilai sebagai ext:file.dat:tag (ganti tag).", + "customGeoTitle": "GeoSite / GeoIP kustom", + "customGeoToastAdd": "Tambah geo kustom", + "customGeoToastDelete": "Geofile kustom “{{ .fileName }}” dihapus", + "customGeoToastDownload": "Geofile “{{ .fileName }}” diperbarui", + "customGeoToastList": "Daftar geo kustom", + "customGeoToastUpdate": "Perbarui geo kustom", + "customGeoToastUpdateAll": "Semua sumber kustom telah diperbarui", + "customGeoType": "Jenis", + "customGeoUrl": "URL", + "customGeoValidationAlias": "Alias hanya huruf kecil, angka, - dan _", + "customGeoValidationUrl": "URL harus diawali http:// atau https://", + "documentation": "Dokumentasi", + "dontRefresh": "Instalasi sedang berlangsung, harap jangan menyegarkan halaman ini", + "download": "Unduh", + "exportDatabase": "Cadangkan", + "exportDatabaseDesc": "Klik untuk mengunduh file .db yang berisi cadangan dari database Anda saat ini ke perangkat Anda.", + "frequency": "Frekuensi", + "geofileUpdateDialog": "Apakah Anda yakin ingin memperbarui geofile?", + "geofileUpdateDialogDesc": "Ini akan memperbarui file #filename#.", + "geofileUpdatePopover": "Geofile berhasil diperbarui", + "geofilesUpdateAll": "Perbarui semua", + "geofilesUpdateDialogDesc": "Ini akan memperbarui semua berkas.", + "getConfigError": "Terjadi kesalahan saat mengambil file konfigurasi", + "getDatabaseError": "Terjadi kesalahan saat mengambil database", + "importDatabase": "Pulihkan", + "importDatabaseDesc": "Klik untuk memilih dan mengunggah file .db dari perangkat Anda untuk memulihkan database dari cadangan.", + "importDatabaseError": "Terjadi kesalahan saat mengimpor database", + "importDatabaseSuccess": "Database berhasil diimpor", + "ipAddresses": "Alamat IP", + "latestPanelVersion": "Versi panel terbaru", + "logicalProcessors": "Prosesor logis", + "logs": "Log", + "memory": "RAM", + "operationHours": "Waktu Aktif", + "overallSpeed": "Kecepatan keseluruhan", + "panelUpToDate": "Panel sudah terbaru", + "panelUpdateCheckPopover": "Pemeriksaan pembaruan panel gagal", + "panelUpdateDesc": "Ini akan memperbarui 3X-UI ke rilis terbaru dan me-restart layanan panel.", + "panelUpdateDialog": "Apakah Anda benar-benar ingin memperbarui panel?", + "panelUpdateDialogDesc": "Ini akan memperbarui 3X-UI ke #version# dan me-restart layanan panel.", + "panelUpdateStartedPopover": "Pembaruan panel dimulai", + "readDatabaseError": "Terjadi kesalahan saat membaca database", + "received": "Diterima", + "restartXray": "Restart", + "sent": "Dikirim", + "stopXray": "Stop", + "storage": "Penyimpanan", + "swap": "Swap", + "systemHistoryTitle": "Riwayat Sistem", + "systemLoad": "Beban Sistem", + "systemLoadDesc": "Rata-rata beban sistem selama 1, 5, dan 15 menit terakhir", + "threads": "Thread", + "title": "Ikhtisar", + "toggleIpVisibility": "Alihkan visibilitas IP", + "totalData": "Total data", + "trendLast2Min": "2 menit terakhir", + "upToDate": "Terbaru", + "updatePanel": "Perbarui Panel", + "upload": "Unggah", + "xrayErrorPopoverTitle": "Terjadi kesalahan saat menjalankan Xray", + "xrayMetricsDisabled": "Endpoint metrik Xray belum dikonfigurasi", + "xrayMetricsHint": "Tambahkan blok metrics tingkat atas ke konfigurasi xray dengan tag metrics_out dan listen 127.0.0.1:11111, lalu mulai ulang xray.", + "xrayMetricsTitle": "Metrik Xray", + "xrayObservatoryAlive": "Aktif", + "xrayObservatoryDead": "Mati", + "xrayObservatoryEmpty": "Belum ada data Observatory", + "xrayObservatoryHint": "Tambahkan blok observatory ke konfigurasi xray yang mencantumkan tag outbound untuk diuji, lalu mulai ulang xray.", + "xrayObservatoryLastSeen": "Terakhir terlihat", + "xrayObservatoryLastTry": "Percobaan terakhir", + "xrayObservatoryTagPlaceholder": "Pilih outbound", + "xrayStatus": "Xray", + "xrayStatusError": "Kesalahan", + "xrayStatusRunning": "Berjalan", + "xrayStatusStop": "Berhenti", + "xrayStatusUnknown": "Tidak diketahui", + "xraySwitch": "Versi", + "xraySwitchClick": "Pilih versi yang ingin Anda pindah.", + "xraySwitchClickDesk": "Pilih dengan hati-hati, karena versi yang lebih lama mungkin tidak kompatibel dengan konfigurasi saat ini.", + "xraySwitchVersionDialog": "Apakah Anda yakin ingin mengubah versi Xray?", + "xraySwitchVersionDialogDesc": "Ini akan mengubah versi Xray ke #version#.", + "xraySwitchVersionPopover": "Xray berhasil diperbarui", + "xrayUpdates": "Pembaruan Xray" + }, + "login": { + "hello": "Halo", + "loginAgain": "Sesi Anda telah berakhir, harap masuk kembali", + "title": "Selamat Datang", + "toasts": { + "emptyPassword": "Kata Sandi diperlukan", + "emptyUsername": "Nama Pengguna diperlukan", + "invalidFormData": "Format data input tidak valid.", + "successLogin": "Anda telah berhasil masuk ke akun Anda.", + "wrongUsernameOrPassword": "Username, kata sandi, atau kode dua faktor tidak valid." + } }, "nodes": { - "title": "Node", + "actions": "Aksi", "addNode": "Tambah Node", - "editNode": "Edit Node", - "totalNodes": "Total Node", - "onlineNodes": "Online", - "offlineNodes": "Offline", + "address": "Alamat", + "addressPlaceholder": "panel.example.com atau 1.2.3.4", + "apiToken": "Token API", + "apiTokenHint": "Panel jarak jauh menampilkan token API-nya di Pengaturan → Token API.", + "apiTokenPlaceholder": "Token dari halaman Pengaturan panel jarak jauh", "avgLatency": "Latensi Rata-rata", + "basePath": "Base Path", + "connectionFailed": "Koneksi gagal", + "connectionOk": "Koneksi OK ({ms} ms)", + "cpu": "CPU", + "deleteConfirmContent": "Ini menghentikan pemantauan node. Panel jarak jauh itu sendiri tidak terpengaruh.", + "deleteConfirmTitle": "Hapus node \"{name}\"?", + "editNode": "Edit Node", + "enable": "Aktif", + "justNow": "baru saja", + "lastHeartbeat": "Heartbeat Terakhir", + "latency": "Latensi", + "mem": "Memori", "name": "Nama", "namePlaceholder": "mis. de-frankfurt-1", - "addressPlaceholder": "panel.example.com atau 1.2.3.4", - "remark": "Catatan", - "scheme": "Skema", - "address": "Alamat", + "never": "tidak pernah", + "offlineNodes": "Offline", + "onlineNodes": "Online", "port": "Port", - "basePath": "Base Path", - "apiToken": "Token API", - "apiTokenPlaceholder": "Token dari halaman Pengaturan panel jarak jauh", - "apiTokenHint": "Panel jarak jauh menampilkan token API-nya di Pengaturan → Token API.", + "probe": "Probe Sekarang", "regenerate": "Buat Ulang Token", "regenerateConfirm": "Membuat ulang akan membatalkan token saat ini. Setiap panel pusat yang menggunakannya akan kehilangan akses sampai diperbarui. Lanjutkan?", - "enable": "Aktif", + "remark": "Catatan", + "scheme": "Skema", "status": "Status", - "cpu": "CPU", - "mem": "Memori", - "uptime": "Uptime", - "latency": "Latensi", - "lastHeartbeat": "Heartbeat Terakhir", - "xrayVersion": "Versi Xray", - "actions": "Aksi", - "probe": "Probe Sekarang", - "testConnection": "Tes Koneksi", - "connectionOk": "Koneksi OK ({ms} ms)", - "connectionFailed": "Koneksi gagal", - "never": "tidak pernah", - "justNow": "baru saja", - "deleteConfirmTitle": "Hapus node \"{name}\"?", - "deleteConfirmContent": "Ini menghentikan pemantauan node. Panel jarak jauh itu sendiri tidak terpengaruh.", "statusValues": { - "online": "Online", "offline": "Offline", + "online": "Online", "unknown": "Tidak diketahui" }, + "testConnection": "Tes Koneksi", + "title": "Node", "toasts": { - "list": "Gagal memuat node", - "obtain": "Gagal memuat node", "add": "Tambah node", - "update": "Perbarui node", "delete": "Hapus node", "deleted": "Node dihapus", - "test": "Tes koneksi", "fillRequired": "Nama, alamat, port, dan token API wajib diisi", - "probeFailed": "Probe gagal" - } + "list": "Gagal memuat node", + "obtain": "Gagal memuat node", + "probeFailed": "Probe gagal", + "test": "Tes koneksi", + "update": "Perbarui node" + }, + "totalNodes": "Total Node", + "uptime": "Uptime", + "xrayVersion": "Versi Xray" }, "settings": { - "title": "Pengaturan Panel", - "save": "Simpan", - "infoDesc": "Setiap perubahan yang dibuat di sini perlu disimpan. Harap restart panel untuk menerapkan perubahan.", - "restartPanel": "Restart Panel", - "restartPanelDesc": "Apakah Anda yakin ingin merestart panel? Jika Anda tidak dapat mengakses panel setelah merestart, lihat info log panel di server.", - "restartPanelSuccess": "Panel berhasil dimulai ulang", - "actions": "Tindakan", - "resetDefaultConfig": "Reset ke Default", - "panelSettings": "Umum", - "securitySettings": "Otentikasi", "TGBotSettings": "Bot Telegram", - "panelListeningIP": "IP Pendengar", - "panelListeningIPDesc": "Alamat IP untuk panel web. (biarkan kosong untuk mendengarkan semua IP)", - "panelListeningDomain": "Domain Pendengar", - "panelListeningDomainDesc": "Nama domain untuk panel web. (biarkan kosong untuk mendengarkan semua domain dan IP)", - "panelPort": "Port Pendengar", - "panelPortDesc": "Nomor port untuk panel web. (harus menjadi port yang tidak digunakan)", - "publicKeyPath": "Path Kunci Publik", - "publicKeyPathDesc": "Path berkas kunci publik untuk panel web. (dimulai dengan ‘/‘)", - "privateKeyPath": "Path Kunci Privat", - "privateKeyPathDesc": "Path berkas kunci privat untuk panel web. (dimulai dengan ‘/‘)", - "panelUrlPath": "URI Path", - "panelUrlPathDesc": "URI path untuk panel web. (dimulai dengan ‘/‘ dan diakhiri dengan ‘/‘)", - "pageSize": "Ukuran Halaman", - "pageSizeDesc": "Tentukan ukuran halaman untuk tabel masuk. (0 = nonaktif)", - "remarkModel": "Model Catatan & Karakter Pemisah", - "datepicker": "Jenis Kalender", - "datepickerPlaceholder": "Pilih tanggal", - "datepickerDescription": "Tugas terjadwal akan berjalan berdasarkan kalender ini.", - "sampleRemark": "Contoh Catatan", - "oldUsername": "Username Saat Ini", + "actions": "Tindakan", + "certs": "Sertifikat", "currentPassword": "Kata Sandi Saat Ini", - "newUsername": "Username Baru", - "newPassword": "Kata Sandi Baru", - "telegramBotEnable": "Aktifkan Bot Telegram", - "telegramBotEnableDesc": "Mengaktifkan bot Telegram.", - "telegramToken": "Token Telegram", - "telegramTokenDesc": "Token bot Telegram yang diperoleh dari '{'@'}BotFather'.", - "telegramProxy": "Proxy SOCKS", - "telegramProxyDesc": "Mengaktifkan proxy SOCKS5 untuk terhubung ke Telegram. (sesuaikan pengaturan sesuai panduan)", - "telegramAPIServer": "Telegram API Server", - "telegramAPIServerDesc": "Server API Telegram yang akan digunakan. Biarkan kosong untuk menggunakan server default.", - "telegramChatId": "ID Obrolan Admin", - "telegramChatIdDesc": "ID Obrolan Admin Telegram. (dipisahkan koma)(dapatkan di sini {'@'}userinfobot) atau (gunakan perintah '/id' di bot)", - "telegramNotifyTime": "Waktu Notifikasi", - "telegramNotifyTimeDesc": "Waktu notifikasi bot Telegram yang diatur untuk laporan berkala. (gunakan format waktu crontab)", - "tgNotifyBackup": "Cadangan Database", - "tgNotifyBackupDesc": "Kirim berkas cadangan database dengan laporan.", - "tgNotifyLogin": "Notifikasi Login", - "tgNotifyLoginDesc": "Dapatkan notifikasi tentang username, alamat IP, dan waktu setiap kali seseorang mencoba masuk ke panel web Anda.", - "sessionMaxAge": "Durasi Sesi", - "sessionMaxAgeDesc": "Durasi di mana Anda dapat tetap masuk. (unit: menit)", + "dateAndTime": "Tanggal dan Waktu", + "datepicker": "Jenis Kalender", + "datepickerDescription": "Tugas terjadwal akan berjalan berdasarkan kalender ini.", + "datepickerPlaceholder": "Pilih tanggal", + "direct": "Koneksi langsung", + "directDesc": "Secara langsung membuat koneksi dengan domain atau rentang IP negara tertentu.", "expireTimeDiff": "Notifikasi Tanggal Kedaluwarsa", "expireTimeDiffDesc": "Dapatkan notifikasi tentang tanggal kedaluwarsa saat mencapai ambang batas ini. (unit: hari)", - "trafficDiff": "Notifikasi Batas Traffic", - "trafficDiffDesc": "Dapatkan notifikasi tentang batas traffic saat mencapai ambang batas ini. (unit: GB)", - "tgNotifyCpu": "Notifikasi Beban CPU", - "tgNotifyCpuDesc": "Dapatkan notifikasi jika beban CPU melebihi ambang batas ini. (unit: %)", - "timeZone": "Zone Waktu", - "timeZoneDesc": "Tugas terjadwal akan berjalan berdasarkan zona waktu ini.", - "subSettings": "Langganan", - "subEnable": "Aktifkan Layanan Langganan", - "subEnableDesc": "Mengaktifkan layanan langganan.", - "subJsonEnable": "Aktifkan/Nonaktifkan endpoint langganan JSON secara mandiri.", - "subTitle": "Judul Langganan", - "subTitleDesc": "Judul yang ditampilkan di klien VPN", - "subSupportUrl": "URL Dukungan", - "subSupportUrlDesc": "Tautan dukungan teknis yang ditampilkan di klien VPN", - "subProfileUrl": "URL Profil", - "subProfileUrlDesc": "Tautan ke situs web Anda yang ditampilkan di klien VPN", - "subAnnounce": "Pengumuman", - "subAnnounceDesc": "Teks pengumuman yang ditampilkan di klien VPN", - "subEnableRouting": "Aktifkan perutean", - "subEnableRoutingDesc": "Pengaturan global untuk mengaktifkan perutean (routing) di klien VPN. (Hanya untuk Happ)", - "subRoutingRules": "Aturan routing", - "subRoutingRulesDesc": "Aturan routing global untuk klien VPN. (Hanya untuk Happ)", - "subListen": "IP Pendengar", - "subListenDesc": "Alamat IP untuk layanan langganan. (biarkan kosong untuk mendengarkan semua IP)", - "subPort": "Port Pendengar", - "subPortDesc": "Nomor port untuk layanan langganan. (harus menjadi port yang tidak digunakan)", - "subCertPath": "Path Kunci Publik", - "subCertPathDesc": "Path berkas kunci publik untuk layanan langganan. (dimulai dengan ‘/‘)", - "subKeyPath": "Path Kunci Privat", - "subKeyPathDesc": "Path berkas kunci privat untuk layanan langganan. (dimulai dengan ‘/‘)", - "subPath": "URI Path", - "subPathDesc": "URI path untuk layanan langganan. (dimulai dengan ‘/‘ dan diakhiri dengan ‘/‘)", - "subDomain": "Domain Pendengar", - "subDomainDesc": "Nama domain untuk layanan langganan. (biarkan kosong untuk mendengarkan semua domain dan IP)", - "subUpdates": "Interval Pembaruan", - "subUpdatesDesc": "Interval pembaruan URL langganan dalam aplikasi klien. (unit: jam)", - "subEncrypt": "Encode", - "subEncryptDesc": "Konten yang dikembalikan dari layanan langganan akan dienkripsi Base64.", - "subShowInfo": "Tampilkan Info Penggunaan", - "subShowInfoDesc": "Sisa traffic dan tanggal akan ditampilkan di aplikasi klien.", - "subURI": "URI Proxy Terbalik", - "subURIDesc": "Path URI dari URL langganan untuk digunakan di belakang proxy.", + "externalTraffic": "Lalu Lintas Eksternal", "externalTrafficInformEnable": "Informasikan API eksternal pada setiap pembaruan lalu lintas.", "externalTrafficInformEnableDesc": "Inform external API on every traffic update.", "externalTrafficInformURI": "Lalu Lintas Eksternal Menginformasikan URI", "externalTrafficInformURIDesc": "Pembaruan lalu lintas dikirim ke URI ini.", - "restartXrayOnClientDisable": "Nyalakan Ulang Xray Setelah Nonaktif Otomatis", - "restartXrayOnClientDisableDesc": "Saat klien otomatis dinonaktifkan karena kedaluwarsa atau batas trafik, mulai ulang Xray.", "fragment": "Fragmentasi", "fragmentDesc": "Aktifkan fragmentasi untuk paket hello TLS", "fragmentSett": "Pengaturan Fragmentasi", - "noisesDesc": "Aktifkan Noises.", - "noisesSett": "Pengaturan Noises", + "infoDesc": "Setiap perubahan yang dibuat di sini perlu disimpan. Harap restart panel untuk menerapkan perubahan.", + "information": "Informasi", + "intervals": "Interval", + "language": "Bahasa", "mux": "Mux", "muxDesc": "Mengirimkan beberapa aliran data independen dalam aliran data yang sudah ada.", "muxSett": "Pengaturan Mux", - "direct": "Koneksi langsung", - "directDesc": "Secara langsung membuat koneksi dengan domain atau rentang IP negara tertentu.", + "newPassword": "Kata Sandi Baru", + "newUsername": "Username Baru", + "noisesDesc": "Aktifkan Noises.", + "noisesSett": "Pengaturan Noises", "notifications": "Notifikasi", - "certs": "Sertifikat", - "externalTraffic": "Lalu Lintas Eksternal", - "dateAndTime": "Tanggal dan Waktu", + "oldUsername": "Username Saat Ini", + "pageSize": "Ukuran Halaman", + "pageSizeDesc": "Tentukan ukuran halaman untuk tabel masuk. (0 = nonaktif)", + "panelListeningDomain": "Domain Pendengar", + "panelListeningDomainDesc": "Nama domain untuk panel web. (biarkan kosong untuk mendengarkan semua domain dan IP)", + "panelListeningIP": "IP Pendengar", + "panelListeningIPDesc": "Alamat IP untuk panel web. (biarkan kosong untuk mendengarkan semua IP)", + "panelPort": "Port Pendengar", + "panelPortDesc": "Nomor port untuk panel web. (harus menjadi port yang tidak digunakan)", + "panelSettings": "Umum", + "panelUrlPath": "URI Path", + "panelUrlPathDesc": "URI path untuk panel web. (dimulai dengan ‘/‘ dan diakhiri dengan ‘/‘)", + "privateKeyPath": "Path Kunci Privat", + "privateKeyPathDesc": "Path berkas kunci privat untuk panel web. (dimulai dengan ‘/‘)", "proxyAndServer": "Proxy dan Server", - "intervals": "Interval", - "information": "Informasi", - "language": "Bahasa", - "telegramBotLanguage": "Bahasa Bot Telegram", + "publicKeyPath": "Path Kunci Publik", + "publicKeyPathDesc": "Path berkas kunci publik untuk panel web. (dimulai dengan ‘/‘)", + "remarkModel": "Model Catatan \u0026 Karakter Pemisah", + "resetDefaultConfig": "Reset ke Default", + "restartPanel": "Restart Panel", + "restartPanelDesc": "Apakah Anda yakin ingin merestart panel? Jika Anda tidak dapat mengakses panel setelah merestart, lihat info log panel di server.", + "restartPanelSuccess": "Panel berhasil dimulai ulang", + "restartXrayOnClientDisable": "Nyalakan Ulang Xray Setelah Nonaktif Otomatis", + "restartXrayOnClientDisableDesc": "Saat klien otomatis dinonaktifkan karena kedaluwarsa atau batas trafik, mulai ulang Xray.", + "sampleRemark": "Contoh Catatan", + "save": "Simpan", "security": { "admin": "Kredensial admin", "twoFactor": "Autentikasi dua faktor", "twoFactorEnable": "Aktifkan 2FA", "twoFactorEnableDesc": "Menambahkan lapisan autentikasi tambahan untuk keamanan lebih.", - "twoFactorModalSetTitle": "Aktifkan autentikasi dua faktor", - "twoFactorModalDeleteTitle": "Nonaktifkan autentikasi dua faktor", - "twoFactorModalSteps": "Untuk menyiapkan autentikasi dua faktor, lakukan beberapa langkah:", - "twoFactorModalFirstStep": "1. Pindai kode QR ini di aplikasi autentikasi atau salin token di dekat kode QR dan tempelkan ke aplikasi", - "twoFactorModalSecondStep": "2. Masukkan kode dari aplikasi", - "twoFactorModalRemoveStep": "Masukkan kode dari aplikasi untuk menghapus autentikasi dua faktor.", - "twoFactorModalChangeCredentialsTitle": "Ubah kredensial", "twoFactorModalChangeCredentialsStep": "Masukkan kode dari aplikasi untuk mengubah kredensial administrator.", - "twoFactorModalSetSuccess": "Autentikasi dua faktor telah berhasil dibuat", + "twoFactorModalChangeCredentialsTitle": "Ubah kredensial", "twoFactorModalDeleteSuccess": "Autentikasi dua faktor telah berhasil dihapus", - "twoFactorModalError": "Kode salah" + "twoFactorModalDeleteTitle": "Nonaktifkan autentikasi dua faktor", + "twoFactorModalError": "Kode salah", + "twoFactorModalFirstStep": "1. Pindai kode QR ini di aplikasi autentikasi atau salin token di dekat kode QR dan tempelkan ke aplikasi", + "twoFactorModalRemoveStep": "Masukkan kode dari aplikasi untuk menghapus autentikasi dua faktor.", + "twoFactorModalSecondStep": "2. Masukkan kode dari aplikasi", + "twoFactorModalSetSuccess": "Autentikasi dua faktor telah berhasil dibuat", + "twoFactorModalSetTitle": "Aktifkan autentikasi dua faktor", + "twoFactorModalSteps": "Untuk menyiapkan autentikasi dua faktor, lakukan beberapa langkah:" }, + "securitySettings": "Otentikasi", + "sessionMaxAge": "Durasi Sesi", + "sessionMaxAgeDesc": "Durasi di mana Anda dapat tetap masuk. (unit: menit)", + "subAnnounce": "Pengumuman", + "subAnnounceDesc": "Teks pengumuman yang ditampilkan di klien VPN", + "subCertPath": "Path Kunci Publik", + "subCertPathDesc": "Path berkas kunci publik untuk layanan langganan. (dimulai dengan ‘/‘)", + "subDomain": "Domain Pendengar", + "subDomainDesc": "Nama domain untuk layanan langganan. (biarkan kosong untuk mendengarkan semua domain dan IP)", + "subEnable": "Aktifkan Layanan Langganan", + "subEnableDesc": "Mengaktifkan layanan langganan.", + "subEnableRouting": "Aktifkan perutean", + "subEnableRoutingDesc": "Pengaturan global untuk mengaktifkan perutean (routing) di klien VPN. (Hanya untuk Happ)", + "subEncrypt": "Encode", + "subEncryptDesc": "Konten yang dikembalikan dari layanan langganan akan dienkripsi Base64.", + "subJsonEnable": "Aktifkan/Nonaktifkan endpoint langganan JSON secara mandiri.", + "subKeyPath": "Path Kunci Privat", + "subKeyPathDesc": "Path berkas kunci privat untuk layanan langganan. (dimulai dengan ‘/‘)", + "subListen": "IP Pendengar", + "subListenDesc": "Alamat IP untuk layanan langganan. (biarkan kosong untuk mendengarkan semua IP)", + "subPath": "URI Path", + "subPathDesc": "URI path untuk layanan langganan. (dimulai dengan ‘/‘ dan diakhiri dengan ‘/‘)", + "subPort": "Port Pendengar", + "subPortDesc": "Nomor port untuk layanan langganan. (harus menjadi port yang tidak digunakan)", + "subProfileUrl": "URL Profil", + "subProfileUrlDesc": "Tautan ke situs web Anda yang ditampilkan di klien VPN", + "subRoutingRules": "Aturan routing", + "subRoutingRulesDesc": "Aturan routing global untuk klien VPN. (Hanya untuk Happ)", + "subSettings": "Langganan", + "subShowInfo": "Tampilkan Info Penggunaan", + "subShowInfoDesc": "Sisa traffic dan tanggal akan ditampilkan di aplikasi klien.", + "subSupportUrl": "URL Dukungan", + "subSupportUrlDesc": "Tautan dukungan teknis yang ditampilkan di klien VPN", + "subTitle": "Judul Langganan", + "subTitleDesc": "Judul yang ditampilkan di klien VPN", + "subURI": "URI Proxy Terbalik", + "subURIDesc": "Path URI dari URL langganan untuk digunakan di belakang proxy.", + "subUpdates": "Interval Pembaruan", + "subUpdatesDesc": "Interval pembaruan URL langganan dalam aplikasi klien. (unit: jam)", + "telegramAPIServer": "Telegram API Server", + "telegramAPIServerDesc": "Server API Telegram yang akan digunakan. Biarkan kosong untuk menggunakan server default.", + "telegramBotEnable": "Aktifkan Bot Telegram", + "telegramBotEnableDesc": "Mengaktifkan bot Telegram.", + "telegramBotLanguage": "Bahasa Bot Telegram", + "telegramChatId": "ID Obrolan Admin", + "telegramChatIdDesc": "ID Obrolan Admin Telegram. (dipisahkan koma)(dapatkan di sini {'@'}userinfobot) atau (gunakan perintah '/id' di bot)", + "telegramNotifyTime": "Waktu Notifikasi", + "telegramNotifyTimeDesc": "Waktu notifikasi bot Telegram yang diatur untuk laporan berkala. (gunakan format waktu crontab)", + "telegramProxy": "Proxy SOCKS", + "telegramProxyDesc": "Mengaktifkan proxy SOCKS5 untuk terhubung ke Telegram. (sesuaikan pengaturan sesuai panduan)", + "telegramToken": "Token Telegram", + "telegramTokenDesc": "Token bot Telegram yang diperoleh dari '{'@'}BotFather'.", + "tgNotifyBackup": "Cadangan Database", + "tgNotifyBackupDesc": "Kirim berkas cadangan database dengan laporan.", + "tgNotifyCpu": "Notifikasi Beban CPU", + "tgNotifyCpuDesc": "Dapatkan notifikasi jika beban CPU melebihi ambang batas ini. (unit: %)", + "tgNotifyLogin": "Notifikasi Login", + "tgNotifyLoginDesc": "Dapatkan notifikasi tentang username, alamat IP, dan waktu setiap kali seseorang mencoba masuk ke panel web Anda.", + "timeZone": "Zone Waktu", + "timeZoneDesc": "Tugas terjadwal akan berjalan berdasarkan zona waktu ini.", + "title": "Pengaturan Panel", "toasts": { - "modifySettings": "Parameter telah diubah.", - "getSettings": "Terjadi kesalahan saat mengambil parameter.", - "modifyUserError": "Terjadi kesalahan saat mengubah kredensial administrator.", - "modifyUser": "Anda telah berhasil mengubah kredensial administrator.", - "originalUserPassIncorrect": "Username atau password saat ini tidak valid", - "userPassMustBeNotEmpty": "Username dan password baru tidak boleh kosong", "getOutboundTrafficError": "Gagal mendapatkan lalu lintas keluar", - "resetOutboundTrafficError": "Gagal mereset lalu lintas keluar" - } + "getSettings": "Terjadi kesalahan saat mengambil parameter.", + "modifySettings": "Parameter telah diubah.", + "modifyUser": "Anda telah berhasil mengubah kredensial administrator.", + "modifyUserError": "Terjadi kesalahan saat mengubah kredensial administrator.", + "originalUserPassIncorrect": "Username atau password saat ini tidak valid", + "resetOutboundTrafficError": "Gagal mereset lalu lintas keluar", + "userPassMustBeNotEmpty": "Username dan password baru tidak boleh kosong" + }, + "trafficDiff": "Notifikasi Batas Traffic", + "trafficDiffDesc": "Dapatkan notifikasi tentang batas traffic saat mencapai ambang batas ini. (unit: GB)" }, "xray": { - "title": "Konfigurasi Xray", - "save": "Simpan", - "restart": "Restart Xray", - "restartSuccess": "Xray berhasil diluncurkan ulang", - "stopSuccess": "Xray telah berhasil dihentikan", - "restartError": "Terjadi kesalahan saat memulai ulang Xray.", - "stopError": "Terjadi kesalahan saat menghentikan Xray.", - "basicTemplate": "Dasar", - "advancedTemplate": "Lanjutan", - "generalConfigs": "Strategi Umum", - "generalConfigsDesc": "Opsi ini akan menentukan penyesuaian strategi umum.", - "logConfigs": "Catatan", - "logConfigsDesc": "Log dapat mempengaruhi efisiensi server Anda. Disarankan untuk mengaktifkannya dengan bijak hanya jika diperlukan", - "blockConfigsDesc": "Opsi ini akan memblokir lalu lintas berdasarkan protokol dan situs web yang diminta.", - "basicRouting": "Perutean Dasar", - "blockConnectionsConfigsDesc": "Opsi ini akan memblokir lalu lintas berdasarkan negara yang diminta.", - "directConnectionsConfigsDesc": "Koneksi langsung memastikan bahwa lalu lintas tertentu tidak dialihkan melalui server lain.", - "blockips": "Blokir IP", - "blockdomains": "Blokir Domain", - "directips": "IP Langsung", - "directdomains": "Domain Langsung", - "ipv4Routing": "Perutean IPv4", - "ipv4RoutingDesc": "Opsi ini akan mengalihkan lalu lintas berdasarkan tujuan tertentu melalui IPv4.", - "warpRouting": "Perutean WARP", - "warpRoutingDesc": "Opsi ini akan mengalihkan lalu lintas berdasarkan tujuan tertentu melalui WARP.", - "nordRouting": "Routing NordVPN", - "nordRoutingDesc": "Opsi ini akan mengalihkan lalu lintas berdasarkan tujuan tertentu melalui NordVPN.", - "Template": "Template Konfigurasi Xray Lanjutan", - "TemplateDesc": "File konfigurasi Xray akhir akan dibuat berdasarkan template ini.", + "Balancers": "Penyeimbang", "FreedomStrategy": "Strategi Protokol Freedom", "FreedomStrategyDesc": "Atur strategi output untuk jaringan dalam Protokol Freedom.", - "RoutingStrategy": "Strategi Pengalihan Keseluruhan", - "RoutingStrategyDesc": "Atur strategi pengalihan lalu lintas keseluruhan untuk menyelesaikan semua permintaan.", - "outboundTestUrl": "URL tes outbound", - "outboundTestUrlDesc": "URL yang digunakan saat menguji konektivitas outbound", - "Torrent": "Blokir Protokol BitTorrent", "Inbounds": "Masuk", "InboundsDesc": "Menerima klien tertentu.", "Outbounds": "Keluar", - "Balancers": "Penyeimbang", "OutboundsDesc": "Atur jalur lalu lintas keluar.", + "RoutingStrategy": "Strategi Pengalihan Keseluruhan", + "RoutingStrategyDesc": "Atur strategi pengalihan lalu lintas keseluruhan untuk menyelesaikan semua permintaan.", "Routings": "Aturan Pengalihan", "RoutingsDesc": "Prioritas setiap aturan penting!", - "completeTemplate": "Semua", - "logLevel": "Tingkat Log", - "logLevelDesc": "Tingkat log untuk log kesalahan, menunjukkan informasi yang perlu dicatat.", + "Template": "Template Konfigurasi Xray Lanjutan", + "TemplateDesc": "File konfigurasi Xray akhir akan dibuat berdasarkan template ini.", + "Torrent": "Blokir Protokol BitTorrent", "accessLog": "Log Akses", "accessLogDesc": "Jalur file untuk log akses. Nilai khusus 'tidak ada' menonaktifkan log akses", - "errorLog": "Catatan eror", - "errorLogDesc": "Jalur file untuk log kesalahan. Nilai khusus 'tidak ada' menonaktifkan log kesalahan", - "dnsLog": "Log DNS", - "dnsLogDesc": "Apakah akan mengaktifkan log kueri DNS", - "maskAddress": "Alamat Masker", - "maskAddressDesc": "Masker alamat IP, ketika diaktifkan, akan secara otomatis mengganti alamat IP yang muncul di log.", - "statistics": "Statistik", - "statsInboundUplink": "Statistik Unggah Masuk", - "statsInboundUplinkDesc": "Mengaktifkan pengumpulan statistik untuk lalu lintas unggah dari semua proxy masuk.", - "statsInboundDownlink": "Statistik Unduh Masuk", - "statsInboundDownlinkDesc": "Mengaktifkan pengumpulan statistik untuk lalu lintas unduh dari semua proxy masuk.", - "statsOutboundUplink": "Statistik Unggah Keluar", - "statsOutboundUplinkDesc": "Mengaktifkan pengumpulan statistik untuk lalu lintas unggah dari semua proxy keluar.", - "statsOutboundDownlink": "Statistik Unduh Keluar", - "statsOutboundDownlinkDesc": "Mengaktifkan pengumpulan statistik untuk lalu lintas unduh dari semua proxy keluar.", - "rules": { - "first": "Pertama", - "last": "Terakhir", - "up": "Naik", - "down": "Turun", - "source": "Sumber", - "dest": "Tujuan", - "inbound": "Masuk", - "outbound": "Keluar", - "balancer": "Pengimbang", - "info": "Info", - "add": "Tambahkan Aturan", - "edit": "Edit Aturan", - "useComma": "Item yang dipisahkan koma" - }, - "outbound": { - "addOutbound": "Tambahkan Keluar", - "addReverse": "Tambahkan Revers", - "editOutbound": "Edit Keluar", - "editReverse": "Edit Revers", - "reverseTag": "Tag Revers", - "reverseTagDesc": "Tag outbound proxy revers sederhana VLESS. Kosongkan untuk menonaktifkan.", - "reverseTagPlaceholder": "tag outbound (kosong untuk menonaktifkan)", - "tag": "Tag", - "tagDesc": "Tag Unik", - "address": "Alamat", - "reverse": "Revers", - "domain": "Domain", - "type": "Tipe", - "bridge": "Jembatan", - "portal": "Portal", - "link": "Tautan", - "intercon": "Interkoneksi", - "settings": "Pengaturan", - "accountInfo": "Informasi Akun", - "outboundStatus": "Status Keluar", - "sendThrough": "Kirim Melalui", - "test": "Tes", - "testResult": "Hasil Tes", - "testing": "Menguji koneksi...", - "testSuccess": "Tes berhasil", - "testFailed": "Tes gagal", - "testError": "Gagal menguji outbound", - "nordvpn": "NordVPN", - "accessToken": "Token Akses", - "country": "Negara", - "server": "Server", - "city": "Kota", - "allCities": "Semua Kota", - "privateKey": "Kunci Privat", - "load": "Beban" - }, + "advancedTemplate": "Lanjutan", "balancer": { "addBalancer": "Tambahkan Penyeimbang", - "editBalancer": "Sunting Penyeimbang", - "balancerStrategy": "Strategi", + "balancerDesc": "BalancerTag dan outboundTag tidak dapat digunakan secara bersamaan. Jika digunakan secara bersamaan, hanya outboundTag yang akan berfungsi.", "balancerSelectors": "Penyeleksi", + "balancerStrategy": "Strategi", + "editBalancer": "Sunting Penyeimbang", "tag": "Menandai", - "tagDesc": "Label Unik", - "balancerDesc": "BalancerTag dan outboundTag tidak dapat digunakan secara bersamaan. Jika digunakan secara bersamaan, hanya outboundTag yang akan berfungsi." - }, - "wireguard": { - "secretKey": "Kunci Rahasia", - "publicKey": "Kunci Publik", - "allowedIPs": "IP yang Diizinkan", - "endpoint": "Titik Akhir", - "psk": "Kunci Pra-Bagi", - "domainStrategy": "Strategi Domain" - }, - "tun": { - "nameDesc": "Nama antarmuka TUN. Standar adalah 'xray0'", - "mtuDesc": "Unit Transmisi Maksimum. Ukuran maksimum paket data. Standar adalah 1500", - "userLevel": "Level Pengguna", - "userLevelDesc": "Semua koneksi yang dibuat melalui inbound ini akan menggunakan level pengguna ini. Standar adalah 0" + "tagDesc": "Label Unik" }, + "basicRouting": "Perutean Dasar", + "basicTemplate": "Dasar", + "blockConfigsDesc": "Opsi ini akan memblokir lalu lintas berdasarkan protokol dan situs web yang diminta.", + "blockConnectionsConfigsDesc": "Opsi ini akan memblokir lalu lintas berdasarkan negara yang diminta.", + "blockdomains": "Blokir Domain", + "blockips": "Blokir IP", + "completeTemplate": "Semua", + "directConnectionsConfigsDesc": "Koneksi langsung memastikan bahwa lalu lintas tertentu tidak dialihkan melalui server lain.", + "directdomains": "Domain Langsung", + "directips": "IP Langsung", "dns": { - "enable": "Aktifkan DNS", - "enableDesc": "Aktifkan server DNS bawaan", - "tag": "Tanda DNS Masuk", - "tagDesc": "Tanda ini akan tersedia sebagai tanda masuk dalam aturan penataan.", + "add": "Tambahkan Server", + "clearAll": "Hapus Semua", + "clearAllConfirm": "Ini akan menghapus semua server DNS dari daftar. Tidak dapat dibatalkan.", + "clearAllTitle": "Hapus semua server DNS?", "clientIp": "IP Klien", "clientIpDesc": "Digunakan untuk memberi tahu server tentang lokasi IP yang ditentukan selama kueri DNS", "disableCache": "Nonaktifkan cache", @@ -753,217 +607,371 @@ "disableFallbackDesc": "Menonaktifkan kueri DNS fallback", "disableFallbackIfMatch": "Nonaktifkan Fallback Jika Cocok", "disableFallbackIfMatchDesc": "Menonaktifkan kueri DNS fallback ketika daftar domain yang cocok dari server DNS terpenuhi", + "dnsPresetFamily": "Keluarga", + "dnsPresetTitle": "Templat DNS", + "domains": "Domains", + "edit": "Sunting Server", + "enable": "Aktifkan DNS", + "enableDesc": "Aktifkan server DNS bawaan", "enableParallelQuery": "Aktifkan Kueri Paralel", "enableParallelQueryDesc": "Aktifkan kueri DNS paralel ke beberapa server untuk resolusi yang lebih cepat", - "strategy": "Strategi Kueri", - "strategyDesc": "Strategi keseluruhan untuk menyelesaikan nama domain", - "add": "Tambahkan Server", - "edit": "Sunting Server", - "domains": "Domains", "expectIPs": "IP yang Diharapkan", - "unexpectIPs": "IP tak terduga", - "useSystemHosts": "Gunakan Hosts Sistem", - "useSystemHostsDesc": "Gunakan file hosts dari sistem yang terinstal", - "usePreset": "Gunakan templat", - "dnsPresetTitle": "Templat DNS", - "dnsPresetFamily": "Keluarga", - "serveStale": "Sajikan Kedaluwarsa", - "serveStaleDesc": "Mengembalikan hasil cache yang kedaluwarsa saat memperbarui di latar belakang", - "serveExpiredTTL": "TTL Kedaluwarsa", - "serveExpiredTTLDesc": "Masa berlaku (detik) entri cache kedaluwarsa; 0 = tidak pernah kedaluwarsa", - "timeoutMs": "Batas waktu (ms)", - "skipFallback": "Lewati Fallback", "finalQuery": "Kueri Akhir", "hosts": "Hosts", "hostsAdd": "Tambah Host", - "hostsEmpty": "Tidak ada Host yang ditentukan", "hostsDomain": "Domain (mis. domain:example.com)", + "hostsEmpty": "Tidak ada Host yang ditentukan", "hostsValues": "IP atau domain — ketik dan tekan Enter", - "clearAll": "Hapus Semua", - "clearAllTitle": "Hapus semua server DNS?", - "clearAllConfirm": "Ini akan menghapus semua server DNS dari daftar. Tidak dapat dibatalkan." + "serveExpiredTTL": "TTL Kedaluwarsa", + "serveExpiredTTLDesc": "Masa berlaku (detik) entri cache kedaluwarsa; 0 = tidak pernah kedaluwarsa", + "serveStale": "Sajikan Kedaluwarsa", + "serveStaleDesc": "Mengembalikan hasil cache yang kedaluwarsa saat memperbarui di latar belakang", + "skipFallback": "Lewati Fallback", + "strategy": "Strategi Kueri", + "strategyDesc": "Strategi keseluruhan untuk menyelesaikan nama domain", + "tag": "Tanda DNS Masuk", + "tagDesc": "Tanda ini akan tersedia sebagai tanda masuk dalam aturan penataan.", + "timeoutMs": "Batas waktu (ms)", + "unexpectIPs": "IP tak terduga", + "usePreset": "Gunakan templat", + "useSystemHosts": "Gunakan Hosts Sistem", + "useSystemHostsDesc": "Gunakan file hosts dari sistem yang terinstal" }, + "dnsLog": "Log DNS", + "dnsLogDesc": "Apakah akan mengaktifkan log kueri DNS", + "errorLog": "Catatan eror", + "errorLogDesc": "Jalur file untuk log kesalahan. Nilai khusus 'tidak ada' menonaktifkan log kesalahan", "fakedns": { "add": "Tambahkan DNS Palsu", "edit": "Edit DNS Palsu", "ipPool": "Subnet Kumpulan IP", "poolSize": "Ukuran Kolam" + }, + "generalConfigs": "Strategi Umum", + "generalConfigsDesc": "Opsi ini akan menentukan penyesuaian strategi umum.", + "ipv4Routing": "Perutean IPv4", + "ipv4RoutingDesc": "Opsi ini akan mengalihkan lalu lintas berdasarkan tujuan tertentu melalui IPv4.", + "logConfigs": "Catatan", + "logConfigsDesc": "Log dapat mempengaruhi efisiensi server Anda. Disarankan untuk mengaktifkannya dengan bijak hanya jika diperlukan", + "logLevel": "Tingkat Log", + "logLevelDesc": "Tingkat log untuk log kesalahan, menunjukkan informasi yang perlu dicatat.", + "maskAddress": "Alamat Masker", + "maskAddressDesc": "Masker alamat IP, ketika diaktifkan, akan secara otomatis mengganti alamat IP yang muncul di log.", + "nordRouting": "Routing NordVPN", + "nordRoutingDesc": "Opsi ini akan mengalihkan lalu lintas berdasarkan tujuan tertentu melalui NordVPN.", + "outbound": { + "accessToken": "Token Akses", + "accountInfo": "Informasi Akun", + "addOutbound": "Tambahkan Keluar", + "addReverse": "Tambahkan Revers", + "address": "Alamat", + "allCities": "Semua Kota", + "bridge": "Jembatan", + "city": "Kota", + "country": "Negara", + "domain": "Domain", + "editOutbound": "Edit Keluar", + "editReverse": "Edit Revers", + "intercon": "Interkoneksi", + "link": "Tautan", + "load": "Beban", + "nordvpn": "NordVPN", + "outboundStatus": "Status Keluar", + "portal": "Portal", + "privateKey": "Kunci Privat", + "reverse": "Revers", + "reverseTag": "Tag Revers", + "reverseTagDesc": "Tag outbound proxy revers sederhana VLESS. Kosongkan untuk menonaktifkan.", + "reverseTagPlaceholder": "tag outbound (kosong untuk menonaktifkan)", + "sendThrough": "Kirim Melalui", + "server": "Server", + "settings": "Pengaturan", + "tag": "Tag", + "tagDesc": "Tag Unik", + "test": "Tes", + "testError": "Gagal menguji outbound", + "testFailed": "Tes gagal", + "testResult": "Hasil Tes", + "testSuccess": "Tes berhasil", + "testing": "Menguji koneksi...", + "type": "Tipe" + }, + "outboundTestUrl": "URL tes outbound", + "outboundTestUrlDesc": "URL yang digunakan saat menguji konektivitas outbound", + "restart": "Restart Xray", + "restartError": "Terjadi kesalahan saat memulai ulang Xray.", + "restartSuccess": "Xray berhasil diluncurkan ulang", + "rules": { + "add": "Tambahkan Aturan", + "balancer": "Pengimbang", + "dest": "Tujuan", + "down": "Turun", + "edit": "Edit Aturan", + "first": "Pertama", + "inbound": "Masuk", + "info": "Info", + "last": "Terakhir", + "outbound": "Keluar", + "source": "Sumber", + "up": "Naik", + "useComma": "Item yang dipisahkan koma" + }, + "save": "Simpan", + "statistics": "Statistik", + "statsInboundDownlink": "Statistik Unduh Masuk", + "statsInboundDownlinkDesc": "Mengaktifkan pengumpulan statistik untuk lalu lintas unduh dari semua proxy masuk.", + "statsInboundUplink": "Statistik Unggah Masuk", + "statsInboundUplinkDesc": "Mengaktifkan pengumpulan statistik untuk lalu lintas unggah dari semua proxy masuk.", + "statsOutboundDownlink": "Statistik Unduh Keluar", + "statsOutboundDownlinkDesc": "Mengaktifkan pengumpulan statistik untuk lalu lintas unduh dari semua proxy keluar.", + "statsOutboundUplink": "Statistik Unggah Keluar", + "statsOutboundUplinkDesc": "Mengaktifkan pengumpulan statistik untuk lalu lintas unggah dari semua proxy keluar.", + "stopError": "Terjadi kesalahan saat menghentikan Xray.", + "stopSuccess": "Xray telah berhasil dihentikan", + "title": "Konfigurasi Xray", + "tun": { + "mtuDesc": "Unit Transmisi Maksimum. Ukuran maksimum paket data. Standar adalah 1500", + "nameDesc": "Nama antarmuka TUN. Standar adalah 'xray0'", + "userLevel": "Level Pengguna", + "userLevelDesc": "Semua koneksi yang dibuat melalui inbound ini akan menggunakan level pengguna ini. Standar adalah 0" + }, + "warpRouting": "Perutean WARP", + "warpRoutingDesc": "Opsi ini akan mengalihkan lalu lintas berdasarkan tujuan tertentu melalui WARP.", + "wireguard": { + "allowedIPs": "IP yang Diizinkan", + "domainStrategy": "Strategi Domain", + "endpoint": "Titik Akhir", + "psk": "Kunci Pra-Bagi", + "publicKey": "Kunci Publik", + "secretKey": "Kunci Rahasia" } } }, + "password": "Kata Sandi", + "path": "Jalur", + "protocol": "Protokol", + "qrCode": "Kode QR", + "remained": "Tersisa", + "remark": "Catatan", + "reset": "Reset", + "save": "Simpan", + "search": "Cari", + "secAlertConf": "Beberapa pengaturan rentan terhadap serangan. Disarankan untuk memperkuat protokol keamanan guna mencegah pelanggaran potensial.", + "secAlertPanelPort": "Port default panel rentan. Harap konfigurasi port acak atau tertentu.", + "secAlertPanelURI": "Jalur URI default panel tidak aman. Harap konfigurasi jalur URI kompleks.", + "secAlertSSL": "Panel kekurangan koneksi yang aman. Harap instal sertifikat TLS untuk perlindungan data.", + "secAlertSsl": "Koneksi ini tidak aman. Harap hindari memasukkan informasi sensitif sampai TLS diaktifkan untuk perlindungan data.", + "secAlertSubJsonURI": "Jalur URI default JSON langganan tidak aman. Harap konfigurasikan jalur URI kompleks.", + "secAlertSubURI": "Jalur URI default langganan tidak aman. Harap konfigurasi jalur URI kompleks.", + "secAlertTitle": "Peringatan keamanan", + "second": "Detik", + "security": "Keamanan", + "somethingWentWrong": "Terjadi kesalahan", + "status": "Status", + "subscription": { + "active": "Aktif", + "downloaded": "Diunduh", + "expiry": "Kedaluwarsa", + "inactive": "Nonaktif", + "individualLinks": "Tautan individual", + "noExpiry": "Tanpa kedaluwarsa", + "status": "Status", + "subId": "ID langganan", + "title": "Info langganan", + "totalQuota": "Kuota total", + "unlimited": "Tanpa batas", + "uploaded": "Diunggah" + }, + "success": "Berhasil", + "sure": "Yakin", "tgbot": { - "keyboardClosed": "❌ Keyboard ditutup!", - "noResult": "❗ Tidak ada hasil!", - "noQuery": "❌ Kueri tidak ditemukan! Silakan gunakan perintah lagi!", - "wentWrong": "❌ Terjadi kesalahan!", - "noIpRecord": "❗ Tidak ada Catatan IP!", - "noInbounds": "❗ Tidak ada inbound yang ditemukan!", - "unlimited": "♾ Tidak terbatas (Reset)", "add": "Tambah", - "month": "Bulan", - "months": "Bulan", - "day": "Hari", - "days": "Hari", - "hours": "Jam", - "minutes": "Menit", - "unknown": "Tidak diketahui", - "inbounds": "Inbound", - "clients": "Klien", - "offline": "🔴 Offline", - "online": "🟢 Online", - "commands": { - "unknown": "❗ Perintah tidak dikenal.", - "pleaseChoose": "👇 Harap pilih:\r\n", - "help": "🤖 Selamat datang di bot ini! Ini dirancang untuk menyediakan data tertentu dari panel web dan memungkinkan Anda melakukan modifikasi sesuai kebutuhan.\r\n\r\n", - "start": "👋 Halo {{ .Firstname }}.\r\n", - "welcome": "🤖 Selamat datang di {{.Hostname }} bot managemen.\r\n", - "status": "✅ Bot dalam keadaan baik!", - "usage": "❗ Harap berikan teks untuk mencari!", - "getID": "🆔 ID Anda: {{ .ID }}", - "helpAdminCommands": "Untuk memulai ulang Xray Core:\r\n/restart\r\n\r\nUntuk mencari email klien:\r\n/usage [Email]\r\n\r\nUntuk mencari inbound (dengan statistik klien):\r\n/inbound [Catatan]\r\n\r\nID Obrolan Telegram:\r\n/id", - "helpClientCommands": "Untuk mencari statistik, gunakan perintah berikut:\r\n/usage [Email]\r\n\r\nID Obrolan Telegram:\r\n/id", - "restartUsage": "\r\n\r\n/restart", - "restartSuccess": "✅ Operasi berhasil!", - "restartFailed": "❗ Kesalahan dalam operasi.\r\n\r\nError: {{ .Error }}.", - "xrayNotRunning": "❗ Xray Core tidak berjalan.", - "startDesc": "Tampilkan menu utama", - "helpDesc": "Bantuan bot", - "statusDesc": "Periksa status bot", - "idDesc": "Tampilkan ID Telegram Anda" - }, - "messages": { - "cpuThreshold": "🔴 Beban CPU {{ .Percent }}% melebihi batas {{ .Threshold }}%", - "selectUserFailed": "❌ Kesalahan dalam pemilihan pengguna!", - "userSaved": "✅ Pengguna Telegram tersimpan.", - "loginSuccess": "✅ Berhasil masuk ke panel.\r\n", - "loginFailed": "❗️ Gagal masuk ke panel.\r\n", - "2faFailed": "2FA Gagal", - "report": "🕰 Laporan Terjadwal: {{ .RunTime }}\r\n", - "datetime": "⏰ Tanggal & Waktu: {{ .DateTime }}\r\n", - "hostname": "💻 Host: {{ .Hostname }}\r\n", - "version": "🚀 Versi 3X-UI: {{ .Version }}\r\n", - "xrayVersion": "📡 Versi Xray: {{ .XrayVersion }}\r\n", - "ipv6": "🌐 IPv6: {{ .IPv6 }}\r\n", - "ipv4": "🌐 IPv4: {{ .IPv4 }}\r\n", - "ip": "🌐 IP: {{ .IP }}\r\n", - "ips": "🔢 IP:\r\n{{ .IPs }}\r\n", - "serverUpTime": "⏳ Waktu Aktif: {{ .UpTime }} {{ .Unit }}\r\n", - "serverLoad": "📈 Beban Sistem: {{ .Load1 }}, {{ .Load2 }}, {{ .Load3 }}\r\n", - "serverMemory": "📋 RAM: {{ .Current }}/{{ .Total }}\r\n", - "tcpCount": "🔹 TCP: {{ .Count }}\r\n", - "udpCount": "🔸 UDP: {{ .Count }}\r\n", - "traffic": "🚦 Lalu Lintas: {{ .Total }} (↑{{ .Upload }},↓{{ .Download }})\r\n", - "xrayStatus": "ℹ️ Status: {{ .State }}\r\n", - "username": "👤 Nama Pengguna: {{ .Username }}\r\n", - "reason": "❗️ Alasan: {{ .Reason }}\r\n", - "time": "⏰ Waktu: {{ .Time }}\r\n", - "inbound": "📍 Inbound: {{ .Remark }}\r\n", - "port": "🔌 Port: {{ .Port }}\r\n", - "expire": "📅 Tanggal Kadaluarsa: {{ .Time }}\r\n", - "expireIn": "📅 Kadaluarsa Dalam: {{ .Time }}\r\n", - "active": "💡 Aktif: {{ .Enable }}\r\n", - "enabled": "🚨 Diaktifkan: {{ .Enable }}\r\n", - "online": "🌐 Status Koneksi: {{ .Status }}\r\n", - "lastOnline": "🔙 Terakhir online: {{ .Time }}\r\n", - "email": "📧 Email: {{ .Email }}\r\n", - "upload": "🔼 Unggah: ↑{{ .Upload }}\r\n", - "download": "🔽 Unduh: ↓{{ .Download }}\r\n", - "total": "📊 Total: ↑↓{{ .UpDown }} / {{ .Total }}\r\n", - "TGUser": "👤 Pengguna Telegram: {{ .TelegramID }}\r\n", - "exhaustedMsg": "🚨 Habis {{ .Type }}:\r\n", - "exhaustedCount": "🚨 Jumlah Habis {{ .Type }}:\r\n", - "onlinesCount": "🌐 Klien Online: {{ .Count }}\r\n", - "disabled": "🛑 Dinonaktifkan: {{ .Disabled }}\r\n", - "depleteSoon": "🔜 Habis Sebentar: {{ .Deplete }}\r\n\r\n", - "backupTime": "🗄 Waktu Backup: {{ .Time }}\r\n", - "refreshedOn": "\r\n📋🔄 Diperbarui Pada: {{ .Time }}\r\n\r\n", - "yes": "✅ Ya", - "no": "❌ Tidak", - "received_id": "🔑📥 ID diperbarui.", - "received_password": "🔑📥 Kata sandi diperbarui.", - "received_email": "📧📥 Email diperbarui.", - "received_comment": "💬📥 Komentar diperbarui.", - "id_prompt": "🔑 ID Default: {{ .ClientId }}\n\nMasukkan ID Anda.", - "pass_prompt": "🔑 Kata Sandi Default: {{ .ClientPassword }}\n\nMasukkan kata sandi Anda.", - "email_prompt": "📧 Email Default: {{ .ClientEmail }}\n\nMasukkan email Anda.", - "comment_prompt": "💬 Komentar Default: {{ .ClientComment }}\n\nMasukkan komentar Anda.", - "inbound_client_data_id": "🔄 Masuk: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 Email: {{ .ClientEmail }}\n📊 Lalu lintas: {{ .ClientTraffic }}\n📅 Tanggal Kedaluwarsa: {{ .ClientExp }}\n🌐 Batas IP: {{ .IpLimit }}\n💬 Komentar: {{ .ClientComment }}\n\nSekarang kamu bisa menambahkan klien ke inbound!", - "inbound_client_data_pass": "🔄 Masuk: {{ .InboundRemark }}\n\n🔑 Kata sandi: {{ .ClientPass }}\n📧 Email: {{ .ClientEmail }}\n📊 Lalu lintas: {{ .ClientTraffic }}\n📅 Tanggal Kedaluwarsa: {{ .ClientExp }}\n🌐 Batas IP: {{ .IpLimit }}\n💬 Komentar: {{ .ClientComment }}\n\nSekarang kamu bisa menambahkan klien ke inbound!", - "cancel": "❌ Proses Dibatalkan! \n\nAnda dapat /start lagi kapan saja. 🔄", - "error_add_client": "⚠️ Kesalahan:\n\n {{ .error }}", - "using_default_value": "Oke, saya akan tetap menggunakan nilai default. 😊", - "incorrect_input": "Masukan Anda tidak valid.\nFrasa harus berlanjut tanpa spasi.\nContoh benar: aaaaaa\nContoh salah: aaa aaa 🚫", - "AreYouSure": "Apakah kamu yakin? 🤔", - "SuccessResetTraffic": "📧 Email: {{ .ClientEmail }}\n🏁 Hasil: ✅ Berhasil", - "FailedResetTraffic": "📧 Email: {{ .ClientEmail }}\n🏁 Hasil: ❌ Gagal \n\n🛠️ Kesalahan: [ {{ .ErrorMessage }} ]", - "FinishProcess": "🔚 Proses reset traffic selesai untuk semua klien." - }, - "buttons": { - "closeKeyboard": "❌ Tutup Papan Ketik", - "cancel": "❌ Batal", - "cancelReset": "❌ Batal Reset", - "cancelIpLimit": "❌ Batal Batas IP", - "confirmResetTraffic": "✅ Konfirmasi Reset Lalu Lintas?", - "confirmClearIps": "✅ Konfirmasi Hapus IPs?", - "confirmRemoveTGUser": "✅ Konfirmasi Hapus Pengguna Telegram?", - "confirmToggle": "✅ Konfirmasi Aktifkan/Nonaktifkan Pengguna?", - "dbBackup": "Dapatkan Cadangan DB", - "serverUsage": "Penggunaan Server", - "getInbounds": "Dapatkan Inbounds", - "depleteSoon": "Habis Sebentar", - "clientUsage": "Dapatkan Penggunaan", - "onlines": "Klien Online", - "commands": "Perintah", - "refresh": "🔄 Perbarui", - "clearIPs": "❌ Hapus IPs", - "removeTGUser": "❌ Hapus Pengguna Telegram", - "selectTGUser": "👤 Pilih Pengguna Telegram", - "selectOneTGUser": "👤 Pilih Pengguna Telegram:", - "resetTraffic": "📈 Reset Lalu Lintas", - "resetExpire": "📅 Ubah Tanggal Kadaluarsa", - "ipLog": "🔢 Log IP", - "ipLimit": "🔢 Batas IP", - "setTGUser": "👤 Set Pengguna Telegram", - "toggle": "🔘 Aktifkan / Nonaktifkan", - "custom": "🔢 Kustom", - "confirmNumber": "✅ Konfirmasi: {{ .Num }}", - "confirmNumberAdd": "✅ Konfirmasi menambahkan: {{ .Num }}", - "limitTraffic": "🚧 Batas Lalu Lintas", - "getBanLogs": "Dapatkan Log Pemblokiran", - "allClients": "Semua Klien", - "addClient": "Tambah Klien", - "submitDisable": "Kirim Sebagai Nonaktif ☑️", - "submitEnable": "Kirim Sebagai Aktif ✅", - "use_default": "🏷️ Gunakan Default", - "change_id": "⚙️🔑 ID", - "change_password": "⚙️🔑 Kata Sandi", - "change_email": "⚙️📧 Email", - "change_comment": "⚙️💬 Komentar", - "ResetAllTraffics": "Reset Semua Lalu Lintas", - "SortedTrafficUsageReport": "Laporan Penggunaan Lalu Lintas yang Terurut" - }, "answers": { - "successfulOperation": "✅ Operasi berhasil!", - "errorOperation": "❗ Kesalahan dalam operasi.", - "getInboundsFailed": "❌ Gagal mendapatkan inbounds.", - "getClientsFailed": "❌ Gagal mendapatkan klien.", - "canceled": "❌ {{ .Email }}: Operasi dibatalkan.", - "clientRefreshSuccess": "✅ {{ .Email }}: Klien diperbarui dengan berhasil.", "IpRefreshSuccess": "✅ {{ .Email }}: IP diperbarui dengan berhasil.", "TGIdRefreshSuccess": "✅ {{ .Email }}: Pengguna Telegram Klien diperbarui dengan berhasil.", - "resetTrafficSuccess": "✅ {{ .Email }}: Lalu lintas direset dengan berhasil.", - "setTrafficLimitSuccess": "✅ {{ .Email }}: Batas lalu lintas disimpan dengan berhasil.", - "expireResetSuccess": "✅ {{ .Email }}: Hari kadaluarsa direset dengan berhasil.", - "resetIpSuccess": "✅ {{ .Email }}: Batas IP {{ .Count }} disimpan dengan berhasil.", + "askToAddUserId": "Konfigurasi Anda tidak ditemukan!\r\nSilakan minta admin Anda untuk menggunakan ChatID Telegram Anda dalam konfigurasi Anda.\r\n\r\nChatID Pengguna Anda: \u003ccode\u003e{{ .TgUserID }}\u003c/code\u003e", + "canceled": "❌ {{ .Email }}: Operasi dibatalkan.", + "chooseClient": "Pilih Klien untuk Inbound {{ .Inbound }}", + "chooseInbound": "Pilih Inbound", "clearIpSuccess": "✅ {{ .Email }}: IP dihapus dengan berhasil.", + "clientRefreshSuccess": "✅ {{ .Email }}: Klien diperbarui dengan berhasil.", + "disableSuccess": "✅ {{ .Email }}: Dinonaktifkan dengan berhasil.", + "enableSuccess": "✅ {{ .Email }}: Diaktifkan dengan berhasil.", + "errorOperation": "❗ Kesalahan dalam operasi.", + "expireResetSuccess": "✅ {{ .Email }}: Hari kadaluarsa direset dengan berhasil.", + "getClientsFailed": "❌ Gagal mendapatkan klien.", + "getInboundsFailed": "❌ Gagal mendapatkan inbounds.", "getIpLog": "✅ {{ .Email }}: Dapatkan Log IP.", "getUserInfo": "✅ {{ .Email }}: Dapatkan Info Pengguna Telegram.", "removedTGUserSuccess": "✅ {{ .Email }}: Pengguna Telegram dihapus dengan berhasil.", - "enableSuccess": "✅ {{ .Email }}: Diaktifkan dengan berhasil.", - "disableSuccess": "✅ {{ .Email }}: Dinonaktifkan dengan berhasil.", - "askToAddUserId": "Konfigurasi Anda tidak ditemukan!\r\nSilakan minta admin Anda untuk menggunakan ChatID Telegram Anda dalam konfigurasi Anda.\r\n\r\nChatID Pengguna Anda: {{ .TgUserID }}", - "chooseClient": "Pilih Klien untuk Inbound {{ .Inbound }}", - "chooseInbound": "Pilih Inbound" - } - } -} + "resetIpSuccess": "✅ {{ .Email }}: Batas IP {{ .Count }} disimpan dengan berhasil.", + "resetTrafficSuccess": "✅ {{ .Email }}: Lalu lintas direset dengan berhasil.", + "setTrafficLimitSuccess": "✅ {{ .Email }}: Batas lalu lintas disimpan dengan berhasil.", + "successfulOperation": "✅ Operasi berhasil!" + }, + "buttons": { + "ResetAllTraffics": "Reset Semua Lalu Lintas", + "SortedTrafficUsageReport": "Laporan Penggunaan Lalu Lintas yang Terurut", + "addClient": "Tambah Klien", + "allClients": "Semua Klien", + "cancel": "❌ Batal", + "cancelIpLimit": "❌ Batal Batas IP", + "cancelReset": "❌ Batal Reset", + "change_comment": "⚙️💬 Komentar", + "change_email": "⚙️📧 Email", + "change_flow": "🌊 Flow", + "change_id": "⚙️🔑 ID", + "change_password": "⚙️🔑 Kata Sandi", + "change_subid": "📝 Sub ID", + "clearIPs": "❌ Hapus IPs", + "clientUsage": "Dapatkan Penggunaan", + "closeKeyboard": "❌ Tutup Papan Ketik", + "commands": "Perintah", + "confirmClearIps": "✅ Konfirmasi Hapus IPs?", + "confirmNumber": "✅ Konfirmasi: {{ .Num }}", + "confirmNumberAdd": "✅ Konfirmasi menambahkan: {{ .Num }}", + "confirmRemoveTGUser": "✅ Konfirmasi Hapus Pengguna Telegram?", + "confirmResetTraffic": "✅ Konfirmasi Reset Lalu Lintas?", + "confirmToggle": "✅ Konfirmasi Aktifkan/Nonaktifkan Pengguna?", + "custom": "🔢 Kustom", + "dbBackup": "Dapatkan Cadangan DB", + "depleteSoon": "Habis Sebentar", + "flow_none": "None", + "getBanLogs": "Dapatkan Log Pemblokiran", + "getInbounds": "Dapatkan Inbounds", + "ipLimit": "🔢 Batas IP", + "ipLog": "🔢 Log IP", + "limitTraffic": "🚧 Batas Lalu Lintas", + "onlines": "Klien Online", + "refresh": "🔄 Perbarui", + "removeTGUser": "❌ Hapus Pengguna Telegram", + "resetExpire": "📅 Ubah Tanggal Kadaluarsa", + "resetTraffic": "📈 Reset Lalu Lintas", + "selectOneTGUser": "👤 Pilih Pengguna Telegram:", + "selectTGUser": "👤 Pilih Pengguna Telegram", + "serverUsage": "Penggunaan Server", + "setTGUser": "👤 Set Pengguna Telegram", + "submitDisable": "Kirim Sebagai Nonaktif ☑️", + "submitEnable": "Kirim Sebagai Aktif ✅", + "toggle": "🔘 Aktifkan / Nonaktifkan", + "use_default": "🏷️ Gunakan Default" + }, + "clients": "Klien", + "commands": { + "getID": "🆔 ID Anda: \u003ccode\u003e{{ .ID }}\u003c/code\u003e", + "help": "🤖 Selamat datang di bot ini! Ini dirancang untuk menyediakan data tertentu dari panel web dan memungkinkan Anda melakukan modifikasi sesuai kebutuhan.\r\n\r\n", + "helpAdminCommands": "Untuk memulai ulang Xray Core:\r\n\u003ccode\u003e/restart\u003c/code\u003e\r\n\r\nUntuk mencari email klien:\r\n\u003ccode\u003e/usage [Email]\u003c/code\u003e\r\n\r\nUntuk mencari inbound (dengan statistik klien):\r\n\u003ccode\u003e/inbound [Catatan]\u003c/code\u003e\r\n\r\nID Obrolan Telegram:\r\n\u003ccode\u003e/id\u003c/code\u003e", + "helpClientCommands": "Untuk mencari statistik, gunakan perintah berikut:\r\n\u003ccode\u003e/usage [Email]\u003c/code\u003e\r\n\r\nID Obrolan Telegram:\r\n\u003ccode\u003e/id\u003c/code\u003e", + "helpDesc": "Bantuan bot", + "idDesc": "Tampilkan ID Telegram Anda", + "pleaseChoose": "👇 Harap pilih:\r\n", + "restartFailed": "❗ Kesalahan dalam operasi.\r\n\r\n\u003ccode\u003eError: {{ .Error }}\u003c/code\u003e.", + "restartSuccess": "✅ Operasi berhasil!", + "restartUsage": "\r\n\r\n\u003ccode\u003e/restart\u003c/code\u003e", + "start": "👋 Halo \u003ci\u003e{{ .Firstname }}\u003c/i\u003e.\r\n", + "startDesc": "Tampilkan menu utama", + "status": "✅ Bot dalam keadaan baik!", + "statusDesc": "Periksa status bot", + "unknown": "❗ Perintah tidak dikenal.", + "usage": "❗ Harap berikan teks untuk mencari!", + "welcome": "🤖 Selamat datang di \u003cb\u003e{{.Hostname }}\u003c/b\u003e bot managemen.\r\n", + "xrayNotRunning": "❗ Xray Core tidak berjalan." + }, + "day": "Hari", + "days": "Hari", + "hours": "Jam", + "inbounds": "Inbound", + "keyboardClosed": "❌ Keyboard ditutup!", + "messages": { + "2faFailed": "2FA Gagal", + "AreYouSure": "Apakah kamu yakin? 🤔", + "FailedResetTraffic": "📧 Email: {{ .ClientEmail }}\n🏁 Hasil: ❌ Gagal \n\n🛠️ Kesalahan: [ {{ .ErrorMessage }} ]", + "FinishProcess": "🔚 Proses reset traffic selesai untuk semua klien.", + "SuccessResetTraffic": "📧 Email: {{ .ClientEmail }}\n🏁 Hasil: ✅ Berhasil", + "TGUser": "👤 Pengguna Telegram: {{ .TelegramID }}\r\n", + "active": "💡 Aktif: {{ .Enable }}\r\n", + "backupTime": "🗄 Waktu Backup: {{ .Time }}\r\n", + "cancel": "❌ Proses Dibatalkan! \n\nAnda dapat /start lagi kapan saja. 🔄", + "client_flow": "Flow:", + "client_subid": "Sub ID:", + "comment_prompt": "💬 Komentar Default: {{ .ClientComment }}\n\nMasukkan komentar Anda.", + "cpuThreshold": "🔴 Beban CPU {{ .Percent }}% melebihi batas {{ .Threshold }}%", + "datetime": "⏰ Tanggal \u0026 Waktu: {{ .DateTime }}\r\n", + "depleteSoon": "🔜 Habis Sebentar: {{ .Deplete }}\r\n\r\n", + "disabled": "🛑 Dinonaktifkan: {{ .Disabled }}\r\n", + "download": "🔽 Unduh: ↓{{ .Download }}\r\n", + "email": "📧 Email: {{ .Email }}\r\n", + "email_prompt": "📧 Email Default: {{ .ClientEmail }}\n\nMasukkan email Anda.", + "enabled": "🚨 Diaktifkan: {{ .Enable }}\r\n", + "error_add_client": "⚠️ Kesalahan:\n\n {{ .error }}", + "exhaustedCount": "🚨 Jumlah Habis {{ .Type }}:\r\n", + "exhaustedMsg": "🚨 Habis {{ .Type }}:\r\n", + "expire": "📅 Tanggal Kadaluarsa: {{ .Time }}\r\n", + "expireIn": "📅 Kadaluarsa Dalam: {{ .Time }}\r\n", + "hostname": "💻 Host: {{ .Hostname }}\r\n", + "id_prompt": "🔑 ID Default: {{ .ClientId }}\n\nMasukkan ID Anda.", + "inbound": "📍 Inbound: {{ .Remark }}\r\n", + "inbound_client_data_id": "🔄 Masuk: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 Email: {{ .ClientEmail }}\n📊 Lalu lintas: {{ .ClientTraffic }}\n📅 Tanggal Kedaluwarsa: {{ .ClientExp }}\n🌐 Batas IP: {{ .IpLimit }}\n💬 Komentar: {{ .ClientComment }}\n\nSekarang kamu bisa menambahkan klien ke inbound!", + "inbound_client_data_pass": "🔄 Masuk: {{ .InboundRemark }}\n\n🔑 Kata sandi: {{ .ClientPass }}\n📧 Email: {{ .ClientEmail }}\n📊 Lalu lintas: {{ .ClientTraffic }}\n📅 Tanggal Kedaluwarsa: {{ .ClientExp }}\n🌐 Batas IP: {{ .IpLimit }}\n💬 Komentar: {{ .ClientComment }}\n\nSekarang kamu bisa menambahkan klien ke inbound!", + "incorrect_input": "Masukan Anda tidak valid.\nFrasa harus berlanjut tanpa spasi.\nContoh benar: aaaaaa\nContoh salah: aaa aaa 🚫", + "invalid_subid": "Invalid format.\nSub ID can only contain letters, numbers, hyphens (-), and underscores (_).\nSpaces and special characters are not allowed. 🚫", + "ip": "🌐 IP: {{ .IP }}\r\n", + "ips": "🔢 IP:\r\n{{ .IPs }}\r\n", + "ipv4": "🌐 IPv4: {{ .IPv4 }}\r\n", + "ipv6": "🌐 IPv6: {{ .IPv6 }}\r\n", + "lastOnline": "🔙 Terakhir online: {{ .Time }}\r\n", + "loginFailed": "❗️ Gagal masuk ke panel.\r\n", + "loginSuccess": "✅ Berhasil masuk ke panel.\r\n", + "no": "❌ Tidak", + "online": "🌐 Status Koneksi: {{ .Status }}\r\n", + "onlinesCount": "🌐 Klien Online: {{ .Count }}\r\n", + "pass_prompt": "🔑 Kata Sandi Default: {{ .ClientPassword }}\n\nMasukkan kata sandi Anda.", + "port": "🔌 Port: {{ .Port }}\r\n", + "reason": "❗️ Alasan: {{ .Reason }}\r\n", + "received_comment": "💬📥 Komentar diperbarui.", + "received_email": "📧📥 Email diperbarui.", + "received_id": "🔑📥 ID diperbarui.", + "received_password": "🔑📥 Kata sandi diperbarui.", + "received_subid": "Sub ID updated successfully!", + "refreshedOn": "\r\n📋🔄 Diperbarui Pada: {{ .Time }}\r\n\r\n", + "report": "🕰 Laporan Terjadwal: {{ .RunTime }}\r\n", + "selectUserFailed": "❌ Kesalahan dalam pemilihan pengguna!", + "serverLoad": "📈 Beban Sistem: {{ .Load1 }}, {{ .Load2 }}, {{ .Load3 }}\r\n", + "serverMemory": "📋 RAM: {{ .Current }}/{{ .Total }}\r\n", + "serverUpTime": "⏳ Waktu Aktif: {{ .UpTime }} {{ .Unit }}\r\n", + "subid_prompt": "Please enter new Sub ID:\nCurrent: {{.ClientSubId}}", + "tcpCount": "🔹 TCP: {{ .Count }}\r\n", + "time": "⏰ Waktu: {{ .Time }}\r\n", + "total": "📊 Total: ↑↓{{ .UpDown }} / {{ .Total }}\r\n", + "traffic": "🚦 Lalu Lintas: {{ .Total }} (↑{{ .Upload }},↓{{ .Download }})\r\n", + "udpCount": "🔸 UDP: {{ .Count }}\r\n", + "upload": "🔼 Unggah: ↑{{ .Upload }}\r\n", + "userSaved": "✅ Pengguna Telegram tersimpan.", + "username": "👤 Nama Pengguna: {{ .Username }}\r\n", + "using_default_value": "Oke, saya akan tetap menggunakan nilai default. 😊", + "version": "🚀 Versi 3X-UI: {{ .Version }}\r\n", + "xrayStatus": "ℹ️ Status: {{ .State }}\r\n", + "xrayVersion": "📡 Versi Xray: {{ .XrayVersion }}\r\n", + "yes": "✅ Ya" + }, + "minutes": "Menit", + "month": "Bulan", + "months": "Bulan", + "noInbounds": "❗ Tidak ada inbound yang ditemukan!", + "noIpRecord": "❗ Tidak ada Catatan IP!", + "noQuery": "❌ Kueri tidak ditemukan! Silakan gunakan perintah lagi!", + "noResult": "❗ Tidak ada hasil!", + "offline": "🔴 Offline", + "online": "🟢 Online", + "unknown": "Tidak diketahui", + "unlimited": "♾ Tidak terbatas (Reset)", + "wentWrong": "❌ Terjadi kesalahan!" + }, + "transmission": "Transmisi", + "twoFactorCode": "Kode", + "unlimited": "Tanpa Batas", + "update": "Perbarui", + "usage": "Penggunaan", + "useIPv4ForHost": "Gunakan IPv4 untuk host", + "username": "Nama Pengguna" +} \ No newline at end of file diff --git a/web/translation/ja-JP.json b/web/translation/ja-JP.json index 1daca2e5..8986a6f2 100644 --- a/web/translation/ja-JP.json +++ b/web/translation/ja-JP.json @@ -1,750 +1,604 @@ { - "username": "ユーザー名", - "password": "パスワード", - "login": "ログイン", - "confirm": "確認", - "cancel": "キャンセル", - "close": "閉じる", - "save": "保存", - "logout": "ログアウト", - "create": "作成", - "update": "更新", - "copy": "コピー", - "copied": "コピー済み", - "download": "ダウンロード", - "remark": "備考", - "enable": "有効化", - "protocol": "プロトコル", - "search": "検索", - "filter": "フィルター", - "loading": "読み込み中...", - "second": "秒", - "minute": "分", - "hour": "時間", - "day": "日", - "check": "確認", - "indefinite": "無期限", - "unlimited": "無制限", - "none": "なし", - "qrCode": "QRコード", - "info": "詳細情報", - "edit": "編集", - "delete": "削除", - "reset": "リセット", - "noData": "データなし。", - "copySuccess": "コピー成功", - "sure": "確定", - "encryption": "暗号化", - "useIPv4ForHost": "ホストにIPv4を使用", - "transmission": "伝送", - "host": "ホスト", - "path": "パス", "camouflage": "偽装", - "status": "ステータス", - "enabled": "有効", - "disabled": "無効", + "cancel": "キャンセル", + "certificate": "証明書", + "check": "確認", + "clients": "クライアント", + "close": "閉じる", + "comment": "コメント", + "confirm": "確認", + "copied": "コピー済み", + "copy": "コピー", + "copySuccess": "コピー成功", + "create": "作成", + "day": "日", + "delete": "削除", "depleted": "消耗済み", "depletingSoon": "間もなく消耗", - "offline": "オフライン", - "online": "オンライン", + "disabled": "無効", "domainName": "ドメイン名", - "monitor": "監視", - "certificate": "証明書", - "fail": "失敗", - "comment": "コメント", - "success": "成功", - "lastOnline": "最終オンライン", - "getVersion": "バージョン取得", - "install": "インストール", - "clients": "クライアント", - "usage": "利用状況", - "twoFactorCode": "コード", - "remained": "残り", - "security": "セキュリティ", - "secAlertTitle": "セキュリティアラート", - "secAlertSsl": "この接続は安全ではありません。TLSを有効にしてデータ保護を行うまで、機密情報を入力しないでください。", - "secAlertConf": "一部の設定は脆弱です。潜在的な脆弱性を防ぐために、セキュリティプロトコルを強化することをお勧めします。", - "secAlertSSL": "セキュアな接続がありません。データ保護のためにTLS証明書をインストールしてください。", - "secAlertPanelPort": "デフォルトのポートにはセキュリティリスクがあります。ランダムなポートまたは特定のポートを設定してください。", - "secAlertPanelURI": "デフォルトのURIパスは安全ではありません。複雑なURIパスを設定してください。", - "secAlertSubURI": "サブスクリプションのデフォルトURIパスは安全ではありません。複雑なURIパスを設定してください。", - "secAlertSubJsonURI": "JSONサブスクリプションのデフォルトURIパスは安全ではありません。複雑なURIパスを設定してください。", + "download": "ダウンロード", + "edit": "編集", + "emptyBalancersDesc": "追加されたバランサーはありません。", "emptyDnsDesc": "追加されたDNSサーバーはありません。", "emptyFakeDnsDesc": "追加されたFake DNSサーバーはありません。", - "emptyBalancersDesc": "追加されたバランサーはありません。", "emptyReverseDesc": "追加されたリバースプロキシはありません。", - "somethingWentWrong": "エラーが発生しました", - "subscription": { - "title": "サブスクリプション情報", - "subId": "サブスクリプションID", - "status": "ステータス", - "downloaded": "ダウンロード", - "uploaded": "アップロード", - "expiry": "有効期限", - "totalQuota": "合計クォータ", - "individualLinks": "個別リンク", - "active": "有効", - "inactive": "無効", - "unlimited": "無制限", - "noExpiry": "期限なし" - }, + "enable": "有効化", + "enabled": "有効", + "encryption": "暗号化", + "fail": "失敗", + "filter": "フィルター", + "getVersion": "バージョン取得", + "host": "ホスト", + "hour": "時間", + "indefinite": "無期限", + "info": "詳細情報", + "install": "インストール", + "lastOnline": "最終オンライン", + "loading": "読み込み中...", + "login": "ログイン", + "logout": "ログアウト", "menu": { - "theme": "テーマ", + "apiDocs": "API ドキュメント", "dark": "ダーク", - "ultraDark": "ウルトラダーク", "dashboard": "ダッシュボード", "inbounds": "インバウンド一覧", + "link": "リンク管理", + "logout": "ログアウト", "nodes": "ノード", "settings": "パネル設定", - "xray": "Xray設定", - "apiDocs": "API ドキュメント", - "logout": "ログアウト", - "link": "リンク管理" + "theme": "テーマ", + "ultraDark": "ウルトラダーク", + "xray": "Xray設定" }, + "minute": "分", + "monitor": "監視", + "noData": "データなし。", + "none": "なし", + "offline": "オフライン", + "online": "オンライン", "pages": { - "login": { - "hello": "こんにちは", - "title": "ようこそ", - "loginAgain": "ログインセッションが切れました。再度ログインしてください。", - "toasts": { - "invalidFormData": "データ形式エラー", - "emptyUsername": "ユーザー名を入力してください", - "emptyPassword": "パスワードを入力してください", - "wrongUsernameOrPassword": "ユーザー名、パスワード、または二段階認証コードが無効です。", - "successLogin": "アカウントに正常にログインしました。" - } - }, - "index": { - "title": "システムステータス", - "cpu": "CPU", - "logicalProcessors": "論理プロセッサ", - "frequency": "周波数", - "swap": "スワップ", - "storage": "ストレージ", - "memory": "RAM", - "threads": "スレッド", - "xrayStatus": "Xray", - "stopXray": "停止", - "restartXray": "再起動", - "xraySwitch": "バージョン", - "xraySwitchClick": "切り替えるバージョンを選択してください", - "xraySwitchClickDesk": "慎重に選択してください。古いバージョンは現在の設定と互換性がない可能性があります。", - "xrayUpdates": "Xrayの更新", - "updatePanel": "パネルを更新", - "panelUpdateDesc": "これにより3X-UIが最新リリースに更新され、パネルサービスが再起動されます。", - "currentPanelVersion": "現在のパネルバージョン", - "latestPanelVersion": "最新のパネルバージョン", - "panelUpToDate": "パネルは最新です", - "upToDate": "最新", - "xrayStatusUnknown": "不明", - "xrayStatusRunning": "実行中", - "xrayStatusStop": "停止", - "xrayStatusError": "エラー", - "xrayErrorPopoverTitle": "Xrayの実行中にエラーが発生しました", - "operationHours": "システム稼働時間", - "systemHistoryTitle": "システム履歴", - "charts": "チャート", - "xrayMetricsTitle": "Xray メトリクス", - "xrayMetricsDisabled": "Xray メトリクスエンドポイントが設定されていません", - "xrayMetricsHint": "xray 設定にトップレベルの metrics ブロック(tag: metrics_out、listen: 127.0.0.1:11111)を追加し、xray を再起動してください。", - "xrayObservatoryEmpty": "Observatory データはまだありません", - "xrayObservatoryHint": "xray 設定に observatory ブロックを追加し、プローブする outbound タグを列挙してから xray を再起動してください。", - "xrayObservatoryTagPlaceholder": "Outbound を選択", - "xrayObservatoryAlive": "稼働中", - "xrayObservatoryDead": "停止", - "xrayObservatoryLastSeen": "最終確認", - "xrayObservatoryLastTry": "最終試行", - "trendLast2Min": "直近2分", - "systemLoad": "システム負荷", - "systemLoadDesc": "過去1、5、15分間のシステム平均負荷", - "connectionCount": "接続数", - "ipAddresses": "IPアドレス", - "toggleIpVisibility": "IPの表示を切り替える", - "overallSpeed": "全体の速度", - "upload": "アップロード", - "download": "ダウンロード", - "totalData": "総データ量", - "sent": "送信", - "received": "受信", - "documentation": "ドキュメント", - "xraySwitchVersionDialog": "Xrayのバージョンを本当に変更しますか?", - "xraySwitchVersionDialogDesc": "Xrayのバージョンが#version#に変更されます。", - "xraySwitchVersionPopover": "Xrayの更新が成功しました", - "panelUpdateDialog": "本当にパネルを更新しますか?", - "panelUpdateDialogDesc": "これにより3X-UIが#version#に更新され、パネルサービスが再起動されます。", - "panelUpdateCheckPopover": "パネルの更新確認に失敗しました", - "panelUpdateStartedPopover": "パネルの更新を開始しました", - "geofileUpdateDialog": "ジオファイルを本当に更新しますか?", - "geofileUpdateDialogDesc": "これにより#filename#ファイルが更新されます。", - "geofilesUpdateDialogDesc": "これにより、すべてのファイルが更新されます。", - "geofilesUpdateAll": "すべて更新", - "geofileUpdatePopover": "ジオファイルの更新が成功しました", - "dontRefresh": "インストール中、このページをリロードしないでください", - "logs": "ログ", - "config": "設定", - "backup": "バックアップ", - "backupTitle": "バックアップと復元", - "exportDatabase": "バックアップ", - "exportDatabaseDesc": "クリックして、現在のデータベースのバックアップを含む .db ファイルをデバイスにダウンロードします。", - "importDatabase": "復元", - "importDatabaseDesc": "クリックして、デバイスから .db ファイルを選択し、アップロードしてバックアップからデータベースを復元します。", - "importDatabaseSuccess": "データベースのインポートに成功しました", - "importDatabaseError": "データベースのインポート中にエラーが発生しました", - "readDatabaseError": "データベースの読み取り中にエラーが発生しました", - "getDatabaseError": "データベースの取得中にエラーが発生しました", - "getConfigError": "設定ファイルの取得中にエラーが発生しました", - "customGeoTitle": "カスタム GeoSite / GeoIP", - "customGeoAdd": "追加", - "customGeoType": "種類", - "customGeoAlias": "エイリアス", - "customGeoUrl": "URL", - "customGeoEnabled": "有効", - "customGeoLastUpdated": "最終更新", - "customGeoExtColumn": "ルーティング (ext:…)", - "customGeoToastUpdateAll": "すべてのカスタムソースを更新しました", - "customGeoActions": "操作", - "customGeoEdit": "編集", - "customGeoDelete": "削除", - "customGeoDownload": "今すぐ更新", - "customGeoModalAdd": "カスタム geo を追加", - "customGeoModalEdit": "カスタム geo を編集", - "customGeoModalSave": "保存", - "customGeoDeleteConfirm": "このカスタム geo ソースを削除しますか?", - "customGeoRoutingHint": "ルーティングでは値を ext:ファイル.dat:タグ(タグを置換)として使います。", - "customGeoInvalidId": "無効なリソース ID", - "customGeoAliasesError": "カスタム geo エイリアスの読み込みに失敗しました", - "customGeoValidationAlias": "エイリアスは小文字・数字・- と _ のみ使用できます", - "customGeoValidationUrl": "URL は http:// または https:// で始めてください", - "customGeoAliasPlaceholder": "a-z 0-9 _ -", - "customGeoAliasLabelSuffix": "(カスタム)", - "customGeoToastList": "カスタム geo 一覧", - "customGeoToastAdd": "カスタム geo を追加", - "customGeoToastUpdate": "カスタム geo を更新", - "customGeoToastDelete": "カスタム geofile「{{ .fileName }}」を削除しました", - "customGeoToastDownload": "geofile「{{ .fileName }}」を更新しました", - "customGeoErrInvalidType": "種類は geosite または geoip である必要があります", - "customGeoErrAliasRequired": "エイリアスが必要です", - "customGeoErrAliasPattern": "エイリアスに使用できない文字が含まれています", - "customGeoErrAliasReserved": "このエイリアスは予約されています", - "customGeoErrUrlRequired": "URL が必要です", - "customGeoErrInvalidUrl": "URL が無効です", - "customGeoErrUrlScheme": "URL は http または https を使用してください", - "customGeoErrUrlHost": "URL のホストが無効です", - "customGeoErrDuplicateAlias": "この種類ですでにこのエイリアスが使われています", - "customGeoErrNotFound": "カスタム geo ソースが見つかりません", - "customGeoErrDownload": "ダウンロードに失敗しました", - "customGeoErrUpdateAllIncomplete": "カスタム geo ソースの 1 件以上を更新できませんでした", - "customGeoEmpty": "カスタム geo ソースはまだありません — 「追加」をクリックして作成してください" + "client": { + "add": "クライアント追加", + "bulk": "一括作成", + "clearAll": "すべて解除", + "clientCount": "クライアント数", + "copyEmailPreview": "結果メールのプレビュー", + "copyFlowHint": "すべてのコピー対象クライアントに適用されます。空のままにするとスキップします。", + "copyFlowLabel": "新規クライアントの Flow (VLESS)", + "copyFromInbound": "インバウンドからクライアントをコピー", + "copyResult": "コピー結果", + "copyResultErrors": "コピーエラー", + "copyResultNone": "コピーする項目がありません: クライアントが選択されていないかソースが空です", + "copyResultSuccess": "正常にコピーされました", + "copySelectSourceFirst": "先にソースインバウンドを選択してください。", + "copySelected": "選択項目をコピー", + "copySource": "ソース", + "copyToInbound": "クライアントのコピー先", + "days": "日", + "delayedStart": "初回使用後に開始", + "edit": "クライアント編集", + "expireDays": "期間", + "first": "最初", + "last": "最後", + "method": "方法", + "postfix": "サフィックス", + "prefix": "プレフィックス", + "renew": "自動更新", + "renewDesc": "期限が切れた後に自動更新。(0 = 無効)(単位:日)", + "selectAll": "すべて選択", + "submitAdd": "クライアント追加", + "submitEdit": "変更を保存" }, "inbounds": { - "allTimeTraffic": "総トラフィック", - "allTimeTrafficUsage": "これまでの総使用量", - "title": "インバウンド一覧", - "totalDownUp": "総アップロード / ダウンロード", - "totalUsage": "総使用量", - "inboundCount": "インバウンド数", - "operate": "メニュー", - "enable": "有効化", - "remark": "備考", - "node": "ノード", - "deployTo": "デプロイ先", - "localPanel": "ローカルパネル", - "protocol": "プロトコル", - "port": "ポート", - "portMap": "ポートマッピング", - "traffic": "トラフィック", - "details": "詳細情報", - "transportConfig": "トランスポート設定", - "expireDate": "有効期限", - "createdAt": "作成", - "updatedAt": "更新", - "resetTraffic": "トラフィックリセット", - "addInbound": "インバウンド追加", - "generalActions": "一般操作", - "modifyInbound": "インバウンド修正", - "deleteInbound": "インバウンド削除", - "deleteInboundContent": "インバウンドを削除してもよろしいですか?", - "deleteClient": "クライアント削除", - "deleteClientContent": "クライアントを削除してもよろしいですか?", - "resetTrafficContent": "トラフィックをリセットしてもよろしいですか?", - "copyLink": "リンクをコピー", - "address": "アドレス", - "network": "ネットワーク", - "destinationPort": "宛先ポート", - "targetAddress": "宛先アドレス", - "monitorDesc": "空白にするとすべてのIPを監視", - "meansNoLimit": "= 無制限(単位:GB)", - "totalFlow": "総トラフィック", - "leaveBlankToNeverExpire": "空白にすると期限なし", - "noRecommendKeepDefault": "デフォルト値を保持することをお勧めします", - "certificatePath": "ファイルパス", - "certificateContent": "ファイル内容", - "publicKey": "公開鍵", - "privatekey": "秘密鍵", - "clickOnQRcode": "QRコードをクリックしてコピー", - "client": "クライアント", - "export": "リンクエクスポート", - "clone": "複製", - "cloneInbound": "複製", - "cloneInboundContent": "このインバウンドルールは、ポート(Port)、リスニングIP(Listening IP)、クライアント(Clients)を除くすべての設定がクローンされます", - "cloneInboundOk": "クローン作成", - "resetAllTraffic": "すべてのインバウンドトラフィックをリセット", - "resetAllTrafficTitle": "すべてのインバウンドトラフィックをリセット", - "resetAllTrafficContent": "すべてのインバウンドトラフィックをリセットしてもよろしいですか?", - "resetInboundClientTraffics": "クライアントトラフィックをリセット", - "resetInboundClientTrafficTitle": "すべてのクライアントトラフィックをリセット", - "resetInboundClientTrafficContent": "このインバウンドクライアントのすべてのトラフィックをリセットしてもよろしいですか?", - "resetAllClientTraffics": "すべてのクライアントトラフィックをリセット", - "resetAllClientTrafficTitle": "すべてのクライアントトラフィックをリセット", - "resetAllClientTrafficContent": "すべてのクライアントのトラフィックをリセットしてもよろしいですか?", - "delDepletedClients": "トラフィックが尽きたクライアントを削除", - "delDepletedClientsTitle": "トラフィックが尽きたクライアントを削除", - "delDepletedClientsContent": "トラフィックが尽きたすべてのクライアントを削除してもよろしいですか?", - "email": "メールアドレス", - "emailDesc": "メールアドレスは一意でなければなりません", "IPLimit": "IP制限", "IPLimitDesc": "設定値を超えるとインバウンドトラフィックが無効になります。(0 = 無効)", "IPLimitlog": "IPログ", "IPLimitlogDesc": "IP履歴ログ(無効なインバウンドトラフィックを有効にするには、ログをクリアしてください)", "IPLimitlogclear": "ログをクリア", - "setDefaultCert": "パネル設定から証明書を設定", - "telegramDesc": "TelegramチャットIDを提供してください。(ボットで'/id'コマンドを使用)または({'@'}userinfobot)", - "subscriptionDesc": "サブスクリプションURLを見つけるには、“詳細情報”に移動してください。また、複数のクライアントに同じ名前を使用することができます。", - "info": "情報", - "same": "同じ", - "inboundData": "インバウンドデータ", + "addInbound": "インバウンド追加", + "address": "アドレス", + "allTimeTraffic": "総トラフィック", + "allTimeTrafficUsage": "これまでの総使用量", + "certificateContent": "ファイル内容", + "certificatePath": "ファイルパス", + "clickOnQRcode": "QRコードをクリックしてコピー", + "client": "クライアント", + "clone": "複製", + "cloneInbound": "複製", + "cloneInboundContent": "このインバウンドルールは、ポート(Port)、リスニングIP(Listening IP)、クライアント(Clients)を除くすべての設定がクローンされます", + "cloneInboundOk": "クローン作成", + "copyLink": "リンクをコピー", + "createdAt": "作成", + "delDepletedClients": "トラフィックが尽きたクライアントを削除", + "delDepletedClientsContent": "トラフィックが尽きたすべてのクライアントを削除してもよろしいですか?", + "delDepletedClientsTitle": "トラフィックが尽きたクライアントを削除", + "deleteClient": "クライアント削除", + "deleteClientContent": "クライアントを削除してもよろしいですか?", + "deleteInbound": "インバウンド削除", + "deleteInboundContent": "インバウンドを削除してもよろしいですか?", + "deployTo": "デプロイ先", + "destinationPort": "宛先ポート", + "details": "詳細情報", + "email": "メールアドレス", + "emailDesc": "メールアドレスは一意でなければなりません", + "enable": "有効化", + "expireDate": "有効期限", + "export": "リンクエクスポート", "exportInbound": "インバウンドルールをエクスポート", + "generalActions": "一般操作", "import": "インポート", "importInbound": "インバウンドルールをインポート", - "periodicTrafficResetTitle": "トラフィックリセット", - "periodicTrafficResetDesc": "指定された間隔でトラフィックカウンタを自動的にリセット", + "inboundCount": "インバウンド数", + "inboundData": "インバウンドデータ", + "info": "情報", "lastReset": "最後のリセット", + "leaveBlankToNeverExpire": "空白にすると期限なし", + "localPanel": "ローカルパネル", + "meansNoLimit": "= 無制限(単位:GB)", + "modifyInbound": "インバウンド修正", + "monitorDesc": "空白にするとすべてのIPを監視", + "network": "ネットワーク", + "noRecommendKeepDefault": "デフォルト値を保持することをお勧めします", + "node": "ノード", + "operate": "メニュー", "periodicTrafficReset": { - "never": "なし", "daily": "毎日", - "weekly": "毎週", + "hourly": "毎時", "monthly": "毎月", - "hourly": "毎時" + "never": "なし", + "weekly": "毎週" }, + "periodicTrafficResetDesc": "指定された間隔でトラフィックカウンタを自動的にリセット", + "periodicTrafficResetTitle": "トラフィックリセット", + "port": "ポート", + "portMap": "ポートマッピング", + "privatekey": "秘密鍵", + "protocol": "プロトコル", + "publicKey": "公開鍵", + "remark": "備考", + "resetAllClientTrafficContent": "すべてのクライアントのトラフィックをリセットしてもよろしいですか?", + "resetAllClientTrafficTitle": "すべてのクライアントトラフィックをリセット", + "resetAllClientTraffics": "すべてのクライアントトラフィックをリセット", + "resetAllTraffic": "すべてのインバウンドトラフィックをリセット", + "resetAllTrafficContent": "すべてのインバウンドトラフィックをリセットしてもよろしいですか?", + "resetAllTrafficTitle": "すべてのインバウンドトラフィックをリセット", + "resetInboundClientTrafficContent": "このインバウンドクライアントのすべてのトラフィックをリセットしてもよろしいですか?", + "resetInboundClientTrafficTitle": "すべてのクライアントトラフィックをリセット", + "resetInboundClientTraffics": "クライアントトラフィックをリセット", + "resetTraffic": "トラフィックリセット", + "resetTrafficContent": "トラフィックをリセットしてもよろしいですか?", + "same": "同じ", + "setDefaultCert": "パネル設定から証明書を設定", + "stream": { + "general": { + "name": "名前", + "request": "リクエスト", + "response": "レスポンス", + "value": "値" + }, + "tcp": { + "method": "方法", + "path": "パス", + "requestHeader": "リクエストヘッダー", + "responseHeader": "レスポンスヘッダー", + "status": "ステータス", + "statusDescription": "ステータス説明", + "version": "バージョン" + } + }, + "subscriptionDesc": "サブスクリプションURLを見つけるには、“詳細情報”に移動してください。また、複数のクライアントに同じ名前を使用することができます。", + "targetAddress": "宛先アドレス", + "telegramDesc": "TelegramチャットIDを提供してください。(ボットで'/id'コマンドを使用)または({'@'}userinfobot)", + "title": "インバウンド一覧", "toasts": { - "obtain": "取得", - "updateSuccess": "更新が成功しました", - "logCleanSuccess": "ログがクリアされました", - "inboundsUpdateSuccess": "インバウンドが正常に更新されました", - "inboundUpdateSuccess": "インバウンドが正常に更新されました", - "inboundCreateSuccess": "インバウンドが正常に作成されました", - "inboundDeleteSuccess": "インバウンドが正常に削除されました", + "delDepletedClientsSuccess": "すべての枯渇したクライアントが削除されました", + "getNewVlessEncError": "VlessEnc証明書の取得中にエラーが発生しました。", + "getNewX25519CertError": "X25519証明書の取得中にエラーが発生しました。", + "getNewmldsa65Error": "mldsa65証明書の取得中にエラーが発生しました。", "inboundClientAddSuccess": "インバウンドクライアントが追加されました", "inboundClientDeleteSuccess": "インバウンドクライアントが削除されました", "inboundClientUpdateSuccess": "インバウンドクライアントが更新されました", - "delDepletedClientsSuccess": "すべての枯渇したクライアントが削除されました", + "inboundCreateSuccess": "インバウンドが正常に作成されました", + "inboundDeleteSuccess": "インバウンドが正常に削除されました", + "inboundUpdateSuccess": "インバウンドが正常に更新されました", + "inboundsUpdateSuccess": "インバウンドが正常に更新されました", + "logCleanSuccess": "ログがクリアされました", + "obtain": "取得", "resetAllClientTrafficSuccess": "クライアントのすべてのトラフィックがリセットされました", "resetAllTrafficSuccess": "すべてのトラフィックがリセットされました", "resetInboundClientTrafficSuccess": "トラフィックがリセットされました", "trafficGetError": "トラフィックの取得中にエラーが発生しました", - "getNewX25519CertError": "X25519証明書の取得中にエラーが発生しました。", - "getNewmldsa65Error": "mldsa65証明書の取得中にエラーが発生しました。", - "getNewVlessEncError": "VlessEnc証明書の取得中にエラーが発生しました。" + "updateSuccess": "更新が成功しました" }, - "stream": { - "general": { - "request": "リクエスト", - "response": "レスポンス", - "name": "名前", - "value": "値" - }, - "tcp": { - "version": "バージョン", - "method": "方法", - "path": "パス", - "status": "ステータス", - "statusDescription": "ステータス説明", - "requestHeader": "リクエストヘッダー", - "responseHeader": "レスポンスヘッダー" - } - } + "totalDownUp": "総アップロード / ダウンロード", + "totalFlow": "総トラフィック", + "totalUsage": "総使用量", + "traffic": "トラフィック", + "transportConfig": "トランスポート設定", + "updatedAt": "更新" }, - "client": { - "add": "クライアント追加", - "edit": "クライアント編集", - "submitAdd": "クライアント追加", - "submitEdit": "変更を保存", - "clientCount": "クライアント数", - "bulk": "一括作成", - "copyFromInbound": "インバウンドからクライアントをコピー", - "copyToInbound": "クライアントのコピー先", - "copySelected": "選択項目をコピー", - "copySource": "ソース", - "copyEmailPreview": "結果メールのプレビュー", - "copySelectSourceFirst": "先にソースインバウンドを選択してください。", - "copyResult": "コピー結果", - "copyResultSuccess": "正常にコピーされました", - "copyResultNone": "コピーする項目がありません: クライアントが選択されていないかソースが空です", - "copyResultErrors": "コピーエラー", - "copyFlowLabel": "新規クライアントの Flow (VLESS)", - "copyFlowHint": "すべてのコピー対象クライアントに適用されます。空のままにするとスキップします。", - "selectAll": "すべて選択", - "clearAll": "すべて解除", - "method": "方法", - "first": "最初", - "last": "最後", - "prefix": "プレフィックス", - "postfix": "サフィックス", - "delayedStart": "初回使用後に開始", - "expireDays": "期間", - "days": "日", - "renew": "自動更新", - "renewDesc": "期限が切れた後に自動更新。(0 = 無効)(単位:日)" + "index": { + "backup": "バックアップ", + "backupTitle": "バックアップと復元", + "charts": "チャート", + "config": "設定", + "connectionCount": "接続数", + "cpu": "CPU", + "currentPanelVersion": "現在のパネルバージョン", + "customGeoActions": "操作", + "customGeoAdd": "追加", + "customGeoAlias": "エイリアス", + "customGeoAliasLabelSuffix": "(カスタム)", + "customGeoAliasPlaceholder": "a-z 0-9 _ -", + "customGeoAliasesError": "カスタム geo エイリアスの読み込みに失敗しました", + "customGeoDelete": "削除", + "customGeoDeleteConfirm": "このカスタム geo ソースを削除しますか?", + "customGeoDownload": "今すぐ更新", + "customGeoEdit": "編集", + "customGeoEmpty": "カスタム geo ソースはまだありません — 「追加」をクリックして作成してください", + "customGeoEnabled": "有効", + "customGeoErrAliasPattern": "エイリアスに使用できない文字が含まれています", + "customGeoErrAliasRequired": "エイリアスが必要です", + "customGeoErrAliasReserved": "このエイリアスは予約されています", + "customGeoErrDownload": "ダウンロードに失敗しました", + "customGeoErrDuplicateAlias": "この種類ですでにこのエイリアスが使われています", + "customGeoErrInvalidType": "種類は geosite または geoip である必要があります", + "customGeoErrInvalidUrl": "URL が無効です", + "customGeoErrNotFound": "カスタム geo ソースが見つかりません", + "customGeoErrUpdateAllIncomplete": "カスタム geo ソースの 1 件以上を更新できませんでした", + "customGeoErrUrlHost": "URL のホストが無効です", + "customGeoErrUrlRequired": "URL が必要です", + "customGeoErrUrlScheme": "URL は http または https を使用してください", + "customGeoExtColumn": "ルーティング (ext:…)", + "customGeoInvalidId": "無効なリソース ID", + "customGeoLastUpdated": "最終更新", + "customGeoModalAdd": "カスタム geo を追加", + "customGeoModalEdit": "カスタム geo を編集", + "customGeoModalSave": "保存", + "customGeoRoutingHint": "ルーティングでは値を ext:ファイル.dat:タグ(タグを置換)として使います。", + "customGeoTitle": "カスタム GeoSite / GeoIP", + "customGeoToastAdd": "カスタム geo を追加", + "customGeoToastDelete": "カスタム geofile「{{ .fileName }}」を削除しました", + "customGeoToastDownload": "geofile「{{ .fileName }}」を更新しました", + "customGeoToastList": "カスタム geo 一覧", + "customGeoToastUpdate": "カスタム geo を更新", + "customGeoToastUpdateAll": "すべてのカスタムソースを更新しました", + "customGeoType": "種類", + "customGeoUrl": "URL", + "customGeoValidationAlias": "エイリアスは小文字・数字・- と _ のみ使用できます", + "customGeoValidationUrl": "URL は http:// または https:// で始めてください", + "documentation": "ドキュメント", + "dontRefresh": "インストール中、このページをリロードしないでください", + "download": "ダウンロード", + "exportDatabase": "バックアップ", + "exportDatabaseDesc": "クリックして、現在のデータベースのバックアップを含む .db ファイルをデバイスにダウンロードします。", + "frequency": "周波数", + "geofileUpdateDialog": "ジオファイルを本当に更新しますか?", + "geofileUpdateDialogDesc": "これにより#filename#ファイルが更新されます。", + "geofileUpdatePopover": "ジオファイルの更新が成功しました", + "geofilesUpdateAll": "すべて更新", + "geofilesUpdateDialogDesc": "これにより、すべてのファイルが更新されます。", + "getConfigError": "設定ファイルの取得中にエラーが発生しました", + "getDatabaseError": "データベースの取得中にエラーが発生しました", + "importDatabase": "復元", + "importDatabaseDesc": "クリックして、デバイスから .db ファイルを選択し、アップロードしてバックアップからデータベースを復元します。", + "importDatabaseError": "データベースのインポート中にエラーが発生しました", + "importDatabaseSuccess": "データベースのインポートに成功しました", + "ipAddresses": "IPアドレス", + "latestPanelVersion": "最新のパネルバージョン", + "logicalProcessors": "論理プロセッサ", + "logs": "ログ", + "memory": "RAM", + "operationHours": "システム稼働時間", + "overallSpeed": "全体の速度", + "panelUpToDate": "パネルは最新です", + "panelUpdateCheckPopover": "パネルの更新確認に失敗しました", + "panelUpdateDesc": "これにより3X-UIが最新リリースに更新され、パネルサービスが再起動されます。", + "panelUpdateDialog": "本当にパネルを更新しますか?", + "panelUpdateDialogDesc": "これにより3X-UIが#version#に更新され、パネルサービスが再起動されます。", + "panelUpdateStartedPopover": "パネルの更新を開始しました", + "readDatabaseError": "データベースの読み取り中にエラーが発生しました", + "received": "受信", + "restartXray": "再起動", + "sent": "送信", + "stopXray": "停止", + "storage": "ストレージ", + "swap": "スワップ", + "systemHistoryTitle": "システム履歴", + "systemLoad": "システム負荷", + "systemLoadDesc": "過去1、5、15分間のシステム平均負荷", + "threads": "スレッド", + "title": "システムステータス", + "toggleIpVisibility": "IPの表示を切り替える", + "totalData": "総データ量", + "trendLast2Min": "直近2分", + "upToDate": "最新", + "updatePanel": "パネルを更新", + "upload": "アップロード", + "xrayErrorPopoverTitle": "Xrayの実行中にエラーが発生しました", + "xrayMetricsDisabled": "Xray メトリクスエンドポイントが設定されていません", + "xrayMetricsHint": "xray 設定にトップレベルの metrics ブロック(tag: metrics_out、listen: 127.0.0.1:11111)を追加し、xray を再起動してください。", + "xrayMetricsTitle": "Xray メトリクス", + "xrayObservatoryAlive": "稼働中", + "xrayObservatoryDead": "停止", + "xrayObservatoryEmpty": "Observatory データはまだありません", + "xrayObservatoryHint": "xray 設定に observatory ブロックを追加し、プローブする outbound タグを列挙してから xray を再起動してください。", + "xrayObservatoryLastSeen": "最終確認", + "xrayObservatoryLastTry": "最終試行", + "xrayObservatoryTagPlaceholder": "Outbound を選択", + "xrayStatus": "Xray", + "xrayStatusError": "エラー", + "xrayStatusRunning": "実行中", + "xrayStatusStop": "停止", + "xrayStatusUnknown": "不明", + "xraySwitch": "バージョン", + "xraySwitchClick": "切り替えるバージョンを選択してください", + "xraySwitchClickDesk": "慎重に選択してください。古いバージョンは現在の設定と互換性がない可能性があります。", + "xraySwitchVersionDialog": "Xrayのバージョンを本当に変更しますか?", + "xraySwitchVersionDialogDesc": "Xrayのバージョンが#version#に変更されます。", + "xraySwitchVersionPopover": "Xrayの更新が成功しました", + "xrayUpdates": "Xrayの更新" + }, + "login": { + "hello": "こんにちは", + "loginAgain": "ログインセッションが切れました。再度ログインしてください。", + "title": "ようこそ", + "toasts": { + "emptyPassword": "パスワードを入力してください", + "emptyUsername": "ユーザー名を入力してください", + "invalidFormData": "データ形式エラー", + "successLogin": "アカウントに正常にログインしました。", + "wrongUsernameOrPassword": "ユーザー名、パスワード、または二段階認証コードが無効です。" + } }, "nodes": { - "title": "ノード", + "actions": "操作", "addNode": "ノードを追加", - "editNode": "ノードを編集", - "totalNodes": "ノード総数", - "onlineNodes": "オンライン", - "offlineNodes": "オフライン", + "address": "アドレス", + "addressPlaceholder": "panel.example.com または 1.2.3.4", + "apiToken": "APIトークン", + "apiTokenHint": "リモートパネルでは、設定 → APIトークン でAPIトークンを確認できます。", + "apiTokenPlaceholder": "リモートパネルの設定ページから取得したトークン", "avgLatency": "平均レイテンシ", + "basePath": "ベースパス", + "connectionFailed": "接続に失敗しました", + "connectionOk": "接続OK ({ms} ms)", + "cpu": "CPU", + "deleteConfirmContent": "ノードの監視を停止します。リモートパネル自体には影響しません。", + "deleteConfirmTitle": "ノード「{name}」を削除しますか?", + "editNode": "ノードを編集", + "enable": "有効", + "justNow": "たった今", + "lastHeartbeat": "最後のハートビート", + "latency": "レイテンシ", + "mem": "メモリ", "name": "名前", "namePlaceholder": "例: de-frankfurt-1", - "addressPlaceholder": "panel.example.com または 1.2.3.4", - "remark": "備考", - "scheme": "スキーム", - "address": "アドレス", + "never": "なし", + "offlineNodes": "オフライン", + "onlineNodes": "オンライン", "port": "ポート", - "basePath": "ベースパス", - "apiToken": "APIトークン", - "apiTokenPlaceholder": "リモートパネルの設定ページから取得したトークン", - "apiTokenHint": "リモートパネルでは、設定 → APIトークン でAPIトークンを確認できます。", + "probe": "今すぐプローブ", "regenerate": "トークンを再生成", "regenerateConfirm": "再生成すると現在のトークンは無効になります。これを使用しているすべての中央パネルは更新されるまでアクセスできなくなります。続行しますか?", - "enable": "有効", + "remark": "備考", + "scheme": "スキーム", "status": "ステータス", - "cpu": "CPU", - "mem": "メモリ", - "uptime": "稼働時間", - "latency": "レイテンシ", - "lastHeartbeat": "最後のハートビート", - "xrayVersion": "Xrayバージョン", - "actions": "操作", - "probe": "今すぐプローブ", - "testConnection": "接続テスト", - "connectionOk": "接続OK ({ms} ms)", - "connectionFailed": "接続に失敗しました", - "never": "なし", - "justNow": "たった今", - "deleteConfirmTitle": "ノード「{name}」を削除しますか?", - "deleteConfirmContent": "ノードの監視を停止します。リモートパネル自体には影響しません。", "statusValues": { - "online": "オンライン", "offline": "オフライン", + "online": "オンライン", "unknown": "不明" }, + "testConnection": "接続テスト", + "title": "ノード", "toasts": { - "list": "ノードの読み込みに失敗しました", - "obtain": "ノードの読み込みに失敗しました", "add": "ノードを追加", - "update": "ノードを更新", "delete": "ノードを削除", "deleted": "ノードを削除しました", - "test": "接続テスト", "fillRequired": "名前、アドレス、ポート、APIトークンは必須です", - "probeFailed": "プローブに失敗しました" - } + "list": "ノードの読み込みに失敗しました", + "obtain": "ノードの読み込みに失敗しました", + "probeFailed": "プローブに失敗しました", + "test": "接続テスト", + "update": "ノードを更新" + }, + "totalNodes": "ノード総数", + "uptime": "稼働時間", + "xrayVersion": "Xrayバージョン" }, "settings": { - "title": "パネル設定", - "save": "保存", - "infoDesc": "ここでのすべての変更は、保存してパネルを再起動する必要があります", - "restartPanel": "パネル再起動", - "restartPanelDesc": "パネルを再起動してもよろしいですか?再起動後にパネルにアクセスできない場合は、サーバーでパネルログを確認してください", - "restartPanelSuccess": "パネルの再起動に成功しました", - "actions": "操作", - "resetDefaultConfig": "デフォルト設定にリセット", - "panelSettings": "一般", - "securitySettings": "セキュリティ設定", "TGBotSettings": "Telegramボット設定", - "panelListeningIP": "パネル監視IP", - "panelListeningIPDesc": "デフォルトではすべてのIPを監視する", - "panelListeningDomain": "パネル監視ドメイン", - "panelListeningDomainDesc": "デフォルトで空白の場合、すべてのドメインとIPアドレスを監視する", - "panelPort": "パネル監視ポート", - "panelPortDesc": "再起動で有効", - "publicKeyPath": "パネル証明書公開鍵ファイルパス", - "publicKeyPathDesc": "'/'で始まる絶対パスを入力", - "privateKeyPath": "パネル証明書秘密鍵ファイルパス", - "privateKeyPathDesc": "'/'で始まる絶対パスを入力", - "panelUrlPath": "パネルURLルートパス", - "panelUrlPathDesc": "'/'で始まり、'/'で終わる必要があります", - "pageSize": "ページサイズ", - "pageSizeDesc": "インバウンドテーブルのページサイズを定義します。0を設定すると無効化されます", - "remarkModel": "備考モデルと区切り記号", - "datepicker": "日付ピッカー", - "datepickerPlaceholder": "日付を選択", - "datepickerDescription": "日付選択カレンダーで有効期限を指定する", - "sampleRemark": "備考の例", - "oldUsername": "旧ユーザー名", + "actions": "操作", + "certs": "証明書", "currentPassword": "旧パスワード", - "newUsername": "新しいユーザー名", - "newPassword": "新しいパスワード", - "telegramBotEnable": "Telegramボットを有効にする", - "telegramBotEnableDesc": "Telegramボット機能を有効にする", - "telegramToken": "Telegramボットトークン", - "telegramTokenDesc": "'{'@'}BotFather'から取得したTelegramボットトークン", - "telegramProxy": "SOCKS5プロキシ", - "telegramProxyDesc": "SOCKS5プロキシを有効にしてTelegramに接続する(ガイドに従って設定を調整)", - "telegramAPIServer": "Telegram APIサーバー", - "telegramAPIServerDesc": "使用するTelegram APIサーバー。空白の場合はデフォルトサーバーを使用する", - "telegramChatId": "管理者チャットID", - "telegramChatIdDesc": "Telegram管理者チャットID(複数の場合はカンマで区切る){'@'}userinfobotで取得するか、ボットで'/id'コマンドを使用して取得する", - "telegramNotifyTime": "通知時間", - "telegramNotifyTimeDesc": "定期的なTelegramボット通知時間を設定する(crontab時間形式を使用)", - "tgNotifyBackup": "データベースバックアップ", - "tgNotifyBackupDesc": "レポート付きのデータベースバックアップファイルを送信", - "tgNotifyLogin": "ログイン通知", - "tgNotifyLoginDesc": "誰かがパネルにログインしようとしたときに、ユーザー名、IPアドレス、時間を表示する", - "sessionMaxAge": "セッション期間", - "sessionMaxAgeDesc": "ログイン状態を保持する期間(単位:分)", + "dateAndTime": "日付と時刻", + "datepicker": "日付ピッカー", + "datepickerDescription": "日付選択カレンダーで有効期限を指定する", + "datepickerPlaceholder": "日付を選択", + "direct": "直接接続", + "directDesc": "特定の国のドメインまたはIP範囲に直接接続する", "expireTimeDiff": "有効期限通知のしきい値", "expireTimeDiffDesc": "このしきい値に達した場合、有効期限に関する通知を受け取る(単位:日)", - "trafficDiff": "トラフィック消耗しきい値", - "trafficDiffDesc": "このしきい値に達した場合、トラフィック消耗に関する通知を受け取る(単位:GB)", - "tgNotifyCpu": "CPU負荷通知しきい値", - "tgNotifyCpuDesc": "CPU負荷がこのしきい値を超えた場合、通知を受け取る(単位:%)", - "timeZone": "タイムゾーン", - "timeZoneDesc": "定時タスクはこのタイムゾーンの時間に従って実行される", - "subSettings": "サブスクリプション設定", - "subEnable": "サブスクリプションサービスを有効にする", - "subEnableDesc": "サブスクリプションサービス機能を有効にする", - "subJsonEnable": "JSON サブスクリプションのエンドポイントを個別に有効/無効にする。", - "subTitle": "サブスクリプションタイトル", - "subTitleDesc": "VPNクライアントに表示されるタイトル", - "subSupportUrl": "サポートURL", - "subSupportUrlDesc": "VPNクライアントに表示されるテクニカルサポートへのリンク", - "subProfileUrl": "プロフィールURL", - "subProfileUrlDesc": "VPNクライアントに表示されるWebサイトへのリンク", - "subAnnounce": "お知らせ", - "subAnnounceDesc": "VPNクライアントに表示されるお知らせのテキスト", - "subEnableRouting": "ルーティングを有効化", - "subEnableRoutingDesc": "VPNクライアントでルーティングを有効にするためのグローバル設定。(Happのみ)", - "subRoutingRules": "ルーティングルール", - "subRoutingRulesDesc": "VPNクライアントのグローバルルーティングルール。(Happのみ)", - "subListen": "監視IP", - "subListenDesc": "サブスクリプションサービスが監視するIPアドレス(空白にするとすべてのIPを監視)", - "subPort": "監視ポート", - "subPortDesc": "サブスクリプションサービスが監視するポート番号(使用されていないポートである必要があります)", - "subCertPath": "公開鍵パス", - "subCertPathDesc": "サブスクリプションサービスで使用する公開鍵ファイルのパス('/'で始まる)", - "subKeyPath": "秘密鍵パス", - "subKeyPathDesc": "サブスクリプションサービスで使用する秘密鍵ファイルのパス('/'で始まる)", - "subPath": "URIパス", - "subPathDesc": "サブスクリプションサービスで使用するURIパス('/'で始まり、'/'で終わる)", - "subDomain": "監視ドメイン", - "subDomainDesc": "サブスクリプションサービスが監視するドメイン(空白にするとすべてのドメインとIPを監視)", - "subUpdates": "更新間隔", - "subUpdatesDesc": "クライアントアプリケーションでサブスクリプションURLの更新間隔(単位:時間)", - "subEncrypt": "エンコード", - "subEncryptDesc": "サブスクリプションサービスが返す内容をBase64エンコードする", - "subShowInfo": "利用情報を表示", - "subShowInfoDesc": "クライアントアプリで残りのトラフィックと日付情報を表示する", - "subURI": "リバースプロキシURI", - "subURIDesc": "プロキシ後ろのサブスクリプションURLのURIパスに使用する", + "externalTraffic": "外部トラフィック", "externalTrafficInformEnable": "外部トラフィック情報", "externalTrafficInformEnableDesc": "トラフィックの更新ごとに外部 API に通知します。", "externalTrafficInformURI": "外部トラフィック通知 URI", "externalTrafficInformURIDesc": "トラフィックの更新ごとに外部 API に通知します。", - "restartXrayOnClientDisable": "自動無効化後に Xray を再起動", - "restartXrayOnClientDisableDesc": "有効期限切れまたはトラフィック上限でクライアントが自動的に無効化されたとき、Xray を再起動します。", "fragment": "フラグメント", "fragmentDesc": "TLS helloパケットのフラグメントを有効にする", "fragmentSett": "設定", - "noisesDesc": "Noisesを有効にする", - "noisesSett": "Noises設定", + "infoDesc": "ここでのすべての変更は、保存してパネルを再起動する必要があります", + "information": "情報", + "intervals": "間隔", + "language": "言語", "mux": "マルチプレクサ", "muxDesc": "確立されたストリーム内で複数の独立したストリームを伝送する", "muxSett": "マルチプレクサ設定", - "direct": "直接接続", - "directDesc": "特定の国のドメインまたはIP範囲に直接接続する", + "newPassword": "新しいパスワード", + "newUsername": "新しいユーザー名", + "noisesDesc": "Noisesを有効にする", + "noisesSett": "Noises設定", "notifications": "通知", - "certs": "証明書", - "externalTraffic": "外部トラフィック", - "dateAndTime": "日付と時刻", + "oldUsername": "旧ユーザー名", + "pageSize": "ページサイズ", + "pageSizeDesc": "インバウンドテーブルのページサイズを定義します。0を設定すると無効化されます", + "panelListeningDomain": "パネル監視ドメイン", + "panelListeningDomainDesc": "デフォルトで空白の場合、すべてのドメインとIPアドレスを監視する", + "panelListeningIP": "パネル監視IP", + "panelListeningIPDesc": "デフォルトではすべてのIPを監視する", + "panelPort": "パネル監視ポート", + "panelPortDesc": "再起動で有効", + "panelSettings": "一般", + "panelUrlPath": "パネルURLルートパス", + "panelUrlPathDesc": "'/'で始まり、'/'で終わる必要があります", + "privateKeyPath": "パネル証明書秘密鍵ファイルパス", + "privateKeyPathDesc": "'/'で始まる絶対パスを入力", "proxyAndServer": "プロキシとサーバー", - "intervals": "間隔", - "information": "情報", - "language": "言語", - "telegramBotLanguage": "Telegram Botの言語", + "publicKeyPath": "パネル証明書公開鍵ファイルパス", + "publicKeyPathDesc": "'/'で始まる絶対パスを入力", + "remarkModel": "備考モデルと区切り記号", + "resetDefaultConfig": "デフォルト設定にリセット", + "restartPanel": "パネル再起動", + "restartPanelDesc": "パネルを再起動してもよろしいですか?再起動後にパネルにアクセスできない場合は、サーバーでパネルログを確認してください", + "restartPanelSuccess": "パネルの再起動に成功しました", + "restartXrayOnClientDisable": "自動無効化後に Xray を再起動", + "restartXrayOnClientDisableDesc": "有効期限切れまたはトラフィック上限でクライアントが自動的に無効化されたとき、Xray を再起動します。", + "sampleRemark": "備考の例", + "save": "保存", "security": { "admin": "管理者の資格情報", "twoFactor": "二段階認証", "twoFactorEnable": "2FAを有効化", "twoFactorEnableDesc": "セキュリティを強化するために追加の認証層を追加します。", - "twoFactorModalSetTitle": "二段階認証を有効にする", - "twoFactorModalDeleteTitle": "二段階認証を無効にする", - "twoFactorModalSteps": "二段階認証を設定するには、次の手順を実行してください:", - "twoFactorModalFirstStep": "1. 認証アプリでこのQRコードをスキャンするか、QRコード近くのトークンをコピーしてアプリに貼り付けます", - "twoFactorModalSecondStep": "2. アプリからコードを入力してください", - "twoFactorModalRemoveStep": "二段階認証を削除するには、アプリからコードを入力してください。", - "twoFactorModalChangeCredentialsTitle": "認証情報の変更", "twoFactorModalChangeCredentialsStep": "管理者の認証情報を変更するには、アプリケーションからコードを入力してください。", - "twoFactorModalSetSuccess": "二要素認証が正常に設定されました", + "twoFactorModalChangeCredentialsTitle": "認証情報の変更", "twoFactorModalDeleteSuccess": "二要素認証が正常に削除されました", - "twoFactorModalError": "コードが間違っています" + "twoFactorModalDeleteTitle": "二段階認証を無効にする", + "twoFactorModalError": "コードが間違っています", + "twoFactorModalFirstStep": "1. 認証アプリでこのQRコードをスキャンするか、QRコード近くのトークンをコピーしてアプリに貼り付けます", + "twoFactorModalRemoveStep": "二段階認証を削除するには、アプリからコードを入力してください。", + "twoFactorModalSecondStep": "2. アプリからコードを入力してください", + "twoFactorModalSetSuccess": "二要素認証が正常に設定されました", + "twoFactorModalSetTitle": "二段階認証を有効にする", + "twoFactorModalSteps": "二段階認証を設定するには、次の手順を実行してください:" }, + "securitySettings": "セキュリティ設定", + "sessionMaxAge": "セッション期間", + "sessionMaxAgeDesc": "ログイン状態を保持する期間(単位:分)", + "subAnnounce": "お知らせ", + "subAnnounceDesc": "VPNクライアントに表示されるお知らせのテキスト", + "subCertPath": "公開鍵パス", + "subCertPathDesc": "サブスクリプションサービスで使用する公開鍵ファイルのパス('/'で始まる)", + "subDomain": "監視ドメイン", + "subDomainDesc": "サブスクリプションサービスが監視するドメイン(空白にするとすべてのドメインとIPを監視)", + "subEnable": "サブスクリプションサービスを有効にする", + "subEnableDesc": "サブスクリプションサービス機能を有効にする", + "subEnableRouting": "ルーティングを有効化", + "subEnableRoutingDesc": "VPNクライアントでルーティングを有効にするためのグローバル設定。(Happのみ)", + "subEncrypt": "エンコード", + "subEncryptDesc": "サブスクリプションサービスが返す内容をBase64エンコードする", + "subJsonEnable": "JSON サブスクリプションのエンドポイントを個別に有効/無効にする。", + "subKeyPath": "秘密鍵パス", + "subKeyPathDesc": "サブスクリプションサービスで使用する秘密鍵ファイルのパス('/'で始まる)", + "subListen": "監視IP", + "subListenDesc": "サブスクリプションサービスが監視するIPアドレス(空白にするとすべてのIPを監視)", + "subPath": "URIパス", + "subPathDesc": "サブスクリプションサービスで使用するURIパス('/'で始まり、'/'で終わる)", + "subPort": "監視ポート", + "subPortDesc": "サブスクリプションサービスが監視するポート番号(使用されていないポートである必要があります)", + "subProfileUrl": "プロフィールURL", + "subProfileUrlDesc": "VPNクライアントに表示されるWebサイトへのリンク", + "subRoutingRules": "ルーティングルール", + "subRoutingRulesDesc": "VPNクライアントのグローバルルーティングルール。(Happのみ)", + "subSettings": "サブスクリプション設定", + "subShowInfo": "利用情報を表示", + "subShowInfoDesc": "クライアントアプリで残りのトラフィックと日付情報を表示する", + "subSupportUrl": "サポートURL", + "subSupportUrlDesc": "VPNクライアントに表示されるテクニカルサポートへのリンク", + "subTitle": "サブスクリプションタイトル", + "subTitleDesc": "VPNクライアントに表示されるタイトル", + "subURI": "リバースプロキシURI", + "subURIDesc": "プロキシ後ろのサブスクリプションURLのURIパスに使用する", + "subUpdates": "更新間隔", + "subUpdatesDesc": "クライアントアプリケーションでサブスクリプションURLの更新間隔(単位:時間)", + "telegramAPIServer": "Telegram APIサーバー", + "telegramAPIServerDesc": "使用するTelegram APIサーバー。空白の場合はデフォルトサーバーを使用する", + "telegramBotEnable": "Telegramボットを有効にする", + "telegramBotEnableDesc": "Telegramボット機能を有効にする", + "telegramBotLanguage": "Telegram Botの言語", + "telegramChatId": "管理者チャットID", + "telegramChatIdDesc": "Telegram管理者チャットID(複数の場合はカンマで区切る){'@'}userinfobotで取得するか、ボットで'/id'コマンドを使用して取得する", + "telegramNotifyTime": "通知時間", + "telegramNotifyTimeDesc": "定期的なTelegramボット通知時間を設定する(crontab時間形式を使用)", + "telegramProxy": "SOCKS5プロキシ", + "telegramProxyDesc": "SOCKS5プロキシを有効にしてTelegramに接続する(ガイドに従って設定を調整)", + "telegramToken": "Telegramボットトークン", + "telegramTokenDesc": "'{'@'}BotFather'から取得したTelegramボットトークン", + "tgNotifyBackup": "データベースバックアップ", + "tgNotifyBackupDesc": "レポート付きのデータベースバックアップファイルを送信", + "tgNotifyCpu": "CPU負荷通知しきい値", + "tgNotifyCpuDesc": "CPU負荷がこのしきい値を超えた場合、通知を受け取る(単位:%)", + "tgNotifyLogin": "ログイン通知", + "tgNotifyLoginDesc": "誰かがパネルにログインしようとしたときに、ユーザー名、IPアドレス、時間を表示する", + "timeZone": "タイムゾーン", + "timeZoneDesc": "定時タスクはこのタイムゾーンの時間に従って実行される", + "title": "パネル設定", "toasts": { - "modifySettings": "パラメーターが変更されました。", - "getSettings": "パラメーターの取得中にエラーが発生しました", - "modifyUserError": "管理者認証情報の変更中にエラーが発生しました。", - "modifyUser": "管理者の認証情報を正常に変更しました。", - "originalUserPassIncorrect": "旧ユーザー名または旧パスワードが間違っています", - "userPassMustBeNotEmpty": "新しいユーザー名と新しいパスワードは空にできません", "getOutboundTrafficError": "送信トラフィックの取得エラー", - "resetOutboundTrafficError": "送信トラフィックのリセットエラー" - } + "getSettings": "パラメーターの取得中にエラーが発生しました", + "modifySettings": "パラメーターが変更されました。", + "modifyUser": "管理者の認証情報を正常に変更しました。", + "modifyUserError": "管理者認証情報の変更中にエラーが発生しました。", + "originalUserPassIncorrect": "旧ユーザー名または旧パスワードが間違っています", + "resetOutboundTrafficError": "送信トラフィックのリセットエラー", + "userPassMustBeNotEmpty": "新しいユーザー名と新しいパスワードは空にできません" + }, + "trafficDiff": "トラフィック消耗しきい値", + "trafficDiffDesc": "このしきい値に達した場合、トラフィック消耗に関する通知を受け取る(単位:GB)" }, "xray": { - "title": "Xray 設定", - "save": "保存", - "restart": "Xray 再起動", - "restartSuccess": "Xrayの再起動に成功しました", - "stopSuccess": "Xrayが正常に停止しました", - "restartError": "Xrayの再起動中にエラーが発生しました。", - "stopError": "Xrayの停止中にエラーが発生しました。", - "basicTemplate": "基本設定", - "advancedTemplate": "高度な設定", - "generalConfigs": "一般設定", - "generalConfigsDesc": "これらのオプションは一般設定を決定します", - "logConfigs": "ログ", - "logConfigsDesc": "ログはサーバーのパフォーマンスに影響を与える可能性があるため、必要な場合にのみ有効にすることをお勧めします", - "blockConfigsDesc": "これらのオプションは、特定のプロトコルやウェブサイトへのユーザー接続をブロックします", - "basicRouting": "基本ルーティング", - "blockConnectionsConfigsDesc": "これらのオプションにより、特定のリクエスト元の国に基づいてトラフィックをブロックします。", - "directConnectionsConfigsDesc": "直接接続により、特定のトラフィックが他のサーバーを経由しないようにします。", - "blockips": "IPをブロック", - "blockdomains": "ドメインをブロック", - "directips": "直接IP", - "directdomains": "直接ドメイン", - "ipv4Routing": "IPv4 ルーティング", - "ipv4RoutingDesc": "このオプションはIPv4のみを介してターゲットドメインへルーティングします", - "warpRouting": "WARP ルーティング", - "warpRoutingDesc": "注意:これらのオプションを使用する前に、パネルのGitHubの手順に従って、サーバーにsocks5プロキシモードでWARPをインストールしてください。WARPはCloudflareサーバー経由でトラフィックをウェブサイトにルーティングします。", - "nordRouting": "NordVPN ルーティング", - "nordRoutingDesc": "これらのオプションはNordVPN経由で特定の宛先にトラフィックをルーティングします。", - "Template": "高度なXray設定テンプレート", - "TemplateDesc": "最終的なXray設定ファイルはこのテンプレートに基づいて生成されます", + "Balancers": "負荷分散", "FreedomStrategy": "Freedom プロトコル戦略", "FreedomStrategyDesc": "Freedomプロトコル内のネットワークの出力戦略を設定する", - "RoutingStrategy": "ルーティングドメイン戦略設定", - "RoutingStrategyDesc": "DNS解決の全体的なルーティング戦略を設定する", - "outboundTestUrl": "アウトバウンドテスト URL", - "outboundTestUrlDesc": "アウトバウンド接続テストに使用する URL。既定値", - "Torrent": "BitTorrent プロトコルをブロック", "Inbounds": "インバウンドルール", "InboundsDesc": "特定のクライアントからのトラフィックを受け入れる", "Outbounds": "アウトバウンドルール", - "Balancers": "負荷分散", "OutboundsDesc": "アウトバウンドトラフィックの送信方法を設定する", + "RoutingStrategy": "ルーティングドメイン戦略設定", + "RoutingStrategyDesc": "DNS解決の全体的なルーティング戦略を設定する", "Routings": "ルーティングルール", "RoutingsDesc": "各ルールの優先順位が重要です", - "completeTemplate": "すべて", - "logLevel": "ログレベル", - "logLevelDesc": "エラーログのレベルを指定し、記録する情報を示します", + "Template": "高度なXray設定テンプレート", + "TemplateDesc": "最終的なXray設定ファイルはこのテンプレートに基づいて生成されます", + "Torrent": "BitTorrent プロトコルをブロック", "accessLog": "アクセスログ", "accessLogDesc": "アクセスログのファイルパス。特殊値 'none' はアクセスログを無効にします", - "errorLog": "エラーログ", - "errorLogDesc": "エラーログのファイルパス。特殊値 'none' はエラーログを無効にします", - "dnsLog": "DNS ログ", - "dnsLogDesc": "DNSクエリのログを有効にするかどうか", - "maskAddress": "アドレスをマスク", - "maskAddressDesc": "IPアドレスをマスクし、有効にするとログに表示されるIPアドレスを自動的に置き換えます", - "statistics": "統計", - "statsInboundUplink": "インバウンドアップロード統計", - "statsInboundUplinkDesc": "すべてのインバウンドプロキシのアップストリームトラフィックの統計収集を有効にします。", - "statsInboundDownlink": "インバウンドダウンロード統計", - "statsInboundDownlinkDesc": "すべてのインバウンドプロキシのダウンストリームトラフィックの統計収集を有効にします。", - "statsOutboundUplink": "アウトバウンドアップロード統計", - "statsOutboundUplinkDesc": "すべてのアウトバウンドプロキシのアップストリームトラフィックの統計収集を有効にします。", - "statsOutboundDownlink": "アウトバウンドダウンロード統計", - "statsOutboundDownlinkDesc": "すべてのアウトバウンドプロキシのダウンストリームトラフィックの統計収集を有効にします。", - "rules": { - "first": "最初", - "last": "最後", - "up": "上へ", - "down": "下へ", - "source": "ソース", - "dest": "宛先アドレス", - "inbound": "インバウンド", - "outbound": "アウトバウンド", - "balancer": "負荷分散", - "info": "情報", - "add": "ルール追加", - "edit": "ルール編集", - "useComma": "カンマ区切りの項目" - }, - "outbound": { - "addOutbound": "アウトバウンド追加", - "addReverse": "リバース追加", - "editOutbound": "アウトバウンド編集", - "editReverse": "リバース編集", - "reverseTag": "リバースタグ", - "reverseTagDesc": "VLESSシンプルリバースプロキシのアウトバウンドタグ。無効にするには空欄にしてください。", - "reverseTagPlaceholder": "アウトバウンドタグ(空欄で無効)", - "tag": "タグ", - "tagDesc": "一意のタグ", - "address": "アドレス", - "reverse": "リバース", - "domain": "ドメイン", - "type": "タイプ", - "bridge": "ブリッジ", - "portal": "ポータル", - "link": "リンク", - "intercon": "インターコネクション", - "settings": "設定", - "accountInfo": "アカウント情報", - "outboundStatus": "アウトバウンドステータス", - "sendThrough": "送信経路", - "test": "テスト", - "testResult": "テスト結果", - "testing": "接続をテスト中...", - "testSuccess": "テスト成功", - "testFailed": "テスト失敗", - "testError": "アウトバウンドのテストに失敗しました", - "nordvpn": "NordVPN", - "accessToken": "アクセストークン", - "country": "国", - "server": "サーバー", - "city": "都市", - "allCities": "すべての都市", - "privateKey": "秘密鍵", - "load": "負荷" - }, + "advancedTemplate": "高度な設定", "balancer": { "addBalancer": "負荷分散追加", - "editBalancer": "負荷分散編集", - "balancerStrategy": "戦略", + "balancerDesc": "balancerTagとoutboundTagは同時に使用できません。同時に使用された場合、outboundTagのみが有効になります。", "balancerSelectors": "セレクター", + "balancerStrategy": "戦略", + "editBalancer": "負荷分散編集", "tag": "タグ", - "tagDesc": "一意のタグ", - "balancerDesc": "balancerTagとoutboundTagは同時に使用できません。同時に使用された場合、outboundTagのみが有効になります。" - }, - "wireguard": { - "secretKey": "シークレットキー", - "publicKey": "公開鍵", - "allowedIPs": "許可されたIP", - "endpoint": "エンドポイント", - "psk": "共有キー", - "domainStrategy": "ドメイン戦略" - }, - "tun": { - "nameDesc": "TUN インターフェースの名前。デフォルトは 'xray0' です", - "mtuDesc": "最大伝送単位。データパケットの最大サイズ。デフォルトは 1500 です", - "userLevel": "ユーザーレベル", - "userLevelDesc": "このインバウンドを通じて確立されたすべての接続は、このユーザーレベルを使用します。デフォルトは 0 です" + "tagDesc": "一意のタグ" }, + "basicRouting": "基本ルーティング", + "basicTemplate": "基本設定", + "blockConfigsDesc": "これらのオプションは、特定のプロトコルやウェブサイトへのユーザー接続をブロックします", + "blockConnectionsConfigsDesc": "これらのオプションにより、特定のリクエスト元の国に基づいてトラフィックをブロックします。", + "blockdomains": "ドメインをブロック", + "blockips": "IPをブロック", + "completeTemplate": "すべて", + "directConnectionsConfigsDesc": "直接接続により、特定のトラフィックが他のサーバーを経由しないようにします。", + "directdomains": "直接ドメイン", + "directips": "直接IP", "dns": { - "enable": "DNSを有効にする", - "enableDesc": "組み込みDNSサーバーを有効にする", - "tag": "DNSインバウンドタグ", - "tagDesc": "このタグはルーティングルールでインバウンドタグとして使用できます", + "add": "サーバー追加", + "clearAll": "すべて削除", + "clearAllConfirm": "リストからすべての DNS サーバが削除されます。この操作は元に戻せません。", + "clearAllTitle": "すべての DNS サーバを削除しますか?", "clientIp": "クライアントIP", "clientIpDesc": "DNSクエリ中に指定されたIPの位置をサーバーに通知するために使用されます", "disableCache": "キャッシュを無効にする", @@ -753,217 +607,371 @@ "disableFallbackDesc": "フォールバックDNSクエリを無効にします", "disableFallbackIfMatch": "一致した場合にフォールバックを無効にする", "disableFallbackIfMatchDesc": "DNSサーバーの一致するドメインリストにヒットした場合、フォールバックDNSクエリを無効にします", + "dnsPresetFamily": "ファミリー", + "dnsPresetTitle": "DNSテンプレート", + "domains": "ドメイン", + "edit": "サーバー編集", + "enable": "DNSを有効にする", + "enableDesc": "組み込みDNSサーバーを有効にする", "enableParallelQuery": "並列クエリを有効にする", "enableParallelQueryDesc": "複数のサーバーへの並列DNSクエリを有効にして、より高速な解決を実現", - "strategy": "クエリ戦略", - "strategyDesc": "ドメイン名解決の全体的な戦略", - "add": "サーバー追加", - "edit": "サーバー編集", - "domains": "ドメイン", "expectIPs": "期待されるIP", - "unexpectIPs": "予期しないIP", - "useSystemHosts": "システムのHostsを使用", - "useSystemHostsDesc": "インストール済みシステムのhostsファイルを使用する", - "usePreset": "テンプレートを使用", - "dnsPresetTitle": "DNSテンプレート", - "dnsPresetFamily": "ファミリー", - "serveStale": "期限切れキャッシュを使用", - "serveStaleDesc": "バックグラウンドで更新中に期限切れキャッシュ結果を返す", - "serveExpiredTTL": "期限切れTTL", - "serveExpiredTTLDesc": "期限切れキャッシュエントリの有効期間(秒)。0 = 無期限", - "timeoutMs": "タイムアウト (ms)", - "skipFallback": "フォールバックをスキップ", "finalQuery": "最終クエリ", "hosts": "Hosts", "hostsAdd": "Host を追加", - "hostsEmpty": "Host が定義されていません", "hostsDomain": "ドメイン (例: domain:example.com)", + "hostsEmpty": "Host が定義されていません", "hostsValues": "IP またはドメイン — 入力して Enter", - "clearAll": "すべて削除", - "clearAllTitle": "すべての DNS サーバを削除しますか?", - "clearAllConfirm": "リストからすべての DNS サーバが削除されます。この操作は元に戻せません。" + "serveExpiredTTL": "期限切れTTL", + "serveExpiredTTLDesc": "期限切れキャッシュエントリの有効期間(秒)。0 = 無期限", + "serveStale": "期限切れキャッシュを使用", + "serveStaleDesc": "バックグラウンドで更新中に期限切れキャッシュ結果を返す", + "skipFallback": "フォールバックをスキップ", + "strategy": "クエリ戦略", + "strategyDesc": "ドメイン名解決の全体的な戦略", + "tag": "DNSインバウンドタグ", + "tagDesc": "このタグはルーティングルールでインバウンドタグとして使用できます", + "timeoutMs": "タイムアウト (ms)", + "unexpectIPs": "予期しないIP", + "usePreset": "テンプレートを使用", + "useSystemHosts": "システムのHostsを使用", + "useSystemHostsDesc": "インストール済みシステムのhostsファイルを使用する" }, + "dnsLog": "DNS ログ", + "dnsLogDesc": "DNSクエリのログを有効にするかどうか", + "errorLog": "エラーログ", + "errorLogDesc": "エラーログのファイルパス。特殊値 'none' はエラーログを無効にします", "fakedns": { "add": "フェイクDNS追加", "edit": "フェイクDNS編集", "ipPool": "IPプールサブネット", "poolSize": "プールサイズ" + }, + "generalConfigs": "一般設定", + "generalConfigsDesc": "これらのオプションは一般設定を決定します", + "ipv4Routing": "IPv4 ルーティング", + "ipv4RoutingDesc": "このオプションはIPv4のみを介してターゲットドメインへルーティングします", + "logConfigs": "ログ", + "logConfigsDesc": "ログはサーバーのパフォーマンスに影響を与える可能性があるため、必要な場合にのみ有効にすることをお勧めします", + "logLevel": "ログレベル", + "logLevelDesc": "エラーログのレベルを指定し、記録する情報を示します", + "maskAddress": "アドレスをマスク", + "maskAddressDesc": "IPアドレスをマスクし、有効にするとログに表示されるIPアドレスを自動的に置き換えます", + "nordRouting": "NordVPN ルーティング", + "nordRoutingDesc": "これらのオプションはNordVPN経由で特定の宛先にトラフィックをルーティングします。", + "outbound": { + "accessToken": "アクセストークン", + "accountInfo": "アカウント情報", + "addOutbound": "アウトバウンド追加", + "addReverse": "リバース追加", + "address": "アドレス", + "allCities": "すべての都市", + "bridge": "ブリッジ", + "city": "都市", + "country": "国", + "domain": "ドメイン", + "editOutbound": "アウトバウンド編集", + "editReverse": "リバース編集", + "intercon": "インターコネクション", + "link": "リンク", + "load": "負荷", + "nordvpn": "NordVPN", + "outboundStatus": "アウトバウンドステータス", + "portal": "ポータル", + "privateKey": "秘密鍵", + "reverse": "リバース", + "reverseTag": "リバースタグ", + "reverseTagDesc": "VLESSシンプルリバースプロキシのアウトバウンドタグ。無効にするには空欄にしてください。", + "reverseTagPlaceholder": "アウトバウンドタグ(空欄で無効)", + "sendThrough": "送信経路", + "server": "サーバー", + "settings": "設定", + "tag": "タグ", + "tagDesc": "一意のタグ", + "test": "テスト", + "testError": "アウトバウンドのテストに失敗しました", + "testFailed": "テスト失敗", + "testResult": "テスト結果", + "testSuccess": "テスト成功", + "testing": "接続をテスト中...", + "type": "タイプ" + }, + "outboundTestUrl": "アウトバウンドテスト URL", + "outboundTestUrlDesc": "アウトバウンド接続テストに使用する URL。既定値", + "restart": "Xray 再起動", + "restartError": "Xrayの再起動中にエラーが発生しました。", + "restartSuccess": "Xrayの再起動に成功しました", + "rules": { + "add": "ルール追加", + "balancer": "負荷分散", + "dest": "宛先アドレス", + "down": "下へ", + "edit": "ルール編集", + "first": "最初", + "inbound": "インバウンド", + "info": "情報", + "last": "最後", + "outbound": "アウトバウンド", + "source": "ソース", + "up": "上へ", + "useComma": "カンマ区切りの項目" + }, + "save": "保存", + "statistics": "統計", + "statsInboundDownlink": "インバウンドダウンロード統計", + "statsInboundDownlinkDesc": "すべてのインバウンドプロキシのダウンストリームトラフィックの統計収集を有効にします。", + "statsInboundUplink": "インバウンドアップロード統計", + "statsInboundUplinkDesc": "すべてのインバウンドプロキシのアップストリームトラフィックの統計収集を有効にします。", + "statsOutboundDownlink": "アウトバウンドダウンロード統計", + "statsOutboundDownlinkDesc": "すべてのアウトバウンドプロキシのダウンストリームトラフィックの統計収集を有効にします。", + "statsOutboundUplink": "アウトバウンドアップロード統計", + "statsOutboundUplinkDesc": "すべてのアウトバウンドプロキシのアップストリームトラフィックの統計収集を有効にします。", + "stopError": "Xrayの停止中にエラーが発生しました。", + "stopSuccess": "Xrayが正常に停止しました", + "title": "Xray 設定", + "tun": { + "mtuDesc": "最大伝送単位。データパケットの最大サイズ。デフォルトは 1500 です", + "nameDesc": "TUN インターフェースの名前。デフォルトは 'xray0' です", + "userLevel": "ユーザーレベル", + "userLevelDesc": "このインバウンドを通じて確立されたすべての接続は、このユーザーレベルを使用します。デフォルトは 0 です" + }, + "warpRouting": "WARP ルーティング", + "warpRoutingDesc": "注意:これらのオプションを使用する前に、パネルのGitHubの手順に従って、サーバーにsocks5プロキシモードでWARPをインストールしてください。WARPはCloudflareサーバー経由でトラフィックをウェブサイトにルーティングします。", + "wireguard": { + "allowedIPs": "許可されたIP", + "domainStrategy": "ドメイン戦略", + "endpoint": "エンドポイント", + "psk": "共有キー", + "publicKey": "公開鍵", + "secretKey": "シークレットキー" } } }, + "password": "パスワード", + "path": "パス", + "protocol": "プロトコル", + "qrCode": "QRコード", + "remained": "残り", + "remark": "備考", + "reset": "リセット", + "save": "保存", + "search": "検索", + "secAlertConf": "一部の設定は脆弱です。潜在的な脆弱性を防ぐために、セキュリティプロトコルを強化することをお勧めします。", + "secAlertPanelPort": "デフォルトのポートにはセキュリティリスクがあります。ランダムなポートまたは特定のポートを設定してください。", + "secAlertPanelURI": "デフォルトのURIパスは安全ではありません。複雑なURIパスを設定してください。", + "secAlertSSL": "セキュアな接続がありません。データ保護のためにTLS証明書をインストールしてください。", + "secAlertSsl": "この接続は安全ではありません。TLSを有効にしてデータ保護を行うまで、機密情報を入力しないでください。", + "secAlertSubJsonURI": "JSONサブスクリプションのデフォルトURIパスは安全ではありません。複雑なURIパスを設定してください。", + "secAlertSubURI": "サブスクリプションのデフォルトURIパスは安全ではありません。複雑なURIパスを設定してください。", + "secAlertTitle": "セキュリティアラート", + "second": "秒", + "security": "セキュリティ", + "somethingWentWrong": "エラーが発生しました", + "status": "ステータス", + "subscription": { + "active": "有効", + "downloaded": "ダウンロード", + "expiry": "有効期限", + "inactive": "無効", + "individualLinks": "個別リンク", + "noExpiry": "期限なし", + "status": "ステータス", + "subId": "サブスクリプションID", + "title": "サブスクリプション情報", + "totalQuota": "合計クォータ", + "unlimited": "無制限", + "uploaded": "アップロード" + }, + "success": "成功", + "sure": "確定", "tgbot": { - "keyboardClosed": "❌ キーボードを閉じました!", - "noResult": "❗ 結果がありません!", - "noQuery": "❌ クエリが見つかりません!コマンドを再利用してください!", - "wentWrong": "❌ 何かがうまくいかなかった!", - "noIpRecord": "❗ IPレコードがありません!", - "noInbounds": "❗ インバウンドが見つかりません!", - "unlimited": "♾ 無制限(リセット)", "add": "追加", - "month": "月", - "months": "ヶ月", - "day": "日", - "days": "日間", - "hours": "時間", - "minutes": "分", - "unknown": "不明", - "inbounds": "インバウンド", - "clients": "クライアント", - "offline": "🔴 オフライン", - "online": "🟢 オンライン", - "commands": { - "unknown": "❗ 不明なコマンド", - "pleaseChoose": "👇 選択してください:\r\n", - "help": "🤖 このボットをご利用いただきありがとうございます!サーバーから特定のデータを提供し、必要な変更を行うことができます。\r\n\r\n", - "start": "👋 こんにちは、{{ .Firstname }}。\r\n", - "welcome": "🤖 {{ .Hostname }} 管理ボットへようこそ。\r\n", - "status": "✅ ボットは正常に動作しています!", - "usage": "❗ 検索するテキストを入力してください!", - "getID": "🆔 あなたのIDは:{{ .ID }}", - "helpAdminCommands": "Xray Coreを再起動するには:\r\n/restart\r\n\r\nクライアントの電子メールを検索するには:\r\n/usage [電子メール]\r\n\r\nインバウンド(クライアントの統計情報を含む)を検索するには:\r\n/inbound [備考]\r\n\r\nTelegramチャットID:\r\n/id", - "helpClientCommands": "統計情報を検索するには、次のコマンドを使用してください:\r\n/usage [電子メール]\r\n\r\nTelegramチャットID:\r\n/id", - "restartUsage": "\r\n\r\n/restart", - "restartSuccess": "✅ 操作成功!", - "restartFailed": "❗ 操作エラー。\r\n\r\nエラー: {{ .Error }}", - "xrayNotRunning": "❗ Xray Core は動作していません。", - "startDesc": "メインメニューを表示", - "helpDesc": "ボットのヘルプ", - "statusDesc": "ボットの状態を確認", - "idDesc": "Telegram IDを表示" - }, - "messages": { - "cpuThreshold": "🔴 CPU使用率は{{ .Percent }}%、しきい値{{ .Threshold }}%を超えました", - "selectUserFailed": "❌ ユーザーの選択に失敗しました!", - "userSaved": "✅ Telegramユーザーが保存されました。", - "loginSuccess": "✅ パネルに正常にログインしました。\r\n", - "loginFailed": "❗️ パネルのログインに失敗しました。\r\n", - "2faFailed": "2FAエラー", - "report": "🕰 定期報告:{{ .RunTime }}\r\n", - "datetime": "⏰ 日時:{{ .DateTime }}\r\n", - "hostname": "💻 ホスト名:{{ .Hostname }}\r\n", - "version": "🚀 X-UI バージョン:{{ .Version }}\r\n", - "xrayVersion": "📡 Xray バージョン: {{ .XrayVersion }}\r\n", - "ipv6": "🌐 IPv6:{{ .IPv6 }}\r\n", - "ipv4": "🌐 IPv4:{{ .IPv4 }}\r\n", - "ip": "🌐 IP:{{ .IP }}\r\n", - "ips": "🔢 IPアドレス:\r\n{{ .IPs }}\r\n", - "serverUpTime": "⏳ サーバー稼働時間:{{ .UpTime }} {{ .Unit }}\r\n", - "serverLoad": "📈 サーバー負荷:{{ .Load1 }}, {{ .Load2 }}, {{ .Load3 }}\r\n", - "serverMemory": "📋 サーバーメモリ:{{ .Current }}/{{ .Total }}\r\n", - "tcpCount": "🔹 TCP接続数:{{ .Count }}\r\n", - "udpCount": "🔸 UDP接続数:{{ .Count }}\r\n", - "traffic": "🚦 トラフィック:{{ .Total }} (↑{{ .Upload }},↓{{ .Download }})\r\n", - "xrayStatus": "ℹ️ Xrayステータス:{{ .State }}\r\n", - "username": "👤 ユーザー名:{{ .Username }}\r\n", - "reason": "❗️ 理由:{{ .Reason }}\r\n", - "time": "⏰ 時間:{{ .Time }}\r\n", - "inbound": "📍 インバウンド:{{ .Remark }}\r\n", - "port": "🔌 ポート:{{ .Port }}\r\n", - "expire": "📅 有効期限:{{ .Time }}\r\n", - "expireIn": "📅 残り時間:{{ .Time }}\r\n", - "active": "💡 有効:{{ .Enable }}\r\n", - "enabled": "🚨 有効化済み:{{ .Enable }}\r\n", - "online": "🌐 接続ステータス:{{ .Status }}\r\n", - "lastOnline": "🔙 最終オンライン: {{ .Time }}\r\n", - "email": "📧 メール:{{ .Email }}\r\n", - "upload": "🔼 アップロード↑:{{ .Upload }}\r\n", - "download": "🔽 ダウンロード↓:{{ .Download }}\r\n", - "total": "📊 合計:{{ .UpDown }} / {{ .Total }}\r\n", - "TGUser": "👤 Telegramユーザー:{{ .TelegramID }}\r\n", - "exhaustedMsg": "🚨 消耗済みの {{ .Type }}:\r\n", - "exhaustedCount": "🚨 消耗済みの {{ .Type }} 数量:\r\n", - "onlinesCount": "🌐 オンラインクライアント:{{ .Count }}\r\n", - "disabled": "🛑 無効化:{{ .Disabled }}\r\n", - "depleteSoon": "🔜 間もなく消耗:{{ .Deplete }}\r\n\r\n", - "backupTime": "🗄 バックアップ時間:{{ .Time }}\r\n", - "refreshedOn": "\r\n📋🔄 更新時間:{{ .Time }}\r\n\r\n", - "yes": "✅ はい", - "no": "❌ いいえ", - "received_id": "🔑📥 IDが更新されました。", - "received_password": "🔑📥 パスワードが更新されました。", - "received_email": "📧📥 メールが更新されました。", - "received_comment": "💬📥 コメントが更新されました。", - "id_prompt": "🔑 デフォルトID: {{ .ClientId }}\n\nIDを入力してください。", - "pass_prompt": "🔑 デフォルトパスワード: {{ .ClientPassword }}\n\nパスワードを入力してください。", - "email_prompt": "📧 デフォルトメール: {{ .ClientEmail }}\n\nメールを入力してください。", - "comment_prompt": "💬 デフォルトコメント: {{ .ClientComment }}\n\nコメントを入力してください。", - "inbound_client_data_id": "🔄 インバウンド: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 メール: {{ .ClientEmail }}\n📊 トラフィック: {{ .ClientTraffic }}\n📅 有効期限: {{ .ClientExp }}\n🌐 IP制限: {{ .IpLimit }}\n💬 コメント: {{ .ClientComment }}\n\n今すぐこのクライアントをインバウンドに追加できます!", - "inbound_client_data_pass": "🔄 インバウンド: {{ .InboundRemark }}\n\n🔑 パスワード: {{ .ClientPass }}\n📧 メール: {{ .ClientEmail }}\n📊 トラフィック: {{ .ClientTraffic }}\n📅 有効期限: {{ .ClientExp }}\n🌐 IP制限: {{ .IpLimit }}\n💬 コメント: {{ .ClientComment }}\n\n今すぐこのクライアントをインバウンドに追加できます!", - "cancel": "❌ プロセスがキャンセルされました!\n\nいつでも /start で再開できます。 🔄", - "error_add_client": "⚠️ エラー:\n\n {{ .error }}", - "using_default_value": "わかりました、デフォルト値を使用します。 😊", - "incorrect_input": "入力が無効です。\nフレーズはスペースなしで続けて入力してください。\n正しい例: aaaaaa\n間違った例: aaa aaa 🚫", - "AreYouSure": "本当にいいですか?🤔", - "SuccessResetTraffic": "📧 メール: {{ .ClientEmail }}\n🏁 結果: ✅ 成功", - "FailedResetTraffic": "📧 メール: {{ .ClientEmail }}\n🏁 結果: ❌ 失敗 \n\n🛠️ エラー: [ {{ .ErrorMessage }} ]", - "FinishProcess": "🔚 すべてのクライアントのトラフィックリセットが完了しました。" - }, - "buttons": { - "closeKeyboard": "❌ キーボードを閉じる", - "cancel": "❌ キャンセル", - "cancelReset": "❌ リセットをキャンセル", - "cancelIpLimit": "❌ IP制限をキャンセル", - "confirmResetTraffic": "✅ トラフィックをリセットしますか?", - "confirmClearIps": "✅ IPをクリアしますか?", - "confirmRemoveTGUser": "✅ Telegramユーザーを削除しますか?", - "confirmToggle": "✅ ユーザーを有効/無効にしますか?", - "dbBackup": "データベースバックアップを取得", - "serverUsage": "サーバーの使用状況", - "getInbounds": "インバウンド情報を取得", - "depleteSoon": "間もなく消耗", - "clientUsage": "使用状況を取得", - "onlines": "オンラインクライアント", - "commands": "コマンド", - "refresh": "🔄 更新", - "clearIPs": "❌ IPをクリア", - "removeTGUser": "❌ Telegramユーザーを削除", - "selectTGUser": "👤 Telegramユーザーを選択", - "selectOneTGUser": "👤 1人のTelegramユーザーを選択:", - "resetTraffic": "📈 トラフィックをリセット", - "resetExpire": "📅 有効期限を変更", - "ipLog": "🔢 IPログ", - "ipLimit": "🔢 IP制限", - "setTGUser": "👤 Telegramユーザーを設定", - "toggle": "🔘 有効/無効", - "custom": "🔢 カスタム", - "confirmNumber": "✅ 確認: {{ .Num }}", - "confirmNumberAdd": "✅ 追加を確認:{{ .Num }}", - "limitTraffic": "🚧 トラフィック制限", - "getBanLogs": "禁止ログ", - "allClients": "すべてのクライアント", - "addClient": "クライアントを追加", - "submitDisable": "無効として送信 ☑️", - "submitEnable": "有効として送信 ✅", - "use_default": "🏷️ デフォルトを使用", - "change_id": "⚙️🔑 ID", - "change_password": "⚙️🔑 パスワード", - "change_email": "⚙️📧 メールアドレス", - "change_comment": "⚙️💬 コメント", - "ResetAllTraffics": "すべてのトラフィックをリセット", - "SortedTrafficUsageReport": "ソートされたトラフィック使用レポート" - }, "answers": { - "successfulOperation": "✅ 成功!", - "errorOperation": "❗ 操作エラー。", - "getInboundsFailed": "❌ インバウンド情報の取得に失敗しました。", - "getClientsFailed": "❌ クライアントの取得に失敗しました。", - "canceled": "❌ {{ .Email }}:操作がキャンセルされました。", - "clientRefreshSuccess": "✅ {{ .Email }}:クライアントが正常に更新されました。", "IpRefreshSuccess": "✅ {{ .Email }}:IPが正常に更新されました。", "TGIdRefreshSuccess": "✅ {{ .Email }}:クライアントのTelegramユーザーが正常に更新されました。", - "resetTrafficSuccess": "✅ {{ .Email }}:トラフィックが正常にリセットされました。", - "setTrafficLimitSuccess": "✅ {{ .Email }}:トラフィック制限が正常に保存されました。", - "expireResetSuccess": "✅ {{ .Email }}:有効期限の日数が正常にリセットされました。", - "resetIpSuccess": "✅ {{ .Email }}:IP制限数が正常に保存されました:{{ .Count }}。", + "askToAddUserId": "設定が見つかりませんでした!\r\n管理者に問い合わせて、設定にTelegramユーザーのChatIDを使用してください。\r\n\r\nあなたのユーザーChatID:\u003ccode\u003e{{ .TgUserID }}\u003c/code\u003e", + "canceled": "❌ {{ .Email }}:操作がキャンセルされました。", + "chooseClient": "インバウンド {{ .Inbound }} のクライアントを選択", + "chooseInbound": "インバウンドを選択", "clearIpSuccess": "✅ {{ .Email }}:IPが正常にクリアされました。", + "clientRefreshSuccess": "✅ {{ .Email }}:クライアントが正常に更新されました。", + "disableSuccess": "✅ {{ .Email }}:正常に無効化されました。", + "enableSuccess": "✅ {{ .Email }}:正常に有効化されました。", + "errorOperation": "❗ 操作エラー。", + "expireResetSuccess": "✅ {{ .Email }}:有効期限の日数が正常にリセットされました。", + "getClientsFailed": "❌ クライアントの取得に失敗しました。", + "getInboundsFailed": "❌ インバウンド情報の取得に失敗しました。", "getIpLog": "✅ {{ .Email }}:IPログの取得。", "getUserInfo": "✅ {{ .Email }}:Telegramユーザー情報の取得。", "removedTGUserSuccess": "✅ {{ .Email }}:Telegramユーザーが正常に削除されました。", - "enableSuccess": "✅ {{ .Email }}:正常に有効化されました。", - "disableSuccess": "✅ {{ .Email }}:正常に無効化されました。", - "askToAddUserId": "設定が見つかりませんでした!\r\n管理者に問い合わせて、設定にTelegramユーザーのChatIDを使用してください。\r\n\r\nあなたのユーザーChatID:{{ .TgUserID }}", - "chooseClient": "インバウンド {{ .Inbound }} のクライアントを選択", - "chooseInbound": "インバウンドを選択" - } - } -} + "resetIpSuccess": "✅ {{ .Email }}:IP制限数が正常に保存されました:{{ .Count }}。", + "resetTrafficSuccess": "✅ {{ .Email }}:トラフィックが正常にリセットされました。", + "setTrafficLimitSuccess": "✅ {{ .Email }}:トラフィック制限が正常に保存されました。", + "successfulOperation": "✅ 成功!" + }, + "buttons": { + "ResetAllTraffics": "すべてのトラフィックをリセット", + "SortedTrafficUsageReport": "ソートされたトラフィック使用レポート", + "addClient": "クライアントを追加", + "allClients": "すべてのクライアント", + "cancel": "❌ キャンセル", + "cancelIpLimit": "❌ IP制限をキャンセル", + "cancelReset": "❌ リセットをキャンセル", + "change_comment": "⚙️💬 コメント", + "change_email": "⚙️📧 メールアドレス", + "change_flow": "🌊 Flow", + "change_id": "⚙️🔑 ID", + "change_password": "⚙️🔑 パスワード", + "change_subid": "📝 Sub ID", + "clearIPs": "❌ IPをクリア", + "clientUsage": "使用状況を取得", + "closeKeyboard": "❌ キーボードを閉じる", + "commands": "コマンド", + "confirmClearIps": "✅ IPをクリアしますか?", + "confirmNumber": "✅ 確認: {{ .Num }}", + "confirmNumberAdd": "✅ 追加を確認:{{ .Num }}", + "confirmRemoveTGUser": "✅ Telegramユーザーを削除しますか?", + "confirmResetTraffic": "✅ トラフィックをリセットしますか?", + "confirmToggle": "✅ ユーザーを有効/無効にしますか?", + "custom": "🔢 カスタム", + "dbBackup": "データベースバックアップを取得", + "depleteSoon": "間もなく消耗", + "flow_none": "None", + "getBanLogs": "禁止ログ", + "getInbounds": "インバウンド情報を取得", + "ipLimit": "🔢 IP制限", + "ipLog": "🔢 IPログ", + "limitTraffic": "🚧 トラフィック制限", + "onlines": "オンラインクライアント", + "refresh": "🔄 更新", + "removeTGUser": "❌ Telegramユーザーを削除", + "resetExpire": "📅 有効期限を変更", + "resetTraffic": "📈 トラフィックをリセット", + "selectOneTGUser": "👤 1人のTelegramユーザーを選択:", + "selectTGUser": "👤 Telegramユーザーを選択", + "serverUsage": "サーバーの使用状況", + "setTGUser": "👤 Telegramユーザーを設定", + "submitDisable": "無効として送信 ☑️", + "submitEnable": "有効として送信 ✅", + "toggle": "🔘 有効/無効", + "use_default": "🏷️ デフォルトを使用" + }, + "clients": "クライアント", + "commands": { + "getID": "🆔 あなたのIDは:\u003ccode\u003e{{ .ID }}\u003c/code\u003e", + "help": "🤖 このボットをご利用いただきありがとうございます!サーバーから特定のデータを提供し、必要な変更を行うことができます。\r\n\r\n", + "helpAdminCommands": "Xray Coreを再起動するには:\r\n\u003ccode\u003e/restart\u003c/code\u003e\r\n\r\nクライアントの電子メールを検索するには:\r\n\u003ccode\u003e/usage [電子メール]\u003c/code\u003e\r\n\r\nインバウンド(クライアントの統計情報を含む)を検索するには:\r\n\u003ccode\u003e/inbound [備考]\u003c/code\u003e\r\n\r\nTelegramチャットID:\r\n\u003ccode\u003e/id\u003c/code\u003e", + "helpClientCommands": "統計情報を検索するには、次のコマンドを使用してください:\r\n\u003ccode\u003e/usage [電子メール]\u003c/code\u003e\r\n\r\nTelegramチャットID:\r\n\u003ccode\u003e/id\u003c/code\u003e", + "helpDesc": "ボットのヘルプ", + "idDesc": "Telegram IDを表示", + "pleaseChoose": "👇 選択してください:\r\n", + "restartFailed": "❗ 操作エラー。\r\n\r\n\u003ccode\u003eエラー: {{ .Error }}\u003c/code\u003e", + "restartSuccess": "✅ 操作成功!", + "restartUsage": "\r\n\r\n\u003ccode\u003e/restart\u003c/code\u003e", + "start": "👋 こんにちは、\u003ci\u003e{{ .Firstname }}\u003c/i\u003e。\r\n", + "startDesc": "メインメニューを表示", + "status": "✅ ボットは正常に動作しています!", + "statusDesc": "ボットの状態を確認", + "unknown": "❗ 不明なコマンド", + "usage": "❗ 検索するテキストを入力してください!", + "welcome": "🤖 \u003cb\u003e{{ .Hostname }}\u003c/b\u003e 管理ボットへようこそ。\r\n", + "xrayNotRunning": "❗ Xray Core は動作していません。" + }, + "day": "日", + "days": "日間", + "hours": "時間", + "inbounds": "インバウンド", + "keyboardClosed": "❌ キーボードを閉じました!", + "messages": { + "2faFailed": "2FAエラー", + "AreYouSure": "本当にいいですか?🤔", + "FailedResetTraffic": "📧 メール: {{ .ClientEmail }}\n🏁 結果: ❌ 失敗 \n\n🛠️ エラー: [ {{ .ErrorMessage }} ]", + "FinishProcess": "🔚 すべてのクライアントのトラフィックリセットが完了しました。", + "SuccessResetTraffic": "📧 メール: {{ .ClientEmail }}\n🏁 結果: ✅ 成功", + "TGUser": "👤 Telegramユーザー:{{ .TelegramID }}\r\n", + "active": "💡 有効:{{ .Enable }}\r\n", + "backupTime": "🗄 バックアップ時間:{{ .Time }}\r\n", + "cancel": "❌ プロセスがキャンセルされました!\n\nいつでも /start で再開できます。 🔄", + "client_flow": "Flow:", + "client_subid": "Sub ID:", + "comment_prompt": "💬 デフォルトコメント: {{ .ClientComment }}\n\nコメントを入力してください。", + "cpuThreshold": "🔴 CPU使用率は{{ .Percent }}%、しきい値{{ .Threshold }}%を超えました", + "datetime": "⏰ 日時:{{ .DateTime }}\r\n", + "depleteSoon": "🔜 間もなく消耗:{{ .Deplete }}\r\n\r\n", + "disabled": "🛑 無効化:{{ .Disabled }}\r\n", + "download": "🔽 ダウンロード↓:{{ .Download }}\r\n", + "email": "📧 メール:{{ .Email }}\r\n", + "email_prompt": "📧 デフォルトメール: {{ .ClientEmail }}\n\nメールを入力してください。", + "enabled": "🚨 有効化済み:{{ .Enable }}\r\n", + "error_add_client": "⚠️ エラー:\n\n {{ .error }}", + "exhaustedCount": "🚨 消耗済みの {{ .Type }} 数量:\r\n", + "exhaustedMsg": "🚨 消耗済みの {{ .Type }}:\r\n", + "expire": "📅 有効期限:{{ .Time }}\r\n", + "expireIn": "📅 残り時間:{{ .Time }}\r\n", + "hostname": "💻 ホスト名:{{ .Hostname }}\r\n", + "id_prompt": "🔑 デフォルトID: {{ .ClientId }}\n\nIDを入力してください。", + "inbound": "📍 インバウンド:{{ .Remark }}\r\n", + "inbound_client_data_id": "🔄 インバウンド: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 メール: {{ .ClientEmail }}\n📊 トラフィック: {{ .ClientTraffic }}\n📅 有効期限: {{ .ClientExp }}\n🌐 IP制限: {{ .IpLimit }}\n💬 コメント: {{ .ClientComment }}\n\n今すぐこのクライアントをインバウンドに追加できます!", + "inbound_client_data_pass": "🔄 インバウンド: {{ .InboundRemark }}\n\n🔑 パスワード: {{ .ClientPass }}\n📧 メール: {{ .ClientEmail }}\n📊 トラフィック: {{ .ClientTraffic }}\n📅 有効期限: {{ .ClientExp }}\n🌐 IP制限: {{ .IpLimit }}\n💬 コメント: {{ .ClientComment }}\n\n今すぐこのクライアントをインバウンドに追加できます!", + "incorrect_input": "入力が無効です。\nフレーズはスペースなしで続けて入力してください。\n正しい例: aaaaaa\n間違った例: aaa aaa 🚫", + "invalid_subid": "Invalid format.\nSub ID can only contain letters, numbers, hyphens (-), and underscores (_).\nSpaces and special characters are not allowed. 🚫", + "ip": "🌐 IP:{{ .IP }}\r\n", + "ips": "🔢 IPアドレス:\r\n{{ .IPs }}\r\n", + "ipv4": "🌐 IPv4:{{ .IPv4 }}\r\n", + "ipv6": "🌐 IPv6:{{ .IPv6 }}\r\n", + "lastOnline": "🔙 最終オンライン: {{ .Time }}\r\n", + "loginFailed": "❗️ パネルのログインに失敗しました。\r\n", + "loginSuccess": "✅ パネルに正常にログインしました。\r\n", + "no": "❌ いいえ", + "online": "🌐 接続ステータス:{{ .Status }}\r\n", + "onlinesCount": "🌐 オンラインクライアント:{{ .Count }}\r\n", + "pass_prompt": "🔑 デフォルトパスワード: {{ .ClientPassword }}\n\nパスワードを入力してください。", + "port": "🔌 ポート:{{ .Port }}\r\n", + "reason": "❗️ 理由:{{ .Reason }}\r\n", + "received_comment": "💬📥 コメントが更新されました。", + "received_email": "📧📥 メールが更新されました。", + "received_id": "🔑📥 IDが更新されました。", + "received_password": "🔑📥 パスワードが更新されました。", + "received_subid": "Sub ID updated successfully!", + "refreshedOn": "\r\n📋🔄 更新時間:{{ .Time }}\r\n\r\n", + "report": "🕰 定期報告:{{ .RunTime }}\r\n", + "selectUserFailed": "❌ ユーザーの選択に失敗しました!", + "serverLoad": "📈 サーバー負荷:{{ .Load1 }}, {{ .Load2 }}, {{ .Load3 }}\r\n", + "serverMemory": "📋 サーバーメモリ:{{ .Current }}/{{ .Total }}\r\n", + "serverUpTime": "⏳ サーバー稼働時間:{{ .UpTime }} {{ .Unit }}\r\n", + "subid_prompt": "Please enter new Sub ID:\nCurrent: {{.ClientSubId}}", + "tcpCount": "🔹 TCP接続数:{{ .Count }}\r\n", + "time": "⏰ 時間:{{ .Time }}\r\n", + "total": "📊 合計:{{ .UpDown }} / {{ .Total }}\r\n", + "traffic": "🚦 トラフィック:{{ .Total }} (↑{{ .Upload }},↓{{ .Download }})\r\n", + "udpCount": "🔸 UDP接続数:{{ .Count }}\r\n", + "upload": "🔼 アップロード↑:{{ .Upload }}\r\n", + "userSaved": "✅ Telegramユーザーが保存されました。", + "username": "👤 ユーザー名:{{ .Username }}\r\n", + "using_default_value": "わかりました、デフォルト値を使用します。 😊", + "version": "🚀 X-UI バージョン:{{ .Version }}\r\n", + "xrayStatus": "ℹ️ Xrayステータス:{{ .State }}\r\n", + "xrayVersion": "📡 Xray バージョン: {{ .XrayVersion }}\r\n", + "yes": "✅ はい" + }, + "minutes": "分", + "month": "月", + "months": "ヶ月", + "noInbounds": "❗ インバウンドが見つかりません!", + "noIpRecord": "❗ IPレコードがありません!", + "noQuery": "❌ クエリが見つかりません!コマンドを再利用してください!", + "noResult": "❗ 結果がありません!", + "offline": "🔴 オフライン", + "online": "🟢 オンライン", + "unknown": "不明", + "unlimited": "♾ 無制限(リセット)", + "wentWrong": "❌ 何かがうまくいかなかった!" + }, + "transmission": "伝送", + "twoFactorCode": "コード", + "unlimited": "無制限", + "update": "更新", + "usage": "利用状況", + "useIPv4ForHost": "ホストにIPv4を使用", + "username": "ユーザー名" +} \ No newline at end of file diff --git a/web/translation/pt-BR.json b/web/translation/pt-BR.json index f639f230..b3cc9dbf 100644 --- a/web/translation/pt-BR.json +++ b/web/translation/pt-BR.json @@ -1,750 +1,604 @@ { - "username": "Nome de Usuário", - "password": "Senha", - "login": "Entrar", - "confirm": "Confirmar", - "cancel": "Cancelar", - "close": "Fechar", - "save": "Salvar", - "logout": "Sair", - "create": "Criar", - "update": "Atualizar", - "copy": "Copiar", - "copied": "Copiado", - "download": "Baixar", - "remark": "Observação", - "enable": "Ativado", - "protocol": "Protocolo", - "search": "Pesquisar", - "filter": "Filtrar", - "loading": "Carregando...", - "second": "Segundo", - "minute": "Minuto", - "hour": "Hora", - "day": "Dia", - "check": "Verificar", - "indefinite": "Indeterminado", - "unlimited": "Ilimitado", - "none": "Nada", - "qrCode": "Código QR", - "info": "Mais Informações", - "edit": "Editar", - "delete": "Excluir", - "reset": "Redefinir", - "noData": "Sem dados.", - "copySuccess": "Copiado com Sucesso", - "sure": "Certo", - "encryption": "Criptografia", - "useIPv4ForHost": "Usar IPv4 para o host", - "transmission": "Transmissão", - "host": "Servidor", - "path": "Caminho", "camouflage": "Ofuscação", - "status": "Status", - "enabled": "Ativado", - "disabled": "Desativado", + "cancel": "Cancelar", + "certificate": "Certificado Digital", + "check": "Verificar", + "clients": "Clientes", + "close": "Fechar", + "comment": "Comentário", + "confirm": "Confirmar", + "copied": "Copiado", + "copy": "Copiar", + "copySuccess": "Copiado com Sucesso", + "create": "Criar", + "day": "Dia", + "delete": "Excluir", "depleted": "Encerrado", "depletingSoon": "Esgotando", - "offline": "Offline", - "online": "Online", + "disabled": "Desativado", "domainName": "Nome de Domínio", - "monitor": "IP de Escuta", - "certificate": "Certificado Digital", - "fail": "Falhou", - "comment": "Comentário", - "success": "Com Sucesso", - "lastOnline": "Última vez online", - "getVersion": "Obter Versão", - "install": "Instalar", - "clients": "Clientes", - "usage": "Uso", - "twoFactorCode": "Código", - "remained": "Restante", - "security": "Segurança", - "secAlertTitle": "Alerta de Segurança", - "secAlertSsl": "Esta conexão não é segura. Evite inserir informações confidenciais até que o TLS seja ativado para proteção de dados.", - "secAlertConf": "Algumas configurações estão vulneráveis a ataques. Recomenda-se reforçar os protocolos de segurança para evitar possíveis violações.", - "secAlertSSL": "O painel não possui uma conexão segura. Instale o certificado TLS para proteção de dados.", - "secAlertPanelPort": "A porta padrão do painel é vulnerável. Configure uma porta aleatória ou específica.", - "secAlertPanelURI": "O caminho URI padrão do painel não é seguro. Configure um caminho URI complexo.", - "secAlertSubURI": "O caminho URI padrão de inscrição não é seguro. Configure um caminho URI complexo.", - "secAlertSubJsonURI": "O caminho URI JSON de inscrição padrão não é seguro. Configure um caminho URI complexo.", + "download": "Baixar", + "edit": "Editar", + "emptyBalancersDesc": "Nenhum balanceador adicionado.", "emptyDnsDesc": "Nenhum servidor DNS adicionado.", "emptyFakeDnsDesc": "Nenhum servidor Fake DNS adicionado.", - "emptyBalancersDesc": "Nenhum balanceador adicionado.", "emptyReverseDesc": "Nenhum proxy reverso adicionado.", - "somethingWentWrong": "Algo deu errado", - "subscription": { - "title": "Informações da assinatura", - "subId": "ID da assinatura", - "status": "Status", - "downloaded": "Baixado", - "uploaded": "Enviado", - "expiry": "Validade", - "totalQuota": "Cota total", - "individualLinks": "Links individuais", - "active": "Ativo", - "inactive": "Inativo", - "unlimited": "Ilimitado", - "noExpiry": "Sem validade" - }, + "enable": "Ativado", + "enabled": "Ativado", + "encryption": "Criptografia", + "fail": "Falhou", + "filter": "Filtrar", + "getVersion": "Obter Versão", + "host": "Servidor", + "hour": "Hora", + "indefinite": "Indeterminado", + "info": "Mais Informações", + "install": "Instalar", + "lastOnline": "Última vez online", + "loading": "Carregando...", + "login": "Entrar", + "logout": "Sair", "menu": { - "theme": "Tema", + "apiDocs": "Documentação da API", "dark": "Escuro", - "ultraDark": "Ultra Escuro", "dashboard": "Visão Geral", "inbounds": "Inbounds", + "link": "Gerenciar", + "logout": "Sair", "nodes": "Nós", "settings": "Panel Settings", - "xray": "Xray Configs", - "apiDocs": "Documentação da API", - "logout": "Sair", - "link": "Gerenciar" + "theme": "Tema", + "ultraDark": "Ultra Escuro", + "xray": "Xray Configs" }, + "minute": "Minuto", + "monitor": "IP de Escuta", + "noData": "Sem dados.", + "none": "Nada", + "offline": "Offline", + "online": "Online", "pages": { - "login": { - "hello": "Olá", - "title": "Bem-vindo", - "loginAgain": "Sua sessão expirou, faça login novamente", - "toasts": { - "invalidFormData": "O formato dos dados de entrada é inválido.", - "emptyUsername": "Nome de usuário é obrigatório", - "emptyPassword": "Senha é obrigatória", - "wrongUsernameOrPassword": "Nome de usuário, senha ou código de dois fatores inválido.", - "successLogin": "Você entrou na sua conta com sucesso." - } - }, - "index": { - "title": "Visão Geral", - "cpu": "CPU", - "logicalProcessors": "Processadores lógicos", - "frequency": "Frequência", - "swap": "Swap", - "storage": "Armazenamento", - "memory": "RAM", - "threads": "Threads", - "xrayStatus": "Xray", - "stopXray": "Parar", - "restartXray": "Reiniciar", - "xraySwitch": "Versão", - "xraySwitchClick": "Escolha a versão para a qual deseja alternar.", - "xraySwitchClickDesk": "Escolha com cuidado, pois versões mais antigas podem não ser compatíveis com as configurações atuais.", - "xrayUpdates": "Atualizações do Xray", - "updatePanel": "Atualizar painel", - "panelUpdateDesc": "Isso atualizará o 3X-UI para a versão mais recente e reiniciará o serviço do painel.", - "currentPanelVersion": "Versão atual do painel", - "latestPanelVersion": "Última versão do painel", - "panelUpToDate": "O painel está atualizado", - "upToDate": "Atualizado", - "xrayStatusUnknown": "Desconhecido", - "xrayStatusRunning": "Em execução", - "xrayStatusStop": "Parado", - "xrayStatusError": "Erro", - "xrayErrorPopoverTitle": "Ocorreu um erro ao executar o Xray", - "operationHours": "Tempo de Atividade", - "systemHistoryTitle": "Histórico do Sistema", - "charts": "Gráficos", - "xrayMetricsTitle": "Métricas do Xray", - "xrayMetricsDisabled": "Endpoint de métricas do Xray não configurado", - "xrayMetricsHint": "Adicione um bloco metrics de nível superior à configuração do xray com tag metrics_out e listen 127.0.0.1:11111, depois reinicie o xray.", - "xrayObservatoryEmpty": "Ainda não há dados do Observatory", - "xrayObservatoryHint": "Adicione um bloco observatory à configuração do xray listando as tags de outbound a sondar, depois reinicie o xray.", - "xrayObservatoryTagPlaceholder": "Selecionar outbound", - "xrayObservatoryAlive": "Ativo", - "xrayObservatoryDead": "Inativo", - "xrayObservatoryLastSeen": "Visto pela última vez", - "xrayObservatoryLastTry": "Última tentativa", - "trendLast2Min": "Últimos 2 minutos", - "systemLoad": "Carga do Sistema", - "systemLoadDesc": "Média de carga do sistema nos últimos 1, 5 e 15 minutos", - "connectionCount": "Estatísticas de Conexão", - "ipAddresses": "Endereços IP", - "toggleIpVisibility": "Alternar visibilidade do IP", - "overallSpeed": "Velocidade geral", - "upload": "Upload", - "download": "Download", - "totalData": "Dados totais", - "sent": "Enviado", - "received": "Recebido", - "documentation": "Documentação", - "xraySwitchVersionDialog": "Você realmente deseja alterar a versão do Xray?", - "xraySwitchVersionDialogDesc": "Isso mudará a versão do Xray para #version#.", - "xraySwitchVersionPopover": "Xray atualizado com sucesso", - "panelUpdateDialog": "Deseja realmente atualizar o painel?", - "panelUpdateDialogDesc": "Isso atualizará o 3X-UI para #version# e reiniciará o serviço do painel.", - "panelUpdateCheckPopover": "Falha na verificação de atualização do painel", - "panelUpdateStartedPopover": "Atualização do painel iniciada", - "geofileUpdateDialog": "Você realmente deseja atualizar o geofile?", - "geofileUpdateDialogDesc": "Isso atualizará o arquivo #filename#.", - "geofilesUpdateDialogDesc": "Isso atualizará todos os arquivos.", - "geofilesUpdateAll": "Atualizar tudo", - "geofileUpdatePopover": "Geofile atualizado com sucesso", - "dontRefresh": "Instalação em andamento, por favor não atualize a página", - "logs": "Logs", - "config": "Configuração", - "backup": "Backup", - "backupTitle": "Backup & Restauração", - "exportDatabase": "Backup", - "exportDatabaseDesc": "Clique para baixar um arquivo .db contendo um backup do seu banco de dados atual para o seu dispositivo.", - "importDatabase": "Restaurar", - "importDatabaseDesc": "Clique para selecionar e enviar um arquivo .db do seu dispositivo para restaurar seu banco de dados a partir de um backup.", - "importDatabaseSuccess": "O banco de dados foi importado com sucesso", - "importDatabaseError": "Ocorreu um erro ao importar o banco de dados", - "readDatabaseError": "Ocorreu um erro ao ler o banco de dados", - "getDatabaseError": "Ocorreu um erro ao recuperar o banco de dados", - "getConfigError": "Ocorreu um erro ao recuperar o arquivo de configuração", - "customGeoTitle": "GeoSite / GeoIP personalizados", - "customGeoAdd": "Adicionar", - "customGeoType": "Tipo", - "customGeoAlias": "Alias", - "customGeoUrl": "URL", - "customGeoEnabled": "Ativado", - "customGeoLastUpdated": "Última atualização", - "customGeoExtColumn": "Roteamento (ext:…)", - "customGeoToastUpdateAll": "Todas as fontes personalizadas foram atualizadas", - "customGeoActions": "Ações", - "customGeoEdit": "Editar", - "customGeoDelete": "Excluir", - "customGeoDownload": "Atualizar agora", - "customGeoModalAdd": "Adicionar geo personalizado", - "customGeoModalEdit": "Editar geo personalizado", - "customGeoModalSave": "Salvar", - "customGeoDeleteConfirm": "Excluir esta fonte geo personalizada?", - "customGeoRoutingHint": "Nas regras de roteamento use a coluna de valor como ext:arquivo.dat:tag (substitua a tag).", - "customGeoInvalidId": "ID de recurso inválido", - "customGeoAliasesError": "Falha ao carregar aliases geo personalizados", - "customGeoValidationAlias": "O alias só pode conter letras minúsculas, dígitos, - e _", - "customGeoValidationUrl": "A URL deve começar com http:// ou https://", - "customGeoAliasPlaceholder": "a-z 0-9 _ -", - "customGeoAliasLabelSuffix": " (personalizado)", - "customGeoToastList": "Lista de geo personalizado", - "customGeoToastAdd": "Adicionar geo personalizado", - "customGeoToastUpdate": "Atualizar geo personalizado", - "customGeoToastDelete": "Geofile personalizado “{{ .fileName }}” excluído", - "customGeoToastDownload": "Geofile “{{ .fileName }}” atualizado", - "customGeoErrInvalidType": "O tipo deve ser geosite ou geoip", - "customGeoErrAliasRequired": "Alias é obrigatório", - "customGeoErrAliasPattern": "O alias contém caracteres não permitidos", - "customGeoErrAliasReserved": "Este alias é reservado", - "customGeoErrUrlRequired": "URL é obrigatória", - "customGeoErrInvalidUrl": "URL inválida", - "customGeoErrUrlScheme": "A URL deve usar http ou https", - "customGeoErrUrlHost": "Host da URL inválido", - "customGeoErrDuplicateAlias": "Este alias já está em uso para este tipo", - "customGeoErrNotFound": "Fonte geo personalizada não encontrada", - "customGeoErrDownload": "Falha no download", - "customGeoErrUpdateAllIncomplete": "Falha ao atualizar uma ou mais fontes geo personalizadas", - "customGeoEmpty": "Ainda não há fontes geo personalizadas — clique em Adicionar para criar uma" + "client": { + "add": "Adicionar Cliente", + "bulk": "Adicionar Vários", + "clearAll": "Limpar tudo", + "clientCount": "Número de Clientes", + "copyEmailPreview": "Prévia do email resultante", + "copyFlowHint": "Aplicado a todos os clientes copiados. Deixe em branco para ignorar.", + "copyFlowLabel": "Flow para novos clientes (VLESS)", + "copyFromInbound": "Copiar clientes da entrada", + "copyResult": "Resultado da cópia", + "copyResultErrors": "Erros ao copiar", + "copyResultNone": "Nada a copiar: nenhum cliente selecionado ou origem vazia", + "copyResultSuccess": "Copiado com sucesso", + "copySelectSourceFirst": "Selecione primeiro uma entrada de origem.", + "copySelected": "Copiar selecionados", + "copySource": "Origem", + "copyToInbound": "Copiar clientes para", + "days": "Dia(s)", + "delayedStart": "Iniciar Após Primeiro Uso", + "edit": "Editar Cliente", + "expireDays": "Duração", + "first": "Primeiro", + "last": "Último", + "method": "Método", + "postfix": "Sufixo", + "prefix": "Prefixo", + "renew": "Renovação Automática", + "renewDesc": "Renovação automática após expiração. (0 = desativado)(unidade: dia)", + "selectAll": "Selecionar tudo", + "submitAdd": "Adicionar Cliente", + "submitEdit": "Salvar Alterações" }, "inbounds": { - "allTimeTraffic": "Tráfego Total", - "allTimeTrafficUsage": "Uso total de todos os tempos", - "title": "Inbounds", - "totalDownUp": "Total Enviado/Recebido", - "totalUsage": "Uso Total", - "inboundCount": "Total de Inbounds", - "operate": "Menu", - "enable": "Ativado", - "remark": "Observação", - "node": "Nó", - "deployTo": "Implantar em", - "localPanel": "Painel local", - "protocol": "Protocolo", - "port": "Porta", - "portMap": "Porta Mapeada", - "traffic": "Tráfego", - "details": "Detalhes", - "transportConfig": "Transporte", - "expireDate": "Duração", - "createdAt": "Criado", - "updatedAt": "Atualizado", - "resetTraffic": "Redefinir Tráfego", - "addInbound": "Adicionar Inbound", - "generalActions": "Ações Gerais", - "modifyInbound": "Modificar Inbound", - "deleteInbound": "Excluir Inbound", - "deleteInboundContent": "Tem certeza de que deseja excluir o inbound?", - "deleteClient": "Excluir Cliente", - "deleteClientContent": "Tem certeza de que deseja excluir o cliente?", - "resetTrafficContent": "Tem certeza de que deseja redefinir o tráfego?", - "copyLink": "Copiar URL", - "address": "Endereço", - "network": "Rede", - "destinationPort": "Porta de Destino", - "targetAddress": "Endereço de Destino", - "monitorDesc": "Deixe em branco para ouvir todos os IPs", - "meansNoLimit": "= Ilimitado. (unidade: GB)", - "totalFlow": "Fluxo Total", - "leaveBlankToNeverExpire": "Deixe em branco para nunca expirar", - "noRecommendKeepDefault": "Recomenda-se manter o padrão", - "certificatePath": "Caminho", - "certificateContent": "Conteúdo", - "publicKey": "Chave Pública", - "privatekey": "Chave Privada", - "clickOnQRcode": "Clique no Código QR para Copiar", - "client": "Cliente", - "export": "Exportar Todos os URLs", - "clone": "Clonar", - "cloneInbound": "Clonar", - "cloneInboundContent": "Todas as configurações deste inbound, exceto Porta, IP de Escuta e Clientes, serão aplicadas ao clone.", - "cloneInboundOk": "Clonar", - "resetAllTraffic": "Redefinir Tráfego de Todos os Inbounds", - "resetAllTrafficTitle": "Redefinir Tráfego de Todos os Inbounds", - "resetAllTrafficContent": "Tem certeza de que deseja redefinir o tráfego de todos os inbounds?", - "resetInboundClientTraffics": "Redefinir Tráfego dos Clientes", - "resetInboundClientTrafficTitle": "Redefinir Tráfego dos Clientes", - "resetInboundClientTrafficContent": "Tem certeza de que deseja redefinir o tráfego dos clientes deste inbound?", - "resetAllClientTraffics": "Redefinir Tráfego de Todos os Clientes", - "resetAllClientTrafficTitle": "Redefinir Tráfego de Todos os Clientes", - "resetAllClientTrafficContent": "Tem certeza de que deseja redefinir o tráfego de todos os clientes?", - "delDepletedClients": "Excluir Clientes Esgotados", - "delDepletedClientsTitle": "Excluir Clientes Esgotados", - "delDepletedClientsContent": "Tem certeza de que deseja excluir todos os clientes esgotados?", - "email": "Email", - "emailDesc": "Por favor, forneça um endereço de e-mail único.", "IPLimit": "Limite de IP", "IPLimitDesc": "Desativa o inbound se o número ultrapassar o valor definido. (0 = desativar)", "IPLimitlog": "Log de IP", "IPLimitlogDesc": "O histórico de IPs. (para ativar o inbound após a desativação, limpe o log)", "IPLimitlogclear": "Limpar o Log", - "setDefaultCert": "Definir Certificado pelo Painel", - "telegramDesc": "Por favor, forneça o ID do Chat do Telegram. (use o comando '/id' no bot) ou ({'@'}userinfobot)", - "subscriptionDesc": "Para encontrar seu URL de assinatura, navegue até 'Detalhes'. Além disso, você pode usar o mesmo nome para vários clientes.", - "info": "Informações", - "same": "Igual", - "inboundData": "Dados do Inbound", + "addInbound": "Adicionar Inbound", + "address": "Endereço", + "allTimeTraffic": "Tráfego Total", + "allTimeTrafficUsage": "Uso total de todos os tempos", + "certificateContent": "Conteúdo", + "certificatePath": "Caminho", + "clickOnQRcode": "Clique no Código QR para Copiar", + "client": "Cliente", + "clone": "Clonar", + "cloneInbound": "Clonar", + "cloneInboundContent": "Todas as configurações deste inbound, exceto Porta, IP de Escuta e Clientes, serão aplicadas ao clone.", + "cloneInboundOk": "Clonar", + "copyLink": "Copiar URL", + "createdAt": "Criado", + "delDepletedClients": "Excluir Clientes Esgotados", + "delDepletedClientsContent": "Tem certeza de que deseja excluir todos os clientes esgotados?", + "delDepletedClientsTitle": "Excluir Clientes Esgotados", + "deleteClient": "Excluir Cliente", + "deleteClientContent": "Tem certeza de que deseja excluir o cliente?", + "deleteInbound": "Excluir Inbound", + "deleteInboundContent": "Tem certeza de que deseja excluir o inbound?", + "deployTo": "Implantar em", + "destinationPort": "Porta de Destino", + "details": "Detalhes", + "email": "Email", + "emailDesc": "Por favor, forneça um endereço de e-mail único.", + "enable": "Ativado", + "expireDate": "Duração", + "export": "Exportar Todos os URLs", "exportInbound": "Exportar Inbound", + "generalActions": "Ações Gerais", "import": "Importar", "importInbound": "Importar um Inbound", - "periodicTrafficResetTitle": "Reset de Tráfego", - "periodicTrafficResetDesc": "Reinicia automaticamente o contador de tráfego em intervalos especificados", + "inboundCount": "Total de Inbounds", + "inboundData": "Dados do Inbound", + "info": "Informações", "lastReset": "Último Reset", + "leaveBlankToNeverExpire": "Deixe em branco para nunca expirar", + "localPanel": "Painel local", + "meansNoLimit": "= Ilimitado. (unidade: GB)", + "modifyInbound": "Modificar Inbound", + "monitorDesc": "Deixe em branco para ouvir todos os IPs", + "network": "Rede", + "noRecommendKeepDefault": "Recomenda-se manter o padrão", + "node": "Nó", + "operate": "Menu", "periodicTrafficReset": { - "never": "Nunca", "daily": "Diariamente", - "weekly": "Semanalmente", + "hourly": "A cada hora", "monthly": "Mensalmente", - "hourly": "A cada hora" + "never": "Nunca", + "weekly": "Semanalmente" }, + "periodicTrafficResetDesc": "Reinicia automaticamente o contador de tráfego em intervalos especificados", + "periodicTrafficResetTitle": "Reset de Tráfego", + "port": "Porta", + "portMap": "Porta Mapeada", + "privatekey": "Chave Privada", + "protocol": "Protocolo", + "publicKey": "Chave Pública", + "remark": "Observação", + "resetAllClientTrafficContent": "Tem certeza de que deseja redefinir o tráfego de todos os clientes?", + "resetAllClientTrafficTitle": "Redefinir Tráfego de Todos os Clientes", + "resetAllClientTraffics": "Redefinir Tráfego de Todos os Clientes", + "resetAllTraffic": "Redefinir Tráfego de Todos os Inbounds", + "resetAllTrafficContent": "Tem certeza de que deseja redefinir o tráfego de todos os inbounds?", + "resetAllTrafficTitle": "Redefinir Tráfego de Todos os Inbounds", + "resetInboundClientTrafficContent": "Tem certeza de que deseja redefinir o tráfego dos clientes deste inbound?", + "resetInboundClientTrafficTitle": "Redefinir Tráfego dos Clientes", + "resetInboundClientTraffics": "Redefinir Tráfego dos Clientes", + "resetTraffic": "Redefinir Tráfego", + "resetTrafficContent": "Tem certeza de que deseja redefinir o tráfego?", + "same": "Igual", + "setDefaultCert": "Definir Certificado pelo Painel", + "stream": { + "general": { + "name": "Nome", + "request": "Requisição", + "response": "Resposta", + "value": "Valor" + }, + "tcp": { + "method": "Método", + "path": "Caminho", + "requestHeader": "Cabeçalho da Requisição", + "responseHeader": "Cabeçalho da Resposta", + "status": "Status", + "statusDescription": "Descrição do Status", + "version": "Versão" + } + }, + "subscriptionDesc": "Para encontrar seu URL de assinatura, navegue até 'Detalhes'. Além disso, você pode usar o mesmo nome para vários clientes.", + "targetAddress": "Endereço de Destino", + "telegramDesc": "Por favor, forneça o ID do Chat do Telegram. (use o comando '/id' no bot) ou ({'@'}userinfobot)", + "title": "Inbounds", "toasts": { - "obtain": "Obter", - "updateSuccess": "A atualização foi bem-sucedida", - "logCleanSuccess": "O log foi limpo", - "inboundsUpdateSuccess": "Entradas atualizadas com sucesso", - "inboundUpdateSuccess": "Entrada atualizada com sucesso", - "inboundCreateSuccess": "Entrada criada com sucesso", - "inboundDeleteSuccess": "Entrada excluída com sucesso", + "delDepletedClientsSuccess": "Todos os clientes esgotados foram excluídos", + "getNewVlessEncError": "Erro ao obter o certificado VlessEnc.", + "getNewX25519CertError": "Erro ao obter o certificado X25519.", + "getNewmldsa65Error": "Erro ao obter o certificado mldsa65.", "inboundClientAddSuccess": "Cliente(s) de entrada adicionado(s)", "inboundClientDeleteSuccess": "Cliente de entrada excluído", "inboundClientUpdateSuccess": "Cliente de entrada atualizado", - "delDepletedClientsSuccess": "Todos os clientes esgotados foram excluídos", + "inboundCreateSuccess": "Entrada criada com sucesso", + "inboundDeleteSuccess": "Entrada excluída com sucesso", + "inboundUpdateSuccess": "Entrada atualizada com sucesso", + "inboundsUpdateSuccess": "Entradas atualizadas com sucesso", + "logCleanSuccess": "O log foi limpo", + "obtain": "Obter", "resetAllClientTrafficSuccess": "Todo o tráfego do cliente foi reiniciado", "resetAllTrafficSuccess": "Todo o tráfego foi reiniciado", "resetInboundClientTrafficSuccess": "O tráfego foi reiniciado", "trafficGetError": "Erro ao obter tráfegos", - "getNewX25519CertError": "Erro ao obter o certificado X25519.", - "getNewmldsa65Error": "Erro ao obter o certificado mldsa65.", - "getNewVlessEncError": "Erro ao obter o certificado VlessEnc." + "updateSuccess": "A atualização foi bem-sucedida" }, - "stream": { - "general": { - "request": "Requisição", - "response": "Resposta", - "name": "Nome", - "value": "Valor" - }, - "tcp": { - "version": "Versão", - "method": "Método", - "path": "Caminho", - "status": "Status", - "statusDescription": "Descrição do Status", - "requestHeader": "Cabeçalho da Requisição", - "responseHeader": "Cabeçalho da Resposta" - } - } + "totalDownUp": "Total Enviado/Recebido", + "totalFlow": "Fluxo Total", + "totalUsage": "Uso Total", + "traffic": "Tráfego", + "transportConfig": "Transporte", + "updatedAt": "Atualizado" }, - "client": { - "add": "Adicionar Cliente", - "edit": "Editar Cliente", - "submitAdd": "Adicionar Cliente", - "submitEdit": "Salvar Alterações", - "clientCount": "Número de Clientes", - "bulk": "Adicionar Vários", - "copyFromInbound": "Copiar clientes da entrada", - "copyToInbound": "Copiar clientes para", - "copySelected": "Copiar selecionados", - "copySource": "Origem", - "copyEmailPreview": "Prévia do email resultante", - "copySelectSourceFirst": "Selecione primeiro uma entrada de origem.", - "copyResult": "Resultado da cópia", - "copyResultSuccess": "Copiado com sucesso", - "copyResultNone": "Nada a copiar: nenhum cliente selecionado ou origem vazia", - "copyResultErrors": "Erros ao copiar", - "copyFlowLabel": "Flow para novos clientes (VLESS)", - "copyFlowHint": "Aplicado a todos os clientes copiados. Deixe em branco para ignorar.", - "selectAll": "Selecionar tudo", - "clearAll": "Limpar tudo", - "method": "Método", - "first": "Primeiro", - "last": "Último", - "prefix": "Prefixo", - "postfix": "Sufixo", - "delayedStart": "Iniciar Após Primeiro Uso", - "expireDays": "Duração", - "days": "Dia(s)", - "renew": "Renovação Automática", - "renewDesc": "Renovação automática após expiração. (0 = desativado)(unidade: dia)" + "index": { + "backup": "Backup", + "backupTitle": "Backup \u0026 Restauração", + "charts": "Gráficos", + "config": "Configuração", + "connectionCount": "Estatísticas de Conexão", + "cpu": "CPU", + "currentPanelVersion": "Versão atual do painel", + "customGeoActions": "Ações", + "customGeoAdd": "Adicionar", + "customGeoAlias": "Alias", + "customGeoAliasLabelSuffix": " (personalizado)", + "customGeoAliasPlaceholder": "a-z 0-9 _ -", + "customGeoAliasesError": "Falha ao carregar aliases geo personalizados", + "customGeoDelete": "Excluir", + "customGeoDeleteConfirm": "Excluir esta fonte geo personalizada?", + "customGeoDownload": "Atualizar agora", + "customGeoEdit": "Editar", + "customGeoEmpty": "Ainda não há fontes geo personalizadas — clique em Adicionar para criar uma", + "customGeoEnabled": "Ativado", + "customGeoErrAliasPattern": "O alias contém caracteres não permitidos", + "customGeoErrAliasRequired": "Alias é obrigatório", + "customGeoErrAliasReserved": "Este alias é reservado", + "customGeoErrDownload": "Falha no download", + "customGeoErrDuplicateAlias": "Este alias já está em uso para este tipo", + "customGeoErrInvalidType": "O tipo deve ser geosite ou geoip", + "customGeoErrInvalidUrl": "URL inválida", + "customGeoErrNotFound": "Fonte geo personalizada não encontrada", + "customGeoErrUpdateAllIncomplete": "Falha ao atualizar uma ou mais fontes geo personalizadas", + "customGeoErrUrlHost": "Host da URL inválido", + "customGeoErrUrlRequired": "URL é obrigatória", + "customGeoErrUrlScheme": "A URL deve usar http ou https", + "customGeoExtColumn": "Roteamento (ext:…)", + "customGeoInvalidId": "ID de recurso inválido", + "customGeoLastUpdated": "Última atualização", + "customGeoModalAdd": "Adicionar geo personalizado", + "customGeoModalEdit": "Editar geo personalizado", + "customGeoModalSave": "Salvar", + "customGeoRoutingHint": "Nas regras de roteamento use a coluna de valor como ext:arquivo.dat:tag (substitua a tag).", + "customGeoTitle": "GeoSite / GeoIP personalizados", + "customGeoToastAdd": "Adicionar geo personalizado", + "customGeoToastDelete": "Geofile personalizado “{{ .fileName }}” excluído", + "customGeoToastDownload": "Geofile “{{ .fileName }}” atualizado", + "customGeoToastList": "Lista de geo personalizado", + "customGeoToastUpdate": "Atualizar geo personalizado", + "customGeoToastUpdateAll": "Todas as fontes personalizadas foram atualizadas", + "customGeoType": "Tipo", + "customGeoUrl": "URL", + "customGeoValidationAlias": "O alias só pode conter letras minúsculas, dígitos, - e _", + "customGeoValidationUrl": "A URL deve começar com http:// ou https://", + "documentation": "Documentação", + "dontRefresh": "Instalação em andamento, por favor não atualize a página", + "download": "Download", + "exportDatabase": "Backup", + "exportDatabaseDesc": "Clique para baixar um arquivo .db contendo um backup do seu banco de dados atual para o seu dispositivo.", + "frequency": "Frequência", + "geofileUpdateDialog": "Você realmente deseja atualizar o geofile?", + "geofileUpdateDialogDesc": "Isso atualizará o arquivo #filename#.", + "geofileUpdatePopover": "Geofile atualizado com sucesso", + "geofilesUpdateAll": "Atualizar tudo", + "geofilesUpdateDialogDesc": "Isso atualizará todos os arquivos.", + "getConfigError": "Ocorreu um erro ao recuperar o arquivo de configuração", + "getDatabaseError": "Ocorreu um erro ao recuperar o banco de dados", + "importDatabase": "Restaurar", + "importDatabaseDesc": "Clique para selecionar e enviar um arquivo .db do seu dispositivo para restaurar seu banco de dados a partir de um backup.", + "importDatabaseError": "Ocorreu um erro ao importar o banco de dados", + "importDatabaseSuccess": "O banco de dados foi importado com sucesso", + "ipAddresses": "Endereços IP", + "latestPanelVersion": "Última versão do painel", + "logicalProcessors": "Processadores lógicos", + "logs": "Logs", + "memory": "RAM", + "operationHours": "Tempo de Atividade", + "overallSpeed": "Velocidade geral", + "panelUpToDate": "O painel está atualizado", + "panelUpdateCheckPopover": "Falha na verificação de atualização do painel", + "panelUpdateDesc": "Isso atualizará o 3X-UI para a versão mais recente e reiniciará o serviço do painel.", + "panelUpdateDialog": "Deseja realmente atualizar o painel?", + "panelUpdateDialogDesc": "Isso atualizará o 3X-UI para #version# e reiniciará o serviço do painel.", + "panelUpdateStartedPopover": "Atualização do painel iniciada", + "readDatabaseError": "Ocorreu um erro ao ler o banco de dados", + "received": "Recebido", + "restartXray": "Reiniciar", + "sent": "Enviado", + "stopXray": "Parar", + "storage": "Armazenamento", + "swap": "Swap", + "systemHistoryTitle": "Histórico do Sistema", + "systemLoad": "Carga do Sistema", + "systemLoadDesc": "Média de carga do sistema nos últimos 1, 5 e 15 minutos", + "threads": "Threads", + "title": "Visão Geral", + "toggleIpVisibility": "Alternar visibilidade do IP", + "totalData": "Dados totais", + "trendLast2Min": "Últimos 2 minutos", + "upToDate": "Atualizado", + "updatePanel": "Atualizar painel", + "upload": "Upload", + "xrayErrorPopoverTitle": "Ocorreu um erro ao executar o Xray", + "xrayMetricsDisabled": "Endpoint de métricas do Xray não configurado", + "xrayMetricsHint": "Adicione um bloco metrics de nível superior à configuração do xray com tag metrics_out e listen 127.0.0.1:11111, depois reinicie o xray.", + "xrayMetricsTitle": "Métricas do Xray", + "xrayObservatoryAlive": "Ativo", + "xrayObservatoryDead": "Inativo", + "xrayObservatoryEmpty": "Ainda não há dados do Observatory", + "xrayObservatoryHint": "Adicione um bloco observatory à configuração do xray listando as tags de outbound a sondar, depois reinicie o xray.", + "xrayObservatoryLastSeen": "Visto pela última vez", + "xrayObservatoryLastTry": "Última tentativa", + "xrayObservatoryTagPlaceholder": "Selecionar outbound", + "xrayStatus": "Xray", + "xrayStatusError": "Erro", + "xrayStatusRunning": "Em execução", + "xrayStatusStop": "Parado", + "xrayStatusUnknown": "Desconhecido", + "xraySwitch": "Versão", + "xraySwitchClick": "Escolha a versão para a qual deseja alternar.", + "xraySwitchClickDesk": "Escolha com cuidado, pois versões mais antigas podem não ser compatíveis com as configurações atuais.", + "xraySwitchVersionDialog": "Você realmente deseja alterar a versão do Xray?", + "xraySwitchVersionDialogDesc": "Isso mudará a versão do Xray para #version#.", + "xraySwitchVersionPopover": "Xray atualizado com sucesso", + "xrayUpdates": "Atualizações do Xray" + }, + "login": { + "hello": "Olá", + "loginAgain": "Sua sessão expirou, faça login novamente", + "title": "Bem-vindo", + "toasts": { + "emptyPassword": "Senha é obrigatória", + "emptyUsername": "Nome de usuário é obrigatório", + "invalidFormData": "O formato dos dados de entrada é inválido.", + "successLogin": "Você entrou na sua conta com sucesso.", + "wrongUsernameOrPassword": "Nome de usuário, senha ou código de dois fatores inválido." + } }, "nodes": { - "title": "Nós", + "actions": "Ações", "addNode": "Adicionar nó", - "editNode": "Editar nó", - "totalNodes": "Total de nós", - "onlineNodes": "Online", - "offlineNodes": "Offline", + "address": "Endereço", + "addressPlaceholder": "panel.example.com ou 1.2.3.4", + "apiToken": "Token da API", + "apiTokenHint": "O painel remoto exibe o token da API em Configurações → Token da API.", + "apiTokenPlaceholder": "Token da página de Configurações do painel remoto", "avgLatency": "Latência média", + "basePath": "Caminho base", + "connectionFailed": "Falha na conexão", + "connectionOk": "Conexão OK ({ms} ms)", + "cpu": "CPU", + "deleteConfirmContent": "Isso interrompe o monitoramento do nó. O painel remoto em si não é afetado.", + "deleteConfirmTitle": "Excluir o nó \"{name}\"?", + "editNode": "Editar nó", + "enable": "Ativado", + "justNow": "agora mesmo", + "lastHeartbeat": "Último heartbeat", + "latency": "Latência", + "mem": "Memória", "name": "Nome", "namePlaceholder": "ex.: de-frankfurt-1", - "addressPlaceholder": "panel.example.com ou 1.2.3.4", - "remark": "Observação", - "scheme": "Esquema", - "address": "Endereço", + "never": "nunca", + "offlineNodes": "Offline", + "onlineNodes": "Online", "port": "Porta", - "basePath": "Caminho base", - "apiToken": "Token da API", - "apiTokenPlaceholder": "Token da página de Configurações do painel remoto", - "apiTokenHint": "O painel remoto exibe o token da API em Configurações → Token da API.", + "probe": "Sondar agora", "regenerate": "Regenerar token", "regenerateConfirm": "Regenerar invalida o token atual. Qualquer painel central que o utilize perderá acesso até ser atualizado. Continuar?", - "enable": "Ativado", + "remark": "Observação", + "scheme": "Esquema", "status": "Status", - "cpu": "CPU", - "mem": "Memória", - "uptime": "Tempo ativo", - "latency": "Latência", - "lastHeartbeat": "Último heartbeat", - "xrayVersion": "Versão do Xray", - "actions": "Ações", - "probe": "Sondar agora", - "testConnection": "Testar conexão", - "connectionOk": "Conexão OK ({ms} ms)", - "connectionFailed": "Falha na conexão", - "never": "nunca", - "justNow": "agora mesmo", - "deleteConfirmTitle": "Excluir o nó \"{name}\"?", - "deleteConfirmContent": "Isso interrompe o monitoramento do nó. O painel remoto em si não é afetado.", "statusValues": { - "online": "Online", "offline": "Offline", + "online": "Online", "unknown": "Desconhecido" }, + "testConnection": "Testar conexão", + "title": "Nós", "toasts": { - "list": "Falha ao carregar os nós", - "obtain": "Falha ao carregar o nó", "add": "Adicionar nó", - "update": "Atualizar nó", "delete": "Excluir nó", "deleted": "Nó excluído", - "test": "Testar conexão", "fillRequired": "Nome, endereço, porta e token da API são obrigatórios", - "probeFailed": "Falha na sondagem" - } + "list": "Falha ao carregar os nós", + "obtain": "Falha ao carregar o nó", + "probeFailed": "Falha na sondagem", + "test": "Testar conexão", + "update": "Atualizar nó" + }, + "totalNodes": "Total de nós", + "uptime": "Tempo ativo", + "xrayVersion": "Versão do Xray" }, "settings": { - "title": "Configurações do Painel", - "save": "Salvar", - "infoDesc": "Toda alteração feita aqui precisa ser salva. Reinicie o painel para aplicar as alterações.", - "restartPanel": "Reiniciar Painel", - "restartPanelDesc": "Tem certeza de que deseja reiniciar o painel? Se não conseguir acessar o painel após reiniciar, consulte os logs do painel no servidor.", - "restartPanelSuccess": "O painel foi reiniciado com sucesso", - "actions": "Ações", - "resetDefaultConfig": "Redefinir para Padrão", - "panelSettings": "Geral", - "securitySettings": "Autenticação", "TGBotSettings": "Bot do Telegram", - "panelListeningIP": "IP de Escuta", - "panelListeningIPDesc": "O endereço IP para o painel web. (deixe em branco para escutar em todos os IPs)", - "panelListeningDomain": "Domínio de Escuta", - "panelListeningDomainDesc": "O nome de domínio para o painel web. (deixe em branco para escutar em todos os domínios e IPs)", - "panelPort": "Porta de Escuta", - "panelPortDesc": "O número da porta para o painel web. (deve ser uma porta não usada)", - "publicKeyPath": "Caminho da Chave Pública", - "publicKeyPathDesc": "O caminho do arquivo de chave pública para o painel web. (começa com ‘/‘)", - "privateKeyPath": "Caminho da Chave Privada", - "privateKeyPathDesc": "O caminho do arquivo de chave privada para o painel web. (começa com ‘/‘)", - "panelUrlPath": "Caminho URI", - "panelUrlPathDesc": "O caminho URI para o painel web. (começa com ‘/‘ e termina com ‘/‘)", - "pageSize": "Tamanho da Paginação", - "pageSizeDesc": "Definir o tamanho da página para a tabela de entradas. (0 = desativado)", - "remarkModel": "Modelo de Observação & Caractere de Separação", - "datepicker": "Tipo de Calendário", - "datepickerPlaceholder": "Selecionar data", - "datepickerDescription": "Tarefas agendadas serão executadas com base neste calendário.", - "sampleRemark": "Exemplo de Observação", - "oldUsername": "Nome de Usuário Atual", + "actions": "Ações", + "certs": "Certificados", "currentPassword": "Senha Atual", - "newUsername": "Novo Nome de Usuário", - "newPassword": "Nova Senha", - "telegramBotEnable": "Ativar Bot do Telegram", - "telegramBotEnableDesc": "Ativa o bot do Telegram.", - "telegramToken": "Token do Telegram", - "telegramTokenDesc": "O token do bot do Telegram obtido de '{'@'}BotFather'.", - "telegramProxy": "Proxy SOCKS", - "telegramProxyDesc": "Ativa o proxy SOCKS5 para conectar ao Telegram. (ajuste as configurações conforme o guia)", - "telegramAPIServer": "API Server do Telegram", - "telegramAPIServerDesc": "O servidor API do Telegram a ser usado. Deixe em branco para usar o servidor padrão.", - "telegramChatId": "ID de Chat do Administrador", - "telegramChatIdDesc": "O(s) ID(s) de Chat do Administrador no Telegram. (separado por vírgulas)(obtenha aqui {'@'}userinfobot) ou (use o comando '/id' no bot)", - "telegramNotifyTime": "Hora da Notificação", - "telegramNotifyTimeDesc": "O horário de notificação do bot do Telegram configurado para relatórios periódicos. (use o formato de tempo do crontab)", - "tgNotifyBackup": "Backup do Banco de Dados", - "tgNotifyBackupDesc": "Enviar arquivo de backup do banco de dados junto com o relatório.", - "tgNotifyLogin": "Notificação de Login", - "tgNotifyLoginDesc": "Receba notificações sobre o nome de usuário, endereço IP e horário sempre que alguém tentar fazer login no seu painel web.", - "sessionMaxAge": "Duração da Sessão", - "sessionMaxAgeDesc": "A duração pela qual você pode permanecer logado. (unidade: minuto)", + "dateAndTime": "Data e Hora", + "datepicker": "Tipo de Calendário", + "datepickerDescription": "Tarefas agendadas serão executadas com base neste calendário.", + "datepickerPlaceholder": "Selecionar data", + "direct": "Conexão Direta", + "directDesc": "Estabelece conexões diretamente com domínios ou intervalos de IP de um país específico.", "expireTimeDiff": "Notificação de Expiração", "expireTimeDiffDesc": "Receba notificações sobre a data de expiração ao atingir esse limite. (unidade: dia)", - "trafficDiff": "Notificação de Limite de Tráfego", - "trafficDiffDesc": "Receba notificações sobre o limite de tráfego ao atingir esse limite. (unidade: GB)", - "tgNotifyCpu": "Notificação de Carga da CPU", - "tgNotifyCpuDesc": "Receba notificações se a carga da CPU ultrapassar esse limite. (unidade: %)", - "timeZone": "Fuso Horário", - "timeZoneDesc": "As tarefas agendadas serão executadas com base nesse fuso horário.", - "subSettings": "Assinatura", - "subEnable": "Ativar Serviço de Assinatura", - "subEnableDesc": "Ativa o serviço de assinatura.", - "subJsonEnable": "Ativar/Desativar o endpoint de assinatura JSON de forma independente.", - "subTitle": "Título da Assinatura", - "subTitleDesc": "Título exibido no cliente VPN", - "subSupportUrl": "URL de Suporte", - "subSupportUrlDesc": "Link de suporte técnico exibido no cliente VPN", - "subProfileUrl": "URL de Perfil", - "subProfileUrlDesc": "Um link para o seu site exibido no cliente VPN", - "subAnnounce": "Anúncio", - "subAnnounceDesc": "O texto do anúncio exibido no cliente VPN", - "subEnableRouting": "Ativar roteamento", - "subEnableRoutingDesc": "Configuração global para habilitar o roteamento no cliente VPN. (Apenas para Happ)", - "subRoutingRules": "Regras de roteamento", - "subRoutingRulesDesc": "Regras de roteamento globais para o cliente VPN. (Apenas para Happ)", - "subListen": "IP de Escuta", - "subListenDesc": "O endereço IP para o serviço de assinatura. (deixe em branco para escutar em todos os IPs)", - "subPort": "Porta de Escuta", - "subPortDesc": "O número da porta para o serviço de assinatura. (deve ser uma porta não usada)", - "subCertPath": "Caminho da Chave Pública", - "subCertPathDesc": "O caminho do arquivo de chave pública para o serviço de assinatura. (começa com ‘/‘)", - "subKeyPath": "Caminho da Chave Privada", - "subKeyPathDesc": "O caminho do arquivo de chave privada para o serviço de assinatura. (começa com ‘/‘)", - "subPath": "Caminho URI", - "subPathDesc": "O caminho URI para o serviço de assinatura. (começa com ‘/‘ e termina com ‘/‘)", - "subDomain": "Domínio de Escuta", - "subDomainDesc": "O nome de domínio para o serviço de assinatura. (deixe em branco para escutar em todos os domínios e IPs)", - "subUpdates": "Intervalos de Atualização", - "subUpdatesDesc": "Os intervalos de atualização da URL de assinatura nos aplicativos de cliente. (unidade: hora)", - "subEncrypt": "Codificar", - "subEncryptDesc": "O conteúdo retornado pelo serviço de assinatura será codificado em Base64.", - "subShowInfo": "Mostrar Informações de Uso", - "subShowInfoDesc": "O tráfego restante e a data serão exibidos nos aplicativos de cliente.", - "subURI": "URI de Proxy Reverso", - "subURIDesc": "O caminho URI da URL de assinatura para uso por trás de proxies.", + "externalTraffic": "Tráfego Externo", "externalTrafficInformEnable": "Informações de tráfego externo", "externalTrafficInformEnableDesc": "Informar a API externa sobre cada atualização de tráfego.", "externalTrafficInformURI": "URI de informação de tráfego externo", "externalTrafficInformURIDesc": "As atualizações de tráfego são enviadas para este URI.", - "restartXrayOnClientDisable": "Reiniciar Xray Após Desativação Automática", - "restartXrayOnClientDisableDesc": "Quando um cliente for desativado automaticamente por expiração ou limite de tráfego, reinicie o Xray.", "fragment": "Fragmentação", "fragmentDesc": "Ativa a fragmentação para o pacote TLS hello.", "fragmentSett": "Configurações de Fragmentação", - "noisesDesc": "Ativar Noises.", - "noisesSett": "Configurações de Noises", + "infoDesc": "Toda alteração feita aqui precisa ser salva. Reinicie o painel para aplicar as alterações.", + "information": "Informação", + "intervals": "Intervalos", + "language": "Idioma", "mux": "Mux", "muxDesc": "Transmitir múltiplos fluxos de dados independentes dentro de um fluxo de dados estabelecido.", "muxSett": "Configurações de Mux", - "direct": "Conexão Direta", - "directDesc": "Estabelece conexões diretamente com domínios ou intervalos de IP de um país específico.", + "newPassword": "Nova Senha", + "newUsername": "Novo Nome de Usuário", + "noisesDesc": "Ativar Noises.", + "noisesSett": "Configurações de Noises", "notifications": "Notificações", - "certs": "Certificados", - "externalTraffic": "Tráfego Externo", - "dateAndTime": "Data e Hora", + "oldUsername": "Nome de Usuário Atual", + "pageSize": "Tamanho da Paginação", + "pageSizeDesc": "Definir o tamanho da página para a tabela de entradas. (0 = desativado)", + "panelListeningDomain": "Domínio de Escuta", + "panelListeningDomainDesc": "O nome de domínio para o painel web. (deixe em branco para escutar em todos os domínios e IPs)", + "panelListeningIP": "IP de Escuta", + "panelListeningIPDesc": "O endereço IP para o painel web. (deixe em branco para escutar em todos os IPs)", + "panelPort": "Porta de Escuta", + "panelPortDesc": "O número da porta para o painel web. (deve ser uma porta não usada)", + "panelSettings": "Geral", + "panelUrlPath": "Caminho URI", + "panelUrlPathDesc": "O caminho URI para o painel web. (começa com ‘/‘ e termina com ‘/‘)", + "privateKeyPath": "Caminho da Chave Privada", + "privateKeyPathDesc": "O caminho do arquivo de chave privada para o painel web. (começa com ‘/‘)", "proxyAndServer": "Proxy e Servidor", - "intervals": "Intervalos", - "information": "Informação", - "language": "Idioma", - "telegramBotLanguage": "Idioma do Bot do Telegram", + "publicKeyPath": "Caminho da Chave Pública", + "publicKeyPathDesc": "O caminho do arquivo de chave pública para o painel web. (começa com ‘/‘)", + "remarkModel": "Modelo de Observação \u0026 Caractere de Separação", + "resetDefaultConfig": "Redefinir para Padrão", + "restartPanel": "Reiniciar Painel", + "restartPanelDesc": "Tem certeza de que deseja reiniciar o painel? Se não conseguir acessar o painel após reiniciar, consulte os logs do painel no servidor.", + "restartPanelSuccess": "O painel foi reiniciado com sucesso", + "restartXrayOnClientDisable": "Reiniciar Xray Após Desativação Automática", + "restartXrayOnClientDisableDesc": "Quando um cliente for desativado automaticamente por expiração ou limite de tráfego, reinicie o Xray.", + "sampleRemark": "Exemplo de Observação", + "save": "Salvar", "security": { "admin": "Credenciais de administrador", "twoFactor": "Autenticação de dois fatores", "twoFactorEnable": "Ativar 2FA", "twoFactorEnableDesc": "Adiciona uma camada extra de autenticação para mais segurança.", - "twoFactorModalSetTitle": "Ativar autenticação de dois fatores", - "twoFactorModalDeleteTitle": "Desativar autenticação de dois fatores", - "twoFactorModalSteps": "Para configurar a autenticação de dois fatores, siga alguns passos:", - "twoFactorModalFirstStep": "1. Escaneie este QR code no aplicativo de autenticação ou copie o token próximo ao QR code e cole no aplicativo", - "twoFactorModalSecondStep": "2. Digite o código do aplicativo", - "twoFactorModalRemoveStep": "Digite o código do aplicativo para remover a autenticação de dois fatores.", - "twoFactorModalChangeCredentialsTitle": "Alterar credenciais", "twoFactorModalChangeCredentialsStep": "Insira o código do aplicativo para alterar as credenciais do administrador.", - "twoFactorModalSetSuccess": "A autenticação de dois fatores foi estabelecida com sucesso", + "twoFactorModalChangeCredentialsTitle": "Alterar credenciais", "twoFactorModalDeleteSuccess": "A autenticação de dois fatores foi excluída com sucesso", - "twoFactorModalError": "Código incorreto" + "twoFactorModalDeleteTitle": "Desativar autenticação de dois fatores", + "twoFactorModalError": "Código incorreto", + "twoFactorModalFirstStep": "1. Escaneie este QR code no aplicativo de autenticação ou copie o token próximo ao QR code e cole no aplicativo", + "twoFactorModalRemoveStep": "Digite o código do aplicativo para remover a autenticação de dois fatores.", + "twoFactorModalSecondStep": "2. Digite o código do aplicativo", + "twoFactorModalSetSuccess": "A autenticação de dois fatores foi estabelecida com sucesso", + "twoFactorModalSetTitle": "Ativar autenticação de dois fatores", + "twoFactorModalSteps": "Para configurar a autenticação de dois fatores, siga alguns passos:" }, + "securitySettings": "Autenticação", + "sessionMaxAge": "Duração da Sessão", + "sessionMaxAgeDesc": "A duração pela qual você pode permanecer logado. (unidade: minuto)", + "subAnnounce": "Anúncio", + "subAnnounceDesc": "O texto do anúncio exibido no cliente VPN", + "subCertPath": "Caminho da Chave Pública", + "subCertPathDesc": "O caminho do arquivo de chave pública para o serviço de assinatura. (começa com ‘/‘)", + "subDomain": "Domínio de Escuta", + "subDomainDesc": "O nome de domínio para o serviço de assinatura. (deixe em branco para escutar em todos os domínios e IPs)", + "subEnable": "Ativar Serviço de Assinatura", + "subEnableDesc": "Ativa o serviço de assinatura.", + "subEnableRouting": "Ativar roteamento", + "subEnableRoutingDesc": "Configuração global para habilitar o roteamento no cliente VPN. (Apenas para Happ)", + "subEncrypt": "Codificar", + "subEncryptDesc": "O conteúdo retornado pelo serviço de assinatura será codificado em Base64.", + "subJsonEnable": "Ativar/Desativar o endpoint de assinatura JSON de forma independente.", + "subKeyPath": "Caminho da Chave Privada", + "subKeyPathDesc": "O caminho do arquivo de chave privada para o serviço de assinatura. (começa com ‘/‘)", + "subListen": "IP de Escuta", + "subListenDesc": "O endereço IP para o serviço de assinatura. (deixe em branco para escutar em todos os IPs)", + "subPath": "Caminho URI", + "subPathDesc": "O caminho URI para o serviço de assinatura. (começa com ‘/‘ e termina com ‘/‘)", + "subPort": "Porta de Escuta", + "subPortDesc": "O número da porta para o serviço de assinatura. (deve ser uma porta não usada)", + "subProfileUrl": "URL de Perfil", + "subProfileUrlDesc": "Um link para o seu site exibido no cliente VPN", + "subRoutingRules": "Regras de roteamento", + "subRoutingRulesDesc": "Regras de roteamento globais para o cliente VPN. (Apenas para Happ)", + "subSettings": "Assinatura", + "subShowInfo": "Mostrar Informações de Uso", + "subShowInfoDesc": "O tráfego restante e a data serão exibidos nos aplicativos de cliente.", + "subSupportUrl": "URL de Suporte", + "subSupportUrlDesc": "Link de suporte técnico exibido no cliente VPN", + "subTitle": "Título da Assinatura", + "subTitleDesc": "Título exibido no cliente VPN", + "subURI": "URI de Proxy Reverso", + "subURIDesc": "O caminho URI da URL de assinatura para uso por trás de proxies.", + "subUpdates": "Intervalos de Atualização", + "subUpdatesDesc": "Os intervalos de atualização da URL de assinatura nos aplicativos de cliente. (unidade: hora)", + "telegramAPIServer": "API Server do Telegram", + "telegramAPIServerDesc": "O servidor API do Telegram a ser usado. Deixe em branco para usar o servidor padrão.", + "telegramBotEnable": "Ativar Bot do Telegram", + "telegramBotEnableDesc": "Ativa o bot do Telegram.", + "telegramBotLanguage": "Idioma do Bot do Telegram", + "telegramChatId": "ID de Chat do Administrador", + "telegramChatIdDesc": "O(s) ID(s) de Chat do Administrador no Telegram. (separado por vírgulas)(obtenha aqui {'@'}userinfobot) ou (use o comando '/id' no bot)", + "telegramNotifyTime": "Hora da Notificação", + "telegramNotifyTimeDesc": "O horário de notificação do bot do Telegram configurado para relatórios periódicos. (use o formato de tempo do crontab)", + "telegramProxy": "Proxy SOCKS", + "telegramProxyDesc": "Ativa o proxy SOCKS5 para conectar ao Telegram. (ajuste as configurações conforme o guia)", + "telegramToken": "Token do Telegram", + "telegramTokenDesc": "O token do bot do Telegram obtido de '{'@'}BotFather'.", + "tgNotifyBackup": "Backup do Banco de Dados", + "tgNotifyBackupDesc": "Enviar arquivo de backup do banco de dados junto com o relatório.", + "tgNotifyCpu": "Notificação de Carga da CPU", + "tgNotifyCpuDesc": "Receba notificações se a carga da CPU ultrapassar esse limite. (unidade: %)", + "tgNotifyLogin": "Notificação de Login", + "tgNotifyLoginDesc": "Receba notificações sobre o nome de usuário, endereço IP e horário sempre que alguém tentar fazer login no seu painel web.", + "timeZone": "Fuso Horário", + "timeZoneDesc": "As tarefas agendadas serão executadas com base nesse fuso horário.", + "title": "Configurações do Painel", "toasts": { - "modifySettings": "Os parâmetros foram alterados.", - "getSettings": "Ocorreu um erro ao recuperar os parâmetros.", - "modifyUserError": "Ocorreu um erro ao alterar as credenciais do administrador.", - "modifyUser": "Você alterou com sucesso as credenciais do administrador.", - "originalUserPassIncorrect": "O nome de usuário ou senha atual é inválido", - "userPassMustBeNotEmpty": "O novo nome de usuário e senha não podem estar vazios", "getOutboundTrafficError": "Erro ao obter tráfego de saída", - "resetOutboundTrafficError": "Erro ao redefinir tráfego de saída" - } + "getSettings": "Ocorreu um erro ao recuperar os parâmetros.", + "modifySettings": "Os parâmetros foram alterados.", + "modifyUser": "Você alterou com sucesso as credenciais do administrador.", + "modifyUserError": "Ocorreu um erro ao alterar as credenciais do administrador.", + "originalUserPassIncorrect": "O nome de usuário ou senha atual é inválido", + "resetOutboundTrafficError": "Erro ao redefinir tráfego de saída", + "userPassMustBeNotEmpty": "O novo nome de usuário e senha não podem estar vazios" + }, + "trafficDiff": "Notificação de Limite de Tráfego", + "trafficDiffDesc": "Receba notificações sobre o limite de tráfego ao atingir esse limite. (unidade: GB)" }, "xray": { - "title": "Configurações Xray", - "save": "Salvar", - "restart": "Reiniciar Xray", - "restartSuccess": "Xray foi reiniciado com sucesso", - "stopSuccess": "Xray foi interrompido com sucesso", - "restartError": "Ocorreu um erro ao reiniciar o Xray.", - "stopError": "Ocorreu um erro ao parar o Xray.", - "basicTemplate": "Básico", - "advancedTemplate": "Avançado", - "generalConfigs": "Geral", - "generalConfigsDesc": "Essas opções determinam ajustes gerais.", - "logConfigs": "Log", - "logConfigsDesc": "Os logs podem afetar a eficiência do servidor. É recomendável habilitá-los com sabedoria apenas se necessário.", - "blockConfigsDesc": "Essas opções bloqueiam tráfego com base em protocolos e sites específicos solicitados.", - "basicRouting": "Roteamento Básico", - "blockConnectionsConfigsDesc": "Essas opções bloquearão o tráfego com base no país solicitado.", - "directConnectionsConfigsDesc": "Uma conexão direta garante que o tráfego específico não seja roteado por outro servidor.", - "blockips": "Bloquear IPs", - "blockdomains": "Bloquear Domínios", - "directips": "IPs Diretos", - "directdomains": "Domínios Diretos", - "ipv4Routing": "Roteamento IPv4", - "ipv4RoutingDesc": "Essas opções roteam o tráfego para um destino específico via IPv4.", - "warpRouting": "Roteamento WARP", - "warpRoutingDesc": "Essas opções roteam o tráfego para um destino específico via WARP.", - "nordRouting": "Roteamento NordVPN", - "nordRoutingDesc": "Essas opções roteiam o tráfego para um destino específico via NordVPN.", - "Template": "Modelo de Configuração Avançada do Xray", - "TemplateDesc": "O arquivo final de configuração do Xray será gerado com base neste modelo.", + "Balancers": "Balanceadores", "FreedomStrategy": "Estratégia do Protocolo Freedom", "FreedomStrategyDesc": "Definir a estratégia de saída para a rede no Protocolo Freedom.", - "RoutingStrategy": "Estratégia Geral de Roteamento", - "RoutingStrategyDesc": "Definir a estratégia geral de roteamento de tráfego para resolver todas as solicitações.", - "outboundTestUrl": "URL de teste de outbound", - "outboundTestUrlDesc": "URL usada ao testar conectividade do outbound", - "Torrent": "Bloquear Protocolo BitTorrent", "Inbounds": "Inbounds", "InboundsDesc": "Aceitar clientes específicos.", "Outbounds": "Outbounds", - "Balancers": "Balanceadores", "OutboundsDesc": "Definir o caminho de saída do tráfego.", + "RoutingStrategy": "Estratégia Geral de Roteamento", + "RoutingStrategyDesc": "Definir a estratégia geral de roteamento de tráfego para resolver todas as solicitações.", "Routings": "Regras de Roteamento", "RoutingsDesc": "A prioridade de cada regra é importante!", - "completeTemplate": "Todos", - "logLevel": "Nível de Log", - "logLevelDesc": "O nível de log para erros, indicando a informação que precisa ser registrada.", + "Template": "Modelo de Configuração Avançada do Xray", + "TemplateDesc": "O arquivo final de configuração do Xray será gerado com base neste modelo.", + "Torrent": "Bloquear Protocolo BitTorrent", "accessLog": "Log de Acesso", "accessLogDesc": "O caminho do arquivo para o log de acesso. O valor especial 'none' desativa os logs de acesso.", - "errorLog": "Log de Erros", - "errorLogDesc": "O caminho do arquivo para o log de erros. O valor especial 'none' desativa os logs de erro.", - "dnsLog": "Log DNS", - "dnsLogDesc": "Se ativar logs de consulta DNS", - "maskAddress": "Mascarar Endereço", - "maskAddressDesc": "Máscara de endereço IP, quando ativado, substitui automaticamente o endereço IP que aparece no log.", - "statistics": "Estatísticas", - "statsInboundUplink": "Estatísticas de Upload de Entrada", - "statsInboundUplinkDesc": "Habilita a coleta de estatísticas para o tráfego de upload de todos os proxies de entrada.", - "statsInboundDownlink": "Estatísticas de Download de Entrada", - "statsInboundDownlinkDesc": "Habilita a coleta de estatísticas para o tráfego de download de todos os proxies de entrada.", - "statsOutboundUplink": "Estatísticas de Upload de Saída", - "statsOutboundUplinkDesc": "Habilita a coleta de estatísticas para o tráfego de upload de todos os proxies de saída.", - "statsOutboundDownlink": "Estatísticas de Download de Saída", - "statsOutboundDownlinkDesc": "Habilita a coleta de estatísticas para o tráfego de download de todos os proxies de saída.", - "rules": { - "first": "Primeiro", - "last": "Último", - "up": "Cima", - "down": "Baixo", - "source": "Fonte", - "dest": "Destino", - "inbound": "Entrada", - "outbound": "Saída", - "balancer": "Balanceador", - "info": "Info", - "add": "Adicionar Regra", - "edit": "Editar Regra", - "useComma": "Itens separados por vírgula" - }, - "outbound": { - "addOutbound": "Adicionar Saída", - "addReverse": "Adicionar Reverso", - "editOutbound": "Editar Saída", - "editReverse": "Editar Reverso", - "reverseTag": "Tag de Reverso", - "reverseTagDesc": "Tag de saída do proxy reverso simples VLESS. Deixe vazio para desabilitar.", - "reverseTagPlaceholder": "tag de saída (vazio para desabilitar)", - "tag": "Tag", - "tagDesc": "Tag Única", - "address": "Endereço", - "reverse": "Reverso", - "domain": "Domínio", - "type": "Tipo", - "bridge": "Ponte", - "portal": "Portal", - "link": "Link", - "intercon": "Interconexão", - "settings": "Configurações", - "accountInfo": "Informações da Conta", - "outboundStatus": "Status de Saída", - "sendThrough": "Enviar Através de", - "test": "Testar", - "testResult": "Resultado do teste", - "testing": "Testando conexão...", - "testSuccess": "Teste bem-sucedido", - "testFailed": "Teste falhou", - "testError": "Falha ao testar saída", - "nordvpn": "NordVPN", - "accessToken": "Token de Acesso", - "country": "País", - "server": "Servidor", - "city": "Cidade", - "allCities": "Todas as Cidades", - "privateKey": "Chave Privada", - "load": "Carga" - }, + "advancedTemplate": "Avançado", "balancer": { "addBalancer": "Adicionar Balanceador", - "editBalancer": "Editar Balanceador", - "balancerStrategy": "Estratégia", + "balancerDesc": "Não é possível usar balancerTag e outboundTag ao mesmo tempo. Se usados simultaneamente, apenas outboundTag funcionará.", "balancerSelectors": "Seletores", + "balancerStrategy": "Estratégia", + "editBalancer": "Editar Balanceador", "tag": "Tag", - "tagDesc": "Tag Única", - "balancerDesc": "Não é possível usar balancerTag e outboundTag ao mesmo tempo. Se usados simultaneamente, apenas outboundTag funcionará." - }, - "wireguard": { - "secretKey": "Chave Secreta", - "publicKey": "Chave Pública", - "allowedIPs": "IPs Permitidos", - "endpoint": "Ponto Final", - "psk": "Chave Pré-Compartilhada", - "domainStrategy": "Estratégia de Domínio" - }, - "tun": { - "nameDesc": "O nome da interface TUN. O padrão é 'xray0'", - "mtuDesc": "Unidade Máxima de Transmissão. O tamanho máximo dos pacotes de dados. O padrão é 1500", - "userLevel": "Nível do Usuário", - "userLevelDesc": "Todas as conexões feitas através deste inbound usarão este nível de usuário. O padrão é 0" + "tagDesc": "Tag Única" }, + "basicRouting": "Roteamento Básico", + "basicTemplate": "Básico", + "blockConfigsDesc": "Essas opções bloqueiam tráfego com base em protocolos e sites específicos solicitados.", + "blockConnectionsConfigsDesc": "Essas opções bloquearão o tráfego com base no país solicitado.", + "blockdomains": "Bloquear Domínios", + "blockips": "Bloquear IPs", + "completeTemplate": "Todos", + "directConnectionsConfigsDesc": "Uma conexão direta garante que o tráfego específico não seja roteado por outro servidor.", + "directdomains": "Domínios Diretos", + "directips": "IPs Diretos", "dns": { - "enable": "Ativar DNS", - "enableDesc": "Ativar o servidor DNS integrado", - "tag": "Tag de Entrada DNS", - "tagDesc": "Esta tag estará disponível como uma tag de Entrada nas regras de roteamento.", + "add": "Adicionar Servidor", + "clearAll": "Remover Todos", + "clearAllConfirm": "Isso remove todos os servidores DNS da lista. Não pode ser desfeito.", + "clearAllTitle": "Remover todos os servidores DNS?", "clientIp": "IP do Cliente", "clientIpDesc": "Usado para notificar o servidor sobre a localização IP especificada durante consultas DNS", "disableCache": "Desativar cache", @@ -753,217 +607,371 @@ "disableFallbackDesc": "Desativa consultas DNS de fallback", "disableFallbackIfMatch": "Desativar Fallback Se Corresponder", "disableFallbackIfMatchDesc": "Desativa consultas DNS de fallback quando a lista de domínios correspondentes do servidor DNS é atingida", + "dnsPresetFamily": "Familiar", + "dnsPresetTitle": "Modelos DNS", + "domains": "Domínios", + "edit": "Editar Servidor", + "enable": "Ativar DNS", + "enableDesc": "Ativar o servidor DNS integrado", "enableParallelQuery": "Habilitar Consulta Paralela", "enableParallelQueryDesc": "Habilitar consultas DNS paralelas para múltiplos servidores para resolução mais rápida", - "strategy": "Estratégia de Consulta", - "strategyDesc": "Estratégia geral para resolver nomes de domínio", - "add": "Adicionar Servidor", - "edit": "Editar Servidor", - "domains": "Domínios", "expectIPs": "IPs Esperadas", - "unexpectIPs": "IPs inesperados", - "useSystemHosts": "Usar Hosts do sistema", - "useSystemHostsDesc": "Usar o arquivo hosts de um sistema instalado", - "usePreset": "Usar modelo", - "dnsPresetTitle": "Modelos DNS", - "dnsPresetFamily": "Familiar", - "serveStale": "Servir Expirados", - "serveStaleDesc": "Retornar resultados expirados do cache enquanto atualiza em segundo plano", - "serveExpiredTTL": "TTL de Expirados", - "serveExpiredTTLDesc": "Validade (segundos) das entradas expiradas no cache; 0 = nunca expira", - "timeoutMs": "Tempo limite (ms)", - "skipFallback": "Ignorar Fallback", "finalQuery": "Consulta Final", "hosts": "Hosts", "hostsAdd": "Adicionar Host", - "hostsEmpty": "Nenhum Host definido", "hostsDomain": "Domínio (ex. domain:example.com)", + "hostsEmpty": "Nenhum Host definido", "hostsValues": "IP ou domínio — digite e pressione Enter", - "clearAll": "Remover Todos", - "clearAllTitle": "Remover todos os servidores DNS?", - "clearAllConfirm": "Isso remove todos os servidores DNS da lista. Não pode ser desfeito." + "serveExpiredTTL": "TTL de Expirados", + "serveExpiredTTLDesc": "Validade (segundos) das entradas expiradas no cache; 0 = nunca expira", + "serveStale": "Servir Expirados", + "serveStaleDesc": "Retornar resultados expirados do cache enquanto atualiza em segundo plano", + "skipFallback": "Ignorar Fallback", + "strategy": "Estratégia de Consulta", + "strategyDesc": "Estratégia geral para resolver nomes de domínio", + "tag": "Tag de Entrada DNS", + "tagDesc": "Esta tag estará disponível como uma tag de Entrada nas regras de roteamento.", + "timeoutMs": "Tempo limite (ms)", + "unexpectIPs": "IPs inesperados", + "usePreset": "Usar modelo", + "useSystemHosts": "Usar Hosts do sistema", + "useSystemHostsDesc": "Usar o arquivo hosts de um sistema instalado" }, + "dnsLog": "Log DNS", + "dnsLogDesc": "Se ativar logs de consulta DNS", + "errorLog": "Log de Erros", + "errorLogDesc": "O caminho do arquivo para o log de erros. O valor especial 'none' desativa os logs de erro.", "fakedns": { "add": "Adicionar Fake DNS", "edit": "Editar Fake DNS", "ipPool": "Sub-rede do Pool de IP", "poolSize": "Tamanho do Pool" + }, + "generalConfigs": "Geral", + "generalConfigsDesc": "Essas opções determinam ajustes gerais.", + "ipv4Routing": "Roteamento IPv4", + "ipv4RoutingDesc": "Essas opções roteam o tráfego para um destino específico via IPv4.", + "logConfigs": "Log", + "logConfigsDesc": "Os logs podem afetar a eficiência do servidor. É recomendável habilitá-los com sabedoria apenas se necessário.", + "logLevel": "Nível de Log", + "logLevelDesc": "O nível de log para erros, indicando a informação que precisa ser registrada.", + "maskAddress": "Mascarar Endereço", + "maskAddressDesc": "Máscara de endereço IP, quando ativado, substitui automaticamente o endereço IP que aparece no log.", + "nordRouting": "Roteamento NordVPN", + "nordRoutingDesc": "Essas opções roteiam o tráfego para um destino específico via NordVPN.", + "outbound": { + "accessToken": "Token de Acesso", + "accountInfo": "Informações da Conta", + "addOutbound": "Adicionar Saída", + "addReverse": "Adicionar Reverso", + "address": "Endereço", + "allCities": "Todas as Cidades", + "bridge": "Ponte", + "city": "Cidade", + "country": "País", + "domain": "Domínio", + "editOutbound": "Editar Saída", + "editReverse": "Editar Reverso", + "intercon": "Interconexão", + "link": "Link", + "load": "Carga", + "nordvpn": "NordVPN", + "outboundStatus": "Status de Saída", + "portal": "Portal", + "privateKey": "Chave Privada", + "reverse": "Reverso", + "reverseTag": "Tag de Reverso", + "reverseTagDesc": "Tag de saída do proxy reverso simples VLESS. Deixe vazio para desabilitar.", + "reverseTagPlaceholder": "tag de saída (vazio para desabilitar)", + "sendThrough": "Enviar Através de", + "server": "Servidor", + "settings": "Configurações", + "tag": "Tag", + "tagDesc": "Tag Única", + "test": "Testar", + "testError": "Falha ao testar saída", + "testFailed": "Teste falhou", + "testResult": "Resultado do teste", + "testSuccess": "Teste bem-sucedido", + "testing": "Testando conexão...", + "type": "Tipo" + }, + "outboundTestUrl": "URL de teste de outbound", + "outboundTestUrlDesc": "URL usada ao testar conectividade do outbound", + "restart": "Reiniciar Xray", + "restartError": "Ocorreu um erro ao reiniciar o Xray.", + "restartSuccess": "Xray foi reiniciado com sucesso", + "rules": { + "add": "Adicionar Regra", + "balancer": "Balanceador", + "dest": "Destino", + "down": "Baixo", + "edit": "Editar Regra", + "first": "Primeiro", + "inbound": "Entrada", + "info": "Info", + "last": "Último", + "outbound": "Saída", + "source": "Fonte", + "up": "Cima", + "useComma": "Itens separados por vírgula" + }, + "save": "Salvar", + "statistics": "Estatísticas", + "statsInboundDownlink": "Estatísticas de Download de Entrada", + "statsInboundDownlinkDesc": "Habilita a coleta de estatísticas para o tráfego de download de todos os proxies de entrada.", + "statsInboundUplink": "Estatísticas de Upload de Entrada", + "statsInboundUplinkDesc": "Habilita a coleta de estatísticas para o tráfego de upload de todos os proxies de entrada.", + "statsOutboundDownlink": "Estatísticas de Download de Saída", + "statsOutboundDownlinkDesc": "Habilita a coleta de estatísticas para o tráfego de download de todos os proxies de saída.", + "statsOutboundUplink": "Estatísticas de Upload de Saída", + "statsOutboundUplinkDesc": "Habilita a coleta de estatísticas para o tráfego de upload de todos os proxies de saída.", + "stopError": "Ocorreu um erro ao parar o Xray.", + "stopSuccess": "Xray foi interrompido com sucesso", + "title": "Configurações Xray", + "tun": { + "mtuDesc": "Unidade Máxima de Transmissão. O tamanho máximo dos pacotes de dados. O padrão é 1500", + "nameDesc": "O nome da interface TUN. O padrão é 'xray0'", + "userLevel": "Nível do Usuário", + "userLevelDesc": "Todas as conexões feitas através deste inbound usarão este nível de usuário. O padrão é 0" + }, + "warpRouting": "Roteamento WARP", + "warpRoutingDesc": "Essas opções roteam o tráfego para um destino específico via WARP.", + "wireguard": { + "allowedIPs": "IPs Permitidos", + "domainStrategy": "Estratégia de Domínio", + "endpoint": "Ponto Final", + "psk": "Chave Pré-Compartilhada", + "publicKey": "Chave Pública", + "secretKey": "Chave Secreta" } } }, + "password": "Senha", + "path": "Caminho", + "protocol": "Protocolo", + "qrCode": "Código QR", + "remained": "Restante", + "remark": "Observação", + "reset": "Redefinir", + "save": "Salvar", + "search": "Pesquisar", + "secAlertConf": "Algumas configurações estão vulneráveis a ataques. Recomenda-se reforçar os protocolos de segurança para evitar possíveis violações.", + "secAlertPanelPort": "A porta padrão do painel é vulnerável. Configure uma porta aleatória ou específica.", + "secAlertPanelURI": "O caminho URI padrão do painel não é seguro. Configure um caminho URI complexo.", + "secAlertSSL": "O painel não possui uma conexão segura. Instale o certificado TLS para proteção de dados.", + "secAlertSsl": "Esta conexão não é segura. Evite inserir informações confidenciais até que o TLS seja ativado para proteção de dados.", + "secAlertSubJsonURI": "O caminho URI JSON de inscrição padrão não é seguro. Configure um caminho URI complexo.", + "secAlertSubURI": "O caminho URI padrão de inscrição não é seguro. Configure um caminho URI complexo.", + "secAlertTitle": "Alerta de Segurança", + "second": "Segundo", + "security": "Segurança", + "somethingWentWrong": "Algo deu errado", + "status": "Status", + "subscription": { + "active": "Ativo", + "downloaded": "Baixado", + "expiry": "Validade", + "inactive": "Inativo", + "individualLinks": "Links individuais", + "noExpiry": "Sem validade", + "status": "Status", + "subId": "ID da assinatura", + "title": "Informações da assinatura", + "totalQuota": "Cota total", + "unlimited": "Ilimitado", + "uploaded": "Enviado" + }, + "success": "Com Sucesso", + "sure": "Certo", "tgbot": { - "keyboardClosed": "❌ Teclado fechado!", - "noResult": "❗ Nenhum resultado!", - "noQuery": "❌ Consulta não encontrada! Por favor, use o comando novamente!", - "wentWrong": "❌ Algo deu errado!", - "noIpRecord": "❗ Nenhum registro de IP!", - "noInbounds": "❗ Nenhum inbound encontrado!", - "unlimited": "♾ Ilimitado (Reset)", "add": "Adicionar", - "month": "Mês", - "months": "Meses", - "day": "Dia", - "days": "Dias", - "hours": "Horas", - "minutes": "Minutos", - "unknown": "Desconhecido", - "inbounds": "Inbounds", - "clients": "Clientes", - "offline": "🔴 Offline", - "online": "🟢 Online", - "commands": { - "unknown": "❗ Comando desconhecido.", - "pleaseChoose": "👇 Escolha:\r\n", - "help": "🤖 Bem-vindo a este bot! Ele foi projetado para oferecer dados específicos do painel da web e permite que você faça as modificações necessárias.\r\n\r\n", - "start": "👋 Olá {{ .Firstname }}.\r\n", - "welcome": "🤖 Bem-vindo ao bot de gerenciamento do {{ .Hostname }}.\r\n", - "status": "✅ Bot está OK!", - "usage": "❗ Por favor, forneça um texto para pesquisar!", - "getID": "🆔 Seu ID: {{ .ID }}", - "helpAdminCommands": "Para reiniciar o Xray Core:\r\n/restart\r\n\r\nPara pesquisar por um email de cliente:\r\n/usage [Email]\r\n\r\nPara pesquisar por inbounds (com estatísticas do cliente):\r\n/inbound [Remark]\r\n\r\nTelegram Chat ID:\r\n/id", - "helpClientCommands": "Para pesquisar por estatísticas, use o seguinte comando:\r\n\r\n/usage [Email]\r\n\r\nTelegram Chat ID:\r\n/id", - "restartUsage": "\r\n\r\n/restart", - "restartSuccess": "✅ Operação bem-sucedida!", - "restartFailed": "❗ Erro na operação.\r\n\r\nErro: {{ .Error }}.", - "xrayNotRunning": "❗ Xray Core não está em execução.", - "startDesc": "Mostrar menu principal", - "helpDesc": "Ajuda do bot", - "statusDesc": "Verificar status do bot", - "idDesc": "Mostrar seu ID do Telegram" - }, - "messages": { - "cpuThreshold": "🔴 A carga da CPU {{ .Percent }}% excede o limite de {{ .Threshold }}%", - "selectUserFailed": "❌ Erro na seleção do usuário!", - "userSaved": "✅ Usuário do Telegram salvo.", - "loginSuccess": "✅ Conectado ao painel com sucesso.\r\n", - "loginFailed": "❗️Tentativa de login no painel falhou.\r\n", - "2faFailed": "Falha no 2FA", - "report": "🕰 Relatórios agendados: {{ .RunTime }}\r\n", - "datetime": "⏰ Data&Hora: {{ .DateTime }}\r\n", - "hostname": "💻 Host: {{ .Hostname }}\r\n", - "version": "🚀 Versão 3X-UI: {{ .Version }}\r\n", - "xrayVersion": "📡 Versão Xray: {{ .XrayVersion }}\r\n", - "ipv6": "🌐 IPv6: {{ .IPv6 }}\r\n", - "ipv4": "🌐 IPv4: {{ .IPv4 }}\r\n", - "ip": "🌐 IP: {{ .IP }}\r\n", - "ips": "🔢 IPs:\r\n{{ .IPs }}\r\n", - "serverUpTime": "⏳ Tempo de atividade: {{ .UpTime }} {{ .Unit }}\r\n", - "serverLoad": "📈 Carga do sistema: {{ .Load1 }}, {{ .Load2 }}, {{ .Load3 }}\r\n", - "serverMemory": "📋 RAM: {{ .Current }}/{{ .Total }}\r\n", - "tcpCount": "🔹 TCP: {{ .Count }}\r\n", - "udpCount": "🔸 UDP: {{ .Count }}\r\n", - "traffic": "🚦 Tráfego: {{ .Total }} (↑{{ .Upload }},↓{{ .Download }})\r\n", - "xrayStatus": "ℹ️ Status: {{ .State }}\r\n", - "username": "👤 Nome de usuário: {{ .Username }}\r\n", - "reason": "❗️ Motivo: {{ .Reason }}\r\n", - "time": "⏰ Hora: {{ .Time }}\r\n", - "inbound": "📍 Inbound: {{ .Remark }}\r\n", - "port": "🔌 Porta: {{ .Port }}\r\n", - "expire": "📅 Data de expiração: {{ .Time }}\r\n", - "expireIn": "📅 Expira em: {{ .Time }}\r\n", - "active": "💡 Ativo: {{ .Enable }}\r\n", - "enabled": "🚨 Ativado: {{ .Enable }}\r\n", - "online": "🌐 Status da conexão: {{ .Status }}\r\n", - "lastOnline": "🔙 Última vez online: {{ .Time }}\r\n", - "email": "📧 Email: {{ .Email }}\r\n", - "upload": "🔼 Upload: ↑{{ .Upload }}\r\n", - "download": "🔽 Download: ↓{{ .Download }}\r\n", - "total": "📊 Total: ↑↓{{ .UpDown }} / {{ .Total }}\r\n", - "TGUser": "👤 Usuário do Telegram: {{ .TelegramID }}\r\n", - "exhaustedMsg": "🚨 {{ .Type }} esgotado:\r\n", - "exhaustedCount": "🚨 Contagem de {{ .Type }} esgotado:\r\n", - "onlinesCount": "🌐 Clientes online: {{ .Count }}\r\n", - "disabled": "🛑 Desativado: {{ .Disabled }}\r\n", - "depleteSoon": "🔜 Esgotar em breve: {{ .Deplete }}\r\n\r\n", - "backupTime": "🗄 Hora do backup: {{ .Time }}\r\n", - "refreshedOn": "\r\n📋🔄 Atualizado em: {{ .Time }}\r\n\r\n", - "yes": "✅ Sim", - "no": "❌ Não", - "received_id": "🔑📥 ID atualizado.", - "received_password": "🔑📥 Senha atualizada.", - "received_email": "📧📥 E-mail atualizado.", - "received_comment": "💬📥 Comentário atualizado.", - "id_prompt": "🔑 ID Padrão: {{ .ClientId }}\n\nDigite seu ID.", - "pass_prompt": "🔑 Senha Padrão: {{ .ClientPassword }}\n\nDigite sua senha.", - "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_id": "🔄 Entrada: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 Email: {{ .ClientEmail }}\n📊 Tráfego: {{ .ClientTraffic }}\n📅 Data de expiração: {{ .ClientExp }}\n🌐 Limite de IP: {{ .IpLimit }}\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📊 Tráfego: {{ .ClientTraffic }}\n📅 Data de expiração: {{ .ClientExp }}\n🌐 Limite de IP: {{ .IpLimit }}\n💬 Comentário: {{ .ClientComment }}\n\nAgora você pode adicionar o cliente à entrada!", - "cancel": "❌ Processo Cancelado! \n\nVocê pode iniciar novamente a qualquer momento com /start. 🔄", - "error_add_client": "⚠️ Erro:\n\n {{ .error }}", - "using_default_value": "Tudo bem, 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 🚫", - "AreYouSure": "Você tem certeza? 🤔", - "SuccessResetTraffic": "📧 Email: {{ .ClientEmail }}\n🏁 Resultado: ✅ Sucesso", - "FailedResetTraffic": "📧 Email: {{ .ClientEmail }}\n🏁 Resultado: ❌ Falhou \n\n🛠️ Erro: [ {{ .ErrorMessage }} ]", - "FinishProcess": "🔚 Processo de redefinição de tráfego concluído para todos os clientes." - }, - "buttons": { - "closeKeyboard": "❌ Fechar teclado", - "cancel": "❌ Cancelar", - "cancelReset": "❌ Cancelar redefinição", - "cancelIpLimit": "❌ Cancelar limite de IP", - "confirmResetTraffic": "✅ Confirmar redefinição de tráfego?", - "confirmClearIps": "✅ Confirmar limpar IPs?", - "confirmRemoveTGUser": "✅ Confirmar remover usuário do Telegram?", - "confirmToggle": "✅ Confirmar ativar/desativar usuário?", - "dbBackup": "Obter backup do DB", - "serverUsage": "Uso do servidor", - "getInbounds": "Obter Inbounds", - "depleteSoon": "Esgotar em breve", - "clientUsage": "Obter uso", - "onlines": "Clientes online", - "commands": "Comandos", - "refresh": "🔄 Atualizar", - "clearIPs": "❌ Limpar IPs", - "removeTGUser": "❌ Remover usuário do Telegram", - "selectTGUser": "👤 Selecionar usuário do Telegram", - "selectOneTGUser": "👤 Selecione um usuário do Telegram:", - "resetTraffic": "📈 Redefinir tráfego", - "resetExpire": "📅 Alterar data de expiração", - "ipLog": "🔢 Log de IP", - "ipLimit": "🔢 Limite de IP", - "setTGUser": "👤 Definir usuário do Telegram", - "toggle": "🔘 Ativar / Desativar", - "custom": "🔢 Personalizado", - "confirmNumber": "✅ Confirmar: {{ .Num }}", - "confirmNumberAdd": "✅ Confirmar adicionar: {{ .Num }}", - "limitTraffic": "🚧 Limite de tráfego", - "getBanLogs": "Obter logs de banimento", - "allClients": "Todos os clientes", - "addClient": "Adicionar Cliente", - "submitDisable": "Enviar como Desativado ☑️", - "submitEnable": "Enviar como Ativado ✅", - "use_default": "🏷️ Usar padrão", - "change_id": "⚙️🔑 ID", - "change_password": "⚙️🔑 Senha", - "change_email": "⚙️📧 E-mail", - "change_comment": "⚙️💬 Comentário", - "ResetAllTraffics": "Redefinir Todo o Tráfego", - "SortedTrafficUsageReport": "Relatório de Uso de Tráfego Ordenado" - }, "answers": { - "successfulOperation": "✅ Operação bem-sucedida!", - "errorOperation": "❗ Erro na operação.", - "getInboundsFailed": "❌ Falha ao obter inbounds.", - "getClientsFailed": "❌ Falha ao obter clientes.", - "canceled": "❌ {{ .Email }}: Operação cancelada.", - "clientRefreshSuccess": "✅ {{ .Email }}: Cliente atualizado com sucesso.", "IpRefreshSuccess": "✅ {{ .Email }}: IPs atualizados com sucesso.", "TGIdRefreshSuccess": "✅ {{ .Email }}: Usuário do Telegram do cliente atualizado com sucesso.", - "resetTrafficSuccess": "✅ {{ .Email }}: Tráfego redefinido com sucesso.", - "setTrafficLimitSuccess": "✅ {{ .Email }}: Limite de tráfego salvo com sucesso.", - "expireResetSuccess": "✅ {{ .Email }}: Dias de expiração redefinidos com sucesso.", - "resetIpSuccess": "✅ {{ .Email }}: Limite de IP {{ .Count }} salvo com sucesso.", + "askToAddUserId": "Sua configuração não foi encontrada!\r\nPeça ao seu administrador para usar seu Telegram ChatID em suas configurações.\r\n\r\nSeu ChatID: \u003ccode\u003e{{ .TgUserID }}\u003c/code\u003e", + "canceled": "❌ {{ .Email }}: Operação cancelada.", + "chooseClient": "Escolha um cliente para Inbound {{ .Inbound }}", + "chooseInbound": "Escolha um Inbound", "clearIpSuccess": "✅ {{ .Email }}: IPs limpos com sucesso.", + "clientRefreshSuccess": "✅ {{ .Email }}: Cliente atualizado com sucesso.", + "disableSuccess": "✅ {{ .Email }}: Desativado com sucesso.", + "enableSuccess": "✅ {{ .Email }}: Ativado com sucesso.", + "errorOperation": "❗ Erro na operação.", + "expireResetSuccess": "✅ {{ .Email }}: Dias de expiração redefinidos com sucesso.", + "getClientsFailed": "❌ Falha ao obter clientes.", + "getInboundsFailed": "❌ Falha ao obter inbounds.", "getIpLog": "✅ {{ .Email }}: Obter log de IP.", "getUserInfo": "✅ {{ .Email }}: Obter informações do usuário do Telegram.", "removedTGUserSuccess": "✅ {{ .Email }}: Usuário do Telegram removido com sucesso.", - "enableSuccess": "✅ {{ .Email }}: Ativado com sucesso.", - "disableSuccess": "✅ {{ .Email }}: Desativado com sucesso.", - "askToAddUserId": "Sua configuração não foi encontrada!\r\nPeça ao seu administrador para usar seu Telegram ChatID em suas configurações.\r\n\r\nSeu ChatID: {{ .TgUserID }}", - "chooseClient": "Escolha um cliente para Inbound {{ .Inbound }}", - "chooseInbound": "Escolha um Inbound" - } - } -} + "resetIpSuccess": "✅ {{ .Email }}: Limite de IP {{ .Count }} salvo com sucesso.", + "resetTrafficSuccess": "✅ {{ .Email }}: Tráfego redefinido com sucesso.", + "setTrafficLimitSuccess": "✅ {{ .Email }}: Limite de tráfego salvo com sucesso.", + "successfulOperation": "✅ Operação bem-sucedida!" + }, + "buttons": { + "ResetAllTraffics": "Redefinir Todo o Tráfego", + "SortedTrafficUsageReport": "Relatório de Uso de Tráfego Ordenado", + "addClient": "Adicionar Cliente", + "allClients": "Todos os clientes", + "cancel": "❌ Cancelar", + "cancelIpLimit": "❌ Cancelar limite de IP", + "cancelReset": "❌ Cancelar redefinição", + "change_comment": "⚙️💬 Comentário", + "change_email": "⚙️📧 E-mail", + "change_flow": "🌊 Flow", + "change_id": "⚙️🔑 ID", + "change_password": "⚙️🔑 Senha", + "change_subid": "📝 Sub ID", + "clearIPs": "❌ Limpar IPs", + "clientUsage": "Obter uso", + "closeKeyboard": "❌ Fechar teclado", + "commands": "Comandos", + "confirmClearIps": "✅ Confirmar limpar IPs?", + "confirmNumber": "✅ Confirmar: {{ .Num }}", + "confirmNumberAdd": "✅ Confirmar adicionar: {{ .Num }}", + "confirmRemoveTGUser": "✅ Confirmar remover usuário do Telegram?", + "confirmResetTraffic": "✅ Confirmar redefinição de tráfego?", + "confirmToggle": "✅ Confirmar ativar/desativar usuário?", + "custom": "🔢 Personalizado", + "dbBackup": "Obter backup do DB", + "depleteSoon": "Esgotar em breve", + "flow_none": "None", + "getBanLogs": "Obter logs de banimento", + "getInbounds": "Obter Inbounds", + "ipLimit": "🔢 Limite de IP", + "ipLog": "🔢 Log de IP", + "limitTraffic": "🚧 Limite de tráfego", + "onlines": "Clientes online", + "refresh": "🔄 Atualizar", + "removeTGUser": "❌ Remover usuário do Telegram", + "resetExpire": "📅 Alterar data de expiração", + "resetTraffic": "📈 Redefinir tráfego", + "selectOneTGUser": "👤 Selecione um usuário do Telegram:", + "selectTGUser": "👤 Selecionar usuário do Telegram", + "serverUsage": "Uso do servidor", + "setTGUser": "👤 Definir usuário do Telegram", + "submitDisable": "Enviar como Desativado ☑️", + "submitEnable": "Enviar como Ativado ✅", + "toggle": "🔘 Ativar / Desativar", + "use_default": "🏷️ Usar padrão" + }, + "clients": "Clientes", + "commands": { + "getID": "🆔 Seu ID: \u003ccode\u003e{{ .ID }}\u003c/code\u003e", + "help": "🤖 Bem-vindo a este bot! Ele foi projetado para oferecer dados específicos do painel da web e permite que você faça as modificações necessárias.\r\n\r\n", + "helpAdminCommands": "Para reiniciar o Xray Core:\r\n\u003ccode\u003e/restart\u003c/code\u003e\r\n\r\nPara pesquisar por um email de cliente:\r\n\u003ccode\u003e/usage [Email]\u003c/code\u003e\r\n\r\nPara pesquisar por inbounds (com estatísticas do cliente):\r\n\u003ccode\u003e/inbound [Remark]\u003c/code\u003e\r\n\r\nTelegram Chat ID:\r\n\u003ccode\u003e/id\u003c/code\u003e", + "helpClientCommands": "Para pesquisar por estatísticas, use o seguinte comando:\r\n\r\n\u003ccode\u003e/usage [Email]\u003c/code\u003e\r\n\r\nTelegram Chat ID:\r\n\u003ccode\u003e/id\u003c/code\u003e", + "helpDesc": "Ajuda do bot", + "idDesc": "Mostrar seu ID do Telegram", + "pleaseChoose": "👇 Escolha:\r\n", + "restartFailed": "❗ Erro na operação.\r\n\r\n\u003ccode\u003eErro: {{ .Error }}\u003c/code\u003e.", + "restartSuccess": "✅ Operação bem-sucedida!", + "restartUsage": "\r\n\r\n\u003ccode\u003e/restart\u003c/code\u003e", + "start": "👋 Olá \u003ci\u003e{{ .Firstname }}\u003c/i\u003e.\r\n", + "startDesc": "Mostrar menu principal", + "status": "✅ Bot está OK!", + "statusDesc": "Verificar status do bot", + "unknown": "❗ Comando desconhecido.", + "usage": "❗ Por favor, forneça um texto para pesquisar!", + "welcome": "🤖 Bem-vindo ao bot de gerenciamento do \u003cb\u003e{{ .Hostname }}\u003c/b\u003e.\r\n", + "xrayNotRunning": "❗ Xray Core não está em execução." + }, + "day": "Dia", + "days": "Dias", + "hours": "Horas", + "inbounds": "Inbounds", + "keyboardClosed": "❌ Teclado fechado!", + "messages": { + "2faFailed": "Falha no 2FA", + "AreYouSure": "Você tem certeza? 🤔", + "FailedResetTraffic": "📧 Email: {{ .ClientEmail }}\n🏁 Resultado: ❌ Falhou \n\n🛠️ Erro: [ {{ .ErrorMessage }} ]", + "FinishProcess": "🔚 Processo de redefinição de tráfego concluído para todos os clientes.", + "SuccessResetTraffic": "📧 Email: {{ .ClientEmail }}\n🏁 Resultado: ✅ Sucesso", + "TGUser": "👤 Usuário do Telegram: {{ .TelegramID }}\r\n", + "active": "💡 Ativo: {{ .Enable }}\r\n", + "backupTime": "🗄 Hora do backup: {{ .Time }}\r\n", + "cancel": "❌ Processo Cancelado! \n\nVocê pode iniciar novamente a qualquer momento com /start. 🔄", + "client_flow": "Flow:", + "client_subid": "Sub ID:", + "comment_prompt": "💬 Comentário Padrão: {{ .ClientComment }}\n\nDigite seu comentário.", + "cpuThreshold": "🔴 A carga da CPU {{ .Percent }}% excede o limite de {{ .Threshold }}%", + "datetime": "⏰ Data\u0026Hora: {{ .DateTime }}\r\n", + "depleteSoon": "🔜 Esgotar em breve: {{ .Deplete }}\r\n\r\n", + "disabled": "🛑 Desativado: {{ .Disabled }}\r\n", + "download": "🔽 Download: ↓{{ .Download }}\r\n", + "email": "📧 Email: {{ .Email }}\r\n", + "email_prompt": "📧 E-mail Padrão: {{ .ClientEmail }}\n\nDigite seu e-mail.", + "enabled": "🚨 Ativado: {{ .Enable }}\r\n", + "error_add_client": "⚠️ Erro:\n\n {{ .error }}", + "exhaustedCount": "🚨 Contagem de {{ .Type }} esgotado:\r\n", + "exhaustedMsg": "🚨 {{ .Type }} esgotado:\r\n", + "expire": "📅 Data de expiração: {{ .Time }}\r\n", + "expireIn": "📅 Expira em: {{ .Time }}\r\n", + "hostname": "💻 Host: {{ .Hostname }}\r\n", + "id_prompt": "🔑 ID Padrão: {{ .ClientId }}\n\nDigite seu ID.", + "inbound": "📍 Inbound: {{ .Remark }}\r\n", + "inbound_client_data_id": "🔄 Entrada: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 Email: {{ .ClientEmail }}\n📊 Tráfego: {{ .ClientTraffic }}\n📅 Data de expiração: {{ .ClientExp }}\n🌐 Limite de IP: {{ .IpLimit }}\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📊 Tráfego: {{ .ClientTraffic }}\n📅 Data de expiração: {{ .ClientExp }}\n🌐 Limite de IP: {{ .IpLimit }}\n💬 Comentário: {{ .ClientComment }}\n\nAgora você pode adicionar o cliente à entrada!", + "incorrect_input": "Sua entrada não é válida.\nAs frases devem ser contínuas, sem espaços.\nExemplo correto: aaaaaa\nExemplo incorreto: aaa aaa 🚫", + "invalid_subid": "Invalid format.\nSub ID can only contain letters, numbers, hyphens (-), and underscores (_).\nSpaces and special characters are not allowed. 🚫", + "ip": "🌐 IP: {{ .IP }}\r\n", + "ips": "🔢 IPs:\r\n{{ .IPs }}\r\n", + "ipv4": "🌐 IPv4: {{ .IPv4 }}\r\n", + "ipv6": "🌐 IPv6: {{ .IPv6 }}\r\n", + "lastOnline": "🔙 Última vez online: {{ .Time }}\r\n", + "loginFailed": "❗️Tentativa de login no painel falhou.\r\n", + "loginSuccess": "✅ Conectado ao painel com sucesso.\r\n", + "no": "❌ Não", + "online": "🌐 Status da conexão: {{ .Status }}\r\n", + "onlinesCount": "🌐 Clientes online: {{ .Count }}\r\n", + "pass_prompt": "🔑 Senha Padrão: {{ .ClientPassword }}\n\nDigite sua senha.", + "port": "🔌 Porta: {{ .Port }}\r\n", + "reason": "❗️ Motivo: {{ .Reason }}\r\n", + "received_comment": "💬📥 Comentário atualizado.", + "received_email": "📧📥 E-mail atualizado.", + "received_id": "🔑📥 ID atualizado.", + "received_password": "🔑📥 Senha atualizada.", + "received_subid": "Sub ID updated successfully!", + "refreshedOn": "\r\n📋🔄 Atualizado em: {{ .Time }}\r\n\r\n", + "report": "🕰 Relatórios agendados: {{ .RunTime }}\r\n", + "selectUserFailed": "❌ Erro na seleção do usuário!", + "serverLoad": "📈 Carga do sistema: {{ .Load1 }}, {{ .Load2 }}, {{ .Load3 }}\r\n", + "serverMemory": "📋 RAM: {{ .Current }}/{{ .Total }}\r\n", + "serverUpTime": "⏳ Tempo de atividade: {{ .UpTime }} {{ .Unit }}\r\n", + "subid_prompt": "Please enter new Sub ID:\nCurrent: {{.ClientSubId}}", + "tcpCount": "🔹 TCP: {{ .Count }}\r\n", + "time": "⏰ Hora: {{ .Time }}\r\n", + "total": "📊 Total: ↑↓{{ .UpDown }} / {{ .Total }}\r\n", + "traffic": "🚦 Tráfego: {{ .Total }} (↑{{ .Upload }},↓{{ .Download }})\r\n", + "udpCount": "🔸 UDP: {{ .Count }}\r\n", + "upload": "🔼 Upload: ↑{{ .Upload }}\r\n", + "userSaved": "✅ Usuário do Telegram salvo.", + "username": "👤 Nome de usuário: {{ .Username }}\r\n", + "using_default_value": "Tudo bem, vou manter o valor padrão. 😊", + "version": "🚀 Versão 3X-UI: {{ .Version }}\r\n", + "xrayStatus": "ℹ️ Status: {{ .State }}\r\n", + "xrayVersion": "📡 Versão Xray: {{ .XrayVersion }}\r\n", + "yes": "✅ Sim" + }, + "minutes": "Minutos", + "month": "Mês", + "months": "Meses", + "noInbounds": "❗ Nenhum inbound encontrado!", + "noIpRecord": "❗ Nenhum registro de IP!", + "noQuery": "❌ Consulta não encontrada! Por favor, use o comando novamente!", + "noResult": "❗ Nenhum resultado!", + "offline": "🔴 Offline", + "online": "🟢 Online", + "unknown": "Desconhecido", + "unlimited": "♾ Ilimitado (Reset)", + "wentWrong": "❌ Algo deu errado!" + }, + "transmission": "Transmissão", + "twoFactorCode": "Código", + "unlimited": "Ilimitado", + "update": "Atualizar", + "usage": "Uso", + "useIPv4ForHost": "Usar IPv4 para o host", + "username": "Nome de Usuário" +} \ No newline at end of file diff --git a/web/translation/ru-RU.json b/web/translation/ru-RU.json index f77faa9f..9311a943 100644 --- a/web/translation/ru-RU.json +++ b/web/translation/ru-RU.json @@ -873,6 +873,11 @@ "exhaustedMsg": "🚨 Исчерпаны {{ .Type }}:\r\n", "exhaustedCount": "🚨 Количество исчерпанных {{ .Type }}:\r\n", "onlinesCount": "🌐 Клиентов онлайн: {{ .Count }}\r\n", + "cpu": "ЦП: {{ .Usage }}%\r\n", + "mem": "ОЗУ: {{ .Usage }}/{{ .Total }}\r\n", + "swap": "Swap: {{ .Usage }}/{{ .Total }}\r\n", + "disk": "Диск: {{ .Usage }}/{{ .Total }}\r\n", + "uptime": "Время работы: {{ .Time }}\r\n", "disabled": "🛑 Отключено: {{ .Disabled }}\r\n", "depleteSoon": "🔜 Клиенты, у которых скоро исчерпание: {{ .Deplete }}\r\n\r\n", "backupTime": "🗄 Время резервного копирования: {{ .Time }}\r\n", @@ -947,6 +952,7 @@ "change_subid": "📝 Sub ID", "change_flow": "🌊 Flow", "flow_none": "Отсутствует", + "qrCode": "QR-код", "ResetAllTraffics": "Сбросить весь трафик", "SortedTrafficUsageReport": "Отсортированный отчет об использовании трафика" }, diff --git a/web/translation/tr-TR.json b/web/translation/tr-TR.json index 05136a79..44c33fc4 100644 --- a/web/translation/tr-TR.json +++ b/web/translation/tr-TR.json @@ -1,750 +1,604 @@ { - "username": "Kullanıcı Adı", - "password": "Şifre", - "login": "Giriş Yap", - "confirm": "Onayla", - "cancel": "İptal", - "close": "Kapat", - "save": "Kaydet", - "logout": "Çıkış Yap", - "create": "Oluştur", - "update": "Güncelle", - "copy": "Kopyala", - "copied": "Kopyalandı", - "download": "İndir", - "remark": "Açıklama", - "enable": "Etkin", - "protocol": "Protokol", - "search": "Ara", - "filter": "Filtrele", - "loading": "Yükleniyor...", - "second": "Saniye", - "minute": "Dakika", - "hour": "Saat", - "day": "Gün", - "check": "Kontrol Et", - "indefinite": "Belirsiz", - "unlimited": "Sınırsız", - "none": "Hiçbiri", - "qrCode": "QR Kod", - "info": "Daha Fazla Bilgi", - "edit": "Düzenle", - "delete": "Sil", - "reset": "Sıfırla", - "noData": "Veri yok.", - "copySuccess": "Başarıyla Kopyalandı", - "sure": "Emin misiniz", - "encryption": "Şifreleme", - "useIPv4ForHost": "Ana bilgisayar için IPv4 kullan", - "transmission": "İletim", - "host": "Sunucu", - "path": "Yol", "camouflage": "Kandırma", - "status": "Durum", - "enabled": "Etkin", - "disabled": "Devre Dışı", + "cancel": "İptal", + "certificate": "Dijital Sertifika", + "check": "Kontrol Et", + "clients": "Müşteriler", + "close": "Kapat", + "comment": "Yorum", + "confirm": "Onayla", + "copied": "Kopyalandı", + "copy": "Kopyala", + "copySuccess": "Başarıyla Kopyalandı", + "create": "Oluştur", + "day": "Gün", + "delete": "Sil", "depleted": "Bitti", "depletingSoon": "Bitmek Üzere", - "offline": "Çevrimdışı", - "online": "Çevrimiçi", + "disabled": "Devre Dışı", "domainName": "Alan Adı", - "monitor": "Dinleme IP", - "certificate": "Dijital Sertifika", - "fail": "Başarısız", - "comment": "Yorum", - "success": "Başarılı", - "lastOnline": "Son çevrimiçi", - "getVersion": "Sürümü Al", - "install": "Yükle", - "clients": "Müşteriler", - "usage": "Kullanım", - "twoFactorCode": "Kod", - "remained": "Kalan", - "security": "Güvenlik", - "secAlertTitle": "Güvenlik Uyarısı", - "secAlertSsl": "Bu bağlantı güvenli değil. Verilerin korunması için TLS etkinleştirilene kadar hassas bilgiler girmekten kaçının.", - "secAlertConf": "Bazı ayarlar saldırılara açıktır. Olası ihlalleri önlemek için güvenlik protokollerini güçlendirmeniz önerilir.", - "secAlertSSL": "Panelde güvenli bağlantı yok. Verilerin korunması için TLS sertifikası yükleyin.", - "secAlertPanelPort": "Panel varsayılan portu savunmasız. Rastgele veya belirli bir port yapılandırın.", - "secAlertPanelURI": "Panel varsayılan URI yolu güvensiz. Karmaşık bir URI yolu yapılandırın.", - "secAlertSubURI": "Abonelik varsayılan URI yolu güvensiz. Karmaşık bir URI yolu yapılandırın.", - "secAlertSubJsonURI": "Abonelik JSON varsayılan URI yolu güvensiz. Karmaşık bir URI yolu yapılandırın.", + "download": "İndir", + "edit": "Düzenle", + "emptyBalancersDesc": "Eklenmiş dengeleyici yok.", "emptyDnsDesc": "Eklenmiş DNS sunucusu yok.", "emptyFakeDnsDesc": "Eklenmiş Fake DNS sunucusu yok.", - "emptyBalancersDesc": "Eklenmiş dengeleyici yok.", "emptyReverseDesc": "Eklenmiş ters proxy yok.", - "somethingWentWrong": "Bir şeyler yanlış gitti", - "subscription": { - "title": "Abonelik Bilgisi", - "subId": "Abonelik Kimliği", - "status": "Durum", - "downloaded": "İndirilen", - "uploaded": "Yüklenen", - "expiry": "Son Kullanma", - "totalQuota": "Toplam Kota", - "individualLinks": "Bireysel Bağlantılar", - "active": "Aktif", - "inactive": "Pasif", - "unlimited": "Sınırsız", - "noExpiry": "Süresiz" - }, + "enable": "Etkin", + "enabled": "Etkin", + "encryption": "Şifreleme", + "fail": "Başarısız", + "filter": "Filtrele", + "getVersion": "Sürümü Al", + "host": "Sunucu", + "hour": "Saat", + "indefinite": "Belirsiz", + "info": "Daha Fazla Bilgi", + "install": "Yükle", + "lastOnline": "Son çevrimiçi", + "loading": "Yükleniyor...", + "login": "Giriş Yap", + "logout": "Çıkış Yap", "menu": { - "theme": "Tema", + "apiDocs": "API Belgeleri", "dark": "Koyu", - "ultraDark": "Ultra Koyu", "dashboard": "Genel Bakış", "inbounds": "Gelenler", + "link": "Yönet", + "logout": "Çıkış Yap", "nodes": "Düğümler", "settings": "Panel Ayarları", - "xray": "Xray Yapılandırmaları", - "apiDocs": "API Belgeleri", - "logout": "Çıkış Yap", - "link": "Yönet" + "theme": "Tema", + "ultraDark": "Ultra Koyu", + "xray": "Xray Yapılandırmaları" }, + "minute": "Dakika", + "monitor": "Dinleme IP", + "noData": "Veri yok.", + "none": "Hiçbiri", + "offline": "Çevrimdışı", + "online": "Çevrimiçi", "pages": { - "login": { - "hello": "Merhaba", - "title": "Hoş Geldiniz", - "loginAgain": "Oturum süreniz doldu, lütfen tekrar giriş yapın", - "toasts": { - "invalidFormData": "Girdi verisi formatı geçersiz.", - "emptyUsername": "Kullanıcı adı gerekli", - "emptyPassword": "Şifre gerekli", - "wrongUsernameOrPassword": "Geçersiz kullanıcı adı, şifre veya iki adımlı doğrulama kodu.", - "successLogin": "Hesabınıza başarıyla giriş yaptınız." - } - }, - "index": { - "title": "Genel Bakış", - "cpu": "İşlemci", - "logicalProcessors": "Mantıksal işlemciler", - "frequency": "Frekans", - "swap": "Takas", - "storage": "Depolama", - "memory": "RAM", - "threads": "İş parçacıkları", - "xrayStatus": "Xray", - "stopXray": "Durdur", - "restartXray": "Yeniden Başlat", - "xraySwitch": "Sürüm", - "xraySwitchClick": "Geçiş yapmak istediğiniz sürümü seçin.", - "xraySwitchClickDesk": "Dikkatli seçin, eski sürümler mevcut yapılandırmalarla uyumlu olmayabilir.", - "xrayUpdates": "Xray Güncellemeleri", - "updatePanel": "Paneli Güncelle", - "panelUpdateDesc": "Bu, 3X-UI'yi en son sürüme güncelleyecek ve panel servisini yeniden başlatacaktır.", - "currentPanelVersion": "Mevcut panel sürümü", - "latestPanelVersion": "Panelin en son sürümü", - "panelUpToDate": "Panel güncel", - "upToDate": "Güncel", - "xrayStatusUnknown": "Bilinmiyor", - "xrayStatusRunning": "Çalışıyor", - "xrayStatusStop": "Durduruldu", - "xrayStatusError": "Hata", - "xrayErrorPopoverTitle": "Xray çalıştırılırken bir hata oluştu", - "operationHours": "Çalışma Süresi", - "systemHistoryTitle": "Sistem Geçmişi", - "charts": "Grafikler", - "xrayMetricsTitle": "Xray Metrikleri", - "xrayMetricsDisabled": "Xray metrik uç noktası yapılandırılmadı", - "xrayMetricsHint": "xray yapılandırmasına tag metrics_out ve listen 127.0.0.1:11111 olan üst düzey bir metrics bloğu ekleyin, sonra xray'i yeniden başlatın.", - "xrayObservatoryEmpty": "Henüz Observatory verisi yok", - "xrayObservatoryHint": "xray yapılandırmasına test edilecek outbound etiketlerini listeleyen bir observatory bloğu ekleyin, sonra xray'i yeniden başlatın.", - "xrayObservatoryTagPlaceholder": "Outbound seç", - "xrayObservatoryAlive": "Aktif", - "xrayObservatoryDead": "Kapalı", - "xrayObservatoryLastSeen": "Son görülme", - "xrayObservatoryLastTry": "Son deneme", - "trendLast2Min": "Son 2 dakika", - "systemLoad": "Sistem Yükü", - "systemLoadDesc": "Geçmiş 1, 5 ve 15 dakika için sistem yük ortalaması", - "connectionCount": "Bağlantı İstatistikleri", - "ipAddresses": "IP adresleri", - "toggleIpVisibility": "IP görünürlüğünü değiştir", - "overallSpeed": "Genel hız", - "upload": "Yükleme", - "download": "İndirme", - "totalData": "Toplam veri", - "sent": "Gönderilen", - "received": "Alınan", - "documentation": "Dokümantasyon", - "xraySwitchVersionDialog": "Xray sürümünü gerçekten değiştirmek istiyor musunuz?", - "xraySwitchVersionDialogDesc": "Bu işlem Xray sürümünü #version# olarak değiştirecektir.", - "xraySwitchVersionPopover": "Xray başarıyla güncellendi", - "panelUpdateDialog": "Gerçekten paneli güncellemek istiyor musunuz?", - "panelUpdateDialogDesc": "Bu, 3X-UI'yi #version# sürümüne güncelleyecek ve panel servisini yeniden başlatacaktır.", - "panelUpdateCheckPopover": "Panel güncelleme kontrolü başarısız oldu", - "panelUpdateStartedPopover": "Panel güncellemesi başlatıldı", - "geofileUpdateDialog": "Geofile'ı gerçekten güncellemek istiyor musunuz?", - "geofileUpdateDialogDesc": "Bu işlem #filename# dosyasını güncelleyecektir.", - "geofilesUpdateDialogDesc": "Bu, tüm dosyaları güncelleyecektir.", - "geofilesUpdateAll": "Tümünü güncelle", - "geofileUpdatePopover": "Geofile başarıyla güncellendi", - "dontRefresh": "Kurulum devam ediyor, lütfen bu sayfayı yenilemeyin", - "logs": "Günlükler", - "config": "Yapılandırma", - "backup": "Yedek", - "backupTitle": "Yedekleme & Geri Yükleme", - "exportDatabase": "Yedekle", - "exportDatabaseDesc": "Mevcut veritabanınızın yedeğini içeren bir .db dosyasını cihazınıza indirmek için tıklayın.", - "importDatabase": "Geri Yükle", - "importDatabaseDesc": "Cihazınızdan bir .db dosyası seçip yükleyerek veritabanınızı yedekten geri yüklemek için tıklayın.", - "importDatabaseSuccess": "Veritabanı başarıyla içe aktarıldı", - "importDatabaseError": "Veritabanı içe aktarılırken bir hata oluştu", - "readDatabaseError": "Veritabanı okunurken bir hata oluştu", - "getDatabaseError": "Veritabanı alınırken bir hata oluştu", - "getConfigError": "Yapılandırma dosyası alınırken bir hata oluştu", - "customGeoTitle": "Özel GeoSite / GeoIP", - "customGeoAdd": "Ekle", - "customGeoType": "Tür", - "customGeoAlias": "Takma ad", - "customGeoUrl": "URL", - "customGeoEnabled": "Etkin", - "customGeoLastUpdated": "Son güncelleme", - "customGeoExtColumn": "Yönlendirme (ext:…)", - "customGeoToastUpdateAll": "Tüm özel kaynaklar güncellendi", - "customGeoActions": "İşlemler", - "customGeoEdit": "Düzenle", - "customGeoDelete": "Sil", - "customGeoDownload": "Şimdi güncelle", - "customGeoModalAdd": "Özel geo ekle", - "customGeoModalEdit": "Özel geo düzenle", - "customGeoModalSave": "Kaydet", - "customGeoDeleteConfirm": "Bu özel geo kaynağını silinsin mi?", - "customGeoRoutingHint": "Yönlendirme kurallarında değer sütununu ext:dosya.dat:etiket olarak kullanın (etiketi değiştirin).", - "customGeoInvalidId": "Geçersiz kaynak kimliği", - "customGeoAliasesError": "Özel geo takma adları yüklenemedi", - "customGeoValidationAlias": "Takma ad yalnızca küçük harf, rakam, - ve _ içerebilir", - "customGeoValidationUrl": "URL http:// veya https:// ile başlamalıdır", - "customGeoAliasPlaceholder": "a-z 0-9 _ -", - "customGeoAliasLabelSuffix": " (özel)", - "customGeoToastList": "Özel geo listesi", - "customGeoToastAdd": "Özel geo ekle", - "customGeoToastUpdate": "Özel geo güncelle", - "customGeoToastDelete": "Özel geofile \"{{ .fileName }}\" silindi", - "customGeoToastDownload": "\"{{ .fileName }}\" geofile güncellendi", - "customGeoErrInvalidType": "Tür geosite veya geoip olmalıdır", - "customGeoErrAliasRequired": "Takma ad gerekli", - "customGeoErrAliasPattern": "Takma ad izin verilmeyen karakterler içeriyor", - "customGeoErrAliasReserved": "Bu takma ad ayrılmış", - "customGeoErrUrlRequired": "URL gerekli", - "customGeoErrInvalidUrl": "URL geçersiz", - "customGeoErrUrlScheme": "URL http veya https kullanmalıdır", - "customGeoErrUrlHost": "URL ana bilgisayarı geçersiz", - "customGeoErrDuplicateAlias": "Bu takma ad bu tür için zaten kullanılıyor", - "customGeoErrNotFound": "Özel geo kaynağı bulunamadı", - "customGeoErrDownload": "İndirme başarısız", - "customGeoErrUpdateAllIncomplete": "Bir veya daha fazla özel geo kaynağı güncellenemedi", - "customGeoEmpty": "Henüz özel geo kaynağı yok — oluşturmak için Ekle'ye tıklayın" + "client": { + "add": "Müşteri Ekle", + "bulk": "Toplu Ekle", + "clearAll": "Tümünü temizle", + "clientCount": "Müşteri Sayısı", + "copyEmailPreview": "Sonuç e-posta önizlemesi", + "copyFlowHint": "Kopyalanan tüm istemcilere uygulanır. Boş bırakırsanız atlanır.", + "copyFlowLabel": "Yeni istemciler için Flow (VLESS)", + "copyFromInbound": "Gelen bağlantıdan istemcileri kopyala", + "copyResult": "Kopyalama sonucu", + "copyResultErrors": "Kopyalama hataları", + "copyResultNone": "Kopyalanacak bir şey yok: istemci seçilmedi veya kaynak boş", + "copyResultSuccess": "Başarıyla kopyalandı", + "copySelectSourceFirst": "Önce bir kaynak gelen bağlantı seçin.", + "copySelected": "Seçilenleri kopyala", + "copySource": "Kaynak", + "copyToInbound": "İstemcileri şuraya kopyala", + "days": "Gün", + "delayedStart": "İlk Kullanımdan Sonra Başlat", + "edit": "Müşteriyi Düzenle", + "expireDays": "Süre", + "first": "İlk", + "last": "Son", + "method": "Yöntem", + "postfix": "Sonek", + "prefix": "Önek", + "renew": "Otomatik Yenile", + "renewDesc": "Süresi dolduktan sonra otomatik yenileme. (0 = devre dışı)(birim: gün)", + "selectAll": "Tümünü seç", + "submitAdd": "Müşteri Ekle", + "submitEdit": "Değişiklikleri Kaydet" }, "inbounds": { - "allTimeTraffic": "Toplam Trafik", - "allTimeTrafficUsage": "Tüm Zamanların Toplam Kullanımı", - "title": "Gelenler", - "totalDownUp": "Toplam Gönderilen/Alınan", - "totalUsage": "Toplam Kullanım", - "inboundCount": "Toplam Gelen", - "operate": "Menü", - "enable": "Etkin", - "remark": "Açıklama", - "node": "Düğüm", - "deployTo": "Şuraya dağıt", - "localPanel": "Yerel panel", - "protocol": "Protokol", - "port": "Port", - "portMap": "Port Atama", - "traffic": "Trafik", - "details": "Detaylar", - "transportConfig": "Taşıma", - "expireDate": "Süre", - "createdAt": "Oluşturuldu", - "updatedAt": "Güncellendi", - "resetTraffic": "Trafiği Sıfırla", - "addInbound": "Gelen Ekle", - "generalActions": "Genel Eylemler", - "modifyInbound": "Geleni Düzenle", - "deleteInbound": "Geleni Sil", - "deleteInboundContent": "Geleni silmek istediğinizden emin misiniz?", - "deleteClient": "Müşteriyi Sil", - "deleteClientContent": "Müşteriyi silmek istediğinizden emin misiniz?", - "resetTrafficContent": "Trafiği sıfırlamak istediğinizden emin misiniz?", - "copyLink": "URL'yi Kopyala", - "address": "Adres", - "network": "Ağ", - "destinationPort": "Hedef Port", - "targetAddress": "Hedef Adres", - "monitorDesc": "Tüm IP'leri dinlemek için boş bırakın", - "meansNoLimit": "= Sınırsız. (birim: GB)", - "totalFlow": "Toplam Akış", - "leaveBlankToNeverExpire": "Hiçbir zaman sona ermemesi için boş bırakın", - "noRecommendKeepDefault": "Varsayılanı korumanız önerilir", - "certificatePath": "Dosya Yolu", - "certificateContent": "Dosya İçeriği", - "publicKey": "Genel Anahtar", - "privatekey": "Özel Anahtar", - "clickOnQRcode": "Kopyalamak için QR Kodu Tıklayın", - "client": "Müşteri", - "export": "Tüm URL'leri Dışa Aktar", - "clone": "Klonla", - "cloneInbound": "Klonla", - "cloneInboundContent": "Bu gelenin tüm ayarları, Port, Dinleme IP ve Müşteriler hariç, klona uygulanacaktır.", - "cloneInboundOk": "Klonla", - "resetAllTraffic": "Tüm Gelen Trafiğini Sıfırla", - "resetAllTrafficTitle": "Tüm Gelen Trafiğini Sıfırla", - "resetAllTrafficContent": "Tüm gelenlerin trafiğini sıfırlamak istediğinizden emin misiniz?", - "resetInboundClientTraffics": "Müşteri Trafiklerini Sıfırla", - "resetInboundClientTrafficTitle": "Müşteri Trafiklerini Sıfırla", - "resetInboundClientTrafficContent": "Bu gelenin müşterilerinin trafiğini sıfırlamak istediğinizden emin misiniz?", - "resetAllClientTraffics": "Tüm Müşteri Trafiklerini Sıfırla", - "resetAllClientTrafficTitle": "Tüm Müşteri Trafiklerini Sıfırla", - "resetAllClientTrafficContent": "Tüm müşterilerin trafiğini sıfırlamak istediğinizden emin misiniz?", - "delDepletedClients": "Bitmiş Müşterileri Sil", - "delDepletedClientsTitle": "Bitmiş Müşterileri Sil", - "delDepletedClientsContent": "Tüm bitmiş müşterileri silmek istediğinizden emin misiniz?", - "email": "E-posta", - "emailDesc": "Lütfen benzersiz bir e-posta adresi sağlayın.", "IPLimit": "IP Limiti", "IPLimitDesc": "Sayının aşılması durumunda gelen devre dışı bırakılır. (0 = devre dışı)", "IPLimitlog": "IP Günlüğü", "IPLimitlogDesc": "IP geçmiş günlüğü. (devre dışı bırakıldıktan sonra gelini etkinleştirmek için günlüğü temizleyin)", "IPLimitlogclear": "Günlüğü Temizle", - "setDefaultCert": "Panelden Sertifikayı Ayarla", - "telegramDesc": "Lütfen Telegram Sohbet Kimliği sağlayın. (botta '/id' komutunu kullanın) veya ({'@'}userinfobot)", - "subscriptionDesc": "Abonelik URL'inizi bulmak için 'Detaylar'a gidin. Ayrıca, aynı adı birden fazla müşteri için kullanabilirsiniz.", - "info": "Bilgi", - "same": "Aynı", - "inboundData": "Gelenin Verileri", + "addInbound": "Gelen Ekle", + "address": "Adres", + "allTimeTraffic": "Toplam Trafik", + "allTimeTrafficUsage": "Tüm Zamanların Toplam Kullanımı", + "certificateContent": "Dosya İçeriği", + "certificatePath": "Dosya Yolu", + "clickOnQRcode": "Kopyalamak için QR Kodu Tıklayın", + "client": "Müşteri", + "clone": "Klonla", + "cloneInbound": "Klonla", + "cloneInboundContent": "Bu gelenin tüm ayarları, Port, Dinleme IP ve Müşteriler hariç, klona uygulanacaktır.", + "cloneInboundOk": "Klonla", + "copyLink": "URL'yi Kopyala", + "createdAt": "Oluşturuldu", + "delDepletedClients": "Bitmiş Müşterileri Sil", + "delDepletedClientsContent": "Tüm bitmiş müşterileri silmek istediğinizden emin misiniz?", + "delDepletedClientsTitle": "Bitmiş Müşterileri Sil", + "deleteClient": "Müşteriyi Sil", + "deleteClientContent": "Müşteriyi silmek istediğinizden emin misiniz?", + "deleteInbound": "Geleni Sil", + "deleteInboundContent": "Geleni silmek istediğinizden emin misiniz?", + "deployTo": "Şuraya dağıt", + "destinationPort": "Hedef Port", + "details": "Detaylar", + "email": "E-posta", + "emailDesc": "Lütfen benzersiz bir e-posta adresi sağlayın.", + "enable": "Etkin", + "expireDate": "Süre", + "export": "Tüm URL'leri Dışa Aktar", "exportInbound": "Geleni Dışa Aktar", + "generalActions": "Genel Eylemler", "import": "İçe Aktar", "importInbound": "Bir Gelen İçe Aktar", - "periodicTrafficResetTitle": "Trafik Sıfırlama", - "periodicTrafficResetDesc": "Belirtilen aralıklarla trafik sayacını otomatik olarak sıfırla", + "inboundCount": "Toplam Gelen", + "inboundData": "Gelenin Verileri", + "info": "Bilgi", "lastReset": "Son Sıfırlama", + "leaveBlankToNeverExpire": "Hiçbir zaman sona ermemesi için boş bırakın", + "localPanel": "Yerel panel", + "meansNoLimit": "= Sınırsız. (birim: GB)", + "modifyInbound": "Geleni Düzenle", + "monitorDesc": "Tüm IP'leri dinlemek için boş bırakın", + "network": "Ağ", + "noRecommendKeepDefault": "Varsayılanı korumanız önerilir", + "node": "Düğüm", + "operate": "Menü", "periodicTrafficReset": { - "never": "Asla", "daily": "Günlük", - "weekly": "Haftalık", + "hourly": "Saatlik", "monthly": "Aylık", - "hourly": "Saatlik" + "never": "Asla", + "weekly": "Haftalık" }, + "periodicTrafficResetDesc": "Belirtilen aralıklarla trafik sayacını otomatik olarak sıfırla", + "periodicTrafficResetTitle": "Trafik Sıfırlama", + "port": "Port", + "portMap": "Port Atama", + "privatekey": "Özel Anahtar", + "protocol": "Protokol", + "publicKey": "Genel Anahtar", + "remark": "Açıklama", + "resetAllClientTrafficContent": "Tüm müşterilerin trafiğini sıfırlamak istediğinizden emin misiniz?", + "resetAllClientTrafficTitle": "Tüm Müşteri Trafiklerini Sıfırla", + "resetAllClientTraffics": "Tüm Müşteri Trafiklerini Sıfırla", + "resetAllTraffic": "Tüm Gelen Trafiğini Sıfırla", + "resetAllTrafficContent": "Tüm gelenlerin trafiğini sıfırlamak istediğinizden emin misiniz?", + "resetAllTrafficTitle": "Tüm Gelen Trafiğini Sıfırla", + "resetInboundClientTrafficContent": "Bu gelenin müşterilerinin trafiğini sıfırlamak istediğinizden emin misiniz?", + "resetInboundClientTrafficTitle": "Müşteri Trafiklerini Sıfırla", + "resetInboundClientTraffics": "Müşteri Trafiklerini Sıfırla", + "resetTraffic": "Trafiği Sıfırla", + "resetTrafficContent": "Trafiği sıfırlamak istediğinizden emin misiniz?", + "same": "Aynı", + "setDefaultCert": "Panelden Sertifikayı Ayarla", + "stream": { + "general": { + "name": "Ad", + "request": "İstek", + "response": "Yanıt", + "value": "Değer" + }, + "tcp": { + "method": "Yöntem", + "path": "Yol", + "requestHeader": "İstek Başlığı", + "responseHeader": "Yanıt Başlığı", + "status": "Durum", + "statusDescription": "Durum Açıklaması", + "version": "Sürüm" + } + }, + "subscriptionDesc": "Abonelik URL'inizi bulmak için 'Detaylar'a gidin. Ayrıca, aynı adı birden fazla müşteri için kullanabilirsiniz.", + "targetAddress": "Hedef Adres", + "telegramDesc": "Lütfen Telegram Sohbet Kimliği sağlayın. (botta '/id' komutunu kullanın) veya ({'@'}userinfobot)", + "title": "Gelenler", "toasts": { - "obtain": "Elde Et", - "updateSuccess": "Güncelleme başarılı oldu", - "logCleanSuccess": "Günlük temizlendi", - "inboundsUpdateSuccess": "Gelen bağlantılar başarıyla güncellendi", - "inboundUpdateSuccess": "Gelen bağlantı başarıyla güncellendi", - "inboundCreateSuccess": "Gelen bağlantı başarıyla oluşturuldu", - "inboundDeleteSuccess": "Gelen bağlantı başarıyla silindi", + "delDepletedClientsSuccess": "Tüm tükenmiş istemciler silindi", + "getNewVlessEncError": "VlessEnc sertifikası alınırken hata oluştu.", + "getNewX25519CertError": "X25519 sertifikası alınırken hata oluştu.", + "getNewmldsa65Error": "mldsa65 sertifikası alınırken hata oluştu.", "inboundClientAddSuccess": "Gelen bağlantı istemci(leri) eklendi", "inboundClientDeleteSuccess": "Gelen bağlantı istemcisi silindi", "inboundClientUpdateSuccess": "Gelen bağlantı istemcisi güncellendi", - "delDepletedClientsSuccess": "Tüm tükenmiş istemciler silindi", + "inboundCreateSuccess": "Gelen bağlantı başarıyla oluşturuldu", + "inboundDeleteSuccess": "Gelen bağlantı başarıyla silindi", + "inboundUpdateSuccess": "Gelen bağlantı başarıyla güncellendi", + "inboundsUpdateSuccess": "Gelen bağlantılar başarıyla güncellendi", + "logCleanSuccess": "Günlük temizlendi", + "obtain": "Elde Et", "resetAllClientTrafficSuccess": "İstemcinin tüm trafiği sıfırlandı", "resetAllTrafficSuccess": "Tüm trafik sıfırlandı", "resetInboundClientTrafficSuccess": "Trafik sıfırlandı", "trafficGetError": "Trafik bilgisi alınırken hata oluştu", - "getNewX25519CertError": "X25519 sertifikası alınırken hata oluştu.", - "getNewmldsa65Error": "mldsa65 sertifikası alınırken hata oluştu.", - "getNewVlessEncError": "VlessEnc sertifikası alınırken hata oluştu." + "updateSuccess": "Güncelleme başarılı oldu" }, - "stream": { - "general": { - "request": "İstek", - "response": "Yanıt", - "name": "Ad", - "value": "Değer" - }, - "tcp": { - "version": "Sürüm", - "method": "Yöntem", - "path": "Yol", - "status": "Durum", - "statusDescription": "Durum Açıklaması", - "requestHeader": "İstek Başlığı", - "responseHeader": "Yanıt Başlığı" - } - } + "totalDownUp": "Toplam Gönderilen/Alınan", + "totalFlow": "Toplam Akış", + "totalUsage": "Toplam Kullanım", + "traffic": "Trafik", + "transportConfig": "Taşıma", + "updatedAt": "Güncellendi" }, - "client": { - "add": "Müşteri Ekle", - "edit": "Müşteriyi Düzenle", - "submitAdd": "Müşteri Ekle", - "submitEdit": "Değişiklikleri Kaydet", - "clientCount": "Müşteri Sayısı", - "bulk": "Toplu Ekle", - "copyFromInbound": "Gelen bağlantıdan istemcileri kopyala", - "copyToInbound": "İstemcileri şuraya kopyala", - "copySelected": "Seçilenleri kopyala", - "copySource": "Kaynak", - "copyEmailPreview": "Sonuç e-posta önizlemesi", - "copySelectSourceFirst": "Önce bir kaynak gelen bağlantı seçin.", - "copyResult": "Kopyalama sonucu", - "copyResultSuccess": "Başarıyla kopyalandı", - "copyResultNone": "Kopyalanacak bir şey yok: istemci seçilmedi veya kaynak boş", - "copyResultErrors": "Kopyalama hataları", - "copyFlowLabel": "Yeni istemciler için Flow (VLESS)", - "copyFlowHint": "Kopyalanan tüm istemcilere uygulanır. Boş bırakırsanız atlanır.", - "selectAll": "Tümünü seç", - "clearAll": "Tümünü temizle", - "method": "Yöntem", - "first": "İlk", - "last": "Son", - "prefix": "Önek", - "postfix": "Sonek", - "delayedStart": "İlk Kullanımdan Sonra Başlat", - "expireDays": "Süre", - "days": "Gün", - "renew": "Otomatik Yenile", - "renewDesc": "Süresi dolduktan sonra otomatik yenileme. (0 = devre dışı)(birim: gün)" + "index": { + "backup": "Yedek", + "backupTitle": "Yedekleme \u0026 Geri Yükleme", + "charts": "Grafikler", + "config": "Yapılandırma", + "connectionCount": "Bağlantı İstatistikleri", + "cpu": "İşlemci", + "currentPanelVersion": "Mevcut panel sürümü", + "customGeoActions": "İşlemler", + "customGeoAdd": "Ekle", + "customGeoAlias": "Takma ad", + "customGeoAliasLabelSuffix": " (özel)", + "customGeoAliasPlaceholder": "a-z 0-9 _ -", + "customGeoAliasesError": "Özel geo takma adları yüklenemedi", + "customGeoDelete": "Sil", + "customGeoDeleteConfirm": "Bu özel geo kaynağını silinsin mi?", + "customGeoDownload": "Şimdi güncelle", + "customGeoEdit": "Düzenle", + "customGeoEmpty": "Henüz özel geo kaynağı yok — oluşturmak için Ekle'ye tıklayın", + "customGeoEnabled": "Etkin", + "customGeoErrAliasPattern": "Takma ad izin verilmeyen karakterler içeriyor", + "customGeoErrAliasRequired": "Takma ad gerekli", + "customGeoErrAliasReserved": "Bu takma ad ayrılmış", + "customGeoErrDownload": "İndirme başarısız", + "customGeoErrDuplicateAlias": "Bu takma ad bu tür için zaten kullanılıyor", + "customGeoErrInvalidType": "Tür geosite veya geoip olmalıdır", + "customGeoErrInvalidUrl": "URL geçersiz", + "customGeoErrNotFound": "Özel geo kaynağı bulunamadı", + "customGeoErrUpdateAllIncomplete": "Bir veya daha fazla özel geo kaynağı güncellenemedi", + "customGeoErrUrlHost": "URL ana bilgisayarı geçersiz", + "customGeoErrUrlRequired": "URL gerekli", + "customGeoErrUrlScheme": "URL http veya https kullanmalıdır", + "customGeoExtColumn": "Yönlendirme (ext:…)", + "customGeoInvalidId": "Geçersiz kaynak kimliği", + "customGeoLastUpdated": "Son güncelleme", + "customGeoModalAdd": "Özel geo ekle", + "customGeoModalEdit": "Özel geo düzenle", + "customGeoModalSave": "Kaydet", + "customGeoRoutingHint": "Yönlendirme kurallarında değer sütununu ext:dosya.dat:etiket olarak kullanın (etiketi değiştirin).", + "customGeoTitle": "Özel GeoSite / GeoIP", + "customGeoToastAdd": "Özel geo ekle", + "customGeoToastDelete": "Özel geofile \"{{ .fileName }}\" silindi", + "customGeoToastDownload": "\"{{ .fileName }}\" geofile güncellendi", + "customGeoToastList": "Özel geo listesi", + "customGeoToastUpdate": "Özel geo güncelle", + "customGeoToastUpdateAll": "Tüm özel kaynaklar güncellendi", + "customGeoType": "Tür", + "customGeoUrl": "URL", + "customGeoValidationAlias": "Takma ad yalnızca küçük harf, rakam, - ve _ içerebilir", + "customGeoValidationUrl": "URL http:// veya https:// ile başlamalıdır", + "documentation": "Dokümantasyon", + "dontRefresh": "Kurulum devam ediyor, lütfen bu sayfayı yenilemeyin", + "download": "İndirme", + "exportDatabase": "Yedekle", + "exportDatabaseDesc": "Mevcut veritabanınızın yedeğini içeren bir .db dosyasını cihazınıza indirmek için tıklayın.", + "frequency": "Frekans", + "geofileUpdateDialog": "Geofile'ı gerçekten güncellemek istiyor musunuz?", + "geofileUpdateDialogDesc": "Bu işlem #filename# dosyasını güncelleyecektir.", + "geofileUpdatePopover": "Geofile başarıyla güncellendi", + "geofilesUpdateAll": "Tümünü güncelle", + "geofilesUpdateDialogDesc": "Bu, tüm dosyaları güncelleyecektir.", + "getConfigError": "Yapılandırma dosyası alınırken bir hata oluştu", + "getDatabaseError": "Veritabanı alınırken bir hata oluştu", + "importDatabase": "Geri Yükle", + "importDatabaseDesc": "Cihazınızdan bir .db dosyası seçip yükleyerek veritabanınızı yedekten geri yüklemek için tıklayın.", + "importDatabaseError": "Veritabanı içe aktarılırken bir hata oluştu", + "importDatabaseSuccess": "Veritabanı başarıyla içe aktarıldı", + "ipAddresses": "IP adresleri", + "latestPanelVersion": "Panelin en son sürümü", + "logicalProcessors": "Mantıksal işlemciler", + "logs": "Günlükler", + "memory": "RAM", + "operationHours": "Çalışma Süresi", + "overallSpeed": "Genel hız", + "panelUpToDate": "Panel güncel", + "panelUpdateCheckPopover": "Panel güncelleme kontrolü başarısız oldu", + "panelUpdateDesc": "Bu, 3X-UI'yi en son sürüme güncelleyecek ve panel servisini yeniden başlatacaktır.", + "panelUpdateDialog": "Gerçekten paneli güncellemek istiyor musunuz?", + "panelUpdateDialogDesc": "Bu, 3X-UI'yi #version# sürümüne güncelleyecek ve panel servisini yeniden başlatacaktır.", + "panelUpdateStartedPopover": "Panel güncellemesi başlatıldı", + "readDatabaseError": "Veritabanı okunurken bir hata oluştu", + "received": "Alınan", + "restartXray": "Yeniden Başlat", + "sent": "Gönderilen", + "stopXray": "Durdur", + "storage": "Depolama", + "swap": "Takas", + "systemHistoryTitle": "Sistem Geçmişi", + "systemLoad": "Sistem Yükü", + "systemLoadDesc": "Geçmiş 1, 5 ve 15 dakika için sistem yük ortalaması", + "threads": "İş parçacıkları", + "title": "Genel Bakış", + "toggleIpVisibility": "IP görünürlüğünü değiştir", + "totalData": "Toplam veri", + "trendLast2Min": "Son 2 dakika", + "upToDate": "Güncel", + "updatePanel": "Paneli Güncelle", + "upload": "Yükleme", + "xrayErrorPopoverTitle": "Xray çalıştırılırken bir hata oluştu", + "xrayMetricsDisabled": "Xray metrik uç noktası yapılandırılmadı", + "xrayMetricsHint": "xray yapılandırmasına tag metrics_out ve listen 127.0.0.1:11111 olan üst düzey bir metrics bloğu ekleyin, sonra xray'i yeniden başlatın.", + "xrayMetricsTitle": "Xray Metrikleri", + "xrayObservatoryAlive": "Aktif", + "xrayObservatoryDead": "Kapalı", + "xrayObservatoryEmpty": "Henüz Observatory verisi yok", + "xrayObservatoryHint": "xray yapılandırmasına test edilecek outbound etiketlerini listeleyen bir observatory bloğu ekleyin, sonra xray'i yeniden başlatın.", + "xrayObservatoryLastSeen": "Son görülme", + "xrayObservatoryLastTry": "Son deneme", + "xrayObservatoryTagPlaceholder": "Outbound seç", + "xrayStatus": "Xray", + "xrayStatusError": "Hata", + "xrayStatusRunning": "Çalışıyor", + "xrayStatusStop": "Durduruldu", + "xrayStatusUnknown": "Bilinmiyor", + "xraySwitch": "Sürüm", + "xraySwitchClick": "Geçiş yapmak istediğiniz sürümü seçin.", + "xraySwitchClickDesk": "Dikkatli seçin, eski sürümler mevcut yapılandırmalarla uyumlu olmayabilir.", + "xraySwitchVersionDialog": "Xray sürümünü gerçekten değiştirmek istiyor musunuz?", + "xraySwitchVersionDialogDesc": "Bu işlem Xray sürümünü #version# olarak değiştirecektir.", + "xraySwitchVersionPopover": "Xray başarıyla güncellendi", + "xrayUpdates": "Xray Güncellemeleri" + }, + "login": { + "hello": "Merhaba", + "loginAgain": "Oturum süreniz doldu, lütfen tekrar giriş yapın", + "title": "Hoş Geldiniz", + "toasts": { + "emptyPassword": "Şifre gerekli", + "emptyUsername": "Kullanıcı adı gerekli", + "invalidFormData": "Girdi verisi formatı geçersiz.", + "successLogin": "Hesabınıza başarıyla giriş yaptınız.", + "wrongUsernameOrPassword": "Geçersiz kullanıcı adı, şifre veya iki adımlı doğrulama kodu." + } }, "nodes": { - "title": "Düğümler", + "actions": "İşlemler", "addNode": "Düğüm Ekle", - "editNode": "Düğümü Düzenle", - "totalNodes": "Toplam Düğüm", - "onlineNodes": "Çevrimiçi", - "offlineNodes": "Çevrimdışı", + "address": "Adres", + "addressPlaceholder": "panel.example.com veya 1.2.3.4", + "apiToken": "API Token", + "apiTokenHint": "Uzak panel API token'ını Ayarlar → API Token altında gösterir.", + "apiTokenPlaceholder": "Uzak panelin Ayarlar sayfasındaki token", "avgLatency": "Ortalama Gecikme", + "basePath": "Temel Yol", + "connectionFailed": "Bağlantı başarısız", + "connectionOk": "Bağlantı tamam ({ms} ms)", + "cpu": "CPU", + "deleteConfirmContent": "Bu, düğüm izlemeyi durdurur. Uzak panelin kendisi etkilenmez.", + "deleteConfirmTitle": "\"{name}\" düğümü silinsin mi?", + "editNode": "Düğümü Düzenle", + "enable": "Etkin", + "justNow": "şimdi", + "lastHeartbeat": "Son Sinyal", + "latency": "Gecikme", + "mem": "Bellek", "name": "Ad", "namePlaceholder": "ör. de-frankfurt-1", - "addressPlaceholder": "panel.example.com veya 1.2.3.4", - "remark": "Açıklama", - "scheme": "Şema", - "address": "Adres", + "never": "asla", + "offlineNodes": "Çevrimdışı", + "onlineNodes": "Çevrimiçi", "port": "Port", - "basePath": "Temel Yol", - "apiToken": "API Token", - "apiTokenPlaceholder": "Uzak panelin Ayarlar sayfasındaki token", - "apiTokenHint": "Uzak panel API token'ını Ayarlar → API Token altında gösterir.", + "probe": "Şimdi Test Et", "regenerate": "Token'ı Yeniden Oluştur", "regenerateConfirm": "Yeniden oluşturmak mevcut token'ı geçersiz kılar. Onu kullanan tüm merkezi paneller, güncellenene kadar erişimini kaybeder. Devam edilsin mi?", - "enable": "Etkin", + "remark": "Açıklama", + "scheme": "Şema", "status": "Durum", - "cpu": "CPU", - "mem": "Bellek", - "uptime": "Çalışma Süresi", - "latency": "Gecikme", - "lastHeartbeat": "Son Sinyal", - "xrayVersion": "Xray Sürümü", - "actions": "İşlemler", - "probe": "Şimdi Test Et", - "testConnection": "Bağlantıyı Test Et", - "connectionOk": "Bağlantı tamam ({ms} ms)", - "connectionFailed": "Bağlantı başarısız", - "never": "asla", - "justNow": "şimdi", - "deleteConfirmTitle": "\"{name}\" düğümü silinsin mi?", - "deleteConfirmContent": "Bu, düğüm izlemeyi durdurur. Uzak panelin kendisi etkilenmez.", "statusValues": { - "online": "Çevrimiçi", "offline": "Çevrimdışı", + "online": "Çevrimiçi", "unknown": "Bilinmiyor" }, + "testConnection": "Bağlantıyı Test Et", + "title": "Düğümler", "toasts": { - "list": "Düğümler yüklenemedi", - "obtain": "Düğüm yüklenemedi", "add": "Düğüm ekle", - "update": "Düğümü güncelle", "delete": "Düğümü sil", "deleted": "Düğüm silindi", - "test": "Bağlantıyı test et", "fillRequired": "Ad, adres, port ve API token gereklidir", - "probeFailed": "Test başarısız" - } + "list": "Düğümler yüklenemedi", + "obtain": "Düğüm yüklenemedi", + "probeFailed": "Test başarısız", + "test": "Bağlantıyı test et", + "update": "Düğümü güncelle" + }, + "totalNodes": "Toplam Düğüm", + "uptime": "Çalışma Süresi", + "xrayVersion": "Xray Sürümü" }, "settings": { - "title": "Panel Ayarları", - "save": "Kaydet", - "infoDesc": "Burada yapılan her değişikliğin kaydedilmesi gerekir. Değişikliklerin uygulanması için paneli yeniden başlatın.", - "restartPanel": "Paneli Yeniden Başlat", - "restartPanelDesc": "Paneli yeniden başlatmak istediğinizden emin misiniz? Yeniden başlattıktan sonra panele erişemezseniz, sunucudaki panel günlük bilgilerini görüntüleyin.", - "restartPanelSuccess": "Panel başarıyla yeniden başlatıldı", - "actions": "Eylemler", - "resetDefaultConfig": "Varsayılana Sıfırla", - "panelSettings": "Genel", - "securitySettings": "Kimlik Doğrulama", "TGBotSettings": "Telegram Bot", - "panelListeningIP": "Dinleme IP", - "panelListeningIPDesc": "Web paneli için IP adresi. (tüm IP'leri dinlemek için boş bırakın)", - "panelListeningDomain": "Dinleme Alan Adı", - "panelListeningDomainDesc": "Web paneli için alan adı. (tüm alan adlarını ve IP'leri dinlemek için boş bırakın)", - "panelPort": "Dinleme Portu", - "panelPortDesc": "Web paneli için port numarası. (kullanılmayan bir port olmalıdır)", - "publicKeyPath": "Genel Anahtar Yolu", - "publicKeyPathDesc": "Web paneli için genel anahtar dosya yolu. ('/' ile başlar)", - "privateKeyPath": "Özel Anahtar Yolu", - "privateKeyPathDesc": "Web paneli için özel anahtar dosya yolu. ('/' ile başlar)", - "panelUrlPath": "URI Yolu", - "panelUrlPathDesc": "Web paneli için URI yolu. ('/' ile başlar ve '/' ile biter)", - "pageSize": "Sayfa Boyutu", - "pageSizeDesc": "Gelenler tablosu için sayfa boyutunu belirleyin. (0 = devre dışı)", - "remarkModel": "Açıklama Modeli & Ayırma Karakteri", - "datepicker": "Takvim Türü", - "datepickerPlaceholder": "Tarih Seçin", - "datepickerDescription": "Planlanmış görevler bu takvime göre çalışacaktır.", - "sampleRemark": "Örnek Açıklama", - "oldUsername": "Mevcut Kullanıcı Adı", + "actions": "Eylemler", + "certs": "Sertifikalar", "currentPassword": "Mevcut Şifre", - "newUsername": "Yeni Kullanıcı Adı", - "newPassword": "Yeni Şifre", - "telegramBotEnable": "Telegram Botunu Etkinleştir", - "telegramBotEnableDesc": "Telegram botunu etkinleştirir.", - "telegramToken": "Telegram Token", - "telegramTokenDesc": "'{'@'}BotFather'dan alınan Telegram bot token.", - "telegramProxy": "SOCKS Proxy", - "telegramProxyDesc": "Telegram'a bağlanmak için SOCKS5 proxy'sini etkinleştirir. (ayarları kılavuzda belirtilen şekilde ayarlayın)", - "telegramAPIServer": "Telegram API Server", - "telegramAPIServerDesc": "Kullanılacak Telegram API sunucusu. Varsayılan sunucuyu kullanmak için boş bırakın.", - "telegramChatId": "Yönetici Sohbet Kimliği", - "telegramChatIdDesc": "Telegram Yönetici Sohbet Kimliği(leri). (virgülle ayrılmış)(buradan alın {'@'}userinfobot) veya (botta '/id' komutunu kullanın)", - "telegramNotifyTime": "Bildirim Zamanı", - "telegramNotifyTimeDesc": "Periyodik raporlar için ayarlanan Telegram bot bildirim zamanı. (crontab zaman formatını kullanın)", - "tgNotifyBackup": "Veritabanı Yedeği", - "tgNotifyBackupDesc": "Bir rapor ile birlikte veritabanı yedek dosyasını gönder.", - "tgNotifyLogin": "Giriş Bildirimi", - "tgNotifyLoginDesc": "Birisi web panelinize giriş yapmaya çalıştığında kullanıcı adı, IP adresi ve zaman hakkında bildirim alın.", - "sessionMaxAge": "Oturum Süresi", - "sessionMaxAgeDesc": "Giriş yaptıktan sonra oturum süresi. (birim: dakika)", + "dateAndTime": "Tarih ve Saat", + "datepicker": "Takvim Türü", + "datepickerDescription": "Planlanmış görevler bu takvime göre çalışacaktır.", + "datepickerPlaceholder": "Tarih Seçin", + "direct": "Doğrudan Bağlantı", + "directDesc": "Belirli bir ülkenin alan adları veya IP aralıkları ile doğrudan bağlantı kurar.", "expireTimeDiff": "Son Kullanma Tarihi Bildirimi", "expireTimeDiffDesc": "Bu eşik seviyesine ulaşıldığında son kullanma tarihi hakkında bildirim alın. (birim: gün)", - "trafficDiff": "Trafik Sınırı Bildirimi", - "trafficDiffDesc": "Bu eşik seviyesine ulaşıldığında trafik sınırı hakkında bildirim alın. (birim: GB)", - "tgNotifyCpu": "CPU Yükü Bildirimi", - "tgNotifyCpuDesc": "CPU yükü bu eşik seviyesini aşarsa bildirim alın. (birim: %)", - "timeZone": "Saat Dilimi", - "timeZoneDesc": "Planlanmış görevler bu saat dilimine göre çalışacaktır.", - "subSettings": "Abonelik", - "subEnable": "Abonelik Hizmetini Etkinleştir", - "subEnableDesc": "Abonelik hizmetini etkinleştirir.", - "subJsonEnable": "JSON abonelik uç noktasını bağımsız olarak Etkinleştir/Devre Dışı bırak.", - "subTitle": "Abonelik Başlığı", - "subTitleDesc": "VPN istemcisinde gösterilen başlık", - "subSupportUrl": "Destek URL'si", - "subSupportUrlDesc": "VPN istemcisinde gösterilen teknik destek bağlantısı", - "subProfileUrl": "Profil URL'si", - "subProfileUrlDesc": "VPN istemcisinde görüntülenen web sitenize giden bağlantı", - "subAnnounce": "Duyuru", - "subAnnounceDesc": "VPN istemcisinde görüntülenen duyuru metni", - "subEnableRouting": "Yönlendirmeyi etkinleştir", - "subEnableRoutingDesc": "VPN istemcisinde yönlendirmeyi etkinleştirmek için genel ayar. (Yalnızca Happ için)", - "subRoutingRules": "Yönlendirme kuralları", - "subRoutingRulesDesc": "VPN istemcisi için genel yönlendirme kuralları. (Yalnızca Happ için)", - "subListen": "Dinleme IP", - "subListenDesc": "Abonelik hizmeti için IP adresi. (tüm IP'leri dinlemek için boş bırakın)", - "subPort": "Dinleme Portu", - "subPortDesc": "Abonelik hizmeti için port numarası. (kullanılmayan bir port olmalıdır)", - "subCertPath": "Genel Anahtar Yolu", - "subCertPathDesc": "Abonelik hizmeti için genel anahtar dosya yolu. ('/' ile başlar)", - "subKeyPath": "Özel Anahtar Yolu", - "subKeyPathDesc": "Abonelik hizmeti için özel anahtar dosya yolu. ('/' ile başlar)", - "subPath": "URI Yolu", - "subPathDesc": "Abonelik hizmeti için URI yolu. ('/' ile başlar ve '/' ile biter)", - "subDomain": "Dinleme Alan Adı", - "subDomainDesc": "Abonelik hizmeti için alan adı. (tüm alan adlarını ve IP'leri dinlemek için boş bırakın)", - "subUpdates": "Güncelleme Aralıkları", - "subUpdatesDesc": "Müşteri uygulamalarındaki abonelik URL'sinin güncelleme aralıkları. (birim: saat)", - "subEncrypt": "Şifrele", - "subEncryptDesc": "Abonelik hizmetinin döndürülen içeriği Base64 ile şifrelenir.", - "subShowInfo": "Kullanım Bilgisini Göster", - "subShowInfoDesc": "Kalan trafik ve tarih müşteri uygulamalarında görüntülenir.", - "subURI": "Ters Proxy URI", - "subURIDesc": "Proxy arkasında kullanılacak abonelik URL'sinin URI yolu.", + "externalTraffic": "Harici Trafik", "externalTrafficInformEnable": "Harici Trafik Bilgisi", "externalTrafficInformEnableDesc": "Her trafik güncellemesinde harici API'yi bilgilendirin.", "externalTrafficInformURI": "Harici Trafik Bilgisi URI'si", "externalTrafficInformURIDesc": "Trafik güncellemeleri bu URI'ye gönderildi.", - "restartXrayOnClientDisable": "Otomatik Devre Dışı Sonrası Xray'i Yeniden Başlat", - "restartXrayOnClientDisableDesc": "Bir istemci süre dolumu veya trafik limiti nedeniyle otomatik devre dışı bırakıldığında Xray'i yeniden başlat.", "fragment": "Parçalama", "fragmentDesc": "TLS merhaba paketinin parçalanmasını etkinleştir.", "fragmentSett": "Parçalama Ayarları", - "noisesDesc": "Noises'i Etkinleştir.", - "noisesSett": "Noises Ayarları", + "infoDesc": "Burada yapılan her değişikliğin kaydedilmesi gerekir. Değişikliklerin uygulanması için paneli yeniden başlatın.", + "information": "Bilgi", + "intervals": "Aralıklar", + "language": "Dil", "mux": "Mux", "muxDesc": "Kurulmuş bir veri akışında birden çok bağımsız veri akışını iletir.", "muxSett": "Mux Ayarları", - "direct": "Doğrudan Bağlantı", - "directDesc": "Belirli bir ülkenin alan adları veya IP aralıkları ile doğrudan bağlantı kurar.", + "newPassword": "Yeni Şifre", + "newUsername": "Yeni Kullanıcı Adı", + "noisesDesc": "Noises'i Etkinleştir.", + "noisesSett": "Noises Ayarları", "notifications": "Bildirimler", - "certs": "Sertifikalar", - "externalTraffic": "Harici Trafik", - "dateAndTime": "Tarih ve Saat", + "oldUsername": "Mevcut Kullanıcı Adı", + "pageSize": "Sayfa Boyutu", + "pageSizeDesc": "Gelenler tablosu için sayfa boyutunu belirleyin. (0 = devre dışı)", + "panelListeningDomain": "Dinleme Alan Adı", + "panelListeningDomainDesc": "Web paneli için alan adı. (tüm alan adlarını ve IP'leri dinlemek için boş bırakın)", + "panelListeningIP": "Dinleme IP", + "panelListeningIPDesc": "Web paneli için IP adresi. (tüm IP'leri dinlemek için boş bırakın)", + "panelPort": "Dinleme Portu", + "panelPortDesc": "Web paneli için port numarası. (kullanılmayan bir port olmalıdır)", + "panelSettings": "Genel", + "panelUrlPath": "URI Yolu", + "panelUrlPathDesc": "Web paneli için URI yolu. ('/' ile başlar ve '/' ile biter)", + "privateKeyPath": "Özel Anahtar Yolu", + "privateKeyPathDesc": "Web paneli için özel anahtar dosya yolu. ('/' ile başlar)", "proxyAndServer": "Proxy ve Sunucu", - "intervals": "Aralıklar", - "information": "Bilgi", - "language": "Dil", - "telegramBotLanguage": "Telegram Bot Dili", + "publicKeyPath": "Genel Anahtar Yolu", + "publicKeyPathDesc": "Web paneli için genel anahtar dosya yolu. ('/' ile başlar)", + "remarkModel": "Açıklama Modeli \u0026 Ayırma Karakteri", + "resetDefaultConfig": "Varsayılana Sıfırla", + "restartPanel": "Paneli Yeniden Başlat", + "restartPanelDesc": "Paneli yeniden başlatmak istediğinizden emin misiniz? Yeniden başlattıktan sonra panele erişemezseniz, sunucudaki panel günlük bilgilerini görüntüleyin.", + "restartPanelSuccess": "Panel başarıyla yeniden başlatıldı", + "restartXrayOnClientDisable": "Otomatik Devre Dışı Sonrası Xray'i Yeniden Başlat", + "restartXrayOnClientDisableDesc": "Bir istemci süre dolumu veya trafik limiti nedeniyle otomatik devre dışı bırakıldığında Xray'i yeniden başlat.", + "sampleRemark": "Örnek Açıklama", + "save": "Kaydet", "security": { "admin": "Yönetici kimlik bilgileri", "twoFactor": "İki adımlı doğrulama", "twoFactorEnable": "2FA'yı Etkinleştir", "twoFactorEnableDesc": "Daha fazla güvenlik için ek bir doğrulama katmanı ekler.", - "twoFactorModalSetTitle": "İki adımlı doğrulamayı etkinleştir", - "twoFactorModalDeleteTitle": "İki adımlı doğrulamayı devre dışı bırak", - "twoFactorModalSteps": "İki adımlı doğrulamayı ayarlamak için şu adımları izleyin:", - "twoFactorModalFirstStep": "1. Bu QR kodunu doğrulama uygulamasında tarayın veya QR kodunun yanındaki token'ı kopyalayıp uygulamaya yapıştırın", - "twoFactorModalSecondStep": "2. Uygulamadaki kodu girin", - "twoFactorModalRemoveStep": "İki adımlı doğrulamayı kaldırmak için uygulamadaki kodu girin.", - "twoFactorModalChangeCredentialsTitle": "Kimlik bilgilerini değiştir", "twoFactorModalChangeCredentialsStep": "Yönetici kimlik bilgilerini değiştirmek için uygulamadaki kodu girin.", - "twoFactorModalSetSuccess": "İki faktörlü kimlik doğrulama başarıyla kuruldu", + "twoFactorModalChangeCredentialsTitle": "Kimlik bilgilerini değiştir", "twoFactorModalDeleteSuccess": "İki faktörlü kimlik doğrulama başarıyla silindi", - "twoFactorModalError": "Yanlış kod" + "twoFactorModalDeleteTitle": "İki adımlı doğrulamayı devre dışı bırak", + "twoFactorModalError": "Yanlış kod", + "twoFactorModalFirstStep": "1. Bu QR kodunu doğrulama uygulamasında tarayın veya QR kodunun yanındaki token'ı kopyalayıp uygulamaya yapıştırın", + "twoFactorModalRemoveStep": "İki adımlı doğrulamayı kaldırmak için uygulamadaki kodu girin.", + "twoFactorModalSecondStep": "2. Uygulamadaki kodu girin", + "twoFactorModalSetSuccess": "İki faktörlü kimlik doğrulama başarıyla kuruldu", + "twoFactorModalSetTitle": "İki adımlı doğrulamayı etkinleştir", + "twoFactorModalSteps": "İki adımlı doğrulamayı ayarlamak için şu adımları izleyin:" }, + "securitySettings": "Kimlik Doğrulama", + "sessionMaxAge": "Oturum Süresi", + "sessionMaxAgeDesc": "Giriş yaptıktan sonra oturum süresi. (birim: dakika)", + "subAnnounce": "Duyuru", + "subAnnounceDesc": "VPN istemcisinde görüntülenen duyuru metni", + "subCertPath": "Genel Anahtar Yolu", + "subCertPathDesc": "Abonelik hizmeti için genel anahtar dosya yolu. ('/' ile başlar)", + "subDomain": "Dinleme Alan Adı", + "subDomainDesc": "Abonelik hizmeti için alan adı. (tüm alan adlarını ve IP'leri dinlemek için boş bırakın)", + "subEnable": "Abonelik Hizmetini Etkinleştir", + "subEnableDesc": "Abonelik hizmetini etkinleştirir.", + "subEnableRouting": "Yönlendirmeyi etkinleştir", + "subEnableRoutingDesc": "VPN istemcisinde yönlendirmeyi etkinleştirmek için genel ayar. (Yalnızca Happ için)", + "subEncrypt": "Şifrele", + "subEncryptDesc": "Abonelik hizmetinin döndürülen içeriği Base64 ile şifrelenir.", + "subJsonEnable": "JSON abonelik uç noktasını bağımsız olarak Etkinleştir/Devre Dışı bırak.", + "subKeyPath": "Özel Anahtar Yolu", + "subKeyPathDesc": "Abonelik hizmeti için özel anahtar dosya yolu. ('/' ile başlar)", + "subListen": "Dinleme IP", + "subListenDesc": "Abonelik hizmeti için IP adresi. (tüm IP'leri dinlemek için boş bırakın)", + "subPath": "URI Yolu", + "subPathDesc": "Abonelik hizmeti için URI yolu. ('/' ile başlar ve '/' ile biter)", + "subPort": "Dinleme Portu", + "subPortDesc": "Abonelik hizmeti için port numarası. (kullanılmayan bir port olmalıdır)", + "subProfileUrl": "Profil URL'si", + "subProfileUrlDesc": "VPN istemcisinde görüntülenen web sitenize giden bağlantı", + "subRoutingRules": "Yönlendirme kuralları", + "subRoutingRulesDesc": "VPN istemcisi için genel yönlendirme kuralları. (Yalnızca Happ için)", + "subSettings": "Abonelik", + "subShowInfo": "Kullanım Bilgisini Göster", + "subShowInfoDesc": "Kalan trafik ve tarih müşteri uygulamalarında görüntülenir.", + "subSupportUrl": "Destek URL'si", + "subSupportUrlDesc": "VPN istemcisinde gösterilen teknik destek bağlantısı", + "subTitle": "Abonelik Başlığı", + "subTitleDesc": "VPN istemcisinde gösterilen başlık", + "subURI": "Ters Proxy URI", + "subURIDesc": "Proxy arkasında kullanılacak abonelik URL'sinin URI yolu.", + "subUpdates": "Güncelleme Aralıkları", + "subUpdatesDesc": "Müşteri uygulamalarındaki abonelik URL'sinin güncelleme aralıkları. (birim: saat)", + "telegramAPIServer": "Telegram API Server", + "telegramAPIServerDesc": "Kullanılacak Telegram API sunucusu. Varsayılan sunucuyu kullanmak için boş bırakın.", + "telegramBotEnable": "Telegram Botunu Etkinleştir", + "telegramBotEnableDesc": "Telegram botunu etkinleştirir.", + "telegramBotLanguage": "Telegram Bot Dili", + "telegramChatId": "Yönetici Sohbet Kimliği", + "telegramChatIdDesc": "Telegram Yönetici Sohbet Kimliği(leri). (virgülle ayrılmış)(buradan alın {'@'}userinfobot) veya (botta '/id' komutunu kullanın)", + "telegramNotifyTime": "Bildirim Zamanı", + "telegramNotifyTimeDesc": "Periyodik raporlar için ayarlanan Telegram bot bildirim zamanı. (crontab zaman formatını kullanın)", + "telegramProxy": "SOCKS Proxy", + "telegramProxyDesc": "Telegram'a bağlanmak için SOCKS5 proxy'sini etkinleştirir. (ayarları kılavuzda belirtilen şekilde ayarlayın)", + "telegramToken": "Telegram Token", + "telegramTokenDesc": "'{'@'}BotFather'dan alınan Telegram bot token.", + "tgNotifyBackup": "Veritabanı Yedeği", + "tgNotifyBackupDesc": "Bir rapor ile birlikte veritabanı yedek dosyasını gönder.", + "tgNotifyCpu": "CPU Yükü Bildirimi", + "tgNotifyCpuDesc": "CPU yükü bu eşik seviyesini aşarsa bildirim alın. (birim: %)", + "tgNotifyLogin": "Giriş Bildirimi", + "tgNotifyLoginDesc": "Birisi web panelinize giriş yapmaya çalıştığında kullanıcı adı, IP adresi ve zaman hakkında bildirim alın.", + "timeZone": "Saat Dilimi", + "timeZoneDesc": "Planlanmış görevler bu saat dilimine göre çalışacaktır.", + "title": "Panel Ayarları", "toasts": { - "modifySettings": "Parametreler değiştirildi.", - "getSettings": "Parametreler alınırken bir hata oluştu.", - "modifyUserError": "Yönetici kimlik bilgileri değiştirilirken bir hata oluştu.", - "modifyUser": "Yönetici kimlik bilgilerini başarıyla değiştirdiniz.", - "originalUserPassIncorrect": "Mevcut kullanıcı adı veya şifre geçersiz", - "userPassMustBeNotEmpty": "Yeni kullanıcı adı ve şifre boş olamaz", "getOutboundTrafficError": "Giden trafik alınırken hata", - "resetOutboundTrafficError": "Giden trafik sıfırlanırken hata" - } + "getSettings": "Parametreler alınırken bir hata oluştu.", + "modifySettings": "Parametreler değiştirildi.", + "modifyUser": "Yönetici kimlik bilgilerini başarıyla değiştirdiniz.", + "modifyUserError": "Yönetici kimlik bilgileri değiştirilirken bir hata oluştu.", + "originalUserPassIncorrect": "Mevcut kullanıcı adı veya şifre geçersiz", + "resetOutboundTrafficError": "Giden trafik sıfırlanırken hata", + "userPassMustBeNotEmpty": "Yeni kullanıcı adı ve şifre boş olamaz" + }, + "trafficDiff": "Trafik Sınırı Bildirimi", + "trafficDiffDesc": "Bu eşik seviyesine ulaşıldığında trafik sınırı hakkında bildirim alın. (birim: GB)" }, "xray": { - "title": "Xray Yapılandırmaları", - "save": "Kaydet", - "restart": "Xray'i Yeniden Başlat", - "restartSuccess": "Xray başarıyla yeniden başlatıldı", - "stopSuccess": "Xray başarıyla durduruldu", - "restartError": "Xray yeniden başlatılırken bir hata oluştu.", - "stopError": "Xray durdurulurken bir hata oluştu.", - "basicTemplate": "Temeller", - "advancedTemplate": "Gelişmiş", - "generalConfigs": "Genel", - "generalConfigsDesc": "Bu seçenekler genel ayarlamaları belirler.", - "logConfigs": "Günlük", - "logConfigsDesc": "Günlükler sunucunuzun verimliliğini etkileyebilir. Yalnızca ihtiyaç durumunda akıllıca etkinleştirmeniz önerilir", - "blockConfigsDesc": "Bu seçenekler belirli istek protokolleri ve web siteleri temelinde trafiği engeller.", - "basicRouting": "Temel Yönlendirme", - "blockConnectionsConfigsDesc": "Bu seçenekler belirli bir istenen ülkeye göre trafiği engelleyecektir.", - "directConnectionsConfigsDesc": "Doğrudan bağlantı, belirli bir trafiğin başka bir sunucu üzerinden yönlendirilmediğini sağlar.", - "blockips": "IP'leri Engelle", - "blockdomains": "Alan Adlarını Engelle", - "directips": "Doğrudan IP'ler", - "directdomains": "Doğrudan Alan Adları", - "ipv4Routing": "IPv4 Yönlendirme", - "ipv4RoutingDesc": "Bu seçenekler belirli bir varış yerine IPv4 üzerinden trafiği yönlendirir.", - "warpRouting": "WARP Yönlendirme", - "warpRoutingDesc": "Bu seçenekler belirli bir varış yerine WARP üzerinden trafiği yönlendirir.", - "nordRouting": "NordVPN Yönlendirme", - "nordRoutingDesc": "Bu seçenekler belirli bir varış yerine NordVPN üzerinden trafiği yönlendirir.", - "Template": "Gelişmiş Xray Yapılandırma Şablonu", - "TemplateDesc": "Nihai Xray yapılandırma dosyası bu şablona göre oluşturulacaktır.", + "Balancers": "Dengeler", "FreedomStrategy": "Freedom Protokol Stratejisi", "FreedomStrategyDesc": "Freedom Protokolünde ağın çıkış stratejisini ayarlayın.", - "RoutingStrategy": "Genel Yönlendirme Stratejisi", - "RoutingStrategyDesc": "Tüm istekleri çözmek için genel trafik yönlendirme stratejisini ayarlayın.", - "outboundTestUrl": "Outbound test URL", - "outboundTestUrlDesc": "Outbound bağlantı testinde kullanılan URL", - "Torrent": "BitTorrent Protokolünü Engelle", "Inbounds": "Gelenler", "InboundsDesc": "Belirli müşterileri kabul eder.", "Outbounds": "Gidenler", - "Balancers": "Dengeler", "OutboundsDesc": "Giden trafiğin yolunu ayarlayın.", + "RoutingStrategy": "Genel Yönlendirme Stratejisi", + "RoutingStrategyDesc": "Tüm istekleri çözmek için genel trafik yönlendirme stratejisini ayarlayın.", "Routings": "Yönlendirme Kuralları", "RoutingsDesc": "Her kuralın önceliği önemlidir!", - "completeTemplate": "Tümü", - "logLevel": "Günlük Seviyesi", - "logLevelDesc": "Hata günlükleri için günlük seviyesi, kaydedilmesi gereken bilgileri belirtir.", + "Template": "Gelişmiş Xray Yapılandırma Şablonu", + "TemplateDesc": "Nihai Xray yapılandırma dosyası bu şablona göre oluşturulacaktır.", + "Torrent": "BitTorrent Protokolünü Engelle", "accessLog": "Erişim Günlüğü", "accessLogDesc": "Erişim günlüğü için dosya yolu. 'none' özel değeri erişim günlüklerini devre dışı bırakır", - "errorLog": "Hata Günlüğü", - "errorLogDesc": "Hata günlüğü için dosya yolu. 'none' özel değeri hata günlüklerini devre dışı bırakır", - "dnsLog": "DNS Günlüğü", - "dnsLogDesc": "DNS sorgu günlüklerini etkinleştirin", - "maskAddress": "Adres Maskesi", - "maskAddressDesc": "IP adresi maskesi, etkinleştirildiğinde, günlükte görünen IP adresini otomatik olarak değiştirecektir.", - "statistics": "İstatistikler", - "statsInboundUplink": "Gelen Yükleme İstatistikleri", - "statsInboundUplinkDesc": "Tüm gelen proxy'lerin yükleme trafiği için istatistik toplamayı etkinleştirir.", - "statsInboundDownlink": "Gelen İndirme İstatistikleri", - "statsInboundDownlinkDesc": "Tüm gelen proxy'lerin indirme trafiği için istatistik toplamayı etkinleştirir.", - "statsOutboundUplink": "Giden Yükleme İstatistikleri", - "statsOutboundUplinkDesc": "Tüm giden proxy'lerin yükleme trafiği için istatistik toplamayı etkinleştirir.", - "statsOutboundDownlink": "Giden İndirme İstatistikleri", - "statsOutboundDownlinkDesc": "Tüm giden proxy'lerin indirme trafiği için istatistik toplamayı etkinleştirir.", - "rules": { - "first": "İlk", - "last": "Son", - "up": "Yukarı", - "down": "Aşağı", - "source": "Kaynak", - "dest": "Hedef", - "inbound": "Gelen", - "outbound": "Giden", - "balancer": "Dengeler", - "info": "Bilgi", - "add": "Kural Ekle", - "edit": "Kuralı Düzenle", - "useComma": "Virgülle ayrılmış öğeler" - }, - "outbound": { - "addOutbound": "Giden Ekle", - "addReverse": "Ters Ekle", - "editOutbound": "Gideni Düzenle", - "editReverse": "Tersi Düzenle", - "reverseTag": "Ters Etiket", - "reverseTagDesc": "VLESS basit ters proxy çıkış etiketi. Devre dışı bırakmak için boş bırakın.", - "reverseTagPlaceholder": "çıkış etiketi (boş = devre dışı)", - "tag": "Etiket", - "tagDesc": "Benzersiz Etiket", - "address": "Adres", - "reverse": "Ters", - "domain": "Alan Adı", - "type": "Tür", - "bridge": "Köprü", - "portal": "Portal", - "link": "Bağlantı", - "intercon": "Bağlantı", - "settings": "Ayarlar", - "accountInfo": "Hesap Bilgileri", - "outboundStatus": "Giden Durumu", - "sendThrough": "Üzerinden Gönder", - "test": "Test", - "testResult": "Test Sonucu", - "testing": "Bağlantı test ediliyor...", - "testSuccess": "Test başarılı", - "testFailed": "Test başarısız", - "testError": "Giden test edilemedi", - "nordvpn": "NordVPN", - "accessToken": "Erişim Jetonu", - "country": "Ülke", - "server": "Sunucu", - "city": "Şehir", - "allCities": "Tüm Şehirler", - "privateKey": "Özel Anahtar", - "load": "Yük" - }, + "advancedTemplate": "Gelişmiş", "balancer": { "addBalancer": "Dengeleyici Ekle", - "editBalancer": "Dengeleyiciyi Düzenle", - "balancerStrategy": "Strateji", + "balancerDesc": "Dengeleyici Etiketi ve Giden Etiketi aynı anda kullanılamaz. Aynı anda kullanıldığında yalnızca giden etiketi çalışır.", "balancerSelectors": "Seçiciler", + "balancerStrategy": "Strateji", + "editBalancer": "Dengeleyiciyi Düzenle", "tag": "Etiket", - "tagDesc": "Benzersiz Etiket", - "balancerDesc": "Dengeleyici Etiketi ve Giden Etiketi aynı anda kullanılamaz. Aynı anda kullanıldığında yalnızca giden etiketi çalışır." - }, - "wireguard": { - "secretKey": "Gizli Anahtar", - "publicKey": "Genel Anahtar", - "allowedIPs": "İzin Verilen IP'ler", - "endpoint": "Uç Nokta", - "psk": "Ön Paylaşılan Anahtar", - "domainStrategy": "Alan Adı Stratejisi" - }, - "tun": { - "nameDesc": "TUN arabiriminin adı. Varsayılan değer 'xray0'dir", - "mtuDesc": "Maksimum İletim Birimi. Veri paketlerinin maksimum boyutu. Varsayılan değer 1500'dür", - "userLevel": "Kullanıcı Seviyesi", - "userLevelDesc": "Bu giriş yoluyla yapılan tüm bağlantılar bu kullanıcı seviyesini kullanacaktır. Varsayılan değer 0'dır" + "tagDesc": "Benzersiz Etiket" }, + "basicRouting": "Temel Yönlendirme", + "basicTemplate": "Temeller", + "blockConfigsDesc": "Bu seçenekler belirli istek protokolleri ve web siteleri temelinde trafiği engeller.", + "blockConnectionsConfigsDesc": "Bu seçenekler belirli bir istenen ülkeye göre trafiği engelleyecektir.", + "blockdomains": "Alan Adlarını Engelle", + "blockips": "IP'leri Engelle", + "completeTemplate": "Tümü", + "directConnectionsConfigsDesc": "Doğrudan bağlantı, belirli bir trafiğin başka bir sunucu üzerinden yönlendirilmediğini sağlar.", + "directdomains": "Doğrudan Alan Adları", + "directips": "Doğrudan IP'ler", "dns": { - "enable": "DNS'yi Etkinleştir", - "enableDesc": "Dahili DNS sunucusunu etkinleştir", - "tag": "DNS Gelen Etiketi", - "tagDesc": "Bu etiket, yönlendirme kurallarında Gelen etiketi olarak kullanılabilir.", + "add": "Sunucu Ekle", + "clearAll": "Tümünü Sil", + "clearAllConfirm": "Bu, tüm DNS sunucularını listeden kaldırır. Geri alınamaz.", + "clearAllTitle": "Tüm DNS sunucularını sil?", "clientIp": "İstemci IP", "clientIpDesc": "DNS sorguları sırasında belirtilen IP konumunu sunucuya bildirmek için kullanılır", "disableCache": "Önbelleği devre dışı bırak", @@ -753,217 +607,371 @@ "disableFallbackDesc": "Yedek DNS sorgularını devre dışı bırakır", "disableFallbackIfMatch": "Eşleşirse Yedeklemeyi Devre Dışı Bırak", "disableFallbackIfMatchDesc": "DNS sunucusunun eşleşen alan adı listesi vurulduğunda yedek DNS sorgularını devre dışı bırakır", + "dnsPresetFamily": "Aile", + "dnsPresetTitle": "DNS Şablonları", + "domains": "Alan Adları", + "edit": "Sunucuyu Düzenle", + "enable": "DNS'yi Etkinleştir", + "enableDesc": "Dahili DNS sunucusunu etkinleştir", "enableParallelQuery": "Paralel Sorguyu Etkinleştir", "enableParallelQueryDesc": "Daha hızlı çözümleme için birden fazla sunucuya paralel DNS sorgularını etkinleştir", - "strategy": "Sorgu Stratejisi", - "strategyDesc": "Alan adlarını çözmek için genel strateji", - "add": "Sunucu Ekle", - "edit": "Sunucuyu Düzenle", - "domains": "Alan Adları", "expectIPs": "Beklenen IP'ler", - "unexpectIPs": "Beklenmeyen IP'ler", - "useSystemHosts": "Sistem Hosts'larını Kullan", - "useSystemHostsDesc": "Yüklü bir sistemden hosts dosyasını kullan", - "usePreset": "Şablon kullan", - "dnsPresetTitle": "DNS Şablonları", - "dnsPresetFamily": "Aile", - "serveStale": "Süresi Dolmuş Sonuçları Sun", - "serveStaleDesc": "Arka planda yenilenirken süresi dolmuş önbellek sonuçlarını döndür", - "serveExpiredTTL": "Süresi Dolmuş TTL", - "serveExpiredTTLDesc": "Süresi dolmuş önbellek girdilerinin geçerlilik süresi (saniye); 0 = asla", - "timeoutMs": "Zaman aşımı (ms)", - "skipFallback": "Yedekleri Atla", "finalQuery": "Son Sorgu", "hosts": "Hosts", "hostsAdd": "Host Ekle", - "hostsEmpty": "Tanımlı Host yok", "hostsDomain": "Alan adı (ör. domain:example.com)", + "hostsEmpty": "Tanımlı Host yok", "hostsValues": "IP veya alan adı — yazıp Enter'a basın", - "clearAll": "Tümünü Sil", - "clearAllTitle": "Tüm DNS sunucularını sil?", - "clearAllConfirm": "Bu, tüm DNS sunucularını listeden kaldırır. Geri alınamaz." + "serveExpiredTTL": "Süresi Dolmuş TTL", + "serveExpiredTTLDesc": "Süresi dolmuş önbellek girdilerinin geçerlilik süresi (saniye); 0 = asla", + "serveStale": "Süresi Dolmuş Sonuçları Sun", + "serveStaleDesc": "Arka planda yenilenirken süresi dolmuş önbellek sonuçlarını döndür", + "skipFallback": "Yedekleri Atla", + "strategy": "Sorgu Stratejisi", + "strategyDesc": "Alan adlarını çözmek için genel strateji", + "tag": "DNS Gelen Etiketi", + "tagDesc": "Bu etiket, yönlendirme kurallarında Gelen etiketi olarak kullanılabilir.", + "timeoutMs": "Zaman aşımı (ms)", + "unexpectIPs": "Beklenmeyen IP'ler", + "usePreset": "Şablon kullan", + "useSystemHosts": "Sistem Hosts'larını Kullan", + "useSystemHostsDesc": "Yüklü bir sistemden hosts dosyasını kullan" }, + "dnsLog": "DNS Günlüğü", + "dnsLogDesc": "DNS sorgu günlüklerini etkinleştirin", + "errorLog": "Hata Günlüğü", + "errorLogDesc": "Hata günlüğü için dosya yolu. 'none' özel değeri hata günlüklerini devre dışı bırakır", "fakedns": { "add": "Sahte DNS Ekle", "edit": "Sahte DNS'i Düzenle", "ipPool": "IP Havuzu Alt Ağı", "poolSize": "Havuz Boyutu" + }, + "generalConfigs": "Genel", + "generalConfigsDesc": "Bu seçenekler genel ayarlamaları belirler.", + "ipv4Routing": "IPv4 Yönlendirme", + "ipv4RoutingDesc": "Bu seçenekler belirli bir varış yerine IPv4 üzerinden trafiği yönlendirir.", + "logConfigs": "Günlük", + "logConfigsDesc": "Günlükler sunucunuzun verimliliğini etkileyebilir. Yalnızca ihtiyaç durumunda akıllıca etkinleştirmeniz önerilir", + "logLevel": "Günlük Seviyesi", + "logLevelDesc": "Hata günlükleri için günlük seviyesi, kaydedilmesi gereken bilgileri belirtir.", + "maskAddress": "Adres Maskesi", + "maskAddressDesc": "IP adresi maskesi, etkinleştirildiğinde, günlükte görünen IP adresini otomatik olarak değiştirecektir.", + "nordRouting": "NordVPN Yönlendirme", + "nordRoutingDesc": "Bu seçenekler belirli bir varış yerine NordVPN üzerinden trafiği yönlendirir.", + "outbound": { + "accessToken": "Erişim Jetonu", + "accountInfo": "Hesap Bilgileri", + "addOutbound": "Giden Ekle", + "addReverse": "Ters Ekle", + "address": "Adres", + "allCities": "Tüm Şehirler", + "bridge": "Köprü", + "city": "Şehir", + "country": "Ülke", + "domain": "Alan Adı", + "editOutbound": "Gideni Düzenle", + "editReverse": "Tersi Düzenle", + "intercon": "Bağlantı", + "link": "Bağlantı", + "load": "Yük", + "nordvpn": "NordVPN", + "outboundStatus": "Giden Durumu", + "portal": "Portal", + "privateKey": "Özel Anahtar", + "reverse": "Ters", + "reverseTag": "Ters Etiket", + "reverseTagDesc": "VLESS basit ters proxy çıkış etiketi. Devre dışı bırakmak için boş bırakın.", + "reverseTagPlaceholder": "çıkış etiketi (boş = devre dışı)", + "sendThrough": "Üzerinden Gönder", + "server": "Sunucu", + "settings": "Ayarlar", + "tag": "Etiket", + "tagDesc": "Benzersiz Etiket", + "test": "Test", + "testError": "Giden test edilemedi", + "testFailed": "Test başarısız", + "testResult": "Test Sonucu", + "testSuccess": "Test başarılı", + "testing": "Bağlantı test ediliyor...", + "type": "Tür" + }, + "outboundTestUrl": "Outbound test URL", + "outboundTestUrlDesc": "Outbound bağlantı testinde kullanılan URL", + "restart": "Xray'i Yeniden Başlat", + "restartError": "Xray yeniden başlatılırken bir hata oluştu.", + "restartSuccess": "Xray başarıyla yeniden başlatıldı", + "rules": { + "add": "Kural Ekle", + "balancer": "Dengeler", + "dest": "Hedef", + "down": "Aşağı", + "edit": "Kuralı Düzenle", + "first": "İlk", + "inbound": "Gelen", + "info": "Bilgi", + "last": "Son", + "outbound": "Giden", + "source": "Kaynak", + "up": "Yukarı", + "useComma": "Virgülle ayrılmış öğeler" + }, + "save": "Kaydet", + "statistics": "İstatistikler", + "statsInboundDownlink": "Gelen İndirme İstatistikleri", + "statsInboundDownlinkDesc": "Tüm gelen proxy'lerin indirme trafiği için istatistik toplamayı etkinleştirir.", + "statsInboundUplink": "Gelen Yükleme İstatistikleri", + "statsInboundUplinkDesc": "Tüm gelen proxy'lerin yükleme trafiği için istatistik toplamayı etkinleştirir.", + "statsOutboundDownlink": "Giden İndirme İstatistikleri", + "statsOutboundDownlinkDesc": "Tüm giden proxy'lerin indirme trafiği için istatistik toplamayı etkinleştirir.", + "statsOutboundUplink": "Giden Yükleme İstatistikleri", + "statsOutboundUplinkDesc": "Tüm giden proxy'lerin yükleme trafiği için istatistik toplamayı etkinleştirir.", + "stopError": "Xray durdurulurken bir hata oluştu.", + "stopSuccess": "Xray başarıyla durduruldu", + "title": "Xray Yapılandırmaları", + "tun": { + "mtuDesc": "Maksimum İletim Birimi. Veri paketlerinin maksimum boyutu. Varsayılan değer 1500'dür", + "nameDesc": "TUN arabiriminin adı. Varsayılan değer 'xray0'dir", + "userLevel": "Kullanıcı Seviyesi", + "userLevelDesc": "Bu giriş yoluyla yapılan tüm bağlantılar bu kullanıcı seviyesini kullanacaktır. Varsayılan değer 0'dır" + }, + "warpRouting": "WARP Yönlendirme", + "warpRoutingDesc": "Bu seçenekler belirli bir varış yerine WARP üzerinden trafiği yönlendirir.", + "wireguard": { + "allowedIPs": "İzin Verilen IP'ler", + "domainStrategy": "Alan Adı Stratejisi", + "endpoint": "Uç Nokta", + "psk": "Ön Paylaşılan Anahtar", + "publicKey": "Genel Anahtar", + "secretKey": "Gizli Anahtar" } } }, + "password": "Şifre", + "path": "Yol", + "protocol": "Protokol", + "qrCode": "QR Kod", + "remained": "Kalan", + "remark": "Açıklama", + "reset": "Sıfırla", + "save": "Kaydet", + "search": "Ara", + "secAlertConf": "Bazı ayarlar saldırılara açıktır. Olası ihlalleri önlemek için güvenlik protokollerini güçlendirmeniz önerilir.", + "secAlertPanelPort": "Panel varsayılan portu savunmasız. Rastgele veya belirli bir port yapılandırın.", + "secAlertPanelURI": "Panel varsayılan URI yolu güvensiz. Karmaşık bir URI yolu yapılandırın.", + "secAlertSSL": "Panelde güvenli bağlantı yok. Verilerin korunması için TLS sertifikası yükleyin.", + "secAlertSsl": "Bu bağlantı güvenli değil. Verilerin korunması için TLS etkinleştirilene kadar hassas bilgiler girmekten kaçının.", + "secAlertSubJsonURI": "Abonelik JSON varsayılan URI yolu güvensiz. Karmaşık bir URI yolu yapılandırın.", + "secAlertSubURI": "Abonelik varsayılan URI yolu güvensiz. Karmaşık bir URI yolu yapılandırın.", + "secAlertTitle": "Güvenlik Uyarısı", + "second": "Saniye", + "security": "Güvenlik", + "somethingWentWrong": "Bir şeyler yanlış gitti", + "status": "Durum", + "subscription": { + "active": "Aktif", + "downloaded": "İndirilen", + "expiry": "Son Kullanma", + "inactive": "Pasif", + "individualLinks": "Bireysel Bağlantılar", + "noExpiry": "Süresiz", + "status": "Durum", + "subId": "Abonelik Kimliği", + "title": "Abonelik Bilgisi", + "totalQuota": "Toplam Kota", + "unlimited": "Sınırsız", + "uploaded": "Yüklenen" + }, + "success": "Başarılı", + "sure": "Emin misiniz", "tgbot": { - "keyboardClosed": "❌ Klavye kapatıldı!", - "noResult": "❗ Sonuç yok!", - "noQuery": "❌ Sorgu bulunamadı! Lütfen komutu tekrar kullanın!", - "wentWrong": "❌ Bir şeyler yanlış gitti!", - "noIpRecord": "❗ IP Kaydı Yok!", - "noInbounds": "❗ Gelen bağlantı bulunamadı!", - "unlimited": "♾ Sınırsız (Sıfırla)", "add": "Ekle", - "month": "Ay", - "months": "Aylar", - "day": "Gün", - "days": "Günler", - "hours": "Saatler", - "minutes": "Dakika", - "unknown": "Bilinmeyen", - "inbounds": "Gelenler", - "clients": "İstemciler", - "offline": "🔴 Çevrimdışı", - "online": "🟢 Çevrimiçi", - "commands": { - "unknown": "❗ Bilinmeyen komut.", - "pleaseChoose": "👇 Lütfen seçin:\r\n", - "help": "🤖 Bu bota hoş geldiniz! Web panelinden belirli verileri sunmak ve gerektiğinde değişiklik yapmanıza olanak tanımak için tasarlanmıştır.\r\n\r\n", - "start": "👋 Merhaba {{ .Firstname }}.\r\n", - "welcome": "🤖 {{ .Hostname }} yönetim botuna hoş geldiniz.\r\n", - "status": "✅ Bot çalışıyor!", - "usage": "❗ Lütfen aramak için bir metin sağlayın!", - "getID": "🆔 Kimliğiniz: {{ .ID }}", - "helpAdminCommands": "Xray Core'u yeniden başlatmak için:\r\n/restart\r\n\r\nBir müşteri e-postasını aramak için:\r\n/usage [E-posta]\r\n\r\nGelenleri aramak için (müşteri istatistikleri ile):\r\n/inbound [Açıklama]\r\n\r\nTelegram Sohbet Kimliği:\r\n/id", - "helpClientCommands": "İstatistikleri aramak için şu komutu kullanın:\r\n\r\n/usage [E-posta]\r\n\r\nTelegram Sohbet Kimliği:\r\n/id", - "restartUsage": "\r\n\r\n/restart", - "restartSuccess": "✅ İşlem başarılı!", - "restartFailed": "❗ İşlem hatası.\r\n\r\nHata: {{ .Error }}.", - "xrayNotRunning": "❗ Xray Core çalışmıyor.", - "startDesc": "Ana menüyü göster", - "helpDesc": "Bot yardımı", - "statusDesc": "Bot durumunu kontrol et", - "idDesc": "Telegram ID'nizi göster" - }, - "messages": { - "cpuThreshold": "🔴 CPU Yükü {{ .Percent }}% eşiği {{ .Threshold }}%'yi aşıyor", - "selectUserFailed": "❌ Kullanıcı seçiminde hata!", - "userSaved": "✅ Telegram Kullanıcısı kaydedildi.", - "loginSuccess": "✅ Panele başarıyla giriş yapıldı.\r\n", - "loginFailed": "❗️Panele giriş denemesi başarısız oldu.\r\n", - "2faFailed": "2FA Hatası", - "report": "🕰 Planlanmış Raporlar: {{ .RunTime }}\r\n", - "datetime": "⏰ Tarih&Zaman: {{ .DateTime }}\r\n", - "hostname": "💻 Sunucu: {{ .Hostname }}\r\n", - "version": "🚀 3X-UI Sürümü: {{ .Version }}\r\n", - "xrayVersion": "📡 Xray Sürümü: {{ .XrayVersion }}\r\n", - "ipv6": "🌐 IPv6: {{ .IPv6 }}\r\n", - "ipv4": "🌐 IPv4: {{ .IPv4 }}\r\n", - "ip": "🌐 IP: {{ .IP }}\r\n", - "ips": "🔢 IP'ler:\r\n{{ .IPs }}\r\n", - "serverUpTime": "⏳ Çalışma Süresi: {{ .UpTime }} {{ .Unit }}\r\n", - "serverLoad": "📈 Sistem Yükü: {{ .Load1 }}, {{ .Load2 }}, {{ .Load3 }}\r\n", - "serverMemory": "📋 RAM: {{ .Current }}/{{ .Total }}\r\n", - "tcpCount": "🔹 TCP: {{ .Count }}\r\n", - "udpCount": "🔸 UDP: {{ .Count }}\r\n", - "traffic": "🚦 Trafik: {{ .Total }} (↑{{ .Upload }},↓{{ .Download }})\r\n", - "xrayStatus": "ℹ️ Durum: {{ .State }}\r\n", - "username": "👤 Kullanıcı Adı: {{ .Username }}\r\n", - "reason": "❗️ Sebep: {{ .Reason }}\r\n", - "time": "⏰ Zaman: {{ .Time }}\r\n", - "inbound": "📍 Gelen: {{ .Remark }}\r\n", - "port": "🔌 Port: {{ .Port }}\r\n", - "expire": "📅 Son Kullanma Tarihi: {{ .Time }}\r\n", - "expireIn": "📅 Sona Erecek: {{ .Time }}\r\n", - "active": "💡 Aktif: {{ .Enable }}\r\n", - "enabled": "🚨 Etkin: {{ .Enable }}\r\n", - "online": "🌐 Bağlantı durumu: {{ .Status }}\r\n", - "lastOnline": "🔙 Son çevrimiçi: {{ .Time }}\r\n", - "email": "📧 E-posta: {{ .Email }}\r\n", - "upload": "🔼 Yükleme: ↑{{ .Upload }}\r\n", - "download": "🔽 İndirme: ↓{{ .Download }}\r\n", - "total": "📊 Toplam: ↑↓{{ .UpDown }} / {{ .Total }}\r\n", - "TGUser": "👤 Telegram Kullanıcısı: {{ .TelegramID }}\r\n", - "exhaustedMsg": "🚨 Tükenmiş {{ .Type }}:\r\n", - "exhaustedCount": "🚨 Tükenmiş {{ .Type }} sayısı:\r\n", - "onlinesCount": "🌐 Çevrimiçi Müşteriler: {{ .Count }}\r\n", - "disabled": "🛑 Devre Dışı: {{ .Disabled }}\r\n", - "depleteSoon": "🔜 Yakında Tükenecek: {{ .Deplete }}\r\n\r\n", - "backupTime": "🗄 Yedekleme Zamanı: {{ .Time }}\r\n", - "refreshedOn": "\r\n📋🔄 Yenilendi: {{ .Time }}\r\n\r\n", - "yes": "✅ Evet", - "no": "❌ Hayır", - "received_id": "🔑📥 Kimlik güncellendi.", - "received_password": "🔑📥 Şifre güncellendi.", - "received_email": "📧📥 E-posta güncellendi.", - "received_comment": "💬📥 Yorum güncellendi.", - "id_prompt": "🔑 Varsayılan Kimlik: {{ .ClientId }}\n\nKimliğinizi girin.", - "pass_prompt": "🔑 Varsayılan Şifre: {{ .ClientPassword }}\n\nŞifrenizi girin.", - "email_prompt": "📧 Varsayılan E-posta: {{ .ClientEmail }}\n\nE-postanızı girin.", - "comment_prompt": "💬 Varsayılan Yorum: {{ .ClientComment }}\n\nYorumunuzu girin.", - "inbound_client_data_id": "🔄 Giriş: {{ .InboundRemark }}\n\n🔑 Kimlik: {{ .ClientId }}\n📧 E-posta: {{ .ClientEmail }}\n📊 Trafik: {{ .ClientTraffic }}\n📅 Bitiş Tarihi: {{ .ClientExp }}\n🌐 IP Sınırı: {{ .IpLimit }}\n💬 Yorum: {{ .ClientComment }}\n\nArtık bu müşteriyi girişe ekleyebilirsin!", - "inbound_client_data_pass": "🔄 Giriş: {{ .InboundRemark }}\n\n🔑 Şifre: {{ .ClientPass }}\n📧 E-posta: {{ .ClientEmail }}\n📊 Trafik: {{ .ClientTraffic }}\n📅 Bitiş Tarihi: {{ .ClientExp }}\n🌐 IP Sınırı: {{ .IpLimit }}\n💬 Yorum: {{ .ClientComment }}\n\nArtık bu müşteriyi girişe ekleyebilirsin!", - "cancel": "❌ İşlem iptal edildi! \n\nİstediğiniz zaman /start ile yeniden başlayabilirsiniz. 🔄", - "error_add_client": "⚠️ Hata:\n\n {{ .error }}", - "using_default_value": "Tamam, varsayılan değeri kullanacağım. 😊", - "incorrect_input": "Girdiğiniz değer geçerli değil.\nKelime öbekleri boşluk olmadan devam etmelidir.\nDoğru örnek: aaaaaa\nYanlış örnek: aaa aaa 🚫", - "AreYouSure": "Emin misin? 🤔", - "SuccessResetTraffic": "📧 E-posta: {{ .ClientEmail }}\n🏁 Sonuç: ✅ Başarılı", - "FailedResetTraffic": "📧 E-posta: {{ .ClientEmail }}\n🏁 Sonuç: ❌ Başarısız \n\n🛠️ Hata: [ {{ .ErrorMessage }} ]", - "FinishProcess": "🔚 Tüm müşteriler için trafik sıfırlama işlemi tamamlandı." - }, - "buttons": { - "closeKeyboard": "❌ Klavyeyi Kapat", - "cancel": "❌ İptal", - "cancelReset": "❌ Sıfırlamayı İptal Et", - "cancelIpLimit": "❌ IP Limitini İptal Et", - "confirmResetTraffic": "✅ Trafiği Sıfırlamayı Onayla?", - "confirmClearIps": "✅ IP'leri Temizlemeyi Onayla?", - "confirmRemoveTGUser": "✅ Telegram Kullanıcısını Kaldırmayı Onayla?", - "confirmToggle": "✅ Kullanıcıyı Etkinleştirme/Devre Dışı Bırakmayı Onayla?", - "dbBackup": "Veritabanı Yedeği Al", - "serverUsage": "Sunucu Kullanımı", - "getInbounds": "Gelenleri Al", - "depleteSoon": "Yakında Tükenecek", - "clientUsage": "Kullanımı Al", - "onlines": "Çevrimiçi Müşteriler", - "commands": "Komutlar", - "refresh": "🔄 Yenile", - "clearIPs": "❌ IP'leri Temizle", - "removeTGUser": "❌ Telegram Kullanıcısını Kaldır", - "selectTGUser": "👤 Telegram Kullanıcısını Seç", - "selectOneTGUser": "👤 Bir Telegram Kullanıcısını Seçin:", - "resetTraffic": "📈 Trafiği Sıfırla", - "resetExpire": "📅 Son Kullanma Tarihini Değiştir", - "ipLog": "🔢 IP Günlüğü", - "ipLimit": "🔢 IP Limiti", - "setTGUser": "👤 Telegram Kullanıcısını Ayarla", - "toggle": "🔘 Etkinleştir / Devre Dışı Bırak", - "custom": "🔢 Özel", - "confirmNumber": "✅ Onayla: {{ .Num }}", - "confirmNumberAdd": "✅ Ekleme onayı: {{ .Num }}", - "limitTraffic": "🚧 Trafik Sınırı", - "getBanLogs": "Yasak Günlüklerini Al", - "allClients": "Tüm Müşteriler", - "addClient": "Müşteri Ekle", - "submitDisable": "Devre Dışı Olarak Gönder ☑️", - "submitEnable": "Etkin Olarak Gönder ✅", - "use_default": "🏷️ Varsayılanı Kullan", - "change_id": "⚙️🔑 Kimlik", - "change_password": "⚙️🔑 Şifre", - "change_email": "⚙️📧 E-posta", - "change_comment": "⚙️💬 Yorum", - "ResetAllTraffics": "Tüm Trafikleri Sıfırla", - "SortedTrafficUsageReport": "Sıralı Trafik Kullanım Raporu" - }, "answers": { - "successfulOperation": "✅ İşlem başarılı!", - "errorOperation": "❗ İşlemde hata.", - "getInboundsFailed": "❌ Gelenler alınamadı.", - "getClientsFailed": "❌ Müşteriler alınamadı.", - "canceled": "❌ {{ .Email }}: İşlem iptal edildi.", - "clientRefreshSuccess": "✅ {{ .Email }}: Müşteri başarıyla yenilendi.", "IpRefreshSuccess": "✅ {{ .Email }}: IP'ler başarıyla yenilendi.", "TGIdRefreshSuccess": "✅ {{ .Email }}: Müşterinin Telegram Kullanıcısı başarıyla yenilendi.", - "resetTrafficSuccess": "✅ {{ .Email }}: Trafik başarıyla sıfırlandı.", - "setTrafficLimitSuccess": "✅ {{ .Email }}: Trafik limiti başarıyla kaydedildi.", - "expireResetSuccess": "✅ {{ .Email }}: Son kullanma günleri başarıyla sıfırlandı.", - "resetIpSuccess": "✅ {{ .Email }}: IP limiti {{ .Count }} başarıyla kaydedildi.", + "askToAddUserId": "Yapılandırmanız bulunamadı!\r\nLütfen yöneticinizden yapılandırmalarınıza Telegram ChatID'nizi eklemesini isteyin.\r\n\r\nKullanıcı ChatID'niz: \u003ccode\u003e{{ .TgUserID }}\u003c/code\u003e", + "canceled": "❌ {{ .Email }}: İşlem iptal edildi.", + "chooseClient": "Gelen {{ .Inbound }} için bir Müşteri Seçin", + "chooseInbound": "Bir Gelen Seçin", "clearIpSuccess": "✅ {{ .Email }}: IP'ler başarıyla temizlendi.", + "clientRefreshSuccess": "✅ {{ .Email }}: Müşteri başarıyla yenilendi.", + "disableSuccess": "✅ {{ .Email }}: Başarıyla devre dışı bırakıldı.", + "enableSuccess": "✅ {{ .Email }}: Başarıyla etkinleştirildi.", + "errorOperation": "❗ İşlemde hata.", + "expireResetSuccess": "✅ {{ .Email }}: Son kullanma günleri başarıyla sıfırlandı.", + "getClientsFailed": "❌ Müşteriler alınamadı.", + "getInboundsFailed": "❌ Gelenler alınamadı.", "getIpLog": "✅ {{ .Email }}: IP Günlüğü alındı.", "getUserInfo": "✅ {{ .Email }}: Telegram Kullanıcı Bilgisi alındı.", "removedTGUserSuccess": "✅ {{ .Email }}: Telegram Kullanıcısı başarıyla kaldırıldı.", - "enableSuccess": "✅ {{ .Email }}: Başarıyla etkinleştirildi.", - "disableSuccess": "✅ {{ .Email }}: Başarıyla devre dışı bırakıldı.", - "askToAddUserId": "Yapılandırmanız bulunamadı!\r\nLütfen yöneticinizden yapılandırmalarınıza Telegram ChatID'nizi eklemesini isteyin.\r\n\r\nKullanıcı ChatID'niz: {{ .TgUserID }}", - "chooseClient": "Gelen {{ .Inbound }} için bir Müşteri Seçin", - "chooseInbound": "Bir Gelen Seçin" - } - } -} + "resetIpSuccess": "✅ {{ .Email }}: IP limiti {{ .Count }} başarıyla kaydedildi.", + "resetTrafficSuccess": "✅ {{ .Email }}: Trafik başarıyla sıfırlandı.", + "setTrafficLimitSuccess": "✅ {{ .Email }}: Trafik limiti başarıyla kaydedildi.", + "successfulOperation": "✅ İşlem başarılı!" + }, + "buttons": { + "ResetAllTraffics": "Tüm Trafikleri Sıfırla", + "SortedTrafficUsageReport": "Sıralı Trafik Kullanım Raporu", + "addClient": "Müşteri Ekle", + "allClients": "Tüm Müşteriler", + "cancel": "❌ İptal", + "cancelIpLimit": "❌ IP Limitini İptal Et", + "cancelReset": "❌ Sıfırlamayı İptal Et", + "change_comment": "⚙️💬 Yorum", + "change_email": "⚙️📧 E-posta", + "change_flow": "🌊 Flow", + "change_id": "⚙️🔑 Kimlik", + "change_password": "⚙️🔑 Şifre", + "change_subid": "📝 Sub ID", + "clearIPs": "❌ IP'leri Temizle", + "clientUsage": "Kullanımı Al", + "closeKeyboard": "❌ Klavyeyi Kapat", + "commands": "Komutlar", + "confirmClearIps": "✅ IP'leri Temizlemeyi Onayla?", + "confirmNumber": "✅ Onayla: {{ .Num }}", + "confirmNumberAdd": "✅ Ekleme onayı: {{ .Num }}", + "confirmRemoveTGUser": "✅ Telegram Kullanıcısını Kaldırmayı Onayla?", + "confirmResetTraffic": "✅ Trafiği Sıfırlamayı Onayla?", + "confirmToggle": "✅ Kullanıcıyı Etkinleştirme/Devre Dışı Bırakmayı Onayla?", + "custom": "🔢 Özel", + "dbBackup": "Veritabanı Yedeği Al", + "depleteSoon": "Yakında Tükenecek", + "flow_none": "None", + "getBanLogs": "Yasak Günlüklerini Al", + "getInbounds": "Gelenleri Al", + "ipLimit": "🔢 IP Limiti", + "ipLog": "🔢 IP Günlüğü", + "limitTraffic": "🚧 Trafik Sınırı", + "onlines": "Çevrimiçi Müşteriler", + "refresh": "🔄 Yenile", + "removeTGUser": "❌ Telegram Kullanıcısını Kaldır", + "resetExpire": "📅 Son Kullanma Tarihini Değiştir", + "resetTraffic": "📈 Trafiği Sıfırla", + "selectOneTGUser": "👤 Bir Telegram Kullanıcısını Seçin:", + "selectTGUser": "👤 Telegram Kullanıcısını Seç", + "serverUsage": "Sunucu Kullanımı", + "setTGUser": "👤 Telegram Kullanıcısını Ayarla", + "submitDisable": "Devre Dışı Olarak Gönder ☑️", + "submitEnable": "Etkin Olarak Gönder ✅", + "toggle": "🔘 Etkinleştir / Devre Dışı Bırak", + "use_default": "🏷️ Varsayılanı Kullan" + }, + "clients": "İstemciler", + "commands": { + "getID": "🆔 Kimliğiniz: \u003ccode\u003e{{ .ID }}\u003c/code\u003e", + "help": "🤖 Bu bota hoş geldiniz! Web panelinden belirli verileri sunmak ve gerektiğinde değişiklik yapmanıza olanak tanımak için tasarlanmıştır.\r\n\r\n", + "helpAdminCommands": "Xray Core'u yeniden başlatmak için:\r\n\u003ccode\u003e/restart\u003c/code\u003e\r\n\r\nBir müşteri e-postasını aramak için:\r\n\u003ccode\u003e/usage [E-posta]\u003c/code\u003e\r\n\r\nGelenleri aramak için (müşteri istatistikleri ile):\r\n\u003ccode\u003e/inbound [Açıklama]\u003c/code\u003e\r\n\r\nTelegram Sohbet Kimliği:\r\n\u003ccode\u003e/id\u003c/code\u003e", + "helpClientCommands": "İstatistikleri aramak için şu komutu kullanın:\r\n\r\n\u003ccode\u003e/usage [E-posta]\u003c/code\u003e\r\n\r\nTelegram Sohbet Kimliği:\r\n\u003ccode\u003e/id\u003c/code\u003e", + "helpDesc": "Bot yardımı", + "idDesc": "Telegram ID'nizi göster", + "pleaseChoose": "👇 Lütfen seçin:\r\n", + "restartFailed": "❗ İşlem hatası.\r\n\r\n\u003ccode\u003eHata: {{ .Error }}\u003c/code\u003e.", + "restartSuccess": "✅ İşlem başarılı!", + "restartUsage": "\r\n\r\n\u003ccode\u003e/restart\u003c/code\u003e", + "start": "👋 Merhaba \u003ci\u003e{{ .Firstname }}\u003c/i\u003e.\r\n", + "startDesc": "Ana menüyü göster", + "status": "✅ Bot çalışıyor!", + "statusDesc": "Bot durumunu kontrol et", + "unknown": "❗ Bilinmeyen komut.", + "usage": "❗ Lütfen aramak için bir metin sağlayın!", + "welcome": "🤖 \u003cb\u003e{{ .Hostname }}\u003c/b\u003e yönetim botuna hoş geldiniz.\r\n", + "xrayNotRunning": "❗ Xray Core çalışmıyor." + }, + "day": "Gün", + "days": "Günler", + "hours": "Saatler", + "inbounds": "Gelenler", + "keyboardClosed": "❌ Klavye kapatıldı!", + "messages": { + "2faFailed": "2FA Hatası", + "AreYouSure": "Emin misin? 🤔", + "FailedResetTraffic": "📧 E-posta: {{ .ClientEmail }}\n🏁 Sonuç: ❌ Başarısız \n\n🛠️ Hata: [ {{ .ErrorMessage }} ]", + "FinishProcess": "🔚 Tüm müşteriler için trafik sıfırlama işlemi tamamlandı.", + "SuccessResetTraffic": "📧 E-posta: {{ .ClientEmail }}\n🏁 Sonuç: ✅ Başarılı", + "TGUser": "👤 Telegram Kullanıcısı: {{ .TelegramID }}\r\n", + "active": "💡 Aktif: {{ .Enable }}\r\n", + "backupTime": "🗄 Yedekleme Zamanı: {{ .Time }}\r\n", + "cancel": "❌ İşlem iptal edildi! \n\nİstediğiniz zaman /start ile yeniden başlayabilirsiniz. 🔄", + "client_flow": "Flow:", + "client_subid": "Sub ID:", + "comment_prompt": "💬 Varsayılan Yorum: {{ .ClientComment }}\n\nYorumunuzu girin.", + "cpuThreshold": "🔴 CPU Yükü {{ .Percent }}% eşiği {{ .Threshold }}%'yi aşıyor", + "datetime": "⏰ Tarih\u0026Zaman: {{ .DateTime }}\r\n", + "depleteSoon": "🔜 Yakında Tükenecek: {{ .Deplete }}\r\n\r\n", + "disabled": "🛑 Devre Dışı: {{ .Disabled }}\r\n", + "download": "🔽 İndirme: ↓{{ .Download }}\r\n", + "email": "📧 E-posta: {{ .Email }}\r\n", + "email_prompt": "📧 Varsayılan E-posta: {{ .ClientEmail }}\n\nE-postanızı girin.", + "enabled": "🚨 Etkin: {{ .Enable }}\r\n", + "error_add_client": "⚠️ Hata:\n\n {{ .error }}", + "exhaustedCount": "🚨 Tükenmiş {{ .Type }} sayısı:\r\n", + "exhaustedMsg": "🚨 Tükenmiş {{ .Type }}:\r\n", + "expire": "📅 Son Kullanma Tarihi: {{ .Time }}\r\n", + "expireIn": "📅 Sona Erecek: {{ .Time }}\r\n", + "hostname": "💻 Sunucu: {{ .Hostname }}\r\n", + "id_prompt": "🔑 Varsayılan Kimlik: {{ .ClientId }}\n\nKimliğinizi girin.", + "inbound": "📍 Gelen: {{ .Remark }}\r\n", + "inbound_client_data_id": "🔄 Giriş: {{ .InboundRemark }}\n\n🔑 Kimlik: {{ .ClientId }}\n📧 E-posta: {{ .ClientEmail }}\n📊 Trafik: {{ .ClientTraffic }}\n📅 Bitiş Tarihi: {{ .ClientExp }}\n🌐 IP Sınırı: {{ .IpLimit }}\n💬 Yorum: {{ .ClientComment }}\n\nArtık bu müşteriyi girişe ekleyebilirsin!", + "inbound_client_data_pass": "🔄 Giriş: {{ .InboundRemark }}\n\n🔑 Şifre: {{ .ClientPass }}\n📧 E-posta: {{ .ClientEmail }}\n📊 Trafik: {{ .ClientTraffic }}\n📅 Bitiş Tarihi: {{ .ClientExp }}\n🌐 IP Sınırı: {{ .IpLimit }}\n💬 Yorum: {{ .ClientComment }}\n\nArtık bu müşteriyi girişe ekleyebilirsin!", + "incorrect_input": "Girdiğiniz değer geçerli değil.\nKelime öbekleri boşluk olmadan devam etmelidir.\nDoğru örnek: aaaaaa\nYanlış örnek: aaa aaa 🚫", + "invalid_subid": "Invalid format.\nSub ID can only contain letters, numbers, hyphens (-), and underscores (_).\nSpaces and special characters are not allowed. 🚫", + "ip": "🌐 IP: {{ .IP }}\r\n", + "ips": "🔢 IP'ler:\r\n{{ .IPs }}\r\n", + "ipv4": "🌐 IPv4: {{ .IPv4 }}\r\n", + "ipv6": "🌐 IPv6: {{ .IPv6 }}\r\n", + "lastOnline": "🔙 Son çevrimiçi: {{ .Time }}\r\n", + "loginFailed": "❗️Panele giriş denemesi başarısız oldu.\r\n", + "loginSuccess": "✅ Panele başarıyla giriş yapıldı.\r\n", + "no": "❌ Hayır", + "online": "🌐 Bağlantı durumu: {{ .Status }}\r\n", + "onlinesCount": "🌐 Çevrimiçi Müşteriler: {{ .Count }}\r\n", + "pass_prompt": "🔑 Varsayılan Şifre: {{ .ClientPassword }}\n\nŞifrenizi girin.", + "port": "🔌 Port: {{ .Port }}\r\n", + "reason": "❗️ Sebep: {{ .Reason }}\r\n", + "received_comment": "💬📥 Yorum güncellendi.", + "received_email": "📧📥 E-posta güncellendi.", + "received_id": "🔑📥 Kimlik güncellendi.", + "received_password": "🔑📥 Şifre güncellendi.", + "received_subid": "Sub ID updated successfully!", + "refreshedOn": "\r\n📋🔄 Yenilendi: {{ .Time }}\r\n\r\n", + "report": "🕰 Planlanmış Raporlar: {{ .RunTime }}\r\n", + "selectUserFailed": "❌ Kullanıcı seçiminde hata!", + "serverLoad": "📈 Sistem Yükü: {{ .Load1 }}, {{ .Load2 }}, {{ .Load3 }}\r\n", + "serverMemory": "📋 RAM: {{ .Current }}/{{ .Total }}\r\n", + "serverUpTime": "⏳ Çalışma Süresi: {{ .UpTime }} {{ .Unit }}\r\n", + "subid_prompt": "Please enter new Sub ID:\nCurrent: {{.ClientSubId}}", + "tcpCount": "🔹 TCP: {{ .Count }}\r\n", + "time": "⏰ Zaman: {{ .Time }}\r\n", + "total": "📊 Toplam: ↑↓{{ .UpDown }} / {{ .Total }}\r\n", + "traffic": "🚦 Trafik: {{ .Total }} (↑{{ .Upload }},↓{{ .Download }})\r\n", + "udpCount": "🔸 UDP: {{ .Count }}\r\n", + "upload": "🔼 Yükleme: ↑{{ .Upload }}\r\n", + "userSaved": "✅ Telegram Kullanıcısı kaydedildi.", + "username": "👤 Kullanıcı Adı: {{ .Username }}\r\n", + "using_default_value": "Tamam, varsayılan değeri kullanacağım. 😊", + "version": "🚀 3X-UI Sürümü: {{ .Version }}\r\n", + "xrayStatus": "ℹ️ Durum: {{ .State }}\r\n", + "xrayVersion": "📡 Xray Sürümü: {{ .XrayVersion }}\r\n", + "yes": "✅ Evet" + }, + "minutes": "Dakika", + "month": "Ay", + "months": "Aylar", + "noInbounds": "❗ Gelen bağlantı bulunamadı!", + "noIpRecord": "❗ IP Kaydı Yok!", + "noQuery": "❌ Sorgu bulunamadı! Lütfen komutu tekrar kullanın!", + "noResult": "❗ Sonuç yok!", + "offline": "🔴 Çevrimdışı", + "online": "🟢 Çevrimiçi", + "unknown": "Bilinmeyen", + "unlimited": "♾ Sınırsız (Sıfırla)", + "wentWrong": "❌ Bir şeyler yanlış gitti!" + }, + "transmission": "İletim", + "twoFactorCode": "Kod", + "unlimited": "Sınırsız", + "update": "Güncelle", + "usage": "Kullanım", + "useIPv4ForHost": "Ana bilgisayar için IPv4 kullan", + "username": "Kullanıcı Adı" +} \ No newline at end of file diff --git a/web/translation/uk-UA.json b/web/translation/uk-UA.json index eb451b14..1d7f83da 100644 --- a/web/translation/uk-UA.json +++ b/web/translation/uk-UA.json @@ -1,750 +1,604 @@ { - "username": "Ім'я користувача", - "password": "Пароль", - "login": "Увійти", - "confirm": "Підтвердити", - "cancel": "Скасувати", - "close": "Закрити", - "save": "Зберегти", - "logout": "Вийти", - "create": "Створити", - "update": "Оновити", - "copy": "Копіювати", - "copied": "Скопійовано", - "download": "Завантажити", - "remark": "Примітка", - "enable": "Увімкнути", - "protocol": "Протокол", - "search": "Пошук", - "filter": "Фільтр", - "loading": "Завантаження...", - "second": "Секунда", - "minute": "Хвилина", - "hour": "Година", - "day": "День", - "check": "Перевірка", - "indefinite": "Безстроково", - "unlimited": "Безлімітний", - "none": "Немає", - "qrCode": "QR-Код", - "info": "Більше інформації", - "edit": "Редагувати", - "delete": "Видалити", - "reset": "Скидання", - "noData": "Немає даних.", - "copySuccess": "Скопійовано успішно", - "sure": "Звичайно", - "encryption": "Шифрування", - "useIPv4ForHost": "Використовувати IPv4 для хоста", - "transmission": "Протокол передачи", - "host": "Хост", - "path": "Шлях", "camouflage": "Маскування", - "status": "Статус", - "enabled": "Увімкнено", - "disabled": "Вимкнено", + "cancel": "Скасувати", + "certificate": "Цифровий сертифікат", + "check": "Перевірка", + "clients": "Клієнти", + "close": "Закрити", + "comment": "Коментар", + "confirm": "Підтвердити", + "copied": "Скопійовано", + "copy": "Копіювати", + "copySuccess": "Скопійовано успішно", + "create": "Створити", + "day": "День", + "delete": "Видалити", "depleted": "Вичерпано", "depletingSoon": "Вичерпується", - "offline": "Офлайн", - "online": "Онлайн", + "disabled": "Вимкнено", "domainName": "Доменне ім`я", - "monitor": "Слухати IP", - "certificate": "Цифровий сертифікат", - "fail": "Помилка", - "comment": "Коментар", - "success": "Успішно", - "lastOnline": "Був(ла) онлайн", - "getVersion": "Отримати версію", - "install": "Встановити", - "clients": "Клієнти", - "usage": "Використання", - "twoFactorCode": "Код", - "remained": "Залишилося", - "security": "Беспека", - "secAlertTitle": "Попередження системи безпеки", - "secAlertSsl": "Це з'єднання не є безпечним. Будь ласка, уникайте введення конфіденційної інформації, поки TLS не буде активовано для захисту даних.", - "secAlertConf": "Деякі налаштування вразливі до атак. Рекомендується посилити протоколи безпеки, щоб запобігти можливим порушенням.", - "secAlertSSL": "Панель не має безпечного з'єднання. Будь ласка, встановіть сертифікат TLS для захисту даних.", - "secAlertPanelPort": "Стандартний порт панелі вразливий. Будь ласка, сконфігуруйте випадковий або конкретний порт.", - "secAlertPanelURI": "Стандартний URI-шлях панелі небезпечний. Будь ласка, сконфігуруйте складний URI-шлях.", - "secAlertSubURI": "Стандартний URI-шлях підписки небезпечний. Будь ласка, сконфігуруйте складний URI-шлях.", - "secAlertSubJsonURI": "Стандартний URI-шлях JSON підписки небезпечний. Будь ласка, сконфігуруйте складний URI-шлях.", + "download": "Завантажити", + "edit": "Редагувати", + "emptyBalancersDesc": "Немає доданих балансувальників.", "emptyDnsDesc": "Немає доданих DNS-серверів.", "emptyFakeDnsDesc": "Немає доданих Fake DNS-серверів.", - "emptyBalancersDesc": "Немає доданих балансувальників.", "emptyReverseDesc": "Немає доданих зворотних проксі.", - "somethingWentWrong": "Щось пішло не так", - "subscription": { - "title": "Інформація про підписку", - "subId": "ID підписки", - "status": "Статус", - "downloaded": "Завантажено", - "uploaded": "Відвантажено", - "expiry": "Термін дії", - "totalQuota": "Загальна квота", - "individualLinks": "Окремі посилання", - "active": "Активна", - "inactive": "Неактивна", - "unlimited": "Безліміт", - "noExpiry": "Без строку" - }, + "enable": "Увімкнути", + "enabled": "Увімкнено", + "encryption": "Шифрування", + "fail": "Помилка", + "filter": "Фільтр", + "getVersion": "Отримати версію", + "host": "Хост", + "hour": "Година", + "indefinite": "Безстроково", + "info": "Більше інформації", + "install": "Встановити", + "lastOnline": "Був(ла) онлайн", + "loading": "Завантаження...", + "login": "Увійти", + "logout": "Вийти", "menu": { - "theme": "Тема", + "apiDocs": "Документація API", "dark": "Темна", - "ultraDark": "Ультра темна", "dashboard": "Огляд", "inbounds": "Вхідні", + "link": "Керувати", + "logout": "Вийти", "nodes": "Вузли", "settings": "Параметри панелі", - "xray": "Конфігурації Xray", - "apiDocs": "Документація API", - "logout": "Вийти", - "link": "Керувати" + "theme": "Тема", + "ultraDark": "Ультра темна", + "xray": "Конфігурації Xray" }, + "minute": "Хвилина", + "monitor": "Слухати IP", + "noData": "Немає даних.", + "none": "Немає", + "offline": "Офлайн", + "online": "Онлайн", "pages": { - "login": { - "hello": "Привіт", - "title": "Привітання!", - "loginAgain": "Ваш сеанс закінчився, увійдіть знову", - "toasts": { - "invalidFormData": "Формат вхідних даних недійсний.", - "emptyUsername": "Потрібне ім'я користувача", - "emptyPassword": "Потрібен пароль", - "wrongUsernameOrPassword": "Невірне ім’я користувача, пароль або код двофакторної аутентифікації.", - "successLogin": "Ви успішно увійшли до свого облікового запису." - } - }, - "index": { - "title": "Огляд", - "cpu": "ЦП", - "logicalProcessors": "Логічні процесори", - "frequency": "Частота", - "swap": "Своп", - "storage": "Сховище", - "memory": "ОЗП", - "threads": "Потоки", - "xrayStatus": "Xray", - "stopXray": "Зупинити", - "restartXray": "Перезапустити", - "xraySwitch": "Версія", - "xraySwitchClick": "Виберіть версію, на яку ви хочете перейти.", - "xraySwitchClickDesk": "Вибирайте уважно, оскільки старіші версії можуть бути несумісними з поточними конфігураціями.", - "xrayUpdates": "Оновлення Xray", - "updatePanel": "Оновити панель", - "panelUpdateDesc": "Це оновить 3X-UI до останнього релізу та перезапустить сервіс панелі.", - "currentPanelVersion": "Поточна версія панелі", - "latestPanelVersion": "Остання версія панелі", - "panelUpToDate": "Панель оновлено", - "upToDate": "Оновлено", - "xrayStatusUnknown": "Невідомо", - "xrayStatusRunning": "Запущено", - "xrayStatusStop": "Зупинено", - "xrayStatusError": "Помилка", - "xrayErrorPopoverTitle": "Під час роботи Xray сталася помилка", - "operationHours": "Час роботи", - "systemHistoryTitle": "Історія системи", - "charts": "Графіки", - "xrayMetricsTitle": "Метрики Xray", - "xrayMetricsDisabled": "Кінцева точка метрик Xray не налаштована", - "xrayMetricsHint": "Додайте блок metrics верхнього рівня до конфігурації xray з tag metrics_out і listen 127.0.0.1:11111, потім перезапустіть xray.", - "xrayObservatoryEmpty": "Даних Observatory ще немає", - "xrayObservatoryHint": "Додайте блок observatory до конфігурації xray зі списком outbound тегів для перевірки, потім перезапустіть xray.", - "xrayObservatoryTagPlaceholder": "Виберіть outbound", - "xrayObservatoryAlive": "Активний", - "xrayObservatoryDead": "Недоступний", - "xrayObservatoryLastSeen": "Остання активність", - "xrayObservatoryLastTry": "Остання спроба", - "trendLast2Min": "Останні 2 хвилини", - "systemLoad": "Завантаження системи", - "systemLoadDesc": "Середнє завантаження системи за останні 1, 5 і 15 хвилин", - "connectionCount": "Статистика з'єднання", - "ipAddresses": "IP-адреси", - "toggleIpVisibility": "Перемкнути видимість IP", - "overallSpeed": "Загальна швидкість", - "upload": "Відправка", - "download": "Завантаження", - "totalData": "Загальний обсяг даних", - "sent": "Відправлено", - "received": "Отримано", - "documentation": "Документація", - "xraySwitchVersionDialog": "Ви дійсно хочете змінити версію Xray?", - "xraySwitchVersionDialogDesc": "Це змінить версію Xray на #version#.", - "xraySwitchVersionPopover": "Xray успішно оновлено", - "panelUpdateDialog": "Ви дійсно хочете оновити панель?", - "panelUpdateDialogDesc": "Це оновить 3X-UI до #version# та перезапустить сервіс панелі.", - "panelUpdateCheckPopover": "Перевірка оновлення панелі не вдалася", - "panelUpdateStartedPopover": "Розпочато оновлення панелі", - "geofileUpdateDialog": "Ви дійсно хочете оновити геофайл?", - "geofileUpdateDialogDesc": "Це оновить файл #filename#.", - "geofilesUpdateDialogDesc": "Це оновить усі геофайли.", - "geofilesUpdateAll": "Оновити все", - "geofileUpdatePopover": "Геофайл успішно оновлено", - "dontRefresh": "Інсталяція триває, будь ласка, не оновлюйте цю сторінку", - "logs": "Журнали", - "config": "Конфігурація", - "backup": "Резервна копія", - "backupTitle": "Резервне копіювання та відновлення", - "exportDatabase": "Резервна копія", - "exportDatabaseDesc": "Натисніть, щоб завантажити файл .db, що містить резервну копію вашої поточної бази даних на ваш пристрій.", - "importDatabase": "Відновити", - "importDatabaseDesc": "Натисніть, щоб вибрати та завантажити файл .db з вашого пристрою для відновлення бази даних з резервної копії.", - "importDatabaseSuccess": "Базу даних успішно імпортовано", - "importDatabaseError": "Виникла помилка під час імпорту бази даних", - "readDatabaseError": "Виникла помилка під час читання бази даних", - "getDatabaseError": "Виникла помилка під час отримання бази даних", - "getConfigError": "Виникла помилка під час отримання файлу конфігурації", - "customGeoTitle": "Користувацькі GeoSite / GeoIP", - "customGeoAdd": "Додати", - "customGeoType": "Тип", - "customGeoAlias": "Псевдонім", - "customGeoUrl": "URL", - "customGeoEnabled": "Увімкнено", - "customGeoLastUpdated": "Оновлено", - "customGeoExtColumn": "Маршрутизація (ext:…)", - "customGeoToastUpdateAll": "Усі користувацькі джерела оновлено", - "customGeoActions": "Дії", - "customGeoEdit": "Змінити", - "customGeoDelete": "Видалити", - "customGeoDownload": "Оновити зараз", - "customGeoModalAdd": "Додати користувацький geo", - "customGeoModalEdit": "Змінити користувацький geo", - "customGeoModalSave": "Зберегти", - "customGeoDeleteConfirm": "Видалити це джерело geo?", - "customGeoRoutingHint": "У правилах маршрутизації використовуйте значення як ext:файл.dat:тег (замініть тег).", - "customGeoInvalidId": "Некоректний ідентифікатор ресурсу", - "customGeoAliasesError": "Не вдалося завантажити псевдоніми geo", - "customGeoValidationAlias": "Псевдонім: лише a-z, цифри, - і _", - "customGeoValidationUrl": "URL має починатися з http:// або https://", - "customGeoAliasPlaceholder": "a-z 0-9 _ -", - "customGeoAliasLabelSuffix": " (власний)", - "customGeoToastList": "Список користувацьких geo", - "customGeoToastAdd": "Додати користувацький geo", - "customGeoToastUpdate": "Оновити користувацький geo", - "customGeoToastDelete": "Користувацький geofile «{{ .fileName }}» видалено", - "customGeoToastDownload": "Geofile «{{ .fileName }}» оновлено", - "customGeoErrInvalidType": "Тип має бути geosite або geoip", - "customGeoErrAliasRequired": "Потрібен псевдонім", - "customGeoErrAliasPattern": "Псевдонім містить недопустимі символи", - "customGeoErrAliasReserved": "Цей псевдонім зарезервовано", - "customGeoErrUrlRequired": "Потрібен URL", - "customGeoErrInvalidUrl": "Некоректний URL", - "customGeoErrUrlScheme": "URL має використовувати http або https", - "customGeoErrUrlHost": "Некоректний хост URL", - "customGeoErrDuplicateAlias": "Цей псевдонім уже використовується для цього типу", - "customGeoErrNotFound": "Джерело geo не знайдено", - "customGeoErrDownload": "Помилка завантаження", - "customGeoErrUpdateAllIncomplete": "Не вдалося оновити один або кілька користувацьких джерел", - "customGeoEmpty": "Користувацьких джерел geo поки немає — натисніть «Додати», щоб створити" + "client": { + "add": "Додати клієнта", + "bulk": "Додати групу", + "clearAll": "Зняти все", + "clientCount": "Кількість клієнтів", + "copyEmailPreview": "Попередній перегляд підсумкових email", + "copyFlowHint": "Застосується до всіх скопійованих клієнтів. Залиште порожнім, щоб не задавати.", + "copyFlowLabel": "Flow для нових клієнтів (VLESS)", + "copyFromInbound": "Скопіювати клієнтів з інбаунда", + "copyResult": "Результат копіювання", + "copyResultErrors": "Помилки під час копіювання", + "copyResultNone": "Нічого копіювати: жодного клієнта не вибрано або список джерела порожній", + "copyResultSuccess": "Успішно скопійовано", + "copySelectSourceFirst": "Спочатку виберіть джерело.", + "copySelected": "Скопіювати вибраних", + "copySource": "Джерело", + "copyToInbound": "Скопіювати клієнтів у", + "days": "Дні(в)", + "delayedStart": "Початок використання", + "edit": "Редагувати клієнта", + "expireDays": "Тривалість", + "first": "Перший", + "last": "Останній", + "method": "Метод", + "postfix": "Постфікс", + "prefix": "Префікс", + "renew": "Автоматичне оновлення", + "renewDesc": "Автоматичне поновлення після закінчення терміну дії. (0 = вимкнено)(одиниця: день)", + "selectAll": "Вибрати всіх", + "submitAdd": "Додати клієнта", + "submitEdit": "Зберегти зміни" }, "inbounds": { - "allTimeTraffic": "Загальний трафік", - "allTimeTrafficUsage": "Загальне використання за весь час", - "title": "Вхідні", - "totalDownUp": "Всього надісланих/отриманих", - "totalUsage": "Всього використанно", - "inboundCount": "Загальна кількість вхідних", - "operate": "Меню", - "enable": "Увімкнено", - "remark": "Примітка", - "node": "Вузол", - "deployTo": "Розгорнути на", - "localPanel": "Локальна панель", - "protocol": "Протокол", - "port": "Порт", - "portMap": "Порт-перехід", - "traffic": "Трафік", - "details": "Деталі", - "transportConfig": "Транспорт", - "expireDate": "Тривалість", - "createdAt": "Створено", - "updatedAt": "Оновлено", - "resetTraffic": "Скинути трафік", - "addInbound": "Додати вхідний", - "generalActions": "Загальні дії", - "modifyInbound": "Змінити вхідний", - "deleteInbound": "Видалити вхідні", - "deleteInboundContent": "Ви впевнені, що хочете видалити вхідні?", - "deleteClient": "Видалити клієнта", - "deleteClientContent": "Ви впевнені, що хочете видалити клієнт?", - "resetTrafficContent": "Ви впевнені, що хочете скинути трафік?", - "copyLink": "Копіювати URL", - "address": "Адреса", - "network": "Мережа", - "destinationPort": "Порт призначення", - "targetAddress": "Цільова адреса", - "monitorDesc": "Залиште порожнім, щоб слухати всі IP-адреси", - "meansNoLimit": "= Необмежено. (одиниця: ГБ)", - "totalFlow": "Загальна витрата", - "leaveBlankToNeverExpire": "Залиште порожнім, щоб ніколи не закінчувався", - "noRecommendKeepDefault": "Рекомендується зберегти значення за замовчуванням", - "certificatePath": "Шлях до файлу", - "certificateContent": "Вміст файлу", - "publicKey": "Публічний ключ", - "privatekey": "Закритий ключ", - "clickOnQRcode": "Натисніть QR-код, щоб скопіювати", - "client": "Клієнт", - "export": "Експортувати всі URL-адреси", - "clone": "Клон", - "cloneInbound": "Клонувати", - "cloneInboundContent": "Усі налаштування цього вхідного потоку, крім порту, IP-адреси прослуховування та клієнтів, будуть застосовані до клону.", - "cloneInboundOk": "Клонувати", - "resetAllTraffic": "Скинути весь вхідний трафік", - "resetAllTrafficTitle": "Скинути весь вхідний трафік", - "resetAllTrafficContent": "Ви впевнені, що бажаєте скинути трафік усіх вхідних?", - "resetInboundClientTraffics": "Скинути трафік клієнтів", - "resetInboundClientTrafficTitle": "Скинути трафік клієнтів", - "resetInboundClientTrafficContent": "Ви впевнені, що бажаєте скинути трафік клієнтів цього вхідного потоку?", - "resetAllClientTraffics": "Скинути весь трафік клієнтів", - "resetAllClientTrafficTitle": "Скинути весь трафік клієнтів", - "resetAllClientTrafficContent": "Ви впевнені, що бажаєте скинути трафік усіх клієнтів?", - "delDepletedClients": "Видалити вичерпані клієнти", - "delDepletedClientsTitle": "Видалити вичерпані клієнти", - "delDepletedClientsContent": "Ви впевнені, що хочете видалити всі вичерпані клієнти?", - "email": "Електронна пошта", - "emailDesc": "Будь ласка, надайте унікальну адресу електронної пошти.", "IPLimit": "Обмеження IP", "IPLimitDesc": "Вимикає вхідний, якщо кількість перевищує встановлене значення. (0 = вимкнено)", "IPLimitlog": "Журнал IP", "IPLimitlogDesc": "Журнал історії IP-адрес. (щоб увімкнути вхідну після вимкнення, очистіть журнал)", "IPLimitlogclear": "Очистити журнал", - "setDefaultCert": "Установити сертифікат з панелі", - "telegramDesc": "Будь ласка, вкажіть ID чату Telegram. (використовуйте команду '/id' у боті) або ({'@'}userinfobot)", - "subscriptionDesc": "Щоб знайти URL-адресу вашої підписки, перейдіть до «Деталі». Крім того, ви можете використовувати одне ім'я для кількох клієнтів.", - "info": "Інформація", - "same": "Те саме", - "inboundData": "Вхідні дані", + "addInbound": "Додати вхідний", + "address": "Адреса", + "allTimeTraffic": "Загальний трафік", + "allTimeTrafficUsage": "Загальне використання за весь час", + "certificateContent": "Вміст файлу", + "certificatePath": "Шлях до файлу", + "clickOnQRcode": "Натисніть QR-код, щоб скопіювати", + "client": "Клієнт", + "clone": "Клон", + "cloneInbound": "Клонувати", + "cloneInboundContent": "Усі налаштування цього вхідного потоку, крім порту, IP-адреси прослуховування та клієнтів, будуть застосовані до клону.", + "cloneInboundOk": "Клонувати", + "copyLink": "Копіювати URL", + "createdAt": "Створено", + "delDepletedClients": "Видалити вичерпані клієнти", + "delDepletedClientsContent": "Ви впевнені, що хочете видалити всі вичерпані клієнти?", + "delDepletedClientsTitle": "Видалити вичерпані клієнти", + "deleteClient": "Видалити клієнта", + "deleteClientContent": "Ви впевнені, що хочете видалити клієнт?", + "deleteInbound": "Видалити вхідні", + "deleteInboundContent": "Ви впевнені, що хочете видалити вхідні?", + "deployTo": "Розгорнути на", + "destinationPort": "Порт призначення", + "details": "Деталі", + "email": "Електронна пошта", + "emailDesc": "Будь ласка, надайте унікальну адресу електронної пошти.", + "enable": "Увімкнено", + "expireDate": "Тривалість", + "export": "Експортувати всі URL-адреси", "exportInbound": "Експортувати вхідні", + "generalActions": "Загальні дії", "import": "Імпорт", "importInbound": "Імпортувати вхідний", - "periodicTrafficResetTitle": "Скидання трафіку", - "periodicTrafficResetDesc": "Автоматично скидати лічильник трафіку через певні проміжки часу", + "inboundCount": "Загальна кількість вхідних", + "inboundData": "Вхідні дані", + "info": "Інформація", "lastReset": "Останнє скидання", + "leaveBlankToNeverExpire": "Залиште порожнім, щоб ніколи не закінчувався", + "localPanel": "Локальна панель", + "meansNoLimit": "= Необмежено. (одиниця: ГБ)", + "modifyInbound": "Змінити вхідний", + "monitorDesc": "Залиште порожнім, щоб слухати всі IP-адреси", + "network": "Мережа", + "noRecommendKeepDefault": "Рекомендується зберегти значення за замовчуванням", + "node": "Вузол", + "operate": "Меню", "periodicTrafficReset": { - "never": "Ніколи", "daily": "Щодня", - "weekly": "Щотижня", + "hourly": "Щогодини", "monthly": "Щомісяця", - "hourly": "Щогодини" + "never": "Ніколи", + "weekly": "Щотижня" }, + "periodicTrafficResetDesc": "Автоматично скидати лічильник трафіку через певні проміжки часу", + "periodicTrafficResetTitle": "Скидання трафіку", + "port": "Порт", + "portMap": "Порт-перехід", + "privatekey": "Закритий ключ", + "protocol": "Протокол", + "publicKey": "Публічний ключ", + "remark": "Примітка", + "resetAllClientTrafficContent": "Ви впевнені, що бажаєте скинути трафік усіх клієнтів?", + "resetAllClientTrafficTitle": "Скинути весь трафік клієнтів", + "resetAllClientTraffics": "Скинути весь трафік клієнтів", + "resetAllTraffic": "Скинути весь вхідний трафік", + "resetAllTrafficContent": "Ви впевнені, що бажаєте скинути трафік усіх вхідних?", + "resetAllTrafficTitle": "Скинути весь вхідний трафік", + "resetInboundClientTrafficContent": "Ви впевнені, що бажаєте скинути трафік клієнтів цього вхідного потоку?", + "resetInboundClientTrafficTitle": "Скинути трафік клієнтів", + "resetInboundClientTraffics": "Скинути трафік клієнтів", + "resetTraffic": "Скинути трафік", + "resetTrafficContent": "Ви впевнені, що хочете скинути трафік?", + "same": "Те саме", + "setDefaultCert": "Установити сертифікат з панелі", + "stream": { + "general": { + "name": "Ім'я", + "request": "Запит", + "response": "Відповідь", + "value": "Значення" + }, + "tcp": { + "method": "Метод", + "path": "Шлях", + "requestHeader": "Заголовок запиту", + "responseHeader": "Заголовок відповіді", + "status": "Статус", + "statusDescription": "Опис стану", + "version": "Версія" + } + }, + "subscriptionDesc": "Щоб знайти URL-адресу вашої підписки, перейдіть до «Деталі». Крім того, ви можете використовувати одне ім'я для кількох клієнтів.", + "targetAddress": "Цільова адреса", + "telegramDesc": "Будь ласка, вкажіть ID чату Telegram. (використовуйте команду '/id' у боті) або ({'@'}userinfobot)", + "title": "Вхідні", "toasts": { - "obtain": "Отримати", - "updateSuccess": "Оновлення пройшло успішно", - "logCleanSuccess": "Журнал очищено", - "inboundsUpdateSuccess": "Вхідні підключення успішно оновлено", - "inboundUpdateSuccess": "Вхідне підключення успішно оновлено", - "inboundCreateSuccess": "Вхідне підключення успішно створено", - "inboundDeleteSuccess": "Вхідне підключення успішно видалено", + "delDepletedClientsSuccess": "Усі вичерпані клієнти видалені", + "getNewVlessEncError": "Помилка при отриманні сертифіката VlessEnc.", + "getNewX25519CertError": "Помилка при отриманні сертифіката X25519.", + "getNewmldsa65Error": "Помилка при отриманні сертифіката mldsa65.", "inboundClientAddSuccess": "Клієнт(и) вхідного підключення додано", "inboundClientDeleteSuccess": "Клієнта вхідного підключення видалено", "inboundClientUpdateSuccess": "Клієнта вхідного підключення оновлено", - "delDepletedClientsSuccess": "Усі вичерпані клієнти видалені", + "inboundCreateSuccess": "Вхідне підключення успішно створено", + "inboundDeleteSuccess": "Вхідне підключення успішно видалено", + "inboundUpdateSuccess": "Вхідне підключення успішно оновлено", + "inboundsUpdateSuccess": "Вхідні підключення успішно оновлено", + "logCleanSuccess": "Журнал очищено", + "obtain": "Отримати", "resetAllClientTrafficSuccess": "Весь трафік клієнта скинуто", "resetAllTrafficSuccess": "Весь трафік скинуто", "resetInboundClientTrafficSuccess": "Трафік скинуто", "trafficGetError": "Помилка отримання даних про трафік", - "getNewX25519CertError": "Помилка при отриманні сертифіката X25519.", - "getNewmldsa65Error": "Помилка при отриманні сертифіката mldsa65.", - "getNewVlessEncError": "Помилка при отриманні сертифіката VlessEnc." + "updateSuccess": "Оновлення пройшло успішно" }, - "stream": { - "general": { - "request": "Запит", - "response": "Відповідь", - "name": "Ім'я", - "value": "Значення" - }, - "tcp": { - "version": "Версія", - "method": "Метод", - "path": "Шлях", - "status": "Статус", - "statusDescription": "Опис стану", - "requestHeader": "Заголовок запиту", - "responseHeader": "Заголовок відповіді" - } - } + "totalDownUp": "Всього надісланих/отриманих", + "totalFlow": "Загальна витрата", + "totalUsage": "Всього використанно", + "traffic": "Трафік", + "transportConfig": "Транспорт", + "updatedAt": "Оновлено" }, - "client": { - "add": "Додати клієнта", - "edit": "Редагувати клієнта", - "submitAdd": "Додати клієнта", - "submitEdit": "Зберегти зміни", - "clientCount": "Кількість клієнтів", - "bulk": "Додати групу", - "copyFromInbound": "Скопіювати клієнтів з інбаунда", - "copyToInbound": "Скопіювати клієнтів у", - "copySelected": "Скопіювати вибраних", - "copySource": "Джерело", - "copyEmailPreview": "Попередній перегляд підсумкових email", - "copySelectSourceFirst": "Спочатку виберіть джерело.", - "copyResult": "Результат копіювання", - "copyResultSuccess": "Успішно скопійовано", - "copyResultNone": "Нічого копіювати: жодного клієнта не вибрано або список джерела порожній", - "copyResultErrors": "Помилки під час копіювання", - "copyFlowLabel": "Flow для нових клієнтів (VLESS)", - "copyFlowHint": "Застосується до всіх скопійованих клієнтів. Залиште порожнім, щоб не задавати.", - "selectAll": "Вибрати всіх", - "clearAll": "Зняти все", - "method": "Метод", - "first": "Перший", - "last": "Останній", - "prefix": "Префікс", - "postfix": "Постфікс", - "delayedStart": "Початок використання", - "expireDays": "Тривалість", - "days": "Дні(в)", - "renew": "Автоматичне оновлення", - "renewDesc": "Автоматичне поновлення після закінчення терміну дії. (0 = вимкнено)(одиниця: день)" + "index": { + "backup": "Резервна копія", + "backupTitle": "Резервне копіювання та відновлення", + "charts": "Графіки", + "config": "Конфігурація", + "connectionCount": "Статистика з'єднання", + "cpu": "ЦП", + "currentPanelVersion": "Поточна версія панелі", + "customGeoActions": "Дії", + "customGeoAdd": "Додати", + "customGeoAlias": "Псевдонім", + "customGeoAliasLabelSuffix": " (власний)", + "customGeoAliasPlaceholder": "a-z 0-9 _ -", + "customGeoAliasesError": "Не вдалося завантажити псевдоніми geo", + "customGeoDelete": "Видалити", + "customGeoDeleteConfirm": "Видалити це джерело geo?", + "customGeoDownload": "Оновити зараз", + "customGeoEdit": "Змінити", + "customGeoEmpty": "Користувацьких джерел geo поки немає — натисніть «Додати», щоб створити", + "customGeoEnabled": "Увімкнено", + "customGeoErrAliasPattern": "Псевдонім містить недопустимі символи", + "customGeoErrAliasRequired": "Потрібен псевдонім", + "customGeoErrAliasReserved": "Цей псевдонім зарезервовано", + "customGeoErrDownload": "Помилка завантаження", + "customGeoErrDuplicateAlias": "Цей псевдонім уже використовується для цього типу", + "customGeoErrInvalidType": "Тип має бути geosite або geoip", + "customGeoErrInvalidUrl": "Некоректний URL", + "customGeoErrNotFound": "Джерело geo не знайдено", + "customGeoErrUpdateAllIncomplete": "Не вдалося оновити один або кілька користувацьких джерел", + "customGeoErrUrlHost": "Некоректний хост URL", + "customGeoErrUrlRequired": "Потрібен URL", + "customGeoErrUrlScheme": "URL має використовувати http або https", + "customGeoExtColumn": "Маршрутизація (ext:…)", + "customGeoInvalidId": "Некоректний ідентифікатор ресурсу", + "customGeoLastUpdated": "Оновлено", + "customGeoModalAdd": "Додати користувацький geo", + "customGeoModalEdit": "Змінити користувацький geo", + "customGeoModalSave": "Зберегти", + "customGeoRoutingHint": "У правилах маршрутизації використовуйте значення як ext:файл.dat:тег (замініть тег).", + "customGeoTitle": "Користувацькі GeoSite / GeoIP", + "customGeoToastAdd": "Додати користувацький geo", + "customGeoToastDelete": "Користувацький geofile «{{ .fileName }}» видалено", + "customGeoToastDownload": "Geofile «{{ .fileName }}» оновлено", + "customGeoToastList": "Список користувацьких geo", + "customGeoToastUpdate": "Оновити користувацький geo", + "customGeoToastUpdateAll": "Усі користувацькі джерела оновлено", + "customGeoType": "Тип", + "customGeoUrl": "URL", + "customGeoValidationAlias": "Псевдонім: лише a-z, цифри, - і _", + "customGeoValidationUrl": "URL має починатися з http:// або https://", + "documentation": "Документація", + "dontRefresh": "Інсталяція триває, будь ласка, не оновлюйте цю сторінку", + "download": "Завантаження", + "exportDatabase": "Резервна копія", + "exportDatabaseDesc": "Натисніть, щоб завантажити файл .db, що містить резервну копію вашої поточної бази даних на ваш пристрій.", + "frequency": "Частота", + "geofileUpdateDialog": "Ви дійсно хочете оновити геофайл?", + "geofileUpdateDialogDesc": "Це оновить файл #filename#.", + "geofileUpdatePopover": "Геофайл успішно оновлено", + "geofilesUpdateAll": "Оновити все", + "geofilesUpdateDialogDesc": "Це оновить усі геофайли.", + "getConfigError": "Виникла помилка під час отримання файлу конфігурації", + "getDatabaseError": "Виникла помилка під час отримання бази даних", + "importDatabase": "Відновити", + "importDatabaseDesc": "Натисніть, щоб вибрати та завантажити файл .db з вашого пристрою для відновлення бази даних з резервної копії.", + "importDatabaseError": "Виникла помилка під час імпорту бази даних", + "importDatabaseSuccess": "Базу даних успішно імпортовано", + "ipAddresses": "IP-адреси", + "latestPanelVersion": "Остання версія панелі", + "logicalProcessors": "Логічні процесори", + "logs": "Журнали", + "memory": "ОЗП", + "operationHours": "Час роботи", + "overallSpeed": "Загальна швидкість", + "panelUpToDate": "Панель оновлено", + "panelUpdateCheckPopover": "Перевірка оновлення панелі не вдалася", + "panelUpdateDesc": "Це оновить 3X-UI до останнього релізу та перезапустить сервіс панелі.", + "panelUpdateDialog": "Ви дійсно хочете оновити панель?", + "panelUpdateDialogDesc": "Це оновить 3X-UI до #version# та перезапустить сервіс панелі.", + "panelUpdateStartedPopover": "Розпочато оновлення панелі", + "readDatabaseError": "Виникла помилка під час читання бази даних", + "received": "Отримано", + "restartXray": "Перезапустити", + "sent": "Відправлено", + "stopXray": "Зупинити", + "storage": "Сховище", + "swap": "Своп", + "systemHistoryTitle": "Історія системи", + "systemLoad": "Завантаження системи", + "systemLoadDesc": "Середнє завантаження системи за останні 1, 5 і 15 хвилин", + "threads": "Потоки", + "title": "Огляд", + "toggleIpVisibility": "Перемкнути видимість IP", + "totalData": "Загальний обсяг даних", + "trendLast2Min": "Останні 2 хвилини", + "upToDate": "Оновлено", + "updatePanel": "Оновити панель", + "upload": "Відправка", + "xrayErrorPopoverTitle": "Під час роботи Xray сталася помилка", + "xrayMetricsDisabled": "Кінцева точка метрик Xray не налаштована", + "xrayMetricsHint": "Додайте блок metrics верхнього рівня до конфігурації xray з tag metrics_out і listen 127.0.0.1:11111, потім перезапустіть xray.", + "xrayMetricsTitle": "Метрики Xray", + "xrayObservatoryAlive": "Активний", + "xrayObservatoryDead": "Недоступний", + "xrayObservatoryEmpty": "Даних Observatory ще немає", + "xrayObservatoryHint": "Додайте блок observatory до конфігурації xray зі списком outbound тегів для перевірки, потім перезапустіть xray.", + "xrayObservatoryLastSeen": "Остання активність", + "xrayObservatoryLastTry": "Остання спроба", + "xrayObservatoryTagPlaceholder": "Виберіть outbound", + "xrayStatus": "Xray", + "xrayStatusError": "Помилка", + "xrayStatusRunning": "Запущено", + "xrayStatusStop": "Зупинено", + "xrayStatusUnknown": "Невідомо", + "xraySwitch": "Версія", + "xraySwitchClick": "Виберіть версію, на яку ви хочете перейти.", + "xraySwitchClickDesk": "Вибирайте уважно, оскільки старіші версії можуть бути несумісними з поточними конфігураціями.", + "xraySwitchVersionDialog": "Ви дійсно хочете змінити версію Xray?", + "xraySwitchVersionDialogDesc": "Це змінить версію Xray на #version#.", + "xraySwitchVersionPopover": "Xray успішно оновлено", + "xrayUpdates": "Оновлення Xray" + }, + "login": { + "hello": "Привіт", + "loginAgain": "Ваш сеанс закінчився, увійдіть знову", + "title": "Привітання!", + "toasts": { + "emptyPassword": "Потрібен пароль", + "emptyUsername": "Потрібне ім'я користувача", + "invalidFormData": "Формат вхідних даних недійсний.", + "successLogin": "Ви успішно увійшли до свого облікового запису.", + "wrongUsernameOrPassword": "Невірне ім’я користувача, пароль або код двофакторної аутентифікації." + } }, "nodes": { - "title": "Вузли", + "actions": "Дії", "addNode": "Додати вузол", - "editNode": "Редагувати вузол", - "totalNodes": "Усього вузлів", - "onlineNodes": "Онлайн", - "offlineNodes": "Офлайн", + "address": "Адреса", + "addressPlaceholder": "panel.example.com або 1.2.3.4", + "apiToken": "Токен API", + "apiTokenHint": "Віддалена панель показує свій токен API в Налаштуваннях → Токен API.", + "apiTokenPlaceholder": "Токен зі сторінки Налаштувань віддаленої панелі", "avgLatency": "Середня затримка", + "basePath": "Базовий шлях", + "connectionFailed": "Помилка з'єднання", + "connectionOk": "З'єднання в порядку ({ms} мс)", + "cpu": "CPU", + "deleteConfirmContent": "Це зупинить моніторинг вузла. Сама віддалена панель не зазнає змін.", + "deleteConfirmTitle": "Видалити вузол \"{name}\"?", + "editNode": "Редагувати вузол", + "enable": "Увімкнено", + "justNow": "щойно", + "lastHeartbeat": "Останній пінг", + "latency": "Затримка", + "mem": "Пам'ять", "name": "Назва", "namePlaceholder": "напр. de-frankfurt-1", - "addressPlaceholder": "panel.example.com або 1.2.3.4", - "remark": "Примітка", - "scheme": "Схема", - "address": "Адреса", + "never": "ніколи", + "offlineNodes": "Офлайн", + "onlineNodes": "Онлайн", "port": "Порт", - "basePath": "Базовий шлях", - "apiToken": "Токен API", - "apiTokenPlaceholder": "Токен зі сторінки Налаштувань віддаленої панелі", - "apiTokenHint": "Віддалена панель показує свій токен API в Налаштуваннях → Токен API.", + "probe": "Перевірити зараз", "regenerate": "Перегенерувати токен", "regenerateConfirm": "Перегенерація скасовує поточний токен. Будь-яка центральна панель, що його використовує, втратить доступ до оновлення. Продовжити?", - "enable": "Увімкнено", + "remark": "Примітка", + "scheme": "Схема", "status": "Статус", - "cpu": "CPU", - "mem": "Пам'ять", - "uptime": "Час роботи", - "latency": "Затримка", - "lastHeartbeat": "Останній пінг", - "xrayVersion": "Версія Xray", - "actions": "Дії", - "probe": "Перевірити зараз", - "testConnection": "Перевірити з'єднання", - "connectionOk": "З'єднання в порядку ({ms} мс)", - "connectionFailed": "Помилка з'єднання", - "never": "ніколи", - "justNow": "щойно", - "deleteConfirmTitle": "Видалити вузол \"{name}\"?", - "deleteConfirmContent": "Це зупинить моніторинг вузла. Сама віддалена панель не зазнає змін.", "statusValues": { - "online": "Онлайн", "offline": "Офлайн", + "online": "Онлайн", "unknown": "Невідомо" }, + "testConnection": "Перевірити з'єднання", + "title": "Вузли", "toasts": { - "list": "Не вдалося завантажити вузли", - "obtain": "Не вдалося завантажити вузол", "add": "Додати вузол", - "update": "Оновити вузол", "delete": "Видалити вузол", "deleted": "Вузол видалено", - "test": "Перевірити з'єднання", "fillRequired": "Назва, адреса, порт та токен API є обов'язковими", - "probeFailed": "Помилка перевірки" - } + "list": "Не вдалося завантажити вузли", + "obtain": "Не вдалося завантажити вузол", + "probeFailed": "Помилка перевірки", + "test": "Перевірити з'єднання", + "update": "Оновити вузол" + }, + "totalNodes": "Усього вузлів", + "uptime": "Час роботи", + "xrayVersion": "Версія Xray" }, "settings": { - "title": "Параметри панелі", - "save": "Зберегти", - "infoDesc": "Кожна внесена тут зміна повинна бути збережена. Перезапустіть панель, щоб застосувати зміни.", - "restartPanel": "Перезапустити панель", - "restartPanelDesc": "Ви впевнені, що бажаєте перезапустити панель? Якщо ви не можете отримати доступ до панелі після перезапуску, будь ласка, перегляньте інформацію журналу панелі на сервері.", - "restartPanelSuccess": "Панель успішно перезапущено", - "actions": "Дії", - "resetDefaultConfig": "Відновити значення за замовчуванням", - "panelSettings": "Загальні", - "securitySettings": "Автентифікація", "TGBotSettings": "Telegram Бот", - "panelListeningIP": "Слухати IP", - "panelListeningIPDesc": "IP-адреса для веб-панелі. (залиште порожнім, щоб слухати всі IP-адреси)", - "panelListeningDomain": "Домен прослуховування", - "panelListeningDomainDesc": "Доменне ім'я для веб-панелі. (залиште порожнім, щоб слухати всі домени та IP-адреси)", - "panelPort": "Порт прослуховування", - "panelPortDesc": "Номер порту для веб-панелі. (має бути невикористаний порт)", - "publicKeyPath": "Шлях відкритого ключа", - "publicKeyPathDesc": "Шлях до файлу відкритого ключа для веб-панелі. (починається з ‘/‘)", - "privateKeyPath": "Шлях приватного ключа", - "privateKeyPathDesc": "Шлях до файлу приватного ключа для веб-панелі. (починається з ‘/‘)", - "panelUrlPath": "Шлях URL", - "panelUrlPathDesc": "Шлях URL для веб-панелі. (починається з ‘/‘ і закінчується ‘/‘)", - "pageSize": "Розмір сторінки", - "pageSizeDesc": "Визначити розмір сторінки для вхідної таблиці. (0 = вимкнено)", - "remarkModel": "Модель зауваження та роздільний символ", - "datepicker": "Тип календаря", - "datepickerPlaceholder": "Виберіть дату", - "datepickerDescription": "Заплановані завдання виконуватимуться на основі цього календаря.", - "sampleRemark": "Зразок зауваження", - "oldUsername": "Поточне ім'я користувача", + "actions": "Дії", + "certs": "Сертифікати", "currentPassword": "Поточний пароль", - "newUsername": "Нове ім'я користувача", - "newPassword": "Новий пароль", - "telegramBotEnable": "Увімкнути Telegram Bot", - "telegramBotEnableDesc": "Вмикає бота Telegram.", - "telegramToken": "Telegram Токен", - "telegramTokenDesc": "Токен бота Telegram, отриманий від '{'@'}BotFather'.", - "telegramProxy": "SOCKS Проксі", - "telegramProxyDesc": "Вмикає проксі-сервер SOCKS5 для підключення до Telegram. (відкоригуйте параметри відповідно до посібника)", - "telegramAPIServer": "Сервер Telegram API", - "telegramAPIServerDesc": "Сервер Telegram API для використання. Залиште поле порожнім, щоб використовувати сервер за умовчанням.", - "telegramChatId": "Ідентифікатор чату адміністратора", - "telegramChatIdDesc": "Ідентифікатори чату адміністратора Telegram. (розділені комами) (отримайте тут {'@'}userinfobot) або (використовуйте команду '/id' у боті)", - "telegramNotifyTime": "Час сповіщення", - "telegramNotifyTimeDesc": "Час повідомлення бота Telegram, встановлений для періодичних звітів. (використовуйте формат часу crontab)", - "tgNotifyBackup": "Резервне копіювання бази даних", - "tgNotifyBackupDesc": "Надіслати файл резервної копії бази даних зі звітом.", - "tgNotifyLogin": "Сповіщення про вхід", - "tgNotifyLoginDesc": "Отримувати сповіщення про ім'я користувача, IP-адресу та час щоразу, коли хтось намагається увійти у вашу веб-панель.", - "sessionMaxAge": "Тривалість сеансу", - "sessionMaxAgeDesc": "Тривалість, протягом якої ви можете залишатися в системі. (одиниця: хвилина)", + "dateAndTime": "Дата та час", + "datepicker": "Тип календаря", + "datepickerDescription": "Заплановані завдання виконуватимуться на основі цього календаря.", + "datepickerPlaceholder": "Виберіть дату", + "direct": "Пряме підключення", + "directDesc": "Безпосередньо встановлює з’єднання з доменами або діапазонами IP певної країни.", "expireTimeDiff": "Повідомлення про дату закінчення", "expireTimeDiffDesc": "Отримувати сповіщення про термін дії при досягненні цього порогу. (одиниця: день)", - "trafficDiff": "Повідомлення про обмеження трафіку", - "trafficDiffDesc": "Отримувати сповіщення про обмеження трафіку при досягненні цього порогу. (одиниця: ГБ)", - "tgNotifyCpu": "Сповіщення про завантаження ЦП", - "tgNotifyCpuDesc": "Отримувати сповіщення, якщо навантаження ЦП перевищує це порогове значення. (одиниця: %)", - "timeZone": "Часовий пояс", - "timeZoneDesc": "Заплановані завдання виконуватимуться на основі цього часового поясу.", - "subSettings": "Підписка", - "subEnable": "Увімкнути службу підписки", - "subEnableDesc": "Вмикає службу підписки.", - "subJsonEnable": "Увімкнути/вимкнути JSON-кінець підписки незалежно.", - "subTitle": "Назва Підписки", - "subTitleDesc": "Назва, яка відображається у VPN-клієнті", - "subSupportUrl": "URL підтримки", - "subSupportUrlDesc": "Посилання на технічну підтримку, що відображається у VPN-клієнті", - "subProfileUrl": "URL профілю", - "subProfileUrlDesc": "Посилання на ваш вебсайт, що відображається у VPN-клієнті", - "subAnnounce": "Оголошення", - "subAnnounceDesc": "Текст оголошення, що відображається у VPN-клієнті", - "subEnableRouting": "Увімкнути маршрутизацію", - "subEnableRoutingDesc": "Глобальне налаштування для увімкнення маршрутизації у VPN-клієнті. (Тільки для Happ)", - "subRoutingRules": "Правила маршрутизації", - "subRoutingRulesDesc": "Глобальні правила маршрутизації для VPN-клієнта. (Тільки для Happ)", - "subListen": "Слухати IP", - "subListenDesc": "IP-адреса для служби підписки. (залиште порожнім, щоб слухати всі IP-адреси)", - "subPort": "Слухати порт", - "subPortDesc": "Номер порту для служби підписки. (має бути невикористаний порт)", - "subCertPath": "Шлях відкритого ключа", - "subCertPathDesc": "Шлях до файлу відкритого ключа для служби підписки. (починається з ‘/‘)", - "subKeyPath": "Шлях приватного ключа", - "subKeyPathDesc": "Шлях до файлу приватного ключа для служби підписки. (починається з ‘/‘)", - "subPath": "Шлях URI", - "subPathDesc": "Шлях URI для служби підписки. (починається з ‘/‘ і закінчується ‘/‘)", - "subDomain": "Домен прослуховування", - "subDomainDesc": "Ім'я домену для служби підписки. (залиште порожнім, щоб слухати всі домени та IP-адреси)", - "subUpdates": "Інтервали оновлення", - "subUpdatesDesc": "Інтервали оновлення URL-адреси підписки в клієнтських програмах. (одиниця: година)", - "subEncrypt": "Закодувати", - "subEncryptDesc": "Повернений вміст послуги підписки матиме кодування Base64.", - "subShowInfo": "Показати інформацію про використання", - "subShowInfoDesc": "Залишок трафіку та дата відображатимуться в клієнтських програмах.", - "subURI": "URI зворотного проксі", - "subURIDesc": "URI до URL-адреси підписки для використання за проксі.", + "externalTraffic": "Зовнішній трафік", "externalTrafficInformEnable": "Інформація про зовнішній трафік", "externalTrafficInformEnableDesc": "Інформувати зовнішній API про кожне оновлення трафіку.", "externalTrafficInformURI": "Інформаційний URI зовнішнього трафіку", "externalTrafficInformURIDesc": "Оновлення трафіку надсилаються на цей URI.", - "restartXrayOnClientDisable": "Перезапускати Xray після авто-вимкнення", - "restartXrayOnClientDisableDesc": "Коли клієнт автоматично вимикається через закінчення терміну дії або ліміт трафіку, перезапускати Xray.", "fragment": "Фрагментація", "fragmentDesc": "Увімкнути фрагментацію для пакету привітання TLS", "fragmentSett": "Параметри фрагментації", - "noisesDesc": "Увімкнути Noises.", - "noisesSett": "Налаштування Noises", + "infoDesc": "Кожна внесена тут зміна повинна бути збережена. Перезапустіть панель, щоб застосувати зміни.", + "information": "Інформація", + "intervals": "Інтервали", + "language": "Мова", "mux": "Mux", "muxDesc": "Передавати кілька незалежних потоків даних у межах встановленого потоку даних.", "muxSett": "Налаштування Mux", - "direct": "Пряме підключення", - "directDesc": "Безпосередньо встановлює з’єднання з доменами або діапазонами IP певної країни.", + "newPassword": "Новий пароль", + "newUsername": "Нове ім'я користувача", + "noisesDesc": "Увімкнути Noises.", + "noisesSett": "Налаштування Noises", "notifications": "Сповіщення", - "certs": "Сертифікати", - "externalTraffic": "Зовнішній трафік", - "dateAndTime": "Дата та час", + "oldUsername": "Поточне ім'я користувача", + "pageSize": "Розмір сторінки", + "pageSizeDesc": "Визначити розмір сторінки для вхідної таблиці. (0 = вимкнено)", + "panelListeningDomain": "Домен прослуховування", + "panelListeningDomainDesc": "Доменне ім'я для веб-панелі. (залиште порожнім, щоб слухати всі домени та IP-адреси)", + "panelListeningIP": "Слухати IP", + "panelListeningIPDesc": "IP-адреса для веб-панелі. (залиште порожнім, щоб слухати всі IP-адреси)", + "panelPort": "Порт прослуховування", + "panelPortDesc": "Номер порту для веб-панелі. (має бути невикористаний порт)", + "panelSettings": "Загальні", + "panelUrlPath": "Шлях URL", + "panelUrlPathDesc": "Шлях URL для веб-панелі. (починається з ‘/‘ і закінчується ‘/‘)", + "privateKeyPath": "Шлях приватного ключа", + "privateKeyPathDesc": "Шлях до файлу приватного ключа для веб-панелі. (починається з ‘/‘)", "proxyAndServer": "Проксі та сервер", - "intervals": "Інтервали", - "information": "Інформація", - "language": "Мова", - "telegramBotLanguage": "Мова Telegram-бота", + "publicKeyPath": "Шлях відкритого ключа", + "publicKeyPathDesc": "Шлях до файлу відкритого ключа для веб-панелі. (починається з ‘/‘)", + "remarkModel": "Модель зауваження та роздільний символ", + "resetDefaultConfig": "Відновити значення за замовчуванням", + "restartPanel": "Перезапустити панель", + "restartPanelDesc": "Ви впевнені, що бажаєте перезапустити панель? Якщо ви не можете отримати доступ до панелі після перезапуску, будь ласка, перегляньте інформацію журналу панелі на сервері.", + "restartPanelSuccess": "Панель успішно перезапущено", + "restartXrayOnClientDisable": "Перезапускати Xray після авто-вимкнення", + "restartXrayOnClientDisableDesc": "Коли клієнт автоматично вимикається через закінчення терміну дії або ліміт трафіку, перезапускати Xray.", + "sampleRemark": "Зразок зауваження", + "save": "Зберегти", "security": { "admin": "Облікові дані адміністратора", "twoFactor": "Двофакторна аутентифікація", "twoFactorEnable": "Увімкнути 2FA", "twoFactorEnableDesc": "Додає додатковий рівень аутентифікації для підвищення безпеки.", - "twoFactorModalSetTitle": "Увімкнути двофакторну аутентифікацію", - "twoFactorModalDeleteTitle": "Вимкнути двофакторну аутентифікацію", - "twoFactorModalSteps": "Щоб налаштувати двофакторну аутентифікацію, виконайте кілька кроків:", - "twoFactorModalFirstStep": "1. Відскануйте цей QR-код у програмі для аутентифікації або скопіюйте токен біля QR-коду та вставте його в програму", - "twoFactorModalSecondStep": "2. Введіть код з програми", - "twoFactorModalRemoveStep": "Введіть код з програми, щоб вимкнути двофакторну аутентифікацію.", - "twoFactorModalChangeCredentialsTitle": "Змінити облікові дані", "twoFactorModalChangeCredentialsStep": "Введіть код з додатку, щоб змінити облікові дані адміністратора.", - "twoFactorModalSetSuccess": "Двофакторна аутентифікація була успішно встановлена", + "twoFactorModalChangeCredentialsTitle": "Змінити облікові дані", "twoFactorModalDeleteSuccess": "Двофакторна аутентифікація була успішно видалена", - "twoFactorModalError": "Невірний код" + "twoFactorModalDeleteTitle": "Вимкнути двофакторну аутентифікацію", + "twoFactorModalError": "Невірний код", + "twoFactorModalFirstStep": "1. Відскануйте цей QR-код у програмі для аутентифікації або скопіюйте токен біля QR-коду та вставте його в програму", + "twoFactorModalRemoveStep": "Введіть код з програми, щоб вимкнути двофакторну аутентифікацію.", + "twoFactorModalSecondStep": "2. Введіть код з програми", + "twoFactorModalSetSuccess": "Двофакторна аутентифікація була успішно встановлена", + "twoFactorModalSetTitle": "Увімкнути двофакторну аутентифікацію", + "twoFactorModalSteps": "Щоб налаштувати двофакторну аутентифікацію, виконайте кілька кроків:" }, + "securitySettings": "Автентифікація", + "sessionMaxAge": "Тривалість сеансу", + "sessionMaxAgeDesc": "Тривалість, протягом якої ви можете залишатися в системі. (одиниця: хвилина)", + "subAnnounce": "Оголошення", + "subAnnounceDesc": "Текст оголошення, що відображається у VPN-клієнті", + "subCertPath": "Шлях відкритого ключа", + "subCertPathDesc": "Шлях до файлу відкритого ключа для служби підписки. (починається з ‘/‘)", + "subDomain": "Домен прослуховування", + "subDomainDesc": "Ім'я домену для служби підписки. (залиште порожнім, щоб слухати всі домени та IP-адреси)", + "subEnable": "Увімкнути службу підписки", + "subEnableDesc": "Вмикає службу підписки.", + "subEnableRouting": "Увімкнути маршрутизацію", + "subEnableRoutingDesc": "Глобальне налаштування для увімкнення маршрутизації у VPN-клієнті. (Тільки для Happ)", + "subEncrypt": "Закодувати", + "subEncryptDesc": "Повернений вміст послуги підписки матиме кодування Base64.", + "subJsonEnable": "Увімкнути/вимкнути JSON-кінець підписки незалежно.", + "subKeyPath": "Шлях приватного ключа", + "subKeyPathDesc": "Шлях до файлу приватного ключа для служби підписки. (починається з ‘/‘)", + "subListen": "Слухати IP", + "subListenDesc": "IP-адреса для служби підписки. (залиште порожнім, щоб слухати всі IP-адреси)", + "subPath": "Шлях URI", + "subPathDesc": "Шлях URI для служби підписки. (починається з ‘/‘ і закінчується ‘/‘)", + "subPort": "Слухати порт", + "subPortDesc": "Номер порту для служби підписки. (має бути невикористаний порт)", + "subProfileUrl": "URL профілю", + "subProfileUrlDesc": "Посилання на ваш вебсайт, що відображається у VPN-клієнті", + "subRoutingRules": "Правила маршрутизації", + "subRoutingRulesDesc": "Глобальні правила маршрутизації для VPN-клієнта. (Тільки для Happ)", + "subSettings": "Підписка", + "subShowInfo": "Показати інформацію про використання", + "subShowInfoDesc": "Залишок трафіку та дата відображатимуться в клієнтських програмах.", + "subSupportUrl": "URL підтримки", + "subSupportUrlDesc": "Посилання на технічну підтримку, що відображається у VPN-клієнті", + "subTitle": "Назва Підписки", + "subTitleDesc": "Назва, яка відображається у VPN-клієнті", + "subURI": "URI зворотного проксі", + "subURIDesc": "URI до URL-адреси підписки для використання за проксі.", + "subUpdates": "Інтервали оновлення", + "subUpdatesDesc": "Інтервали оновлення URL-адреси підписки в клієнтських програмах. (одиниця: година)", + "telegramAPIServer": "Сервер Telegram API", + "telegramAPIServerDesc": "Сервер Telegram API для використання. Залиште поле порожнім, щоб використовувати сервер за умовчанням.", + "telegramBotEnable": "Увімкнути Telegram Bot", + "telegramBotEnableDesc": "Вмикає бота Telegram.", + "telegramBotLanguage": "Мова Telegram-бота", + "telegramChatId": "Ідентифікатор чату адміністратора", + "telegramChatIdDesc": "Ідентифікатори чату адміністратора Telegram. (розділені комами) (отримайте тут {'@'}userinfobot) або (використовуйте команду '/id' у боті)", + "telegramNotifyTime": "Час сповіщення", + "telegramNotifyTimeDesc": "Час повідомлення бота Telegram, встановлений для періодичних звітів. (використовуйте формат часу crontab)", + "telegramProxy": "SOCKS Проксі", + "telegramProxyDesc": "Вмикає проксі-сервер SOCKS5 для підключення до Telegram. (відкоригуйте параметри відповідно до посібника)", + "telegramToken": "Telegram Токен", + "telegramTokenDesc": "Токен бота Telegram, отриманий від '{'@'}BotFather'.", + "tgNotifyBackup": "Резервне копіювання бази даних", + "tgNotifyBackupDesc": "Надіслати файл резервної копії бази даних зі звітом.", + "tgNotifyCpu": "Сповіщення про завантаження ЦП", + "tgNotifyCpuDesc": "Отримувати сповіщення, якщо навантаження ЦП перевищує це порогове значення. (одиниця: %)", + "tgNotifyLogin": "Сповіщення про вхід", + "tgNotifyLoginDesc": "Отримувати сповіщення про ім'я користувача, IP-адресу та час щоразу, коли хтось намагається увійти у вашу веб-панель.", + "timeZone": "Часовий пояс", + "timeZoneDesc": "Заплановані завдання виконуватимуться на основі цього часового поясу.", + "title": "Параметри панелі", "toasts": { - "modifySettings": "Параметри було змінено.", - "getSettings": "Виникла помилка під час отримання параметрів.", - "modifyUserError": "Виникла помилка під час зміни облікових даних адміністратора.", - "modifyUser": "Ви успішно змінили облікові дані адміністратора.", - "originalUserPassIncorrect": "Поточне ім'я користувача або пароль недійсні", - "userPassMustBeNotEmpty": "Нове ім'я користувача та пароль порожні", "getOutboundTrafficError": "Помилка отримання вихідного трафіку", - "resetOutboundTrafficError": "Помилка скидання вихідного трафіку" - } + "getSettings": "Виникла помилка під час отримання параметрів.", + "modifySettings": "Параметри було змінено.", + "modifyUser": "Ви успішно змінили облікові дані адміністратора.", + "modifyUserError": "Виникла помилка під час зміни облікових даних адміністратора.", + "originalUserPassIncorrect": "Поточне ім'я користувача або пароль недійсні", + "resetOutboundTrafficError": "Помилка скидання вихідного трафіку", + "userPassMustBeNotEmpty": "Нове ім'я користувача та пароль порожні" + }, + "trafficDiff": "Повідомлення про обмеження трафіку", + "trafficDiffDesc": "Отримувати сповіщення про обмеження трафіку при досягненні цього порогу. (одиниця: ГБ)" }, "xray": { - "title": "Xray конфігурації", - "save": "Зберегти", - "restart": "Перезапустити Xray", - "restartSuccess": "Xray успішно перезапущено", - "stopSuccess": "Xray успішно зупинено", - "restartError": "Виникла помилка під час перезапуску Xray.", - "stopError": "Виникла помилка під час зупинки Xray.", - "basicTemplate": "Базовий шаблон", - "advancedTemplate": "Додатково", - "generalConfigs": "Загальні конфігурації", - "generalConfigsDesc": "Ці параметри визначатимуть загальні налаштування.", - "logConfigs": "Журнал", - "logConfigsDesc": "Журнали можуть вплинути на ефективність вашого сервера. Рекомендується вмикати його з розумом лише у випадку ваших потреб", - "blockConfigsDesc": "Ці параметри блокуватимуть трафік на основі конкретних запитуваних протоколів і веб-сайтів.", - "basicRouting": "Основна Маршрутизація", - "blockConnectionsConfigsDesc": "Ці параметри блокуватимуть трафік на основі запитаних країн.", - "directConnectionsConfigsDesc": "Пряме з'єднання гарантує, що певний трафік не буде маршрутизовано через інший сервер.", - "blockips": "Блокувати IP", - "blockdomains": "Блокувати домени", - "directips": "Прямі IP", - "directdomains": "Прямі домени", - "ipv4Routing": "Маршрутизація IPv4", - "ipv4RoutingDesc": "Ці параметри спрямовуватимуть трафік на основі певного призначення через IPv4.", - "warpRouting": "WARP Маршрутизація", - "warpRoutingDesc": "Ці параметри маршрутизуватимуть трафік на основі певного пункту призначення через WARP.", - "nordRouting": "Маршрутизація NordVPN", - "nordRoutingDesc": "Ці параметри маршрутизуватимуть трафік на основі певного пункту призначення через NordVPN.", - "Template": "Шаблон розширеної конфігурації Xray", - "TemplateDesc": "Остаточний конфігураційний файл Xray буде створено на основі цього шаблону.", + "Balancers": "Балансери", "FreedomStrategy": "Стратегія протоколу свободи", "FreedomStrategyDesc": "Установити стратегію виведення для мережі в протоколі свободи.", - "RoutingStrategy": "Загальна стратегія маршрутизації", - "RoutingStrategyDesc": "Установити загальну стратегію маршрутизації трафіку для вирішення всіх запитів.", - "outboundTestUrl": "URL тесту outbound", - "outboundTestUrlDesc": "URL для перевірки з'єднання outbound", - "Torrent": "Блокувати протокол BitTorrent", "Inbounds": "Вхідні", "InboundsDesc": "Прийняття певних клієнтів.", "Outbounds": "Вихід", - "Balancers": "Балансери", "OutboundsDesc": "Встановити шлях вихідного трафіку.", + "RoutingStrategy": "Загальна стратегія маршрутизації", + "RoutingStrategyDesc": "Установити загальну стратегію маршрутизації трафіку для вирішення всіх запитів.", "Routings": "Правила маршрутизації", "RoutingsDesc": "Пріоритет кожного правила важливий!", - "completeTemplate": "Усі", - "logLevel": "Рівень журналу", - "logLevelDesc": "Рівень журналу для журналів помилок із зазначенням інформації, яку потрібно записати.", + "Template": "Шаблон розширеної конфігурації Xray", + "TemplateDesc": "Остаточний конфігураційний файл Xray буде створено на основі цього шаблону.", + "Torrent": "Блокувати протокол BitTorrent", "accessLog": "Журнал доступу", "accessLogDesc": "Шлях до файлу журналу доступу. Спеціальне значення 'none' вимикає журнали доступу", - "errorLog": "Журнал помилок", - "errorLogDesc": "Шлях до файлу журналу помилок. Спеціальне значення 'none' вимикає журнали помилок", - "dnsLog": "Журнал DNS", - "dnsLogDesc": "Чи включити журнали запитів DNS", - "maskAddress": "Маскувати Адресу", - "maskAddressDesc": "Маска IP-адреси, при активації автоматично замінює IP-адресу, яка з'являється у журналі.", - "statistics": "Статистика", - "statsInboundUplink": "Статистика вхідного аплінку", - "statsInboundUplinkDesc": "Увімкнення збору статистики для вхідного трафіку всіх вхідних проксі.", - "statsInboundDownlink": "Статистика вхідного даунлінку", - "statsInboundDownlinkDesc": "Увімкнення збору статистики для вихідного трафіку всіх вхідних проксі.", - "statsOutboundUplink": "Статистика вихідного аплінку", - "statsOutboundUplinkDesc": "Увімкнення збору статистики для вхідного трафіку всіх вихідних проксі.", - "statsOutboundDownlink": "Статистика вихідного даунлінку", - "statsOutboundDownlinkDesc": "Увімкнення збору статистики для вихідного трафіку всіх вихідних проксі.", - "rules": { - "first": "Перший", - "last": "Останній", - "up": "Вгору", - "down": "Вниз", - "source": "Джерело", - "dest": "Пункт призначення", - "inbound": "Вхідний", - "outbound": "Вихідний", - "balancer": "Балансувальник", - "info": "Інформація", - "add": "Додати правило", - "edit": "Редагувати правило", - "useComma": "Елементи, розділені комами" - }, - "outbound": { - "addOutbound": "Додати вихідний", - "addReverse": "Додати реверс", - "editOutbound": "Редагувати вихідні", - "editReverse": "Редагувати реверс", - "reverseTag": "Тег реверс-проксі", - "reverseTagDesc": "Тег вихідного з'єднання для простого реверс-проксі VLESS. Залиште порожнім для вимкнення.", - "reverseTagPlaceholder": "тег вихідного (порожнє = вимкнено)", - "tag": "Тег", - "tagDesc": "Унікальний тег", - "address": "Адреса", - "reverse": "Зворотний", - "domain": "Домен", - "type": "Тип", - "bridge": "Міст", - "portal": "Портал", - "link": "Посилання", - "intercon": "Взаємозв'язок", - "settings": "Налаштування", - "accountInfo": "Інформація про обліковий запис", - "outboundStatus": "Статус виходу", - "sendThrough": "Надіслати через", - "test": "Тест", - "testResult": "Результат тесту", - "testing": "Тестування з'єднання...", - "testSuccess": "Тест успішний", - "testFailed": "Тест не пройдено", - "testError": "Не вдалося протестувати вихідне з'єднання", - "nordvpn": "NordVPN", - "accessToken": "Токен доступу", - "country": "Країна", - "server": "Сервер", - "city": "Місто", - "allCities": "Усі міста", - "privateKey": "Приватний ключ", - "load": "Навантаження" - }, + "advancedTemplate": "Додатково", "balancer": { "addBalancer": "Додати балансир", - "editBalancer": "Редагувати балансир", - "balancerStrategy": "Стратегія", + "balancerDesc": "Неможливо використовувати balancerTag і outboundTag одночасно. Якщо використовувати одночасно, працюватиме лише outboundTag.", "balancerSelectors": "Селектори", + "balancerStrategy": "Стратегія", + "editBalancer": "Редагувати балансир", "tag": "Тег", - "tagDesc": "Унікальний тег", - "balancerDesc": "Неможливо використовувати balancerTag і outboundTag одночасно. Якщо використовувати одночасно, працюватиме лише outboundTag." - }, - "wireguard": { - "secretKey": "Приватний ключ", - "publicKey": "Публічний ключ", - "allowedIPs": "Дозволені IP-адреси", - "endpoint": "Кінцева точка", - "psk": "Спільний ключ", - "domainStrategy": "Стратегія домену" - }, - "tun": { - "nameDesc": "Назва інтерфейсу TUN. Значення за замовчуванням - 'xray0'", - "mtuDesc": "Максимальна одиниця передачі. Максимальний розмір пакетів даних. Значення за замовчуванням - 1500", - "userLevel": "Рівень користувача", - "userLevelDesc": "Всі з'єднання, встановлені через цей вхід, використовуватимуть цей рівень користувача. Значення за замовчуванням - 0" + "tagDesc": "Унікальний тег" }, + "basicRouting": "Основна Маршрутизація", + "basicTemplate": "Базовий шаблон", + "blockConfigsDesc": "Ці параметри блокуватимуть трафік на основі конкретних запитуваних протоколів і веб-сайтів.", + "blockConnectionsConfigsDesc": "Ці параметри блокуватимуть трафік на основі запитаних країн.", + "blockdomains": "Блокувати домени", + "blockips": "Блокувати IP", + "completeTemplate": "Усі", + "directConnectionsConfigsDesc": "Пряме з'єднання гарантує, що певний трафік не буде маршрутизовано через інший сервер.", + "directdomains": "Прямі домени", + "directips": "Прямі IP", "dns": { - "enable": "Увімкнути DNS", - "enableDesc": "Увімкнути вбудований DNS-сервер", - "tag": "Мітка вхідного DNS", - "tagDesc": "Ця мітка буде доступна як вхідна мітка в правилах маршрутизації.", + "add": "Додати сервер", + "clearAll": "Видалити всі", + "clearAllConfirm": "Усі DNS-сервери буде видалено зі списку. Дію не можна скасувати.", + "clearAllTitle": "Видалити всі DNS-сервери?", "clientIp": "IP клієнта", "clientIpDesc": "Використовується для повідомлення серверу про вказане місцезнаходження IP під час DNS-запитів", "disableCache": "Вимкнути кеш", @@ -753,217 +607,371 @@ "disableFallbackDesc": "Вимкнути резервні DNS-запити", "disableFallbackIfMatch": "Вимкнути резервний DNS при збігу", "disableFallbackIfMatchDesc": "Вимкнути резервні DNS-запити при збігу списку доменів DNS-сервера", + "dnsPresetFamily": "Сімейний", + "dnsPresetTitle": "Шаблони DNS", + "domains": "Домени", + "edit": "Редагувати сервер", + "enable": "Увімкнути DNS", + "enableDesc": "Увімкнути вбудований DNS-сервер", "enableParallelQuery": "Увімкнути паралельні запити", "enableParallelQueryDesc": "Увімкнути паралельні DNS-запити до кількох серверів для швидшого вирішення", - "strategy": "Стратегія запиту", - "strategyDesc": "Загальна стратегія вирішення доменних імен", - "add": "Додати сервер", - "edit": "Редагувати сервер", - "domains": "Домени", "expectIPs": "Очікувані IP", - "unexpectIPs": "Неочікувані IP", - "useSystemHosts": "Використовувати системні Hosts", - "useSystemHostsDesc": "Використовувати файл hosts з встановленої системи", - "usePreset": "Використати шаблон", - "dnsPresetTitle": "Шаблони DNS", - "dnsPresetFamily": "Сімейний", - "serveStale": "Видавати застарілі", - "serveStaleDesc": "Повертати застарілі результати з кешу під час фонового оновлення", - "serveExpiredTTL": "TTL застарілих", - "serveExpiredTTLDesc": "Термін дії (секунди) застарілих записів кешу; 0 = ніколи", - "timeoutMs": "Тайм-аут (мс)", - "skipFallback": "Пропустити Fallback", "finalQuery": "Фінальний запит", "hosts": "Hosts", "hostsAdd": "Додати Host", - "hostsEmpty": "Host не визначено", "hostsDomain": "Домен (напр. domain:example.com)", + "hostsEmpty": "Host не визначено", "hostsValues": "IP або домен — введіть і натисніть Enter", - "clearAll": "Видалити всі", - "clearAllTitle": "Видалити всі DNS-сервери?", - "clearAllConfirm": "Усі DNS-сервери буде видалено зі списку. Дію не можна скасувати." + "serveExpiredTTL": "TTL застарілих", + "serveExpiredTTLDesc": "Термін дії (секунди) застарілих записів кешу; 0 = ніколи", + "serveStale": "Видавати застарілі", + "serveStaleDesc": "Повертати застарілі результати з кешу під час фонового оновлення", + "skipFallback": "Пропустити Fallback", + "strategy": "Стратегія запиту", + "strategyDesc": "Загальна стратегія вирішення доменних імен", + "tag": "Мітка вхідного DNS", + "tagDesc": "Ця мітка буде доступна як вхідна мітка в правилах маршрутизації.", + "timeoutMs": "Тайм-аут (мс)", + "unexpectIPs": "Неочікувані IP", + "usePreset": "Використати шаблон", + "useSystemHosts": "Використовувати системні Hosts", + "useSystemHostsDesc": "Використовувати файл hosts з встановленої системи" }, + "dnsLog": "Журнал DNS", + "dnsLogDesc": "Чи включити журнали запитів DNS", + "errorLog": "Журнал помилок", + "errorLogDesc": "Шлях до файлу журналу помилок. Спеціальне значення 'none' вимикає журнали помилок", "fakedns": { "add": "Додати підроблений DNS", "edit": "Редагувати підроблений DNS", "ipPool": "Підмережа IP-пулу", "poolSize": "Розмір пулу" + }, + "generalConfigs": "Загальні конфігурації", + "generalConfigsDesc": "Ці параметри визначатимуть загальні налаштування.", + "ipv4Routing": "Маршрутизація IPv4", + "ipv4RoutingDesc": "Ці параметри спрямовуватимуть трафік на основі певного призначення через IPv4.", + "logConfigs": "Журнал", + "logConfigsDesc": "Журнали можуть вплинути на ефективність вашого сервера. Рекомендується вмикати його з розумом лише у випадку ваших потреб", + "logLevel": "Рівень журналу", + "logLevelDesc": "Рівень журналу для журналів помилок із зазначенням інформації, яку потрібно записати.", + "maskAddress": "Маскувати Адресу", + "maskAddressDesc": "Маска IP-адреси, при активації автоматично замінює IP-адресу, яка з'являється у журналі.", + "nordRouting": "Маршрутизація NordVPN", + "nordRoutingDesc": "Ці параметри маршрутизуватимуть трафік на основі певного пункту призначення через NordVPN.", + "outbound": { + "accessToken": "Токен доступу", + "accountInfo": "Інформація про обліковий запис", + "addOutbound": "Додати вихідний", + "addReverse": "Додати реверс", + "address": "Адреса", + "allCities": "Усі міста", + "bridge": "Міст", + "city": "Місто", + "country": "Країна", + "domain": "Домен", + "editOutbound": "Редагувати вихідні", + "editReverse": "Редагувати реверс", + "intercon": "Взаємозв'язок", + "link": "Посилання", + "load": "Навантаження", + "nordvpn": "NordVPN", + "outboundStatus": "Статус виходу", + "portal": "Портал", + "privateKey": "Приватний ключ", + "reverse": "Зворотний", + "reverseTag": "Тег реверс-проксі", + "reverseTagDesc": "Тег вихідного з'єднання для простого реверс-проксі VLESS. Залиште порожнім для вимкнення.", + "reverseTagPlaceholder": "тег вихідного (порожнє = вимкнено)", + "sendThrough": "Надіслати через", + "server": "Сервер", + "settings": "Налаштування", + "tag": "Тег", + "tagDesc": "Унікальний тег", + "test": "Тест", + "testError": "Не вдалося протестувати вихідне з'єднання", + "testFailed": "Тест не пройдено", + "testResult": "Результат тесту", + "testSuccess": "Тест успішний", + "testing": "Тестування з'єднання...", + "type": "Тип" + }, + "outboundTestUrl": "URL тесту outbound", + "outboundTestUrlDesc": "URL для перевірки з'єднання outbound", + "restart": "Перезапустити Xray", + "restartError": "Виникла помилка під час перезапуску Xray.", + "restartSuccess": "Xray успішно перезапущено", + "rules": { + "add": "Додати правило", + "balancer": "Балансувальник", + "dest": "Пункт призначення", + "down": "Вниз", + "edit": "Редагувати правило", + "first": "Перший", + "inbound": "Вхідний", + "info": "Інформація", + "last": "Останній", + "outbound": "Вихідний", + "source": "Джерело", + "up": "Вгору", + "useComma": "Елементи, розділені комами" + }, + "save": "Зберегти", + "statistics": "Статистика", + "statsInboundDownlink": "Статистика вхідного даунлінку", + "statsInboundDownlinkDesc": "Увімкнення збору статистики для вихідного трафіку всіх вхідних проксі.", + "statsInboundUplink": "Статистика вхідного аплінку", + "statsInboundUplinkDesc": "Увімкнення збору статистики для вхідного трафіку всіх вхідних проксі.", + "statsOutboundDownlink": "Статистика вихідного даунлінку", + "statsOutboundDownlinkDesc": "Увімкнення збору статистики для вихідного трафіку всіх вихідних проксі.", + "statsOutboundUplink": "Статистика вихідного аплінку", + "statsOutboundUplinkDesc": "Увімкнення збору статистики для вхідного трафіку всіх вихідних проксі.", + "stopError": "Виникла помилка під час зупинки Xray.", + "stopSuccess": "Xray успішно зупинено", + "title": "Xray конфігурації", + "tun": { + "mtuDesc": "Максимальна одиниця передачі. Максимальний розмір пакетів даних. Значення за замовчуванням - 1500", + "nameDesc": "Назва інтерфейсу TUN. Значення за замовчуванням - 'xray0'", + "userLevel": "Рівень користувача", + "userLevelDesc": "Всі з'єднання, встановлені через цей вхід, використовуватимуть цей рівень користувача. Значення за замовчуванням - 0" + }, + "warpRouting": "WARP Маршрутизація", + "warpRoutingDesc": "Ці параметри маршрутизуватимуть трафік на основі певного пункту призначення через WARP.", + "wireguard": { + "allowedIPs": "Дозволені IP-адреси", + "domainStrategy": "Стратегія домену", + "endpoint": "Кінцева точка", + "psk": "Спільний ключ", + "publicKey": "Публічний ключ", + "secretKey": "Приватний ключ" } } }, + "password": "Пароль", + "path": "Шлях", + "protocol": "Протокол", + "qrCode": "QR-Код", + "remained": "Залишилося", + "remark": "Примітка", + "reset": "Скидання", + "save": "Зберегти", + "search": "Пошук", + "secAlertConf": "Деякі налаштування вразливі до атак. Рекомендується посилити протоколи безпеки, щоб запобігти можливим порушенням.", + "secAlertPanelPort": "Стандартний порт панелі вразливий. Будь ласка, сконфігуруйте випадковий або конкретний порт.", + "secAlertPanelURI": "Стандартний URI-шлях панелі небезпечний. Будь ласка, сконфігуруйте складний URI-шлях.", + "secAlertSSL": "Панель не має безпечного з'єднання. Будь ласка, встановіть сертифікат TLS для захисту даних.", + "secAlertSsl": "Це з'єднання не є безпечним. Будь ласка, уникайте введення конфіденційної інформації, поки TLS не буде активовано для захисту даних.", + "secAlertSubJsonURI": "Стандартний URI-шлях JSON підписки небезпечний. Будь ласка, сконфігуруйте складний URI-шлях.", + "secAlertSubURI": "Стандартний URI-шлях підписки небезпечний. Будь ласка, сконфігуруйте складний URI-шлях.", + "secAlertTitle": "Попередження системи безпеки", + "second": "Секунда", + "security": "Беспека", + "somethingWentWrong": "Щось пішло не так", + "status": "Статус", + "subscription": { + "active": "Активна", + "downloaded": "Завантажено", + "expiry": "Термін дії", + "inactive": "Неактивна", + "individualLinks": "Окремі посилання", + "noExpiry": "Без строку", + "status": "Статус", + "subId": "ID підписки", + "title": "Інформація про підписку", + "totalQuota": "Загальна квота", + "unlimited": "Безліміт", + "uploaded": "Відвантажено" + }, + "success": "Успішно", + "sure": "Звичайно", "tgbot": { - "keyboardClosed": "❌ Клавіатуру закрито!", - "noResult": "❗ Немає результату!", - "noQuery": "❌ Запит не знайдено! Будь ласка, використовуйте команду ще раз!", - "wentWrong": "❌ Щось пішло не так!", - "noIpRecord": "❗ Немає запису IP!", - "noInbounds": "❗ Вхідні не знайдені!", - "unlimited": "♾ Необмежено (Скинути)", "add": "Додати", - "month": "Місяць", - "months": "Місяці", - "day": "День", - "days": "Дні", - "hours": "Години", - "minutes": "Хвилини", - "unknown": "Невідомо", - "inbounds": "Вхідні", - "clients": "Клієнти", - "offline": "🔴 Офлайн", - "online": "🟢 Онлайн", - "commands": { - "unknown": "❗ Невідома команда.", - "pleaseChoose": "👇 Будь ласка, виберіть:\r\n", - "help": "🤖 Ласкаво просимо до цього бота! Він розроблений, щоб надавати певні дані з веб-панелі та дозволяє вносити зміни за потреби.\r\n\r\n", - "start": "👋 Привіт {{ .Firstname }}.\r\n", - "welcome": "🤖 Ласкаво просимо до {{ .Hostname }} бота керування.\r\n", - "status": "✅ Бот в порядку!", - "usage": "❗ Введіть текст для пошуку!", - "getID": "🆔 Ваш ідентифікатор: {{ .ID }}", - "helpAdminCommands": "Для перезапуску Xray Core:\r\n/restart\r\n\r\nДля пошуку електронної пошти клієнта:\r\n/usage [Електронна пошта]\r\n\r\nДля пошуку вхідних (зі статистикою клієнта):\r\n/inbound [Примітка]\r\n\r\nID чату Telegram:\r\n/id", - "helpClientCommands": "Для пошуку статистики використовуйте наступну команду:\r\n/usage [Електронна пошта]\r\n\r\nID чату Telegram:\r\n/id", - "restartUsage": "\r\n\r\n/restart", - "restartSuccess": "✅ Операція успішна!", - "restartFailed": "❗ Помилка в операції.\r\n\r\nПомилка: {{ .Error }}.", - "xrayNotRunning": "❗ Xray Core не запущений.", - "startDesc": "Показати головне меню", - "helpDesc": "Довідка по боту", - "statusDesc": "Перевірити статус бота", - "idDesc": "Показати ваш Telegram ID" - }, - "messages": { - "cpuThreshold": "🔴 Навантаження ЦП {{ .Percent }}% перевищує порогове значення {{ .Threshold }}%", - "selectUserFailed": "❌ Помилка під час вибору користувача!", - "userSaved": "✅ Користувача Telegram збережено.", - "loginSuccess": "✅ Успішно ввійшли в панель\r\n", - "loginFailed": "❗️ Помилка входу в панель.\r\n", - "2faFailed": "Помилка 2FA", - "report": "🕰 Заплановані звіти: {{ .RunTime }}\r\n", - "datetime": "⏰ Дата й час: {{ .DateTime }}\r\n", - "hostname": "💻 Хост: {{ .Hostname }}\r\n", - "version": "🚀 3X-UI Версія: {{ .Version }}\r\n", - "xrayVersion": "📡 Xray Версія: {{ .XrayVersion }}\r\n", - "ipv6": "🌐 IPv6: {{ .IPv6 }}\r\n", - "ipv4": "🌐 IPv4: {{ .IPv4 }}\r\n", - "ip": "🌐 IP: {{ .IP }}\r\n", - "ips": "🔢 IP-адреси:\r\n{{ .IPs }}\r\n", - "serverUpTime": "⏳ Час роботи: {{ .UpTime }} {{ .Unit }}\r\n", - "serverLoad": "📈 Завантаження системи: {{ .Load1 }}, {{ .Load2 }}, {{ .Load3 }}\r\n", - "serverMemory": "📋 RAM: {{ .Current }}/{{ .Total }}\r\n", - "tcpCount": "🔹 TCP: {{ .Count }}\r\n", - "udpCount": "🔸 UDP: {{ .Count }}\r\n", - "traffic": "🚦 Трафік: {{ .Total }} (↑{{ .Upload }},↓{{ .Download }})\r\n", - "xrayStatus": "ℹ️ Статус: {{ .State }}\r\n", - "username": "👤 Ім'я користувача: {{ .Username }}\r\n", - "reason": "❗️ Причина: {{ .Reason }}\r\n", - "time": "⏰ Час: {{ .Time }}\r\n", - "inbound": "📍 Inbound: {{ .Remark }}\r\n", - "port": "🔌 Порт: {{ .Port }}\r\n", - "expire": "📅 Дата закінчення: {{ .Time }}\r\n", - "expireIn": "📅 Термін дії: {{ .Time }}\r\n", - "active": "💡 Активний: {{ .Enable }}\r\n", - "enabled": "🚨 Увімкнено: {{ .Enable }}\r\n", - "online": "🌐 Стан підключення: {{ .Status }}\r\n", - "lastOnline": "🔙 Був(ла) онлайн: {{ .Time }}\r\n", - "email": "📧 Електронна пошта: {{ .Email }}\r\n", - "upload": "🔼 Upload: ↑{{ .Upload }}\r\n", - "download": "🔽 Download: ↓{{ .Download }}\r\n", - "total": "📊 Всього: ↑↓{{ .UpDown }} / {{ .Total }}\r\n", - "TGUser": "👤 Користувач Telegram: {{ .TelegramID }}\r\n", - "exhaustedMsg": "🚨 Вичерпано {{ .Type }}:\r\n", - "exhaustedCount": "🚨 Вичерпано кількість {{ .Type }} count:\r\n", - "onlinesCount": "🌐 Онлайн-клієнти: {{ .Count }}\r\n", - "disabled": "🛑 Вимкнено: {{ .Disabled }}\r\n", - "depleteSoon": "🔜 Скоро вичерпається: {{ .Deplete }}\r\n\r\n", - "backupTime": "🗄 Час резервного копіювання: {{ .Time }}\r\n", - "refreshedOn": "\r\n📋🔄 Оновлено: {{ .Time }}\r\n\r\n", - "yes": "✅ Так", - "no": "❌ Ні", - "received_id": "🔑📥 ID оновлено.", - "received_password": "🔑📥 Пароль оновлено.", - "received_email": "📧📥 Електронна пошта оновлена.", - "received_comment": "💬📥 Коментар оновлено.", - "id_prompt": "🔑 Стандартний ID: {{ .ClientId }}\n\nВведіть ваш ID.", - "pass_prompt": "🔑 Стандартний пароль: {{ .ClientPassword }}\n\nВведіть ваш пароль.", - "email_prompt": "📧 Стандартний email: {{ .ClientEmail }}\n\nВведіть ваш email.", - "comment_prompt": "💬 Стандартний коментар: {{ .ClientComment }}\n\nВведіть ваш коментар.", - "inbound_client_data_id": "🔄 Вхід: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 Електронна пошта: {{ .ClientEmail }}\n📊 Трафік: {{ .ClientTraffic }}\n📅 Дата завершення: {{ .ClientExp }}\n🌐 Обмеження IP: {{ .IpLimit }}\n💬 Коментар: {{ .ClientComment }}\n\nТепер ви можете додати клієнта до вхідного з'єднання!", - "inbound_client_data_pass": "🔄 Вхід: {{ .InboundRemark }}\n\n🔑 Пароль: {{ .ClientPass }}\n📧 Електронна пошта: {{ .ClientEmail }}\n📊 Трафік: {{ .ClientTraffic }}\n📅 Дата завершення: {{ .ClientExp }}\n🌐 Обмеження IP: {{ .IpLimit }}\n💬 Коментар: {{ .ClientComment }}\n\nТепер ви можете додати клієнта до вхідного з'єднання!", - "cancel": "❌ Процес скасовано! \n\nВи можете знову розпочати, використовуючи /start у будь-який час. 🔄", - "error_add_client": "⚠️ Помилка:\n\n {{ .error }}", - "using_default_value": "Гаразд, залишу значення за замовчуванням. 😊", - "incorrect_input": "Ваш ввід невірний.\nФрази повинні бути без пробілів.\nПравильний приклад: aaaaaa\nНеправильний приклад: aaa aaa 🚫", - "AreYouSure": "Ви впевнені? 🤔", - "SuccessResetTraffic": "📧 Електронна пошта: {{ .ClientEmail }}\n🏁 Результат: ✅ Успішно", - "FailedResetTraffic": "📧 Електронна пошта: {{ .ClientEmail }}\n🏁 Результат: ❌ Невдача \n\n🛠️ Помилка: [ {{ .ErrorMessage }} ]", - "FinishProcess": "🔚 Процес скидання трафіку завершено для всіх клієнтів." - }, - "buttons": { - "closeKeyboard": "❌ Закрити клавіатуру", - "cancel": "❌ Скасувати", - "cancelReset": "❌ Скасувати скидання", - "cancelIpLimit": "❌ Скасувати обмеження IP", - "confirmResetTraffic": "✅ Підтвердити скидання трафіку?", - "confirmClearIps": "✅ Підтвердити очищення IP-адрес?", - "confirmRemoveTGUser": "✅ Підтвердити видалення користувача Telegram?", - "confirmToggle": "✅ Підтвердити ввімкнути/вимкнути користувача?", - "dbBackup": "Отримати резервну копію БД", - "serverUsage": "Використання сервера", - "getInbounds": "Отримати вхідні", - "depleteSoon": "Скоро вичерпати", - "clientUsage": "Отримати використання", - "onlines": "Онлайн-клієнти", - "commands": "Команди", - "refresh": "🔄 Оновити", - "clearIPs": "❌ Очистити IP-адреси", - "removeTGUser": "❌ Видалити користувача Telegram", - "selectTGUser": "👤 Виберіть користувача Telegram", - "selectOneTGUser": "👤 Виберіть користувача Telegram:", - "resetTraffic": "📈 Скинути трафік", - "resetExpire": "📅 Змінити термін дії", - "ipLog": "🔢 IP журнал", - "ipLimit": "🔢 IP Ліміт", - "setTGUser": "👤 Встановити користувача Telegram", - "toggle": "🔘 Увімкнути / Вимкнути", - "custom": "🔢 Custom", - "confirmNumber": "✅ Підтвердити: {{ .Num }}", - "confirmNumberAdd": "✅ Підтвердити додавання: {{ .Num }}", - "limitTraffic": "🚧 Ліміт трафіку", - "getBanLogs": "Отримати журнали заборон", - "allClients": "Всі Клієнти", - "addClient": "Додати клієнта", - "submitDisable": "Надіслати як вимкнено ☑️", - "submitEnable": "Надіслати як увімкнено ✅", - "use_default": "🏷️ Використати типове", - "change_id": "⚙️🔑 ID", - "change_password": "⚙️🔑 Пароль", - "change_email": "⚙️📧 Електронна пошта", - "change_comment": "⚙️💬 Коментар", - "ResetAllTraffics": "Скинути весь трафік", - "SortedTrafficUsageReport": "Відсортований звіт про використання трафіку" - }, "answers": { - "successfulOperation": "✅ Операція успішна!", - "errorOperation": "❗ Помилка в роботі.", - "getInboundsFailed": "❌ Не вдалося отримати вхідні повідомлення.", - "getClientsFailed": "❌ Не вдалося отримати клієнтів.", - "canceled": "❌ {{ .Email }}: Операцію скасовано.", - "clientRefreshSuccess": "✅ {{ .Email }}: Клієнт успішно оновлено.", "IpRefreshSuccess": "✅ {{ .Email }}: IP-адреси успішно оновлено.", "TGIdRefreshSuccess": "✅ {{ .Email }}: Користувач Telegram клієнта успішно оновлено.", - "resetTrafficSuccess": "✅ {{ .Email }}: Трафік скинуто успішно.", - "setTrafficLimitSuccess": "✅ {{ .Email }}: Ліміт трафіку успішно збережено.", - "expireResetSuccess": "✅ {{ .Email }}: Успішно скинуто дні закінчення терміну дії.", - "resetIpSuccess": "✅ {{ .Email }}: IP обмеження {{ .Count }} успішно збережено.", + "askToAddUserId": "Вашу конфігурацію не знайдено!\r\nБудь ласка, попросіть свого адміністратора використовувати ваш ідентифікатор Telegram у вашій конфігурації.\r\n\r\nВаш ідентифікатор користувача: \u003ccode\u003e{{ .TgUserID }}\u003c/code\u003e", + "canceled": "❌ {{ .Email }}: Операцію скасовано.", + "chooseClient": "Виберіть клієнта для Вхідного {{ .Inbound }}", + "chooseInbound": "Виберіть Вхідний", "clearIpSuccess": "✅ {{ .Email }}: IP успішно очищено.", + "clientRefreshSuccess": "✅ {{ .Email }}: Клієнт успішно оновлено.", + "disableSuccess": "✅ {{ .Email }}: Успішно вимкнено.", + "enableSuccess": "✅ {{ .Email }}: Увімкнути успішно.", + "errorOperation": "❗ Помилка в роботі.", + "expireResetSuccess": "✅ {{ .Email }}: Успішно скинуто дні закінчення терміну дії.", + "getClientsFailed": "❌ Не вдалося отримати клієнтів.", + "getInboundsFailed": "❌ Не вдалося отримати вхідні повідомлення.", "getIpLog": "✅ {{ .Email }}: Отримати IP-журнал.", "getUserInfo": "✅ {{ .Email }}: Отримати інформацію про користувача Telegram.", "removedTGUserSuccess": "✅ {{ .Email }}: Користувача Telegram видалено успішно.", - "enableSuccess": "✅ {{ .Email }}: Увімкнути успішно.", - "disableSuccess": "✅ {{ .Email }}: Успішно вимкнено.", - "askToAddUserId": "Вашу конфігурацію не знайдено!\r\nБудь ласка, попросіть свого адміністратора використовувати ваш ідентифікатор Telegram у вашій конфігурації.\r\n\r\nВаш ідентифікатор користувача: {{ .TgUserID }}", - "chooseClient": "Виберіть клієнта для Вхідного {{ .Inbound }}", - "chooseInbound": "Виберіть Вхідний" - } - } -} + "resetIpSuccess": "✅ {{ .Email }}: IP обмеження {{ .Count }} успішно збережено.", + "resetTrafficSuccess": "✅ {{ .Email }}: Трафік скинуто успішно.", + "setTrafficLimitSuccess": "✅ {{ .Email }}: Ліміт трафіку успішно збережено.", + "successfulOperation": "✅ Операція успішна!" + }, + "buttons": { + "ResetAllTraffics": "Скинути весь трафік", + "SortedTrafficUsageReport": "Відсортований звіт про використання трафіку", + "addClient": "Додати клієнта", + "allClients": "Всі Клієнти", + "cancel": "❌ Скасувати", + "cancelIpLimit": "❌ Скасувати обмеження IP", + "cancelReset": "❌ Скасувати скидання", + "change_comment": "⚙️💬 Коментар", + "change_email": "⚙️📧 Електронна пошта", + "change_flow": "🌊 Flow", + "change_id": "⚙️🔑 ID", + "change_password": "⚙️🔑 Пароль", + "change_subid": "📝 Sub ID", + "clearIPs": "❌ Очистити IP-адреси", + "clientUsage": "Отримати використання", + "closeKeyboard": "❌ Закрити клавіатуру", + "commands": "Команди", + "confirmClearIps": "✅ Підтвердити очищення IP-адрес?", + "confirmNumber": "✅ Підтвердити: {{ .Num }}", + "confirmNumberAdd": "✅ Підтвердити додавання: {{ .Num }}", + "confirmRemoveTGUser": "✅ Підтвердити видалення користувача Telegram?", + "confirmResetTraffic": "✅ Підтвердити скидання трафіку?", + "confirmToggle": "✅ Підтвердити ввімкнути/вимкнути користувача?", + "custom": "🔢 Custom", + "dbBackup": "Отримати резервну копію БД", + "depleteSoon": "Скоро вичерпати", + "flow_none": "None", + "getBanLogs": "Отримати журнали заборон", + "getInbounds": "Отримати вхідні", + "ipLimit": "🔢 IP Ліміт", + "ipLog": "🔢 IP журнал", + "limitTraffic": "🚧 Ліміт трафіку", + "onlines": "Онлайн-клієнти", + "refresh": "🔄 Оновити", + "removeTGUser": "❌ Видалити користувача Telegram", + "resetExpire": "📅 Змінити термін дії", + "resetTraffic": "📈 Скинути трафік", + "selectOneTGUser": "👤 Виберіть користувача Telegram:", + "selectTGUser": "👤 Виберіть користувача Telegram", + "serverUsage": "Використання сервера", + "setTGUser": "👤 Встановити користувача Telegram", + "submitDisable": "Надіслати як вимкнено ☑️", + "submitEnable": "Надіслати як увімкнено ✅", + "toggle": "🔘 Увімкнути / Вимкнути", + "use_default": "🏷️ Використати типове" + }, + "clients": "Клієнти", + "commands": { + "getID": "🆔 Ваш ідентифікатор: \u003ccode\u003e{{ .ID }}\u003c/code\u003e", + "help": "🤖 Ласкаво просимо до цього бота! Він розроблений, щоб надавати певні дані з веб-панелі та дозволяє вносити зміни за потреби.\r\n\r\n", + "helpAdminCommands": "Для перезапуску Xray Core:\r\n\u003ccode\u003e/restart\u003c/code\u003e\r\n\r\nДля пошуку електронної пошти клієнта:\r\n\u003ccode\u003e/usage [Електронна пошта]\u003c/code\u003e\r\n\r\nДля пошуку вхідних (зі статистикою клієнта):\r\n\u003ccode\u003e/inbound [Примітка]\u003c/code\u003e\r\n\r\nID чату Telegram:\r\n\u003ccode\u003e/id\u003c/code\u003e", + "helpClientCommands": "Для пошуку статистики використовуйте наступну команду:\r\n\u003ccode\u003e/usage [Електронна пошта]\u003c/code\u003e\r\n\r\nID чату Telegram:\r\n\u003ccode\u003e/id\u003c/code\u003e", + "helpDesc": "Довідка по боту", + "idDesc": "Показати ваш Telegram ID", + "pleaseChoose": "👇 Будь ласка, виберіть:\r\n", + "restartFailed": "❗ Помилка в операції.\r\n\r\n\u003ccode\u003eПомилка: {{ .Error }}\u003c/code\u003e.", + "restartSuccess": "✅ Операція успішна!", + "restartUsage": "\r\n\r\n\u003ccode\u003e/restart\u003c/code\u003e", + "start": "👋 Привіт \u003ci\u003e{{ .Firstname }}\u003c/i\u003e.\r\n", + "startDesc": "Показати головне меню", + "status": "✅ Бот в порядку!", + "statusDesc": "Перевірити статус бота", + "unknown": "❗ Невідома команда.", + "usage": "❗ Введіть текст для пошуку!", + "welcome": "🤖 Ласкаво просимо до \u003cb\u003e{{ .Hostname }}\u003c/b\u003e бота керування.\r\n", + "xrayNotRunning": "❗ Xray Core не запущений." + }, + "day": "День", + "days": "Дні", + "hours": "Години", + "inbounds": "Вхідні", + "keyboardClosed": "❌ Клавіатуру закрито!", + "messages": { + "2faFailed": "Помилка 2FA", + "AreYouSure": "Ви впевнені? 🤔", + "FailedResetTraffic": "📧 Електронна пошта: {{ .ClientEmail }}\n🏁 Результат: ❌ Невдача \n\n🛠️ Помилка: [ {{ .ErrorMessage }} ]", + "FinishProcess": "🔚 Процес скидання трафіку завершено для всіх клієнтів.", + "SuccessResetTraffic": "📧 Електронна пошта: {{ .ClientEmail }}\n🏁 Результат: ✅ Успішно", + "TGUser": "👤 Користувач Telegram: {{ .TelegramID }}\r\n", + "active": "💡 Активний: {{ .Enable }}\r\n", + "backupTime": "🗄 Час резервного копіювання: {{ .Time }}\r\n", + "cancel": "❌ Процес скасовано! \n\nВи можете знову розпочати, використовуючи /start у будь-який час. 🔄", + "client_flow": "Flow:", + "client_subid": "Sub ID:", + "comment_prompt": "💬 Стандартний коментар: {{ .ClientComment }}\n\nВведіть ваш коментар.", + "cpuThreshold": "🔴 Навантаження ЦП {{ .Percent }}% перевищує порогове значення {{ .Threshold }}%", + "datetime": "⏰ Дата й час: {{ .DateTime }}\r\n", + "depleteSoon": "🔜 Скоро вичерпається: {{ .Deplete }}\r\n\r\n", + "disabled": "🛑 Вимкнено: {{ .Disabled }}\r\n", + "download": "🔽 Download: ↓{{ .Download }}\r\n", + "email": "📧 Електронна пошта: {{ .Email }}\r\n", + "email_prompt": "📧 Стандартний email: {{ .ClientEmail }}\n\nВведіть ваш email.", + "enabled": "🚨 Увімкнено: {{ .Enable }}\r\n", + "error_add_client": "⚠️ Помилка:\n\n {{ .error }}", + "exhaustedCount": "🚨 Вичерпано кількість {{ .Type }} count:\r\n", + "exhaustedMsg": "🚨 Вичерпано {{ .Type }}:\r\n", + "expire": "📅 Дата закінчення: {{ .Time }}\r\n", + "expireIn": "📅 Термін дії: {{ .Time }}\r\n", + "hostname": "💻 Хост: {{ .Hostname }}\r\n", + "id_prompt": "🔑 Стандартний ID: {{ .ClientId }}\n\nВведіть ваш ID.", + "inbound": "📍 Inbound: {{ .Remark }}\r\n", + "inbound_client_data_id": "🔄 Вхід: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 Електронна пошта: {{ .ClientEmail }}\n📊 Трафік: {{ .ClientTraffic }}\n📅 Дата завершення: {{ .ClientExp }}\n🌐 Обмеження IP: {{ .IpLimit }}\n💬 Коментар: {{ .ClientComment }}\n\nТепер ви можете додати клієнта до вхідного з'єднання!", + "inbound_client_data_pass": "🔄 Вхід: {{ .InboundRemark }}\n\n🔑 Пароль: {{ .ClientPass }}\n📧 Електронна пошта: {{ .ClientEmail }}\n📊 Трафік: {{ .ClientTraffic }}\n📅 Дата завершення: {{ .ClientExp }}\n🌐 Обмеження IP: {{ .IpLimit }}\n💬 Коментар: {{ .ClientComment }}\n\nТепер ви можете додати клієнта до вхідного з'єднання!", + "incorrect_input": "Ваш ввід невірний.\nФрази повинні бути без пробілів.\nПравильний приклад: aaaaaa\nНеправильний приклад: aaa aaa 🚫", + "invalid_subid": "Invalid format.\nSub ID can only contain letters, numbers, hyphens (-), and underscores (_).\nSpaces and special characters are not allowed. 🚫", + "ip": "🌐 IP: {{ .IP }}\r\n", + "ips": "🔢 IP-адреси:\r\n{{ .IPs }}\r\n", + "ipv4": "🌐 IPv4: {{ .IPv4 }}\r\n", + "ipv6": "🌐 IPv6: {{ .IPv6 }}\r\n", + "lastOnline": "🔙 Був(ла) онлайн: {{ .Time }}\r\n", + "loginFailed": "❗️ Помилка входу в панель.\r\n", + "loginSuccess": "✅ Успішно ввійшли в панель\r\n", + "no": "❌ Ні", + "online": "🌐 Стан підключення: {{ .Status }}\r\n", + "onlinesCount": "🌐 Онлайн-клієнти: {{ .Count }}\r\n", + "pass_prompt": "🔑 Стандартний пароль: {{ .ClientPassword }}\n\nВведіть ваш пароль.", + "port": "🔌 Порт: {{ .Port }}\r\n", + "reason": "❗️ Причина: {{ .Reason }}\r\n", + "received_comment": "💬📥 Коментар оновлено.", + "received_email": "📧📥 Електронна пошта оновлена.", + "received_id": "🔑📥 ID оновлено.", + "received_password": "🔑📥 Пароль оновлено.", + "received_subid": "Sub ID updated successfully!", + "refreshedOn": "\r\n📋🔄 Оновлено: {{ .Time }}\r\n\r\n", + "report": "🕰 Заплановані звіти: {{ .RunTime }}\r\n", + "selectUserFailed": "❌ Помилка під час вибору користувача!", + "serverLoad": "📈 Завантаження системи: {{ .Load1 }}, {{ .Load2 }}, {{ .Load3 }}\r\n", + "serverMemory": "📋 RAM: {{ .Current }}/{{ .Total }}\r\n", + "serverUpTime": "⏳ Час роботи: {{ .UpTime }} {{ .Unit }}\r\n", + "subid_prompt": "Please enter new Sub ID:\nCurrent: {{.ClientSubId}}", + "tcpCount": "🔹 TCP: {{ .Count }}\r\n", + "time": "⏰ Час: {{ .Time }}\r\n", + "total": "📊 Всього: ↑↓{{ .UpDown }} / {{ .Total }}\r\n", + "traffic": "🚦 Трафік: {{ .Total }} (↑{{ .Upload }},↓{{ .Download }})\r\n", + "udpCount": "🔸 UDP: {{ .Count }}\r\n", + "upload": "🔼 Upload: ↑{{ .Upload }}\r\n", + "userSaved": "✅ Користувача Telegram збережено.", + "username": "👤 Ім'я користувача: {{ .Username }}\r\n", + "using_default_value": "Гаразд, залишу значення за замовчуванням. 😊", + "version": "🚀 3X-UI Версія: {{ .Version }}\r\n", + "xrayStatus": "ℹ️ Статус: {{ .State }}\r\n", + "xrayVersion": "📡 Xray Версія: {{ .XrayVersion }}\r\n", + "yes": "✅ Так" + }, + "minutes": "Хвилини", + "month": "Місяць", + "months": "Місяці", + "noInbounds": "❗ Вхідні не знайдені!", + "noIpRecord": "❗ Немає запису IP!", + "noQuery": "❌ Запит не знайдено! Будь ласка, використовуйте команду ще раз!", + "noResult": "❗ Немає результату!", + "offline": "🔴 Офлайн", + "online": "🟢 Онлайн", + "unknown": "Невідомо", + "unlimited": "♾ Необмежено (Скинути)", + "wentWrong": "❌ Щось пішло не так!" + }, + "transmission": "Протокол передачи", + "twoFactorCode": "Код", + "unlimited": "Безлімітний", + "update": "Оновити", + "usage": "Використання", + "useIPv4ForHost": "Використовувати IPv4 для хоста", + "username": "Ім'я користувача" +} \ No newline at end of file diff --git a/web/translation/zh-TW.json b/web/translation/zh-TW.json index 78f26dee..b8f25253 100644 --- a/web/translation/zh-TW.json +++ b/web/translation/zh-TW.json @@ -1,750 +1,604 @@ { - "username": "使用者名稱", - "password": "密碼", - "login": "登入", - "confirm": "確定", - "cancel": "取消", - "close": "關閉", - "save": "儲存", - "logout": "登出", - "create": "建立", - "update": "更新", - "copy": "複製", - "copied": "已複製", - "download": "下載", - "remark": "備註", - "enable": "啟用", - "protocol": "協議", - "search": "搜尋", - "filter": "篩選", - "loading": "載入中...", - "second": "秒", - "minute": "分鐘", - "hour": "小時", - "day": "天", - "check": "檢視", - "indefinite": "無限期", - "unlimited": "無限制", - "none": "無", - "qrCode": "二維碼", - "info": "更多資訊", - "edit": "編輯", - "delete": "刪除", - "reset": "重置", - "noData": "無數據。", - "copySuccess": "複製成功", - "sure": "確定", - "encryption": "加密", - "useIPv4ForHost": "使用 IPv4 連接主機", - "transmission": "傳輸", - "host": "主機", - "path": "路徑", "camouflage": "偽裝", - "status": "狀態", - "enabled": "開啟", - "disabled": "關閉", + "cancel": "取消", + "certificate": "憑證", + "check": "檢視", + "clients": "客戶端", + "close": "關閉", + "comment": "評論", + "confirm": "確定", + "copied": "已複製", + "copy": "複製", + "copySuccess": "複製成功", + "create": "建立", + "day": "天", + "delete": "刪除", "depleted": "耗盡", "depletingSoon": "即將耗盡", - "offline": "離線", - "online": "線上", + "disabled": "關閉", "domainName": "域名", - "monitor": "監聽", - "certificate": "憑證", - "fail": "失敗", - "comment": "評論", - "success": "成功", - "lastOnline": "上次上線", - "getVersion": "獲取版本", - "install": "安裝", - "clients": "客戶端", - "usage": "使用情況", - "twoFactorCode": "代碼", - "remained": "剩餘", - "security": "安全", - "secAlertTitle": "安全警報", - "secAlertSsl": "此連線不安全。在啟用 TLS 進行資料保護之前,請勿輸入敏感資訊。", - "secAlertConf": "某些設定易受攻擊。建議加強安全協議以防止潛在漏洞。", - "secAlertSSL": "面板缺少安全連線。請安裝 TLS 證書以保護資料安全。", - "secAlertPanelPort": "面板預設埠存在安全風險。請配置隨機埠或特定埠。", - "secAlertPanelURI": "面板預設 URI 路徑不安全。請配置複雜的 URI 路徑。", - "secAlertSubURI": "訂閱預設 URI 路徑不安全。請配置複雜的 URI 路徑。", - "secAlertSubJsonURI": "訂閱 JSON 預設 URI 路徑不安全。請配置複雜的 URI 路徑。", + "download": "下載", + "edit": "編輯", + "emptyBalancersDesc": "未添加負載平衡器。", "emptyDnsDesc": "未添加DNS伺服器。", "emptyFakeDnsDesc": "未添加Fake DNS伺服器。", - "emptyBalancersDesc": "未添加負載平衡器。", "emptyReverseDesc": "未添加反向代理。", - "somethingWentWrong": "發生錯誤", - "subscription": { - "title": "訂閱資訊", - "subId": "訂閱 ID", - "status": "狀態", - "downloaded": "已下載", - "uploaded": "已上傳", - "expiry": "到期", - "totalQuota": "總配額", - "individualLinks": "個別連結", - "active": "啟用", - "inactive": "停用", - "unlimited": "無限制", - "noExpiry": "無到期" - }, + "enable": "啟用", + "enabled": "開啟", + "encryption": "加密", + "fail": "失敗", + "filter": "篩選", + "getVersion": "獲取版本", + "host": "主機", + "hour": "小時", + "indefinite": "無限期", + "info": "更多資訊", + "install": "安裝", + "lastOnline": "上次上線", + "loading": "載入中...", + "login": "登入", + "logout": "登出", "menu": { - "theme": "主題", + "apiDocs": "API 文件", "dark": "深色", - "ultraDark": "超深色", "dashboard": "系統狀態", "inbounds": "入站列表", + "link": "管理", + "logout": "退出登入", "nodes": "節點", "settings": "面板設定", - "xray": "Xray 設定", - "apiDocs": "API 文件", - "logout": "退出登入", - "link": "管理" + "theme": "主題", + "ultraDark": "超深色", + "xray": "Xray 設定" }, + "minute": "分鐘", + "monitor": "監聽", + "noData": "無數據。", + "none": "無", + "offline": "離線", + "online": "線上", "pages": { - "login": { - "hello": "你好", - "title": "歡迎", - "loginAgain": "登入時效已過,請重新登入", - "toasts": { - "invalidFormData": "資料格式錯誤", - "emptyUsername": "請輸入使用者名稱", - "emptyPassword": "請輸入密碼", - "wrongUsernameOrPassword": "用戶名、密碼或雙重驗證碼無效。", - "successLogin": "您已成功登入您的帳戶。" - } - }, - "index": { - "title": "系統狀態", - "cpu": "CPU", - "logicalProcessors": "邏輯處理器", - "frequency": "頻率", - "swap": "交換空間", - "storage": "儲存", - "memory": "記憶體", - "threads": "執行緒", - "xrayStatus": "Xray", - "stopXray": "停止", - "restartXray": "重啟", - "xraySwitch": "版本", - "xraySwitchClick": "選擇你要切換到的版本", - "xraySwitchClickDesk": "請謹慎選擇,因為較舊版本可能與當前配置不相容", - "xrayUpdates": "Xray 更新", - "updatePanel": "更新面板", - "panelUpdateDesc": "這將把 3X-UI 更新到最新版本並重新啟動面板服務。", - "currentPanelVersion": "目前面板版本", - "latestPanelVersion": "最新面板版本", - "panelUpToDate": "面板已是最新", - "upToDate": "已是最新", - "xrayStatusUnknown": "未知", - "xrayStatusRunning": "運行中", - "xrayStatusStop": "停止", - "xrayStatusError": "錯誤", - "xrayErrorPopoverTitle": "執行Xray時發生錯誤", - "operationHours": "系統正常執行時間", - "systemHistoryTitle": "系統歷史", - "charts": "圖表", - "xrayMetricsTitle": "Xray 指標", - "xrayMetricsDisabled": "未設定 Xray 指標端點", - "xrayMetricsHint": "在 xray 設定中加入頂層 metrics 區塊,tag 為 metrics_out,listen 為 127.0.0.1:11111,然後重啟 xray。", - "xrayObservatoryEmpty": "尚無 Observatory 資料", - "xrayObservatoryHint": "在 xray 設定中加入 observatory 區塊,列出要探測的出站 tag,然後重啟 xray。", - "xrayObservatoryTagPlaceholder": "選擇出站", - "xrayObservatoryAlive": "在線", - "xrayObservatoryDead": "離線", - "xrayObservatoryLastSeen": "最後在線", - "xrayObservatoryLastTry": "最後嘗試", - "trendLast2Min": "最近 2 分鐘", - "systemLoad": "系統負載", - "systemLoadDesc": "過去 1、5 和 15 分鐘的系統平均負載", - "connectionCount": "連線數", - "ipAddresses": "IP地址", - "toggleIpVisibility": "切換IP可見性", - "overallSpeed": "整體速度", - "upload": "上傳", - "download": "下載", - "totalData": "總數據", - "sent": "已發送", - "received": "已接收", - "documentation": "文件", - "xraySwitchVersionDialog": "您確定要變更Xray版本嗎?", - "xraySwitchVersionDialogDesc": "這將會把Xray版本變更為#version#。", - "xraySwitchVersionPopover": "Xray 更新成功", - "panelUpdateDialog": "您確定要更新面板嗎?", - "panelUpdateDialogDesc": "這將把 3X-UI 更新到 #version# 並重新啟動面板服務。", - "panelUpdateCheckPopover": "面板更新檢查失敗", - "panelUpdateStartedPopover": "面板更新已開始", - "geofileUpdateDialog": "您確定要更新地理檔案嗎?", - "geofileUpdateDialogDesc": "這將更新 #filename# 檔案。", - "geofilesUpdateDialogDesc": "這將更新所有文件。", - "geofilesUpdateAll": "全部更新", - "geofileUpdatePopover": "地理檔案更新成功", - "dontRefresh": "安裝中,請勿重新整理此頁面", - "logs": "日誌", - "config": "配置", - "backup": "備份和恢復", - "backupTitle": "備份和恢復", - "exportDatabase": "備份", - "exportDatabaseDesc": "點擊下載包含當前資料庫備份的 .db 文件到您的設備。", - "importDatabase": "恢復", - "importDatabaseDesc": "點擊選擇並上傳設備中的 .db 文件以從備份恢復資料庫。", - "importDatabaseSuccess": "資料庫匯入成功", - "importDatabaseError": "匯入資料庫時發生錯誤", - "readDatabaseError": "讀取資料庫時發生錯誤", - "getDatabaseError": "檢索資料庫時發生錯誤", - "getConfigError": "檢索設定檔時發生錯誤", - "customGeoTitle": "自訂 GeoSite / GeoIP", - "customGeoAdd": "新增", - "customGeoType": "類型", - "customGeoAlias": "別名", - "customGeoUrl": "URL", - "customGeoEnabled": "啟用", - "customGeoLastUpdated": "上次更新", - "customGeoExtColumn": "路由 (ext:…)", - "customGeoToastUpdateAll": "所有自訂來源已更新", - "customGeoActions": "操作", - "customGeoEdit": "編輯", - "customGeoDelete": "刪除", - "customGeoDownload": "立即更新", - "customGeoModalAdd": "新增自訂 geo", - "customGeoModalEdit": "編輯自訂 geo", - "customGeoModalSave": "儲存", - "customGeoDeleteConfirm": "刪除此自訂 geo 來源?", - "customGeoRoutingHint": "在路由規則中將值欄寫為 ext:檔案.dat:標籤(替換標籤)。", - "customGeoInvalidId": "無效的資源 ID", - "customGeoAliasesError": "載入自訂 geo 別名失敗", - "customGeoValidationAlias": "別名只能包含小寫字母、數字、- 和 _", - "customGeoValidationUrl": "URL 必須以 http:// 或 https:// 開頭", - "customGeoAliasPlaceholder": "a-z 0-9 _ -", - "customGeoAliasLabelSuffix": "(自訂)", - "customGeoToastList": "自訂 geo 清單", - "customGeoToastAdd": "新增自訂 geo", - "customGeoToastUpdate": "更新自訂 geo", - "customGeoToastDelete": "自訂 geofile「{{ .fileName }}」已刪除", - "customGeoToastDownload": "geofile「{{ .fileName }}」已更新", - "customGeoErrInvalidType": "類型必須是 geosite 或 geoip", - "customGeoErrAliasRequired": "請填寫別名", - "customGeoErrAliasPattern": "別名包含不允許的字元", - "customGeoErrAliasReserved": "此別名已保留", - "customGeoErrUrlRequired": "請填寫 URL", - "customGeoErrInvalidUrl": "URL 無效", - "customGeoErrUrlScheme": "URL 必須使用 http 或 https", - "customGeoErrUrlHost": "URL 主機無效", - "customGeoErrDuplicateAlias": "此類型已使用該別名", - "customGeoErrNotFound": "找不到自訂 geo 來源", - "customGeoErrDownload": "下載失敗", - "customGeoErrUpdateAllIncomplete": "有一個或多個自訂 geo 來源更新失敗", - "customGeoEmpty": "尚無自訂 geo 來源 — 點擊「新增」以建立" + "client": { + "add": "新增客戶端", + "bulk": "批量建立", + "clearAll": "全不選", + "clientCount": "客戶端數量", + "copyEmailPreview": "最終郵箱預覽", + "copyFlowHint": "套用於所有複製的用戶端。留空則略過。", + "copyFlowLabel": "新用戶端的 Flow (VLESS)", + "copyFromInbound": "從入站複製用戶端", + "copyResult": "複製結果", + "copyResultErrors": "複製錯誤", + "copyResultNone": "沒有可複製的內容:未選擇用戶端或來源為空", + "copyResultSuccess": "複製成功", + "copySelectSourceFirst": "請先選擇來源入站。", + "copySelected": "複製所選", + "copySource": "來源", + "copyToInbound": "複製用戶端到", + "days": "天", + "delayedStart": "首次使用後開始", + "edit": "編輯客戶端", + "expireDays": "期間", + "first": "置頂", + "last": "置底", + "method": "方法", + "postfix": "字尾", + "prefix": "字首", + "renew": "自動續訂", + "renewDesc": "到期後自動續訂。(0 = 禁用)(單位: 天)", + "selectAll": "全選", + "submitAdd": "新增客戶端", + "submitEdit": "儲存修改" }, "inbounds": { - "allTimeTraffic": "累計總流量", - "allTimeTrafficUsage": "所有时间总使用量", - "title": "入站列表", - "totalDownUp": "總上傳 / 下載", - "totalUsage": "總用量", - "inboundCount": "入站數量", - "operate": "選單", - "enable": "啟用", - "remark": "備註", - "node": "節點", - "deployTo": "部署到", - "localPanel": "本機面板", - "protocol": "協議", - "port": "埠", - "portMap": "埠映射", - "traffic": "流量", - "details": "詳細資訊", - "transportConfig": "傳輸配置", - "expireDate": "到期時間", - "createdAt": "建立時間", - "updatedAt": "更新時間", - "resetTraffic": "重置流量", - "addInbound": "新增入站", - "generalActions": "通用操作", - "modifyInbound": "修改入站", - "deleteInbound": "刪除入站", - "deleteInboundContent": "確定要刪除入站嗎?", - "deleteClient": "刪除客戶端", - "deleteClientContent": "確定要刪除客戶端嗎?", - "resetTrafficContent": "確定要重置流量嗎?", - "copyLink": "複製連結", - "address": "地址", - "network": "網路", - "destinationPort": "目標埠", - "targetAddress": "目標地址", - "monitorDesc": "留空表示監聽所有 IP", - "meansNoLimit": "= 無限制(單位:GB)", - "totalFlow": "總流量", - "leaveBlankToNeverExpire": "留空表示永不過期", - "noRecommendKeepDefault": "建議保留預設值", - "certificatePath": "檔案路徑", - "certificateContent": "檔案內容", - "publicKey": "公鑰", - "privatekey": "私鑰", - "clickOnQRcode": "點選二維碼複製", - "client": "客戶", - "export": "匯出連結", - "clone": "複製", - "cloneInbound": "複製", - "cloneInboundContent": "此入站規則除埠(Port)、監聽 IP(Listening IP)和客戶端(Clients)以外的所有配置都將應用於克隆", - "cloneInboundOk": "建立克隆", - "resetAllTraffic": "重置所有入站流量", - "resetAllTrafficTitle": "重置所有入站流量", - "resetAllTrafficContent": "確定要重置所有入站流量嗎?", - "resetInboundClientTraffics": "重置客戶端流量", - "resetInboundClientTrafficTitle": "重置所有客戶端流量", - "resetInboundClientTrafficContent": "確定要重置此入站客戶端的所有流量嗎?", - "resetAllClientTraffics": "重置所有客戶端流量", - "resetAllClientTrafficTitle": "重置所有客戶端流量", - "resetAllClientTrafficContent": "確定要重置所有客戶端的所有流量嗎?", - "delDepletedClients": "刪除流量耗盡的客戶端", - "delDepletedClientsTitle": "刪除流量耗盡的客戶端", - "delDepletedClientsContent": "確定要刪除所有流量耗盡的客戶端嗎?", - "email": "電子郵件", - "emailDesc": "電子郵件必須完全唯一", "IPLimit": "IP 限制", "IPLimitDesc": "如果數量超過設定值,則禁用入站流量。(0 = 禁用)", "IPLimitlog": "IP 日誌", "IPLimitlogDesc": "IP 歷史日誌(要啟用被禁用的入站流量,請清除日誌)", "IPLimitlogclear": "清除日誌", - "setDefaultCert": "從面板設定證書", - "telegramDesc": "請提供Telegram聊天ID。(在機器人中使用'/id'命令)或({'@'}userinfobot", - "subscriptionDesc": "要找到你的訂閱 URL,請導航到“詳細資訊”。此外,你可以為多個客戶端使用相同的名稱。", - "info": "資訊", - "same": "相同", - "inboundData": "入站資料", + "addInbound": "新增入站", + "address": "地址", + "allTimeTraffic": "累計總流量", + "allTimeTrafficUsage": "所有时间总使用量", + "certificateContent": "檔案內容", + "certificatePath": "檔案路徑", + "clickOnQRcode": "點選二維碼複製", + "client": "客戶", + "clone": "複製", + "cloneInbound": "複製", + "cloneInboundContent": "此入站規則除埠(Port)、監聽 IP(Listening IP)和客戶端(Clients)以外的所有配置都將應用於克隆", + "cloneInboundOk": "建立克隆", + "copyLink": "複製連結", + "createdAt": "建立時間", + "delDepletedClients": "刪除流量耗盡的客戶端", + "delDepletedClientsContent": "確定要刪除所有流量耗盡的客戶端嗎?", + "delDepletedClientsTitle": "刪除流量耗盡的客戶端", + "deleteClient": "刪除客戶端", + "deleteClientContent": "確定要刪除客戶端嗎?", + "deleteInbound": "刪除入站", + "deleteInboundContent": "確定要刪除入站嗎?", + "deployTo": "部署到", + "destinationPort": "目標埠", + "details": "詳細資訊", + "email": "電子郵件", + "emailDesc": "電子郵件必須完全唯一", + "enable": "啟用", + "expireDate": "到期時間", + "export": "匯出連結", "exportInbound": "匯出入站規則", + "generalActions": "通用操作", "import": "匯入", "importInbound": "匯入入站規則", - "periodicTrafficResetTitle": "流量重置", - "periodicTrafficResetDesc": "按指定間隔自動重置流量計數器", + "inboundCount": "入站數量", + "inboundData": "入站資料", + "info": "資訊", "lastReset": "上次重置", + "leaveBlankToNeverExpire": "留空表示永不過期", + "localPanel": "本機面板", + "meansNoLimit": "= 無限制(單位:GB)", + "modifyInbound": "修改入站", + "monitorDesc": "留空表示監聽所有 IP", + "network": "網路", + "noRecommendKeepDefault": "建議保留預設值", + "node": "節點", + "operate": "選單", "periodicTrafficReset": { - "never": "從不", "daily": "每日", - "weekly": "每週", + "hourly": "每小時", "monthly": "每月", - "hourly": "每小時" + "never": "從不", + "weekly": "每週" }, + "periodicTrafficResetDesc": "按指定間隔自動重置流量計數器", + "periodicTrafficResetTitle": "流量重置", + "port": "埠", + "portMap": "埠映射", + "privatekey": "私鑰", + "protocol": "協議", + "publicKey": "公鑰", + "remark": "備註", + "resetAllClientTrafficContent": "確定要重置所有客戶端的所有流量嗎?", + "resetAllClientTrafficTitle": "重置所有客戶端流量", + "resetAllClientTraffics": "重置所有客戶端流量", + "resetAllTraffic": "重置所有入站流量", + "resetAllTrafficContent": "確定要重置所有入站流量嗎?", + "resetAllTrafficTitle": "重置所有入站流量", + "resetInboundClientTrafficContent": "確定要重置此入站客戶端的所有流量嗎?", + "resetInboundClientTrafficTitle": "重置所有客戶端流量", + "resetInboundClientTraffics": "重置客戶端流量", + "resetTraffic": "重置流量", + "resetTrafficContent": "確定要重置流量嗎?", + "same": "相同", + "setDefaultCert": "從面板設定證書", + "stream": { + "general": { + "name": "名稱", + "request": "請求", + "response": "響應", + "value": "值" + }, + "tcp": { + "method": "方法", + "path": "路徑", + "requestHeader": "請求頭", + "responseHeader": "響應頭", + "status": "狀態", + "statusDescription": "狀態說明", + "version": "版本" + } + }, + "subscriptionDesc": "要找到你的訂閱 URL,請導航到“詳細資訊”。此外,你可以為多個客戶端使用相同的名稱。", + "targetAddress": "目標地址", + "telegramDesc": "請提供Telegram聊天ID。(在機器人中使用'/id'命令)或({'@'}userinfobot", + "title": "入站列表", "toasts": { - "obtain": "獲取", - "updateSuccess": "更新成功", - "logCleanSuccess": "日誌已清除", - "inboundsUpdateSuccess": "入站連接已成功更新", - "inboundUpdateSuccess": "入站連接已成功更新", - "inboundCreateSuccess": "入站連接已成功建立", - "inboundDeleteSuccess": "入站連接已成功刪除", + "delDepletedClientsSuccess": "所有耗盡客戶端已刪除", + "getNewVlessEncError": "取得VlessEnc憑證時發生錯誤。", + "getNewX25519CertError": "取得X25519憑證時發生錯誤。", + "getNewmldsa65Error": "取得mldsa65憑證時發生錯誤。", "inboundClientAddSuccess": "已新增入站客戶端", "inboundClientDeleteSuccess": "入站客戶端已刪除", "inboundClientUpdateSuccess": "入站客戶端已更新", - "delDepletedClientsSuccess": "所有耗盡客戶端已刪除", + "inboundCreateSuccess": "入站連接已成功建立", + "inboundDeleteSuccess": "入站連接已成功刪除", + "inboundUpdateSuccess": "入站連接已成功更新", + "inboundsUpdateSuccess": "入站連接已成功更新", + "logCleanSuccess": "日誌已清除", + "obtain": "獲取", "resetAllClientTrafficSuccess": "客戶端所有流量已重置", "resetAllTrafficSuccess": "所有流量已重置", "resetInboundClientTrafficSuccess": "流量已重置", "trafficGetError": "取得流量資料時發生錯誤", - "getNewX25519CertError": "取得X25519憑證時發生錯誤。", - "getNewmldsa65Error": "取得mldsa65憑證時發生錯誤。", - "getNewVlessEncError": "取得VlessEnc憑證時發生錯誤。" + "updateSuccess": "更新成功" }, - "stream": { - "general": { - "request": "請求", - "response": "響應", - "name": "名稱", - "value": "值" - }, - "tcp": { - "version": "版本", - "method": "方法", - "path": "路徑", - "status": "狀態", - "statusDescription": "狀態說明", - "requestHeader": "請求頭", - "responseHeader": "響應頭" - } - } + "totalDownUp": "總上傳 / 下載", + "totalFlow": "總流量", + "totalUsage": "總用量", + "traffic": "流量", + "transportConfig": "傳輸配置", + "updatedAt": "更新時間" }, - "client": { - "add": "新增客戶端", - "edit": "編輯客戶端", - "submitAdd": "新增客戶端", - "submitEdit": "儲存修改", - "clientCount": "客戶端數量", - "bulk": "批量建立", - "copyFromInbound": "從入站複製用戶端", - "copyToInbound": "複製用戶端到", - "copySelected": "複製所選", - "copySource": "來源", - "copyEmailPreview": "最終郵箱預覽", - "copySelectSourceFirst": "請先選擇來源入站。", - "copyResult": "複製結果", - "copyResultSuccess": "複製成功", - "copyResultNone": "沒有可複製的內容:未選擇用戶端或來源為空", - "copyResultErrors": "複製錯誤", - "copyFlowLabel": "新用戶端的 Flow (VLESS)", - "copyFlowHint": "套用於所有複製的用戶端。留空則略過。", - "selectAll": "全選", - "clearAll": "全不選", - "method": "方法", - "first": "置頂", - "last": "置底", - "prefix": "字首", - "postfix": "字尾", - "delayedStart": "首次使用後開始", - "expireDays": "期間", - "days": "天", - "renew": "自動續訂", - "renewDesc": "到期後自動續訂。(0 = 禁用)(單位: 天)" + "index": { + "backup": "備份和恢復", + "backupTitle": "備份和恢復", + "charts": "圖表", + "config": "配置", + "connectionCount": "連線數", + "cpu": "CPU", + "currentPanelVersion": "目前面板版本", + "customGeoActions": "操作", + "customGeoAdd": "新增", + "customGeoAlias": "別名", + "customGeoAliasLabelSuffix": "(自訂)", + "customGeoAliasPlaceholder": "a-z 0-9 _ -", + "customGeoAliasesError": "載入自訂 geo 別名失敗", + "customGeoDelete": "刪除", + "customGeoDeleteConfirm": "刪除此自訂 geo 來源?", + "customGeoDownload": "立即更新", + "customGeoEdit": "編輯", + "customGeoEmpty": "尚無自訂 geo 來源 — 點擊「新增」以建立", + "customGeoEnabled": "啟用", + "customGeoErrAliasPattern": "別名包含不允許的字元", + "customGeoErrAliasRequired": "請填寫別名", + "customGeoErrAliasReserved": "此別名已保留", + "customGeoErrDownload": "下載失敗", + "customGeoErrDuplicateAlias": "此類型已使用該別名", + "customGeoErrInvalidType": "類型必須是 geosite 或 geoip", + "customGeoErrInvalidUrl": "URL 無效", + "customGeoErrNotFound": "找不到自訂 geo 來源", + "customGeoErrUpdateAllIncomplete": "有一個或多個自訂 geo 來源更新失敗", + "customGeoErrUrlHost": "URL 主機無效", + "customGeoErrUrlRequired": "請填寫 URL", + "customGeoErrUrlScheme": "URL 必須使用 http 或 https", + "customGeoExtColumn": "路由 (ext:…)", + "customGeoInvalidId": "無效的資源 ID", + "customGeoLastUpdated": "上次更新", + "customGeoModalAdd": "新增自訂 geo", + "customGeoModalEdit": "編輯自訂 geo", + "customGeoModalSave": "儲存", + "customGeoRoutingHint": "在路由規則中將值欄寫為 ext:檔案.dat:標籤(替換標籤)。", + "customGeoTitle": "自訂 GeoSite / GeoIP", + "customGeoToastAdd": "新增自訂 geo", + "customGeoToastDelete": "自訂 geofile「{{ .fileName }}」已刪除", + "customGeoToastDownload": "geofile「{{ .fileName }}」已更新", + "customGeoToastList": "自訂 geo 清單", + "customGeoToastUpdate": "更新自訂 geo", + "customGeoToastUpdateAll": "所有自訂來源已更新", + "customGeoType": "類型", + "customGeoUrl": "URL", + "customGeoValidationAlias": "別名只能包含小寫字母、數字、- 和 _", + "customGeoValidationUrl": "URL 必須以 http:// 或 https:// 開頭", + "documentation": "文件", + "dontRefresh": "安裝中,請勿重新整理此頁面", + "download": "下載", + "exportDatabase": "備份", + "exportDatabaseDesc": "點擊下載包含當前資料庫備份的 .db 文件到您的設備。", + "frequency": "頻率", + "geofileUpdateDialog": "您確定要更新地理檔案嗎?", + "geofileUpdateDialogDesc": "這將更新 #filename# 檔案。", + "geofileUpdatePopover": "地理檔案更新成功", + "geofilesUpdateAll": "全部更新", + "geofilesUpdateDialogDesc": "這將更新所有文件。", + "getConfigError": "檢索設定檔時發生錯誤", + "getDatabaseError": "檢索資料庫時發生錯誤", + "importDatabase": "恢復", + "importDatabaseDesc": "點擊選擇並上傳設備中的 .db 文件以從備份恢復資料庫。", + "importDatabaseError": "匯入資料庫時發生錯誤", + "importDatabaseSuccess": "資料庫匯入成功", + "ipAddresses": "IP地址", + "latestPanelVersion": "最新面板版本", + "logicalProcessors": "邏輯處理器", + "logs": "日誌", + "memory": "記憶體", + "operationHours": "系統正常執行時間", + "overallSpeed": "整體速度", + "panelUpToDate": "面板已是最新", + "panelUpdateCheckPopover": "面板更新檢查失敗", + "panelUpdateDesc": "這將把 3X-UI 更新到最新版本並重新啟動面板服務。", + "panelUpdateDialog": "您確定要更新面板嗎?", + "panelUpdateDialogDesc": "這將把 3X-UI 更新到 #version# 並重新啟動面板服務。", + "panelUpdateStartedPopover": "面板更新已開始", + "readDatabaseError": "讀取資料庫時發生錯誤", + "received": "已接收", + "restartXray": "重啟", + "sent": "已發送", + "stopXray": "停止", + "storage": "儲存", + "swap": "交換空間", + "systemHistoryTitle": "系統歷史", + "systemLoad": "系統負載", + "systemLoadDesc": "過去 1、5 和 15 分鐘的系統平均負載", + "threads": "執行緒", + "title": "系統狀態", + "toggleIpVisibility": "切換IP可見性", + "totalData": "總數據", + "trendLast2Min": "最近 2 分鐘", + "upToDate": "已是最新", + "updatePanel": "更新面板", + "upload": "上傳", + "xrayErrorPopoverTitle": "執行Xray時發生錯誤", + "xrayMetricsDisabled": "未設定 Xray 指標端點", + "xrayMetricsHint": "在 xray 設定中加入頂層 metrics 區塊,tag 為 metrics_out,listen 為 127.0.0.1:11111,然後重啟 xray。", + "xrayMetricsTitle": "Xray 指標", + "xrayObservatoryAlive": "在線", + "xrayObservatoryDead": "離線", + "xrayObservatoryEmpty": "尚無 Observatory 資料", + "xrayObservatoryHint": "在 xray 設定中加入 observatory 區塊,列出要探測的出站 tag,然後重啟 xray。", + "xrayObservatoryLastSeen": "最後在線", + "xrayObservatoryLastTry": "最後嘗試", + "xrayObservatoryTagPlaceholder": "選擇出站", + "xrayStatus": "Xray", + "xrayStatusError": "錯誤", + "xrayStatusRunning": "運行中", + "xrayStatusStop": "停止", + "xrayStatusUnknown": "未知", + "xraySwitch": "版本", + "xraySwitchClick": "選擇你要切換到的版本", + "xraySwitchClickDesk": "請謹慎選擇,因為較舊版本可能與當前配置不相容", + "xraySwitchVersionDialog": "您確定要變更Xray版本嗎?", + "xraySwitchVersionDialogDesc": "這將會把Xray版本變更為#version#。", + "xraySwitchVersionPopover": "Xray 更新成功", + "xrayUpdates": "Xray 更新" + }, + "login": { + "hello": "你好", + "loginAgain": "登入時效已過,請重新登入", + "title": "歡迎", + "toasts": { + "emptyPassword": "請輸入密碼", + "emptyUsername": "請輸入使用者名稱", + "invalidFormData": "資料格式錯誤", + "successLogin": "您已成功登入您的帳戶。", + "wrongUsernameOrPassword": "用戶名、密碼或雙重驗證碼無效。" + } }, "nodes": { - "title": "節點", + "actions": "操作", "addNode": "新增節點", - "editNode": "編輯節點", - "totalNodes": "節點總數", - "onlineNodes": "線上", - "offlineNodes": "離線", + "address": "位址", + "addressPlaceholder": "panel.example.com 或 1.2.3.4", + "apiToken": "API 權杖", + "apiTokenHint": "遠端面板在 設定 → API 權杖 中顯示其 API 權杖。", + "apiTokenPlaceholder": "遠端面板設定頁中的權杖", "avgLatency": "平均延遲", + "basePath": "基礎路徑", + "connectionFailed": "連線失敗", + "connectionOk": "連線正常 ({ms} ms)", + "cpu": "CPU", + "deleteConfirmContent": "這將停止監控該節點。遠端面板本身不受影響。", + "deleteConfirmTitle": "刪除節點「{name}」?", + "editNode": "編輯節點", + "enable": "已啟用", + "justNow": "剛剛", + "lastHeartbeat": "上次心跳", + "latency": "延遲", + "mem": "記憶體", "name": "名稱", "namePlaceholder": "例如:de-frankfurt-1", - "addressPlaceholder": "panel.example.com 或 1.2.3.4", - "remark": "備註", - "scheme": "協議", - "address": "位址", + "never": "從未", + "offlineNodes": "離線", + "onlineNodes": "線上", "port": "埠", - "basePath": "基礎路徑", - "apiToken": "API 權杖", - "apiTokenPlaceholder": "遠端面板設定頁中的權杖", - "apiTokenHint": "遠端面板在 設定 → API 權杖 中顯示其 API 權杖。", + "probe": "立即探測", "regenerate": "重新產生權杖", "regenerateConfirm": "重新產生會使目前的權杖失效。任何使用該權杖的中央面板將失去存取權,直到更新為止。是否繼續?", - "enable": "已啟用", + "remark": "備註", + "scheme": "協議", "status": "狀態", - "cpu": "CPU", - "mem": "記憶體", - "uptime": "執行時間", - "latency": "延遲", - "lastHeartbeat": "上次心跳", - "xrayVersion": "Xray 版本", - "actions": "操作", - "probe": "立即探測", - "testConnection": "測試連線", - "connectionOk": "連線正常 ({ms} ms)", - "connectionFailed": "連線失敗", - "never": "從未", - "justNow": "剛剛", - "deleteConfirmTitle": "刪除節點「{name}」?", - "deleteConfirmContent": "這將停止監控該節點。遠端面板本身不受影響。", "statusValues": { - "online": "線上", "offline": "離線", + "online": "線上", "unknown": "未知" }, + "testConnection": "測試連線", + "title": "節點", "toasts": { - "list": "載入節點失敗", - "obtain": "載入節點失敗", "add": "新增節點", - "update": "更新節點", "delete": "刪除節點", "deleted": "節點已刪除", - "test": "測試連線", "fillRequired": "名稱、位址、埠與 API 權杖為必填", - "probeFailed": "探測失敗" - } + "list": "載入節點失敗", + "obtain": "載入節點失敗", + "probeFailed": "探測失敗", + "test": "測試連線", + "update": "更新節點" + }, + "totalNodes": "節點總數", + "uptime": "執行時間", + "xrayVersion": "Xray 版本" }, "settings": { - "title": "面板設定", - "save": "儲存", - "infoDesc": "此處的所有更改都需要儲存並重啟面板才能生效", - "restartPanel": "重啟面板", - "restartPanelDesc": "確定要重啟面板嗎?若重啟後無法訪問面板,請前往伺服器檢視面板日誌資訊", - "restartPanelSuccess": "面板已成功重新啟動", - "actions": "操作", - "resetDefaultConfig": "重置為預設配置", - "panelSettings": "常規", - "securitySettings": "安全設定", "TGBotSettings": "Telegram 機器人配置", - "panelListeningIP": "面板監聽 IP", - "panelListeningIPDesc": "預設留空監聽所有 IP", - "panelListeningDomain": "面板監聽域名", - "panelListeningDomainDesc": "預設情況下留空以監視所有域名和 IP 地址", - "panelPort": "面板監聽埠", - "panelPortDesc": "重啟面板生效", - "publicKeyPath": "面板證書公鑰檔案路徑", - "publicKeyPathDesc": "填寫一個 '/' 開頭的絕對路徑", - "privateKeyPath": "面板證書金鑰檔案路徑", - "privateKeyPathDesc": "填寫一個 '/' 開頭的絕對路徑", - "panelUrlPath": "面板 url 根路徑", - "panelUrlPathDesc": "必須以 '/' 開頭,以 '/' 結尾", - "pageSize": "分頁大小", - "pageSizeDesc": "定義入站表的頁面大小。設定 0 表示禁用", - "remarkModel": "備註模型和分隔符", - "datepicker": "日期選擇器", - "datepickerPlaceholder": "選擇日期", - "datepickerDescription": "選擇器日曆類型指定到期日期", - "sampleRemark": "備註示例", - "oldUsername": "原使用者名稱", + "actions": "操作", + "certs": "證書", "currentPassword": "原密碼", - "newUsername": "新使用者名稱", - "newPassword": "新密碼", - "telegramBotEnable": "啟用 Telegram 機器人", - "telegramBotEnableDesc": "啟用 Telegram 機器人功能", - "telegramToken": "Telegram 機器人令牌(token)", - "telegramTokenDesc": "從 '{'@'}BotFather' 獲取的 Telegram 機器人令牌", - "telegramProxy": "SOCKS5 Proxy", - "telegramProxyDesc": "啟用 SOCKS5 代理連線到 Telegram(根據指南調整設定)", - "telegramAPIServer": "Telegram API Server", - "telegramAPIServerDesc": "要使用的 Telegram API 伺服器。留空以使用預設伺服器。", - "telegramChatId": "管理員聊天 ID", - "telegramChatIdDesc": "Telegram 管理員聊天 ID (多個以逗號分隔)(可通過 {'@'}userinfobot 獲取,或在機器人中使用 '/id' 命令獲取)", - "telegramNotifyTime": "通知時間", - "telegramNotifyTimeDesc": "設定週期性的 Telegram 機器人通知時間(使用 crontab 時間格式)", - "tgNotifyBackup": "資料庫備份", - "tgNotifyBackupDesc": "傳送帶有報告的資料庫備份檔案", - "tgNotifyLogin": "登入通知", - "tgNotifyLoginDesc": "當有人試圖登入你的面板時顯示使用者名稱、IP 地址和時間", - "sessionMaxAge": "會話時長", - "sessionMaxAgeDesc": "保持登入狀態的時長(單位:分鐘)", + "dateAndTime": "日期和時間", + "datepicker": "日期選擇器", + "datepickerDescription": "選擇器日曆類型指定到期日期", + "datepickerPlaceholder": "選擇日期", + "direct": "直接連線", + "directDesc": "直接與特定國家的域或IP範圍建立連線", "expireTimeDiff": "到期通知閾值", "expireTimeDiffDesc": "達到此閾值時,將收到有關到期時間的通知(單位:天)", - "trafficDiff": "流量耗盡閾值", - "trafficDiffDesc": "達到此閾值時,將收到有關流量耗盡的通知(單位:GB)", - "tgNotifyCpu": "CPU 負載通知閾值", - "tgNotifyCpuDesc": "CPU 負載超過此閾值時,將收到通知(單位:%)", - "timeZone": "時區", - "timeZoneDesc": "定時任務將按照該時區的時間執行", - "subSettings": "訂閱設定", - "subEnable": "啟用訂閱服務", - "subEnableDesc": "啟用訂閱服務功能", - "subJsonEnable": "獨立啟用/停用 JSON 訂閱端點。", - "subTitle": "訂閱標題", - "subTitleDesc": "在VPN客戶端中顯示的標題", - "subSupportUrl": "支援連結", - "subSupportUrlDesc": "VPN 用戶端中顯示的技術支援連結", - "subProfileUrl": "個人資料連結", - "subProfileUrlDesc": "VPN 用戶端中顯示的網站連結", - "subAnnounce": "公告", - "subAnnounceDesc": "VPN 用戶端中顯示的公告文字", - "subEnableRouting": "啟用路由", - "subEnableRoutingDesc": "在 VPN 用戶端中啟用路由的全域設定。(僅限 Happ)", - "subRoutingRules": "路由規則", - "subRoutingRulesDesc": "VPN 用戶端的全域路由規則。(僅限 Happ)", - "subListen": "監聽 IP", - "subListenDesc": "訂閱服務監聽的 IP 地址(留空表示監聽所有 IP)", - "subPort": "監聽埠", - "subPortDesc": "訂閱服務監聽的埠號(必須是未使用的埠)", - "subCertPath": "公鑰路徑", - "subCertPathDesc": "訂閱服務使用的公鑰檔案路徑(以 '/' 開頭)", - "subKeyPath": "私鑰路徑", - "subKeyPathDesc": "訂閱服務使用的私鑰檔案路徑(以 '/' 開頭)", - "subPath": "URI 路徑", - "subPathDesc": "訂閱服務使用的 URI 路徑(以 '/' 開頭,以 '/' 結尾)", - "subDomain": "監聽域名", - "subDomainDesc": "訂閱服務監聽的域名(留空表示監聽所有域名和 IP)", - "subUpdates": "更新間隔", - "subUpdatesDesc": "客戶端應用中訂閱 URL 的更新間隔(單位:小時)", - "subEncrypt": "編碼", - "subEncryptDesc": "訂閱服務返回的內容將採用 Base64 編碼", - "subShowInfo": "顯示使用資訊", - "subShowInfoDesc": "客戶端應用中將顯示剩餘流量和日期資訊", - "subURI": "反向代理 URI", - "subURIDesc": "用於代理後面的訂閱 URL 的 URI 路徑", + "externalTraffic": "外部流量", "externalTrafficInformEnable": "外部交通通知", "externalTrafficInformEnableDesc": "每次流量更新時通知外部 API", "externalTrafficInformURI": "外部流量通知 URI", "externalTrafficInformURIDesc": "流量更新將會傳送到此 URI", - "restartXrayOnClientDisable": "用戶自動停用後重新啟動 Xray", - "restartXrayOnClientDisableDesc": "當用戶因到期或流量上限而被自動停用時,重新啟動 Xray。", "fragment": "分片", "fragmentDesc": "啟用 TLS hello 資料包分片", "fragmentSett": "設定", - "noisesDesc": "啟用 Noises.", - "noisesSett": "Noises 設定", + "infoDesc": "此處的所有更改都需要儲存並重啟面板才能生效", + "information": "資訊", + "intervals": "間隔", + "language": "語言", "mux": "多路複用器", "muxDesc": "在已建立的資料流內傳輸多個獨立的資料流", "muxSett": "複用器設定", - "direct": "直接連線", - "directDesc": "直接與特定國家的域或IP範圍建立連線", + "newPassword": "新密碼", + "newUsername": "新使用者名稱", + "noisesDesc": "啟用 Noises.", + "noisesSett": "Noises 設定", "notifications": "通知", - "certs": "證書", - "externalTraffic": "外部流量", - "dateAndTime": "日期和時間", + "oldUsername": "原使用者名稱", + "pageSize": "分頁大小", + "pageSizeDesc": "定義入站表的頁面大小。設定 0 表示禁用", + "panelListeningDomain": "面板監聽域名", + "panelListeningDomainDesc": "預設情況下留空以監視所有域名和 IP 地址", + "panelListeningIP": "面板監聽 IP", + "panelListeningIPDesc": "預設留空監聽所有 IP", + "panelPort": "面板監聽埠", + "panelPortDesc": "重啟面板生效", + "panelSettings": "常規", + "panelUrlPath": "面板 url 根路徑", + "panelUrlPathDesc": "必須以 '/' 開頭,以 '/' 結尾", + "privateKeyPath": "面板證書金鑰檔案路徑", + "privateKeyPathDesc": "填寫一個 '/' 開頭的絕對路徑", "proxyAndServer": "代理和伺服器", - "intervals": "間隔", - "information": "資訊", - "language": "語言", - "telegramBotLanguage": "Telegram 機器人語言", + "publicKeyPath": "面板證書公鑰檔案路徑", + "publicKeyPathDesc": "填寫一個 '/' 開頭的絕對路徑", + "remarkModel": "備註模型和分隔符", + "resetDefaultConfig": "重置為預設配置", + "restartPanel": "重啟面板", + "restartPanelDesc": "確定要重啟面板嗎?若重啟後無法訪問面板,請前往伺服器檢視面板日誌資訊", + "restartPanelSuccess": "面板已成功重新啟動", + "restartXrayOnClientDisable": "用戶自動停用後重新啟動 Xray", + "restartXrayOnClientDisableDesc": "當用戶因到期或流量上限而被自動停用時,重新啟動 Xray。", + "sampleRemark": "備註示例", + "save": "儲存", "security": { "admin": "管理員憑證", "twoFactor": "雙重驗證", "twoFactorEnable": "啟用2FA", "twoFactorEnableDesc": "增加額外的驗證層以提高安全性。", - "twoFactorModalSetTitle": "啟用雙重認證", - "twoFactorModalDeleteTitle": "停用雙重認證", - "twoFactorModalSteps": "要設定雙重認證,請執行以下步驟:", - "twoFactorModalFirstStep": "1. 在認證應用程式中掃描此QR碼,或複製QR碼附近的令牌並貼到應用程式中", - "twoFactorModalSecondStep": "2. 輸入應用程式中的驗證碼", - "twoFactorModalRemoveStep": "輸入應用程式中的驗證碼以移除雙重認證。", - "twoFactorModalChangeCredentialsTitle": "更改憑證", "twoFactorModalChangeCredentialsStep": "輸入應用程式中的代碼以更改管理員憑證。", - "twoFactorModalSetSuccess": "雙重身份驗證已成功建立", + "twoFactorModalChangeCredentialsTitle": "更改憑證", "twoFactorModalDeleteSuccess": "雙重身份驗證已成功刪除", - "twoFactorModalError": "驗證碼錯誤" + "twoFactorModalDeleteTitle": "停用雙重認證", + "twoFactorModalError": "驗證碼錯誤", + "twoFactorModalFirstStep": "1. 在認證應用程式中掃描此QR碼,或複製QR碼附近的令牌並貼到應用程式中", + "twoFactorModalRemoveStep": "輸入應用程式中的驗證碼以移除雙重認證。", + "twoFactorModalSecondStep": "2. 輸入應用程式中的驗證碼", + "twoFactorModalSetSuccess": "雙重身份驗證已成功建立", + "twoFactorModalSetTitle": "啟用雙重認證", + "twoFactorModalSteps": "要設定雙重認證,請執行以下步驟:" }, + "securitySettings": "安全設定", + "sessionMaxAge": "會話時長", + "sessionMaxAgeDesc": "保持登入狀態的時長(單位:分鐘)", + "subAnnounce": "公告", + "subAnnounceDesc": "VPN 用戶端中顯示的公告文字", + "subCertPath": "公鑰路徑", + "subCertPathDesc": "訂閱服務使用的公鑰檔案路徑(以 '/' 開頭)", + "subDomain": "監聽域名", + "subDomainDesc": "訂閱服務監聽的域名(留空表示監聽所有域名和 IP)", + "subEnable": "啟用訂閱服務", + "subEnableDesc": "啟用訂閱服務功能", + "subEnableRouting": "啟用路由", + "subEnableRoutingDesc": "在 VPN 用戶端中啟用路由的全域設定。(僅限 Happ)", + "subEncrypt": "編碼", + "subEncryptDesc": "訂閱服務返回的內容將採用 Base64 編碼", + "subJsonEnable": "獨立啟用/停用 JSON 訂閱端點。", + "subKeyPath": "私鑰路徑", + "subKeyPathDesc": "訂閱服務使用的私鑰檔案路徑(以 '/' 開頭)", + "subListen": "監聽 IP", + "subListenDesc": "訂閱服務監聽的 IP 地址(留空表示監聽所有 IP)", + "subPath": "URI 路徑", + "subPathDesc": "訂閱服務使用的 URI 路徑(以 '/' 開頭,以 '/' 結尾)", + "subPort": "監聽埠", + "subPortDesc": "訂閱服務監聽的埠號(必須是未使用的埠)", + "subProfileUrl": "個人資料連結", + "subProfileUrlDesc": "VPN 用戶端中顯示的網站連結", + "subRoutingRules": "路由規則", + "subRoutingRulesDesc": "VPN 用戶端的全域路由規則。(僅限 Happ)", + "subSettings": "訂閱設定", + "subShowInfo": "顯示使用資訊", + "subShowInfoDesc": "客戶端應用中將顯示剩餘流量和日期資訊", + "subSupportUrl": "支援連結", + "subSupportUrlDesc": "VPN 用戶端中顯示的技術支援連結", + "subTitle": "訂閱標題", + "subTitleDesc": "在VPN客戶端中顯示的標題", + "subURI": "反向代理 URI", + "subURIDesc": "用於代理後面的訂閱 URL 的 URI 路徑", + "subUpdates": "更新間隔", + "subUpdatesDesc": "客戶端應用中訂閱 URL 的更新間隔(單位:小時)", + "telegramAPIServer": "Telegram API Server", + "telegramAPIServerDesc": "要使用的 Telegram API 伺服器。留空以使用預設伺服器。", + "telegramBotEnable": "啟用 Telegram 機器人", + "telegramBotEnableDesc": "啟用 Telegram 機器人功能", + "telegramBotLanguage": "Telegram 機器人語言", + "telegramChatId": "管理員聊天 ID", + "telegramChatIdDesc": "Telegram 管理員聊天 ID (多個以逗號分隔)(可通過 {'@'}userinfobot 獲取,或在機器人中使用 '/id' 命令獲取)", + "telegramNotifyTime": "通知時間", + "telegramNotifyTimeDesc": "設定週期性的 Telegram 機器人通知時間(使用 crontab 時間格式)", + "telegramProxy": "SOCKS5 Proxy", + "telegramProxyDesc": "啟用 SOCKS5 代理連線到 Telegram(根據指南調整設定)", + "telegramToken": "Telegram 機器人令牌(token)", + "telegramTokenDesc": "從 '{'@'}BotFather' 獲取的 Telegram 機器人令牌", + "tgNotifyBackup": "資料庫備份", + "tgNotifyBackupDesc": "傳送帶有報告的資料庫備份檔案", + "tgNotifyCpu": "CPU 負載通知閾值", + "tgNotifyCpuDesc": "CPU 負載超過此閾值時,將收到通知(單位:%)", + "tgNotifyLogin": "登入通知", + "tgNotifyLoginDesc": "當有人試圖登入你的面板時顯示使用者名稱、IP 地址和時間", + "timeZone": "時區", + "timeZoneDesc": "定時任務將按照該時區的時間執行", + "title": "面板設定", "toasts": { - "modifySettings": "參數已更改。", - "getSettings": "取得參數時發生錯誤", - "modifyUserError": "變更管理員憑證時發生錯誤。", - "modifyUser": "您已成功變更管理員憑證。", - "originalUserPassIncorrect": "原使用者名稱或原密碼錯誤", - "userPassMustBeNotEmpty": "新使用者名稱和新密碼不能為空", "getOutboundTrafficError": "取得出站流量錯誤", - "resetOutboundTrafficError": "重設出站流量錯誤" - } + "getSettings": "取得參數時發生錯誤", + "modifySettings": "參數已更改。", + "modifyUser": "您已成功變更管理員憑證。", + "modifyUserError": "變更管理員憑證時發生錯誤。", + "originalUserPassIncorrect": "原使用者名稱或原密碼錯誤", + "resetOutboundTrafficError": "重設出站流量錯誤", + "userPassMustBeNotEmpty": "新使用者名稱和新密碼不能為空" + }, + "trafficDiff": "流量耗盡閾值", + "trafficDiffDesc": "達到此閾值時,將收到有關流量耗盡的通知(單位:GB)" }, "xray": { - "title": "Xray 配置", - "save": "儲存", - "restart": "重新啟動 Xray", - "restartSuccess": "Xray 已成功重新啟動", - "stopSuccess": "Xray 已成功停止", - "restartError": "重新啟動Xray時發生錯誤。", - "stopError": "停止Xray時發生錯誤。", - "basicTemplate": "基礎配置", - "advancedTemplate": "高階配置", - "generalConfigs": "常規配置", - "generalConfigsDesc": "這些選項將決定常規配置", - "logConfigs": "日誌", - "logConfigsDesc": "日誌可能會影響伺服器的效能,建議僅在需要時啟用", - "blockConfigsDesc": "這些選項將阻止使用者連線到特定協議和網站", - "basicRouting": "基本路由", - "blockConnectionsConfigsDesc": "這些選項將根據特定的請求國家阻止流量。", - "directConnectionsConfigsDesc": "直接連線確保特定的流量不會通過其他伺服器路由。", - "blockips": "阻止IP", - "blockdomains": "阻止域名", - "directips": "直接IP", - "directdomains": "直接域名", - "ipv4Routing": "IPv4 路由", - "ipv4RoutingDesc": "此選項將僅通過 IPv4 路由到目標域", - "warpRouting": "WARP 路由", - "warpRoutingDesc": "注意:在使用這些選項之前,請按照面板 GitHub 上的步驟在你的伺服器上以 socks5 代理模式安裝 WARP。WARP 將通過 Cloudflare 伺服器將流量路由到網站。", - "nordRouting": "NordVPN 路由", - "nordRoutingDesc": "這些選項將根據特定目的地通過 NordVPN 路由流量。", - "Template": "高階 Xray 配置模板", - "TemplateDesc": "最終的 Xray 配置檔案將基於此模板生成", + "Balancers": "負載均衡", "FreedomStrategy": "Freedom 協議策略", "FreedomStrategyDesc": "設定 Freedom 協議中網路的輸出策略", - "RoutingStrategy": "配置路由域策略", - "RoutingStrategyDesc": "設定 DNS 解析的整體路由策略", - "outboundTestUrl": "出站測試 URL", - "outboundTestUrlDesc": "測試出站連線時使用的 URL", - "Torrent": "遮蔽 BitTorrent 協議", "Inbounds": "入站規則", "InboundsDesc": "接受來自特定客戶端的流量", "Outbounds": "出站規則", - "Balancers": "負載均衡", "OutboundsDesc": "設定出站流量傳出方式", + "RoutingStrategy": "配置路由域策略", + "RoutingStrategyDesc": "設定 DNS 解析的整體路由策略", "Routings": "路由規則", "RoutingsDesc": "每條規則的優先順序都很重要", - "completeTemplate": "全部", - "logLevel": "日誌級別", - "logLevelDesc": "錯誤日誌的日誌級別,用於指示需要記錄的資訊", + "Template": "高階 Xray 配置模板", + "TemplateDesc": "最終的 Xray 配置檔案將基於此模板生成", + "Torrent": "遮蔽 BitTorrent 協議", "accessLog": "訪問日誌", "accessLogDesc": "訪問日誌的檔案路徑。特殊值 'none' 禁用訪問日誌", - "errorLog": "錯誤日誌", - "errorLogDesc": "錯誤日誌的檔案路徑。特殊值 'none' 禁用錯誤日誌", - "dnsLog": "DNS 日誌", - "dnsLogDesc": "是否啟用 DNS 查詢日誌", - "maskAddress": "隱藏地址", - "maskAddressDesc": "IP 地址掩碼,啟用時會自動替換日誌中出現的 IP 地址。", - "statistics": "統計", - "statsInboundUplink": "入站上傳統計", - "statsInboundUplinkDesc": "啟用所有入站代理的上行流量統計收集。", - "statsInboundDownlink": "入站下載統計", - "statsInboundDownlinkDesc": "啟用所有入站代理的下行流量統計收集。", - "statsOutboundUplink": "出站上傳統計", - "statsOutboundUplinkDesc": "啟用所有出站代理的上行流量統計收集。", - "statsOutboundDownlink": "出站下載統計", - "statsOutboundDownlinkDesc": "啟用所有出站代理的下行流量統計收集。", - "rules": { - "first": "置頂", - "last": "置底", - "up": "向上", - "down": "向下", - "source": "來源", - "dest": "目的地址", - "inbound": "入站", - "outbound": "出站", - "balancer": "負載均衡", - "info": "資訊", - "add": "新增規則", - "edit": "編輯規則", - "useComma": "逗號分隔的項目" - }, - "outbound": { - "addOutbound": "新增出站", - "addReverse": "新增反向", - "editOutbound": "編輯出站", - "editReverse": "編輯反向", - "reverseTag": "反向標籤", - "reverseTagDesc": "VLESS 簡易反向代理出站標籤。留空則停用。設定後,此客戶端的連線可作為反向代理隧道。", - "reverseTagPlaceholder": "出站標籤(留空則停用)", - "tag": "標籤", - "tagDesc": "唯一標籤", - "address": "地址", - "reverse": "反向", - "domain": "域名", - "type": "類型", - "bridge": "Bridge", - "portal": "Portal", - "link": "連結", - "intercon": "互連", - "settings": "設定", - "accountInfo": "帳戶資訊", - "outboundStatus": "出站狀態", - "sendThrough": "傳送通過", - "test": "測試", - "testResult": "測試結果", - "testing": "正在測試連接...", - "testSuccess": "測試成功", - "testFailed": "測試失敗", - "testError": "測試出站失敗", - "nordvpn": "NordVPN", - "accessToken": "訪問令牌", - "country": "國家", - "server": "伺服器", - "city": "城市", - "allCities": "所有城市", - "privateKey": "私密金鑰", - "load": "負載" - }, + "advancedTemplate": "高階配置", "balancer": { "addBalancer": "新增負載均衡", - "editBalancer": "編輯負載均衡", - "balancerStrategy": "策略", + "balancerDesc": "無法同時使用 balancerTag 和 outboundTag。如果同時使用,則只有 outboundTag 會生效。", "balancerSelectors": "選擇器", + "balancerStrategy": "策略", + "editBalancer": "編輯負載均衡", "tag": "標籤", - "tagDesc": "唯一標籤", - "balancerDesc": "無法同時使用 balancerTag 和 outboundTag。如果同時使用,則只有 outboundTag 會生效。" - }, - "wireguard": { - "secretKey": "金鑰", - "publicKey": "公鑰", - "allowedIPs": "允許的 IP", - "endpoint": "端點", - "psk": "共享金鑰", - "domainStrategy": "域策略" - }, - "tun": { - "nameDesc": "TUN 介面的名稱。預設值為 'xray0'", - "mtuDesc": "最大傳輸單元。資料包的最大大小。預設值為 1500", - "userLevel": "用戶級別", - "userLevelDesc": "通過此入站的所有連接都將使用此用戶級別。預設值為 0" + "tagDesc": "唯一標籤" }, + "basicRouting": "基本路由", + "basicTemplate": "基礎配置", + "blockConfigsDesc": "這些選項將阻止使用者連線到特定協議和網站", + "blockConnectionsConfigsDesc": "這些選項將根據特定的請求國家阻止流量。", + "blockdomains": "阻止域名", + "blockips": "阻止IP", + "completeTemplate": "全部", + "directConnectionsConfigsDesc": "直接連線確保特定的流量不會通過其他伺服器路由。", + "directdomains": "直接域名", + "directips": "直接IP", "dns": { - "enable": "啟用 DNS", - "enableDesc": "啟用內建 DNS 伺服器", - "tag": "DNS 入站標籤", - "tagDesc": "此標籤將在路由規則中可用作入站標籤", + "add": "新增伺服器", + "clearAll": "全部刪除", + "clearAllConfirm": "此操作將從清單中刪除所有 DNS 伺服器,無法復原。", + "clearAllTitle": "刪除所有 DNS 伺服器?", "clientIp": "客戶端IP", "clientIpDesc": "用於在DNS查詢期間通知伺服器指定的IP位置", "disableCache": "禁用快取", @@ -753,217 +607,371 @@ "disableFallbackDesc": "禁用回退DNS查詢", "disableFallbackIfMatch": "匹配時禁用回退", "disableFallbackIfMatchDesc": "當DNS伺服器的匹配域名列表命中時,禁用回退DNS查詢", + "dnsPresetFamily": "家庭", + "dnsPresetTitle": "DNS範本", + "domains": "域", + "edit": "編輯伺服器", + "enable": "啟用 DNS", + "enableDesc": "啟用內建 DNS 伺服器", "enableParallelQuery": "啟用並行查詢", "enableParallelQueryDesc": "啟用並行DNS查詢到多個伺服器以實現更快的解析", - "strategy": "查詢策略", - "strategyDesc": "解析域名的總體策略", - "add": "新增伺服器", - "edit": "編輯伺服器", - "domains": "域", "expectIPs": "預期 IP", - "unexpectIPs": "意外IP", - "useSystemHosts": "使用系統Hosts", - "useSystemHostsDesc": "使用已安裝系統的hosts檔案", - "usePreset": "使用範本", - "dnsPresetTitle": "DNS範本", - "dnsPresetFamily": "家庭", - "serveStale": "提供過期結果", - "serveStaleDesc": "在背景重新整理時傳回過期的快取結果", - "serveExpiredTTL": "過期TTL", - "serveExpiredTTLDesc": "過期快取項目的有效期(秒);0 = 永不過期", - "timeoutMs": "逾時 (毫秒)", - "skipFallback": "跳過回退", "finalQuery": "最終查詢", "hosts": "Hosts", "hostsAdd": "新增 Host", - "hostsEmpty": "未定義任何 Host", "hostsDomain": "網域 (例如 domain:example.com)", + "hostsEmpty": "未定義任何 Host", "hostsValues": "IP 或網域 — 輸入後按 Enter", - "clearAll": "全部刪除", - "clearAllTitle": "刪除所有 DNS 伺服器?", - "clearAllConfirm": "此操作將從清單中刪除所有 DNS 伺服器,無法復原。" + "serveExpiredTTL": "過期TTL", + "serveExpiredTTLDesc": "過期快取項目的有效期(秒);0 = 永不過期", + "serveStale": "提供過期結果", + "serveStaleDesc": "在背景重新整理時傳回過期的快取結果", + "skipFallback": "跳過回退", + "strategy": "查詢策略", + "strategyDesc": "解析域名的總體策略", + "tag": "DNS 入站標籤", + "tagDesc": "此標籤將在路由規則中可用作入站標籤", + "timeoutMs": "逾時 (毫秒)", + "unexpectIPs": "意外IP", + "usePreset": "使用範本", + "useSystemHosts": "使用系統Hosts", + "useSystemHostsDesc": "使用已安裝系統的hosts檔案" }, + "dnsLog": "DNS 日誌", + "dnsLogDesc": "是否啟用 DNS 查詢日誌", + "errorLog": "錯誤日誌", + "errorLogDesc": "錯誤日誌的檔案路徑。特殊值 'none' 禁用錯誤日誌", "fakedns": { "add": "新增假 DNS", "edit": "編輯假 DNS", "ipPool": "IP 池子網", "poolSize": "池大小" + }, + "generalConfigs": "常規配置", + "generalConfigsDesc": "這些選項將決定常規配置", + "ipv4Routing": "IPv4 路由", + "ipv4RoutingDesc": "此選項將僅通過 IPv4 路由到目標域", + "logConfigs": "日誌", + "logConfigsDesc": "日誌可能會影響伺服器的效能,建議僅在需要時啟用", + "logLevel": "日誌級別", + "logLevelDesc": "錯誤日誌的日誌級別,用於指示需要記錄的資訊", + "maskAddress": "隱藏地址", + "maskAddressDesc": "IP 地址掩碼,啟用時會自動替換日誌中出現的 IP 地址。", + "nordRouting": "NordVPN 路由", + "nordRoutingDesc": "這些選項將根據特定目的地通過 NordVPN 路由流量。", + "outbound": { + "accessToken": "訪問令牌", + "accountInfo": "帳戶資訊", + "addOutbound": "新增出站", + "addReverse": "新增反向", + "address": "地址", + "allCities": "所有城市", + "bridge": "Bridge", + "city": "城市", + "country": "國家", + "domain": "域名", + "editOutbound": "編輯出站", + "editReverse": "編輯反向", + "intercon": "互連", + "link": "連結", + "load": "負載", + "nordvpn": "NordVPN", + "outboundStatus": "出站狀態", + "portal": "Portal", + "privateKey": "私密金鑰", + "reverse": "反向", + "reverseTag": "反向標籤", + "reverseTagDesc": "VLESS 簡易反向代理出站標籤。留空則停用。設定後,此客戶端的連線可作為反向代理隧道。", + "reverseTagPlaceholder": "出站標籤(留空則停用)", + "sendThrough": "傳送通過", + "server": "伺服器", + "settings": "設定", + "tag": "標籤", + "tagDesc": "唯一標籤", + "test": "測試", + "testError": "測試出站失敗", + "testFailed": "測試失敗", + "testResult": "測試結果", + "testSuccess": "測試成功", + "testing": "正在測試連接...", + "type": "類型" + }, + "outboundTestUrl": "出站測試 URL", + "outboundTestUrlDesc": "測試出站連線時使用的 URL", + "restart": "重新啟動 Xray", + "restartError": "重新啟動Xray時發生錯誤。", + "restartSuccess": "Xray 已成功重新啟動", + "rules": { + "add": "新增規則", + "balancer": "負載均衡", + "dest": "目的地址", + "down": "向下", + "edit": "編輯規則", + "first": "置頂", + "inbound": "入站", + "info": "資訊", + "last": "置底", + "outbound": "出站", + "source": "來源", + "up": "向上", + "useComma": "逗號分隔的項目" + }, + "save": "儲存", + "statistics": "統計", + "statsInboundDownlink": "入站下載統計", + "statsInboundDownlinkDesc": "啟用所有入站代理的下行流量統計收集。", + "statsInboundUplink": "入站上傳統計", + "statsInboundUplinkDesc": "啟用所有入站代理的上行流量統計收集。", + "statsOutboundDownlink": "出站下載統計", + "statsOutboundDownlinkDesc": "啟用所有出站代理的下行流量統計收集。", + "statsOutboundUplink": "出站上傳統計", + "statsOutboundUplinkDesc": "啟用所有出站代理的上行流量統計收集。", + "stopError": "停止Xray時發生錯誤。", + "stopSuccess": "Xray 已成功停止", + "title": "Xray 配置", + "tun": { + "mtuDesc": "最大傳輸單元。資料包的最大大小。預設值為 1500", + "nameDesc": "TUN 介面的名稱。預設值為 'xray0'", + "userLevel": "用戶級別", + "userLevelDesc": "通過此入站的所有連接都將使用此用戶級別。預設值為 0" + }, + "warpRouting": "WARP 路由", + "warpRoutingDesc": "注意:在使用這些選項之前,請按照面板 GitHub 上的步驟在你的伺服器上以 socks5 代理模式安裝 WARP。WARP 將通過 Cloudflare 伺服器將流量路由到網站。", + "wireguard": { + "allowedIPs": "允許的 IP", + "domainStrategy": "域策略", + "endpoint": "端點", + "psk": "共享金鑰", + "publicKey": "公鑰", + "secretKey": "金鑰" } } }, + "password": "密碼", + "path": "路徑", + "protocol": "協議", + "qrCode": "二維碼", + "remained": "剩餘", + "remark": "備註", + "reset": "重置", + "save": "儲存", + "search": "搜尋", + "secAlertConf": "某些設定易受攻擊。建議加強安全協議以防止潛在漏洞。", + "secAlertPanelPort": "面板預設埠存在安全風險。請配置隨機埠或特定埠。", + "secAlertPanelURI": "面板預設 URI 路徑不安全。請配置複雜的 URI 路徑。", + "secAlertSSL": "面板缺少安全連線。請安裝 TLS 證書以保護資料安全。", + "secAlertSsl": "此連線不安全。在啟用 TLS 進行資料保護之前,請勿輸入敏感資訊。", + "secAlertSubJsonURI": "訂閱 JSON 預設 URI 路徑不安全。請配置複雜的 URI 路徑。", + "secAlertSubURI": "訂閱預設 URI 路徑不安全。請配置複雜的 URI 路徑。", + "secAlertTitle": "安全警報", + "second": "秒", + "security": "安全", + "somethingWentWrong": "發生錯誤", + "status": "狀態", + "subscription": { + "active": "啟用", + "downloaded": "已下載", + "expiry": "到期", + "inactive": "停用", + "individualLinks": "個別連結", + "noExpiry": "無到期", + "status": "狀態", + "subId": "訂閱 ID", + "title": "訂閱資訊", + "totalQuota": "總配額", + "unlimited": "無限制", + "uploaded": "已上傳" + }, + "success": "成功", + "sure": "確定", "tgbot": { - "keyboardClosed": "❌ 自定義鍵盤已關閉!", - "noResult": "❗ 沒有結果!", - "noQuery": "❌ 未找到查詢!請再次使用該命令!", - "wentWrong": "❌ 出了點問題!", - "noIpRecord": "❗ 沒有IP記錄!", - "noInbounds": "❗ 未找到入站!", - "unlimited": "♾ 無限(重置)", "add": "添加", - "month": "月", - "months": "月", - "day": "天", - "days": "天", - "hours": "小時", - "minutes": "分鐘", - "unknown": "未知", - "inbounds": "入站", - "clients": "客戶端", - "offline": "🔴 離線", - "online": "🟢 在線", - "commands": { - "unknown": "❗ 未知命令", - "pleaseChoose": "👇 請選擇:\r\n", - "help": "🤖 歡迎使用本機器人!它旨在為您提供來自伺服器的特定資料,並允許您進行必要的修改。\r\n\r\n", - "start": "👋 你好,{{ .Firstname }}。\r\n", - "welcome": "🤖 歡迎來到 {{ .Hostname }} 管理機器人。\r\n", - "status": "✅ 機器人正常執行!", - "usage": "❗ 請輸入要搜尋的文字!", - "getID": "🆔 您的 ID 為:{{ .ID }}", - "helpAdminCommands": "要重新啟動 Xray Core:\r\n/restart\r\n\r\n要搜尋客戶電子郵件:\r\n/usage [電子郵件]\r\n\r\n要搜尋入站(帶有客戶統計資料):\r\n/inbound [備註]\r\n\r\nTelegram聊天ID:\r\n/id", - "helpClientCommands": "要搜尋統計資料,請使用以下命令:\r\n/usage [電子郵件]\r\n\r\nTelegram聊天ID:\r\n/id", - "restartUsage": "\r\n\r\n/restart", - "restartSuccess": "✅ 操作成功!", - "restartFailed": "❗ 操作錯誤。\r\n\r\n錯誤: {{ .Error }}.", - "xrayNotRunning": "❗ Xray Core 未運行。", - "startDesc": "顯示主選單", - "helpDesc": "機器人幫助", - "statusDesc": "檢查機器人狀態", - "idDesc": "顯示您的 Telegram ID" - }, - "messages": { - "cpuThreshold": "🔴 CPU 使用率為 {{ .Percent }}%,超過閾值 {{ .Threshold }}%", - "selectUserFailed": "❌ 使用者選擇錯誤!", - "userSaved": "✅ 電報使用者已儲存。", - "loginSuccess": "✅ 成功登入到面板。\r\n", - "loginFailed": "❗️ 面板登入失敗。\r\n", - "2faFailed": "2FA 失敗", - "report": "🕰 定時報告:{{ .RunTime }}\r\n", - "datetime": "⏰ 日期時間:{{ .DateTime }}\r\n", - "hostname": "💻 主機名:{{ .Hostname }}\r\n", - "version": "🚀 X-UI 版本:{{ .Version }}\r\n", - "xrayVersion": "📡 Xray 版本: {{ .XrayVersion }}\r\n", - "ipv6": "🌐 IPv6:{{ .IPv6 }}\r\n", - "ipv4": "🌐 IPv4:{{ .IPv4 }}\r\n", - "ip": "🌐 IP:{{ .IP }}\r\n", - "ips": "🔢 IP 地址:\r\n{{ .IPs }}\r\n", - "serverUpTime": "⏳ 伺服器執行時間:{{ .UpTime }} {{ .Unit }}\r\n", - "serverLoad": "📈 伺服器負載:{{ .Load1 }}, {{ .Load2 }}, {{ .Load3 }}\r\n", - "serverMemory": "📋 伺服器記憶體:{{ .Current }}/{{ .Total }}\r\n", - "tcpCount": "🔹 TCP 連線數:{{ .Count }}\r\n", - "udpCount": "🔸 UDP 連線數:{{ .Count }}\r\n", - "traffic": "🚦 流量:{{ .Total }} (↑{{ .Upload }},↓{{ .Download }})\r\n", - "xrayStatus": "ℹ️ Xray 狀態:{{ .State }}\r\n", - "username": "👤 使用者名稱:{{ .Username }}\r\n", - "reason": "❗️ 原因:{{ .Reason }}\r\n", - "time": "⏰ 時間:{{ .Time }}\r\n", - "inbound": "📍 入站:{{ .Remark }}\r\n", - "port": "🔌 埠:{{ .Port }}\r\n", - "expire": "📅 過期日期:{{ .Time }}\r\n", - "expireIn": "📅 剩餘時間:{{ .Time }}\r\n", - "active": "💡 啟用:{{ .Enable }}\r\n", - "enabled": "🚨 已啟用:{{ .Enable }}\r\n", - "online": "🌐 連線狀態:{{ .Status }}\r\n", - "lastOnline": "🔙 上次上線: {{ .Time }}\r\n", - "email": "📧 郵箱:{{ .Email }}\r\n", - "upload": "🔼 上傳↑:{{ .Upload }}\r\n", - "download": "🔽 下載↓:{{ .Download }}\r\n", - "total": "📊 總計:{{ .UpDown }} / {{ .Total }}\r\n", - "TGUser": "👤 電報使用者:{{ .TelegramID }}\r\n", - "exhaustedMsg": "🚨 耗盡的 {{ .Type }}:\r\n", - "exhaustedCount": "🚨 耗盡的 {{ .Type }} 數量:\r\n", - "onlinesCount": "🌐 線上客戶:{{ .Count }}\r\n", - "disabled": "🛑 禁用:{{ .Disabled }}\r\n", - "depleteSoon": "🔜 即將耗盡:{{ .Deplete }}\r\n\r\n", - "backupTime": "🗄 備份時間:{{ .Time }}\r\n", - "refreshedOn": "\r\n📋🔄 重新整理時間:{{ .Time }}\r\n\r\n", - "yes": "✅ 是的", - "no": "❌ 沒有", - "received_id": "🔑📥 ID 已更新。", - "received_password": "🔑📥 密碼已更新。", - "received_email": "📧📥 電子郵件已更新。", - "received_comment": "💬📥 評論已更新。", - "id_prompt": "🔑 預設 ID: {{ .ClientId }}\n\n請輸入您的 ID。", - "pass_prompt": "🔑 預設密碼: {{ .ClientPassword }}\n\n請輸入您的密碼。", - "email_prompt": "📧 預設電子郵件: {{ .ClientEmail }}\n\n請輸入您的電子郵件。", - "comment_prompt": "💬 預設評論: {{ .ClientComment }}\n\n請輸入您的評論。", - "inbound_client_data_id": "🔄 入站: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 電子郵件: {{ .ClientEmail }}\n📊 流量: {{ .ClientTraffic }}\n📅 到期日: {{ .ClientExp }}\n🌐 IP 限制: {{ .IpLimit }}\n💬 備註: {{ .ClientComment }}\n\n你現在可以將客戶加入入站了!", - "inbound_client_data_pass": "🔄 入站: {{ .InboundRemark }}\n\n🔑 密碼: {{ .ClientPass }}\n📧 電子郵件: {{ .ClientEmail }}\n📊 流量: {{ .ClientTraffic }}\n📅 到期日: {{ .ClientExp }}\n🌐 IP 限制: {{ .IpLimit }}\n💬 備註: {{ .ClientComment }}\n\n你現在可以將客戶加入入站了!", - "cancel": "❌ 程序已取消!\n\n您可以隨時使用 /start 重新開始。 🔄", - "error_add_client": "⚠️ 錯誤:\n\n {{ .error }}", - "using_default_value": "好的,我會使用預設值。 😊", - "incorrect_input": "您的輸入無效。\n短語應連續輸入,不能有空格。\n正確示例: aaaaaa\n錯誤示例: aaa aaa 🚫", - "AreYouSure": "你確定嗎?🤔", - "SuccessResetTraffic": "📧 電子郵件: {{ .ClientEmail }}\n🏁 結果: ✅ 成功", - "FailedResetTraffic": "📧 電子郵件: {{ .ClientEmail }}\n🏁 結果: ❌ 失敗 \n\n🛠️ 錯誤: [ {{ .ErrorMessage }} ]", - "FinishProcess": "🔚 所有客戶的流量重置已完成。" - }, - "buttons": { - "closeKeyboard": "❌ 關閉鍵盤", - "cancel": "❌ 取消", - "cancelReset": "❌ 取消重置", - "cancelIpLimit": "❌ 取消 IP 限制", - "confirmResetTraffic": "✅ 確認重置流量?", - "confirmClearIps": "✅ 確認清除 IP?", - "confirmRemoveTGUser": "✅ 確認移除 Telegram 使用者?", - "confirmToggle": "✅ 確認啟用/禁用使用者?", - "dbBackup": "獲取資料庫備份", - "serverUsage": "伺服器使用情況", - "getInbounds": "獲取入站資訊", - "depleteSoon": "即將耗盡", - "clientUsage": "獲取使用情況", - "onlines": "線上客戶端", - "commands": "命令", - "refresh": "🔄 重新整理", - "clearIPs": "❌ 清除 IP", - "removeTGUser": "❌ 移除 Telegram 使用者", - "selectTGUser": "👤 選擇 Telegram 使用者", - "selectOneTGUser": "👤 選擇一個 Telegram 使用者:", - "resetTraffic": "📈 重置流量", - "resetExpire": "📅 更改到期日期", - "ipLog": "🔢 IP 日誌", - "ipLimit": "🔢 IP 限制", - "setTGUser": "👤 設定 Telegram 使用者", - "toggle": "🔘 啟用/禁用", - "custom": "🔢 風俗", - "confirmNumber": "✅ 確認: {{ .Num }}", - "confirmNumberAdd": "✅ 確認新增:{{ .Num }}", - "limitTraffic": "🚧 流量限制", - "getBanLogs": "禁止日誌", - "allClients": "所有客戶", - "addClient": "新增客戶", - "submitDisable": "以停用方式送出 ☑️", - "submitEnable": "以啟用方式送出 ✅", - "use_default": "🏷️ 使用預設值", - "change_id": "⚙️🔑 ID", - "change_password": "⚙️🔑 密碼", - "change_email": "⚙️📧 電子郵件", - "change_comment": "⚙️💬 評論", - "ResetAllTraffics": "重設所有流量", - "SortedTrafficUsageReport": "排序過的流量使用報告" - }, "answers": { - "successfulOperation": "✅ 成功!", - "errorOperation": "❗ 操作錯誤。", - "getInboundsFailed": "❌ 獲取入站資訊失敗。", - "getClientsFailed": "❌ 獲取客戶失敗。", - "canceled": "❌ {{ .Email }}:操作已取消。", - "clientRefreshSuccess": "✅ {{ .Email }}:客戶端重新整理成功。", "IpRefreshSuccess": "✅ {{ .Email }}:IP 重新整理成功。", "TGIdRefreshSuccess": "✅ {{ .Email }}:客戶端的 Telegram 使用者重新整理成功。", - "resetTrafficSuccess": "✅ {{ .Email }}:流量已重置成功。", - "setTrafficLimitSuccess": "✅ {{ .Email }}: 流量限制儲存成功。", - "expireResetSuccess": "✅ {{ .Email }}:過期天數已重置成功。", - "resetIpSuccess": "✅ {{ .Email }}:成功儲存 IP 限制數量為 {{ .Count }}。", + "askToAddUserId": "未找到您的配置!\r\n請向管理員詢問,在您的配置中使用您的 Telegram 使用者 ChatID。\r\n\r\n您的使用者 ChatID:\u003ccode\u003e{{ .TgUserID }}\u003c/code\u003e", + "canceled": "❌ {{ .Email }}:操作已取消。", + "chooseClient": "為入站 {{ .Inbound }} 選擇一個客戶", + "chooseInbound": "選擇一個入站", "clearIpSuccess": "✅ {{ .Email }}:IP 已成功清除。", + "clientRefreshSuccess": "✅ {{ .Email }}:客戶端重新整理成功。", + "disableSuccess": "✅ {{ .Email }}:已成功禁用。", + "enableSuccess": "✅ {{ .Email }}:已成功啟用。", + "errorOperation": "❗ 操作錯誤。", + "expireResetSuccess": "✅ {{ .Email }}:過期天數已重置成功。", + "getClientsFailed": "❌ 獲取客戶失敗。", + "getInboundsFailed": "❌ 獲取入站資訊失敗。", "getIpLog": "✅ {{ .Email }}:獲取 IP 日誌。", "getUserInfo": "✅ {{ .Email }}:獲取 Telegram 使用者資訊。", "removedTGUserSuccess": "✅ {{ .Email }}:Telegram 使用者已成功移除。", - "enableSuccess": "✅ {{ .Email }}:已成功啟用。", - "disableSuccess": "✅ {{ .Email }}:已成功禁用。", - "askToAddUserId": "未找到您的配置!\r\n請向管理員詢問,在您的配置中使用您的 Telegram 使用者 ChatID。\r\n\r\n您的使用者 ChatID:{{ .TgUserID }}", - "chooseClient": "為入站 {{ .Inbound }} 選擇一個客戶", - "chooseInbound": "選擇一個入站" - } - } -} + "resetIpSuccess": "✅ {{ .Email }}:成功儲存 IP 限制數量為 {{ .Count }}。", + "resetTrafficSuccess": "✅ {{ .Email }}:流量已重置成功。", + "setTrafficLimitSuccess": "✅ {{ .Email }}: 流量限制儲存成功。", + "successfulOperation": "✅ 成功!" + }, + "buttons": { + "ResetAllTraffics": "重設所有流量", + "SortedTrafficUsageReport": "排序過的流量使用報告", + "addClient": "新增客戶", + "allClients": "所有客戶", + "cancel": "❌ 取消", + "cancelIpLimit": "❌ 取消 IP 限制", + "cancelReset": "❌ 取消重置", + "change_comment": "⚙️💬 評論", + "change_email": "⚙️📧 電子郵件", + "change_flow": "🌊 Flow", + "change_id": "⚙️🔑 ID", + "change_password": "⚙️🔑 密碼", + "change_subid": "📝 Sub ID", + "clearIPs": "❌ 清除 IP", + "clientUsage": "獲取使用情況", + "closeKeyboard": "❌ 關閉鍵盤", + "commands": "命令", + "confirmClearIps": "✅ 確認清除 IP?", + "confirmNumber": "✅ 確認: {{ .Num }}", + "confirmNumberAdd": "✅ 確認新增:{{ .Num }}", + "confirmRemoveTGUser": "✅ 確認移除 Telegram 使用者?", + "confirmResetTraffic": "✅ 確認重置流量?", + "confirmToggle": "✅ 確認啟用/禁用使用者?", + "custom": "🔢 風俗", + "dbBackup": "獲取資料庫備份", + "depleteSoon": "即將耗盡", + "flow_none": "None", + "getBanLogs": "禁止日誌", + "getInbounds": "獲取入站資訊", + "ipLimit": "🔢 IP 限制", + "ipLog": "🔢 IP 日誌", + "limitTraffic": "🚧 流量限制", + "onlines": "線上客戶端", + "refresh": "🔄 重新整理", + "removeTGUser": "❌ 移除 Telegram 使用者", + "resetExpire": "📅 更改到期日期", + "resetTraffic": "📈 重置流量", + "selectOneTGUser": "👤 選擇一個 Telegram 使用者:", + "selectTGUser": "👤 選擇 Telegram 使用者", + "serverUsage": "伺服器使用情況", + "setTGUser": "👤 設定 Telegram 使用者", + "submitDisable": "以停用方式送出 ☑️", + "submitEnable": "以啟用方式送出 ✅", + "toggle": "🔘 啟用/禁用", + "use_default": "🏷️ 使用預設值" + }, + "clients": "客戶端", + "commands": { + "getID": "🆔 您的 ID 為:\u003ccode\u003e{{ .ID }}\u003c/code\u003e", + "help": "🤖 歡迎使用本機器人!它旨在為您提供來自伺服器的特定資料,並允許您進行必要的修改。\r\n\r\n", + "helpAdminCommands": "要重新啟動 Xray Core:\r\n\u003ccode\u003e/restart\u003c/code\u003e\r\n\r\n要搜尋客戶電子郵件:\r\n\u003ccode\u003e/usage [電子郵件]\u003c/code\u003e\r\n\r\n要搜尋入站(帶有客戶統計資料):\r\n\u003ccode\u003e/inbound [備註]\u003c/code\u003e\r\n\r\nTelegram聊天ID:\r\n\u003ccode\u003e/id\u003c/code\u003e", + "helpClientCommands": "要搜尋統計資料,請使用以下命令:\r\n\u003ccode\u003e/usage [電子郵件]\u003c/code\u003e\r\n\r\nTelegram聊天ID:\r\n\u003ccode\u003e/id\u003c/code\u003e", + "helpDesc": "機器人幫助", + "idDesc": "顯示您的 Telegram ID", + "pleaseChoose": "👇 請選擇:\r\n", + "restartFailed": "❗ 操作錯誤。\r\n\r\n\u003ccode\u003e錯誤: {{ .Error }}\u003c/code\u003e.", + "restartSuccess": "✅ 操作成功!", + "restartUsage": "\r\n\r\n\u003ccode\u003e/restart\u003c/code\u003e", + "start": "👋 你好,\u003ci\u003e{{ .Firstname }}\u003c/i\u003e。\r\n", + "startDesc": "顯示主選單", + "status": "✅ 機器人正常執行!", + "statusDesc": "檢查機器人狀態", + "unknown": "❗ 未知命令", + "usage": "❗ 請輸入要搜尋的文字!", + "welcome": "🤖 歡迎來到 \u003cb\u003e{{ .Hostname }}\u003c/b\u003e 管理機器人。\r\n", + "xrayNotRunning": "❗ Xray Core 未運行。" + }, + "day": "天", + "days": "天", + "hours": "小時", + "inbounds": "入站", + "keyboardClosed": "❌ 自定義鍵盤已關閉!", + "messages": { + "2faFailed": "2FA 失敗", + "AreYouSure": "你確定嗎?🤔", + "FailedResetTraffic": "📧 電子郵件: {{ .ClientEmail }}\n🏁 結果: ❌ 失敗 \n\n🛠️ 錯誤: [ {{ .ErrorMessage }} ]", + "FinishProcess": "🔚 所有客戶的流量重置已完成。", + "SuccessResetTraffic": "📧 電子郵件: {{ .ClientEmail }}\n🏁 結果: ✅ 成功", + "TGUser": "👤 電報使用者:{{ .TelegramID }}\r\n", + "active": "💡 啟用:{{ .Enable }}\r\n", + "backupTime": "🗄 備份時間:{{ .Time }}\r\n", + "cancel": "❌ 程序已取消!\n\n您可以隨時使用 /start 重新開始。 🔄", + "client_flow": "Flow:", + "client_subid": "Sub ID:", + "comment_prompt": "💬 預設評論: {{ .ClientComment }}\n\n請輸入您的評論。", + "cpuThreshold": "🔴 CPU 使用率為 {{ .Percent }}%,超過閾值 {{ .Threshold }}%", + "datetime": "⏰ 日期時間:{{ .DateTime }}\r\n", + "depleteSoon": "🔜 即將耗盡:{{ .Deplete }}\r\n\r\n", + "disabled": "🛑 禁用:{{ .Disabled }}\r\n", + "download": "🔽 下載↓:{{ .Download }}\r\n", + "email": "📧 郵箱:{{ .Email }}\r\n", + "email_prompt": "📧 預設電子郵件: {{ .ClientEmail }}\n\n請輸入您的電子郵件。", + "enabled": "🚨 已啟用:{{ .Enable }}\r\n", + "error_add_client": "⚠️ 錯誤:\n\n {{ .error }}", + "exhaustedCount": "🚨 耗盡的 {{ .Type }} 數量:\r\n", + "exhaustedMsg": "🚨 耗盡的 {{ .Type }}:\r\n", + "expire": "📅 過期日期:{{ .Time }}\r\n", + "expireIn": "📅 剩餘時間:{{ .Time }}\r\n", + "hostname": "💻 主機名:{{ .Hostname }}\r\n", + "id_prompt": "🔑 預設 ID: {{ .ClientId }}\n\n請輸入您的 ID。", + "inbound": "📍 入站:{{ .Remark }}\r\n", + "inbound_client_data_id": "🔄 入站: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 電子郵件: {{ .ClientEmail }}\n📊 流量: {{ .ClientTraffic }}\n📅 到期日: {{ .ClientExp }}\n🌐 IP 限制: {{ .IpLimit }}\n💬 備註: {{ .ClientComment }}\n\n你現在可以將客戶加入入站了!", + "inbound_client_data_pass": "🔄 入站: {{ .InboundRemark }}\n\n🔑 密碼: {{ .ClientPass }}\n📧 電子郵件: {{ .ClientEmail }}\n📊 流量: {{ .ClientTraffic }}\n📅 到期日: {{ .ClientExp }}\n🌐 IP 限制: {{ .IpLimit }}\n💬 備註: {{ .ClientComment }}\n\n你現在可以將客戶加入入站了!", + "incorrect_input": "您的輸入無效。\n短語應連續輸入,不能有空格。\n正確示例: aaaaaa\n錯誤示例: aaa aaa 🚫", + "invalid_subid": "Invalid format.\nSub ID can only contain letters, numbers, hyphens (-), and underscores (_).\nSpaces and special characters are not allowed. 🚫", + "ip": "🌐 IP:{{ .IP }}\r\n", + "ips": "🔢 IP 地址:\r\n{{ .IPs }}\r\n", + "ipv4": "🌐 IPv4:{{ .IPv4 }}\r\n", + "ipv6": "🌐 IPv6:{{ .IPv6 }}\r\n", + "lastOnline": "🔙 上次上線: {{ .Time }}\r\n", + "loginFailed": "❗️ 面板登入失敗。\r\n", + "loginSuccess": "✅ 成功登入到面板。\r\n", + "no": "❌ 沒有", + "online": "🌐 連線狀態:{{ .Status }}\r\n", + "onlinesCount": "🌐 線上客戶:{{ .Count }}\r\n", + "pass_prompt": "🔑 預設密碼: {{ .ClientPassword }}\n\n請輸入您的密碼。", + "port": "🔌 埠:{{ .Port }}\r\n", + "reason": "❗️ 原因:{{ .Reason }}\r\n", + "received_comment": "💬📥 評論已更新。", + "received_email": "📧📥 電子郵件已更新。", + "received_id": "🔑📥 ID 已更新。", + "received_password": "🔑📥 密碼已更新。", + "received_subid": "Sub ID updated successfully!", + "refreshedOn": "\r\n📋🔄 重新整理時間:{{ .Time }}\r\n\r\n", + "report": "🕰 定時報告:{{ .RunTime }}\r\n", + "selectUserFailed": "❌ 使用者選擇錯誤!", + "serverLoad": "📈 伺服器負載:{{ .Load1 }}, {{ .Load2 }}, {{ .Load3 }}\r\n", + "serverMemory": "📋 伺服器記憶體:{{ .Current }}/{{ .Total }}\r\n", + "serverUpTime": "⏳ 伺服器執行時間:{{ .UpTime }} {{ .Unit }}\r\n", + "subid_prompt": "Please enter new Sub ID:\nCurrent: {{.ClientSubId}}", + "tcpCount": "🔹 TCP 連線數:{{ .Count }}\r\n", + "time": "⏰ 時間:{{ .Time }}\r\n", + "total": "📊 總計:{{ .UpDown }} / {{ .Total }}\r\n", + "traffic": "🚦 流量:{{ .Total }} (↑{{ .Upload }},↓{{ .Download }})\r\n", + "udpCount": "🔸 UDP 連線數:{{ .Count }}\r\n", + "upload": "🔼 上傳↑:{{ .Upload }}\r\n", + "userSaved": "✅ 電報使用者已儲存。", + "username": "👤 使用者名稱:{{ .Username }}\r\n", + "using_default_value": "好的,我會使用預設值。 😊", + "version": "🚀 X-UI 版本:{{ .Version }}\r\n", + "xrayStatus": "ℹ️ Xray 狀態:{{ .State }}\r\n", + "xrayVersion": "📡 Xray 版本: {{ .XrayVersion }}\r\n", + "yes": "✅ 是的" + }, + "minutes": "分鐘", + "month": "月", + "months": "月", + "noInbounds": "❗ 未找到入站!", + "noIpRecord": "❗ 沒有IP記錄!", + "noQuery": "❌ 未找到查詢!請再次使用該命令!", + "noResult": "❗ 沒有結果!", + "offline": "🔴 離線", + "online": "🟢 在線", + "unknown": "未知", + "unlimited": "♾ 無限(重置)", + "wentWrong": "❌ 出了點問題!" + }, + "transmission": "傳輸", + "twoFactorCode": "代碼", + "unlimited": "無限制", + "update": "更新", + "usage": "使用情況", + "useIPv4ForHost": "使用 IPv4 連接主機", + "username": "使用者名稱" +} \ No newline at end of file