diff --git a/.github/auto_translator.py b/.github/auto_translator.py index 86d70bf6..3bf501b2 100644 --- a/.github/auto_translator.py +++ b/.github/auto_translator.py @@ -44,4 +44,4 @@ if __name__ == "__main__": recursive_translate(src_pofile, dst_pofile, translator) with open(get_path(dst), 'w') as df: - json.dump(dst_pofile, df) + json.dump(dst_pofile, df, ensure_ascii=False, indent=4) diff --git a/.github/sync_translate.sh b/.github/sync_translate.sh index 2e42bfab..1b0ea0b0 100644 --- a/.github/sync_translate.sh +++ b/.github/sync_translate.sh @@ -1,9 +1,9 @@ key="FRu3eopQWgsvWmnycBXxv2eWpbUwGOu2" -wget -O assets/translations/strings.i18n.json "https://localise.biz/api/export/locale/en-US.json?index=id&format=i18next4&key=$key" -wget -O assets/translations/strings_fa.i18n.json "https://localise.biz/api/export/locale/fa.json?index=id&format=i18next4&key=$key" -# wget -O assets/translations/strings_zh.i18n.json "https://localise.biz/api/export/locale/zh.json?index=id&format=i18next4&key=$key" -# wget -O assets/translations/strings_pt.i18n.json "https://localise.biz/api/export/locale/pt.json?index=id&format=i18next4&key=$key" -wget -O assets/translations/strings_ru.i18n.json "https://localise.biz/api/export/locale/ru.json?index=id&format=i18next4&key=$key" +wget -O ../assets/translations/strings.i18n.json "https://localise.biz/api/export/locale/en-US.json?index=id&format=i18next4&key=$key" +wget -O ../assets/translations/strings_fa.i18n.json "https://localise.biz/api/export/locale/fa.json?index=id&format=i18next4&key=$key" +# # wget -O assets/translations/strings_zh.i18n.json "https://localise.biz/api/export/locale/zh.json?index=id&format=i18next4&key=$key" +# # wget -O assets/translations/strings_pt.i18n.json "https://localise.biz/api/export/locale/pt.json?index=id&format=i18next4&key=$key" +wget -O ../assets/translations/strings_ru.i18n.json "https://localise.biz/api/export/locale/ru.json?index=id&format=i18next4&key=$key" pip install polib deep-translator python-i18n @@ -23,7 +23,7 @@ function update_localise(){ pat="../assets/translations/strings.i18n.json" fi # curl -X POST "https://localise.biz/api/import/json?locale=$lang&key=$LOCALIZ_KEY" \ -curl "https://localise.biz/api/import/json?format=i18next4&delete-absent=false&ignore-existing=false&locale=$lang&flag-new=Provisional&key=$LOCALIZ_KEY" \ +curl "https://localise.biz/api/import/json?format=i18next4&delete-absent=true&ignore-existing=false&locale=$lang&flag-new=Provisional&key=$LOCALIZ_KEY" \ -H 'Accept: application/json' \ --data-binary @$pat } @@ -31,6 +31,6 @@ curl "https://localise.biz/api/import/json?format=i18next4&delete-absent=false&i update_localise en update_localise fa -# # update_localise zh -# # update_localise pt +# # # update_localise zh +# # # update_localise pt update_localise ru \ No newline at end of file diff --git a/Makefile b/Makefile index 205d36c4..fb2a8b57 100644 --- a/Makefile +++ b/Makefile @@ -32,8 +32,8 @@ translate: dart run slang sync_translate: - - + cd .github && bash sync_translate.sh + make translate android-release: android-apk-release diff --git a/assets/translations/strings.i18n.json b/assets/translations/strings.i18n.json index 6f1ac492..3510f0c8 100644 --- a/assets/translations/strings.i18n.json +++ b/assets/translations/strings.i18n.json @@ -240,15 +240,15 @@ "profiles": { "unexpected": "Unexpected Error", "notFound": "Profile Not Found", - "invalidUrl": "Invalid URL", - "invalidConfig": "Invalid Configs" + "invalidConfig": "Invalid Configs", + "invalidUrl": "Invalid URL" }, "connection": { "unexpected": "Unexpected connection error", "timeout": "Connection timeout", - "badCertificate": "Bad certificate", "badResponse": "Bad response", - "connectionError": "Connection error" + "connectionError": "Connection error", + "badCertificate": "Bad certificate" } } -} \ No newline at end of file +} diff --git a/assets/translations/strings_fa.i18n.json b/assets/translations/strings_fa.i18n.json index cb34ee84..1c3c0a6d 100644 --- a/assets/translations/strings_fa.i18n.json +++ b/assets/translations/strings_fa.i18n.json @@ -240,15 +240,15 @@ "profiles": { "unexpected": "خطای غیرمنتظره", "notFound": "پروفایل یافت نشد", - "invalidUrl": "لینک نامعتبر", - "invalidConfig": "کانفیگ غیر معتبر" + "invalidConfig": "کانفیگ غیر معتبر", + "invalidUrl": "لینک نامعتبر" }, "connection": { "unexpected": " خطای غیرمنتظره در اتصال", "timeout": "درخواست بیش از حد مجاز زمان برد", - "badCertificate": "خطای اعتبار سنجی", "badResponse": "پاسخ نامعتبر", - "connectionError": "خطای اتصال" + "connectionError": "خطای اتصال", + "badCertificate": "خطای اعتبار سنجی" } } } \ No newline at end of file diff --git a/assets/translations/strings_ru.i18n.json b/assets/translations/strings_ru.i18n.json new file mode 100644 index 00000000..5b73ab7c --- /dev/null +++ b/assets/translations/strings_ru.i18n.json @@ -0,0 +1,254 @@ +{ + "general": { + "appTitle": "HiddifyNext", + "reset": "Сбросить", + "toggle": { + "enabled": "Включено", + "disabled": "Неполноценный" + }, + "state": { + "disable": "Запрещать" + }, + "sort": "Сортировать", + "sortBy": "Сортировать по" + }, + "intro": { + "termsAndPolicyCaution(rich)": "продолжая, вы соглашаетесь с ${tap(@:about.termsAndConditions)}", + "start": "Начинать" + }, + "home": { + "pageTitle": "Дом", + "emptyProfilesMsg": "Начните с добавления профиля подписки", + "noActiveProfileMsg": "Выберите профиль", + "connection": { + "tapToConnect": "Нажмите, для подключения", + "connecting": "Подключение", + "disconnecting": "Отключение", + "connected": "Подключен" + }, + "stats": { + "traffic": "Скорость", + "trafficTotal": "Всего", + "uplink": "восходящая линия связи", + "downlink": "Нисходящая линия связи" + } + }, + "profile": { + "overviewPageTitle": "Профили", + "detailsPageTitle": "Профиль", + "activeProfileNameSemanticLabel": "Имя активного профиля: «${name}».", + "activeProfileBtnSemanticLabel": "Посмотреть все профили.", + "nonActiveProfileBtnSemanticLabel": "Выберите «${name}» в качестве активного профиля.", + "subscription": { + "traffic": "Трафик", + "updatedTimeAgo": "Обновлено ${timeago}", + "remainingDuration": "Осталось ${duration} дней", + "remainingTrafficSemanticLabel": "${consumed} из ${total} потребленного трафика.", + "expired": "Истекший", + "noTraffic": "Больше никакого трафика" + }, + "sortBy": { + "lastUpdate": "Недавно обновленный", + "name": "По алфавиту" + }, + "add": { + "buttonText": "Новый профиль", + "shortBtnTxt": "Новый профиль", + "fromClipboard": "Добавить из буфера обмена", + "scanQr": "Сканировать QR-код", + "manually": "Ручной ввод", + "addingProfileMsg": "Добавление профиля", + "failureMsg": "Не удалось добавить профиль" + }, + "update": { + "buttonTxt": "Обновить", + "tooltip": "Обновить профиль", + "failureMsg": "Ошибка обновления: ${reason}", + "successMsg": "Профиль успешно обновлен" + }, + "edit": { + "buttonTxt": "Редактировать", + "selectActiveTxt": "Выберите активный профиль" + }, + "delete": { + "buttonTxt": "Удалить", + "confirmationMsg": "Удалить профиль навсегда?", + "successMsg": "Профиль успешно удален" + }, + "save": { + "buttonText": "Сохранить", + "successMsg": "Профиль успешно сохранен", + "failureMsg": "Не удалось сохранить профиль" + }, + "detailsForm": { + "nameLabel": "Имя", + "nameHint": "Имя профиля", + "urlLabel": "URL-адрес", + "urlHint": "Полный URL-адрес конфигурации", + "emptyNameMsg": "Поле \"Имя\" обязательно", + "invalidUrlMsg": "Неверная ссылка", + "lastUpdate": "Последнее обновление", + "updateInterval": "Автоматическое обновление", + "updateIntervalDialogTitle": "Интервал автоматического обновления (в часах)" + } + }, + "proxies": { + "pageTitle": "Прокси", + "emptyProxiesMsg": "Нет доступных прокси", + "delayTestTooltip": "Задержка тестирования", + "sortTooltip": "Сортировка прокси", + "sortOptions": { + "unsorted": "По умолчанию", + "name": "По алфавиту", + "delay": "По задержке" + } + }, + "logs": { + "pageTitle": "Логи", + "clearLogsButtonText": "Очистить логи", + "filterHint": "Фильтр", + "allLevelsFilter": "Все", + "shareCoreLogs": "Поделиться логами ядра", + "shareAppLogs": "Делиться логами приложения" + }, + "settings": { + "pageTitle": "Настройки", + "requiresRestartMsg": "Чтобы это вступило в силу, перезапустите приложение.", + "general": { + "sectionTitle": "Общий", + "locale": "Язык", + "region": "Регион", + "regionMsg": "Помогает установить параметры по умолчанию для обхода внутренних адресов.", + "regions": { + "ir": "Иран (ir)", + "cn": "Китай (cn)", + "other": "Другой" + }, + "themeMode": "Тематический режим", + "themeModes": { + "system": "Системная тема", + "dark": "Темная тема", + "light": "Светлая тема" + }, + "enableAnalytics": "Включить аналитику", + "enableAnalyticsMsg": "Разрешите собирать аналитику и отправлять отчеты о сбоях для улучшения приложения.", + "trueBlack": "Чистый черный", + "autoStart": "Запуск при загрузке", + "silentStart": "Тихий старт", + "openWorkingDir": "Открыть рабочий каталог", + "ignoreBatteryOptimizations": "Отключить оптимизацию батареи", + "ignoreBatteryOptimizationsMsg": "Снимите ограничения для оптимальной производительности VPN." + }, + "advanced": { + "sectionTitle": "Передовой", + "debugMode": "Режим отладки", + "debugModeMsg": "Перезапустите приложение, чтобы применить это изменение." + }, + "network": { + "perAppProxyPageTitle": "Прокси для каждого приложения", + "perAppProxyModes": { + "off": "Все", + "offMsg": "Проксировать все приложения", + "include": "Прокси", + "includeMsg": "Проксировать только выбранные приложения", + "exclude": "Обход", + "excludeMsg": "Не использовать проксирование выбранных приложений" + }, + "showSystemApps": "Показать системные приложения", + "hideSystemApps": "Скрыть системные приложения", + "clearSelection": "Очистить выбор" + }, + "config": { + "section": { + "route": "Варианты маршрута", + "dns": "Параметры DNS", + "inbound": "Входящие параметры", + "misc": "Разные параметры" + }, + "pageTitle": "Параметры конфигурации", + "executeConfigAsIs": "Выполнить конфигурацию как есть", + "executeConfigAsIsMsg": "Выполняет конфигурации SingBox с минимальными изменениями.", + "logLevel": "Уровень логов", + "resolveDestination": "Определить пункт назначения", + "ipv6Mode": "IPv6-маршрут", + "ipv6Modes": { + "disable": "Запрещать", + "enable": "Давать возможность", + "prefer": "Предпочтительный", + "only": "Эксклюзивный" + }, + "remoteDnsAddress": "Удаленный DNS", + "remoteDnsDomainStrategy": "Стратегия удаленного домена DNS", + "directDnsAddress": "Прямой DNS", + "directDnsDomainStrategy": "Стратегия прямого домена DNS", + "mixedPort": "Смешанный порт", + "localDnsPort": "Локальный DNS-порт", + "tunImplementation": "Реализация TUN", + "mtu": "MTU", + "connectionTestUrl": "URL-адрес проверки подключения", + "urlTestInterval": "Интервал проверки URL-адреса", + "enableClashApi": "Включить Clash API", + "clashApiPort": "Порт Clash API", + "enableTun": "Включить TUN", + "setSystemProxy": "Установить системный прокси" + } + }, + "about": { + "pageTitle": "О", + "version": "Версия", + "sourceCode": "Исходный код", + "telegramChannel": "Телеграм-канал", + "checkForUpdate": "Проверить обновления", + "privacyPolicy": "Политика конфиденциальности", + "termsAndConditions": "Условия и положения" + }, + "appUpdate": { + "notAvailableMsg": "Уже пользуюсь последней версией", + "dialogTitle": "Доступно обновление", + "updateMsg": "Доступна новая версия @:general.appTitle. Хотите обновить сейчас?", + "currentVersionLbl": "Текущая версия", + "newVersionLbl": "Новая версия", + "updateNowBtnTxt": "Обновить сейчас", + "laterBtnTxt": "Позже", + "ignoreBtnTxt": "Игнорировать" + }, + "tray": { + "dashboard": "Панель", + "quit": "Покидать", + "systemProxy": "Системный прокси" + }, + "failure": { + "unexpected": "Неожиданная ошибка", + "clash": { + "unexpected": "Неожиданная ошибка", + "core": "Ошибка конфликта ${reason}" + }, + "singbox": { + "unexpected": "Неожиданная ошибка службы", + "serviceNotRunning": "Служба не запущена", + "invalidConfigOptions": "Неверные параметры конфигурации", + "invalidConfig": "Неверная конфигурация", + "create": "Ошибка создания сервиса", + "start": "Ошибка запуска службы" + }, + "connectivity": { + "unexpected": "Неожиданный провал", + "missingVpnPermission": "Отсутствует разрешение VPN", + "missingNotificationPermission": "Отсутствует разрешение на уведомление", + "core": "Основная ошибка" + }, + "profiles": { + "unexpected": "Неожиданная ошибка", + "notFound": "Профиль не найден", + "invalidConfig": "Неверная конфигурация", + "invalidUrl": "Неверная ссылка" + }, + "connection": { + "unexpected": "Неожиданная ошибка подключения", + "timeout": "Время соединения вышло", + "badResponse": "Плохой ответ", + "connectionError": "Ошибка подключения", + "badCertificate": "Плохой сертификат" + } + } +} \ No newline at end of file