diff --git a/next.config.mjs b/next.config.mjs
index 12011193..806d4d66 100644
--- a/next.config.mjs
+++ b/next.config.mjs
@@ -29,7 +29,7 @@ const config = {
i18n: {
defaultLocale: "en",
// localeDetection: false,
- locales: ["en", "fr", "no", "pl", "zh-tw", "zh", "es"],
+ locales: ["en", "fr", "no", "pl", "zh-tw", "zh", "es", "ru"],
},
trailingSlash: true,
eslint: {
diff --git a/src/locales/lang.ts b/src/locales/lang.ts
index 6aa425e3..e9b5b6ca 100644
--- a/src/locales/lang.ts
+++ b/src/locales/lang.ts
@@ -1,4 +1,4 @@
-export const supportedLocales = ["en", "fr", "no", "zh", "pl", "zh-tw", "es"];
+export const supportedLocales = ["en", "fr", "no", "zh", "pl", "zh-tw", "es", "ru"];
export const languageNames = {
default: "System",
en: "English",
@@ -8,4 +8,5 @@ export const languageNames = {
zh: "Chinese",
"zh-tw": "Traditional Chinese",
es: "Spanish",
+ ru: "Русский",
};
diff --git a/src/locales/ru/common.json b/src/locales/ru/common.json
new file mode 100644
index 00000000..dcffe1a8
--- /dev/null
+++ b/src/locales/ru/common.json
@@ -0,0 +1,935 @@
+{
+ "input": {
+ "enterToSave": "Нажмите Enter для сохранения"
+ },
+ "commonMenuTabs": {
+ "settings": "Настройки",
+ "network": "Сеть",
+ "mail": "Почта",
+ "users": "Пользователи",
+ "notification": "Уведомление",
+ "controller": "Контроллер",
+ "organization": "Организация",
+ "webhooks": "Вебхуки",
+ "invites": "Приглашения"
+ },
+ "commonMenuTiles": {
+ "organizationSettings": "Настройки организации",
+ "invites": "Приглашения",
+ "pendingInvites": "Ожидающие приглашения",
+ "members": "Участники",
+ "webhooks": "Вебхуки",
+ "activeWebhooks": "Активные вебхуки"
+ },
+ "commonSpinners": {
+ "loading": "Загрузка...",
+ "Checking": "Проверка..."
+ },
+ "commonButtons": {
+ "confirm": "Подтвердить",
+ "add": "Добавить",
+ "change": "Изменить",
+ "create": "Создать",
+ "submit": "Отправить",
+ "cancel": "Отмена",
+ "delete": "Удалить",
+ "remove": "Удалить",
+ "update": "Обновить",
+ "close": "Закрыть",
+ "stash": "Скрыть",
+ "yes": "Да",
+ "imSure": "Да, я уверен",
+ "generate": "Сгенерировать",
+ "addNetwork": "Создать сеть",
+ "deleteNetwork": "Удалить сеть",
+ "moveNetwork": "Переместить сеть",
+ "moveNetworkToOrganization": "Переместить сеть в организацию",
+ "leaveOrganization": "Покинуть организацию",
+ "inviteUser": "Пригласить пользователя",
+ "meta": "Мета",
+ "users": "Пользователи",
+ "kickUser": "Удалить пользователя",
+ "deleteOrganization": "Удалить организацию",
+ "userActions": "Действия пользователя",
+ "addWebhooks": "Добавить вебхуки",
+ "options": "Опции",
+ "settings": "Настройки",
+ "resend": "Отправить снова",
+ "enable2fa": "Включить 2FA",
+ "disable2fa": "Отключить 2FA",
+ "next": "Далее",
+ "back": "Назад"
+ },
+ "commonTable": {
+ "header": {
+ "name": "Имя",
+ "description": "Описание",
+ "networkId": "ID сети",
+ "members": "Участники",
+ "actions": "Действия",
+ "role": "Роль",
+ "email": "Email",
+ "authorized": "Авторизован",
+ "id": "ID",
+ "created": "Создан",
+ "networks": "Сети",
+ "group": "Группа",
+ "account": "Аккаунт",
+ "ipAssignments": {
+ "header": "Назначенные IP/задержка",
+ "notAssigned": "Не назначен"
+ },
+ "physicalIp": {
+ "header": "Физический IP",
+ "unknownValue": "Неизвестно"
+ },
+ "conStatus": {
+ "header": "Статус",
+ "toolTip": "Не удалось установить прямое соединение, в данный момент идет ретрансляция через серверы ZeroTier с повышенной задержкой",
+ "relayed": "РЕТРАНСЛИРУЕТСЯ",
+ "directLan": "Установлено прямое LAN-соединение",
+ "directWan": "Установлено прямое WAN-соединение",
+ "direct": "ПРЯМОЕ{version}",
+ "offline": "оффлайн"
+ },
+ "status": "Статус"
+ },
+ "search": {
+ "networkSearchPlaceholder": "Поиск сети",
+ "searchUserPlaceholder": "Поиск пользователя"
+ },
+ "tableFooter": {
+ "show": "Показать",
+ "page": "Страница",
+ "of": "из"
+ },
+ "cell": {
+ "Options": "Опции"
+ }
+ },
+ "commonToast": {
+ "updatedSuccessfully": "Успешно обновлено",
+ "addedSuccessfully": "Успешно добавлено",
+ "deletedSuccessfully": "Успешно удалено",
+ "errorOccurred": "Произошла неизвестная ошибка",
+ "organizationDeleted": "Организация успешно удалена",
+ "sentSuccessfully": "Успешно отправлено",
+ "copyToClipboard": {
+ "title": "скопировать в буфер обмена",
+ "success": "{element} скопировано в буфер обмена"
+ }
+ },
+ "sidebar": {
+ "navigation": "Главная",
+ "dashboard": "Панель управления",
+ "networks": "Лок. контроллер",
+ "ztCentral": "ZT Central",
+ "admin": "Управление",
+ "settings": "Настройки",
+ "mail": "Почта",
+ "users": "Пользователи",
+ "notification": "Уведомление",
+ "controller": "Контроллер ZT",
+ "organization": "Организация",
+ "account": "Аккаунт",
+ "user-settings": "Настройки пользователя",
+ "logout": "Выйти"
+ },
+ "authPages": {
+ "welcomeMessage": {
+ "slogan": "ZeroTier позволяет безопасно и приватно подключать ваши устройства через интернет, где бы вы ни находились. Наслаждайтесь быстрыми и надежными соединениями без обычных препятствий, сохраняя ваши данные в безопасности и доступности."
+ },
+ "form": {
+ "name": "Имя",
+ "namePlaceholder": "Введите ваше имя",
+ "email": "Email",
+ "emailPlaceholder": "mail@example.com",
+ "password": "Пароль",
+ "passwordPlaceholder": "Введите ваш пароль",
+ "confirmPassword": "Подтвердите пароль",
+ "confirmPasswordPlaceholder": "Подтвердите ваш пароль",
+ "forgotPassword": "Забыли пароль?",
+ "verify2FA": "Проверка 2FA",
+ "enter2FAcode": "Введите код 2FA",
+ "signIn": "Войти",
+ "signInWith": "Войти через {provider}",
+ "signUp": "Зарегистрироваться",
+ "invitationCode": "Код приглашения",
+ "invitationCodePlaceholder": "Введите ваш код приглашения",
+ "sendMail": "Отправить письмо",
+ "mfaRecoveryCode": "Код восстановления",
+ "mfaRecoveryCodePlaceholder": "Введите ваш код восстановления"
+ },
+ "signin": {
+ "signInToAccount": "Войдите в ваш аккаунт",
+ "or": "ИЛИ",
+ "dontHaveAccount": "Нет аккаунта?",
+ "getStarted": "Начать!",
+ "havingIssues": "Проблемы?"
+ },
+ "signup": {
+ "signUpWithCredentials": "Создать аккаунт",
+ "haveAnAccount": "Уже есть аккаунт?",
+ "login": "Войти!"
+ },
+ "forgot": {
+ "forgotPasswordTitle": "Восстановить пароль",
+ "forgotPasswordMessage": "Мы отправим вам ссылку для сброса, если аккаунт существует",
+ "backToLogin": "Назад к входу"
+ },
+ "forgotReset": {
+ "forgotPasswordTitle": "Сброс пароля",
+ "forgotPasswordMessage": "Пожалуйста, введите ваш новый пароль",
+ "backToLogin": "Назад к входу"
+ },
+ "mfaRecovery": {
+ "mfaRecoveryTitle": "Восстановление 2FA",
+ "mfaRecoveryMessage": "Мы отправим вам инструкции по восстановлению вашего аккаунта",
+ "backToLogin": "Назад к входу"
+ },
+ "mfaRecoveryReset": {
+ "mfaRecoveryResetTitle": "Восстановление 2FA",
+ "mfaRecoveryResetMessage": "Пожалуйста, введите ваши учетные данные и код восстановления",
+ "backToLogin": "Назад к входу"
+ },
+ "emailVerification": {
+ "emailVerified": "Email подтвержден",
+ "errorMessage": "Произошла ошибка при подтверждении вашего email.",
+ "successMessage": "Ваш email успешно подтвержден.",
+ "redirectMessage": "Вы будете автоматически перенаправлены через {seconds} секунд.",
+ "goNowButton": "Перейти сейчас"
+ }
+ },
+ "networks": {
+ "loading": "Загрузка",
+ "title": "Сети",
+ "description": "VPN сети",
+ "unlinkedNetworks": {
+ "title": "Есть {amount} не назначенная сеть, зарегистрированная в контроллере.",
+ "navigate": "Перейти к контроллеру"
+ },
+ "noNetworksMessage": "Сети еще не созданы. Начните с создания одной, и она появится здесь.",
+ "networkActionModal": {
+ "modalTitle": "Опции для сети {networkName}",
+ "moveNetwork": {
+ "title": "Переместить сеть",
+ "description": "Вы можете найти ID в URL организации.",
+ "warningText": "Внимание: Перенос сети переместит как сеть, так и ее участников в выбранную организацию. Это действие необратимо и не может быть отменено. Пожалуйста, внимательно подтвердите ID организации перед продолжением.
Кроме того, убедитесь, что у вас есть права записи в организацию, в которую вы переносите сеть."
+ },
+ "deleteNetwork": {
+ "title": "Удалить сеть",
+ "description": "Удаление сети навсегда удалит ее вместе со всеми связанными данными.",
+ "warningText": "Внимание: Это действие необратимо удалит сеть и всех связанных участников, настройки и данные. Этот процесс не может быть отменен. Пожалуйста, убедитесь, что вы сделали резервную копию необходимой информации перед продолжением удаления."
+ }
+ }
+ },
+ "networkById": {
+ "loading": "Загрузка...",
+ "errorSteps": {
+ "step1": "Убедитесь, что контейнер ZeroTier работает",
+ "step2": "Если другие экземпляры ZeroTier активны локально, пожалуйста, отключите их, так как это может вызвать конфликты."
+ },
+ "networkId": "ID сети:",
+ "networkName": "Имя сети:",
+ "addDescription": "Добавить описание",
+ "descriptionPlaceholder": "Описание",
+ "networkStart": "Начало сети:",
+ "notSet": "не задано",
+ "networkEnd": "Конец сети:",
+ "networkCidr": "CIDR сети:",
+ "networkSettings": "Настройки сети",
+ "networkMembers": "Участники сети",
+ "noMembersInformation": {
+ "title": "У этой сети нет участников, см. инструкции по установке ниже",
+ "installZerotier": "Установить ZeroTier",
+ "joinNetwork": "Присоединиться к сети"
+ },
+ "networkMembersAlert": {
+ "message": "Присоединитесь к этому ID сети, и устройство автоматически отобразится"
+ },
+ "viewStashedMembers": "Просмотреть скрытых участников",
+ "networkActions": "Действия с сетью",
+ "deleteNetwork": {
+ "title": "Удалить сеть {networkName}",
+ "description": "Вы уверены, что хотите удалить эту сеть? Это действие не может быть отменено, и все участники будут удалены из этой сети",
+ "yesAction": "Да, удалить",
+ "noAction": "Нет, оставить"
+ },
+ "privatePublicSwitch": {
+ "accessControllMessage": "Ваша сеть теперь {authType}",
+ "privateCardTitle": "Приватная",
+ "privateCardContent": "Каждый пользователь должен быть авторизован администратором сети.",
+ "publicCardTitle": "Публичная",
+ "publicCardContent": "Все пользователи могут подключаться к этой сети без авторизации",
+ "loading": "Загрузка"
+ },
+ "networkIpAssignments": {
+ "header": "Назначение IP",
+ "tabs": {
+ "ipv4": "IPv4",
+ "ipv6": "IPv6",
+ "mtu": "MTU"
+ },
+ "ipv6": {
+ "rfc4193Label": "ZeroTier RFC4193 (/128 для каждого устройства)",
+ "plane6Label": "ZeroTier 6PLANE (/80 маршрутизируемый для каждого устройства)",
+ "rfc4193Updated": "rfc4193 обновлен",
+ "plane6Updated": "6plane обновлен"
+ },
+ "ipv4": {
+ "duplicateIpNotification": {
+ "title": "Найдено {count} другая(ие) сеть(и) с тем же подсетью.",
+ "modal": {
+ "title": "Обнаружена дублирующаяся подсеть",
+ "description": "Следующие сети имеют ту же подсеть, что и текущая сеть ({name}). Это может не быть проблемой, но если вы подключаете обе сети с одного ПК, это может вызвать конфликт IP-адресов и проблемы с подключением."
+ }
+ },
+ "please_enter_valid_ip_range": "Пожалуйста, введите допустимый диапазон IP",
+ "ip_range_already_exists": "Диапазон IP уже существует",
+ "auto_assign_from_range": "Автоматически назначать из диапазона",
+ "easy": "Простой",
+ "advanced": "Продвинутый",
+ "delete_ip_assignment": "Удалить назначение IP",
+ "range_start": "Начало диапазона",
+ "range_start_placeholder": "192.168.168.1",
+ "range_end": "Конец диапазона",
+ "range_end_placeholder": "192.168.168.254",
+ "submit": "Отправить"
+ },
+ "mtu": {
+ "title": "MTU (Максимальный размер пакета)",
+ "description": "Этот параметр определяет максимальный размер пакета, который может быть передан через сеть. Изменение значения MTU может повлиять на производительность и эффективность сети.",
+ "acceptedValue": "Допустимые значения от 1280 до 10000"
+ }
+ },
+ "nettworkRoutes": {
+ "managedRoutesTitle": "Управляемые маршруты",
+ "noManagedRoutesTitle": "Управляемые маршруты не определены.",
+ "noManagedRoutesDescription1": "Устройства не получат IP-адрес без соответствующего маршрута.",
+ "noManagedRoutesDescription2": "Если у вас нет специфических требований, попробуйте режим IPv4 Auto-Assign Easy.",
+ "destinationPlaceholder": "Назначение",
+ "viaPlaceholder": "цель"
+ },
+ "networkDns": {
+ "DNS": "DNS",
+ "requiresZeroTierVersion": "Требуется ZeroTier версии 1.6.",
+ "clearDNS": "Очистить DNS",
+ "searchDomain": "Поисковый домен",
+ "serverAddress": "Адрес сервера",
+ "submit": "Отправить",
+ "servers": "Серверы",
+ "addressAndDomainRequired": "Требуется адрес и домен"
+ },
+ "networkMulticast": {
+ "Multicast": "Мультикаст",
+ "MulticastRecipientLimit": "Лимит получателей мультикаста",
+ "Submit": "Отправить",
+ "EnableBroadcast": "Включить широковещание",
+ "NumberPlaceholder": "Число",
+ "MulticastUpdatedSuccessfully": "Мультикаст успешно обновлен"
+ },
+ "networkMembersTable": {
+ "searchPlaceholder": "Поиск...",
+ "optionModalTitle": "Опции для участника",
+ "tableRow": {
+ "updateName": "Нажмите, чтобы изменить имя"
+ },
+ "toastMessages": {
+ "memberNameUpdated": "Имя участника успешно обновлено"
+ },
+ "unauthorizedRowMessage": "Несанкционированный доступ",
+ "tableFooter": {
+ "RowsPerPage": "Строк на странице",
+ "Of": "из"
+ },
+ "search": {
+ "placeholder": "Поиск..."
+ }
+ },
+ "deletedNetworkMembersTable": {
+ "buttons": {
+ "viewStashedMembers": "Просмотреть скрытых участников"
+ }
+ },
+ "inviteMemberByMail": {
+ "title": "Почта",
+ "labelText": "Инструкции по присоединению по E-Mail",
+ "placeholder": "ztnet@example.com",
+ "buttonText": "Пригласить",
+ "loadingText": "Загрузка...",
+ "successMessage": "Успех! Приглашение отправлено на {email}",
+ "errorMessage": {
+ "unknownError": "Произошла неизвестная ошибка"
+ }
+ },
+ "addMemberById": {
+ "labelText": "Добавить участника вручную. Может быть использовано для восстановления участника.",
+ "memberIdInput": "ID участника",
+ "placeholder": "10-значное шестнадцатеричное число",
+ "submitButton": "Добавить",
+ "error": {
+ "unknown": "Произошла неизвестная ошибка"
+ }
+ },
+ "memberOptionModal": {
+ "header": {
+ "created": "Создан"
+ },
+ "loading": {
+ "text": "Загрузка..."
+ },
+ "handleSumbit": {
+ "errorAssigned": "IP {target} уже назначен",
+ "errorNotValidIp": "IP {target} не является допустимым IP-адресом"
+ },
+ "ipAssignment": {
+ "header": "Назначение IP",
+ "description": "Добавить или удалить IP-адрес для этого участника."
+ },
+ "deleteIpAssignment": {
+ "title": "Удалить назначение IP"
+ },
+ "addressInput": {
+ "label": "Адрес"
+ },
+ "addButton": {
+ "text": "Добавить"
+ },
+ "allowEthernetBridging": {
+ "header": "Разрешить Ethernet-мост",
+ "description": "Мост требует дополнительной настройки на устройстве. См. руководство и базу знаний для получения дополнительной информации. Мобильные устройства не могут быть мостами."
+ },
+ "doNotAutoAssignIPs": {
+ "header": "Не назначать IP автоматически",
+ "description": "Это отключит возможность автоматического назначения IP-адресов этому участнику."
+ },
+ "capabilities": {
+ "header": "Возможности:"
+ },
+ "tags": {
+ "header": "Теги:"
+ },
+ "anotation": {
+ "header": "Аннотация",
+ "description": "Улучшите организацию участников, добавляя аннотации",
+ "placeholder": "Добавить аннотацию"
+ }
+ },
+ "networkHelp": {
+ "title": "Помощь по сети",
+ "networkID": "ID сети",
+ "networkIDText": "Глобально уникальный 16-значный ID сети. В настоящее время не может быть изменен.",
+ "networkName": "Имя сети",
+ "networkNameText": "Определяемое пользователем короткое имя для этой сети, которое видно участникам. Мы рекомендуем использовать что-то вроде доменного имени (например, zerotier.com) или адреса электронной почты.",
+ "accessControl": "Контроль доступа",
+ "accessControlText": "Как контролируется членство? Это следует оставить в настройках по умолчанию, если вы не хотите создать полностью открытую сеть для тестирования, игр и т.д.",
+ "multicastRecipientLimit": "Лимит получателей мультикаста",
+ "multicastRecipientLimitText": "Максимальное количество получателей, которые могут получать Ethernet-мультикаст или широковещание. Если количество получателей превышает этот лимит, случайное подмножество получит объявление. Установка этого значения выше делает мультикасты более надежными в больших сетях за счет увеличения пропускной способности.",
+ "multicastRecipientLimitText2": "Установка в 0 отключает мультикаст, но имейте в виду, что только IPv6 с эмуляцией NDP (режимы адресации RFC4193 или 6PLANE) или другие протоколы только с уникастом будут работать без мультикаста.",
+ "managedRoutes": "Управляемые маршруты",
+ "managedRoutesText": "IPv4-маршруты, которые будут опубликованы участникам сети. Это можно использовать для создания маршрутов к другим сетям через шлюзы в сети ZeroTier. Обратите внимание, что по соображениям безопасности большинство клиентов не будут использовать маршруты по умолчанию или маршруты, которые пересекаются с общедоступным адресным пространством IP, если это не разрешено пользователем. Общедоступные IP-диапазоны отмечены значком:",
+ "ipv4AutoAssign": "Автоназначение IPv4",
+ "ipv4AutoAssignText": "Диапазон IPv4, из которого автоматически назначаются IP. Обратите внимание, что IP будут назначаться только если они также попадают в определенный маршрут. Простой режим позволяет пользователям выбрать IP-диапазон, и определения маршрутов и пулов будут созданы автоматически.",
+ "dnsPush": "DNS Push",
+ "dnsPushText1": "Требуется ZeroTier версии 1.6 или новее.",
+ "dnsPushText2": "Более старые версии ZeroTier будут игнорировать эти настройки.",
+ "dnsPushText3": "На macOS, iOS, Windows и Android ZeroTier может автоматически добавлять DNS-серверы для определенного домена. Он не настраивает и не хостит DNS-сервер. Вы должны настроить свой собственный.",
+ "dnsPushText4": "Если вы настроите zt.example.com как поисковый домен и 10.147.20.1 как адрес сервера, то ваш компьютер будет запрашивать 10.147.20.1 для поиска IP-адресов для имен хостов, заканчивающихся на zt.example.com.",
+ "dnsPushText5": "Это должно быть включено на каждом клиенте с помощью опции allowDNS. В интерфейсе есть флажок в деталях каждой сети, рядом с флажком Allow Managed."
+ }
+ },
+ "admin": {
+ "settings": {
+ "publicPages": {
+ "sectionTitle": "Публичные страницы",
+ "description": "Настройте текст, отображаемый на ваших страницах входа и регистрации, чтобы лучше соответствовать вашему бренду или предоставить специальные инструкции вашим пользователям."
+ }
+ },
+ "mail": {
+ "mailSMTP": "Почтовый SMTP",
+ "smtpHost": "SMTP-хост",
+ "smtpPort": "SMTP-порт",
+ "senderEmail": "Email отправителя",
+ "mailPlaceholder": "mail@example.com",
+ "username": "Имя пользователя",
+ "password": "Пароль",
+ "useSSL": "Использовать SSL",
+ "inviteUserTemplate": "Шаблон приглашения пользователя",
+ "emailVerificationTemplate": "Шаблон подтверждения email",
+ "forgotPasswordTemplate": "Шаблон восстановления пароля",
+ "notificationTemplate": "Шаблон уведомления",
+ "organizationInviteTemplate": "Шаблон приглашения в организацию",
+ "newDeviceNotificationTemplate": "Шаблон уведомления о новом устройстве",
+ "deviceIpChangeNotificationTemplate": "Шаблон уведомления об изменении IP устройства",
+ "templates": {
+ "availableTags": "Доступные теги:",
+ "subject": "Тема",
+ "inputPlaceholderSubject": "Тема",
+ "htmlBody": "HTML-содержание",
+ "textareaPlaceholderBody": "Шаблон письма",
+ "saveTemplateButton": "Сохранить шаблон",
+ "resetButton": "Сбросить",
+ "sendTestMailButton": "Отправить тестовое письмо",
+ "sendTestMailButtonLoading": "Работаю...",
+ "errorFields": "Пожалуйста, заполните все поля",
+ "successToastMailSent": "Письмо отправлено",
+ "successToastTemplateSaved": "Шаблон сохранен"
+ }
+ },
+ "users": {
+ "authentication": {
+ "header": "Аутентификация",
+ "enableUserRegistration": "Включить регистрацию пользователей?",
+ "enableUserRegistrationDescription": "Это позволит пользователям нажимать кнопку регистрации на странице входа.",
+ "generateInvitation": {
+ "header": "Сгенерировать ссылку приглашения",
+ "secretMessageLabel": "Пользователь будет должен ввести это сообщение при регистрации (учитывается регистр)",
+ "secretMessagePlaceholder": "Добавить секретное сообщение",
+ "expireTimeLabel": "Ссылка приглашения истечет после этого времени",
+ "expireTimePlaceholder": "Время истечения в минутах",
+ "timeUsedLabel": "Сколько раз можно использовать эту ссылку? (По умолчанию 1)",
+ "timeUsedPlaceholder": "Количество использований",
+ "assignGroupLabel": "Назначить пользователя в группу",
+ "activeInvitationsLabel": "Активные приглашения (нажмите для подробностей)",
+ "invitationModal": {
+ "header": "Детали приглашения",
+ "secretLabel": "Секрет:",
+ "expiresLabel": "Статус:",
+ "groupIdLabel": "Назначен в группу:",
+ "timesUsedLabel": "Использовано раз:",
+ "invitationLinkLabel": "Ссылка приглашения:",
+ "clickToCopyLabel": "нажмите для копирования",
+ "linkCopiedToast": "ссылка скопирована в буфер обмена",
+ "deleteButton": "Удалить"
+ }
+ }
+ },
+ "users": {
+ "sectionTitle": "Пользователи",
+ "description": "Все зарегистрированные пользователи на платформе.",
+ "userOptionModal": {
+ "userGroupLabel": "Группа пользователя",
+ "userRoleLabel": "Роль пользователя",
+ "account": {
+ "title": "ZTNet выполняет ежедневную проверку на истечение срока действия пользователей. Если срок действия пользователя истек, все связанные участники будут деавторизованы, а аккаунт пользователя будет деактивирован.",
+ "userAccountLabel": "Статус аккаунта",
+ "userExpireLabel": "Истечение срока действия аккаунта"
+ },
+ "userActionsLabel": "Действия пользователя",
+ "typeUserName": "Введите имя пользователя.",
+ "buttons": {
+ "deleteUser": "Удалить пользователя",
+ "cancle": "Отмена"
+ },
+ "toast": {
+ "deleteUserSuccess": "Пользователь успешно удален",
+ "nameNotEqual": "Введенное вами имя пользователя не совпадает с пользователем."
+ }
+ },
+ "roleDescriptions": {
+ "admin": "Как администратор, этот пользователь будет иметь полный доступ, включая доступ к панели администратора.",
+ "user": "Если установлено значение 'Пользователь', у этого пользователя будут ограниченные права, и он не сможет получить доступ к панели администратора."
+ },
+ "changeRoleModal": {
+ "title": "Изменить роль для {name}"
+ },
+ "toastMessages": {
+ "roleChangeSuccess": "Роль успешно изменена",
+ "errorOccurred": "Произошла неизвестная ошибка"
+ }
+ },
+ "groups": {
+ "sectionTitle": "Группы",
+ "description": "Создайте новую группу пользователей для лучшей организации пользователей платформы. Назначение пользователей в определенные группы позволяет контролировать доступ, устанавливать ограничения и настраивать параметры в зависимости от типов пользователей.",
+ "addGroup": {
+ "editGroupTitle": "Редактировать группу",
+ "deleteGroupTitle": "Удалить группу",
+ "deleteGroupDescription": "Вы уверены, что хотите удалить эту группу? Если она назначена, она будет удалена у пользователя.",
+ "addGroupLabel": "Добавить новую группу",
+ "addGroupButton": "Добавить группу",
+ "groupNamePlaceholder": "Название группы",
+ "groupNameDescription": "Введите имя для новой группы",
+ "networkLimitPlaceholder": "Лимит сетей",
+ "networkLimitDescription": "Установите максимальное количество сетей, которые могут быть созданы пользователями в этой группе",
+ "useAsDefaultPlaceholder": "Использовать по умолчанию",
+ "useAsDefaultDescription": "Установить эту группу как группу по умолчанию для новых пользователей"
+ }
+ }
+ },
+ "notification": {
+ "authentication": "Аутентификация",
+ "whenUserRegister": "Когда пользователь регистрируется",
+ "allAdminsNotification": "Все администраторы получат уведомления"
+ },
+ "controller": {
+ "networkMembers": {
+ "title": "Сети и участники",
+ "totalNetworks": "Всего сетей:",
+ "totalMembers": "Всего участников:",
+ "totalUnlinkedNetworks": "Всего не связанных сетей:",
+ "unlinkedNetworks": {
+ "title": "Не связанные сети",
+ "description": "В этом разделе представлена таблица всех сетей, которые в настоящее время не связаны ни с одним пользователем в базе данных ztnet. Обычно они исходят от пользовательских контроллеров ZeroTier, которые были добавлены пользователями, но еще не управляются в ZTNET. Таблица дает вам возможность назначить эти неуправляемые сети конкретным администраторам. Это может быть особенно полезно, если пользователь добавил пользовательский контроллер ZeroTier, который еще не управляется ZTNET.",
+ "table": {
+ "nwid": "nwid",
+ "networkName": "Имя сети",
+ "creationTime": "Время создания",
+ "members": "Участники",
+ "assign": "Назначить"
+ },
+ "assignModal": {
+ "title": "Вы уверены, что хотите назначить пользователя {user} на сеть {network}?",
+ "description": "Это действие не может быть отменено"
+ }
+ }
+ },
+ "management": {
+ "title": "Управление",
+ "allowManagementFrom": "Разрешить управление с:",
+ "allowTcpFallbackRelay": "Разрешить резервную передачу TCP:",
+ "listeningOn": "Слушает на:"
+ },
+ "controllerStatus": {
+ "title": "Статус контроллера",
+ "online": "Онлайн:",
+ "tcpFallbackActive": "Резервная передача TCP активна:",
+ "version": "Версия:"
+ },
+ "controllerConfig": {
+ "danger_zone": "ОПАСНАЯ ЗОНА",
+ "proceed_with_caution": "Действуйте осторожно:",
+ "modification_warning": "Изменение URL контроллера ZeroTier влияет на всех пользователей. Хотя это дает гибкость для тех, кто хочет использовать пользовательский контроллер, имейте в виду возможные сбои и проблемы совместимости. Всегда делайте резервные копии конфигураций перед изменениями.",
+ "local_zerotier_url": "Локальный URL ZeroTier",
+ "zerotier_secret": "Секрет ZeroTier",
+ "submit_empty_field_default": "Отправьте пустое поле, чтобы использовать значение по умолчанию.",
+ "isUsingEnvVariablesAlert": "Переменная окружения ZT_ADDR или ZT_SECRET имеет приоритет и переопределяет любые изменения URL, сделанные через интерфейс. Чтобы обновить соответствующие поля через интерфейс, вы должны сначала удалить переменные окружения ZT_ADDR или ZT_SECRET."
+ },
+ "generatePlanet": {
+ "updatePlanetWarning": "Обновление файла planet изменит основную структуру вашей сети ZeroTier, влияя на маршруты, гибкость и потенциально доступность. Действуйте осторожно, понимая последствия.",
+ "customPlanetInUse": "Пользовательский planet в данный момент используется!",
+ "customPortIsInUse": "ВНИМАНИЕ! Используется пользовательский порт",
+ "customPortIsInUseDescription": "Вам нужно добавить ZT_PRIMARY_PORT:port в переменные окружения Docker Compose для ZeroTier.",
+ "downloadPlanetInfo": "Если вам это нужно, файл planet доступен для загрузки по следующему URL:",
+ "downloadPlanetUrl": "api/planet",
+ "generatePrivateRootLabel": "Сгенерировать Root Label",
+ "generatePrivateRootPlaceholder": "Добавьте Root Label к вашему контроллеру",
+ "commentDescription": "Добавьте комментарий для этого planet (необязательно)",
+ "commentPlaceholder": "Введите комментарий",
+ "identityDescription": "Идентификатор (необязательно). Значение по умолчанию - содержимое текущего identity.public",
+ "endpointsDescription": "Введите внешний IP-адрес вашего контроллера. Используйте формат, разделенный запятыми (IP/PORT) для нескольких адресов. Например: '84.17.53.155/9993,2a02:6ea0:d405::/9993'. Убедитесь, что эти адреса глобально доступны, если вы хотите, чтобы узлы за пределами вашей локальной сети могли подключаться.",
+ "endpointsPlaceholder": "<внешний IP>/9993",
+ "plRecommend": "Автоматически сгенерировать ID",
+ "birthLabel": "Birth (plBirth)",
+ "birthPlaceholder": "Введите Birth",
+ "idLabel": "ID (plID)",
+ "idPlaceholder": "Введите ID",
+ "buttons": {
+ "editPlanetConfig": "РЕДАКТИРОВАТЬ КОНФИГУРАЦИЮ PLANET",
+ "createPlanet": "СОЗДАТЬ PLANET",
+ "uploadConfig": "ЗАГРУЗИТЬ КОНФИГ",
+ "updateWorld": "Обновить World",
+ "downloadPlanetButton": "Скачать конфиг",
+ "restoreOriginalPlanetButton": "Восстановить оригинальный Planet"
+ },
+ "modal": {
+ "noteTitle": "ВНИМАНИЕ!",
+ "customPlanetGenerated": "Пользовательский planet сгенерирован.",
+ "restartContainerInstructions": "Вам нужно перезапустить контейнер zerotier, чтобы загрузить новую конфигурацию:
docker restart zerotier",
+ "restoreOriginalPlanetTitle": "Восстановить оригинальный Planet",
+ "restoreOriginalPlanetContent": "Вы уверены, что хотите восстановить оригинальный файл planet? Убедитесь, что вы сделали резервную копию текущего файла planet, если хотите сохранить текущие ключи"
+ }
+ },
+ "yes": "Да",
+ "no": "Нет"
+ },
+ "organization": {
+ "addOrganization": {
+ "title": "Управление командой",
+ "description": "Исследуйте организацию, чтобы начать формировать то, как ваша команда работает вместе. Назначайте роли, приглашайте новых участников и контролируйте базовые разрешения внутри вашей организации. Разработанная для простоты и удобства использования, эта бета-функция предоставляет основу для совместной работы вашей команды. По мере того, как мы продолжаем развивать и улучшать эти настройки, мы приглашаем вас предоставить обратную связь, чтобы помочь нам улучшить опыт.",
+ "inputFields": {
+ "label": "Добавить организацию",
+ "description": "Создайте новую организацию",
+ "organizationName": {
+ "description": "Название организации"
+ },
+ "organizationDescription": {
+ "description": "Описание организации (необязательно)"
+ }
+ },
+ "deleteOrganizationModal": {
+ "title": "Удалить организацию",
+ "description": "Вы уверены, что хотите удалить эту организацию?",
+ "description2": "Это действие навсегда удалит организацию вместе со всеми ее сетями, участниками и связанными данными. Это действие не может быть отменено.",
+ "confirmation": "Пожалуйста, подтвердите, что вы хотите продолжить удаление организации.",
+ "inputFields": {
+ "organizationName": {
+ "placeholder": "Введите название организации для подтверждения"
+ }
+ }
+ }
+ },
+ "listOrganization": {
+ "organizationName": "Название организации:",
+ "description": "Описание:",
+ "numberOfMembers": "Количество участников:",
+ "pendingInvitations": "Ожидающие приглашения:",
+ "activeWebhooks": "Активные вебхуки:"
+ }
+ }
+ },
+ "userSettings": {
+ "tabs": {
+ "account": "Аккаунт",
+ "network": "Сеть",
+ "notification": "Уведомление",
+ "user": "Пользователь"
+ },
+ "account": {
+ "accountSettings": {
+ "title": "Настройки аккаунта",
+ "nameLabel": "Имя",
+ "emailLabel": "Email",
+ "verifiedBadge": "Подтвержден",
+ "notVerifiedBadge": "Не подтвержден",
+ "passwordLabel": "Пароль",
+ "currentPasswordPlaceholder": "Текущий пароль",
+ "newPasswordPlaceholder": "Новый пароль",
+ "repeatNewPasswordPlaceholder": "Повторите новый пароль",
+ "role": "Роль"
+ },
+ "totp": {
+ "title": "Двухфакторная аутентификация",
+ "description": "Это повысит безопасность учетных записей пользователей, требуя дополнительного шага проверки.",
+ "mfaNote": "Примечание: 2FA будет работать только если вы входите с использованием учетных данных. OAuth не будет использовать этот 2FA, даже если настроен, так как он управляется поставщиком OAuth.",
+ "notification": {
+ "title": "Двухфакторная аутентификация (2FA) не включена",
+ "description": "Мы настоятельно рекомендуем включить 2FA для повышения безопасности вашего аккаунта."
+ },
+ "totpActivation": {
+ "title": "Двухфакторная аутентификация",
+ "steps": {
+ "step1": "Пароль",
+ "step2": "Сканируйте QR-код",
+ "step3": "Отправить"
+ },
+ "confirmPassword": {
+ "description": "Введите ваш пароль"
+ },
+ "displayQrCode": {
+ "description": "Вам нужно приложение двухфакторной аутентификации? Скачайте одно из следующих",
+ "IOS": "Устройства iOS",
+ "Android": "Устройства Android",
+ "Windows": "Устройства Windows",
+ "appDescription": "Эти приложения рекомендуются, но другие приложения аутентификации также подойдут.",
+ "scanQrDescription": "Сканируйте этот QR-код с помощью вашего приложения аутентификации.",
+ "manualEntry": "Если вы не можете сканировать QR-код, вы можете вручную ввести следующее:"
+ },
+ "enterTotpCode": {
+ "description": "Проверьте вашу настройку TOTP",
+ "enterCode": "Введите код из вашего приложения аутентификации, чтобы проверить и включить TOTP."
+ }
+ }
+ },
+ "userDevices": {
+ "connectedDevices": "Подключенные устройства",
+ "logoutAll": "Выйти из всех",
+ "accessDenied": "Доступ запрещен",
+ "noDevicesFound": "Устройства не найдены.",
+ "activeNow": "Активно сейчас",
+ "currentDevice": "Текущее устройство",
+ "logout": "Выйти"
+ },
+ "restapi": {
+ "sectionTitle": "Токены доступа к API",
+ "description": "Это позволяет вам сгенерировать API-токен, который вы можете использовать для аутентификации и получения доступа к API нашего приложения. Имея действительный токен, вы можете делать запросы к API и взаимодействовать с функциями приложения программно.",
+ "viewToken": {
+ "title": "Информация о токене",
+ "name": "Имя",
+ "authorizationType": "Тип авторизации",
+ "expireAt": "Истекает",
+ "isActive": "Активен"
+ },
+ "generateToken": {
+ "title": "Токен Rest API",
+ "tokenName": {
+ "label": "Добавьте значимое имя к вашему токену",
+ "placeholder": "Мой замечательный токен"
+ },
+ "tokenAuthorizationType": {
+ "label": "Выберите тип авторизации API",
+ "placeholder": "Выберите тип авторизации"
+ },
+ "tokenExpireAt": {
+ "label": "Выберите дату истечения токена",
+ "placeholder": "Выберите дату",
+ "values": {
+ "never": "Никогда",
+ "1day": "1 день",
+ "10day": "10 дней",
+ "1month": "1 месяц",
+ "1year": "1 год"
+ }
+ }
+ },
+ "buttons": {
+ "submitToken": "Сгенерировать токен",
+ "cancle": "Удалить токен"
+ },
+ "response": {
+ "title": "Нажмите на токен, чтобы скопировать",
+ "info": "Этот токен будет показан только один раз. Пожалуйста, скопируйте его сейчас!"
+ },
+ "modals": {
+ "deleteToken": {
+ "title": "Удалить токен",
+ "description": "Вы уверены, что хотите удалить этот токен? Это действие не может быть отменено."
+ }
+ }
+ },
+ "zerotierCentral": {
+ "title": "Zerotier Central",
+ "description": "Интеграция вашего ZeroTier Central API позволит вам управлять вашими центральными сетями напрямую из ZTNET. После интеграции ключа в боковом меню появится новый пункт для улучшенной доступности и контроля.
Вы можете получить ключ из портала ZeroTier Central. https://my.zerotier.com/account",
+ "apiKeyLabel": "API-ключ ZeroTier Central",
+ "apiUrlLabel": "URL API ZeroTier",
+ "apiUrlLabelDescription": "URL API ZeroTier Central, по умолчанию https://api.zerotier.com/api/v1"
+ },
+ "accountPreferences": {
+ "title": "Настройки аккаунта",
+ "languageLabel": "Язык",
+ "fontSize": "Размер шрифта"
+ },
+ "application": {
+ "title": "Приложение",
+ "version": "Версия",
+ "developerMode": "режим разработчика"
+ }
+ },
+ "network": {
+ "annotations": {
+ "memberAnotations": "Аннотации участников",
+ "showMarkerInTable": "Показать маркер в таблице",
+ "showMarkerInTableDescription": "Это добавит кружок перед именем участника с цветом аннотации.
Вы все еще можете искать аннотацию, если она отключена.",
+ "addBackgroundColorInTable": "Добавить цвет фона в таблице",
+ "addBackgroundColorInTableDescription": "Это добавит цвет фона строки на основе цвета аннотации.
Вы все еще можете искать аннотацию, если она отключена."
+ },
+ "memberTable": {
+ "memberTableTitle": "Таблица участников",
+ "deAuthorizationWarningTitle": "Показать предупреждение при деавторизации участника",
+ "deAuthorizationWarningLabel": "Отображать модальное окно подтверждения, чтобы предотвратить случайную деавторизацию.",
+ "addMemberIdAsNameTitle": "Добавлять ID участника как имя при регистрации",
+ "addMemberIdAsNameLabel": "Когда участник сети регистрируется, ID участника (nodeid) будет добавлен как имя."
+ }
+ },
+ "notification": {
+ "devices": "Устройства",
+ "newDeviceLogin": {
+ "title": "Оповещение о входе с нового устройства",
+ "description": "Получайте письмо, когда новое устройство впервые входит в ваш аккаунт."
+ },
+ "ipAddressChange": {
+ "title": "Оповещение об изменении IP-адреса",
+ "description": "Получайте письмо, когда известное устройство получает доступ к вашему аккаунту с нового IP-адреса."
+ }
+ }
+ },
+ "organization": {
+ "errors": {
+ "getOrgError": "Свяжитесь с администратором организации, чтобы убедиться, что у вас есть соответствующие разрешения"
+ },
+ "loading": "Загрузка...",
+ "organizationDashboard": {
+ "header": "Панель организации"
+ },
+ "membersSection": {
+ "title": "Участники",
+ "editUser": "Редактировать пользователя",
+ "role": "Роль"
+ },
+ "informationSection": {
+ "title": "Информация",
+ "name": "Имя:",
+ "created": "Создано:",
+ "members": "Участники:",
+ "pendingInvitations": "Ожидающие приглашения:"
+ },
+ "networkSection": {
+ "title": "Сети",
+ "noNetworksToShow": "Нет сетей для отображения."
+ },
+ "leaveOrganization": {
+ "confirmationTitle": "Покинуть организацию?",
+ "confirmationMessage": "Вы уверены, что хотите покинуть организацию?",
+ "note": "Примечание: Если вы решите снова присоединиться к этой организации в будущем, администратор должен будет отправить вам новое приглашение."
+ },
+ "chatSidebar": {
+ "toggleChatLabel": "Сообщения",
+ "chatHeader": "Сообщения организации",
+ "chatInfo": "Все в организации смогут увидеть ваше сообщение.",
+ "messageInputPlaceholder": "Напишите сообщение...",
+ "noMessages": "Сообщений пока нет."
+ },
+ "logFooter": {
+ "toggleLogLabel": "ЛОГ",
+ "logHeader": "Последние 100 журналов активности",
+ "loading": "Получение журналов..."
+ },
+ "settings": {
+ "invitation": {
+ "title": "Расширение команды: пригласить новых участников",
+ "description": "Приглашайте больше людей в свою команду! Вы можете отправлять приглашения по электронной почте или найти и добавить людей, которые уже используют платформу.
Это облегчает рост вашей команды и включает больше участников.",
+ "pendingInvitations": {
+ "title": "Ожидающие приглашения"
+ },
+ "inviteByEmail": {
+ "title": "Пригласить по электронной почте",
+ "description": "Приглашенные пользователи, которые в настоящее время не являются участниками приложения, должны будут зарегистрироваться через предоставленную ссылку в электронном письме с приглашением. Ссылка действительна в течение 24 часов.",
+ "emailPlaceholder": "Адрес электронной почты",
+ "emailDescription": "Введите адрес электронной почты человека, которого вы хотите пригласить",
+ "selectRoleDescription": "Выберите роль пользователя"
+ },
+ "inviteSiteUser": {
+ "title": "Пригласить пользователей сайта",
+ "description": "Прежде чем вы сможете добавить пользователей в вашу организацию, важно отметить, что они должны уже быть зарегистрированы в приложении",
+ "inputFields": {
+ "searchUser": {
+ "title": "Поиск пользователя, которого вы хотите добавить",
+ "placeholder": "Поиск пользователя"
+ },
+ "userRole": {
+ "title": "Выберите роль пользователя"
+ }
+ }
+ }
+ },
+ "network": {
+ "globalNodeNaming": {
+ "title": "Включить глобальное именование узлов",
+ "description": "Когда включено, эта функция будет:",
+ "bulletPoints": "Поддерживать согласованное имя для каждого узла во всех сетях организации.\nОбновлять имя узла во всех сетях при переименовании его в одной сети.\nПри регистрации участника проверять, существует ли участник в вашей организации, и использовать первое найденное имя.",
+ "note": "Примечание: Это применимо исключительно к сетям внутри этой конкретной организации."
+ }
+ }
+ },
+ "webhook": {
+ "title": "Вебхуки организации",
+ "description": "Расширьте возможности вашей организации с помощью интеграции вебхуков, предлагая уведомления в реальном времени для критически важных событий.
Будьте впереди с мгновенными обновлениями, напрямую передаваемыми в вашу систему, обеспечивая беспрепятственный рабочий процесс и возможности немедленного реагирования.",
+ "createWebhook": {
+ "editWebhookTitle": "Редактировать вебхук",
+ "createWebhookTitle": "Создать вебхук для организации {organization}",
+ "webhookName": "Имя вебхука",
+ "webhookNameDescription": "Это поле для ввода имени вебхука. Имя используется для идентификации вебхука и должно быть достаточно описательным, чтобы отличать его от других вебхуков.",
+ "selectWebhookActions": "Выберите действия вебхука",
+ "selectWebhookActionsDescription": "Это выпадающее меню позволяет выбрать конкретные действия, которые должен выполнять ваш вебхук. Каждый вариант представляет собой разный тип действия.",
+ "webhookUrl": "URL вебхука (HTTPS)",
+ "webhookUrlDescription": "Это поле для ввода URL, куда вебхук будет отправлять данные. Это должен быть действительный и доступный URL-адрес конечной точки, который может получать и обрабатывать входящие данные вебхука."
+ },
+ "listWebhooks": {
+ "activeWebhooks": "Активные вебхуки",
+ "description": "Описание",
+ "url": "URL",
+ "lastDelivery": "Последняя доставка",
+ "events": "События"
+ }
+ }
+ }
+}