From b3b1e94b8c420f98765a31215d418b9c7436e823 Mon Sep 17 00:00:00 2001 From: Alexey Krainev Date: Sat, 8 Nov 2025 15:02:05 +0500 Subject: [PATCH 1/4] Add Russian Support --- frontend/src/locale/lang/lang-list.json | 3 +- frontend/src/locale/lang/ru.json | 215 ++++++++++++++++++++++++ 2 files changed, 217 insertions(+), 1 deletion(-) create mode 100644 frontend/src/locale/lang/ru.json diff --git a/frontend/src/locale/lang/lang-list.json b/frontend/src/locale/lang/lang-list.json index 4d9de4e50c..fb286200ed 100644 --- a/frontend/src/locale/lang/lang-list.json +++ b/frontend/src/locale/lang/lang-list.json @@ -1,3 +1,4 @@ { - "locale-en-US": "English" + "locale-en-US": "English", + "locale-ru-RU": "Русский" } \ No newline at end of file diff --git a/frontend/src/locale/lang/ru.json b/frontend/src/locale/lang/ru.json new file mode 100644 index 0000000000..db5f7fc5c4 --- /dev/null +++ b/frontend/src/locale/lang/ru.json @@ -0,0 +1,215 @@ +{ + "access-list": "Список доступа", + "access-list.access-count": "{count} {count, plural, one {правило} few {правила} many {правил} other {правила}}", + "access-list.auth-count": "{count} {count, plural, one {пользователь} few {пользователя} many {пользователей} other {пользователя}}", + "access-list.help-rules-last": "When at least 1 rule exists, this deny all rule will be added last", + "access-list.help.rules-order": "Note that the allow and deny directives will be applied in the order they are defined.", + "access-list.pass-auth": "Pass Auth to Upstream", + "access-list.public": "Publicly Accessible", + "access-list.public.subtitle": "No basic auth required", + "access-list.satisfy-any": "Satisfy Any", + "access-list.subtitle": "{users} {users, plural, one {User} other {Users}}, {rules} {rules, plural, one {Rule} other {Rules}} - Created: {date}", + "access-lists": "Списки доступа", + "action.add": "Добавить", + "action.add-location": "Add Location", + "action.close": "Закрыть", + "action.delete": "Удалить", + "action.disable": "Выключить", + "action.download": "Скачать", + "action.edit": "Изменить", + "action.enable": "Включить", + "action.permissions": "Permissions", + "action.renew": "Продлить", + "action.view-details": "Просмотреть детали", + "auditlogs": "Audit Logs", + "cancel": "Отменить", + "certificate": "Сертификат", + "certificate.custom-certificate": "Сертификат", + "certificate.custom-certificate-key": "Ключ сертификата", + "certificate.custom-intermediate": "Промежуточный сертификат", + "certificate.in-use": "Используется", + "certificate.none.subtitle": "No certificate assigned", + "certificate.none.subtitle.for-http": "This host will not use HTTPS", + "certificate.none.title": "Нет", + "certificate.not-in-use": "Не используется", + "certificate.renew": "Продлить сертификат", + "certificates": "Сертификаты", + "certificates.custom": "Пользовательский сертификат", + "certificates.custom.warning": "Файлы ключей, защищённые паролем, не поддерживаются.", + "certificates.dns.credentials": "Credentials File Content", + "certificates.dns.credentials-note": "This plugin requires a configuration file containing an API token or other credentials for your provider", + "certificates.dns.credentials-warning": "This data will be stored as plaintext in the database and in a file!", + "certificates.dns.propagation-seconds": "Propagation Seconds", + "certificates.dns.propagation-seconds-note": "Leave empty to use the plugins default value. Number of seconds to wait for DNS propagation.", + "certificates.dns.provider": "DNS-провайдер", + "certificates.dns.warning": "This section requires some knowledge about Certbot and its DNS plugins. Please consult the respective plugins documentation.", + "certificates.http.reachability-404": "There is a server found at this domain but it does not seem to be Nginx Proxy Manager. Please make sure your domain points to the IP where your NPM instance is running.", + "certificates.http.reachability-failed-to-check": "Failed to check the reachability due to a communication error with site24x7.com.", + "certificates.http.reachability-not-resolved": "There is no server available at this domain. Please make sure your domain exists and points to the IP where your NPM instance is running and if necessary port 80 is forwarded in your router.", + "certificates.http.reachability-ok": "Your server is reachable and creating certificates should be possible.", + "certificates.http.reachability-other": "There is a server found at this domain but it returned an unexpected status code {code}. Is it the NPM server? Please make sure your domain points to the IP where your NPM instance is running.", + "certificates.http.reachability-wrong-data": "There is a server found at this domain but it returned an unexpected data. Is it the NPM server? Please make sure your domain points to the IP where your NPM instance is running.", + "certificates.http.test-results": "Test Results", + "certificates.http.warning": "These domains must be already configured to point to this installation.", + "certificates.request.subtitle": "с Let's Encrypt", + "certificates.request.title": "Request a new Certificate", + "column.access": "Доступ", + "column.authorization": "Authorization", + "column.authorizations": "Authorizations", + "column.custom-locations": "Custom Locations", + "column.destination": "Destination", + "column.details": "Детали", + "column.email": "Email", + "column.event": "Событие", + "column.expires": "Истекает", + "column.http-code": "Access", + "column.incoming-port": "Incoming Port", + "column.name": "Имя", + "column.protocol": "Протокол", + "column.provider": "Провайдер", + "column.roles": "Роли", + "column.rules": "Правила", + "column.satisfy": "Satisfy", + "column.satisfy-all": "All", + "column.satisfy-any": "Any", + "column.scheme": "Схема", + "column.source": "Источник", + "column.ssl": "SSL", + "column.status": "Статус", + "created-on": "Создан: {date}", + "dashboard": "Обзор", + "dead-host": "404-хост", + "dead-hosts": "404-хосты", + "dead-hosts.count": "{count} {count, plural, one {404 Host} other {404 Hosts}}", + "disabled": "Выключен", + "domain-names": "Домены", + "domain-names.max": "Максимум доменов: {count}", + "domain-names.placeholder": "Начните ввод, чтобы добавить домен...", + "domain-names.wildcards-not-permitted": "Wildcard'ы не разрешены для этого типа", + "domain-names.wildcards-not-supported": "Wildcard'ы не поддерживаются этим CA", + "domains.force-ssl": "Force SSL", + "domains.hsts-enabled": "HSTS Enabled", + "domains.hsts-subdomains": "HSTS Sub-domains", + "domains.http2-support": "HTTP/2 Support", + "domains.use-dns": "Use DNS Challenge", + "email-address": "Email-адрес", + "empty-search": "No results found", + "empty-subtitle": "Why don't you create one?", + "enabled": "Включен", + "error.access.at-least-one": "Either one Authorization or one Access Rule is required", + "error.access.duplicate-usernames": "Authorization Usernames must be unique", + "error.invalid-auth": "Invalid email or password", + "error.invalid-domain": "Invalid domain: {domain}", + "error.invalid-email": "Invalid email address", + "error.max-character-length": "Maximum length is {max} character{max, plural, one {} other {s}}", + "error.max-domains": "Too many domains, max is {max}", + "error.maximum": "Maximum is {max}", + "error.min-character-length": "Minimum length is {min} character{min, plural, one {} other {s}}", + "error.minimum": "Minimum is {min}", + "error.passwords-must-match": "Passwords must match", + "error.required": "This is required", + "expires.on": "Истекает: {date}", + "footer.github-fork": "Fork me on Github", + "host.flags.block-exploits": "Block Common Exploits", + "host.flags.cache-assets": "Cache Assets", + "host.flags.preserve-path": "Preserve Path", + "host.flags.protocols": "Protocols", + "host.flags.websockets-upgrade": "Websockets Support", + "host.forward-port": "Forward Port", + "host.forward-scheme": "Scheme", + "hosts": "Хосты", + "http-only": "HTTP Only", + "lets-encrypt": "Let's Encrypt", + "lets-encrypt-via-dns": "Let's Encrypt через DNS", + "lets-encrypt-via-http": "Let's Encrypt через HTTP", + "loading": "Загрузка…", + "login.title": "Login to your account", + "nginx-config.label": "Custom Nginx Configuration", + "nginx-config.placeholder": "# Enter your custom Nginx configuration here at your own risk!", + "no-permission-error": "You do not have access to view this.", + "notfound.action": "Take me home", + "notfound.content": "We are sorry but the page you are looking for was not found", + "notfound.title": "Oops… You just found an error page", + "notification.error": "Ошибка", + "notification.object-deleted": "{object} удален", + "notification.object-disabled": "{object} выключен", + "notification.object-enabled": "{object} включен", + "notification.object-renewed": "{object} продлен", + "notification.object-saved": "{object} сохранен", + "notification.success": "Успешно", + "object.actions-title": "{object} #{id}", + "object.add": "Добавить {object}", + "object.delete": "Удалить {object}", + "object.delete.content": "Вы уверены, что хотите удалить {object}?", + "object.edit": "Изменить {object}", + "object.empty": "There are no {objects}", + "object.event.created": "Создан {object}", + "object.event.deleted": "Удален {object}", + "object.event.disabled": "Выключен {object}", + "object.event.enabled": "Включен {object}", + "object.event.renewed": "Продлен {object}", + "object.event.updated": "Обновлен {object}", + "offline": "Офлайн", + "online": "Онлайн", + "options": "Параметры", + "password": "Пароль", + "password.generate": "Сгенерировать случайный пароль", + "password.hide": "Скрыть пароль", + "password.show": "Показать пароль", + "permissions.hidden": "Hidden", + "permissions.manage": "Manage", + "permissions.view": "View Only", + "permissions.visibility.all": "All Items", + "permissions.visibility.title": "Item Visibility", + "permissions.visibility.user": "Created Items Only", + "proxy-host": "Прокси-хост", + "proxy-host.forward-host": "Forward Hostname / IP", + "proxy-hosts": "Прокси-хосты", + "proxy-hosts.count": "{count} {count, plural, one {прокси-хост} few {прокси-хоста} many {прокси-хостов} other {прокси-хоста}}", + "public": "Public", + "redirection-host": "Редирект-хост", + "redirection-host.forward-domain": "Forward Domain", + "redirection-hosts": "Редирект-хосты", + "redirection-hosts.count": "{count} {count, plural, one {редирект-хост} few {редирект-хоста} many {редирект-хостов} other {редирект-хоста}}", + "role.admin": "Администратор", + "role.standard-user": "Обычный пользователь", + "save": "Сохранить", + "setting": "Настройка", + "settings": "Настройки", + "settings.default-site": "Страница по умолчанию", + "settings.default-site.404": "404-страница", + "settings.default-site.444": "Нет ответа (444)", + "settings.default-site.congratulations": "Страница поздравления", + "settings.default-site.description": "Что показывать, когда Nginx получает неизвестный хост", + "settings.default-site.html": "Пользовательский HTML", + "settings.default-site.html.placeholder": "", + "settings.default-site.redirect": "Перенаправление", + "setup.preamble": "Get started by creating your admin account.", + "setup.title": "Welcome!", + "sign-in": "Sign in", + "ssl-certificate": "SSL-сертификат", + "stream": "Поток", + "stream.forward-host": "Forward Host", + "stream.incoming-port": "Incoming Port", + "streams": "Потоки", + "streams.count": "{count} {count, plural, one {поток} few {потока} many {потоков} other {потока}}", + "streams.tcp": "TCP", + "streams.udp": "UDP", + "test": "Test", + "user": "Пользователь", + "user.change-password": "Изменить пароль", + "user.confirm-password": "Подтвердить пароль", + "user.current-password": "Текущий пароль", + "user.edit-profile": "Edit Profile", + "user.full-name": "Полное имя", + "user.login-as": "Sign in as {name}", + "user.logout": "Logout", + "user.new-password": "Новый пароль", + "user.nickname": "Псевдоним", + "user.set-password": "Задать пароль", + "user.set-permissions": "Set Permissions for {name}", + "user.switch-dark": "Switch to Dark mode", + "user.switch-light": "Switch to Light mode", + "username": "Username", + "users": "Пользователи" +} \ No newline at end of file From 58182fcbdff37231fa82334d0d5211d0828e41b3 Mon Sep 17 00:00:00 2001 From: Alexey Krainev Date: Sat, 8 Nov 2025 15:08:08 +0500 Subject: [PATCH 2/4] Add Russian case --- frontend/src/locale/IntlProvider.tsx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/frontend/src/locale/IntlProvider.tsx b/frontend/src/locale/IntlProvider.tsx index c2779908e1..34f268d85b 100644 --- a/frontend/src/locale/IntlProvider.tsx +++ b/frontend/src/locale/IntlProvider.tsx @@ -1,15 +1,18 @@ import { createIntl, createIntlCache } from "react-intl"; import langEn from "./lang/en.json"; +import langRu from "./lang/ru.json"; import langList from "./lang/lang-list.json"; // first item of each array should be the language code, // not the country code // Remember when adding to this list, also update check-locales.js script -const localeOptions = [["en", "en-US"]]; +const localeOptions = [["en", "en-US"], ["ru", "ru-RU"]]; const loadMessages = (locale?: string): typeof langList & typeof langEn => { const thisLocale = locale || "en"; switch (thisLocale.slice(0, 2)) { + case "ru": + return Object.assign({}, langList, langRu); default: return Object.assign({}, langList, langEn); } @@ -17,6 +20,8 @@ const loadMessages = (locale?: string): typeof langList & typeof langEn => { const getFlagCodeForLocale = (locale?: string) => { switch (locale) { + case "ru": + return "RU"; default: return "EN"; } From 8fdb6091f3e67233f10a941160f88ef30abe220c Mon Sep 17 00:00:00 2001 From: Alexey Krainev Date: Sat, 8 Nov 2025 15:51:39 +0500 Subject: [PATCH 3/4] More strings --- frontend/src/locale/lang/ru.json | 138 +++++++++++++++---------------- 1 file changed, 69 insertions(+), 69 deletions(-) diff --git a/frontend/src/locale/lang/ru.json b/frontend/src/locale/lang/ru.json index db5f7fc5c4..06395025f8 100644 --- a/frontend/src/locale/lang/ru.json +++ b/frontend/src/locale/lang/ru.json @@ -5,20 +5,20 @@ "access-list.help-rules-last": "When at least 1 rule exists, this deny all rule will be added last", "access-list.help.rules-order": "Note that the allow and deny directives will be applied in the order they are defined.", "access-list.pass-auth": "Pass Auth to Upstream", - "access-list.public": "Publicly Accessible", - "access-list.public.subtitle": "No basic auth required", - "access-list.satisfy-any": "Satisfy Any", + "access-list.public": "Публично доступен", + "access-list.public.subtitle": "Без аутентификации", + "access-list.satisfy-any": "Любое соответствие", "access-list.subtitle": "{users} {users, plural, one {User} other {Users}}, {rules} {rules, plural, one {Rule} other {Rules}} - Created: {date}", "access-lists": "Списки доступа", "action.add": "Добавить", - "action.add-location": "Add Location", + "action.add-location": "Добавить маршрут", "action.close": "Закрыть", "action.delete": "Удалить", "action.disable": "Выключить", "action.download": "Скачать", "action.edit": "Изменить", "action.enable": "Включить", - "action.permissions": "Permissions", + "action.permissions": "Разрешения", "action.renew": "Продлить", "action.view-details": "Просмотреть детали", "auditlogs": "Audit Logs", @@ -28,13 +28,13 @@ "certificate.custom-certificate-key": "Ключ сертификата", "certificate.custom-intermediate": "Промежуточный сертификат", "certificate.in-use": "Используется", - "certificate.none.subtitle": "No certificate assigned", - "certificate.none.subtitle.for-http": "This host will not use HTTPS", + "certificate.none.subtitle": "Сертификат не назначен", + "certificate.none.subtitle.for-http": "Этот хост не будет использовать HTTPS", "certificate.none.title": "Нет", "certificate.not-in-use": "Не используется", "certificate.renew": "Продлить сертификат", "certificates": "Сертификаты", - "certificates.custom": "Пользовательский сертификат", + "certificates.custom": "Свой сертификат", "certificates.custom.warning": "Файлы ключей, защищённые паролем, не поддерживаются.", "certificates.dns.credentials": "Credentials File Content", "certificates.dns.credentials-note": "This plugin requires a configuration file containing an API token or other credentials for your provider", @@ -51,27 +51,27 @@ "certificates.http.reachability-wrong-data": "There is a server found at this domain but it returned an unexpected data. Is it the NPM server? Please make sure your domain points to the IP where your NPM instance is running.", "certificates.http.test-results": "Test Results", "certificates.http.warning": "These domains must be already configured to point to this installation.", - "certificates.request.subtitle": "с Let's Encrypt", - "certificates.request.title": "Request a new Certificate", + "certificates.request.subtitle": "через Let's Encrypt", + "certificates.request.title": "Получить новый сертификат", "column.access": "Доступ", - "column.authorization": "Authorization", - "column.authorizations": "Authorizations", - "column.custom-locations": "Custom Locations", - "column.destination": "Destination", + "column.authorization": "Авторизация", + "column.authorizations": "Авторизации", + "column.custom-locations": "Свои маршруты", + "column.destination": "Назначение", "column.details": "Детали", "column.email": "Email", "column.event": "Событие", "column.expires": "Истекает", "column.http-code": "Access", - "column.incoming-port": "Incoming Port", + "column.incoming-port": "Входящий порт", "column.name": "Имя", "column.protocol": "Протокол", "column.provider": "Провайдер", "column.roles": "Роли", "column.rules": "Правила", - "column.satisfy": "Satisfy", - "column.satisfy-all": "All", - "column.satisfy-any": "Any", + "column.satisfy": "Соответствие", + "column.satisfy-all": "Все", + "column.satisfy-any": "Любое", "column.scheme": "Схема", "column.source": "Источник", "column.ssl": "SSL", @@ -87,49 +87,49 @@ "domain-names.placeholder": "Начните ввод, чтобы добавить домен...", "domain-names.wildcards-not-permitted": "Wildcard'ы не разрешены для этого типа", "domain-names.wildcards-not-supported": "Wildcard'ы не поддерживаются этим CA", - "domains.force-ssl": "Force SSL", - "domains.hsts-enabled": "HSTS Enabled", - "domains.hsts-subdomains": "HSTS Sub-domains", - "domains.http2-support": "HTTP/2 Support", - "domains.use-dns": "Use DNS Challenge", + "domains.force-ssl": "Всегда SSL", + "domains.hsts-enabled": "Поддержка HSTS", + "domains.hsts-subdomains": "Поддомены HSTS", + "domains.http2-support": "Поддержка HTTP/2", + "domains.use-dns": "Использовать DNS Challenge", "email-address": "Email-адрес", - "empty-search": "No results found", - "empty-subtitle": "Why don't you create one?", + "empty-search": "Ничего не найдено", + "empty-subtitle": "Почему бы не создать его?", "enabled": "Включен", "error.access.at-least-one": "Either one Authorization or one Access Rule is required", "error.access.duplicate-usernames": "Authorization Usernames must be unique", - "error.invalid-auth": "Invalid email or password", - "error.invalid-domain": "Invalid domain: {domain}", - "error.invalid-email": "Invalid email address", + "error.invalid-auth": "Неверный email или пароль", + "error.invalid-domain": "Неверный домен: {domain}", + "error.invalid-email": "Неверный email-адрес", "error.max-character-length": "Maximum length is {max} character{max, plural, one {} other {s}}", - "error.max-domains": "Too many domains, max is {max}", - "error.maximum": "Maximum is {max}", + "error.max-domains": "Слишком много доменов, максимум {max}", + "error.maximum": "Максимум {max}", "error.min-character-length": "Minimum length is {min} character{min, plural, one {} other {s}}", - "error.minimum": "Minimum is {min}", - "error.passwords-must-match": "Passwords must match", - "error.required": "This is required", + "error.minimum": "Минимум {min}", + "error.passwords-must-match": "Пароли должны совпадать", + "error.required": "Обязательное поле", "expires.on": "Истекает: {date}", "footer.github-fork": "Fork me on Github", - "host.flags.block-exploits": "Block Common Exploits", - "host.flags.cache-assets": "Cache Assets", - "host.flags.preserve-path": "Preserve Path", - "host.flags.protocols": "Protocols", - "host.flags.websockets-upgrade": "Websockets Support", - "host.forward-port": "Forward Port", - "host.forward-scheme": "Scheme", + "host.flags.block-exploits": "Блокировать известные эксплойты", + "host.flags.cache-assets": "Кэшировать ресурсы", + "host.flags.preserve-path": "Сохранять путь", + "host.flags.protocols": "Протоколы", + "host.flags.websockets-upgrade": "Поддержка WebSocket", + "host.forward-port": "Порт перенаправления", + "host.forward-scheme": "Схема", "hosts": "Хосты", - "http-only": "HTTP Only", + "http-only": "Только HTTP", "lets-encrypt": "Let's Encrypt", "lets-encrypt-via-dns": "Let's Encrypt через DNS", "lets-encrypt-via-http": "Let's Encrypt через HTTP", "loading": "Загрузка…", - "login.title": "Login to your account", - "nginx-config.label": "Custom Nginx Configuration", - "nginx-config.placeholder": "# Enter your custom Nginx configuration here at your own risk!", + "login.title": "Авторизация", + "nginx-config.label": "Своя Nginx-конфигурация", + "nginx-config.placeholder": "# Введите здесь свою Nginx-конфигурацию, будьте осторожны!", "no-permission-error": "You do not have access to view this.", - "notfound.action": "Take me home", - "notfound.content": "We are sorry but the page you are looking for was not found", - "notfound.title": "Oops… You just found an error page", + "notfound.action": "Вернуться на главную", + "notfound.content": "Извините, но страница, которую вы ищете, не найдена", + "notfound.title": "Упс… Вы попали на страницу ошибки", "notification.error": "Ошибка", "notification.object-deleted": "{object} удален", "notification.object-disabled": "{object} выключен", @@ -142,7 +142,7 @@ "object.delete": "Удалить {object}", "object.delete.content": "Вы уверены, что хотите удалить {object}?", "object.edit": "Изменить {object}", - "object.empty": "There are no {objects}", + "object.empty": "Нет {objects}", "object.event.created": "Создан {object}", "object.event.deleted": "Удален {object}", "object.event.disabled": "Выключен {object}", @@ -156,19 +156,19 @@ "password.generate": "Сгенерировать случайный пароль", "password.hide": "Скрыть пароль", "password.show": "Показать пароль", - "permissions.hidden": "Hidden", - "permissions.manage": "Manage", - "permissions.view": "View Only", - "permissions.visibility.all": "All Items", - "permissions.visibility.title": "Item Visibility", - "permissions.visibility.user": "Created Items Only", + "permissions.hidden": "Скрыто", + "permissions.manage": "Управление", + "permissions.view": "Только просмотр", + "permissions.visibility.all": "Все элементы", + "permissions.visibility.title": "Видимость элементов", + "permissions.visibility.user": "Созданные элементы", "proxy-host": "Прокси-хост", - "proxy-host.forward-host": "Forward Hostname / IP", + "proxy-host.forward-host": "Хост/IP перенаправления", "proxy-hosts": "Прокси-хосты", "proxy-hosts.count": "{count} {count, plural, one {прокси-хост} few {прокси-хоста} many {прокси-хостов} other {прокси-хоста}}", - "public": "Public", + "public": "Публичный", "redirection-host": "Редирект-хост", - "redirection-host.forward-domain": "Forward Domain", + "redirection-host.forward-domain": "Домен перенаправления", "redirection-hosts": "Редирект-хосты", "redirection-hosts.count": "{count} {count, plural, one {редирект-хост} few {редирект-хоста} many {редирект-хостов} other {редирект-хоста}}", "role.admin": "Администратор", @@ -181,35 +181,35 @@ "settings.default-site.444": "Нет ответа (444)", "settings.default-site.congratulations": "Страница поздравления", "settings.default-site.description": "Что показывать, когда Nginx получает неизвестный хост", - "settings.default-site.html": "Пользовательский HTML", - "settings.default-site.html.placeholder": "", + "settings.default-site.html": "Свой HTML", + "settings.default-site.html.placeholder": "", "settings.default-site.redirect": "Перенаправление", - "setup.preamble": "Get started by creating your admin account.", - "setup.title": "Welcome!", - "sign-in": "Sign in", + "setup.preamble": "Начните с создания учётной записи администратора.", + "setup.title": "Добро пожаловать!", + "sign-in": "Войти", "ssl-certificate": "SSL-сертификат", "stream": "Поток", - "stream.forward-host": "Forward Host", - "stream.incoming-port": "Incoming Port", + "stream.forward-host": "Хост перенаправления", + "stream.incoming-port": "Входящий порт", "streams": "Потоки", "streams.count": "{count} {count, plural, one {поток} few {потока} many {потоков} other {потока}}", "streams.tcp": "TCP", "streams.udp": "UDP", - "test": "Test", + "test": "Проверить", "user": "Пользователь", "user.change-password": "Изменить пароль", "user.confirm-password": "Подтвердить пароль", "user.current-password": "Текущий пароль", - "user.edit-profile": "Edit Profile", + "user.edit-profile": "Изменить профиль", "user.full-name": "Полное имя", - "user.login-as": "Sign in as {name}", - "user.logout": "Logout", + "user.login-as": "Войти как {name}", + "user.logout": "Выйти", "user.new-password": "Новый пароль", "user.nickname": "Псевдоним", "user.set-password": "Задать пароль", "user.set-permissions": "Set Permissions for {name}", "user.switch-dark": "Switch to Dark mode", "user.switch-light": "Switch to Light mode", - "username": "Username", + "username": "Логин", "users": "Пользователи" } \ No newline at end of file From 5aa56c63d42bed41ca8a72f2a3a3fb1f0a990449 Mon Sep 17 00:00:00 2001 From: Alexey Krainev Date: Sat, 8 Nov 2025 17:15:24 +0500 Subject: [PATCH 4/4] Fixes & New Strings --- frontend/src/locale/lang/ru.json | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/frontend/src/locale/lang/ru.json b/frontend/src/locale/lang/ru.json index 06395025f8..a6360a6763 100644 --- a/frontend/src/locale/lang/ru.json +++ b/frontend/src/locale/lang/ru.json @@ -7,7 +7,7 @@ "access-list.pass-auth": "Pass Auth to Upstream", "access-list.public": "Публично доступен", "access-list.public.subtitle": "Без аутентификации", - "access-list.satisfy-any": "Любое соответствие", + "access-list.satisfy-any": "Любое совпадение", "access-list.subtitle": "{users} {users, plural, one {User} other {Users}}, {rules} {rules, plural, one {Rule} other {Rules}} - Created: {date}", "access-lists": "Списки доступа", "action.add": "Добавить", @@ -21,7 +21,7 @@ "action.permissions": "Разрешения", "action.renew": "Продлить", "action.view-details": "Просмотреть детали", - "auditlogs": "Audit Logs", + "auditlogs": "Журнал аудита", "cancel": "Отменить", "certificate": "Сертификат", "certificate.custom-certificate": "Сертификат", @@ -49,7 +49,7 @@ "certificates.http.reachability-ok": "Your server is reachable and creating certificates should be possible.", "certificates.http.reachability-other": "There is a server found at this domain but it returned an unexpected status code {code}. Is it the NPM server? Please make sure your domain points to the IP where your NPM instance is running.", "certificates.http.reachability-wrong-data": "There is a server found at this domain but it returned an unexpected data. Is it the NPM server? Please make sure your domain points to the IP where your NPM instance is running.", - "certificates.http.test-results": "Test Results", + "certificates.http.test-results": "Результаты проверки", "certificates.http.warning": "These domains must be already configured to point to this installation.", "certificates.request.subtitle": "через Let's Encrypt", "certificates.request.title": "Получить новый сертификат", @@ -69,7 +69,7 @@ "column.provider": "Провайдер", "column.roles": "Роли", "column.rules": "Правила", - "column.satisfy": "Соответствие", + "column.satisfy": "Совпадение", "column.satisfy-all": "Все", "column.satisfy-any": "Любое", "column.scheme": "Схема", @@ -80,7 +80,7 @@ "dashboard": "Обзор", "dead-host": "404-хост", "dead-hosts": "404-хосты", - "dead-hosts.count": "{count} {count, plural, one {404 Host} other {404 Hosts}}", + "dead-hosts.count": "{count} {count, plural, one {404-хост} few {404-хоста} many {404-хостов} other {404-хоста}}", "disabled": "Выключен", "domain-names": "Домены", "domain-names.max": "Максимум доменов: {count}", @@ -142,13 +142,13 @@ "object.delete": "Удалить {object}", "object.delete.content": "Вы уверены, что хотите удалить {object}?", "object.edit": "Изменить {object}", - "object.empty": "Нет {objects}", - "object.event.created": "Создан {object}", - "object.event.deleted": "Удален {object}", - "object.event.disabled": "Выключен {object}", - "object.event.enabled": "Включен {object}", - "object.event.renewed": "Продлен {object}", - "object.event.updated": "Обновлен {object}", + "object.empty": "{objects} отстутствуют", + "object.event.created": "{object} создан", + "object.event.deleted": "{object} удален", + "object.event.disabled": "{object} выключен", + "object.event.enabled": "{object} включен", + "object.event.renewed": "{object} продлен", + "object.event.updated": "{object} обновлен", "offline": "Офлайн", "online": "Онлайн", "options": "Параметры", @@ -163,7 +163,7 @@ "permissions.visibility.title": "Видимость элементов", "permissions.visibility.user": "Созданные элементы", "proxy-host": "Прокси-хост", - "proxy-host.forward-host": "Хост/IP перенаправления", + "proxy-host.forward-host": "Хост / IP перенаправления", "proxy-hosts": "Прокси-хосты", "proxy-hosts.count": "{count} {count, plural, one {прокси-хост} few {прокси-хоста} many {прокси-хостов} other {прокси-хоста}}", "public": "Публичный", @@ -198,7 +198,7 @@ "test": "Проверить", "user": "Пользователь", "user.change-password": "Изменить пароль", - "user.confirm-password": "Подтвердить пароль", + "user.confirm-password": "Повторите пароль", "user.current-password": "Текущий пароль", "user.edit-profile": "Изменить профиль", "user.full-name": "Полное имя", @@ -208,8 +208,8 @@ "user.nickname": "Псевдоним", "user.set-password": "Задать пароль", "user.set-permissions": "Set Permissions for {name}", - "user.switch-dark": "Switch to Dark mode", - "user.switch-light": "Switch to Light mode", + "user.switch-dark": "Включить тёмную тему", + "user.switch-light": "Включить светлую тему", "username": "Логин", "users": "Пользователи" } \ No newline at end of file