From bdad92fe01357df50824ae10f7fa24baf1193537 Mon Sep 17 00:00:00 2001 From: Alexander Chepurnoy Date: Sat, 31 Aug 2024 18:29:01 +0700 Subject: [PATCH] feat: add ru locale (#280) * feat: add ru locale * feat: add russian lang to readme --- README.md | 1 + frontend/src/locales/index.ts | 5 +- frontend/src/locales/ru.ts | 411 ++++++++++++++++++++++++++++++++ frontend/src/plugins/vuetify.ts | 4 +- 4 files changed, 418 insertions(+), 3 deletions(-) create mode 100644 frontend/src/locales/ru.ts diff --git a/README.md b/README.md index b7bc951..baf4da2 100644 --- a/README.md +++ b/README.md @@ -161,6 +161,7 @@ To run backend (from root folder of repository): - Vietnamese - Chinese (Simplified) - Chinese (Traditional) +- Russian ## Features diff --git a/frontend/src/locales/index.ts b/frontend/src/locales/index.ts index d7adcffe..7049e4d 100644 --- a/frontend/src/locales/index.ts +++ b/frontend/src/locales/index.ts @@ -4,6 +4,7 @@ import fa from './fa' import vi from './vi' import zhcn from './zhcn' import zhtw from './zhtw' +import ru from './ru' export const i18n = createI18n({ legacy: false, @@ -14,7 +15,8 @@ export const i18n = createI18n({ fa: fa, vi: vi, zhHans: zhcn, - zhHant: zhtw + zhHant: zhtw, + ru: ru }, }) @@ -24,4 +26,5 @@ export const languages = [ { title: 'Tiếng Việt', value: 'vi' }, { title: '简体中文', value: 'zhHans' }, { title: '繁體中文', value: 'zhHant' }, + { title: 'Русский', value: 'ru' }, ] diff --git a/frontend/src/locales/ru.ts b/frontend/src/locales/ru.ts new file mode 100644 index 0000000..a79430f --- /dev/null +++ b/frontend/src/locales/ru.ts @@ -0,0 +1,411 @@ +export default { + message: "Добро пожаловать", + success: "успех", + failed: "ошибка", + enable: "Включить", + disable: "Отключить", + none: "Никакие", + all: "Все", + filter: "Фильтр", + loading: "Загрузка...", + confirm: "Вы уверены?", + yes: "да", + no: "нет", + unlimited: "бесконечный", + remained: "Осталось", + type: "Тип", + protocol: "Протокол", + submit: "Отправить", + reset: "Сбросить", + now: "Сейчас", + network: "Сеть", + copyToClipboard: "Копировать в буфер обмена", + noData: "Нет данных!", + invalidLogin: "Неверный логин!", + online: "В сети", + version: "Версия", + email: "Электронная почта", + commaSeparated: "(разделено запятыми)", + count: "Количество", + template: "Шаблон", + error: { + dplData: "Дублирующие данные", + core: "Ошибка Sing-Box", + }, + pages: { + login: "Вход", + home: "Главная", + inbounds: "Входящие", + outbounds: "Исходящие", + clients: "Клиенты", + rules: "Правила", + tls: "Настройки TLS", + basics: "Основы", + admins: "Администраторы", + settings: "Настройки", + }, + main: { + tiles: "Плитки", + gauges: "Датчики", + charts: "Графики", + infos: "Информация", + gauge: { + cpu: "Загрузка ЦП", + mem: "Загрузка ОЗУ", + }, + chart: { + cpu: "Мониторинг ЦП", + mem: "Мониторинг ОЗУ", + net: "Сетевой трафик", + pnet: "Сетевые пакеты", + }, + info: { + sys: "Информация о системе", + sbd: "Информация о Sing-Box", + host: "Хост", + cpu: "ЦП", + core: "Ядро", + uptime: "Время работы", + threads: "Потоки", + memory: "Память", + running: "Работает" + } + }, + objects: { + inbound: "Входящий", + client: "Клиент", + outbound: "Исходящий", + rule: "Правило", + user: "Пользователь", + tag: "Тег", + listen: "Прослушивание", + dial: "Звонок", + tls: "TLS", + multiplex: "Мультиплекс", + transport: "Транспорт", + method: "Метод", + headers: "Заголовки", + key: "Ключ", + value: "Значение", + }, + actions: { + action: "Действие", + add: "Добавить", + new: "Новый", + edit: "Редактировать", + del: "Удалить", + clone: "Клонировать", + save: "Сохранить", + update: "Обновить", + submit: "Отправить", + set: "Установить", + generate: "Генерировать", + disable: "Отключить", + close: "Закрыть", + restartApp: "Перезапустить приложение", + }, + login: { + title: "Вход", + username: "Имя пользователя", + unRules: "Имя пользователя не может быть пустым", + password: "Пароль", + pwRules: "Пароль не может быть пустым", + }, + menu: { + logout: "Выйти", + }, + admin: { + changeCred: "Изменить учетные данные", + oldPass: "Текущий пароль", + newUname: "Новое имя пользователя", + newPass: "Новый пароль", + lastLogin: "Последний вход", + date: "Дата", + time: "Время", + changes: "Изменения", + actor: "Исполнитель", + key: "Ключ", + action: "Действие", + }, + setting: { + interface: "Интерфейс", + sub: "Подписка", + addr: "Адрес", + port: "Порт", + webPath: "Базовый URI", + domain: "Домен", + sslKey: "Путь к SSL ключу", + sslCert: "Путь к SSL сертификату", + webUri: "URI панели", + sessionAge: "Максимальная длительность сессии", + trafficAge: "Максимальная длительность трафика", + timeLoc: "Часовой пояс", + subEncode: "Включить кодирование", + subInfo: "Включить информацию о клиенте", + path: "Путь по умолчанию", + update: "Время автоматического обновления", + subUri: "URI подписки", + jsonSub: "JSON подписка", + toDirect: "Маршрутизация на Direct", + toBlock: "Маршрутизация на Block", + timestamp: "Метка времени", + globalDns: "Глобальный DNS", + directDns: "Прямой DNS", + toDirectDns: "Маршрутизация на Direct DNS", + jsonSubOptions: "Другие параметры", + }, + client: { + name: "Имя", + desc: "Описание", + group: "Группа", + inboundTags: "Теги входящих", + basics: "Основы", + config: "Конфигурация", + links: "Ссылки", + external: "Внешняя ссылка", + sub: "Внешняя подписка", + }, + types: { + un: "Имя пользователя", + pw: "Пароль", + direct: { + overrideAddr: "Переопределить адрес", + overridePort: "Переопределить порт", + }, + hy: { + obfs: "Обфусцированный пароль", + auth: "Пароль аутентификации", + hyOptions: "Параметры Hysteria", + hy2Options: "Параметры Hysteria2", + ignoreBw: "Игнорировать пропускную способность клиента", + }, + shdwTls: { + hs: "Сервер рукопожатий", + addHS: "Добавить сервер рукопожатий", + }, + ssh: { + passphrase: "Парольная фраза", + hostKey: "Ключи хоста", + algorithm: "Алгоритмы ключей", + clientVer: "Версия клиента", + options: "Параметры SSH", + }, + tor: { + execPath: "Путь к исполняемому файлу", + dataDir: "Каталог данных", + extArgs: "Дополнительные аргументы", + }, + tuic: { + congControl: "Контроль перегрузок", + authTimeout: "Таймаут аутентификации", + hb: "Сердцебиение", + }, + vless: { + flow: "Поток", + udpEnc: "Кодирование UDP пакетов", + }, + vmess: { + security: "Безопасность", + globalPadding: "Глобальная подкладка", + authLen: "Длина шифрования", + }, + wg: { + privKey: "Приватный ключ", + pubKey: "Публичный ключ пира", + psk: "Предварительно разделенный ключ", + localIp: "Локальные IP", + worker: "Работники", + ifName: "Имя интерфейса", + sysIf: "Системный интерфейс", + gso: "Отключение сегментации", + options: "Параметры Wireguard", + multiPeer: "Множественный пир", + allowedIp: "Разрешенные IP", + peer: "Пир", + peers: "Пиры", + }, + lb: { + defaultOut: "Исходящий по умолчанию", + interruptConn: "Прервать существующие соединения", + testUrl: "Тестовый URL", + interval: "Интервал", + tolerance: "Толерантность", + urlTestOptions: "Параметры теста URL" + } + }, + in: { + addr: "Адрес", + port: "Порт", + clients: "Включить клиентов", + ssMethod: "Метод", + sSide: "Сторона сервера", + cSide: "Сторона клиента", + multiDomain: "Мультидомен", + remark: "Примечание", + mdOption: "Параметры мультидомена", + }, + listen: { + sniffing: "Обнаружение", + sniffingTimeout: "Таймаут обнаружения", + sniffingOverride: "Переопределение назначения", + options: "Параметры прослушивания", + tcpOptions: "Параметры TCP", + udpOptions: "Параметры UDP", + detour: "Обход", + detourText: "Переадресация на входящий", + domainStrategy: "Стратегия домена", + }, + dial: { + bindIf: "Привязка к сетевому интерфейсу", + bindIp4: "Привязка к IPv4", + bindIp6: "Привязка к IPv6", + reuseAddr: "Повторное использование адреса слушателя", + connTimeout: "Таймаут подключения", + fbTimeout: "Таймаут возврата", + options: "Параметры вызова", + detourText: "Переадресация на исходящий", + }, + transport: { + enable: "Включить транспорт", + host: "Хост", + hosts: "Хосты", + path: "Путь", + httpMethod: "Метод запроса", + idleTimeout: "Таймаут бездействия", + pingTimeout: "Таймаут пинга", + grpcServiceName: "Имя службы", + grpcPws: "Разрешить без потока", + }, + mux: { + enable: "Включить мультиплекс", + maxConn: "Максимальное количество соединений", + minStr: "Минимальное количество потоков", + maxStr: "Максимальное количество потоков", + padding: "Только подкладка", + enableBrutal: "Включить Brutal", + }, + out: { + addr: "Адрес сервера", + port: "Порт сервера", + }, + rule: { + add: "Добавить правило", + simple: "Простое", + logical: "Логическое", + mode: "Режим", + invert: "Инвертировать", + ipVer: "Версия IP", + domain: "Домены", + domainSufix: "Суффиксы доменов", + domainKw: "Ключевые слова домена", + domainRgx: "Регулярные выражения домена", + ip: "CIDR IP", + privateIp: "Недействительные диапазоны IP", + port: "Порты", + portRange: "Диапазоны портов", + srcCidr: "CIDR исходного IP", + srcPrivateIp: "Недействительные исходные IP", + srcPort: "Исходные порты", + srcPortRange: "Диапазоны исходных портов", + ruleset: "Наборы правил", + rulesetMatchSrc: "Набор правил для соответствия источника IPcidr", + options: "Параметры правила", + domainRules: "Домен/IP", + srcIpRules: "Источник IP", + srcPortRules: "Источник порта", + }, + ruleset: { + add: "Добавить набор правил", + format: "Формат данных", + interval: "Интервалы обновления", + remote: "Удаленный", + local: "Локальный", + }, + basic: { + log: { + title: "Журналы", + level: "Уровень", + output: "Вывод", + timestamp: "Включить метку времени", + }, + dns: { + final: "Итоговый", + server: "Сервер", + firstServer: "Первый сервер", + addrResolver: "Разрешение адреса", + }, + routing: { + title: "Маршрутизация", + defaultOut: "Исходящий по умолчанию", + defaultIf: "Сетевой интерфейс по умолчанию", + defaultRm: "Маршрут по умолчанию", + autoBind: "Автопривязка сетевого интерфейса", + }, + exp: { + storeFakeIp: "Хранить поддельный IP", + }, + }, + tls: { + enable: "Включить TLS", + usePath: "Использовать путь", + useText: "Использовать текст", + certPath: "Путь к файлу сертификата", + keyPath: "Путь к файлу ключа", + cert: "Сертификат", + key: "Ключ", + options: "Параметры TLS", + minVer: "Минимальная версия", + maxVer: "Максимальная версия", + cs: "Наборы шифров", + privKey: "Приватный ключ", + pubKey: "Публичный ключ", + disableSni: "Отключить SNI", + insecure: "Разрешить небезопасное", + acme: { + options: "Параметры ACME", + dataDir: "Каталог данных", + defaultDomain: "Домен по умолчанию", + disableChallenges: "Отключить вызовы", + httpChallenge: "Отключить HTTP вызов", + tlsChallenge: "Отключить TLS вызов", + altPorts: "Альтернативные порты", + altHport: "Альтернативный HTTP порт", + altTport: "Альтернативный TLS порт", + caProvider: "Поставщик CA", + customCa: "Пользовательский поставщик CA", + extAcc: "Внешний аккаунт", + dns01: "DNS01 вызов", + dns01Provider: "Поставщик DNS01 вызова", + }, + }, + stats: { + upload: "Загрузка", + download: "Скачивание", + volume: "Объем", + usage: "Использование", + enable: "Включить статистику", + graphTitle: "График трафика", + B: "Б", + KB: "КБ", + MB: "МБ", + GB: "ГБ", + TB: "ТБ", + PB: "ПБ", + p: "п", + Kp: "Кп", + Mp: "Мп", + Gb: "Гб", + bps: "б/с", + Kbps: "Кб/с", + Mbps: "Мб/с", + }, + date: { + expiry: "Срок действия", + expired: "Истек", + d: "д", + h: "ч", + m: "м", + s: "с", + ms: "мс", + }, +} diff --git a/frontend/src/plugins/vuetify.ts b/frontend/src/plugins/vuetify.ts index d713b6c..4bebe1d 100644 --- a/frontend/src/plugins/vuetify.ts +++ b/frontend/src/plugins/vuetify.ts @@ -9,7 +9,7 @@ import '@mdi/font/css/materialdesignicons.css' import 'vuetify/styles' import colors from 'vuetify/util/colors' -import { fa, en, vi, zhHans, zhHant } from 'vuetify/locale' +import { fa, en, vi, zhHans, zhHant, ru } from 'vuetify/locale' // Composables import { createVuetify } from 'vuetify' @@ -53,6 +53,6 @@ export default createVuetify({ locale: { locale: localStorage.getItem("locale") ?? 'en', fallback: 'en', - messages: { en, fa, vi, zhHans, zhHant }, + messages: { en, fa, vi, zhHans, zhHant, ru }, }, })