feat(telegram): full i18n — ~230 Russian strings replaced with t() calls

- Added ~120 new i18n keys to both en and ru sections
- Replaced all remaining hardcoded Russian strings in telegram.uc
- Menu, status, connections, diagnostics, help, subscriptions, quiet hours,
  test rule, export, MAC blocking, devices, watchdog/AI, QoS, section
  management, DNS presets, exec, daily digest, update notifications,
  blocked activity, all navigation buttons
- All keys verified present via runtime check
This commit is contained in:
Dushnilin
2026-08-25 15:45:44 +03:00
parent 2c21dd93c7
commit 1aa69d5e03
2 changed files with 540 additions and 182 deletions
+358
View File
@@ -349,6 +349,185 @@ let strings = {
// ─── Healer ─── // ─── Healer ───
heal_running: "AI Doctor running diagnostics and self-healing...", heal_running: "AI Doctor running diagnostics and self-healing...",
// ─── Batch i18n additions ───
msg_truncated: "... (message truncated)",
menu_version: "Version",
menu_cpu: "Router CPU",
list_header: "⚙️ <b>List:</b>",
outbound_groups_not_found: "Proxy groups not found.",
outbound_switch_failed: "Failed to switch server",
outbound_group: "Group",
outbound_server: "Server",
outbound_check_hint: "Check if sing-box is running and Clash API is accessible.",
section_ips: "IP addresses",
section_list_header: "⚙️ <b>Section:</b>",
backup_archive_empty: "Archive is empty or corrupted.",
backup_archive_unsafe: "Unsafe archive:",
backup_restoring: "Checking and restoring backup...",
backup_extract_failed: "Failed to extract archive.",
backup_not_valid_uci: "config/tachyon in archive is not a valid UCI.",
backup_no_config: "Archive contains neither config/tachyon nor tachyon/ directory.",
backup_save_config_failed: "Failed to save current config.",
backup_save_data_failed: "Failed to save current /etc/tachyon data.",
backup_write_config_error: "Write error /etc/config/tachyon.",
backup_uci_validation_failed: "Restored config failed UCI validation. Rolled back.",
backup_write_data_error: "Write error /etc/tachyon. Rolled back.",
backup_restored: "Backup restored. Restarting Tachyon...",
backup_done: "Done!",
backup_collecting: "Collecting backup...",
backup_create_error: "Backup creation error.",
support_bundle_collecting: "Generating Support Bundle...",
support_bundle_error: "Bundle generation error.",
conn_closed_msg: "All active connections closed.\nThey will be re-established along new routes.",
conn_close_error: "Connection reset error.\nsing-box Clash API is unavailable.",
updates_title: "Component Updates",
updates_disabled: "Update check is disabled in settings.",
updates_cache_empty: "Cache is empty. Check later.",
update_check_error: "Check error",
update_new_release_build: "new release build",
update_dev_build: "dev build",
update_all_current: "All components up to date.",
update_cache_parse_error: "Cache parse error:",
update_cache_unavailable: "Check cache empty or unavailable.",
btn_refresh_cache: "Refresh cache",
api_parse_error: "API parsing error:",
api_connect_failed: "Failed to connect to sing-box API.",
logs_header: "Tachyon Logs",
info_title: "System Information",
info_device_label: "Device",
info_fetch_failed: "Failed to get system information.",
sub_empty_url: "(empty)",
btn_sub_delete: " 🗑 Delete",
btn_add_subscription: "Add subscription",
sub_section_subs: "Subscriptions",
sub_found_count: "Subscriptions found:",
sub_enter_url: "Enter subscription URL:\n\n<i>Send /cancel to cancel</i>",
sub_url_empty: "URL cannot be empty.",
sub_added: "Subscription added to section",
sub_not_found: "Subscription not found.",
sub_removed: "Subscription removed from section",
help_title: "Command Help",
help_main_section: "Main:",
help_diag_section: "Diagnostics:",
help_manage_section: "Management:",
help_settings_section: "Settings:",
help_this: "This help",
quiet_hours_title: "Quiet Hours",
quiet_status: "Status",
quiet_enabled_label: "Enabled",
quiet_disabled_label: "Disabled",
quiet_start_label: "Start:",
quiet_end_label: "End:",
quiet_hint: "During quiet hours, the bot only sends critical notifications.",
btn_enable: "Enable",
btn_disable: "Disable",
quiet_hour_start: "start",
quiet_hour_end: "end",
quiet_enter_hour: "⏰ Enter the hour for %s quiet hours (0–23):\n\n<i>Send /cancel to cancel</i>",
test_rule_header: "Rule check:",
test_match: "Match:",
test_action: "Action:",
export_title: "Exporting config...",
export_done: "Config exported.\n\n⚠️ File contains sensitive data. Do not publish it.",
export_failed: "Failed to export config.",
mac_invalid: "Invalid MAC address.",
mac_firewall_open_failed: "Failed to open firewall configuration.",
mac_block_rule_failed: "Failed to create block rule.",
mac_blocked: "blocked.",
mac_unblocked: "unblocked.",
mac_firewall_bg: "Firewall rules are applying in background (a few seconds).",
devices_title: "Network Devices:",
device_hostname_unknown: "Unknown",
devices_not_found: "No devices found.",
watchdog_stop_btn: "Stop Watchdog",
ai_full_status_btn: "Full AI Status",
watchdog_start_btn: "Start Watchdog",
ai_incident: "⚠️ Incident resolved:",
ai_resolution: "🔧 Auto-fix:",
ai_all_ok: "All network services, DNS, nftables and memory are working perfectly.",
ai_diag_ok: "Diagnostics completed successfully.",
ai_diag_done: "Diagnostics completed.",
ai_status_collecting: "Collecting full AI Watchdog status...",
ai_status_error: "Status fetch error.",
ai_data_truncated: "data truncated",
ai_full_status_header: "AI Watchdog — Full Status:",
qos_title: "Gaming & Voice QoS Accelerator",
qos_enabled_detail: "Enabled (DSCP EF + AF41 Priority)",
qos_disabled_detail: "Disabled",
qos_priority_rules: "Priority rules:",
btn_qos_disable: "Disable QoS",
btn_qos_enable: "Enable QoS",
cb_obsolete: "Button obsolete — open the list again.",
update_component_title: "Starting update",
update_bg_hint: "Process started in background. Check later.",
err_unknown_component: "Unknown component:",
admin_invalid_chat_id: "Invalid Chat ID.",
admin_user_added: "User added to admin list.",
admin_user_already: "User is already an admin.",
sec_enter_name: "Enter a Latin name for the new section (e.g. <code>my_vpn</code>):\n\n<i>Send /cancel to cancel</i>",
sec_enter_label: "Enter a new human-readable name (Label) for section",
sec_enter_target: "Enter outbound interface (target) for section",
sec_not_found: "Section not found.",
sec_deleted: "Section deleted.",
sec_add_items_prompt: "Send items to add (one per line or space-separated):\n\n<i>Send /cancel to cancel</i>",
sec_sub_add_prompt: "Enter section name and subscription URL separated by a space:\n<code>/sec_sub_add Main https://...</code>\n\n<i>Send /cancel to cancel</i>",
sec_enter_value: "Enter new value for",
sec_add_list_prompt: "Send items to add to the list (space or newline separated):\n\n<i>Send /cancel to cancel</i>",
dns_all_protocols: "All protocols",
dns_servers_applied: "DNS servers set:",
dns_restart_hint: "Restart to apply.",
dns_bootstrap_applied: "Bootstrap DNS servers set:",
exec_cmd_error: "Command execution error:",
exec_access_denied: "Access denied. Your Chat ID:",
backup_downloading: "Downloading backup...",
backup_download_error: "File download error.",
backup_url_error: "File URL error.",
backup_format_hint: "Please send the backup in .tar.gz format.",
admin_forward_prompt: "Forwarded a message from user",
btn_admin_add: "Add",
exec_whitelist_msg: "Executing from whitelist:",
exec_no_output: "No output",
action_cancelled: "Action cancelled.",
err_text_expected: "A text message is expected. Try again or /cancel.",
value_saved: "Value saved.",
items_added: "items added.",
section_created: "Section created!",
err_invalid_section_name: "Invalid name. Only letters, numbers, and underscores allowed.",
label_changed: "Name changed.",
target_changed: "Target changed.",
items_added_count: "Added",
nothing_added: "Nothing added.",
err_format_section_url: "Format: <code>section URL</code>\nExample: <code>Main https://...</code>",
err_invalid_hour: "Enter an integer from 0 to 23.",
saved: "Saved.",
daily_unknown: "unknown",
daily_uptime: "OS Uptime:",
daily_rx: "Current RX:",
daily_tx: "Current TX:",
build_label: "Build:",
blocked_activity: "Blocked Activity",
blocked_rule_label: "Rule:",
blocked_rule: "Rule:",
blocked_attempts: "Attempts to access blocked sites",
info_read_error: "Error reading info:",
quiet_start_word: "start",
quiet_end_word: "end",
quiet_saved: "Settings saved.",
sec_created: "Section created!",
sec_invalid_name: "Invalid name. Only Latin letters, digits, underscores.",
sec_invalid_hour: "Invalid hour.",
sec_changed_to: "changed to",
exec_value_saved: "Value saved. Restart needed for changes.",
exec_items_added: "Added",
exec_items_added_count: "Added",
exec_nothing_added: "Nothing added.",
exec_changed_to: "changed to",
exec_format_hint: "Format: domain.com or [ip]/prefix.",
update_new_release_header: "New build of current release!",
update_build_label: "Build",
critical_keyword_fallen: "Down",
critical_keyword_error: "Error",
btn_update_component: "Update",
}, },
ru: { ru: {
@@ -700,6 +879,185 @@ let strings = {
// ─── Healer ─── // ─── Healer ───
heal_running: "ИИ-Автомеханик выполняет диагностику и самолечение...", heal_running: "ИИ-Автомеханик выполняет диагностику и самолечение...",
// ─── Batch i18n additions ───
msg_truncated: "... (сообщение сокращено)",
menu_version: "Версия",
menu_cpu: "Роутер CPU",
list_header: "⚙️ <b>Список:</b>",
outbound_groups_not_found: "Группы прокси не найдены.",
outbound_switch_failed: "Не удалось переключить сервер",
outbound_group: "Группа",
outbound_server: "Сервер",
outbound_check_hint: "Проверьте, запущен ли sing-box и доступен ли Clash API.",
section_ips: "IP адреса",
section_list_header: "⚙️ <b>Секция:</b>",
backup_archive_empty: "Архив пуст или повреждён.",
backup_archive_unsafe: "Небезопасный архив:",
backup_restoring: "Проверяю и восстанавливаю бэкап...",
backup_extract_failed: "Не удалось распаковать архив.",
backup_not_valid_uci: "config/tachyon в архиве не похож на валидный UCI.",
backup_no_config: "В архиве нет ни config/tachyon, ни каталога tachyon/.",
backup_save_config_failed: "Не удалось сохранить текущий конфиг.",
backup_save_data_failed: "Не удалось сохранить текущие данные /etc/tachyon.",
backup_write_config_error: "Ошибка записи /etc/config/tachyon.",
backup_uci_validation_failed: "Восстановленный конфиг не прошёл проверку UCI. Выполнен откат.",
backup_write_data_error: "Ошибка записи /etc/tachyon. Выполнен откат.",
backup_restored: "Бэкап восстановлен. Перезапускаю Tachyon...",
backup_done: "Готово!",
backup_collecting: "Собираю бэкап...",
backup_create_error: "Ошибка создания бэкапа.",
support_bundle_collecting: "Формирую Support Bundle...",
support_bundle_error: "Ошибка генерации Bundle.",
conn_closed_msg: "Все активные соединения сброшены.\nОни будут переустановлены по новым маршрутам.",
conn_close_error: "Ошибка сброса соединений.\nsing-box Clash API недоступен.",
updates_title: "Обновления компонентов",
updates_disabled: "Проверка обновлений отключена в настройках.",
updates_cache_empty: "Кэш пуст. Зайдите позже.",
update_check_error: "Ошибка проверки",
update_new_release_build: "новая сборка релиза",
update_dev_build: "dev-сборка",
update_all_current: "Все компоненты актуальны.",
update_cache_parse_error: "Ошибка парсинга кэша:",
update_cache_unavailable: "Кэш проверок пуст или недоступен.",
btn_refresh_cache: "Обновить кэш",
api_parse_error: "Ошибка парсинга API:",
api_connect_failed: "Не удалось подключиться к API sing-box.",
logs_header: "Логи Tachyon",
info_title: "Информация о системе",
info_device_label: "Устройство",
info_fetch_failed: "Не удалось получить информацию о системе.",
sub_empty_url: "(пусто)",
btn_sub_delete: " 🗑 Удалить",
btn_add_subscription: "Добавить подписку",
sub_section_subs: "Подписки секции",
sub_found_count: "Найдено подписок:",
sub_enter_url: "Введите URL подписки:\n\n<i>Отправьте /cancel для отмены</i>",
sub_url_empty: "URL не может быть пустым.",
sub_added: "Подписка добавлена в секцию",
sub_not_found: "Подписка не найдена.",
sub_removed: "Подписка удалена из секции",
help_title: "Справка по командам",
help_main_section: "Основные:",
help_diag_section: "Диагностика:",
help_manage_section: "Управление:",
help_settings_section: "Настройка:",
help_this: "Эта справка",
quiet_hours_title: "Тихие часы",
quiet_status: "Статус",
quiet_enabled_label: "Включены",
quiet_disabled_label: "Выключены",
quiet_start_label: "Начало:",
quiet_end_label: "Конец:",
quiet_hint: "В тихие часы бот отправляет только критические уведомления.",
btn_enable: "Включить",
btn_disable: "Выключить",
quiet_hour_start: "начала",
quiet_hour_end: "окончания",
quiet_enter_hour: "⏰ Введите час %s тихих часов (0–23):\n\n<i>Отправьте /cancel для отмены</i>",
test_rule_header: "Проверка правила:",
test_match: "Совпадение:",
test_action: "Действие:",
export_title: "Экспорт конфига...",
export_done: "Конфиг экспортирован.\n\n⚠️ Файл содержит чувствительные данные. Не публикуйте его.",
export_failed: "Не удалось экспортировать конфиг.",
mac_invalid: "Некорректный MAC-адрес.",
mac_firewall_open_failed: "Не удалось открыть конфигурацию firewall.",
mac_block_rule_failed: "Не удалось создать правило блокировки.",
mac_blocked: "заблокировано.",
mac_unblocked: "разблокировано.",
mac_firewall_bg: "Правила firewall применяются в фоне (несколько секунд).",
devices_title: "Устройства в сети:",
device_hostname_unknown: "Неизвестно",
devices_not_found: "Устройства не найдены.",
watchdog_stop_btn: "Остановить Watchdog",
ai_full_status_btn: "Полный статус AI",
watchdog_start_btn: "Запустить Watchdog",
ai_incident: "⚠️ Устранён инцидент:",
ai_resolution: "🔧 Авто-решение:",
ai_all_ok: "Все сетевые службы, DNS, nftables и память работают идеально.",
ai_diag_ok: "Диагностика завершена успешно.",
ai_diag_done: "Диагностика завершена.",
ai_status_collecting: "Сбор полного AI Watchdog статуса...",
ai_status_error: "Ошибка получения статуса.",
ai_data_truncated: "данные сокращены",
ai_full_status_header: "AI Watchdog — Полный статус:",
qos_title: "Игровой & Голосовой QoS Ускоритель",
qos_enabled_detail: "Включен (DSCP EF + AF41 Priority)",
qos_disabled_detail: "Выключен",
qos_priority_rules: "Приоритетные правила:",
btn_qos_disable: "Отключить QoS",
btn_qos_enable: "Включить QoS",
cb_obsolete: "Кнопка устарела — откройте список заново.",
update_component_title: "Запуск обновления",
update_bg_hint: "Процесс запущен в фоне. Зайдите позже.",
err_unknown_component: "Неизвестный компонент:",
admin_invalid_chat_id: "Неверный Chat ID.",
admin_user_added: "Пользователь добавлен в список администраторов.",
admin_user_already: "Пользователь уже является администратором.",
sec_enter_name: "Введите латинское имя для новой секции (например, <code>my_vpn</code>):\n\n<i>Отправьте /cancel для отмены</i>",
sec_enter_label: "Введите новое понятное имя (Label) для секции",
sec_enter_target: "Введите имя исходящего интерфейса (target) для секции",
sec_not_found: "Секция не найдена.",
sec_deleted: "Секция удалена.",
sec_add_items_prompt: "Отправьте элементы для добавления (по одному в строке или через пробел):\n\n<i>Отправьте /cancel для отмены</i>",
sec_sub_add_prompt: "Введите имя секции и URL подписки через пробел:\n<code>/sec_sub_add Main https://...</code>\n\n<i>Отправьте /cancel для отмены</i>",
sec_enter_value: "Введите новое значение для",
sec_add_list_prompt: "Отправьте элементы для добавления в список (через пробел или с новой строки):\n\n<i>Отправьте /cancel для отмены</i>",
dns_all_protocols: "Все протоколы",
dns_servers_applied: "DNS серверы установлены:",
dns_restart_hint: "Выполните перезапуск для применения.",
dns_bootstrap_applied: "Bootstrap DNS серверы установлены:",
exec_cmd_error: "Ошибка выполнения команды:",
exec_access_denied: "Доступ запрещен. Ваш Chat ID:",
backup_downloading: "Скачиваю бэкап...",
backup_download_error: "Ошибка загрузки файла.",
backup_url_error: "Ошибка получения URL файла.",
backup_format_hint: "Пожалуйста, отправьте бэкап в формате `.tar.gz`.",
admin_forward_prompt: "Вы переслали сообщение от пользователя",
btn_admin_add: "Добавить",
exec_whitelist_msg: "Выполняю из разрешённого набора (whitelist):",
exec_no_output: "Нет вывода",
action_cancelled: "Действие отменено.",
err_text_expected: "Ожидается текстовое сообщение. Попробуйте ещё раз или /cancel.",
value_saved: "Значение сохранено.",
items_added: "элементов.",
section_created: "Секция создана!",
err_invalid_section_name: "Неверное имя. Разрешены только буквы, цифры и подчеркивания.",
label_changed: "Имя изменено.",
target_changed: "Цель изменена.",
items_added_count: "Добавлено",
nothing_added: "Ничего не добавлено.",
err_format_section_url: "Формат: <code>секция URL</code>\nНапример: <code>Main https://...</code>",
err_invalid_hour: "Введите целое число от 0 до 23.",
saved: "Сохранено.",
daily_unknown: "неизвестно",
daily_uptime: "Аптайм ОС:",
daily_rx: "Текущий RX:",
daily_tx: "Текущий TX:",
build_label: "Сборка:",
blocked_activity: "Заблокированная активность",
blocked_rule_label: "Правило:",
blocked_rule: "Правило:",
blocked_attempts: "Попыток доступа к заблокированным сайтам",
info_read_error: "Ошибка чтения информации:",
quiet_start_word: "начала",
quiet_end_word: "окончания",
quiet_saved: "Настройки сохранены.",
sec_created: "Секция создана!",
sec_invalid_name: "Некорректное имя. Только латиница, цифры и _.",
sec_invalid_hour: "Некорректное время.",
sec_changed_to: "изменено на",
exec_value_saved: "Значение сохранено. Для вступления изменений в силу необходим перезапуск.",
exec_items_added: "Добавлено",
exec_items_added_count: "Добавлено",
exec_nothing_added: "Ничего не добавлено.",
exec_changed_to: "изменено на",
exec_format_hint: "Формат: domain.com или [ip]/prefix.",
update_new_release_header: "Новая сборка текущего релиза!",
update_build_label: "Сборка",
critical_keyword_fallen: "Упал",
critical_keyword_error: "Ошибка",
btn_update_component: "Обновить",
} }
}; };
File diff suppressed because it is too large Load Diff