- Create StepTracker context manager in new report.py module - Track each step of lifecycle operations (install, update, start, stop, enable, disable, status, remove) with begin/done markers - On success: report lists all completed steps with ✓ icons - On failure: report shows failed step (✗), completed steps before failure (✓), and pending steps that never started (○) - Add translations for report header, status labels, and registry step names in all 5 supported languages (EN/BG/DE/RU/ZH) - 105 tests, 100% coverage, pyright clean, ruff clean
484 lines
23 KiB
Python
484 lines
23 KiB
Python
"""Simple i18n for GRM console messages.
|
||
|
||
Set GRM_LANG environment variable to override the default English.
|
||
Supported: en, bg, de, ru, zh.
|
||
"""
|
||
|
||
from __future__ import annotations
|
||
|
||
import os
|
||
|
||
TRANSLATIONS: dict[str, dict[str, str]] = {
|
||
"Installing Gitea Runner on {host}": {
|
||
"en": "Installing Gitea Runner on {host}",
|
||
"bg": "Инсталиране на Gitea Runner на {host}",
|
||
"de": "Gitea Runner wird auf {host} installiert",
|
||
"ru": "Установка Gitea Runner на {host}",
|
||
"zh": "正在 {host} 上安装 Gitea Runner",
|
||
},
|
||
"Updating Gitea Runner on {host}": {
|
||
"en": "Updating Gitea Runner on {host}",
|
||
"bg": "Актуализиране на Gitea Runner на {host}",
|
||
"de": "Gitea Runner wird auf {host} aktualisiert",
|
||
"ru": "Обновление Gitea Runner на {host}",
|
||
"zh": "正在 {host} 上更新 Gitea Runner",
|
||
},
|
||
"Running Ansible playbook": {
|
||
"en": "Running Ansible playbook",
|
||
"bg": "Изпълнение на Ansible playbook",
|
||
"de": "Ansible-Playbook wird ausgeführt",
|
||
"ru": "Выполнение Ansible playbook",
|
||
"zh": "正在运行 Ansible playbook",
|
||
},
|
||
"Full log: {log_file}": {
|
||
"en": "Full log: {log_file}",
|
||
"bg": "Пълен лог: {log_file}",
|
||
"de": "Vollständiges Log: {log_file}",
|
||
"ru": "Полный лог: {log_file}",
|
||
"zh": "完整日志: {log_file}",
|
||
},
|
||
"Done. See full log: {log_file}": {
|
||
"en": "Done. See full log: {log_file}",
|
||
"bg": "Готово. Вижте пълния лог: {log_file}",
|
||
"de": "Fertig. Siehe vollständiges Log: {log_file}",
|
||
"ru": "Готово. См. полный лог: {log_file}",
|
||
"zh": "完成。查看完整日志: {log_file}",
|
||
},
|
||
"Ansible failed with exit code {code}. See full log: {log_file}": {
|
||
"en": "Ansible failed with exit code {code}. See full log: {log_file}",
|
||
"bg": "Ansible е неуспешен с код {code}. Вижте пълния лог: {log_file}",
|
||
"de": "Ansible fehlgeschlagen mit Exit-Code {code}. Siehe Log: {log_file}",
|
||
"ru": "Ansible завершился с кодом {code}. См. лог: {log_file}",
|
||
"zh": "Ansible 失败,退出码 {code}。查看日志: {log_file}",
|
||
},
|
||
"GITEA_REGISTRATION_TOKEN must be set (or pass --token)": {
|
||
"en": "GITEA_REGISTRATION_TOKEN must be set (or pass --token)",
|
||
"bg": "GITEA_REGISTRATION_TOKEN трябва да е зададен (или подайте --token)",
|
||
"de": "GITEA_REGISTRATION_TOKEN muss gesetzt sein (oder --token übergeben)",
|
||
"ru": "GITEA_REGISTRATION_TOKEN должен быть задан (или передайте --token)",
|
||
"zh": "必须设置 GITEA_REGISTRATION_TOKEN(或传递 --token)",
|
||
},
|
||
"Playbook not found: {playbook}": {
|
||
"en": "Playbook not found: {playbook}",
|
||
"bg": "Playbook не е намерен: {playbook}",
|
||
"de": "Playbook nicht gefunden: {playbook}",
|
||
"ru": "Playbook не найден: {playbook}",
|
||
"zh": "未找到 Playbook: {playbook}",
|
||
},
|
||
"GITEA_URL must be set (or pass --url)": {
|
||
"en": "GITEA_URL must be set (or pass --url)",
|
||
"bg": "GITEA_URL трябва да е зададен (или подайте --url)",
|
||
"de": "GITEA_URL muss gesetzt sein (oder --url übergeben)",
|
||
"ru": "GITEA_URL должен быть задан (или передайте --url)",
|
||
"zh": "必须设置 GITEA_URL(或传递 --url)",
|
||
},
|
||
"Installation failed: {error}": {
|
||
"en": "Installation failed: {error}",
|
||
"bg": "Инсталацията неуспешна: {error}",
|
||
"de": "Installation fehlgeschlagen: {error}",
|
||
"ru": "Установка не удалась: {error}",
|
||
"zh": "安装失败: {error}",
|
||
},
|
||
"Update failed: {error}": {
|
||
"en": "Update failed: {error}",
|
||
"bg": "Актуализацията неуспешна: {error}",
|
||
"de": "Update fehlgeschlagen: {error}",
|
||
"ru": "Обновление не удалось: {error}",
|
||
"zh": "更新失败: {error}",
|
||
},
|
||
"SSH user": {
|
||
"en": "SSH user",
|
||
"bg": "SSH потребител",
|
||
"de": "SSH-Benutzer",
|
||
"ru": "SSH пользователь",
|
||
"zh": "SSH 用户",
|
||
},
|
||
"Path to SSH private key": {
|
||
"en": "Path to SSH private key",
|
||
"bg": "Път към SSH частен ключ",
|
||
"de": "Pfad zum SSH-Private-Key",
|
||
"ru": "Путь к SSH приватному ключу",
|
||
"zh": "SSH 私钥路径",
|
||
},
|
||
"Gitea Runner name (default: host)": {
|
||
"en": "Gitea Runner name (default: host)",
|
||
"bg": "Име на Gitea Runner (по подразбиране: host)",
|
||
"de": "Gitea Runner-Name (Standard: host)",
|
||
"ru": "Имя Gitea Runner (по умолчанию: host)",
|
||
"zh": "Gitea Runner 名称(默认: host)",
|
||
},
|
||
"Registration token (env: GITEA_REGISTRATION_TOKEN)": {
|
||
"en": "Registration token (env: GITEA_REGISTRATION_TOKEN)",
|
||
"bg": "Регистрационен токен (env: GITEA_REGISTRATION_TOKEN)",
|
||
"de": "Registrierungstoken (env: GITEA_REGISTRATION_TOKEN)",
|
||
"ru": "Токен регистрации (env: GITEA_REGISTRATION_TOKEN)",
|
||
"zh": "注册令牌(环境变量: GITEA_REGISTRATION_TOKEN)",
|
||
},
|
||
"Gitea Runner deployment mode (default: docker)": {
|
||
"en": "Gitea Runner deployment mode (default: docker)",
|
||
"bg": "Режим на разполагане на Gitea Runner (по подразбиране: docker)",
|
||
"de": "Gitea Runner-Bereitstellungsmodus (Standard: docker)",
|
||
"ru": "Режим развёртывания Gitea Runner (по умолчанию: docker)",
|
||
"zh": "Gitea Runner 部署模式(默认: docker)",
|
||
},
|
||
"Gitea admin API token for integration test (env: GITEA_ADMIN_TOKEN)": {
|
||
"en": "Gitea admin API token for integration test (env: GITEA_ADMIN_TOKEN)",
|
||
"bg": "Gitea admin API токен за интеграционен тест (env: GITEA_ADMIN_TOKEN)",
|
||
"de": "Gitea-Admin-API-Token für Integrationstest (env: GITEA_ADMIN_TOKEN)",
|
||
"ru": "Токен админ API Gitea для интеграционного теста (env: GITEA_ADMIN_TOKEN)",
|
||
"zh": "Gitea 管理员 API 令牌,用于集成测试(环境变量: GITEA_ADMIN_TOKEN)",
|
||
},
|
||
"Integration test API retries (default: 3, env: GITEA_INTEGRATION_RETRIES)": {
|
||
"en": "Integration test API retries (default: 3, env: GITEA_INTEGRATION_RETRIES)",
|
||
"bg": "Повторни опити за интеграционен тест API (по подразбиране: 3, env: GITEA_INTEGRATION_RETRIES)",
|
||
"de": "API-Wiederholungen für Integrationstest (Standard: 3, env: GITEA_INTEGRATION_RETRIES)",
|
||
"ru": "Повторы API интеграционного теста (по умолчанию: 3, env: GITEA_INTEGRATION_RETRIES)",
|
||
"zh": "集成测试 API 重试次数(默认: 3,环境变量: GITEA_INTEGRATION_RETRIES)",
|
||
},
|
||
"Prompt for sudo password": {
|
||
"en": "Prompt for sudo password",
|
||
"bg": "Подканване за sudo парола",
|
||
"de": "Nach sudo-Passwort fragen",
|
||
"ru": "Запросить пароль sudo",
|
||
"zh": "提示输入 sudo 密码",
|
||
},
|
||
"Specific Gitea Runner version": {
|
||
"en": "Specific Gitea Runner version",
|
||
"bg": "Конкретна версия на Gitea Runner",
|
||
"de": "Spezifische Gitea Runner-Version",
|
||
"ru": "Конкретная версия Gitea Runner",
|
||
"zh": "指定 Gitea Runner 版本",
|
||
},
|
||
"Install and configure a Gitea Runner on a remote host.": {
|
||
"en": "Install and configure a Gitea Runner on a remote host.",
|
||
"bg": "Инсталиране и конфигуриране на Gitea Runner на отдалечен хост.",
|
||
"de": "Gitea Runner auf einem Remote-Host installieren und konfigurieren.",
|
||
"ru": "Установить и настроить Gitea Runner на удалённом хосте.",
|
||
"zh": "在远程主机上安装并配置 Gitea Runner。",
|
||
},
|
||
"Update the Gitea Runner binary on a remote host.": {
|
||
"en": "Update the Gitea Runner binary on a remote host.",
|
||
"bg": "Актуализиране на Gitea Runner двоичния файл на отдалечен хост.",
|
||
"de": "Gitea Runner-Binary auf einem Remote-Host aktualisieren.",
|
||
"ru": "Обновить бинарный файл Gitea Runner на удалённом хосте.",
|
||
"zh": "在远程主机上更新 Gitea Runner 二进制文件。",
|
||
},
|
||
"Starting Gitea Runner {name} on {host}": {
|
||
"en": "Starting Gitea Runner {name} on {host}",
|
||
"bg": "Стартиране на Gitea Runner {name} на {host}",
|
||
"de": "Starte Gitea Runner {name} auf {host}",
|
||
"ru": "Запуск Gitea Runner {name} на {host}",
|
||
"zh": "正在 {host} 上启动 Gitea Runner {name}",
|
||
},
|
||
"Stopping Gitea Runner {name} on {host}": {
|
||
"en": "Stopping Gitea Runner {name} on {host}",
|
||
"bg": "Спиране на Gitea Runner {name} на {host}",
|
||
"de": "Stoppe Gitea Runner {name} auf {host}",
|
||
"ru": "Остановка Gitea Runner {name} на {host}",
|
||
"zh": "正在 {host} 上停止 Gitea Runner {name}",
|
||
},
|
||
"Enabling Gitea Runner {name} on {host}": {
|
||
"en": "Enabling Gitea Runner {name} on {host}",
|
||
"bg": "Активиране на Gitea Runner {name} на {host}",
|
||
"de": "Aktiviere Gitea Runner {name} auf {host}",
|
||
"ru": "Включение Gitea Runner {name} на {host}",
|
||
"zh": "正在 {host} 上启用 Gitea Runner {name}",
|
||
},
|
||
"Disabling Gitea Runner {name} on {host}": {
|
||
"en": "Disabling Gitea Runner {name} on {host}",
|
||
"bg": "Деактивиране на Gitea Runner {name} на {host}",
|
||
"de": "Deaktiviere Gitea Runner {name} auf {host}",
|
||
"ru": "Отключение Gitea Runner {name} на {host}",
|
||
"zh": "正在 {host} 上禁用 Gitea Runner {name}",
|
||
},
|
||
"Checking status of Gitea Runner {name} on {host}": {
|
||
"en": "Checking status of Gitea Runner {name} on {host}",
|
||
"bg": "Проверка на състоянието на Gitea Runner {name} на {host}",
|
||
"de": "Prüfe Status von Gitea Runner {name} auf {host}",
|
||
"ru": "Проверка состояния Gitea Runner {name} на {host}",
|
||
"zh": "正在检查 {host} 上 Gitea Runner {name} 的状态",
|
||
},
|
||
"Removing Gitea Runner {name} from {host}": {
|
||
"en": "Removing Gitea Runner {name} from {host}",
|
||
"bg": "Премахване на Gitea Runner {name} от {host}",
|
||
"de": "Entferne Gitea Runner {name} von {host}",
|
||
"ru": "Удаление Gitea Runner {name} с {host}",
|
||
"zh": "正在从 {host} 移除 Gitea Runner {name}",
|
||
},
|
||
"Start failed: {error}": {
|
||
"en": "Start failed: {error}",
|
||
"bg": "Стартирането неуспешно: {error}",
|
||
"de": "Start fehlgeschlagen: {error}",
|
||
"ru": "Запуск не удался: {error}",
|
||
"zh": "启动失败: {error}",
|
||
},
|
||
"Stop failed: {error}": {
|
||
"en": "Stop failed: {error}",
|
||
"bg": "Спирането неуспешно: {error}",
|
||
"de": "Stop fehlgeschlagen: {error}",
|
||
"ru": "Остановка не удалась: {error}",
|
||
"zh": "停止失败: {error}",
|
||
},
|
||
"Enable failed: {error}": {
|
||
"en": "Enable failed: {error}",
|
||
"bg": "Активирането неуспешно: {error}",
|
||
"de": "Aktivierung fehlgeschlagen: {error}",
|
||
"ru": "Включение не удалось: {error}",
|
||
"zh": "启用失败: {error}",
|
||
},
|
||
"Disable failed: {error}": {
|
||
"en": "Disable failed: {error}",
|
||
"bg": "Деактивирането неуспешно: {error}",
|
||
"de": "Deaktivierung fehlgeschlagen: {error}",
|
||
"ru": "Отключение не удалось: {error}",
|
||
"zh": "禁用失败: {error}",
|
||
},
|
||
"Status check failed: {error}": {
|
||
"en": "Status check failed: {error}",
|
||
"bg": "Проверката на състоянието неуспешна: {error}",
|
||
"de": "Statusprüfung fehlgeschlagen: {error}",
|
||
"ru": "Проверка состояния не удалась: {error}",
|
||
"zh": "状态检查失败: {error}",
|
||
},
|
||
"Remove failed: {error}": {
|
||
"en": "Remove failed: {error}",
|
||
"bg": "Премахването неуспешно: {error}",
|
||
"de": "Entfernung fehlgeschlagen: {error}",
|
||
"ru": "Удаление не удалось: {error}",
|
||
"zh": "移除失败: {error}",
|
||
},
|
||
"Gitea Runner Manager — manage Gitea Actions runners.": {
|
||
"en": "Gitea Runner Manager — manage Gitea Actions runners.",
|
||
"bg": "Gitea Runner Manager — управление на Gitea Actions runners.",
|
||
"de": "Gitea Runner Manager — Gitea Actions Runner verwalten.",
|
||
"ru": "Gitea Runner Manager — управление Gitea Actions runners.",
|
||
"zh": "Gitea Runner Manager — 管理 Gitea Actions runners。",
|
||
},
|
||
"Command: {cmd}": {
|
||
"en": "Command: {cmd}",
|
||
"bg": "Команда: {cmd}",
|
||
"de": "Befehl: {cmd}",
|
||
"ru": "Команда: {cmd}",
|
||
"zh": "命令: {cmd}",
|
||
},
|
||
"Start a registered Gitea Runner.": {
|
||
"en": "Start a registered Gitea Runner.",
|
||
"bg": "Стартиране на регистриран Gitea Runner.",
|
||
"de": "Einen registrierten Gitea Runner starten.",
|
||
"ru": "Запустить зарегистрированный Gitea Runner.",
|
||
"zh": "启动已注册的 Gitea Runner。",
|
||
},
|
||
"Stop a registered Gitea Runner.": {
|
||
"en": "Stop a registered Gitea Runner.",
|
||
"bg": "Спиране на регистриран Gitea Runner.",
|
||
"de": "Einen registrierten Gitea Runner stoppen.",
|
||
"ru": "Остановить зарегистрированный Gitea Runner.",
|
||
"zh": "停止已注册的 Gitea Runner。",
|
||
},
|
||
"Enable a registered Gitea Runner to start on boot.": {
|
||
"en": "Enable a registered Gitea Runner to start on boot.",
|
||
"bg": "Разрешаване на регистриран Gitea Runner да стартира при зареждане.",
|
||
"de": "Einen registrierten Gitea Runner für den Autostart aktivieren.",
|
||
"ru": "Включить автозапуск зарегистрированного Gitea Runner.",
|
||
"zh": "启用已注册的 Gitea Runner 开机自启。",
|
||
},
|
||
"Disable a registered Gitea Runner and deregister it.": {
|
||
"en": "Disable a registered Gitea Runner and deregister it.",
|
||
"bg": "Деактивиране на регистриран Gitea Runner и дерегистриране.",
|
||
"de": "Einen registrierten Gitea Runner deaktivieren und abmelden.",
|
||
"ru": "Отключить и дерегистрировать зарегистрированный Gitea Runner.",
|
||
"zh": "禁用并注销已注册的 Gitea Runner。",
|
||
},
|
||
"Check the status of a registered Gitea Runner.": {
|
||
"en": "Check the status of a registered Gitea Runner.",
|
||
"bg": "Проверка на състоянието на регистриран Gitea Runner.",
|
||
"de": "Status eines registrierten Gitea Runners prüfen.",
|
||
"ru": "Проверить состояние зарегистрированного Gitea Runner.",
|
||
"zh": "检查已注册的 Gitea Runner 状态。",
|
||
},
|
||
"Remove a registered Gitea Runner completely.": {
|
||
"en": "Remove a registered Gitea Runner completely.",
|
||
"bg": "Пълно премахване на регистриран Gitea Runner.",
|
||
"de": "Einen registrierten Gitea Runner vollständig entfernen.",
|
||
"ru": "Полностью удалить зарегистрированный Gitea Runner.",
|
||
"zh": "完全移除已注册的 Gitea Runner。",
|
||
},
|
||
"Override host from registry": {
|
||
"en": "Override host from registry",
|
||
"bg": "Замяна на хоста от регистъра",
|
||
"de": "Host aus Registrierung überschreiben",
|
||
"ru": "Переопределить хост из реестра",
|
||
"zh": "覆盖注册表中的主机",
|
||
},
|
||
"Override user from registry": {
|
||
"en": "Override user from registry",
|
||
"bg": "Замяна на потребителя от регистъра",
|
||
"de": "Benutzer aus Registrierung überschreiben",
|
||
"ru": "Переопределить пользователя из реестра",
|
||
"zh": "覆盖注册表中的用户",
|
||
},
|
||
"Override SSH key from registry": {
|
||
"en": "Override SSH key from registry",
|
||
"bg": "Замяна на SSH ключа от регистъра",
|
||
"de": "SSH-Schlüssel aus Registrierung überschreiben",
|
||
"ru": "Переопределить SSH ключ из реестра",
|
||
"zh": "覆盖注册表中的 SSH 密钥",
|
||
},
|
||
"Override deployment mode from registry": {
|
||
"en": "Override deployment mode from registry",
|
||
"bg": "Замяна на режима на внедряване от регистъра",
|
||
"de": "Bereitstellungsmodus aus Registrierung überschreiben",
|
||
"ru": "Переопределить режим развертывания из реестра",
|
||
"zh": "覆盖注册表中的部署模式",
|
||
},
|
||
"Runner '{name}' not found in registry. Use 'grm install' first or provide --host and --user.": {
|
||
"en": "Runner '{name}' not found in registry. Use 'grm install' first or provide --host and --user.",
|
||
"bg": "Runner '{name}' не е намерен в регистъра. Използвайте 'grm install' първо или подайте --host и --user.",
|
||
"de": (
|
||
"Runner '{name}' nicht in Registrierung gefunden. "
|
||
"Verwenden Sie zuerst 'grm install' oder geben Sie --host und --user an."
|
||
),
|
||
"ru": "Runner '{name}' не найден в реестре. Сначала используйте 'grm install' или укажите --host и --user.",
|
||
"zh": "注册表中未找到 Runner '{name}'。请先使用 'grm install' 或提供 --host 和 --user。",
|
||
},
|
||
"List all registered runners with live status.": {
|
||
"en": "List all registered runners with live status.",
|
||
"bg": "Списък на всички регистрирани runners с актуално състояние.",
|
||
"de": "Alle registrierten Runner mit Live-Status auflisten.",
|
||
"ru": "Список всех зарегистрированных runners с текущим статусом.",
|
||
"zh": "列出所有已注册 runners 的实时状态。",
|
||
},
|
||
"No runners registered. Use 'grm install' to add one.": {
|
||
"en": "No runners registered. Use 'grm install' to add one.",
|
||
"bg": "Няма регистрирани runners. Използвайте 'grm install', за да добавите.",
|
||
"de": "Keine Runner registriert. Verwenden Sie 'grm install', um einen hinzuzufügen.",
|
||
"ru": "Нет зарегистрированных runners. Используйте 'grm install' чтобы добавить.",
|
||
"zh": "没有已注册的 runners。使用 'grm install' 添加一个。",
|
||
},
|
||
"List failed: {error}": {
|
||
"en": "List failed: {error}",
|
||
"bg": "Списъкът неуспешен: {error}",
|
||
"de": "Auflistung fehlgeschlagen: {error}",
|
||
"ru": "Ошибка списка: {error}",
|
||
"zh": "列表失败: {error}",
|
||
},
|
||
"NAME": {
|
||
"en": "NAME",
|
||
"bg": "ИМЕ",
|
||
"de": "NAME",
|
||
"ru": "ИМЯ",
|
||
"zh": "名称",
|
||
},
|
||
"HOST": {
|
||
"en": "HOST",
|
||
"bg": "ХОСТ",
|
||
"de": "HOST",
|
||
"ru": "ХОСТ",
|
||
"zh": "主机",
|
||
},
|
||
"USER": {
|
||
"en": "USER",
|
||
"bg": "ПОТРЕБИТЕЛ",
|
||
"de": "BENUTZER",
|
||
"ru": "ПОЛЬЗОВАТЕЛЬ",
|
||
"zh": "用户",
|
||
},
|
||
"MODE": {
|
||
"en": "MODE",
|
||
"bg": "РЕЖИМ",
|
||
"de": "MODUS",
|
||
"ru": "РЕЖИМ",
|
||
"zh": "模式",
|
||
},
|
||
"STATUS": {
|
||
"en": "STATUS",
|
||
"bg": "СТАТУС",
|
||
"de": "STATUS",
|
||
"ru": "СТАТУС",
|
||
"zh": "状态",
|
||
},
|
||
"active": {
|
||
"en": "active",
|
||
"bg": "активен",
|
||
"de": "aktiv",
|
||
"ru": "активен",
|
||
"zh": "活跃",
|
||
},
|
||
"inactive": {
|
||
"en": "inactive",
|
||
"bg": "неактивен",
|
||
"de": "inaktiv",
|
||
"ru": "неактивен",
|
||
"zh": "不活跃",
|
||
},
|
||
"failed": {
|
||
"en": "failed",
|
||
"bg": "неуспешен",
|
||
"de": "fehlgeschlagen",
|
||
"ru": "сбой",
|
||
"zh": "失败",
|
||
},
|
||
"unknown": {
|
||
"en": "unknown",
|
||
"bg": "неизвестен",
|
||
"de": "unbekannt",
|
||
"ru": "неизвестно",
|
||
"zh": "未知",
|
||
},
|
||
"=== Operation Report ===": {
|
||
"en": "=== Operation Report ===",
|
||
"bg": "=== Отчет за операцията ===",
|
||
"de": "=== Operationsbericht ===",
|
||
"ru": "=== Отчет об операции ===",
|
||
"zh": "=== 操作报告 ===",
|
||
},
|
||
"completed": {
|
||
"en": "completed",
|
||
"bg": "завършено",
|
||
"de": "abgeschlossen",
|
||
"ru": "завершено",
|
||
"zh": "已完成",
|
||
},
|
||
"pending": {
|
||
"en": "pending",
|
||
"bg": "чакащо",
|
||
"de": "ausstehend",
|
||
"ru": "в ожидании",
|
||
"zh": "待处理",
|
||
},
|
||
"in_progress": {
|
||
"en": "in progress",
|
||
"bg": "в процес",
|
||
"de": "in Bearbeitung",
|
||
"ru": "в процессе",
|
||
"zh": "进行中",
|
||
},
|
||
"Save runner '{name}' to local registry": {
|
||
"en": "Save runner '{name}' to local registry",
|
||
"bg": "Запазване на runner '{name}' в локалния регистър",
|
||
"de": "Runner '{name}' in lokaler Registrierung speichern",
|
||
"ru": "Сохранить runner '{name}' в локальном реестре",
|
||
"zh": "将 runner '{name}' 保存到本地注册表",
|
||
},
|
||
"Remove runner '{name}' from local registry": {
|
||
"en": "Remove runner '{name}' from local registry",
|
||
"bg": "Премахване на runner '{name}' от локалния регистър",
|
||
"de": "Runner '{name}' aus lokaler Registrierung entfernen",
|
||
"ru": "Удалить runner '{name}' из локального реестра",
|
||
"zh": "从本地注册表移除 runner '{name}'",
|
||
},
|
||
}
|
||
|
||
|
||
def _(key: str, **kwargs: object) -> str:
|
||
"""Return a translated string for the given key.
|
||
|
||
Translation is opt-in via the ``GRM_LANG`` environment variable.
|
||
If unset, English is always returned regardless of system locale.
|
||
"""
|
||
lang = os.getenv("GRM_LANG", "en")
|
||
if lang not in ("en", "bg", "de", "ru", "zh"):
|
||
lang = "en"
|
||
template = TRANSLATIONS.get(key, {}).get(lang, key)
|
||
return template.format(**kwargs)
|