From cd0a9b8e33d1252805be9220609c374d0680509f Mon Sep 17 00:00:00 2001 From: "Maksim M." Date: Thu, 10 Jul 2025 10:53:03 +0300 Subject: [PATCH] Add Russian translation (#2014) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(i18n): add Russian translation * Corrected the AI translation Подправил AI перевод * fix: format ru.json --- src/i18n/i18n.config.ts | 2 + src/i18n/locales/ru.json | 237 +++++++++++++++++++++++++++++++++++++++ src/nuxt.config.ts | 5 + 3 files changed, 244 insertions(+) create mode 100644 src/i18n/locales/ru.json diff --git a/src/i18n/i18n.config.ts b/src/i18n/i18n.config.ts index 57178378..8741036f 100644 --- a/src/i18n/i18n.config.ts +++ b/src/i18n/i18n.config.ts @@ -2,6 +2,7 @@ import en from './locales/en.json'; import uk from './locales/uk.json'; import fr from './locales/fr.json'; import de from './locales/de.json'; +import ru from './locales/ru.json'; import zhhk from './locales/zh-HK.json'; import zhcn from './locales/zh-CN.json'; import ko from './locales/ko.json'; @@ -14,6 +15,7 @@ export default defineI18nConfig(() => ({ uk, fr, de, + ru, 'zh-HK': zhhk, 'zh-CN': zhcn, ko, diff --git a/src/i18n/locales/ru.json b/src/i18n/locales/ru.json new file mode 100644 index 00000000..119e5c5e --- /dev/null +++ b/src/i18n/locales/ru.json @@ -0,0 +1,237 @@ +{ + "pages": { + "me": "Аккаунт", + "clients": "Клиенты", + "admin": { + "panel": "Админ панель", + "general": "Общие", + "config": "Конфигурация", + "interface": "Интерфейс", + "hooks": "Хуки" + } + }, + "user": { + "email": "E-Mail" + }, + "me": { + "currentPassword": "Текущий пароль", + "enable2fa": "Включить двухфакторную аутентификацию", + "enable2faDesc": "Отсканируйте QR-код приложением-аутентификатором или введите ключ вручную.", + "2faKey": "TOTP-ключ", + "2faCodeDesc": "Введите код из приложения-аутентификатора.", + "disable2fa": "Отключить двухфакторную аутентификацию", + "disable2faDesc": "Введите пароль, чтобы отключить двухфакторную аутентификацию" + }, + "general": { + "name": "Имя", + "username": "Имя пользователя", + "password": "Пароль", + "newPassword": "Новый пароль", + "updatePassword": "Обновить пароль", + "mtu": "MTU", + "allowedIps": "Разрешённые IP", + "dns": "DNS", + "persistentKeepalive": "Постоянный keepalive", + "logout": "Выйти", + "continue": "Продолжить", + "host": "Хост", + "port": "Порт", + "yes": "Да", + "no": "Нет", + "confirmPassword": "Подтвердите пароль", + "loading": "Загрузка...", + "2fa": "Двухфакторная аутентификация", + "2faCode": "TOTP‑код" + }, + "setup": { + "welcome": "Добро пожаловать в первичную настройку wg-easy", + "welcomeDesc": "Вы нашли самый простой способ установить и управлять WireGuard на любом Linux-хосте", + "existingSetup": "У вас уже есть существующая установка?", + "createAdminDesc": "Сначала введите имя администратора и надёжный пароль. Эти данные понадобятся для входа в панель управления", + "setupConfigDesc": "Введите информацию о хосте и порте. Она будет использоваться в конфигурации клиента при установке WireGuard на устройствах", + "setupMigrationDesc": "Укажите файл резервной копии, если хотите перенести данные из предыдущей версии wg-easy", + "upload": "Загрузить", + "migration": "Восстановить из резервной копии:", + "createAccount": "Создать аккаунт", + "successful": "Настройка успешна", + "hostDesc": "Публичное имя хоста, к которому будут подключаться клиенты", + "portDesc": "Публичный UDP‑порт для подключения клиентов и прослушивания WireGuard" + }, + "update": { + "updateAvailable": "Доступно обновление!", + "update": "Обновить" + }, + "theme": { + "dark": "Тёмная тема", + "light": "Светлая тема", + "system": "Системная тема" + }, + "layout": { + "toggleCharts": "Показать/скрыть графики", + "donate": "Пожертвовать" + }, + "login": { + "signIn": "Войти", + "rememberMe": "Запомнить меня", + "rememberMeDesc": "Оставаться в системе после закрытия браузера", + "insecure": "Вы не можете войти по незащищённому соединению. Используйте HTTPS.", + "2faRequired": "Требуется двухфакторная аутентификация", + "2faWrong": "Неверный код двухфакторной аутентификации" + }, + "client": { + "empty": "Клиентов пока нет.", + "newShort": "Новый", + "sort": "Сортировка", + "create": "Создать клиента", + "created": "Клиент создан", + "new": "Новый клиент", + "name": "Имя", + "expireDate": "Дата отключения", + "expireDateDesc": "Дата, когда клиент будет отключён. Пусто — бессрочно", + "deleteClient": "Удалить клиента", + "deleteDialog1": "Вы уверены, что хотите удалить", + "deleteDialog2": "Это действие необратимо.", + "enabled": "Включен", + "address": "Адрес", + "serverAllowedIps": "Разрешённые IP сервера", + "otlDesc": "Сгенерировать одноразовую короткую ссылку", + "permanent": "Постоянный", + "createdOn": "Создан ", + "lastSeen": "Последнее подключение ", + "totalDownload": "Всего загружено: ", + "totalUpload": "Всего отправлено: ", + "newClient": "Новый клиент", + "disableClient": "Отключить клиента", + "enableClient": "Включить клиента", + "noPrivKey": "У этого клиента нет приватного ключа. Невозможно создать конфигурацию.", + "showQR": "Показать QR‑код", + "downloadConfig": "Скачать конфигурацию", + "allowedIpsDesc": "Какие IP будут маршрутизироваться через VPN (перезаписывает общую конфигурацию)", + "serverAllowedIpsDesc": "Какие IP сервер будет отправлять клиенту", + "mtuDesc": "Максимальный размер пакета для VPN‑туннеля", + "persistentKeepaliveDesc": "Интервал (в секундах) отправки keep‑alive. 0 — отключено", + "hooks": "Хуки", + "hooksDescription": "Хуки работают только с wg-quick", + "hooksLeaveEmpty": "Только для wg-quick. Иначе оставьте пустым", + "dnsDesc": "DNS‑сервер, который будут использовать клиенты (перезаписывает общую конфигурацию)" + }, + "dialog": { + "change": "Изменить", + "cancel": "Отмена", + "create": "Создать" + }, + "toast": { + "success": "Успех", + "saved": "Сохранено", + "error": "Ошибка" + }, + "form": { + "actions": "Действия", + "save": "Сохранить", + "revert": "Отменить", + "sectionGeneral": "Общие", + "sectionAdvanced": "Дополнительно", + "noItems": "Нет элементов", + "nullNoItems": "Нет элементов. Используется глобальная конфигурация", + "add": "Добавить" + }, + "admin": { + "general": { + "sessionTimeout": "Тайм-аут сессии", + "sessionTimeoutDesc": "Длительность сеанса для \"Запомнить меня\" (секунды)", + "metrics": "Метрики", + "metricsPassword": "Пароль", + "metricsPasswordDesc": "Пароль Bearer для эндпоинта метрик (пароль или хеш argon2)", + "json": "JSON", + "jsonDesc": "Путь для метрик в формате JSON", + "prometheus": "Prometheus", + "prometheusDesc": "Путь для метрик Prometheus" + }, + "config": { + "connection": "Соединение", + "hostDesc": "Публичное имя хоста для подключения клиентов (сбросит конфигурацию)", + "portDesc": "Публичный UDP‑порт для подключения клиентов (также стоит изменить порт интерфейса)", + "allowedIpsDesc": "Разрешённые IP для клиентов (общая конфигурация)", + "dnsDesc": "DNS‑сервер для клиентов (общая конфигурация)", + "mtuDesc": "MTU для клиентов (только для новых)", + "persistentKeepaliveDesc": "Интервал отправки keepalive на сервер (секунды). 0 = отключено (только для новых)", + "suggest": "Определить", + "suggestDesc": "Выберите IP‑адрес или имя хоста для поля Host" + }, + "interface": { + "cidrSuccess": "CIDR изменён", + "device": "Устройство", + "deviceDesc": "Сетевое устройство, через которое должен проходить трафик WireGuard", + "mtuDesc": "MTU, который использует WireGuard", + "portDesc": "UDP‑порт, на котором WireGuard будет слушать (возможно, нужно изменить и порт конфигурации)", + "changeCidr": "Изменить CIDR", + "restart": "Перезапустить интерфейс", + "restartDesc": "Перезапустить интерфейс WireGuard", + "restartWarn": "Вы уверены, что хотите перезапустить интерфейс? Все клиенты будут отключены.", + "restartSuccess": "Интерфейс перезапущен" + }, + "introText": "Добро пожаловать в панель администратора.\n\nЗдесь вы можете управлять общими настройками, конфигурацией, параметрами интерфейса и хуками.\n\nНачните с выбора раздела в боковой панели." + }, + "zod": { + "generic": { + "required": "{0} обязательное поле", + "validNumber": "{0} должен быть числом", + "validString": "{0} должна быть строкой", + "validBoolean": "{0} должен быть булевым значением", + "validArray": "{0} должен быть массивом", + "stringMin": "{0} должен содержать не менее {1} символов", + "numberMin": "{0} должен быть не меньше {1}" + }, + "client": { + "id": "ID клиента", + "name": "Имя", + "expiresAt": "Действителен до", + "address4": "IPv4 адрес", + "address6": "IPv6 адрес", + "serverAllowedIps": "Разрешённые IP сервера" + }, + "user": { + "username": "Имя пользователя", + "password": "Пароль", + "remember": "Запомнить", + "name": "Имя", + "email": "Email", + "emailInvalid": "Email должен быть валидным", + "passwordMatch": "Пароли должны совпадать", + "totpEnable": "Включить TOTP", + "totpEnableTrue": "Необходимо включить TOTP", + "totpCode": "TOTP‑код" + }, + "userConfig": { + "host": "Хост" + }, + "general": { + "sessionTimeout": "Тайм-аут сессии", + "metricsEnabled": "Метрики", + "metricsPassword": "Пароль для метрик" + }, + "interface": { + "cidr": "CIDR", + "device": "Устройство", + "cidrValid": "CIDR должен быть валидным" + }, + "otl": "Одноразовая ссылка", + "stringMalformed": "Строка имеет неверный формат", + "body": "Тело должно быть объектом", + "hook": "Хук", + "enabled": "Включено", + "mtu": "MTU", + "port": "Порт", + "persistentKeepalive": "Постоянный keepalive", + "address": "IP‑адрес", + "dns": "DNS", + "allowedIps": "Разрешённые IP", + "file": "Файл" + }, + "hooks": { + "preUp": "PreUp", + "postUp": "PostUp", + "preDown": "PreDown", + "postDown": "PostDown" + } +} diff --git a/src/nuxt.config.ts b/src/nuxt.config.ts index a68c8d60..2cfdfb76 100644 --- a/src/nuxt.config.ts +++ b/src/nuxt.config.ts @@ -49,6 +49,11 @@ export default defineNuxtConfig({ language: 'de-DE', name: 'Deutsch', }, + { + code: 'ru', + language: 'ru-RU', + name: 'Русский', + }, { code: 'zh-HK', language: 'zh-HK',