From 91440c1b0a83bef2add3dca6dc7dea5461536cee Mon Sep 17 00:00:00 2001 From: emil Date: Wed, 24 Jun 2026 23:20:59 +0000 Subject: [PATCH] GRM-86: feat: add Polish as officially supported language --- .gitea/workflows/ci.yml | 16 +- .gitea/workflows/post-merge.yml | 8 +- .gitea/workflows/publish.yml | 2 +- Makefile | 2 +- README.md | 4 +- docs/index.md | 2 +- docs/tech/architecture.md | 2 +- docs/tech/development-setup.md | 2 +- src/gitea_runner_manager/i18n.py | 4 +- src/gitea_runner_manager/translations.json | 214 ++++++++++++++------- 10 files changed, 167 insertions(+), 89 deletions(-) diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index 17953d3..0ee35b6 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -24,6 +24,10 @@ jobs: run: | . .venv/bin/activate make pytest-cov + - name: Translation completeness check + run: | + . .venv/bin/activate + python3 -m devx.ci.check_translations --translations src/gitea_runner_manager/translations.json - name: Check unit test speed env: PYTHONPATH: src @@ -174,9 +178,9 @@ jobs: - name: Install dependencies run: | . .env 2>/dev/null || true - python3 -m pip install --break-system-packages --target=src "devx==0.11.1" --extra-index-url "https://emil:${{ secrets.REPO_TOKEN }}@git.oblachno.oblachno.fyi/api/packages/oblachno-oss/pypi/simple/" - python3 -m pip install --break-system-packages --target=src "devx==0.11.1" --extra-index-url "https://emil:${{ secrets.REPO_TOKEN }}@git.oblachno.oblachno.fyi/api/packages/oblachno-oss/pypi/simple/" - python3 -m pip install --break-system-packages --target=src "devx==0.11.1" --extra-index-url "https://emil:${{ secrets.REPO_TOKEN }}@git.oblachno.oblachno.fyi/api/packages/oblachno-oss/pypi/simple/" + python3 -m pip install --break-system-packages --target=src "devx==0.12.0" --extra-index-url "https://emil:${{ secrets.REPO_TOKEN }}@git.oblachno.oblachno.fyi/api/packages/oblachno-oss/pypi/simple/" + python3 -m pip install --break-system-packages --target=src "devx==0.12.0" --extra-index-url "https://emil:${{ secrets.REPO_TOKEN }}@git.oblachno.oblachno.fyi/api/packages/oblachno-oss/pypi/simple/" + python3 -m pip install --break-system-packages --target=src "devx==0.12.0" --extra-index-url "https://emil:${{ secrets.REPO_TOKEN }}@git.oblachno.oblachno.fyi/api/packages/oblachno-oss/pypi/simple/" - name: Run automated PR review env: REPO_TOKEN: ${{ secrets.REPO_TOKEN }} @@ -209,9 +213,9 @@ jobs: - name: Install dependencies run: | . .env 2>/dev/null || true - python3 -m pip install --break-system-packages --target=src "devx==0.11.1" --extra-index-url "https://emil:${{ secrets.REPO_TOKEN }}@git.oblachno.oblachno.fyi/api/packages/oblachno-oss/pypi/simple/" - python3 -m pip install --break-system-packages --target=src "devx==0.11.1" --extra-index-url "https://emil:${{ secrets.REPO_TOKEN }}@git.oblachno.oblachno.fyi/api/packages/oblachno-oss/pypi/simple/" - python3 -m pip install --break-system-packages --target=src "devx==0.11.1" --extra-index-url "https://emil:${{ secrets.REPO_TOKEN }}@git.oblachno.oblachno.fyi/api/packages/oblachno-oss/pypi/simple/" + python3 -m pip install --break-system-packages --target=src "devx==0.12.0" --extra-index-url "https://emil:${{ secrets.REPO_TOKEN }}@git.oblachno.oblachno.fyi/api/packages/oblachno-oss/pypi/simple/" + python3 -m pip install --break-system-packages --target=src "devx==0.12.0" --extra-index-url "https://emil:${{ secrets.REPO_TOKEN }}@git.oblachno.oblachno.fyi/api/packages/oblachno-oss/pypi/simple/" + python3 -m pip install --break-system-packages --target=src "devx==0.12.0" --extra-index-url "https://emil:${{ secrets.REPO_TOKEN }}@git.oblachno.oblachno.fyi/api/packages/oblachno-oss/pypi/simple/" - name: Squash merge with task ID env: REPO_TOKEN: ${{ secrets.REPO_TOKEN }} diff --git a/.gitea/workflows/post-merge.yml b/.gitea/workflows/post-merge.yml index 58263bb..9640465 100644 --- a/.gitea/workflows/post-merge.yml +++ b/.gitea/workflows/post-merge.yml @@ -43,7 +43,7 @@ jobs: - name: Install dependencies run: | . .env 2>/dev/null || true - python3 -m pip install --break-system-packages --target=src "devx==0.11.1" --extra-index-url "https://emil:${{ secrets.REPO_TOKEN }}@git.oblachno.oblachno.fyi/api/packages/oblachno-oss/pypi/simple/" + python3 -m pip install --break-system-packages --target=src "devx==0.12.0" --extra-index-url "https://emil:${{ secrets.REPO_TOKEN }}@git.oblachno.oblachno.fyi/api/packages/oblachno-oss/pypi/simple/" - name: Check if this is a release commit id: check env: @@ -62,7 +62,7 @@ jobs: - name: Install dependencies run: | . .env 2>/dev/null || true - python3 -m pip install --break-system-packages --target=src "devx==0.11.1" --extra-index-url "https://emil:${{ secrets.REPO_TOKEN }}@git.oblachno.oblachno.fyi/api/packages/oblachno-oss/pypi/simple/" + python3 -m pip install --break-system-packages --target=src "devx==0.12.0" --extra-index-url "https://emil:${{ secrets.REPO_TOKEN }}@git.oblachno.oblachno.fyi/api/packages/oblachno-oss/pypi/simple/" - name: Validate latest commit message env: PYTHONPATH: src @@ -219,7 +219,7 @@ jobs: - name: Install dependencies run: | . .env 2>/dev/null || true - python3 -m pip install --break-system-packages --target=src "devx==0.11.1" --extra-index-url "https://emil:${{ secrets.REPO_TOKEN }}@git.oblachno.oblachno.fyi/api/packages/oblachno-oss/pypi/simple/" + python3 -m pip install --break-system-packages --target=src "devx==0.12.0" --extra-index-url "https://emil:${{ secrets.REPO_TOKEN }}@git.oblachno.oblachno.fyi/api/packages/oblachno-oss/pypi/simple/" - name: Update Vikunja task env: VIKUNJA_TOKEN: ${{ secrets.VIKUNJA_TOKEN }} @@ -251,7 +251,7 @@ jobs: - name: Install dependencies run: | . .env 2>/dev/null || true - python3 -m pip install --break-system-packages --target=src "devx==0.11.1" --extra-index-url "https://emil:${{ secrets.REPO_TOKEN }}@git.oblachno.oblachno.fyi/api/packages/oblachno-oss/pypi/simple/" + python3 -m pip install --break-system-packages --target=src "devx==0.12.0" --extra-index-url "https://emil:${{ secrets.REPO_TOKEN }}@git.oblachno.oblachno.fyi/api/packages/oblachno-oss/pypi/simple/" - name: Ensure branch protection and labels env: REPO_TOKEN: ${{ secrets.REPO_TOKEN }} diff --git a/.gitea/workflows/publish.yml b/.gitea/workflows/publish.yml index 082f3e2..5041863 100644 --- a/.gitea/workflows/publish.yml +++ b/.gitea/workflows/publish.yml @@ -22,7 +22,7 @@ jobs: - name: Install CI tools run: | . .env 2>/dev/null || true - python3 -m pip install --break-system-packages --target=src "devx==0.11.1" --extra-index-url "https://emil:${{ secrets.REPO_TOKEN }}@git.oblachno.oblachno.fyi/api/packages/oblachno-oss/pypi/simple/" + python3 -m pip install --break-system-packages --target=src "devx==0.12.0" --extra-index-url "https://emil:${{ secrets.REPO_TOKEN }}@git.oblachno.oblachno.fyi/api/packages/oblachno-oss/pypi/simple/" python3 -m devx.tools.install_tools --tool git-cliff --tool tea - name: Install build tools run: python3 -m pip install --break-system-packages build twine diff --git a/Makefile b/Makefile index d4de4be..d76d593 100644 --- a/Makefile +++ b/Makefile @@ -9,7 +9,7 @@ all: setup # Pinned devx version — update this when upgrading devx. # All workflow files (.gitea/workflows/*.yml) must be updated to match. -DEVX_VERSION := v0.11.1 +DEVX_VERSION := v0.12.0 install-devx: $(VENV)/bin/activate @# REPO_TOKEN may come from .env (local) or environment (CI secrets) diff --git a/README.md b/README.md index 74f96b1..dc8aa2c 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,7 @@ Key problems GRM solves: - **Automatic integration testing** — Every installation runs an integration test that verifies the `.runner` registration file and systemd service state. - **Docker prune automation** — A systemd user timer automatically prunes old Docker images and volumes on a daily schedule. - **Local runner registry** — Connection details are stored in `~/.local/share/grm/runners.json`, so lifecycle commands work by runner name alone. -- **Internationalisation** — Console messages support English, Bulgarian, German, Russian, and Chinese via the `GRM_LANG` environment variable. +- **Internationalisation** — Console messages support English, Bulgarian, German, Russian, Chinese, and Polish via the `GRM_LANG` environment variable. - **Security-conscious** — Secrets (registration tokens) are passed via temporary JSON files with `0600` permissions, never on the command line (CWE-214). - **Comprehensive CI/CD** — 100% test coverage, automated releases via conventional commits and git-cliff, Molecule tests across 4 OS platforms. @@ -292,7 +292,7 @@ grm install | `runner_manager.py` | Ansible orchestration + registry integration | | `executor.py` | Ansible subprocess execution with log capture | | `registry.py` | Local JSON runner registry at `~/.local/share/grm/runners.json` | -| `i18n.py` | Internationalisation (en, bg, de, ru, zh) | +| `i18n.py` | Internationalisation (en, bg, de, ru, zh, pl) | | `exceptions.py` | Custom exceptions (`GRMError`, `AnsibleError`, `APIError`) | | `config.py` | Configuration constants (API URLs, repo owner/name) | | `logging_config.py` | Logging to `~/.local/state/grm/logs/grm.log` | diff --git a/docs/index.md b/docs/index.md index 5d803df..ced5981 100644 --- a/docs/index.md +++ b/docs/index.md @@ -27,7 +27,7 @@ GRM is a two-layer tool: a Python CLI (built with Click) that delegates to an id - **Idempotent Ansible role** — Safe to re-run; second run produces zero changes. - **Automatic integration testing** — Every installation verifies the `.runner` registration file and systemd service state. - **Local runner registry** — Connection details stored locally; manage runners by name after installation. -- **Internationalisation** — Console messages in English, Bulgarian, German, Russian, and Chinese. +- **Internationalisation** — Console messages in English, Bulgarian, German, Russian, Chinese, and Polish. - **Security-conscious** — Secrets passed via temporary JSON files with `0600` permissions (CWE-214). ### Supported operating systems diff --git a/docs/tech/architecture.md b/docs/tech/architecture.md index 6d3c179..5c05f6e 100644 --- a/docs/tech/architecture.md +++ b/docs/tech/architecture.md @@ -209,7 +209,7 @@ The Python CLI layer (`src/gitea_runner_manager/`) consists of the following mod | `runner_manager.py` | Ansible orchestration + registry integration — delegates to executor and manages runner lifecycle | | `executor.py` | Ansible subprocess execution — runs `ansible-playbook` with extra-vars via temp JSON files, streams output to log files | | `registry.py` | Local JSON runner registry at `~/.local/share/grm/runners.json` — stores connection metadata | -| `i18n.py` | Internationalisation translations (en, bg, de, ru, zh) — opt-in via `GRM_LANG` environment variable | +| `i18n.py` | Internationalisation translations (en, bg, de, ru, zh, pl) — opt-in via `GRM_LANG` environment variable | | `exceptions.py` | Custom exceptions (`GRMError`, `AnsibleError`, `APIError`) | | `config.py` | Configuration constants (API URLs, repo owner/name, project IDs) — overridable via environment variables | | `logging_config.py` | Logging configuration — writes all messages to `~/.local/state/grm/logs/grm.log` at DEBUG level | diff --git a/docs/tech/development-setup.md b/docs/tech/development-setup.md index 2c60ceb..e9ab639 100644 --- a/docs/tech/development-setup.md +++ b/docs/tech/development-setup.md @@ -9,7 +9,7 @@ │ ├── runner_manager.py # Ansible orchestration + registry integration │ ├── executor.py # Ansible subprocess execution │ ├── registry.py # Local JSON runner registry -│ ├── i18n.py # Translations (en, bg, de, ru, zh) +│ ├── i18n.py # Translations (en, bg, de, ru, zh, pl) │ ├── exceptions.py # Custom exceptions │ ├── config.py # Configuration constants │ ├── logging_config.py # Logging to ~/.local/state/grm/logs/ diff --git a/src/gitea_runner_manager/i18n.py b/src/gitea_runner_manager/i18n.py index 47d6e14..ca4274b 100644 --- a/src/gitea_runner_manager/i18n.py +++ b/src/gitea_runner_manager/i18n.py @@ -1,7 +1,7 @@ """Simple i18n for GRM console messages. Set GRM_LANG environment variable to override the default English. -Supported: en, bg, de, ru, zh. +Supported: en, bg, de, ru, zh, pl. """ from __future__ import annotations @@ -22,7 +22,7 @@ def _(key: str, **kwargs: object) -> str: 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"): + if lang not in ("en", "bg", "de", "ru", "zh", "pl"): lang = "en" template = TRANSLATIONS.get(key, {}).get(lang, key) return template.format(**kwargs) diff --git a/src/gitea_runner_manager/translations.json b/src/gitea_runner_manager/translations.json index af26cc1..1a626b2 100644 --- a/src/gitea_runner_manager/translations.json +++ b/src/gitea_runner_manager/translations.json @@ -1,487 +1,561 @@ { "=== Operation Report ===": { - "en": "=== Operation Report ===", "bg": "=== Отчет за операцията ===", "de": "=== Operationsbericht ===", + "en": "=== Operation Report ===", + "pl": "=== Raport operacji ===", "ru": "=== Отчет об операции ===", "zh": "=== 操作报告 ===" }, "Ad-hoc command failed on {host}: {stderr}": { - "en": "Ad-hoc command failed on {host}: {stderr}", "bg": "Ad-hoc командата неуспешна на {host}: {stderr}", "de": "Ad-hoc-Befehl auf {host} fehlgeschlagen: {stderr}", + "en": "Ad-hoc command failed on {host}: {stderr}", + "pl": "Polecenie ad-hoc nie powiodło się na {host}: {stderr}", "ru": "Ad-hoc команда не удалась на {host}: {stderr}", "zh": "Ad-hoc 命令在 {host} 上失败: {stderr}" }, "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}", + "en": "Ansible failed with exit code {code}. See full log: {log_file}", + "pl": "Ansible zakończone niepowodzeniem z kodem {code}. Pełny log: {log_file}", "ru": "Ansible завершился с кодом {code}. См. лог: {log_file}", "zh": "Ansible 失败,退出码 {code}。查看日志: {log_file}" }, "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.", + "en": "Check the status of a registered Gitea Runner.", + "pl": "Sprawdź status zarejestrowanego Gitea Runner.", "ru": "Проверить состояние зарегистрированного Gitea Runner.", "zh": "检查已注册的 Gitea Runner 状态。" }, "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}", + "en": "Checking status of Gitea Runner {name} on {host}", + "pl": "Sprawdzanie statusu Gitea Runner {name} na {host}", "ru": "Проверка состояния Gitea Runner {name} на {host}", "zh": "正在检查 {host} 上 Gitea Runner {name} 的状态" }, "Checking status of Gitea Runner {name} on {host} as {user} (sudo required)": { - "en": "Checking status of Gitea Runner {name} on {host} as {user} (sudo required)", "bg": "Проверка на състоянието на Gitea Runner {name} на {host} като {user} (необходим е sudo)", "de": "Prüfe Status von Gitea Runner {name} auf {host} als {user} (sudo erforderlich)", + "en": "Checking status of Gitea Runner {name} on {host} as {user} (sudo required)", + "pl": "Sprawdzanie statusu Gitea Runner {name} na {host} jako {user} (wymagane sudo)", "ru": "Проверка состояния Gitea Runner {name} на {host} как {user} (требуется sudo)", "zh": "正在检查 {host} 上 Gitea Runner {name} 的状态(用户 {user},需要 sudo)" }, "Command: {cmd}": { - "en": "Command: {cmd}", "bg": "Команда: {cmd}", "de": "Befehl: {cmd}", + "en": "Command: {cmd}", + "pl": "Polecenie: {cmd}", "ru": "Команда: {cmd}", "zh": "命令: {cmd}" }, "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.", + "en": "Disable a registered Gitea Runner and deregister it.", + "pl": "Wyłącz zarejestrowanego Gitea Runner i wyrejestruj go.", "ru": "Отключить и дерегистрировать зарегистрированный Gitea Runner.", "zh": "禁用并注销已注册的 Gitea Runner。" }, "Disable failed: {error}": { - "en": "Disable failed: {error}", "bg": "Деактивирането неуспешно: {error}", "de": "Deaktivierung fehlgeschlagen: {error}", + "en": "Disable failed: {error}", + "pl": "Wyłączanie nie powiodło się: {error}", "ru": "Отключение не удалось: {error}", "zh": "禁用失败: {error}" }, "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}", + "en": "Disabling Gitea Runner {name} on {host}", + "pl": "Wyłączanie Gitea Runner {name} na {host}", "ru": "Отключение Gitea Runner {name} на {host}", "zh": "正在 {host} 上禁用 Gitea Runner {name}" }, "Done. See full log: {log_file}": { - "en": "Done. See full log: {log_file}", "bg": "Готово. Вижте пълния лог: {log_file}", "de": "Fertig. Siehe vollständiges Log: {log_file}", + "en": "Done. See full log: {log_file}", + "pl": "Gotowe. Pełny log: {log_file}", "ru": "Готово. См. полный лог: {log_file}", "zh": "完成。查看完整日志: {log_file}" }, "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.", + "en": "Enable a registered Gitea Runner to start on boot.", + "pl": "Włącz zarejestrowanego Gitea Runner, aby startował przy uruchomieniu.", "ru": "Включить автозапуск зарегистрированного Gitea Runner.", "zh": "启用已注册的 Gitea Runner 开机自启。" }, "Enable failed: {error}": { - "en": "Enable failed: {error}", "bg": "Активирането неуспешно: {error}", "de": "Aktivierung fehlgeschlagen: {error}", + "en": "Enable failed: {error}", + "pl": "Włączanie nie powiodło się: {error}", "ru": "Включение не удалось: {error}", "zh": "启用失败: {error}" }, "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}", + "en": "Enabling Gitea Runner {name} on {host}", + "pl": "Włączanie Gitea Runner {name} na {host}", "ru": "Включение Gitea Runner {name} на {host}", "zh": "正在 {host} 上启用 Gitea Runner {name}" }, "Full log: {log_file}": { - "en": "Full log: {log_file}", "bg": "Пълен лог: {log_file}", "de": "Vollständiges Log: {log_file}", + "en": "Full log: {log_file}", + "pl": "Pełny log: {log_file}", "ru": "Полный лог: {log_file}", "zh": "完整日志: {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)", + "en": "GITEA_REGISTRATION_TOKEN must be set (or pass --token)", + "pl": "GITEA_REGISTRATION_TOKEN musi być ustawiony (lub podaj --token)", "ru": "GITEA_REGISTRATION_TOKEN должен быть задан (или передайте --token)", "zh": "必须设置 GITEA_REGISTRATION_TOKEN(或传递 --token)" }, "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)", + "en": "GITEA_URL must be set (or pass --url)", + "pl": "GITEA_URL musi być ustawiony (lub podaj --url)", "ru": "GITEA_URL должен быть задан (или передайте --url)", "zh": "必须设置 GITEA_URL(或传递 --url)" }, "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.", + "en": "Gitea Runner Manager — manage Gitea Actions runners.", + "pl": "Gitea Runner Manager — zarządzaj runnerami Gitea Actions.", "ru": "Gitea Runner Manager — управление Gitea Actions runners.", "zh": "Gitea Runner Manager — 管理 Gitea Actions runners。" }, "Gitea Runner name (default: host)": { - "en": "Gitea Runner name (default: host)", "bg": "Име на Gitea Runner (по подразбиране: host)", "de": "Gitea Runner-Name (Standard: host)", + "en": "Gitea Runner name (default: host)", + "pl": "Nazwa Gitea Runner (domyślnie: host)", "ru": "Имя Gitea Runner (по умолчанию: host)", "zh": "Gitea Runner 名称(默认: host)" }, "Gitea URL (env: GITEA_URL)": { - "en": "Gitea URL (env: GITEA_URL)", "bg": "Gitea URL (env: GITEA_URL)", "de": "Gitea-URL (env: GITEA_URL)", + "en": "Gitea URL (env: GITEA_URL)", + "pl": "URL Gitea (env: GITEA_URL)", "ru": "URL Gitea (env: GITEA_URL)", "zh": "Gitea URL(环境变量: GITEA_URL)" }, "Gitea admin API token for integration test (env: REPO_TOKEN)": { - "en": "Gitea admin API token for integration test (env: REPO_TOKEN)", "bg": "Gitea admin API токен за интеграционен тест (env: REPO_TOKEN)", "de": "Gitea-Admin-API-Token für Integrationstest (env: REPO_TOKEN)", + "en": "Gitea admin API token for integration test (env: REPO_TOKEN)", + "pl": "Token API administratora Gitea do testów integracyjnych (env: REPO_TOKEN)", "ru": "Токен админ API Gitea для интеграционного теста (env: REPO_TOKEN)", "zh": "Gitea 管理员 API 令牌,用于集成测试(环境变量: REPO_TOKEN)" }, "HOST": { - "en": "HOST", "bg": "ХОСТ", "de": "HOST", + "en": "HOST", + "pl": "HOST", "ru": "ХОСТ", "zh": "主机" }, "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.", + "en": "Install and configure a Gitea Runner on a remote host.", + "pl": "Zainstaluj i skonfiguruj Gitea Runner na zdalnym hoście.", "ru": "Установить и настроить Gitea Runner на удалённом хосте.", "zh": "在远程主机上安装并配置 Gitea Runner。" }, "Installation failed: {error}": { - "en": "Installation failed: {error}", "bg": "Инсталацията неуспешна: {error}", "de": "Installation fehlgeschlagen: {error}", + "en": "Installation failed: {error}", + "pl": "Instalacja nie powiodła się: {error}", "ru": "Установка не удалась: {error}", "zh": "安装失败: {error}" }, "Installing Gitea Runner on {host}": { - "en": "Installing Gitea Runner on {host}", "bg": "Инсталиране на Gitea Runner на {host}", "de": "Gitea Runner wird auf {host} installiert", + "en": "Installing Gitea Runner on {host}", + "pl": "Instalowanie Gitea Runner na {host}", "ru": "Установка Gitea Runner на {host}", "zh": "正在 {host} 上安装 Gitea Runner" }, "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)", + "en": "Integration test API retries (default: 3, env: GITEA_INTEGRATION_RETRIES)", + "pl": "Powtórzenia API testów integracyjnych (domyślnie: 3, env: GITEA_INTEGRATION_RETRIES)", "ru": "Повторы API интеграционного теста (по умолчанию: 3, env: GITEA_INTEGRATION_RETRIES)", "zh": "集成测试 API 重试次数(默认: 3,环境变量: GITEA_INTEGRATION_RETRIES)" }, "LABELS": { - "en": "LABELS", "bg": "ЕТИКЕТИ", "de": "LABELS", + "en": "LABELS", + "pl": "ETYKIETY", "ru": "МЕТКИ", "zh": "标签" }, "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.", + "en": "List all registered runners with live status.", + "pl": "Wyświetl wszystkie zarejestrowane runnery z aktualnym statusem.", "ru": "Список всех зарегистрированных runners с текущим статусом.", "zh": "列出所有已注册 runners 的实时状态。" }, "List failed: {error}": { - "en": "List failed: {error}", "bg": "Списъкът неуспешен: {error}", "de": "Auflistung fehlgeschlagen: {error}", + "en": "List failed: {error}", + "pl": "Wyświetlanie nie powiodło się: {error}", "ru": "Ошибка списка: {error}", "zh": "列表失败: {error}" }, "NAME": { - "en": "NAME", "bg": "ИМЕ", "de": "NAME", + "en": "NAME", + "pl": "NAZWA", "ru": "ИМЯ", "zh": "名称" }, "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.", + "en": "No runners registered. Use 'grm install' to add one.", + "pl": "Brak zarejestrowanych runnerów. Użyj 'grm install', aby dodać jeden.", "ru": "Нет зарегистрированных runners. Используйте 'grm install' чтобы добавить.", "zh": "没有已注册的 runners。使用 'grm install' 添加一个。" }, "Override SSH key from registry": { - "en": "Override SSH key from registry", "bg": "Замяна на SSH ключа от регистъра", "de": "SSH-Schlüssel aus Registrierung überschreiben", + "en": "Override SSH key from registry", + "pl": "Nadpisz klucz SSH z rejestru", "ru": "Переопределить SSH ключ из реестра", "zh": "覆盖注册表中的 SSH 密钥" }, "Override host from registry": { - "en": "Override host from registry", "bg": "Замяна на хоста от регистъра", "de": "Host aus Registrierung überschreiben", + "en": "Override host from registry", + "pl": "Nadpisz host z rejestru", "ru": "Переопределить хост из реестра", "zh": "覆盖注册表中的主机" }, "Override user from registry": { - "en": "Override user from registry", "bg": "Замяна на потребителя от регистъра", "de": "Benutzer aus Registrierung überschreiben", + "en": "Override user from registry", + "pl": "Nadpisz użytkownika z rejestru", "ru": "Переопределить пользователя из реестра", "zh": "覆盖注册表中的用户" }, "Path to SSH private key": { - "en": "Path to SSH private key", "bg": "Път към SSH частен ключ", "de": "Pfad zum SSH-Private-Key", + "en": "Path to SSH private key", + "pl": "Ścieżka do klucza prywatnego SSH", "ru": "Путь к SSH приватному ключу", "zh": "SSH 私钥路径" }, "Playbook not found: {playbook}": { - "en": "Playbook not found: {playbook}", "bg": "Playbook не е намерен: {playbook}", "de": "Playbook nicht gefunden: {playbook}", + "en": "Playbook not found: {playbook}", + "pl": "Playbook nie znaleziony: {playbook}", "ru": "Playbook не найден: {playbook}", "zh": "未找到 Playbook: {playbook}" }, "Prompt for sudo password (default)": { - "en": "Prompt for sudo password (default)", "bg": "Подканване за sudo парола (по подразбиране)", "de": "Nach sudo-Passwort fragen (Standard)", + "en": "Prompt for sudo password (default)", + "pl": "Zapytaj o hasło sudo (domyślnie)", "ru": "Запросить пароль sudo (по умолчанию)", "zh": "提示输入 sudo 密码(默认)" }, "Registration token (env: GITEA_REGISTRATION_TOKEN)": { - "en": "Registration token (env: GITEA_REGISTRATION_TOKEN)", "bg": "Регистрационен токен (env: GITEA_REGISTRATION_TOKEN)", "de": "Registrierungstoken (env: GITEA_REGISTRATION_TOKEN)", + "en": "Registration token (env: GITEA_REGISTRATION_TOKEN)", + "pl": "Token rejestracji (env: GITEA_REGISTRATION_TOKEN)", "ru": "Токен регистрации (env: GITEA_REGISTRATION_TOKEN)", "zh": "注册令牌(环境变量: GITEA_REGISTRATION_TOKEN)" }, "Remove a registered Gitea Runner completely.": { - "en": "Remove a registered Gitea Runner completely.", "bg": "Пълно премахване на регистриран Gitea Runner.", "de": "Einen registrierten Gitea Runner vollständig entfernen.", + "en": "Remove a registered Gitea Runner completely.", + "pl": "Usuń zarejestrowanego Gitea Runner całkowicie.", "ru": "Полностью удалить зарегистрированный Gitea Runner.", "zh": "完全移除已注册的 Gitea Runner。" }, "Remove failed: {error}": { - "en": "Remove failed: {error}", "bg": "Премахването неуспешно: {error}", "de": "Entfernung fehlgeschlagen: {error}", + "en": "Remove failed: {error}", + "pl": "Usuwanie nie powiodło się: {error}", "ru": "Удаление не удалось: {error}", "zh": "移除失败: {error}" }, "Remove runner '{name}' from local registry": { - "en": "Remove runner '{name}' from local registry", "bg": "Премахване на runner '{name}' от локалния регистър", "de": "Runner '{name}' aus lokaler Registrierung entfernen", + "en": "Remove runner '{name}' from local registry", + "pl": "Usuń runner '{name}' z lokalnego rejestru", "ru": "Удалить runner '{name}' из локального реестра", "zh": "从本地注册表移除 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}", + "en": "Removing Gitea Runner {name} from {host}", + "pl": "Usuwanie Gitea Runner {name} z {host}", "ru": "Удаление Gitea Runner {name} с {host}", "zh": "正在从 {host} 移除 Gitea Runner {name}" }, "Runner '{name}' not found in registry.": { - "en": "Runner '{name}' not found in registry." + "bg": "Runner '{name}' не е намерен в регистъра.", + "de": "Runner '{name}' nicht in der Registrierung gefunden.", + "en": "Runner '{name}' not found in registry.", + "pl": "Runner '{name}' nie znaleziony w rejestrze.", + "ru": "Runner '{name}' не найден в реестре.", + "zh": "在注册表中未找到运行器 '{name}'。" }, "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.", + "en": "Runner '{name}' not found in registry. Use 'grm install' first or provide --host and --user.", + "pl": "Runner '{name}' nie znaleziony w rejestrze. Użyj najpierw 'grm install' lub podaj --host i --user.", "ru": "Runner '{name}' не найден в реестре. Сначала используйте 'grm install' или укажите --host и --user.", "zh": "注册表中未找到 Runner '{name}'。请先使用 'grm install' 或提供 --host 和 --user。" }, "Runner labels for Gitea Actions (env: GITEA_RUNNER_LABELS). Example: docker:docker://alpine:latest": { - "en": "Runner labels for Gitea Actions (env: GITEA_RUNNER_LABELS). Example: docker:docker://alpine:latest", "bg": "Етикети на runner за Gitea Actions (env: GITEA_RUNNER_LABELS). Пример: docker:docker://alpine:latest", "de": "Runner-Labels für Gitea Actions (env: GITEA_RUNNER_LABELS). Beispiel: docker:docker://alpine:latest", + "en": "Runner labels for Gitea Actions (env: GITEA_RUNNER_LABELS). Example: docker:docker://alpine:latest", + "pl": "Etykiety runnera dla Gitea Actions (env: GITEA_RUNNER_LABELS). Przykład: docker:docker://alpine:latest", "ru": "Метки runner для Gitea Actions (env: GITEA_RUNNER_LABELS). Пример: docker:docker://alpine:latest", "zh": "Gitea Actions 的 runner 标签(环境变量: GITEA_RUNNER_LABELS)。示例: docker:docker://alpine:latest" }, "Running Ansible playbook": { - "en": "Running Ansible playbook", "bg": "Изпълнение на Ansible playbook", "de": "Ansible-Playbook wird ausgeführt", + "en": "Running Ansible playbook", + "pl": "Uruchamianie playbook Ansible", "ru": "Выполнение Ansible playbook", "zh": "正在运行 Ansible playbook" }, "SSH user": { - "en": "SSH user", "bg": "SSH потребител", "de": "SSH-Benutzer", + "en": "SSH user", + "pl": "Użytkownik SSH", "ru": "SSH пользователь", "zh": "SSH 用户" }, "STATUS": { - "en": "STATUS", "bg": "СТАТУС", "de": "STATUS", + "en": "STATUS", + "pl": "STATUS", "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", + "en": "Save runner '{name}' to local registry", + "pl": "Zapisz runner '{name}' do lokalnego rejestru", "ru": "Сохранить runner '{name}' в локальном реестре", "zh": "将 runner '{name}' 保存到本地注册表" }, "Skip remote cleanup and only remove the local registry entry": { - "en": "Skip remote cleanup and only remove the local registry entry", "bg": "Пропуснете отдалеченото почистване и премахнете само локалния запис", "de": "Remote-Bereinigung überspringen und nur den lokalen Registrierungseintrag entfernen", + "en": "Skip remote cleanup and only remove the local registry entry", + "pl": "Pomiń zdalne czyszczenie i usuń tylko wpis w lokalnym rejestrze", "ru": "Пропустить удаленную очистку и удалить только локальную запись реестра", "zh": "跳过远程清理,仅删除本地注册表条目" }, "Specific Gitea Runner version": { - "en": "Specific Gitea Runner version", "bg": "Конкретна версия на Gitea Runner", "de": "Spezifische Gitea Runner-Version", + "en": "Specific Gitea Runner version", + "pl": "Konkretna wersja Gitea Runner", "ru": "Конкретная версия Gitea Runner", "zh": "指定 Gitea Runner 版本" }, "Start a registered Gitea Runner.": { - "en": "Start a registered Gitea Runner.", "bg": "Стартиране на регистриран Gitea Runner.", "de": "Einen registrierten Gitea Runner starten.", + "en": "Start a registered Gitea Runner.", + "pl": "Uruchom zarejestrowanego Gitea Runner.", "ru": "Запустить зарегистрированный Gitea Runner.", "zh": "启动已注册的 Gitea Runner。" }, "Start failed: {error}": { - "en": "Start failed: {error}", "bg": "Стартирането неуспешно: {error}", "de": "Start fehlgeschlagen: {error}", + "en": "Start failed: {error}", + "pl": "Uruchamianie nie powiodło się: {error}", "ru": "Запуск не удался: {error}", "zh": "启动失败: {error}" }, "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}", + "en": "Starting Gitea Runner {name} on {host}", + "pl": "Uruchamianie Gitea Runner {name} na {host}", "ru": "Запуск Gitea Runner {name} на {host}", "zh": "正在 {host} 上启动 Gitea Runner {name}" }, "Status check failed: {error}": { - "en": "Status check failed: {error}", "bg": "Проверката на състоянието неуспешна: {error}", "de": "Statusprüfung fehlgeschlagen: {error}", + "en": "Status check failed: {error}", + "pl": "Sprawdzanie statusu nie powiodło się: {error}", "ru": "Проверка состояния не удалась: {error}", "zh": "状态检查失败: {error}" }, "Stop a registered Gitea Runner.": { - "en": "Stop a registered Gitea Runner.", "bg": "Спиране на регистриран Gitea Runner.", "de": "Einen registrierten Gitea Runner stoppen.", + "en": "Stop a registered Gitea Runner.", + "pl": "Zatrzymaj zarejestrowanego Gitea Runner.", "ru": "Остановить зарегистрированный Gitea Runner.", "zh": "停止已注册的 Gitea Runner。" }, "Stop failed: {error}": { - "en": "Stop failed: {error}", "bg": "Спирането неуспешно: {error}", "de": "Stop fehlgeschlagen: {error}", + "en": "Stop failed: {error}", + "pl": "Zatrzymywanie nie powiodło się: {error}", "ru": "Остановка не удалась: {error}", "zh": "停止失败: {error}" }, "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}", + "en": "Stopping Gitea Runner {name} on {host}", + "pl": "Zatrzymywanie Gitea Runner {name} na {host}", "ru": "Остановка Gitea Runner {name} на {host}", "zh": "正在 {host} 上停止 Gitea Runner {name}" }, "USER": { - "en": "USER", "bg": "ПОТРЕБИТЕЛ", "de": "BENUTZER", + "en": "USER", + "pl": "UŻYTKOWNIK", "ru": "ПОЛЬЗОВАТЕЛЬ", "zh": "用户" }, "Update failed: {error}": { - "en": "Update failed: {error}", "bg": "Актуализацията неуспешна: {error}", "de": "Update fehlgeschlagen: {error}", + "en": "Update failed: {error}", + "pl": "Aktualizacja nie powiodła się: {error}", "ru": "Обновление не удалось: {error}", "zh": "更新失败: {error}" }, "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.", + "en": "Update the Gitea Runner binary on a remote host.", + "pl": "Zaktualizuj binaria Gitea Runner na zdalnym hoście.", "ru": "Обновить бинарный файл Gitea Runner на удалённом хосте.", "zh": "在远程主机上更新 Gitea Runner 二进制文件。" }, "Updating Gitea Runner on {host}": { - "en": "Updating Gitea Runner on {host}", "bg": "Актуализиране на Gitea Runner на {host}", "de": "Gitea Runner wird auf {host} aktualisiert", + "en": "Updating Gitea Runner on {host}", + "pl": "Aktualizowanie Gitea Runner na {host}", "ru": "Обновление Gitea Runner на {host}", "zh": "正在 {host} 上更新 Gitea Runner" }, "active": { - "en": "active", "bg": "активен", "de": "aktiv", + "en": "active", + "pl": "aktywny", "ru": "активен", "zh": "活跃" }, "completed": { - "en": "completed", "bg": "завършено", "de": "abgeschlossen", + "en": "completed", + "pl": "ukończony", "ru": "завершено", "zh": "已完成" }, "exit code {code}": { - "en": "exit code {code}", "bg": "код за изход {code}", "de": "Exit-Code {code}", + "en": "exit code {code}", + "pl": "kod wyjścia {code}", "ru": "код выхода {code}", "zh": "退出代码 {code}" }, "failed": { - "en": "failed", "bg": "неуспешен", "de": "fehlgeschlagen", + "en": "failed", + "pl": "nieudany", "ru": "сбой", "zh": "失败" }, "in_progress": { - "en": "in progress", "bg": "в процес", "de": "in Bearbeitung", + "en": "in progress", + "pl": "w toku", "ru": "в процессе", "zh": "进行中" }, "inactive": { - "en": "inactive", "bg": "неактивен", "de": "inaktiv", + "en": "inactive", + "pl": "nieaktywny", "ru": "неактивен", "zh": "不活跃" }, "pending": { - "en": "pending", "bg": "чакащо", "de": "ausstehend", + "en": "pending", + "pl": "oczekujący", "ru": "в ожидании", "zh": "待处理" }, "unknown": { - "en": "unknown", "bg": "неизвестен", "de": "unbekannt", + "en": "unknown", + "pl": "nieznany", "ru": "неизвестно", "zh": "未知" }