diff --git a/docs/specs/DEVX-164-docker-push-retry-historical.md b/docs/specs/DEVX-164-docker-push-retry-historical.md new file mode 100644 index 0000000..efc8079 --- /dev/null +++ b/docs/specs/DEVX-164-docker-push-retry-historical.md @@ -0,0 +1,34 @@ +# DEVX-164: Increase HTTP 500 retry count and backoff for docker push + +## Problem +The HTTP 500 retry logic (DEVX-162, DEVX-163) works correctly — 3 retry +attempts are made. But all 3 attempts fail because the Gitea registry's +"offset mismatch" race condition needs more than ~15s to recover. The +current backoff is 5s-20s with 3 attempts (total ~15s of waiting). + +## Approach +Increase retry count from 3 to 5 and backoff from 5-20s to 10-60s, +giving the registry up to ~2 minutes to recover. Add visible logging +between retry attempts so the CI logs show the retry happening. + +REQ-1: Increase retry count from 3 to 5 +REQ-2: Increase backoff from 5-20s to 10-60s exponential +REQ-3: Add visible logging between retry attempts (click.echo) +REQ-4: All tests pass with 100% coverage + +## Test Plan +- Unit tests verify retry count and backoff parameters +- Unit tests verify logging output on retry +- Manual: trigger build-images workflow and verify retries visible in logs + +## Deploy Plan +- Merge to master + +## Rollback Plan +- Revert the merge commit + +## Acceptance Criteria +- [x] REQ-1: Increase retry count from 3 to 5 +- [x] REQ-2: Increase backoff from 5-20s to 10-60s exponential +- [x] REQ-3: Add visible logging between retry attempts (click.echo) +- [x] REQ-4: All tests pass with 100% coverage diff --git a/docs/specs/DEVX-164.md b/docs/specs/DEVX-164.md index efc8079..69018aa 100644 --- a/docs/specs/DEVX-164.md +++ b/docs/specs/DEVX-164.md @@ -1,34 +1,57 @@ -# DEVX-164: Increase HTTP 500 retry count and backoff for docker push +# DEVX-164: auto-merge resilience — self-approval and Vikunja outage handling ## Problem -The HTTP 500 retry logic (DEVX-162, DEVX-163) works correctly — 3 retry -attempts are made. But all 3 attempts fail because the Gitea registry's -"offset mismatch" race condition needs more than ~15s to recover. The -current backoff is 5s-20s with 3 attempts (total ~15s of waiting). + +Two defects hit auto-merge during S02 work: + +1. `get_vikunja_task_title` crashes on transient Vikunja errors. The + Vikunja API returned 404/502 during a restart window (run 6093); + `list_project_tasks` treats 4xx as non-retryable `APIError`, so the + job failed immediately instead of riding out a short outage. +2. When a PR author and the workflow's reviewer token map to the same + Gitea user, the auto-approve step is rejected ("approve your own + pull is not allowed") and the merge fails `405: not enough + approvals`. The generic merge error gives no hint that an external + approval is the fix (hit on sso-bridge #18, #19, and infra #1647's + approvals-only failure mode). ## Approach -Increase retry count from 3 to 5 and backoff from 5-20s to 10-60s, -giving the registry up to ~2 minutes to recover. Add visible logging -between retry attempts so the CI logs show the retry happening. -REQ-1: Increase retry count from 3 to 5 -REQ-2: Increase backoff from 5-20s to 10-60s exponential -REQ-3: Add visible logging between retry attempts (click.echo) -REQ-4: All tests pass with 100% coverage +REQ-1: Wrap the task-list pagination in `get_vikunja_task_title` with a +bounded retry (tenacity, ~4 attempts, exponential backoff) covering +`APIError` and `requests.RequestException`. A genuinely missing task +still ends in the same "Could not find" ClickException. + +REQ-2: On merge `HTTP 405`, fetch PR reviews; when zero `APPROVED` +reviews exist, extend the error with the self-approval explanation and +the remediation (approve via a non-author account). + +REQ-3: Regression tests for both behaviors. + +## Files Affected + +- `src/devx/ci/auto_merge.py` +- `tests/unit/test_auto_merge.py` ## Test Plan -- Unit tests verify retry count and backoff parameters -- Unit tests verify logging output on retry -- Manual: trigger build-images workflow and verify retries visible in logs + +- New tests: retry-then-success on transient APIError; retry-exhaustion + still raises; missing task still raises; 405 error includes + approvals diagnostic. +- `make pytest-cov`, `make lint-all`. ## Deploy Plan -- Merge to master + +- Merge → next release publishes the package; consuming repos pick it + up on their next CI run (devx is pinned per-repo, bump via the usual + dependency PR flow). ## Rollback Plan -- Revert the merge commit + +- Revert; previous behavior returns. ## Acceptance Criteria -- [x] REQ-1: Increase retry count from 3 to 5 -- [x] REQ-2: Increase backoff from 5-20s to 10-60s exponential -- [x] REQ-3: Add visible logging between retry attempts (click.echo) -- [x] REQ-4: All tests pass with 100% coverage + +- [x] REQ-1: Vikunja task-list retries transient API failures +- [x] REQ-2: 405 merge error reports approval state + self-approval hint +- [x] REQ-3: Regression tests added and passing diff --git a/src/devx/ci/auto_merge.py b/src/devx/ci/auto_merge.py index 846a84f..636e1d6 100644 --- a/src/devx/ci/auto_merge.py +++ b/src/devx/ci/auto_merge.py @@ -21,10 +21,12 @@ Usage: """ import re +import time from pathlib import Path from typing import Any import click +import requests from dotenv import load_dotenv # pyright: ignore[reportMissingImports,reportUnknownVariableType] from devx.api_clients import GiteaClient, VikunjaClient @@ -110,6 +112,27 @@ def validate_pr_title(pr_title: str, task_id: str) -> None: ) +_VIKUNJA_LOOKUP_ATTEMPTS = 4 +_VIKUNJA_LOOKUP_BACKOFF = 5.0 + + +def _list_project_tasks(client: VikunjaClient, page: int) -> list[dict[str, Any]]: + """List Vikunja tasks with bounded retries for transient outages. + + Implements REQ-1: during a Vikunja restart the tasks endpoint can briefly + return 404/502; retry a few times so title validation rides out the window + instead of stranding an otherwise-valid PR. + """ + for attempt in range(1, _VIKUNJA_LOOKUP_ATTEMPTS + 1): + try: + return list(client.list_project_tasks(VIKUNJA_PROJECT_ID, page=page, per_page=DEFAULT_PER_PAGE)) + except (APIError, requests.RequestException): + if attempt == _VIKUNJA_LOOKUP_ATTEMPTS: + raise + time.sleep(_VIKUNJA_LOOKUP_BACKOFF * attempt) + raise AssertionError("unreachable") # pragma: no cover + + def get_vikunja_task_title(task_id: str) -> str: """Fetch the Vikunja task title for the given DEVX-N identifier. @@ -124,7 +147,7 @@ def get_vikunja_task_title(task_id: str) -> str: client = VikunjaClient(VIKUNJA_API_URL, token) page = 1 while True: - tasks = client.list_project_tasks(VIKUNJA_PROJECT_ID, page=page, per_page=DEFAULT_PER_PAGE) + tasks = _list_project_tasks(client, page) if not tasks: break matches = [t for t in tasks if t.get("identifier") == task_id] @@ -272,14 +295,28 @@ def main(branch: str, pr_title: str, repo: str, pr_number: str) -> None: # Exit cleanly — the rebase triggers a new CI run that will retry. return else: - raise click.ClickException( - _( - "Merge failed with HTTP {status}: {message}\n" - "Please check the PR is ready and you have merge rights.", - status=e.status, - message=e.message, - ) - ) from None + hint = "" + if e.status == 405: + # Implements: REQ-2 — surface approval state. When the PR author + # and the CI reviewer token map to the same Gitea user, + # self-approval is rejected and the merge fails 405. + try: + reviews = client.get_pr_reviews(pr_num) + if not any(r.get("state") == "APPROVED" for r in reviews): + hint = _( + "\nNo APPROVED review found on the PR. If the PR author and the" + " CI reviewer token map to the same Gitea user, self-approval is" + " rejected — approve the PR via a non-author account, then" + " re-run the auto-merge job." + ) + except APIError: + pass + msg = _( + "Merge failed with HTTP {status}: {message}\nPlease check the PR is ready and you have merge rights.", + status=e.status, + message=e.message, + ) + raise click.ClickException(msg + hint) from None click.echo( _( diff --git a/src/devx/translations.json b/src/devx/translations.json index 1fae5ed..c3c7098 100644 --- a/src/devx/translations.json +++ b/src/devx/translations.json @@ -1,4154 +1,4162 @@ { - "\n=== Summary ===": { - "bg": "\n=== Обобщение ===", - "de": "\n=== Zusammenfassung ===", - "en": "\n=== Summary ===", - "pl": "\n=== Podsumowanie ===", - "ru": "\n=== Сводка ===", - "zh": "\n=== 摘要 ===" - }, - "\nAll documentation coverage checks passed!": { - "bg": "\nВсички проверки за покритие на документацията преминаха успешно!", - "de": "\nAlle Dokumentations-Abdeckungsprüfungen bestanden!", - "en": "\nAll documentation coverage checks passed!", - "pl": "\nWszystkie kontrole pokrycia dokumentacji zakończone pomyślnie!", - "ru": "\nВсе проверки покрытия документации пройдены!", - "zh": "\n所有文档覆盖率检查均已通过!" - }, - "\nCHANGELOG version ordering:": { - "bg": "\nПодреждане на версиите в CHANGELOG:", - "de": "\nReihenfolge der CHANGELOG-Versionen:", - "en": "\nCHANGELOG version ordering:", - "pl": "\nKolejność wersji w CHANGELOG:", - "ru": "\nПорядок версий в CHANGELOG:", - "zh": "\nCHANGELOG 版本顺序:" - }, - "\nChecking CI script documentation in ci-cd-workflow.md...": { - "bg": "\nПроверка на документацията за CI скриптове в ci-cd-workflow.md...", - "de": "\nPrüfe CI-Skript-Dokumentation in ci-cd-workflow.md...", - "en": "\nChecking CI script documentation in ci-cd-workflow.md...", - "pl": "\nSprawdzanie dokumentacji skryptów CI w ci-cd-workflow.md...", - "ru": "\nПроверка документации CI-скриптов в ci-cd-workflow.md...", - "zh": "\n正在检查 ci-cd-workflow.md 中的 CI 脚本文档..." - }, - "\nChecking module documentation in architecture.md...": { - "bg": "\nПроверка на документацията за модулите в architecture.md...", - "de": "\nPrüfe Moduldokumentation in architecture.md...", - "en": "\nChecking module documentation in architecture.md...", - "pl": "\nSprawdzanie dokumentacji modułów w architecture.md...", - "ru": "\nПроверка документации модулей в architecture.md...", - "zh": "\n正在检查 architecture.md 中的模块文档..." - }, - "\nDoc coverage: {covered}/{total} ({pct}%)": { - "bg": "\nПокритие на документацията: {covered}/{total} ({pct}%)", - "de": "\nDokumentationsabdeckung: {covered}/{total} ({pct}%)", - "en": "\nDoc coverage: {covered}/{total} ({pct}%)", - "pl": "\nPokrycie dokumentacji: {covered}/{total} ({pct}%)", - "ru": "\nПокрытие документации: {covered}/{total} ({pct}%)", - "zh": "\n文档覆盖率:{covered}/{total} ({pct}%)" - }, - "\nDone! Synced: {synced}, Pruned: {pruned}": { - "bg": "", - "de": "", - "en": "\nDone! Synced: {synced}, Pruned: {pruned}", - "pl": "", - "ru": "", - "zh": "" - }, - "\nDone. Deleted {deleted}, kept {kept}, failed {failed}.": { - "bg": "\nГотово. Изтрити: {deleted}, запазени: {kept}, неуспешни: {failed}.", - "de": "\nFertig. Gelöscht: {deleted}, behalten: {kept}, fehlgeschlagen: {failed}.", - "en": "\nDone. Deleted {deleted}, kept {kept}, failed {failed}.", - "pl": "\nGotowe. Usunięto: {deleted}, zachowano: {kept}, błędów: {failed}.", - "ru": "\nГотово. Удалено: {deleted}, сохранено: {kept}, ошибок: {failed}.", - "zh": "\n完成。已删除 {deleted},保留 {kept},失败 {failed}。" - }, - "\nERROR: Documentation coverage is not 100%. Use --fail-on-missing to enforce.": { - "bg": "\nГРЕШКА: Покритието на документацията не е 100%. Използвайте --fail-on-missing за налагане.", - "de": "\nFEHLER: Die Dokumentationsabdeckung beträgt nicht 100%. Mit --fail-on-missing erzwingen.", - "en": "\nERROR: Documentation coverage is not 100%. Use --fail-on-missing to enforce.", - "pl": "\nBŁĄD: Pokrycie dokumentacji nie wynosi 100%. Użyj --fail-on-missing, aby to wymusić.", - "ru": "\nОШИБКА: Покрытие документации не составляет 100%. Используйте --fail-on-missing для принудительной проверки.", - "zh": "\n错误:文档覆盖率未达到 100%。使用 --fail-on-missing 强制执行。" - }, - "\nFAIL: {n} stale version reference(s) found:": { - "bg": "", - "de": "", - "en": "\nFAIL: {n} stale version reference(s) found:", - "pl": "", - "ru": "", - "zh": "" - }, - "\nFix the misaligned tags before creating new releases. Run 'python3 -m devx.ci.release --verify' for a full report.": { - "bg": "\nКоригирайте несъответстващите тагове преди създаване на нови версии. Изпълнете 'python3 -m devx.ci.release --verify' за пълен отчет.", - "de": "\nKorrigieren Sie die falsch zugeordneten Tags, bevor Sie neue Releases erstellen. Führen Sie 'python3 -m devx.ci.release --verify' für einen vollständigen Bericht aus.", - "en": "\nFix the misaligned tags before creating new releases. Run 'python3 -m devx.ci.release --verify' for a full report.", - "pl": "\nNapraw niezgodne tagi przed utworzeniem nowych wydań. Uruchom 'python3 -m devx.ci.release --verify', aby uzyskać pełny raport.", - "ru": "\nИсправьте несоответствующие теги перед созданием новых релизов. Выполните 'python3 -m devx.ci.release --verify' для полного отчёта.", - "zh": "\n请在创建新版本之前修正不匹配的标签。运行 'python3 -m devx.ci.release --verify' 获取完整报告。" - }, - "\nFixed {n} stale version reference(s).": { - "bg": "", - "de": "", - "en": "\nFixed {n} stale version reference(s).", - "pl": "", - "ru": "", - "zh": "" - }, - "\nGenerated {count} badges:": { - "bg": "\nГенерирани {count} значка:", - "de": "\n{count} Badges generiert:", - "en": "\nGenerated {count} badges:", - "pl": "\nWygenerowano {count} odznak:", - "ru": "\nСгенерировано значков: {count}:", - "zh": "\n已生成 {count} 个徽章:" - }, - "\nKeeping {kept}, would delete {count}": { - "bg": "\nЗапазени {kept}, ще бъдат изтрити {count}", - "de": "\nBehalte {kept}, würde {count} löschen", - "en": "\nKeeping {kept}, would delete {count}", - "pl": "\nZachowano {kept}, usunięto by {count}", - "ru": "\nСохранено {kept}, будет удалено {count}", - "zh": "\n保留 {kept},将删除 {count}" - }, - "\nLatest tag: {tag}": { - "bg": "\nПоследен таг: {tag}", - "de": "\nNeuestes Tag: {tag}", - "en": "\nLatest tag: {tag}", - "pl": "\nNajnowszy tag: {tag}", - "ru": "\nПоследний тег: {tag}", - "zh": "\n最新标签:{tag}" - }, - "\nMissing documentation:": { - "bg": "\nЛипсваща документация:", - "de": "\nFehlende Dokumentation:", - "en": "\nMissing documentation:", - "pl": "\nBrakująca dokumentacja:", - "ru": "\nОтсутствующая документация:", - "zh": "\n缺失的文档:" - }, - "\nNo stale version references found.": { - "bg": "", - "de": "", - "en": "\nNo stale version references found.", - "pl": "", - "ru": "", - "zh": "" - }, - "\nPASS: All version references are current.": { - "bg": "", - "de": "", - "en": "\nPASS: All version references are current.", - "pl": "", - "ru": "", - "zh": "" - }, - "\nResult: {status}": { - "bg": "\nРезултат: {status}", - "de": "\nErgebnis: {status}", - "en": "\nResult: {status}", - "pl": "\nWynik: {status}", - "ru": "\nРезультат: {status}", - "zh": "\n结果:{status}" - }, - "\nRun with --fix to auto-update version references.": { - "bg": "", - "de": "", - "en": "\nRun with --fix to auto-update version references.", - "pl": "", - "ru": "", - "zh": "" - }, - "\nTag → Commit alignment:": { - "bg": "\nСъответствие таг → комит:", - "de": "\nTag-→-Commit-Zuordnung:", - "en": "\nTag → Commit alignment:", - "pl": "\nTag → Commit: zgodność:", - "ru": "\nСоответствие тег → коммит:", - "zh": "\n标签 → 提交对应关系:" - }, - "\nTest isolation check FAILED: {count} violation(s) in {files} file(s).\n": { - "bg": "\nПроверката за изолация на тестовете СЕ ПРОВАЛИ: {count} нарушение(я) във {files} файл(а).\n", - "de": "\nTestisolierungsprüfung FEHLGESCHLAGEN: {count} Verstoß/Verstöße in {files} Datei(en).\n", - "en": "\nTest isolation check FAILED: {count} violation(s) in {files} file(s).\n", - "pl": "\nKontrola izolacji testów NIEUDANA: {count} naruszeń w {files} plikach.\n", - "ru": "\nПроверка изоляции тестов ПРОВАЛЕНА: {count} нарушение(й) в {files} файл(ах).\n", - "zh": "\n测试隔离检查失败:{files} 个文件中存在 {count} 处违规。\n" - }, - "\nUntagged release commits:": { - "bg": "\nРелийз комити без таг:", - "de": "\nRelease-Commits ohne Tag:", - "en": "\nUntagged release commits:", - "pl": "\nCommity wydania bez tagu:", - "ru": "\nРелизные коммиты без тега:", - "zh": "\n未打标签的发布提交:" - }, - "\nUser-facing changes ({count}):": { - "bg": "\nВидими за потребителя промени ({count}):", - "de": "\nNutzersichtbare Änderungen ({count}):", - "en": "\nUser-facing changes ({count}):", - "pl": "\nZmiany widoczne dla użytkownika ({count}):", - "ru": "\nПользовательские изменения ({count}):", - "zh": "\n面向用户的更改({count}):" - }, - "\nVerification passed — all wiki pages exist.": { - "bg": "", - "de": "", - "en": "\nVerification passed — all wiki pages exist.", - "pl": "", - "ru": "", - "zh": "" - }, - "\nVerifying wiki pages...": { - "bg": "", - "de": "", - "en": "\nVerifying wiki pages...", - "pl": "", - "ru": "", - "zh": "" - }, - "\nWorkflow-only changes ({count}):": { - "bg": "\nПромени само в workflow ({count}):", - "de": "\nNur-Workflow-Änderungen ({count}):", - "en": "\nWorkflow-only changes ({count}):", - "pl": "\nZmiany tylko w workflow ({count}):", - "ru": "\nИзменения только в workflow ({count}):", - "zh": "\n仅工作流更改({count}):" - }, - "\n[check_test_coverage] Fix: add the missing test file(s) before committing.": { - "bg": "\n[check_test_coverage] Корекция: добавете липсващите тестови файл(ове) преди комит.", - "de": "\n[check_test_coverage] Behebung: fehlende Testdatei(en) vor dem Commit hinzufügen.", - "en": "\n[check_test_coverage] Fix: add the missing test file(s) before committing.", - "pl": "\n[check_test_coverage] Poprawka: dodaj brakujące pliki testowe przed commitem.", - "ru": "\n[check_test_coverage] Исправление: добавьте недостающие тестовые файл(ы) перед коммитом.", - "zh": "\n[check_test_coverage] 修复:提交前添加缺失的测试文件。" - }, - "\n[dry-run] Changelog:\n{changelog}": { - "bg": "\n[dry-run] Списък на промените:\n{changelog}", - "de": "\n[dry-run] Änderungsprotokoll:\n{changelog}", - "en": "\n[dry-run] Changelog:\n{changelog}", - "pl": "\n[dry-run] Dziennik zmian:\n{changelog}", - "ru": "\n[dry-run] Журнал изменений:\n{changelog}", - "zh": "\n[dry-run] 变更日志:\n{changelog}" - }, - "\n{label} files changed ({count}):": { - "bg": "\nПроменени файлове — {label} ({count}):", - "de": "\n{label} geänderte Dateien ({count}):", - "en": "\n{label} files changed ({count}):", - "pl": "\n{label} plików zmienionych ({count}):", - "ru": "\nИзменённые файлы — {label} ({count}):", - "zh": "\n{label} 个已更改文件({count}):" - }, - "\n{separator}": { - "bg": "\n{separator}", - "de": "\n{separator}", - "en": "\n{separator}", - "pl": "\n{separator}", - "ru": "\n{separator}", - "zh": "\n{separator}" - }, - "\n{tag} files ({count}):": { - "bg": "\n{tag} файла ({count}):", - "de": "\n{tag} Dateien ({count}):", - "en": "\n{tag} files ({count}):", - "pl": "\nPliki {tag} ({count}):", - "ru": "\n{tag} файлов ({count}):", - "zh": "\n{tag} 个文件({count}):" - }, - " Could not fetch logs: {error}": { - "bg": " Неуспешно извличане на логове: {error}", - "de": " Logs konnten nicht abgerufen werden: {error}", - "en": " Could not fetch logs: {error}", - "pl": " Nie udało się pobrać logów: {error}", - "ru": " Не удалось получить логи: {error}", - "zh": " 无法获取日志:{error}" - }, - " pytest stderr (last 300 chars): {stderr}": { - "bg": " pytest stderr (последни 300 символа): {stderr}", - "de": " pytest stderr (letzte 300 Zeichen): {stderr}", - "en": " pytest stderr (last 300 chars): {stderr}", - "pl": " pytest stderr (ostatnie 300 znaków): {stderr}", - "ru": " pytest stderr (последние 300 символов): {stderr}", - "zh": " pytest stderr(最后 300 个字符):{stderr}" - }, - " pytest stdout (last 300 chars): {stdout}": { - "bg": " pytest stdout (последни 300 символа): {stdout}", - "de": " pytest stdout (letzte 300 Zeichen): {stdout}", - "en": " pytest stdout (last 300 chars): {stdout}", - "pl": " pytest stdout (ostatnie 300 znaków): {stdout}", - "ru": " pytest stdout (последние 300 символов): {stdout}", - "zh": " pytest stdout(最后 300 个字符):{stdout}" - }, - " stderr: {stderr}": { - "bg": " stderr: {stderr}", - "de": " stderr: {stderr}", - "en": " stderr: {stderr}", - "pl": " stderr: {stderr}", - "ru": " stderr: {stderr}", - "zh": " stderr: {stderr}" - }, - " - Auto-delete branch after merge: yes": { - "bg": " - Автоматично изтриване на клон след сливане: да", - "de": " - Branch nach Merge automatisch löschen: ja", - "en": " - Auto-delete branch after merge: yes", - "pl": " - Auto-usuwanie gałęzi po scaleniu: tak", - "ru": " - Автоудаление ветки после слияния: да", - "zh": " - 合并后自动删除分支: 是" - }, - " - Block admin merge override: yes": { - "bg": " - Блокиране на admin merge override: да", - "de": " - Admin-Merge-Override blockieren: ja", - "en": " - Block admin merge override: yes", - "pl": " - Blokuj admin merge override: tak", - "ru": " - Блокировать admin merge override: да", - "zh": " - 阻止管理员合并覆盖:是" - }, - " - Block outdated branches: yes": { - "bg": " - Блокиране на остарели клонове: да", - "de": " - Veraltete Branches blockieren: ja", - "en": " - Block outdated branches: yes", - "pl": " - Blokowanie nieaktualnych gałęzi: tak", - "ru": " - Блокировать устаревшие ветки: да", - "zh": " - 阻止过时分支: 是" - }, - " - Block rejected reviews: yes": { - "bg": " - Блокиране на отхвърлени рецензии: да", - "de": " - Abgelehnte Reviews blockieren: ja", - "en": " - Block rejected reviews: yes", - "pl": " - Blokowanie odrzuconych recenzji: tak", - "ru": " - Блокировать отклонённые ревью: да", - "zh": " - 阻止被拒绝的审查: 是" - }, - " - Direct pushes: BLOCKED (require PR, whitelisted users can push)": { - "bg": " - Директни push-ове: БЛОКИРАНИ (изисква се PR; разрешени потребители могат да push-ват)", - "de": " - Direkte Pushes: BLOCKIERT (PR erforderlich, freigegebene Benutzer dürfen pushen)", - "en": " - Direct pushes: BLOCKED (require PR, whitelisted users can push)", - "pl": " - Bezpośrednie push-e: ZABLOKOWANE (wymagają PR, użytkownicy z białej listy mogą pushować)", - "ru": " - Прямые push: ЗАБЛОКИРОВАНЫ (требуется PR; разрешённые пользователи могут push)", - "zh": " - 直接推送:已阻止(需要 PR,白名单用户可推送)" - }, - " - Dismiss stale approvals: yes": { - "bg": " - Анулиране на остарели одобрения: да", - "de": " - Veraltete Genehmigungen ablehnen: ja", - "en": " - Dismiss stale approvals: yes", - "pl": " - Odrzucanie nieaktualnych zatwierdzeń: tak", - "ru": " - Отклонять устаревшие одобрения: да", - "zh": " - 忽略过时审批: 是" - }, - " - Required approvals: {count}": { - "bg": " - Необходими одобрения: {count}", - "de": " - Erforderliche Genehmigungen: {count}", - "en": " - Required approvals: {count}", - "pl": " - Wymagane zatwierdzenia: {count}", - "ru": " - Требуемые одобрения: {count}", - "zh": " - 必需审批数: {count}" - }, - " - Required status checks: {checks}": { - "bg": " - Необходими проверки на състоянието: {checks}", - "de": " - Erforderliche Status-Checks: {checks}", - "en": " - Required status checks: {checks}", - "pl": " - Wymagane kontrole statusu: {checks}", - "ru": " - Требуемые проверки статуса: {checks}", - "zh": " - 必需状态检查: {checks}" - }, - " - {count} standard labels verified": { - "bg": " - {count} стандартни етикета проверени", - "de": " - {count} Standard-Labels geprüft", - "en": " - {count} standard labels verified", - "pl": " - {count} standardowych etykiet zweryfikowanych", - "ru": " - {count} стандартных меток проверено", - "zh": " - 已验证 {count} 个标准标签" - }, - " -> {dir}": { - "bg": " -> {dir}", - "de": " -> {dir}", - "en": " -> {dir}", - "pl": " -> {dir}", - "ru": " -> {dir}", - "zh": " -> {dir}" - }, - " ... and {n} more": { - "bg": "", - "de": "", - "en": " ... and {n} more", - "pl": "", - "ru": "", - "zh": "" - }, - " Auto-fixed trailing whitespace in {n} files": { - "bg": " Автоматично коригирани крайни интервали в {n} файла", - "de": " Abschließende Leerzeichen in {n} Dateien automatisch korrigiert", - "en": " Auto-fixed trailing whitespace in {n} files", - "pl": " Automatycznie poprawiono końcowe białe znaki w {n} plikach", - "ru": " Автоматически исправлены конечные пробелы в {n} файлах", - "zh": " 已自动修复 {n} 个文件中的行尾空白" - }, - " Collecting code quality...": { - "bg": " Събиране на качество на кода...", - "de": " Codequalität wird erfasst...", - "en": " Collecting code quality...", - "pl": " Zbieranie jakości kodu...", - "ru": " Сбор данных о качестве кода...", - "zh": " 正在收集代码质量..." - }, - " Collecting coverage and tests...": { - "bg": " Събиране на покритие и тестове...", - "de": " Coverage und Tests werden erfasst...", - "en": " Collecting coverage and tests...", - "pl": " Zbieranie pokrycia i testów...", - "ru": " Сбор покрытия и тестов...", - "zh": " 正在收集覆盖率和测试..." - }, - " Collecting doc coverage...": { - "bg": " Събиране на покритие на документацията...", - "de": " Dokumentationsabdeckung wird erfasst...", - "en": " Collecting doc coverage...", - "pl": " Zbieranie pokrycia dokumentacji...", - "ru": " Сбор покрытия документации...", - "zh": " 正在收集文档覆盖率..." - }, - " Collecting version...": { - "bg": " Събиране на версия...", - "de": " Version wird erfasst...", - "en": " Collecting version...", - "pl": " Zbieranie wersji...", - "ru": " Сбор версии...", - "zh": " 正在收集版本..." - }, - " Deleted: {version}": { - "bg": " Изтрито: {version}", - "de": " Gelöscht: {version}", - "en": " Deleted: {version}", - "pl": " Usunięto: {version}", - "ru": " Удалено: {version}", - "zh": " 已删除:{version}" - }, - " FAIL: {title} — page not found in wiki!": { - "bg": "", - "de": "", - "en": " FAIL: {title} — page not found in wiki!", - "pl": "", - "ru": "", - "zh": "" - }, - " FAILED to delete: {version}": { - "bg": " НЕУСПЕШНО изтриване: {version}", - "de": " Löschen FEHLGESCHLAGEN: {version}", - "en": " FAILED to delete: {version}", - "pl": " NIE UDAŁO się usunąć: {version}", - "ru": " НЕ УДАЛОСЬ удалить: {version}", - "zh": " 删除失败:{version}" - }, - " Fix the PR title with:\n python3 -m devx.ci.fix_pr_title --repo {repo} --pr-number {pr}\n Or manually set the PR title to: '{expected}'": { - "bg": " Коригирайте заглавието на PR с:\n python3 -m devx.ci.fix_pr_title --repo {repo} --pr-number {pr}\n Или ръчно задайте заглавие на PR: '{expected}'", - "de": " Korrigieren Sie den PR-Titel mit:\n python3 -m devx.ci.fix_pr_title --repo {repo} --pr-number {pr}\n Oder setzen Sie den PR-Titel manuell auf: '{expected}'", - "en": " Fix the PR title with:\n python3 -m devx.ci.fix_pr_title --repo {repo} --pr-number {pr}\n Or manually set the PR title to: '{expected}'", - "pl": " Popraw tytuł PR poleceniem:\n python3 -m devx.ci.fix_pr_title --repo {repo} --pr-number {pr}\n Lub ręcznie ustaw tytuł PR na: '{expected}'", - "ru": " Исправьте заголовок PR командой:\n python3 -m devx.ci.fix_pr_title --repo {repo} --pr-number {pr}\n Или вручную установите заголовок PR: '{expected}'", - "zh": " 使用以下命令修复 PR 标题:\n python3 -m devx.ci.fix_pr_title --repo {repo} --pr-number {pr}\n 或手动将 PR 标题设置为:'{expected}'" - }, - " Fixed {fixes} version ref(s) in {file}": { - "bg": "", - "de": "", - "en": " Fixed {fixes} version ref(s) in {file}", - "pl": "", - "ru": "", - "zh": "" - }, - " Generated: {path}": { - "bg": " Генерирано: {path}", - "de": " Generiert: {path}", - "en": " Generated: {path}", - "pl": " Wygenerowano: {path}", - "ru": " Сгенерировано: {path}", - "zh": " 已生成:{path}" - }, - " HTTP 500 from registry, retrying in {wait:.0f}s (attempt {attempt}/5)...": { - "bg": " HTTP 500 от регистъра, повторен опит след {wait:.0f}с (опит {attempt}/5)...", - "de": " HTTP 500 vom Registry, Wiederholung in {wait:.0f}s (Versuch {attempt}/5)...", - "en": "HTTP 500 from registry, retrying in {wait:.0f}s (attempt {attempt}/5)...", - "pl": " HTTP 500 z rejestru, ponawianie za {wait:.0f}s (próba {attempt}/5)...", - "ru": " HTTP 500 от реестра, повтор через {wait:.0f}с (попытка {attempt}/5)...", - "zh": " 注册表返回 HTTP 500,{wait:.0f}秒后重试(第{attempt}/5次尝试)..." - }, - " MISSING: {cmd}": { - "bg": " ЛИПСВА: {cmd}", - "de": " FEHLT: {cmd}", - "en": " MISSING: {cmd}", - "pl": " BRAKUJE: {cmd}", - "ru": " ОТСУТСТВУЕТ: {cmd}", - "zh": " 缺失:{cmd}" - }, - " MISSING: {module}": { - "bg": " ЛИПСВА: {module}", - "de": " FEHLT: {module}", - "en": " MISSING: {module}", - "pl": " BRAK: {module}", - "ru": " ОТСУТСТВУЕТ: {module}", - "zh": " 缺失:{module}" - }, - " MISSING: {script}": { - "bg": " ЛИПСВА: {script}", - "de": " FEHLT: {script}", - "en": " MISSING: {script}", - "pl": " BRAK: {script}", - "ru": " ОТСУТСТВУЕТ: {script}", - "zh": " 缺失:{script}" - }, - " OK: {cmd}": { - "bg": " OK: {cmd}", - "de": " OK: {cmd}", - "en": " OK: {cmd}", - "pl": " OK: {cmd}", - "ru": " OK: {cmd}", - "zh": " 正常:{cmd}" - }, - " OK: {module}": { - "bg": " OK: {module}", - "de": " OK: {module}", - "en": " OK: {module}", - "pl": " OK: {module}", - "ru": " OK: {module}", - "zh": " 正常:{module}" - }, - " OK: {script}": { - "bg": " OK: {script}", - "de": " OK: {script}", - "en": " OK: {script}", - "pl": " OK: {script}", - "ru": " OK: {script}", - "zh": " 正常:{script}" - }, - " OK: {title}": { - "bg": "", - "de": "", - "en": " OK: {title}", - "pl": "", - "ru": "", - "zh": "" - }, - " Package: {pkg}": { - "bg": " Пакет: {pkg}", - "de": " Paket: {pkg}", - "en": " Package: {pkg}", - "pl": " Pakiet: {pkg}", - "ru": " Пакет: {pkg}", - "zh": " 包:{pkg}" - }, - " Pruned: {file} (not in mapping)": { - "bg": "", - "de": "", - "en": " Pruned: {file} (not in mapping)", - "pl": "", - "ru": "", - "zh": "" - }, - " Quality checks: {checks}": { - "bg": " Проверки на качеството: {checks}", - "de": " Qualitätsprüfungen: {checks}", - "en": " Quality checks: {checks}", - "pl": " Kontrole jakości: {checks}", - "ru": " Проверки качества: {checks}", - "zh": " 质量检查:{checks}" - }, - " Repo root: {root}": { - "bg": " Корен на репозитория: {root}", - "de": " Repo-Wurzel: {root}", - "en": " Repo root: {root}", - "pl": " Katalog główny repo: {root}", - "ru": " Корень репозитория: {root}", - "zh": " 仓库根目录:{root}" - }, - " Run 'make install-checkmake' to install the Makefile linter.": { - "bg": " Изпълнете 'make install-checkmake' за инсталиране на Makefile линтера.", - "de": " Führen Sie 'make install-checkmake' aus, um den Makefile-Linter zu installieren.", - "en": " Run 'make install-checkmake' to install the Makefile linter.", - "pl": " Uruchom 'make install-checkmake', aby zainstalować linter Makefile.", - "ru": " Выполните 'make install-checkmake' для установки линтера Makefile.", - "zh": " 运行 'make install-checkmake' 来安装 Makefile 检查器。" - }, - " Synced: {title} → {file}": { - "bg": "", - "de": "", - "en": " Synced: {title} → {file}", - "pl": "", - "ru": "", - "zh": "" - }, - " Test paths: {testpaths}": { - "bg": " Тестови пътища: {testpaths}", - "de": " Testpfade: {testpaths}", - "en": " Test paths: {testpaths}", - "pl": " Ścieżki testów: {testpaths}", - "ru": " Пути тестов: {testpaths}", - "zh": " 测试路径:{testpaths}" - }, - " WARN: Mapped file {file} is empty, skipping": { - "bg": "", - "de": "", - "en": " WARN: Mapped file {file} is empty, skipping", - "pl": "", - "ru": "", - "zh": "" - }, - " WARN: Mapped file {file} not found, skipping": { - "bg": "", - "de": "", - "en": " WARN: Mapped file {file} not found, skipping", - "pl": "", - "ru": "", - "zh": "" - }, - " WARNING: Could not extract coverage from pytest output (rc={rc})": { - "bg": " ПРЕДУПРЕЖДЕНИЕ: Не може да се извлече покритие от pytest изхода (rc={rc})", - "de": " WARNUNG: Coverage konnte nicht aus pytest-Ausgabe extrahiert werden (rc={rc})", - "en": " WARNING: Could not extract coverage from pytest output (rc={rc})", - "pl": " OSTRZEŻENIE: Nie można wyodrębnić pokrycia z wyjścia pytest (rc={rc})", - "ru": " ПРЕДУПРЕЖДЕНИЕ: Не удалось извлечь покрытие из вывода pytest (rc={rc})", - "zh": " 警告:无法从 pytest 输出中提取覆盖率 (rc={rc})" - }, - " WARNING: Could not extract doc coverage (rc={rc})": { - "bg": " ПРЕДУПРЕЖДЕНИЕ: Не може да се извлече покритие на документацията (rc={rc})", - "de": " WARNUNG: Dokumentationsabdeckung konnte nicht extrahiert werden (rc={rc})", - "en": " WARNING: Could not extract doc coverage (rc={rc})", - "pl": " OSTRZEŻENIE: Nie można wyodrębnić pokrycia dokumentacji (rc={rc})", - "ru": " ПРЕДУПРЕЖДЕНИЕ: Не удалось извлечь покрытие документации (rc={rc})", - "zh": " 警告:无法提取文档覆盖率 (rc={rc})" - }, - " WARNING: Could not extract test count from pytest output (rc={rc})": { - "bg": " ПРЕДУПРЕЖДЕНИЕ: Не може да се извлече брой тестове от pytest изхода (rc={rc})", - "de": " WARNUNG: Testanzahl konnte nicht aus pytest-Ausgabe extrahiert werden (rc={rc})", - "en": " WARNING: Could not extract test count from pytest output (rc={rc})", - "pl": " OSTRZEŻENIE: Nie można wyodrębnić liczby testów z wyjścia pytest (rc={rc})", - "ru": " ПРЕДУПРЕЖДЕНИЕ: Не удалось извлечь число тестов из вывода pytest (rc={rc})", - "zh": " 警告:无法从 pytest 输出中提取测试数量 (rc={rc})" - }, - " WARNING: No Python package found under src/ — version badge will show 'unknown'": { - "bg": " ПРЕДУПРЕЖДЕНИЕ: Не е намерен Python пакет под src/ — значкът за версия ще показва 'unknown'", - "de": " WARNUNG: Kein Python-Paket unter src/ gefunden — Versions-Badge zeigt 'unknown'", - "en": " WARNING: No Python package found under src/ — version badge will show 'unknown'", - "pl": " OSTRZEŻENIE: Nie znaleziono pakietu Python pod src/ — odznaka wersji pokaże 'unknown'", - "ru": " ПРЕДУПРЕЖДЕНИЕ: Python-пакет не найден в src/ — значок версии покажет 'unknown'", - "zh": " 警告:src/ 下未找到 Python 包——版本徽章将显示 'unknown'" - }, - " WARNING: No __version__ found in {init_file} — version badge will show 'unknown'": { - "bg": " ПРЕДУПРЕЖДЕНИЕ: Не е намерен __version__ в {init_file} — значкът за версия ще показва 'unknown'", - "de": " WARNUNG: Kein __version__ in {init_file} gefunden — Versions-Badge zeigt 'unknown'", - "en": " WARNING: No __version__ found in {init_file} — version badge will show 'unknown'", - "pl": " OSTRZEŻENIE: Nie znaleziono __version__ w {init_file} — odznaka wersji pokaże 'unknown'", - "ru": " ПРЕДУПРЕЖДЕНИЕ: __version__ не найден в {init_file} — значок версии покажет 'unknown'", - "zh": " 警告:{init_file} 中未找到 __version__——版本徽章将显示 'unknown'" - }, - " WARNING: No coverage target detected (no src/ package, no --cov in pyproject.toml)": { - "bg": " ПРЕДУПРЕЖДЕНИЕ: Не е открита цел за покритие (няма src/ пакет, няма --cov в pyproject.toml)", - "de": " WARNUNG: Kein Coverage-Ziel erkannt (kein src/-Paket, kein --cov in pyproject.toml)", - "en": " WARNING: No coverage target detected (no src/ package, no --cov in pyproject.toml)", - "pl": " OSTRZEŻENIE: Nie wykryto celu pokrycia (brak pakietu src/, brak --cov w pyproject.toml)", - "ru": " ПРЕДУПРЕЖДЕНИЕ: Цель покрытия не обнаружена (нет пакета src/, нет --cov в pyproject.toml)", - "zh": " 警告:未检测到覆盖率目标(无 src/ 包,pyproject.toml 中无 --cov)" - }, - " WARNING: {init_file} not found — version badge will show 'unknown'": { - "bg": " ПРЕДУПРЕЖДЕНИЕ: {init_file} не е намерен — значкът за версия ще показва 'unknown'", - "de": " WARNUNG: {init_file} nicht gefunden — Versions-Badge zeigt 'unknown'", - "en": " WARNING: {init_file} not found — version badge will show 'unknown'", - "pl": " OSTRZEŻENIE: Nie znaleziono {init_file} — odznaka wersji pokaże 'unknown'", - "ru": " ПРЕДУПРЕЖДЕНИЕ: {init_file} не найден — значок версии покажет 'unknown'", - "zh": " 警告:未找到 {init_file}——版本徽章将显示 'unknown'" - }, - " WARNING: {name} failed (rc={rc})": { - "bg": " ПРЕДУПРЕЖДЕНИЕ: {name} се провали (rc={rc})", - "de": " WARNUNG: {name} fehlgeschlagen (rc={rc})", - "en": " WARNING: {name} failed (rc={rc})", - "pl": " OSTRZEŻENIE: {name} nie powiodło się (rc={rc})", - "ru": " ПРЕДУПРЕЖДЕНИЕ: {name} завершился с ошибкой (rc={rc})", - "zh": " 警告:{name} 失败 (rc={rc})" - }, - " WARNING: {name} not installed — skipping (counted as pass)": { - "bg": " ПРЕДУПРЕЖДЕНИЕ: {name} не е инсталиран — пропуска се (отчита се като успешно)", - "de": " WARNUNG: {name} nicht installiert — übersprungen (als bestanden gezählt)", - "en": " WARNING: {name} not installed — skipping (counted as pass)", - "pl": " OSTRZEŻENIE: {name} nie jest zainstalowane — pomijanie (liczone jako zaliczone)", - "ru": " ПРЕДУПРЕЖДЕНИЕ: {name} не установлен — пропускается (засчитывается как успех)", - "zh": " 警告:{name} 未安装——跳过(计为通过)" - }, - " [dry-run] Would delete: {version}": { - "bg": " [dry-run] Ще бъде изтрито: {version}", - "de": " [dry-run] Würde löschen: {version}", - "en": " [dry-run] Would delete: {version}", - "pl": " [dry-run] Usunięto by: {version}", - "ru": " [dry-run] Было бы удалено: {version}", - "zh": " [dry-run] 将删除:{version}" - }, - " {name}: {label}={message} ({color})": { - "bg": " {name}: {label}={message} ({color})", - "de": " {name}: {label}={message} ({color})", - "en": " {name}: {label}={message} ({color})", - "pl": " {name}: {label}={message} ({color})", - "ru": " {name}: {label}={message} ({color})", - "zh": " {name}: {label}={message} ({color})" - }, - " {n} long lines found (warnings only)": { - "bg": "", - "de": "", - "en": " {n} long lines found (warnings only)", - "pl": "", - "ru": "", - "zh": "" - }, - " {n} orphan docs found (warnings only)": { - "bg": "", - "de": "", - "en": " {n} orphan docs found (warnings only)", - "pl": "", - "ru": "", - "zh": "" - }, - " {n} stale docs found (warnings only)": { - "bg": " Намерени {n} остарели документа (само предупреждения)", - "de": " {n} veraltete Dokumente gefunden (nur Warnungen)", - "en": " {n} stale docs found (warnings only)", - "pl": " Znaleziono {n} nieaktualnych dokumentów (tylko ostrzeżenia)", - "ru": " Найдено {n} устаревших документов (только предупреждения)", - "zh": " 发现 {n} 个过时文档(仅警告)" - }, - " {tool}: found at {path}": { - "bg": " {tool}: намерен на {path}", - "de": " {tool}: gefunden unter {path}", - "en": " {tool}: found at {path}", - "pl": " {tool}: znaleziono w {path}", - "ru": " {tool}: найден в {path}", - "zh": " {tool}: 在 {path} 找到" - }, - " {version} (created: {created})": { - "bg": " {version} (създадено: {created})", - "de": " {version} (erstellt: {created})", - "en": " {version} (created: {created})", - "pl": " {version} (utworzono: {created})", - "ru": " {version} (создано: {created})", - "zh": " {version}(创建于:{created})" - }, - "--push requires --registry": { - "bg": "--push изисква --registry", - "de": "--push erfordert --registry", - "en": "--push requires --registry", - "pl": "--push wymaga --registry", - "ru": "--push требует --registry", - "zh": "--push 需要 --registry" - }, - "--skip-build: skipping package build and PyPI publish.": { - "bg": "--skip-build: пропуска се изграждане на пакета и публикуване в PyPI.", - "de": "--skip-build: Paket-Build und PyPI-Veröffentlichung werden übersprungen.", - "en": "--skip-build: skipping package build and PyPI publish.", - "pl": "--skip-build: pomijanie budowania pakietu i publikacji PyPI.", - "ru": "--skip-build: сборка пакета и публикация в PyPI пропускаются.", - "zh": "--skip-build:跳过包构建和 PyPI 发布。" - }, - "=== Release Alignment Verification ===\n": { - "bg": "=== Проверка на съответствието на версиите ===\n", - "de": "=== Release-Abgleich-Verifizierung ===\n", - "en": "=== Release Alignment Verification ===\n", - "pl": "=== Weryfikacja zgodności wydań ===\n", - "ru": "=== Проверка соответствия релизов ===\n", - "zh": "=== 发布一致性验证 ===\n" - }, - "API poll warning: {exc}": { - "bg": "Предупреждение при API запитване: {exc}", - "de": "Warnung bei API-Abfrage: {exc}", - "en": "API poll warning: {exc}", - "pl": "Ostrzeżenie sondowania API: {exc}", - "ru": "Предупреждение при опросе API: {exc}", - "zh": "API 轮询警告:{exc}" - }, - "Acceptance Criteria has {count} unchecked item(s). All AC items must be checked (- [x]) before merge.": { - "bg": "Acceptance Criteria има {count} неотметнати елемента. Всички AC елементи трябва да са отметнати (- [x]) преди merge.", - "de": "Acceptance Criteria enthält {count} nicht abgehakte Elemente. Alle AC-Elemente müssen vor dem Merge abgehakt sein (- [x]).", - "en": "Acceptance Criteria has {count} unchecked item(s). All AC items must be checked (- [x]) before merge.", - "pl": "Acceptance Criteria ma {count} niezaznaczonych elementów. Wszystkie elementy AC muszą być zaznaczone (- [x]) przed merge.", - "ru": "Acceptance Criteria содержит {count} неотмеченных элементов. Все элементы AC должны быть отмечены (- [x]) перед merge.", - "zh": "验收标准有 {count} 个未勾选项目。所有 AC 项目必须在合并前勾选(- [x])。" - }, - "Acceptance Criteria section has no checklist items. Add at least one '- [ ] item'.": { - "bg": "Секцията Acceptance Criteria няма елементи от checklist. Добавете поне един '- [ ] item'.", - "de": "Der Abschnitt Acceptance Criteria enthält keine Checklisten-Elemente. Mindestens ein '- [ ] item' hinzufügen.", - "en": "Acceptance Criteria section has no checklist items. Add at least one '- [ ] item'.", - "pl": "Sekcja Acceptance Criteria nie zawiera elementów checklisty. Dodaj co najmniej jeden '- [ ] item'.", - "ru": "Раздел Acceptance Criteria не содержит элементов чек-листа. Добавьте хотя бы один '- [ ] item'.", - "zh": "验收标准部分没有清单项目。至少添加一个 '- [ ] item'。" - }, - "Action to perform": { - "bg": "Действие за изпълнение", - "de": "Auszuführende Aktion", - "en": "Action to perform", - "pl": "Akcja do wykonania", - "ru": "Выполняемое действие", - "zh": "要执行的操作" - }, - "Add @patch(\"subprocess.run\") or patch the calling function to fix this.": { - "bg": "Добавете @patch(\"subprocess.run\") или patch-нете извикващата функция, за да коригирате това.", - "de": "Fügen Sie @patch(\"subprocess.run\") hinzu oder patchen Sie die aufrufende Funktion.", - "en": "Add @patch(\"subprocess.run\") or patch the calling function to fix this.", - "pl": "Dodaj @patch(\"subprocess.run\") lub załataj funkcję wywołującą, aby to naprawić.", - "ru": "Добавьте @patch(\"subprocess.run\") или исправьте вызывающую функцию.", - "zh": "添加 @patch(\"subprocess.run\") 或修补调用函数以修复此问题。" - }, - "Added label '{label}' to PR #{pr}.": { - "bg": "Добавен етикет '{label}' към PR #{pr}.", - "de": "Label '{label}' zu PR #{pr} hinzugefügt.", - "en": "Added label '{label}' to PR #{pr}.", - "pl": "Dodano etykietę '{label}' do PR #{pr}.", - "ru": "Добавлена метка '{label}' к PR #{pr}.", - "zh": "已向 PR #{pr} 添加标签 '{label}'。" - }, - "Additional directory to scan (default: scripts, tests). Can be repeated.": { - "bg": "Допълнителна директория за сканиране (по подразбиране: scripts, tests). Може да се повтаря.", - "de": "Zusätzliches zu scannendes Verzeichnis (Standard: scripts, tests). Wiederholbar.", - "en": "Additional directory to scan (default: scripts, tests). Can be repeated.", - "pl": "Dodatkowy katalog do skanowania (domyślnie: scripts, tests). Można powtarzać.", - "ru": "Дополнительная директория для сканирования (по умолчанию: scripts, tests). Можно повторять.", - "zh": "要扫描的附加目录(默认:scripts、tests)。可重复使用。" - }, - "Additional excluded patterns (in addition to defaults)": { - "bg": "Допълнителни изключени шаблони (в допълнение към подразбираните)", - "de": "Zusätzliche ausgeschlossene Muster (zusätzlich zu den Standardwerten)", - "en": "Additional excluded patterns (in addition to defaults)", - "pl": "Dodatkowe wykluczone wzorce (oprócz domyślnych)", - "ru": "Дополнительные исключённые шаблоны (в дополнение к стандартным)", - "zh": "附加排除模式(除默认模式外)" - }, - "Allow empty tag (PR mode where SHA is concrete).": { - "bg": "Позволи празен таг (PR режим, където SHA е конкретен).", - "de": "Leeren Tag zulassen (PR-Modus, in dem SHA konkret ist).", - "en": "Allow empty tag (PR mode where SHA is concrete).", - "pl": "Zezwalaj na pusty tag (tryb PR, w którym SHA jest konkretne).", - "ru": "Разрешить пустой тег (режим PR, где SHA конкретен).", - "zh": "允许空标签(SHA 为具体值的 PR 模式)。" - }, - "Allow missing spec (warn only, don't fail)": { - "bg": "Позволи липсващ spec (само предупреждение, без грешка)", - "de": "Fehlende Spec erlauben (nur warnen, nicht fehlschlagen)", - "en": "Allow missing spec (warn only, don't fail)", - "pl": "Zezwól na brakujący spec (tylko ostrzeżenie, bez błędu)", - "ru": "Разрешить отсутствующий spec (только предупреждение, без ошибки)", - "zh": "允许缺少规范(仅警告,不失败)" - }, - "Another runner failed. Stopping this runner early.": { - "bg": "Друг runner се провали. Спиране на този runner по-рано.", - "de": "Ein anderer Runner ist fehlgeschlagen. Dieser Runner wird vorzeitig gestoppt.", - "en": "Another runner failed. Stopping this runner early.", - "pl": "Inny runner zakończył się niepowodzeniem. Wczesne zatrzymanie tego runnera.", - "ru": "Другой runner завершился с ошибкой. Останавливаю этот runner досрочно.", - "zh": "另一个 runner 失败。提前停止此 runner。" - }, - "Assigned {count} files to runner {runner_index}": { - "bg": "Разпределени {count} файла към runner {runner_index}", - "de": "{count} Dateien an Runner {runner_index} zugewiesen", - "en": "Assigned {count} files to runner {runner_index}", - "pl": "Przypisano {count} plików do runnera {runner_index}", - "ru": "Назначено {count} файлов раннеру {runner_index}", - "zh": "已将 {count} 个文件分配给 runner {runner_index}" - }, - "Assigned {count} items to runner {runner_index}: {encoded}": { - "bg": "Разпределени {count} елемента към runner {runner_index}: {encoded}", - "de": "{count} Elemente an Runner {runner_index} zugewiesen: {encoded}", - "en": "Assigned {count} items to runner {runner_index}: {encoded}", - "pl": "Przypisano {count} elementów do runnera {runner_index}: {encoded}", - "ru": "Назначено {count} элементов раннеру {runner_index}: {encoded}", - "zh": "已将 {count} 个项目分配给 runner {runner_index}:{encoded}" - }, - "Auto-rebase failed with HTTP {status}: {message}\nRebase manually:\n git fetch origin master && git rebase origin/master && git push --force-with-lease\nThen re-add the ready-to-merge label.": { - "bg": "Автоматичният rebase се провали с HTTP {status}: {message}\nНаправете rebase ръчно:\n git fetch origin master && git rebase origin/master && git push --force-with-lease\nСлед това добавете отново етикета ready-to-merge.", - "de": "Auto-Rebase mit HTTP {status} fehlgeschlagen: {message}\nManuell rebasen:\n git fetch origin master && git rebase origin/master && git push --force-with-lease\nDann das ready-to-merge-Label erneut hinzufügen.", - "en": "Auto-rebase failed with HTTP {status}: {message}\nRebase manually:\n git fetch origin master && git rebase origin/master && git push --force-with-lease\nThen re-add the ready-to-merge label.", - "pl": "Automatyczny rebase nie powiódł się z HTTP {status}: {message}\nWykonaj rebase ręcznie:\n git fetch origin master && git rebase origin/master && git push --force-with-lease\nNastępnie ponownie dodaj etykietę ready-to-merge.", - "ru": "Автоматический rebase завершился с HTTP {status}: {message}\nВыполните rebase вручную:\n git fetch origin master && git rebase origin/master && git push --force-with-lease\nЗатем снова добавьте метку ready-to-merge.", - "zh": "自动 rebase 失败,HTTP {status}:{message}\n请手动 rebase:\n git fetch origin master && git rebase origin/master && git push --force-with-lease\n然后重新添加 ready-to-merge 标签。" - }, - "Automated CI commit (badge) — skipping post-merge jobs.": { - "bg": "Автоматизиран CI комит (значка) — пропускат се post-merge задачите.", - "de": "Automatisierter CI-Commit (Badge) — Post-Merge-Jobs werden übersprungen.", - "en": "Automated CI commit (badge) — skipping post-merge jobs.", - "pl": "Zautomatyzowany commit CI (odznaka) — pomijanie zadań post-merge.", - "ru": "Автоматический CI-коммит (значок) — post-merge задачи пропускаются.", - "zh": "自动 CI 提交(徽章)——跳过后续合并任务。" - }, - "Badge push attempt {attempt}/{retries} failed — retrying: {error}": { - "bg": "Опит {attempt}/{retries} за push на значки се провали — повторен опит: {error}", - "de": "Badge-Push-Versuch {attempt}/{retries} fehlgeschlagen — erneuter Versuch: {error}", - "en": "Badge push attempt {attempt}/{retries} failed — retrying: {error}", - "pl": "Próba {attempt}/{retries} push odznak nie powiodła się — ponawianie: {error}", - "ru": "Попытка {attempt}/{retries} push значков не удалась — повтор: {error}", - "zh": "徽章推送尝试 {attempt}/{retries} 失败——正在重试:{error}" - }, - "Badge push failed after {retries} attempts: {error}": { - "bg": "Push на значки се провали след {retries} опита: {error}", - "de": "Badge-Push nach {retries} Versuchen fehlgeschlagen: {error}", - "en": "Badge push failed after {retries} attempts: {error}", - "pl": "Push odznak nie powiódł się po {retries} próbach: {error}", - "ru": "Push значков не удался после {retries} попыток: {error}", - "zh": "徽章推送在 {retries} 次尝试后失败:{error}" - }, - "Badges commit SHA: {sha}": { - "bg": "SHA на комита със значки: {sha}", - "de": "SHA des Badge-Commits: {sha}", - "en": "Badges commit SHA: {sha}", - "pl": "SHA commita z odznakami: {sha}", - "ru": "SHA коммита значков: {sha}", - "zh": "徽章提交 SHA:{sha}" - }, - "Badges pushed to badges branch": { - "bg": "Значките са push-нати към клона badges", - "de": "Badges zum badges-Branch gepusht", - "en": "Badges pushed to badges branch", - "pl": "Odznaki wypchnięte do gałęzi badges", - "ru": "Значки отправлены в ветку badges", - "zh": "徽章已推送到 badges 分支" - }, - "Base ref for diff": { - "bg": "Базов ref за diff", - "de": "Basis-Ref für Diff", - "en": "Base ref for diff", - "pl": "Bazowy ref dla diff", - "ru": "Базовый ref для diff", - "zh": "用于 diff 的基准 ref" - }, - "Branch '{branch}' does not contain a task ID.\n Expected format: {prefix}-N-short-description": { - "bg": "Клон '{branch}' не съдържа ID на задача.\n Очакван формат: {prefix}-N-кратко-описание", - "de": "Branch '{branch}' enthält keine Task-ID.\n Erwartetes Format: {prefix}-N-kurz-beschreibung", - "en": "Branch '{branch}' does not contain a task ID.\n Expected format: {prefix}-N-short-description", - "pl": "Gałąź '{branch}' nie zawiera ID zadania.\n Oczekiwany format: {prefix}-N-krótki-opis", - "ru": "Ветка '{branch}' не содержит ID задачи.\n Ожидаемый формат: {prefix}-N-краткое-описание", - "zh": "分支 '{branch}' 不包含任务 ID。\n 预期格式: {prefix}-N-简短描述" - }, - "Branch '{branch}' does not contain a task ID.\n Expected format: {prefix}-N-short-description\n Example: {prefix}-42-add-feature\n Fix: rename the branch or create a Vikunja task first:\n python -m devx.tools.create_task --title \"Task title\"": { - "bg": "Клон '{branch}' не съдържа ID на задача.\n Очакван формат: {prefix}-N-кратко-описание\n Пример: {prefix}-42-add-feature\n Решение: преименувайте клона или създайте Vikunja задача:\n python -m devx.tools.create_task --title \"Заглавие на задача\"", - "de": "Branch '{branch}' enthält keine Task-ID.\n Erwartetes Format: {prefix}-N-kurz-beschreibung\n Beispiel: {prefix}-42-add-feature\n Fix: Branch umbenennen oder Vikunja-Task erstellen:\n python -m devx.tools.create_task --title \"Task-Titel\"", - "en": "Branch '{branch}' does not contain a task ID.\n Expected format: {prefix}-N-short-description\n Example: {prefix}-42-add-feature\n Fix: rename the branch or create a Vikunja task first:\n python -m devx.tools.create_task --title \"Task title\"", - "pl": "Gałąź '{branch}' nie zawiera ID zadania.\n Oczekiwany format: {prefix}-N-krótki-opis\n Przykład: {prefix}-42-add-feature\n Naprawa: zmień nazwę gałęzi lub utwórz zadanie Vikunja:\n python -m devx.tools.create_task --title \"Tytuł zadania\"", - "ru": "Ветка '{branch}' не содержит ID задачи.\n Ожидаемый формат: {prefix}-N-краткое-описание\n Пример: {prefix}-42-add-feature\n Исправление: переименуйте ветку или создайте задачу Vikunja:\n python -m devx.tools.create_task --title \"Заголовок задачи\"", - "zh": "分支 '{branch}' 不包含任务 ID。\n 预期格式: {prefix}-N-简短描述\n 示例: {prefix}-42-add-feature\n 修复: 重命名分支或先创建 Vikunja 任务:\n python -m devx.tools.create_task --title \"任务标题\"" - }, - "Branch is already up-to-date with origin/master.": { - "bg": "Клонът вече е актуален спрямо origin/master.", - "de": "Branch ist bereits aktuell mit origin/master.", - "en": "Branch is already up-to-date with origin/master.", - "pl": "Gałąź jest już aktualna względem origin/master.", - "ru": "Ветка уже актуальна относительно origin/master.", - "zh": "分支已与 origin/master 同步。" - }, - "Branch is behind master. Auto-rebasing via Gitea API...\nA new CI run will start automatically after the rebase.\nThe next auto-merge attempt will merge this PR.": { - "bg": "Клонът изостава от master. Автоматичен rebase чрез Gitea API...\nНов CI run ще стартира автоматично след rebase.\nСледващият опит за auto-merge ще слее този PR.", - "de": "Branch liegt hinter master. Auto-Rebase via Gitea API...\nEin neuer CI-Lauf startet nach dem Rebase automatisch.\nDer nächste Auto-Merge-Versuch mergt diesen PR.", - "en": "Branch is behind master. Auto-rebasing via Gitea API...\nA new CI run will start automatically after the rebase.\nThe next auto-merge attempt will merge this PR.", - "pl": "Gałąź jest za master. Automatyczny rebase przez Gitea API...\nNowy przebieg CI rozpocznie się automatycznie po rebase.\nNastępna próba auto-merge połączy ten PR.", - "ru": "Ветка отстаёт от master. Автоматический rebase через Gitea API...\nНовый CI-запуск начнётся автоматически после rebase.\nСледующая попытка auto-merge сольёт этот PR.", - "zh": "分支落后于 master。正在通过 Gitea API 自动 rebase...\nrebase 后将自动开始新的 CI 运行。\n下一次自动合并尝试将合并此 PR。" - }, - "Branch is behind origin/master. Rebase first: git fetch origin master && git rebase origin/master": { - "bg": "Клонът изостава от origin/master. Първо rebase: git fetch origin master && git rebase origin/master", - "de": "Branch liegt hinter origin/master. Zuerst rebasen: git fetch origin master && git rebase origin/master", - "en": "Branch is behind origin/master. Rebase first: git fetch origin master && git rebase origin/master", - "pl": "Gałąź jest za origin/master. Najpierw wykonaj rebase: git fetch origin master && git rebase origin/master", - "ru": "Ветка отстаёт от origin/master. Сначала rebase: git fetch origin master && git rebase origin/master", - "zh": "分支落后于 origin/master。请先 rebase:git fetch origin master && git rebase origin/master" - }, - "Branch is {count} commit(s) behind master. Rebasing...": { - "bg": "Клонът изостава с {count} комит(а) от master. Rebase...", - "de": "Branch ist {count} Commit(s) hinter master. Rebase läuft...", - "en": "Branch is {count} commit(s) behind master. Rebasing...", - "pl": "Gałąź jest o {count} commit(ów) za master. Rebase...", - "ru": "Ветка отстаёт на {count} коммит(ов) от master. Rebase...", - "zh": "分支落后 master {count} 个提交。正在 rebase..." - }, - "Branch name (auto-fetched from PR if not given)": { - "bg": "Име на клон (извлича се автоматично от PR, ако не е зададено)", - "de": "Branch-Name (wird aus PR abgerufen, falls nicht angegeben)", - "en": "Branch name (auto-fetched from PR if not given)", - "pl": "Nazwa gałęzi (pobierana automatycznie z PR, jeśli nie podano)", - "ru": "Имя ветки (извлекается из PR, если не указано)", - "zh": "分支名称(未提供时从 PR 自动获取)" - }, - "Branch name (e.g., DEVX-256-fix-foo)": { - "bg": "Име на клон (напр. DEVX-256-fix-foo)", - "de": "Branch-Name (z. B. DEVX-256-fix-foo)", - "en": "Branch name (e.g., DEVX-256-fix-foo)", - "pl": "Nazwa gałęzi (np. DEVX-256-fix-foo)", - "ru": "Имя ветки (напр. DEVX-256-fix-foo)", - "zh": "分支名称(例如 DEVX-256-fix-foo)" - }, - "Branch name (e.g., OBL-INFRA-531-fix-foo)": { - "bg": "Име на клон (напр. OBL-INFRA-531-fix-foo)", - "de": "Branch-Name (z. B. OBL-INFRA-531-fix-foo)", - "en": "Branch name (e.g., OBL-INFRA-531-fix-foo)", - "pl": "Nazwa gałęzi (np. OBL-INFRA-531-fix-foo)", - "ru": "Имя ветки (напр. OBL-INFRA-531-fix-foo)", - "zh": "分支名称(例如 OBL-INFRA-531-fix-foo)" - }, - "Branch name must contain a task ID.": { - "bg": "Името на клона трябва да съдържа task ID.", - "de": "Der Branch-Name muss eine Task-ID enthalten.", - "en": "Branch name must contain a task ID.", - "pl": "Nazwa gałęzi musi zawierać ID zadania.", - "ru": "Имя ветки должно содержать ID задачи.", - "zh": "分支名称必须包含任务 ID。" - }, - "Build failed for {name}": { - "bg": "Изграждането на {name} се провали", - "de": "Build für {name} fehlgeschlagen", - "en": "Build failed for {name}", - "pl": "Budowanie {name} nie powiodło się", - "ru": "Сборка {name} не удалась", - "zh": "{name} 构建失败" - }, - "Bumping version: {current} -> v{new_version}": { - "bg": "Увеличаване на версията: {current} -> v{new_version}", - "de": "Version wird erhöht: {current} -> v{new_version}", - "en": "Bumping version: {current} -> v{new_version}", - "pl": "Zmiana wersji: {current} -> v{new_version}", - "ru": "Повышение версии: {current} -> v{new_version}", - "zh": "升级版本:{current} -> v{new_version}" - }, - "CI checks did not complete within timeout.": { - "bg": "CI проверките не завършиха в рамките на таймаута.", - "de": "CI-Checks wurden nicht innerhalb des Timeouts abgeschlossen.", - "en": "CI checks did not complete within timeout.", - "pl": "Kontrole CI nie zakończyły się w ramach limitu czasu.", - "ru": "CI-проверки не завершились в течение таймаута.", - "zh": "CI 检查未在超时时间内完成。" - }, - "CI checks failed.": { - "bg": "CI проверките се провалиха.", - "de": "CI-Checks fehlgeschlagen.", - "en": "CI checks failed.", - "pl": "Kontrole CI nie powiodły się.", - "ru": "CI-проверки завершились с ошибкой.", - "zh": "CI 检查失败。" - }, - "CI run ID (for set-failed/set-passed)": { - "bg": "ID на CI run (за set-failed/set-passed)", - "de": "CI-Run-ID (für set-failed/set-passed)", - "en": "CI run ID (for set-failed/set-passed)", - "pl": "ID przebiegu CI (dla set-failed/set-passed)", - "ru": "ID CI-запуска (для set-failed/set-passed)", - "zh": "CI 运行 ID(用于 set-failed/set-passed)" - }, - "CI run ID that triggered the publish": { - "bg": "ID на CI run, който задейства публикуването", - "de": "CI-Run-ID, die die Veröffentlichung ausgelöst hat", - "en": "CI run ID that triggered the publish", - "pl": "ID przebiegu CI, który wyzwolił publikację", - "ru": "ID CI-запуска, инициировавшего публикацию", - "zh": "触发发布的 CI 运行 ID" - }, - "CI_GITEA_API_TOKEN not set: {error}": { - "bg": "CI_GITEA_API_TOKEN не е зададен: {error}", - "de": "CI_GITEA_API_TOKEN nicht gesetzt: {error}", - "en": "CI_GITEA_API_TOKEN not set: {error}", - "pl": "CI_GITEA_API_TOKEN nie jest ustawiony: {error}", - "ru": "CI_GITEA_API_TOKEN не задан: {error}", - "zh": "未设置 CI_GITEA_API_TOKEN:{error}" - }, - "CI_GITEA_TOKEN environment variable required": { - "bg": "Изисква се променлива на средата CI_GITEA_TOKEN", - "de": "Umgebungsvariable CI_GITEA_TOKEN erforderlich", - "en": "CI_GITEA_TOKEN environment variable required", - "pl": "Wymagana zmienna środowiskowa CI_GITEA_TOKEN", - "ru": "Требуется переменная окружения CI_GITEA_TOKEN", - "zh": "需要环境变量 CI_GITEA_TOKEN" - }, - "CI_GITEA_TOKEN is not set.": { - "bg": "CI_GITEA_TOKEN не е зададен.", - "de": "CI_GITEA_TOKEN ist nicht gesetzt.", - "en": "CI_GITEA_TOKEN is not set.", - "pl": "CI_GITEA_TOKEN nie jest ustawiony.", - "ru": "CI_GITEA_TOKEN не задан.", - "zh": "未设置 CI_GITEA_TOKEN。" - }, - "CI_GITEA_TOKEN is not set. Add it to .env or export it.": { - "bg": "CI_GITEA_TOKEN не е зададен. Добавете го в .env или го експортирайте.", - "de": "CI_GITEA_TOKEN ist nicht gesetzt. Zu .env hinzufügen oder exportieren.", - "en": "CI_GITEA_TOKEN is not set. Add it to .env or export it.", - "pl": "CI_GITEA_TOKEN nie jest ustawiony. Dodaj go do .env lub wyeksportuj.", - "ru": "CI_GITEA_TOKEN не задан. Добавьте его в .env или экспортируйте.", - "zh": "未设置 CI_GITEA_TOKEN。请添加到 .env 或导出。" - }, - "CI_GITEA_TOKEN is not set. Required to create a PR.": { - "bg": "CI_GITEA_TOKEN не е зададен. Необходим за създаване на PR.", - "de": "CI_GITEA_TOKEN nicht gesetzt. Erforderlich zum Erstellen eines PR.", - "en": "CI_GITEA_TOKEN is not set. Required to create a PR.", - "pl": "CI_GITEA_TOKEN nie jest ustawiony. Wymagany do utworzenia PR.", - "ru": "CI_GITEA_TOKEN не установлен. Требуется для создания PR.", - "zh": "CI_GITEA_TOKEN 未设置。创建 PR 所需。" - }, - "CI_GITEA_TOKEN not set — skipping login configuration.": { - "bg": "CI_GITEA_TOKEN не е зададен — пропуска се конфигурацията за вход.", - "de": "CI_GITEA_TOKEN nicht gesetzt — Login-Konfiguration wird übersprungen.", - "en": "CI_GITEA_TOKEN not set — skipping login configuration.", - "pl": "CI_GITEA_TOKEN nie jest ustawiony — pomijanie konfiguracji logowania.", - "ru": "CI_GITEA_TOKEN не задан — настройка входа пропускается.", - "zh": "未设置 CI_GITEA_TOKEN——跳过登录配置。" - }, - "Cannot read __version__ from src/{pkg}/__init__.py — skipping.": { - "bg": "", - "de": "", - "en": "Cannot read __version__ from src/{pkg}/__init__.py — skipping.", - "pl": "", - "ru": "", - "zh": "" - }, - "Cannot rebase: not on a branch (detached HEAD).": { - "bg": "Не може rebase: не сте на клон (detached HEAD).", - "de": "Rebase nicht möglich: nicht auf einem Branch (detached HEAD).", - "en": "Cannot rebase: not on a branch (detached HEAD).", - "pl": "Nie można wykonać rebase: nie na gałęzi (detached HEAD).", - "ru": "Невозможно выполнить rebase: не на ветке (detached HEAD).", - "zh": "无法 rebase:不在分支上(detached HEAD)。" - }, - "Checking CLI command documentation...": { - "bg": "Проверка на документацията за CLI команди...", - "de": "Prüfe CLI-Befehlsdokumentation...", - "en": "Checking CLI command documentation...", - "pl": "Sprawdzanie dokumentacji poleceń CLI...", - "ru": "Проверка документации CLI-команд...", - "zh": "正在检查 CLI 命令文档..." - }, - "Checking code block languages...": { - "bg": "", - "de": "", - "en": "Checking code block languages...", - "pl": "", - "ru": "", - "zh": "" - }, - "Checking docs structure...": { - "bg": "Проверка на структурата на документацията...", - "de": "Prüfe Dokumentationsstruktur...", - "en": "Checking docs structure...", - "pl": "Sprawdzanie struktury dokumentacji...", - "ru": "Проверка структуры документации...", - "zh": "正在检查文档结构..." - }, - "Checking duplicate headings...": { - "bg": "Проверка за дублирани заглавия...", - "de": "Prüfe auf doppelte Überschriften...", - "en": "Checking duplicate headings...", - "pl": "Sprawdzanie zduplikowanych nagłówków...", - "ru": "Проверка дублирующихся заголовков...", - "zh": "正在检查重复标题..." - }, - "Checking for TODO/FIXME markers...": { - "bg": "Проверка за TODO/FIXME маркери...", - "de": "Prüfe auf TODO/FIXME-Marker...", - "en": "Checking for TODO/FIXME markers...", - "pl": "Sprawdzanie znaczników TODO/FIXME...", - "ru": "Проверка меток TODO/FIXME...", - "zh": "正在检查 TODO/FIXME 标记..." - }, - "Checking for orphan docs...": { - "bg": "", - "de": "", - "en": "Checking for orphan docs...", - "pl": "", - "ru": "", - "zh": "" - }, - "Checking for stale docs...": { - "bg": "Проверка за остарели документи...", - "de": "Prüfe auf veraltete Dokumente...", - "en": "Checking for stale docs...", - "pl": "Sprawdzanie nieaktualnych dokumentów...", - "ru": "Проверка устаревших документов...", - "zh": "正在检查过时文档..." - }, - "Checking heading hierarchy...": { - "bg": "Проверка на йерархията на заглавията...", - "de": "Prüfe Überschriftenhierarchie...", - "en": "Checking heading hierarchy...", - "pl": "Sprawdzanie hierarchii nagłówków...", - "ru": "Проверка иерархии заголовков...", - "zh": "正在检查标题层级..." - }, - "Checking internal links...": { - "bg": "Проверка на вътрешни връзки...", - "de": "Prüfe interne Links...", - "en": "Checking internal links...", - "pl": "Sprawdzanie linków wewnętrznych...", - "ru": "Проверка внутренних ссылок...", - "zh": "正在检查内部链接..." - }, - "Checking line length...": { - "bg": "", - "de": "", - "en": "Checking line length...", - "pl": "", - "ru": "", - "zh": "" - }, - "Checking max heading depth...": { - "bg": "", - "de": "", - "en": "Checking max heading depth...", - "pl": "", - "ru": "", - "zh": "" - }, - "Checking required files...": { - "bg": "Проверка на задължителните файлове...", - "de": "Prüfe erforderliche Dateien...", - "en": "Checking required files...", - "pl": "Sprawdzanie wymaganych plików...", - "ru": "Проверка обязательных файлов...", - "zh": "正在检查必需文件..." - }, - "Checking single H1 per file...": { - "bg": "", - "de": "", - "en": "Checking single H1 per file...", - "pl": "", - "ru": "", - "zh": "" - }, - "Checking status for PR #{pr_number}...": { - "bg": "Проверка на статуса на PR #{pr_number}...", - "de": "Prüfe Status für PR #{pr_number}...", - "en": "Checking status for PR #{pr_number}...", - "pl": "Sprawdzanie statusu PR #{pr_number}...", - "ru": "Проверка статуса PR #{pr_number}...", - "zh": "正在检查 PR #{pr_number} 的状态..." - }, - "Checking trailing whitespace...": { - "bg": "Проверка за крайни интервали...", - "de": "Prüfe auf abschließende Leerzeichen...", - "en": "Checking trailing whitespace...", - "pl": "Sprawdzanie końcowych białych znaków...", - "ru": "Проверка конечных пробелов...", - "zh": "正在检查行尾空白..." - }, - "Checking version references for {pkg} (current: v{version})": { - "bg": "", - "de": "", - "en": "Checking version references for {pkg} (current: v{version})", - "pl": "", - "ru": "", - "zh": "" - }, - "CliRunner.invoke({target}) in test '{test}' reaches unpatched dangerous functions: {funcs}. Add @patch for each or patch the calling function.": { - "bg": "CliRunner.invoke({target}) в тест '{test}' достига непачнати опасни функции: {funcs}. Добавете @patch за всяка или patch-нете извикващата функция.", - "de": "CliRunner.invoke({target}) in Test '{test}' erreicht ungepatchte gefährliche Funktionen: {funcs}. @patch für jede hinzufügen oder die aufrufende Funktion patchen.", - "en": "CliRunner.invoke({target}) in test '{test}' reaches unpatched dangerous functions: {funcs}. Add @patch for each or patch the calling function.", - "pl": "CliRunner.invoke({target}) w teście '{test}' sięga niezałatanych niebezpiecznych funkcji: {funcs}. Dodaj @patch dla każdej lub załataj funkcję wywołującą.", - "ru": "CliRunner.invoke({target}) в тесте '{test}' достигает незапатченных опасных функций: {funcs}. Добавьте @patch для каждой или запатчите вызывающую функцию.", - "zh": "测试 '{test}' 中的 CliRunner.invoke({target}) 触达未修补的危险函数:{funcs}。请为每个函数添加 @patch 或修补调用函数。" - }, - "Cloned existing wiki.": { - "bg": "", - "de": "", - "en": "Cloned existing wiki.", - "pl": "", - "ru": "", - "zh": "" - }, - "Cloning wiki repo...": { - "bg": "", - "de": "", - "en": "Cloning wiki repo...", - "pl": "", - "ru": "", - "zh": "" - }, - "Command failed ({cmd}): {stderr}": { - "bg": "Командата се провали ({cmd}): {stderr}", - "de": "Befehl fehlgeschlagen ({cmd}): {stderr}", - "en": "Command failed ({cmd}): {stderr}", - "pl": "Polecenie nie powiodło się ({cmd}): {stderr}", - "ru": "Команда завершилась с ошибкой ({cmd}): {stderr}", - "zh": "命令失败({cmd}):{stderr}" - }, - "Commit message: {msg}": { - "bg": "Съобщение на комит: {msg}", - "de": "Commit-Nachricht: {msg}", - "en": "Commit message: {msg}", - "pl": "Treść commita: {msg}", - "ru": "Сообщение коммита: {msg}", - "zh": "提交信息:{msg}" - }, - "Commit: {sha}": { - "bg": "Комит: {sha}", - "de": "Commit: {sha}", - "en": "Commit: {sha}", - "pl": "Commit: {sha}", - "ru": "Коммит: {sha}", - "zh": "提交:{sha}" - }, - "Committing and pushing...": { - "bg": "", - "de": "", - "en": "Committing and pushing...", - "pl": "", - "ru": "", - "zh": "" - }, - "Comparing {base}..{head} ({count} files changed)": { - "bg": "Сравняване на {base}..{head} ({count} променени файла)", - "de": "Vergleiche {base}..{head} ({count} geänderte Dateien)", - "en": "Comparing {base}..{head} ({count} files changed)", - "pl": "Porównywanie {base}..{head} ({count} zmienionych plików)", - "ru": "Сравнение {base}..{head} ({count} изменённых файлов)", - "zh": "正在比较 {base}..{head}({count} 个文件已更改)" - }, - "Configuration OK: [tool.devx] present, devx versions consistent.": { - "bg": "Конфигурацията е OK: [tool.devx] присъства, версиите на devx са консистентни.", - "de": "Konfiguration OK: [tool.devx] vorhanden, devx-Versionen konsistent.", - "en": "Configuration OK: [tool.devx] present, devx versions consistent.", - "pl": "Konfiguracja OK: [tool.devx] obecne, wersje devx spójne.", - "ru": "Конфигурация OK: [tool.devx] присутствует, версии devx согласованы.", - "zh": "配置正常: [tool.devx] 已存在, devx 版本一致。" - }, - "Configuration validation failed.": { - "bg": "Валидацията на конфигурацията се провали.", - "de": "Konfigurationsvalidierung fehlgeschlagen.", - "en": "Configuration validation failed.", - "pl": "Walidacja konfiguracji nie powiodła się.", - "ru": "Проверка конфигурации не удалась.", - "zh": "配置验证失败。" - }, - "Configuring branch protection for {branch}...": { - "bg": "Конфигуриране на защита на клона {branch}...", - "de": "Konfiguriere Branch-Schutz für {branch}...", - "en": "Configuring branch protection for {branch}...", - "pl": "Konfigurowanie ochrony gałęzi dla {branch}...", - "ru": "Настройка защиты ветки {branch}...", - "zh": "正在配置 {branch} 的分支保护..." - }, - "Configuring repository settings...": { - "bg": "Конфигуриране на настройките на хранилището...", - "de": "Repository-Einstellungen konfigurieren...", - "en": "Configuring repository settings...", - "pl": "Konfigurowanie ustawień repozytorium...", - "ru": "Настройка параметров репозитория...", - "zh": "正在配置仓库设置..." - }, - "Configuring tea login '{name}' for {url}...": { - "bg": "Конфигуриране на tea вход '{name}' за {url}...", - "de": "Konfiguriere tea-Login '{name}' für {url}...", - "en": "Configuring tea login '{name}' for {url}...", - "pl": "Konfigurowanie logowania tea '{name}' dla {url}...", - "ru": "Настройка входа tea '{name}' для {url}...", - "zh": "正在为 {url} 配置 tea 登录 '{name}'..." - }, - "Could not detect PR number. Use --pr to specify it explicitly,\nor run this command from a branch with an open PR.": { - "bg": "Не може да се определи номерът на PR. Използвайте --pr, за да го зададете изрично,\nили изпълнете командата от клон с отворен PR.", - "de": "PR-Nummer konnte nicht ermittelt werden. Mit --pr explizit angeben,\noder den Befehl von einem Branch mit offenem PR ausführen.", - "en": "Could not detect PR number. Use --pr to specify it explicitly,\nor run this command from a branch with an open PR.", - "pl": "Nie można wykryć numeru PR. Użyj --pr, aby go podać jawnie,\nlub uruchom polecenie z gałęzi z otwartym PR.", - "ru": "Не удалось определить номер PR. Укажите его явно через --pr,\nили выполните команду из ветки с открытым PR.", - "zh": "无法检测 PR 编号。请使用 --pr 明确指定,\n或在有开放 PR 的分支上运行此命令。" - }, - "Could not detect current branch: {error}": { - "bg": "Не може да се определи текущия клон: {error}", - "de": "Aktueller Branch konnte nicht erkannt werden: {error}", - "en": "Could not detect current branch: {error}", - "pl": "Nie można wykryć bieżącej gałęzi: {error}", - "ru": "Не удалось определить текущую ветку: {error}", - "zh": "无法检测当前分支: {error}" - }, - "Could not determine branch name from PR #{pr}": { - "bg": "Не може да се определи името на клона от PR #{pr}", - "de": "Branch-Name konnte aus PR #{pr} nicht ermittelt werden", - "en": "Could not determine branch name from PR #{pr}", - "pl": "Nie można określić nazwy gałęzi z PR #{pr}", - "ru": "Не удалось определить имя ветки из PR #{pr}", - "zh": "无法从 PR #{pr} 确定分支名称" - }, - "Could not determine head SHA for PR #{pr_number}.": { - "bg": "Не може да се определи head SHA за PR #{pr_number}.", - "de": "Head-SHA für PR #{pr_number} konnte nicht ermittelt werden.", - "en": "Could not determine head SHA for PR #{pr_number}.", - "pl": "Nie można określić head SHA dla PR #{pr_number}.", - "ru": "Не удалось определить head SHA для PR #{pr_number}.", - "zh": "无法确定 PR #{pr_number} 的 head SHA。" - }, - "Could not determine repository. Set DEVX_REPO_OWNER and DEVX_REPO_NAME\nor GITHUB_REPOSITORY environment variables.": { - "bg": "Не може да се определи репозитория. Задайте променливите DEVX_REPO_OWNER и DEVX_REPO_NAME\nили GITHUB_REPOSITORY.", - "de": "Repository konnte nicht ermittelt werden. Setzen Sie DEVX_REPO_OWNER und DEVX_REPO_NAME\noder die Umgebungsvariable GITHUB_REPOSITORY.", - "en": "Could not determine repository. Set DEVX_REPO_OWNER and DEVX_REPO_NAME\nor GITHUB_REPOSITORY environment variables.", - "pl": "Nie można określić repozytorium. Ustaw zmienne DEVX_REPO_OWNER i DEVX_REPO_NAME\nlub GITHUB_REPOSITORY.", - "ru": "Не удалось определить репозиторий. Задайте переменные DEVX_REPO_OWNER и DEVX_REPO_NAME\nили GITHUB_REPOSITORY.", - "zh": "无法确定仓库。请设置环境变量 DEVX_REPO_OWNER 和 DEVX_REPO_NAME\n或 GITHUB_REPOSITORY。" - }, - "Could not extract conventional commit message from PR commits.": { - "bg": "Не може да се извлече conventional commit съобщение от PR комитите.", - "de": "Konnte keine Conventional-Commit-Nachricht aus den PR-Commits extrahieren.", - "en": "Could not extract conventional commit message from PR commits.", - "pl": "Nie udało się wyodrębnić konwencjonalnej wiadomości commit z commitów PR.", - "ru": "Не удалось извлечь conventional commit сообщение из коммитов PR.", - "zh": "无法从 PR 提交中提取 conventional commit 信息。" - }, - "Could not fetch PR title from Gitea (CI_GITEA_TOKEN not set or PR not found).": { - "bg": "Не може да се извлече заглавието на PR от Gitea (CI_GITEA_TOKEN не е зададен или PR не е намерен).", - "de": "PR-Titel konnte nicht von Gitea abgerufen werden (CI_GITEA_TOKEN nicht gesetzt oder PR nicht gefunden).", - "en": "Could not fetch PR title from Gitea (CI_GITEA_TOKEN not set or PR not found).", - "pl": "Nie można pobrać tytułu PR z Gitea (CI_GITEA_TOKEN nie ustawiony lub PR nie znaleziony).", - "ru": "Не удалось получить заголовок PR из Gitea (CI_GITEA_TOKEN не задан или PR не найден).", - "zh": "无法从 Gitea 获取 PR 标题(CI_GITEA_TOKEN 未设置或 PR 未找到)。" - }, - "Could not find Vikunja task {task_id} in project {project_id}.": { - "bg": "Не е намерена Vikunja задача {task_id} в проект {project_id}.", - "de": "Vikunja-Task {task_id} in Projekt {project_id} nicht gefunden.", - "en": "Could not find Vikunja task {task_id} in project {project_id}.", - "pl": "Nie znaleziono zadania Vikunja {task_id} w projekcie {project_id}.", - "ru": "Не найдена задача Vikunja {task_id} в проекте {project_id}.", - "zh": "在项目 {project_id} 中找不到 Vikunja 任务 {task_id}。" - }, - "Could not find Vikunja task {task_id} in project {project_id}. Every PR must have a corresponding Vikunja task.": { - "bg": "Не е намерена Vikunja задача {task_id} в проект {project_id}. Всеки PR трябва да има съответна Vikunja задача.", - "de": "Vikunja-Task {task_id} in Projekt {project_id} nicht gefunden. Jeder PR muss einen entsprechenden Vikunja-Task haben.", - "en": "Could not find Vikunja task {task_id} in project {project_id}. Every PR must have a corresponding Vikunja task.", - "pl": "Nie znaleziono zadania Vikunja {task_id} w projekcie {project_id}. Każdy PR musi mieć odpowiadające zadanie Vikunja.", - "ru": "Задача Vikunja {task_id} в проекте {project_id} не найдена. Каждый PR должен иметь соответствующую задачу Vikunja.", - "zh": "在项目 {project_id} 中未找到 Vikunja 任务 {task_id}。每个 PR 必须有对应的 Vikunja 任务。" - }, - "Could not find __version__ in {file}": { - "bg": "Не е намерен __version__ в {file}", - "de": "__version__ in {file} nicht gefunden", - "en": "Could not find __version__ in {file}", - "pl": "Nie znaleziono __version__ w {file}", - "ru": "__version__ не найден в {file}", - "zh": "在 {file} 中未找到 __version__" - }, - "Could not find pinned version for {pkg}": { - "bg": "Не е намерена фиксирана версия за {pkg}", - "de": "Keine gepinnte Version für {pkg} gefunden", - "en": "Could not find pinned version for {pkg}", - "pl": "Nie znaleziono przypiętej wersji dla {pkg}", - "ru": "Не найдена закреплённая версия для {pkg}", - "zh": "未找到 {pkg} 的固定版本" - }, - "Could not parse test execution time from output.": { - "bg": "Не може да се извлече време за изпълнение на теста от изхода.", - "de": "Testausführungszeit konnte aus der Ausgabe nicht gelesen werden.", - "en": "Could not parse test execution time from output.", - "pl": "Nie udało się przeanalizować czasu wykonania testu z wyjścia.", - "ru": "Не удалось извлечь время выполнения теста из вывода.", - "zh": "无法从输出中解析测试执行时间。" - }, - "Created PR #{index}: {title}\n {url}": { - "bg": "Създаден PR #{index}: {title}\n {url}", - "de": "PR erstellt #{index}: {title}\n {url}", - "en": "Created PR #{index}: {title}\n {url}", - "pl": "Utworzono PR #{index}: {title}\n {url}", - "ru": "Создан PR #{index}: {title}\n {url}", - "zh": "已创建 PR #{index}: {title}\n {url}" - }, - "Created Vikunja task: {identifier} (id={task_id})": { - "bg": "Създадена Vikunja задача: {identifier} (id={task_id})", - "de": "Vikunja-Task erstellt: {identifier} (id={task_id})", - "en": "Created Vikunja task: {identifier} (id={task_id})", - "pl": "Utworzono zadanie Vikunja: {identifier} (id={task_id})", - "ru": "Создана задача Vikunja: {identifier} (id={task_id})", - "zh": "已创建 Vikunja 任务: {identifier} (id={task_id})" - }, - "Created issue #{issue_id}: {title}": { - "bg": "Създадено issue #{issue_id}: {title}", - "de": "Issue #{issue_id} erstellt: {title}", - "en": "Created issue #{issue_id}: {title}", - "pl": "Utworzono zgłoszenie #{issue_id}: {title}", - "ru": "Создано issue #{issue_id}: {title}", - "zh": "已创建 issue #{issue_id}:{title}" - }, - "Created release commit.": { - "bg": "Създаден е release комит.", - "de": "Release-Commit erstellt.", - "en": "Created release commit.", - "pl": "Utworzono commit wydania.", - "ru": "Создан релизный коммит.", - "zh": "已创建发布提交。" - }, - "Dependencies must have documentation comments.": { - "bg": "Зависимостите трябва да имат документиращи коментари.", - "de": "Abhängigkeiten müssen Dokumentationskommentare haben.", - "en": "Dependencies must have documentation comments.", - "pl": "Zależności muszą mieć komentarze dokumentacyjne.", - "ru": "Зависимости должны иметь документирующие комментарии.", - "zh": "依赖项必须有文档注释。" - }, - "Directory containing Ansible roles": { - "bg": "Директория, съдържаща Ansible роли", - "de": "Verzeichnis mit Ansible-Rollen", - "en": "Directory containing Ansible roles", - "pl": "Katalog zawierający role Ansible", - "ru": "Директория, содержащая роли Ansible", - "zh": "包含 Ansible 角色的目录" - }, - "Directory containing spec files": { - "bg": "Директория, съдържаща spec файлове", - "de": "Verzeichnis mit Spec-Dateien", - "en": "Directory containing spec files", - "pl": "Katalog zawierający pliki spec", - "ru": "Директория, содержащая spec-файлы", - "zh": "包含规范文件的目录" - }, - "Directory to scan (default: tests/integration). Can be repeated.": { - "bg": "Директория за сканиране (по подразбиране: tests/integration). Може да се повтаря.", - "de": "Zu scannendes Verzeichnis (Standard: tests/integration). Kann wiederholt werden.", - "en": "Directory to scan (default: tests/integration). Can be repeated.", - "pl": "Katalog do skanowania (domyślnie: tests/integration). Można powtarzać.", - "ru": "Директория для сканирования (по умолчанию: tests/integration). Можно повторять.", - "zh": "要扫描的目录(默认:tests/integration)。可重复。" - }, - "Docker daemon already running": { - "bg": "Докер демонът вече работи", - "de": "Docker-Daemon läuft bereits", - "en": "Docker daemon already running", - "pl": "Demon Docker już uruchomiony", - "ru": "Демон Docker уже работает", - "zh": "Docker 守护进程已在运行" - }, - "Docker daemon failed to start": { - "bg": "Docker демонът не успя да стартира", - "de": "Docker-Daemon konnte nicht gestartet werden", - "en": "Docker daemon failed to start", - "pl": "Nie udało się uruchomić demona Docker", - "ru": "Не удалось запустить Docker-демон", - "zh": "Docker 守护进程启动失败" - }, - "Docker daemon started": { - "bg": "Docker демонът стартира", - "de": "Docker-Daemon gestartet", - "en": "Docker daemon started", - "pl": "Demon Docker uruchomiony", - "ru": "Docker-демон запущен", - "zh": "Docker 守护进程已启动" - }, - "Dockerfile not found: {path}": { - "bg": "Dockerfile не е намерен: {path}", - "de": "Dockerfile nicht gefunden: {path}", - "en": "Dockerfile not found: {path}", - "pl": "Nie znaleziono Dockerfile: {path}", - "ru": "Dockerfile не найден: {path}", - "zh": "未找到 Dockerfile:{path}" - }, - "Dry-run mode: on branch '{branch}' (not master). Some checks may behave differently.": { - "bg": "Режим dry-run: на клон '{branch}' (не master). Някои проверки може да се държат различно.", - "de": "Dry-Run-Modus: auf Branch '{branch}' (nicht master). Einige Prüfungen können sich anders verhalten.", - "en": "Dry-run mode: on branch '{branch}' (not master). Some checks may behave differently.", - "pl": "Tryb dry-run: na gałęzi '{branch}' (nie master). Niektóre kontrole mogą zachowywać się inaczej.", - "ru": "Режим dry-run: в ветке '{branch}' (не master). Некоторые проверки могут вести себя иначе.", - "zh": "Dry-run 模式:在分支 '{branch}' 上(非 master)。某些检查可能表现不同。" - }, - "ERROR: CI_GITEA_TOKEN is not set.": { - "bg": "ГРЕШКА: CI_GITEA_TOKEN не е зададен.", - "de": "FEHLER: CI_GITEA_TOKEN ist nicht gesetzt.", - "en": "ERROR: CI_GITEA_TOKEN is not set.", - "pl": "BŁĄD: CI_GITEA_TOKEN nie jest ustawiony.", - "ru": "ОШИБКА: CI_GITEA_TOKEN не задан.", - "zh": "错误:未设置 CI_GITEA_TOKEN。" - }, - "ERROR: Repository name not specified. Use --repo or set DEVX_REPO_NAME.": { - "bg": "ГРЕШКА: Името на хранилището не е указано. Използвайте --repo или задайте DEVX_REPO_NAME.", - "de": "FEHLER: Repository-Name nicht angegeben. Verwenden Sie --repo oder setzen Sie DEVX_REPO_NAME.", - "en": "ERROR: Repository name not specified. Use --repo or set DEVX_REPO_NAME.", - "pl": "BŁĄD: Nazwa repozytorium nie jest określona. Użyj --repo lub ustaw DEVX_REPO_NAME.", - "ru": "ОШИБКА: Имя репозитория не указано. Используйте --repo или задайте DEVX_REPO_NAME.", - "zh": "错误:未指定仓库名称。请使用 --repo 或设置 DEVX_REPO_NAME。" - }, - "ERROR: Tag consistency check failed. Existing tags are misaligned:": { - "bg": "ГРЕШКА: Проверката за консистентност на таговете се провали. Съществуващите тагове са несъответстващи:", - "de": "FEHLER: Tag-Konsistenzprüfung fehlgeschlagen. Bestehende Tags sind falsch zugeordnet:", - "en": "ERROR: Tag consistency check failed. Existing tags are misaligned:", - "pl": "BŁĄD: Kontrola zgodności tagów nie powiodła się. Istniejące tagi są niezgodne:", - "ru": "ОШИБКА: Проверка согласованности тегов не удалась. Существующие теги несогласованы:", - "zh": "错误:标签一致性检查失败。现有标签不匹配:" - }, - "ERROR: VIKUNJA_TOKEN is not set.": { - "bg": "ГРЕШКА: VIKUNJA_TOKEN не е зададен.", - "de": "FEHLER: VIKUNJA_TOKEN ist nicht gesetzt.", - "en": "ERROR: VIKUNJA_TOKEN is not set.", - "pl": "BŁĄD: VIKUNJA_TOKEN nie jest ustawiony.", - "ru": "ОШИБКА: VIKUNJA_TOKEN не задан.", - "zh": "错误:未设置 VIKUNJA_TOKEN。" - }, - "ERROR: mapping.json not found at {path}": { - "bg": "ГРЕШКА: mapping.json не е намерен в {path}", - "de": "FEHLER: mapping.json nicht gefunden unter {path}", - "en": "ERROR: mapping.json not found at {path}", - "pl": "BŁĄD: mapping.json nie znaleziono w {path}", - "ru": "ОШИБКА: mapping.json не найден по пути {path}", - "zh": "错误:在 {path} 未找到 mapping.json" - }, - "Each item must be a string or an object with 'id', got {type}": { - "bg": "Всеки елемент трябва да е низ или обект с 'id', получено {type}", - "de": "Jedes Element muss ein String oder ein Objekt mit 'id' sein, erhalten {type}", - "en": "Each item must be a string or an object with 'id', got {type}", - "pl": "Każdy element musi być ciągiem lub obiektem z 'id', otrzymano {type}", - "ru": "Каждый элемент должен быть строкой или объектом с 'id', получено {type}", - "zh": "每个元素必须是字符串或带有 'id' 的对象,得到 {type}" - }, - "Ensuring standard labels...": { - "bg": "Осигуряване на стандартни етикети...", - "de": "Standard-Labels werden sichergestellt...", - "en": "Ensuring standard labels...", - "pl": "Zapewnianie standardowych etykiet...", - "ru": "Обеспечение стандартных меток...", - "zh": "正在确保标准标签..." - }, - "FAIL: Could not clone wiki for verification.": { - "bg": "", - "de": "", - "en": "FAIL: Could not clone wiki for verification.", - "pl": "", - "ru": "", - "zh": "" - }, - "FAIL: {n} documentation issues found:": { - "bg": "ГРЕШКА: Намерени {n} проблема в документацията:", - "de": "FEHLER: {n} Dokumentationsprobleme gefunden:", - "en": "FAIL: {n} documentation issues found:", - "pl": "BŁĄD: Znaleziono {n} problemów z dokumentacją:", - "ru": "ОШИБКА: Найдено {n} проблем в документации:", - "zh": "失败:发现 {n} 个文档问题:" - }, - "FAILED: {count} undocumented dependency/ies": { - "bg": "НЕУСПЕШНО: {count} недокументирани зависимости", - "de": "FEHLGESCHLAGEN: {count} undokumentierte Abhängigkeit(en)", - "en": "FAILED: {count} undocumented dependency/ies", - "pl": "NIEUDANE: {count} nieudokumentowanych zależności", - "ru": "ПРОВАЛЕНО: {count} недокументированных зависимостей", - "zh": "失败:{count} 个未记录的依赖项" - }, - "Failed images: {names}": { - "bg": "Неуспешни изображения: {names}", - "de": "Fehlgeschlagene Images: {names}", - "en": "Failed images: {names}", - "pl": "Nieudane obrazy: {names}", - "ru": "Неудавшиеся образы: {names}", - "zh": "失败的镜像:{names}" - }, - "Failed to create branch: {error}": { - "bg": "Неуспешно създаване на клон: {error}", - "de": "Branch konnte nicht erstellt werden: {error}", - "en": "Failed to create branch: {error}", - "pl": "Nie udało się utworzyć gałęzi: {error}", - "ru": "Не удалось создать ветку: {error}", - "zh": "创建分支失败:{error}" - }, - "Failed to create issue via tea: {error}": { - "bg": "Неуспешно създаване на issue чрез tea: {error}", - "de": "Issue konnte nicht via tea erstellt werden: {error}", - "en": "Failed to create issue via tea: {error}", - "pl": "Nie udało się utworzyć zgłoszenia przez tea: {error}", - "ru": "Не удалось создать issue через tea: {error}", - "zh": "通过 tea 创建 issue 失败:{error}" - }, - "Failed to delete {count} image version(s)": { - "bg": "Неуспешно изтриване на {count} версии на изображения", - "de": "{count} Image-Version(en) konnten nicht gelöscht werden", - "en": "Failed to delete {count} image version(s)", - "pl": "Nie udało się usunąć {count} wersji obrazów", - "ru": "Не удалось удалить {count} версий образов", - "zh": "删除 {count} 个镜像版本失败" - }, - "Failed to fetch PR #{pr}: {error}": { - "bg": "Неуспешно извличане на PR #{pr}: {error}", - "de": "PR #{pr} konnte nicht abgerufen werden: {error}", - "en": "Failed to fetch PR #{pr}: {error}", - "pl": "Nie udało się pobrać PR #{pr}: {error}", - "ru": "Не удалось получить PR #{pr}: {error}", - "zh": "获取 PR #{pr} 失败:{error}" - }, - "Failed to list versions for {name}: {error}": { - "bg": "Неуспешно изброяване на версиите за {name}: {error}", - "de": "Versionen für {name} konnten nicht aufgelistet werden: {error}", - "en": "Failed to list versions for {name}: {error}", - "pl": "Nie udało się wylistować wersji dla {name}: {error}", - "ru": "Не удалось получить список версий для {name}: {error}", - "zh": "列出 {name} 的版本失败:{error}" - }, - "Failed to push release commit after 3 attempts. Manual intervention required.": { - "bg": "Неуспешен push на release комита след 3 опита. Изисква се ръчна намеса.", - "de": "Release-Commit konnte nach 3 Versuchen nicht gepusht werden. Manuelles Eingreifen erforderlich.", - "en": "Failed to push release commit after 3 attempts. Manual intervention required.", - "pl": "Nie udało się wypchnąć commita release po 3 próbach. Wymagana ręczna interwencja.", - "ru": "Не удалось отправить релизный коммит после 3 попыток. Требуется ручное вмешательство.", - "zh": "3 次尝试后仍无法推送发布提交。需要人工干预。" - }, - "Failed to start ssh-agent: {error}": { - "bg": "Неуспешно стартиране на ssh-agent: {error}", - "de": "Starten von ssh-agent fehlgeschlagen: {error}", - "en": "Failed to start ssh-agent: {error}", - "pl": "Nie udało się uruchomić ssh-agent: {error}", - "ru": "Не удалось запустить ssh-agent: {error}", - "zh": "启动 ssh-agent 失败: {error}" - }, - "Failed to update PR #{pr}: {error}": { - "bg": "Неуспешно обновяване на PR #{pr}: {error}", - "de": "PR #{pr} konnte nicht aktualisiert werden: {error}", - "en": "Failed to update PR #{pr}: {error}", - "pl": "Nie udało się zaktualizować PR #{pr}: {error}", - "ru": "Не удалось обновить PR #{pr}: {error}", - "zh": "更新 PR #{pr} 失败:{error}" - }, - "Failed to update {file}": { - "bg": "Неуспешно обновяване на {file}", - "de": "{file} konnte nicht aktualisiert werden", - "en": "Failed to update {file}", - "pl": "Nie udało się zaktualizować {file}", - "ru": "Не удалось обновить {file}", - "zh": "更新 {file} 失败" - }, - "Fetch failed: {error}": { - "bg": "Извличането се провали: {error}", - "de": "Abruf fehlgeschlagen: {error}", - "en": "Fetch failed: {error}", - "pl": "Pobieranie nie powiodło się: {error}", - "ru": "Получение не удалось: {error}", - "zh": "获取失败:{error}" - }, - "Fetching logs for PR #{pr_number}...": { - "bg": "Извличане на логове за PR #{pr_number}...", - "de": "Rufe Logs für PR #{pr_number} ab...", - "en": "Fetching logs for PR #{pr_number}...", - "pl": "Pobieranie logów dla PR #{pr_number}...", - "ru": "Получение логов для PR #{pr_number}...", - "zh": "正在获取 PR #{pr_number} 的日志..." - }, - "Fetching origin/master...": { - "bg": "Извличане на origin/master...", - "de": "Rufe origin/master ab...", - "en": "Fetching origin/master...", - "pl": "Pobieranie origin/master...", - "ru": "Получение origin/master...", - "zh": "正在获取 origin/master..." - }, - "Fix: add @patch decorators or with patch() context managers for subprocess/time.sleep calls, or patch the calling function.": { - "bg": "Корекция: добавете @patch декоратори или with patch() контекстни мениджъри за subprocess/time.sleep извиквания, или patch-нете извикващата функция.", - "de": "Behebung: @patch-Dekoratoren oder with patch()-Kontextmanager für subprocess/time.sleep-Aufrufe hinzufügen, oder die aufrufende Funktion patchen.", - "en": "Fix: add @patch decorators or with patch() context managers for subprocess/time.sleep calls, or patch the calling function.", - "pl": "Poprawka: dodaj dekoratory @patch lub menedżery kontekstu with patch() dla wywołań subprocess/time.sleep, albo załataj funkcję wywołującą.", - "ru": "Исправление: добавьте декораторы @patch или контекстные менеджеры with patch() для вызовов subprocess/time.sleep, либо запатчите вызывающую функцию.", - "zh": "修复:为 subprocess/time.sleep 调用添加 @patch 装饰器或 with patch() 上下文管理器,或修补调用函数。" - }, - "Fix: add @patch decorators or with patch() context managers for subprocess/time.sleep calls, or patch the calling function.\n": { - "bg": "Корекция: добавете @patch декоратори или with patch() контекстни мениджъри за subprocess/time.sleep извиквания, или patch-нете извикващата функция.\n", - "de": "Behebung: @patch-Dekoratoren oder with patch()-Kontextmanager für subprocess/time.sleep-Aufrufe hinzufügen, oder die aufrufende Funktion patchen.\n", - "en": "Fix: add @patch decorators or with patch() context managers for subprocess/time.sleep calls, or patch the calling function.\n", - "pl": "Poprawka: dodaj dekoratory @patch lub menedżery kontekstu with patch() dla wywołań subprocess/time.sleep, albo załataj funkcję wywołującą.\n", - "ru": "Исправление: добавьте декораторы @patch или контекстные менеджеры with patch() для вызовов subprocess/time.sleep, либо запатчите вызывающую функцию.\n", - "zh": "修复:为 subprocess/time.sleep 调用添加 @patch 装饰器或 with patch() 上下文管理器,或修补调用函数。\n" - }, - "Force-push failed:\n{error}\nThe remote may have unexpected commits. Fetch and try again.": { - "bg": "Force-push се провали:\n{error}\nОтдалеченото репозитори може да съдържа неочаквани комити. Извличане и нов опит.", - "de": "Force-Push fehlgeschlagen:\n{error}\nDas Remote kann unerwartete Commits enthalten. Fetchen und erneut versuchen.", - "en": "Force-push failed:\n{error}\nThe remote may have unexpected commits. Fetch and try again.", - "pl": "Force-push nie powiódł się:\n{error}\nZdalne repozytorium może mieć nieoczekiwane commity. Pobierz i spróbuj ponownie.", - "ru": "Force-push не удался:\n{error}\nУдалённый репозиторий может содержать неожиданные коммиты. Выполните fetch и повторите.", - "zh": "强制推送失败:\n{error}\n远程可能有意外提交。请先 fetch 后重试。" - }, - "Force-pushing...": { - "bg": "Force-push...", - "de": "Force-Push läuft...", - "en": "Force-pushing...", - "pl": "Wymuszone wypychanie...", - "ru": "Force-push...", - "zh": "正在强制推送..." - }, - "Found {count} mutable global(s) — use factory functions or pytest fixtures.": { - "bg": "Намерени {count} променливи глобални — използвайте фабрични функции или pytest fixtures.", - "de": "{count} mutable Global(s) gefunden — Factory-Funktionen oder pytest-Fixtures verwenden.", - "en": "Found {count} mutable global(s) — use factory functions or pytest fixtures.", - "pl": "Znaleziono {count} mutowalnych globali — użyj funkcji fabrykujących lub fixture'ów pytest.", - "ru": "Найдено {count} изменяемых глобальных — используйте фабричные функции или pytest-фикстуры.", - "zh": "发现 {count} 个可变全局变量——请使用工厂函数或 pytest fixtures。" - }, - "Found {count} stale documentation reference(s)": { - "bg": "Намерени {count} остарели препратки в документацията", - "de": "{count} veraltete Dokumentationsreferenz(en) gefunden", - "en": "Found {count} stale documentation reference(s)", - "pl": "Znaleziono {count} nieaktualnych odwołań w dokumentacji", - "ru": "Найдено {count} устаревших ссылок в документации", - "zh": "发现 {count} 个过时的文档引用" - }, - "Found {count} unsafe identity check(s) in integration tests.": { - "bg": "Намерени са {count} небрежни проверки за идентичност в интеграционните тестове.", - "de": "{count} unsichere Identitätsprüfung(en) in Integrationstests gefunden.", - "en": "Found {count} unsafe identity check(s) in integration tests.", - "pl": "Znaleziono {count} niebezpiecznych sprawdzeń tożsamości w testach integracyjnych.", - "ru": "Найдено {count} небезопасных проверок идентичности в интеграционных тестах.", - "zh": "在集成测试中发现 {count} 个不安全的身份检查。" - }, - "Found {count} version(s):": { - "bg": "Намерени {count} версии:", - "de": "{count} Version(en) gefunden:", - "en": "Found {count} version(s):", - "pl": "Znaleziono {count} wersji:", - "ru": "Найдено {count} версий:", - "zh": "找到 {count} 个版本:" - }, - "GITEA_URL/CI_GITEA_TOKEN/RUN_ID not set; running without cross-runner cancellation.": { - "bg": "GITEA_URL/CI_GITEA_TOKEN/RUN_ID не са зададени; изпълнение без отмяна между раннъри.", - "de": "GITEA_URL/CI_GITEA_TOKEN/RUN_ID nicht gesetzt; läuft ohne Runner-übergreifende Abbrüche.", - "en": "GITEA_URL/CI_GITEA_TOKEN/RUN_ID not set; running without cross-runner cancellation.", - "pl": "GITEA_URL/CI_GITEA_TOKEN/RUN_ID nie ustawione; uruchamianie bez anulowania między runnerami.", - "ru": "GITEA_URL/CI_GITEA_TOKEN/RUN_ID не заданы; работа без отмены между раннерами.", - "zh": "未设置 GITEA_URL/CI_GITEA_TOKEN/RUN_ID;运行时无法进行跨 runner 取消。" - }, - "Generated {count} badge files": { - "bg": "Генерирани {count} файла със значки", - "de": "{count} Badge-Dateien generiert", - "en": "Generated {count} badge files", - "pl": "Wygenerowano {count} plików odznak", - "ru": "Сгенерировано {count} файлов значков", - "zh": "已生成 {count} 个徽章文件" - }, - "Generated {file} with prefix '{prefix}'.": { - "bg": "Генериран {file} с префикс '{prefix}'.", - "de": "{file} mit Präfix '{prefix}' generiert.", - "en": "Generated {file} with prefix '{prefix}'.", - "pl": "Wygenerowano {file} z prefiksem '{prefix}'.", - "ru": "Сгенерирован {file} с префиксом '{prefix}'.", - "zh": "已生成带前缀 '{prefix}' 的 {file}。" - }, - "Generating badges in {out}...": { - "bg": "Генериране на значки в {out}...", - "de": "Generiere Badges in {out}...", - "en": "Generating badges in {out}...", - "pl": "Generowanie odznak w {out}...", - "ru": "Генерация значков в {out}...", - "zh": "正在 {out} 中生成徽章..." - }, - "Git tag or ref that was deployed": { - "bg": "Git таг или референция, която беше разгърната", - "de": "Git-Tag oder Ref, der bereitgestellt wurde", - "en": "Git tag or ref that was deployed", - "pl": "Tag Git lub ref, który został wdrożony", - "ru": "Git-тег или ссылка, которые были развёрнуты", - "zh": "已部署的 Git 标签或引用" - }, - "Git tag to deploy (e.g. v0.28.1).": { - "bg": "Git таг за разгръщане (напр. v0.28.1).", - "de": "Git-Tag für Bereitstellung (z.B. v0.28.1).", - "en": "Git tag to deploy (e.g. v0.28.1).", - "pl": "Tag Git do wdrożenia (np. v0.28.1).", - "ru": "Git-тег для развёртывания (напр. v0.28.1).", - "zh": "要部署的 Git 标签(例如 v0.28.1)。" - }, - "Gitea API token not set. Set one of: {names}": { - "bg": "Gitea API токен не е зададен. Задайте един от: {names}", - "de": "Gitea-API-Token nicht gesetzt. Setzen Sie einen von: {names}", - "en": "Gitea API token not set. Set one of: {names}", - "pl": "Token API Gitea nie jest ustawiony. Ustaw jeden z: {names}", - "ru": "Токен Gitea API не задан. Установите один из: {names}", - "zh": "未设置 Gitea API 令牌。请设置以下之一:{names}" - }, - "Gitea PyPI registry: {tag} already published — continuing.": { - "bg": "Gitea PyPI registry: {tag} вече е публикуван — продължава.", - "de": "Gitea PyPI-Registry: {tag} bereits veröffentlicht — wird fortgesetzt.", - "en": "Gitea PyPI registry: {tag} already published — continuing.", - "pl": "Gitea PyPI registry: {tag} już opublikowano — kontynuacja.", - "ru": "Gitea PyPI registry: {tag} уже опубликован — продолжаем.", - "zh": "Gitea PyPI registry: {tag} 已发布 — 继续。" - }, - "Gitea release {tag} already exists — skipping creation.": { - "bg": "Gitea release {tag} вече съществува — прескачане на създаването.", - "de": "Gitea-Release {tag} existiert bereits — Erstellung übersprungen.", - "en": "Gitea release {tag} already exists — skipping creation.", - "pl": "Wydanie Gitea {tag} już istnieje — pomijanie tworzenia.", - "ru": "Gitea release {tag} уже существует — пропуск создания.", - "zh": "Gitea release {tag} 已存在 — 跳过创建。" - }, - "HEAD is a release commit ('{msg}') but tag {tag} is missing. Recovering by creating tag.": { - "bg": "HEAD е release комит ('{msg}'), но тагът {tag} липсва. Възстановяване чрез създаване на таг.", - "de": "HEAD ist ein Release-Commit ('{msg}'), aber Tag {tag} fehlt. Wiederherstellung durch Tag-Erstellung.", - "en": "HEAD is a release commit ('{msg}') but tag {tag} is missing. Recovering by creating tag.", - "pl": "HEAD jest commitem wydania ('{msg}') ale tag {tag} brakuje. Naprawa przez utworzenie tagu.", - "ru": "HEAD является релизным коммитом ('{msg}'), но тег {tag} отсутствует. Восстановление созданием тега.", - "zh": "HEAD 是发布提交('{msg}'),但缺少标签 {tag}。正在通过创建标签恢复。" - }, - "HEAD is a release commit for v{version} but tag {tag} points to a different commit ({tag_commit} vs HEAD {head_commit}). This indicates a tag/commit misalignment.": { - "bg": "HEAD е release комит за v{version}, но тагът {tag} сочи към различен комит ({tag_commit} срещу HEAD {head_commit}). Това показва несъответствие таг/комит.", - "de": "HEAD ist ein Release-Commit für v{version}, aber Tag {tag} zeigt auf einen anderen Commit ({tag_commit} vs. HEAD {head_commit}). Dies deutet auf eine Tag/Commit-Fehlzuordnung hin.", - "en": "HEAD is a release commit for v{version} but tag {tag} points to a different commit ({tag_commit} vs HEAD {head_commit}). This indicates a tag/commit misalignment.", - "pl": "HEAD jest commitem wydania dla v{version} ale tag {tag} wskazuje na inny commit ({tag_commit} vs HEAD {head_commit}). Wskazuje to na niezgodność tag/commit.", - "ru": "HEAD является релизным коммитом для v{version}, но тег {tag} указывает на другой коммит ({tag_commit} против HEAD {head_commit}). Это указывает на несоответствие тег/коммит.", - "zh": "HEAD 是 v{version} 的发布提交,但标签 {tag} 指向不同的提交({tag_commit} 与 HEAD {head_commit})。这表明标签/提交不匹配。" - }, - "HEAD is already a release commit ('{msg}') and tag {tag} points to HEAD. Skipping.": { - "bg": "HEAD вече е release комит ('{msg}') и тагът {tag} сочи към HEAD. Пропуска се.", - "de": "HEAD ist bereits ein Release-Commit ('{msg}') und Tag {tag} zeigt auf HEAD. Wird übersprungen.", - "en": "HEAD is already a release commit ('{msg}') and tag {tag} points to HEAD. Skipping.", - "pl": "HEAD jest już commitem wydania ('{msg}') a tag {tag} wskazuje na HEAD. Pomijanie.", - "ru": "HEAD уже является релизным коммитом ('{msg}') и тег {tag} указывает на HEAD. Пропускается.", - "zh": "HEAD 已是发布提交('{msg}')且标签 {tag} 指向 HEAD。跳过。" - }, - "HEAD is not a release commit for {tag} — skipping publish.": { - "bg": "HEAD не е release комит за {tag} — публикуването се пропуска.", - "de": "HEAD ist kein Release-Commit für {tag} — Veröffentlichung wird übersprungen.", - "en": "HEAD is not a release commit for {tag} — skipping publish.", - "pl": "HEAD nie jest commitem wydania dla {tag} — pomijanie publikacji.", - "ru": "HEAD не является релизным коммитом для {tag} — публикация пропускается.", - "zh": "HEAD 不是 {tag} 的发布提交——跳过发布。" - }, - "HTTP error: {status} — {message}": { - "bg": "HTTP грешка: {status} — {message}", - "de": "HTTP-Fehler: {status} — {message}", - "en": "HTTP error: {status} — {message}", - "pl": "Błąd HTTP: {status} — {message}", - "ru": "Ошибка HTTP: {status} — {message}", - "zh": "HTTP 错误: {status} — {message}" - }, - "HTTP {status} Forbidden — your token lacks admin rights.\nMake sure the token belongs to a repo owner or organisation admin.\nAlternatively, configure branch protection manually in Settings → Branches.": { - "bg": "HTTP {status} Забранено — вашият токен няма администраторски права.\nУверете се, че токенът принадлежи на собственик на хранилище или администратор на организация.\nАлтернативно, конфигурирайте защитата на клона ръчно в Настройки → Клонове.", - "de": "HTTP {status} Verboten — Ihr Token hat keine Admin-Rechte.\nStellen Sie sicher, dass das Token einem Repository-Besitzer oder Organisations-Admin gehört.\nAlternativ können Sie den Branch-Schutz manuell unter Einstellungen → Branches konfigurieren.", - "en": "HTTP {status} Forbidden — your token lacks admin rights.\nMake sure the token belongs to a repo owner or organisation admin.\nAlternatively, configure branch protection manually in Settings → Branches.", - "pl": "HTTP {status} Forbidden — twój token nie ma uprawnień administratora.\nUpewnij się, że token należy do właściciela repozytorium lub administratora organizacji.\nAlternatywnie skonfiguruj ochronę gałęzi ręcznie w Ustawienia → Gałęzie.", - "ru": "HTTP {status} Запрещено — у вашего токена нет прав администратора.\nУбедитесь, что токен принадлежит владельцу репозитория или администратору организации.\nЛибо настройте защиту ветки вручную в разделе Настройки → Ветки.", - "zh": "HTTP {status} 禁止访问 — 您的令牌缺少管理员权限。\n请确保令牌属于仓库所有者或组织管理员。\n或者,您可以在 设置 → 分支 中手动配置分支保护。" - }, - "Head ref for diff": { - "bg": "Head ref за diff", - "de": "Head-Ref für Diff", - "en": "Head ref for diff", - "pl": "Head ref dla diff", - "ru": "Head ref для diff", - "zh": "用于 diff 的 head ref" - }, - "Heavy import '{mod}' (~{ms:.0f}ms) at module level — this slows test collection for all tests. Move inside test functions or use lazy import.": { - "bg": "Тежък импорт '{mod}' (~{ms:.0f}ms) на ниво модул — това забавя събирането на всички тестове. Преместете в тестови функции или използвайте lazy import.", - "de": "Schwerer Import '{mod}' (~{ms:.0f}ms) auf Modulebene — verlangsamt die Testerfassung für alle Tests. In Testfunktionen verschieben oder Lazy-Import verwenden.", - "en": "Heavy import '{mod}' (~{ms:.0f}ms) at module level — this slows test collection for all tests. Move inside test functions or use lazy import.", - "pl": "Ciężki import '{mod}' (~{ms:.0f}ms) na poziomie modułu — spowalnia zbieranie wszystkich testów. Przenieś do funkcji testowych lub użyj leniwego importu.", - "ru": "Тяжёлый импорт '{mod}' (~{ms:.0f}ms) на уровне модуля — замедляет сбор всех тестов. Переместите внутрь тестовых функций или используйте ленивый импорт.", - "zh": "模块级重导入 '{mod}'(~{ms:.0f}ms)——减慢所有测试的收集速度。请移入测试函数内或使用惰性导入。" - }, - "Host Docker not available, starting local dockerd...": { - "bg": "Хост Docker не е наличен, стартиране на локален dockerd...", - "de": "Host-Docker nicht verfügbar, lokaler dockerd wird gestartet...", - "en": "Host Docker not available, starting local dockerd...", - "pl": "Host Docker niedostępny, uruchamianie lokalnego dockerd...", - "ru": "Хост Docker недоступен, запускается локальный dockerd...", - "zh": "主机 Docker 不可用,正在启动本地 dockerd..." - }, - "Image 'tags' must be a list": { - "bg": "Полето 'tags' на изображението трябва да е списък", - "de": "Image-'tags' muss eine Liste sein", - "en": "Image 'tags' must be a list", - "pl": "'tags' obrazu musi być listą", - "ru": "Поле 'tags' образа должно быть списком", - "zh": "镜像的 'tags' 必须是列表" - }, - "Image manifest entry missing 'dockerfile'": { - "bg": "Записът в манифеста на изображението няма 'dockerfile'", - "de": "Image-Manifest-Eintrag ohne 'dockerfile'", - "en": "Image manifest entry missing 'dockerfile'", - "pl": "Wpis manifestu obrazu nie zawiera 'dockerfile'", - "ru": "Запись манифеста образа не содержит 'dockerfile'", - "zh": "镜像清单条目缺少 'dockerfile'" - }, - "Image manifest entry missing 'name'": { - "bg": "Записът в манифеста на изображението няма 'name'", - "de": "Image-Manifest-Eintrag ohne 'name'", - "en": "Image manifest entry missing 'name'", - "pl": "Wpis manifestu obrazu nie zawiera 'name'", - "ru": "Запись манифеста образа не содержит 'name'", - "zh": "镜像清单条目缺少 'name'" - }, - "Infrastructure commit (no DEVX-N task ID), skipping Vikunja update: {msg}": { - "bg": "Инфраструктурен commit (без идентификатор на задача DEVX-N), пропускаме обновяването на Vikunja: {msg}", - "de": "Infrastruktur-Commit (keine DEVX-N Task-ID), Vikunja-Update wird übersprungen: {msg}", - "en": "Infrastructure commit (no DEVX-N task ID), skipping Vikunja update: {msg}", - "pl": "Commit infrastruktury (bez ID zadania DEVX-N), pomijanie aktualizacji Vikunja: {msg}", - "ru": "Инфраструктурный коммит (без ID задачи DEVX-N), пропуск обновления Vikunja: {msg}", - "zh": "基础设施提交(无 DEVX-N 任务 ID),跳过 Vikunja 更新: {msg}" - }, - "Integration tests cancelled — another runner failed.": { - "bg": "Интеграционните тестове са отменени — друг runner се провали.", - "de": "Integrationstests abgebrochen — ein anderer Runner ist fehlgeschlagen.", - "en": "Integration tests cancelled — another runner failed.", - "pl": "Testy integracyjne anulowane — inny runner zakończył się niepowodzeniem.", - "ru": "Интеграционные тесты отменены — другой раннер завершился с ошибкой.", - "zh": "集成测试已取消——另一个 runner 失败。" - }, - "Integration tests failed with exit code {code}": { - "bg": "Интеграционните тестове се провалиха с изходен код {code}", - "de": "Integrationstests mit Exit-Code {code} fehlgeschlagen", - "en": "Integration tests failed with exit code {code}", - "pl": "Testy integracyjne zakończone niepowodzeniem z kodem {code}", - "ru": "Интеграционные тесты завершились с кодом {code}", - "zh": "集成测试失败,退出码 {code}" - }, - "Integration tests passed.": { - "bg": "Интеграционните тестове преминаха.", - "de": "Integrationstests bestanden.", - "en": "Integration tests passed.", - "pl": "Testy integracyjne zakończone pomyślnie.", - "ru": "Интеграционные тесты пройдены.", - "zh": "集成测试通过。" - }, - "Invalid repo format: {repo}": { - "bg": "Невалиден формат на репозитория: {repo}", - "de": "Ungültiges Repo-Format: {repo}", - "en": "Invalid repo format: {repo}", - "pl": "Nieprawidłowy format repo: {repo}", - "ru": "Неверный формат репозитория: {repo}", - "zh": "无效的仓库格式:{repo}" - }, - "Invalid repo format: {repo}. Expected owner/name.": { - "bg": "Невалиден формат на репозитория: {repo}. Очаква се owner/name.", - "de": "Ungültiges Repo-Format: {repo}. Erwartet: owner/name.", - "en": "Invalid repo format: {repo}. Expected owner/name.", - "pl": "Nieprawidłowy format repo: {repo}. Oczekiwano owner/name.", - "ru": "Неверный формат репозитория: {repo}. Ожидается owner/name.", - "zh": "无效的仓库格式:{repo}。应为 owner/name。" - }, - "Items input must be a JSON array, got {type}": { - "bg": "Входните данни трябва да са JSON масив, получено {type}", - "de": "Eingabe muss ein JSON-Array sein, erhalten {type}", - "en": "Items input must be a JSON array, got {type}", - "pl": "Dane wejściowe muszą być tablicą JSON, otrzymano {type}", - "ru": "Входные данные должны быть JSON-массивом, получено {type}", - "zh": "输入必须是 JSON 数组,得到 {type}" - }, - "Label '{label}' already on PR #{pr}.": { - "bg": "Етикетът '{label}' вече е на PR #{pr}.", - "de": "Label '{label}' bereits auf PR #{pr}.", - "en": "Label '{label}' already on PR #{pr}.", - "pl": "Etykieta '{label}' już jest na PR #{pr}.", - "ru": "Метка '{label}' уже есть на PR #{pr}.", - "zh": "标签 '{label}' 已在 PR #{pr} 上。" - }, - "Latest run: #{run_id} (status: {status})": { - "bg": "Последен run: #{run_id} (статус: {status})", - "de": "Letzter Lauf: #{run_id} (Status: {status})", - "en": "Latest run: #{run_id} (status: {status})", - "pl": "Ostatni przebieg: #{run_id} (status: {status})", - "ru": "Последний запуск: #{run_id} (статус: {status})", - "zh": "最近运行:#{run_id}(状态:{status})" - }, - "Lint failed — refusing to release. Fix lint errors first.\n{stderr}": { - "bg": "Lint се провали — отказ за версия. Първо коригирайте lint грешките.\n{stderr}", - "de": "Lint fehlgeschlagen — Release wird verweigert. Zuerst Lint-Fehler beheben.\n{stderr}", - "en": "Lint failed — refusing to release. Fix lint errors first.\n{stderr}", - "pl": "Lint nie powiódł się — odmowa wydania. Najpierw napraw błędy lint.\n{stderr}", - "ru": "Lint не пройден — отказ в релизе. Сначала исправьте ошибки lint.\n{stderr}", - "zh": "Lint 失败——拒绝发布。请先修复 lint 错误。\n{stderr}" - }, - "Lint passed.": { - "bg": "Lint премина.", - "de": "Lint bestanden.", - "en": "Lint passed.", - "pl": "Lint zakończony pomyślnie.", - "ru": "Lint пройден.", - "zh": "Lint 通过。" - }, - "Linting documentation in {root}...": { - "bg": "Lint на документацията в {root}...", - "de": "Linting der Dokumentation in {root}...", - "en": "Linting documentation in {root}...", - "pl": "Lintowanie dokumentacji w {root}...", - "ru": "Проверка документации в {root}...", - "zh": "正在检查 {root} 中的文档..." - }, - "Login to {registry} failed: {error}": { - "bg": "Влизането в {registry} не успя: {error}", - "de": "Anmeldung bei {registry} fehlgeschlagen: {error}", - "en": "Login to {registry} failed: {error}", - "pl": "Logowanie do {registry} nie powiodło się: {error}", - "ru": "Ошибка входа в {registry}: {error}", - "zh": "登录 {registry} 失败: {error}" - }, - "Loop with {count} iterations in test '{test}' — consider property-based testing (hypothesis) or reduce to <= {max} iterations.": { - "bg": "Цикъл с {count} итерации в тест '{test}' — използвайте property-based тестове (hypothesis) или намалете до <= {max} итерации.", - "de": "Schleife mit {count} Iterationen in Test '{test}' — property-based testing (hypothesis) verwenden oder auf <= {max} Iterationen reduzieren.", - "en": "Loop with {count} iterations in test '{test}' — consider property-based testing (hypothesis) or reduce to <= {max} iterations.", - "pl": "Pętla z {count} iteracjami w teście '{test}' — rozważ testy oparte na właściwościach (hypothesis) lub zmniejsz do <= {max} iteracji.", - "ru": "Цикл с {count} итерациями в тесте '{test}' — используйте property-based тестирование (hypothesis) или уменьшите до <= {max} итераций.", - "zh": "测试 '{test}' 中有 {count} 次迭代的循环 — 考虑使用基于属性的测试 (hypothesis) 或减少到 <= {max} 次迭代。" - }, - "Manifest file not found: {path}": { - "bg": "Файлът на манифеста не е намерен: {path}", - "de": "Manifestdatei nicht gefunden: {path}", - "en": "Manifest file not found: {path}", - "pl": "Nie znaleziono pliku manifestu: {path}", - "ru": "Файл манифеста не найден: {path}", - "zh": "未找到清单文件:{path}" - }, - "Manifest must be a JSON list": { - "bg": "Манифестът трябва да е JSON списък", - "de": "Manifest muss eine JSON-Liste sein", - "en": "Manifest must be a JSON list", - "pl": "Manifest musi być listą JSON", - "ru": "Манифест должен быть JSON-списком", - "zh": "清单必须是 JSON 列表" - }, - "Max files changed (excluded files not counted)": { - "bg": "Максимум променени файлове (изключените файлове не се броят)", - "de": "Max. geänderte Dateien (ausgeschlossene Dateien nicht gezählt)", - "en": "Max files changed (excluded files not counted)", - "pl": "Maks. zmienionych plików (wykluczone pliki nie są liczone)", - "ru": "Макс. изменённых файлов (исключённые файлы не учитываются)", - "zh": "最大更改文件数(排除的文件不计入)" - }, - "Max lines changed (excluded files not counted)": { - "bg": "Максимум променени редове (изключените файлове не се броят)", - "de": "Max. geänderte Zeilen (ausgeschlossene Dateien nicht gezählt)", - "en": "Max lines changed (excluded files not counted)", - "pl": "Maks. zmienionych linii (wykluczone pliki nie są liczone)", - "ru": "Макс. изменённых строк (исключённые файлы не учитываются)", - "zh": "最大更改行数(排除的文件不计入)" - }, - "Merge failed with HTTP {status}: {message}\nPlease check the PR is ready and you have merge rights.": { - "bg": "Сливането неуспешно с HTTP {status}: {message}\nПроверете дали PR е готов и имате права за сливане.", - "de": "Merge fehlgeschlagen mit HTTP {status}: {message}\nBitte prüfen Sie, ob der PR bereit ist und Sie Merge-Rechte haben.", - "en": "Merge failed with HTTP {status}: {message}\nPlease check the PR is ready and you have merge rights.", - "pl": "Scalanie nie powiodło się z HTTP {status}: {message}\nSprawdź czy PR jest gotowy i masz uprawnienia do scalania.", - "ru": "Слияние не удалось: HTTP {status}: {message}\nПроверьте, что PR готов и у вас есть права на слияние.", - "zh": "合并失败: HTTP {status}: {message}\n请检查 PR 是否准备就绪且您具有合并权限。" - }, - "Missing required section: {section}": { - "bg": "Липсва задължителна секция: {section}", - "de": "Erforderlicher Abschnitt fehlt: {section}", - "en": "Missing required section: {section}", - "pl": "Brak wymaganej sekcji: {section}", - "ru": "Отсутствует обязательный раздел: {section}", - "zh": "缺少必需部分:{section}" - }, - "Missing tests for changed files.": { - "bg": "Липсват тестове за променените файлове.", - "de": "Tests für geänderte Dateien fehlen.", - "en": "Missing tests for changed files.", - "pl": "Brak testów dla zmienionych plików.", - "ru": "Отсутствуют тесты для изменённых файлов.", - "zh": "缺少已更改文件的测试。" - }, - "Module {mod} has no main() function": { - "bg": "Модул {mod} няма функция main()", - "de": "Modul {mod} hat keine main()-Funktion", - "en": "Module {mod} has no main() function", - "pl": "Moduł {mod} nie ma funkcji main()", - "ru": "Модуль {mod} не имеет функции main()", - "zh": "模块 {mod} 没有 main() 函数" - }, - "Molecule directory not found: {path}": { - "bg": "Директорията на molecule не е намерена: {path}", - "de": "Molecule-Verzeichnis nicht gefunden: {path}", - "en": "Molecule directory not found: {path}", - "pl": "Katalog molecule nie znaleziony: {path}", - "ru": "Директория molecule не найдена: {path}", - "zh": "未找到 molecule 目录: {path}" - }, - "New version to pin": { - "bg": "Нова версия за фиксиране", - "de": "Neue zu pinnende Version", - "en": "New version to pin", - "pl": "Nowa wersja do przypięcia", - "ru": "Новая версия для закрепления", - "zh": "要固定的新版本" - }, - "Next steps:\n 1. git checkout master && git pull\n 2. git checkout -b {prefix}-{num}-short-description\n 3. Implement changes, commit with conventional commit format\n 4. git push -u origin HEAD\n 5. make create-pr (creates PR with title: {identifier}: {title})": { - "bg": "Следващи стъпки:\n 1. git checkout master && git pull\n 2. git checkout -b {prefix}-{num}-кратко-описание\n 3. Имплементирайте промените, commit с conventional commit формат\n 4. git push -u origin HEAD\n 5. make create-pr (създава PR с заглавие: {identifier}: {title})", - "de": "Nächste Schritte:\n 1. git checkout master && git pull\n 2. git checkout -b {prefix}-{num}-kurz-beschreibung\n 3. Änderungen implementieren, mit Conventional-Commit-Format committen\n 4. git push -u origin HEAD\n 5. make create-pr (erstellt PR mit Titel: {identifier}: {title})", - "en": "Next steps:\n 1. git checkout master && git pull\n 2. git checkout -b {prefix}-{num}-short-description\n 3. Implement changes, commit with conventional commit format\n 4. git push -u origin HEAD\n 5. make create-pr (creates PR with title: {identifier}: {title})", - "pl": "Następne kroki:\n 1. git checkout master && git pull\n 2. git checkout -b {prefix}-{num}-krótki-opis\n 3. Wprowadź zmiany, commituj w formacie conventional commit\n 4. git push -u origin HEAD\n 5. make create-pr (tworzy PR z tytułem: {identifier}: {title})", - "ru": "Следующие шаги:\n 1. git checkout master && git pull\n 2. git checkout -b {prefix}-{num}-краткое-описание\n 3. Реализуйте изменения, коммитьте в conventional commit формате\n 4. git push -u origin HEAD\n 5. make create-pr (создаёт PR с заголовком: {identifier}: {title})", - "zh": "后续步骤:\n 1. git checkout master && git pull\n 2. git checkout -b {prefix}-{num}-简短描述\n 3. 实现更改,使用 conventional commit 格式提交\n 4. git push -u origin HEAD\n 5. make create-pr (创建 PR,标题: {identifier}: {title})" - }, - "Nice! Gitea release {tag} created.": { - "bg": "Отлично! Gitea release {tag} е създаден.", - "de": "Prima! Gitea-Release {tag} erstellt.", - "en": "Nice! Gitea release {tag} created.", - "pl": "Świetnie! Wydanie Gitea {tag} utworzone.", - "ru": "Отлично! Gitea release {tag} создан.", - "zh": "不错!Gitea release {tag} 已创建。" - }, - "Nice! PR #{pr_number} squash-merged with title: {merge_title}": { - "bg": "Отлично! PR #{pr_number} е squash-merge-нат със заглавие: {merge_title}", - "de": "Prima! PR #{pr_number} wurde mit Titel {merge_title} squash-gemergt.", - "en": "Nice! PR #{pr_number} squash-merged with title: {merge_title}", - "pl": "Świetnie! PR #{pr_number} squash-merged z tytułem: {merge_title}", - "ru": "Отлично! PR #{pr_number} squash-merge с заголовком: {merge_title}", - "zh": "不错!PR #{pr_number} 已 squash 合并,标题: {merge_title}" - }, - "Nice! Release v{version} tagged and pushed. The publish workflow will be triggered.": { - "bg": "Чудесно! Версия v{version} е тагната и push-ната. Workflow-ът за публикуване ще се задейства.", - "de": "Release v{version} getaggt und gepusht. Der Publish-Workflow wird ausgelöst.", - "en": "Nice! Release v{version} tagged and pushed. The publish workflow will be triggered.", - "pl": "Świetnie! Wydanie v{version} otagowane i wypchnięte. Workflow publikacji zostanie uruchomiony.", - "ru": "Релиз v{version} помечен и отправлен. Workflow публикации будет запущен.", - "zh": "发布 v{version} 已打标签并推送。发布工作流将被触发。" - }, - "Nice! Vikunja task {task_id} (ID {vikunja_id}) updated and marked done.": { - "bg": "Отлично! Задача Vikunja {task_id} (ID {vikunja_id}) е обновена и маркирана като готова.", - "de": "Prima! Vikunja-Aufgabe {task_id} (ID {vikunja_id}) aktualisiert und als erledigt markiert.", - "en": "Nice! Vikunja task {task_id} (ID {vikunja_id}) updated and marked done.", - "pl": "Świetnie! Zadanie Vikunja {task_id} (ID {vikunja_id}) zaktualizowane i oznaczone jako ukończone.", - "ru": "Отлично! Задача Vikunja {task_id} (ID {vikunja_id}) обновлена и отмечена как выполненная.", - "zh": "不错!Vikunja 任务 {task_id} (ID {vikunja_id}) 已更新并标记为完成。" - }, - "Nightly gate failed — staging deploy blocked.": { - "bg": "Nightly проверката се провали — staging деплой е блокиран.", - "de": "Nightly-Gate fehlgeschlagen — Staging-Deploy blockiert.", - "en": "Nightly gate failed — staging deploy blocked.", - "pl": "Brama nightly nie powiodła się — wdrożenie staging zablokowane.", - "ru": "Nightly-проверка не пройдена — деплой на staging заблокирован.", - "zh": "Nightly 门禁失败——staging 部署已阻止。" - }, - "No CI checks found for commit {sha}.": { - "bg": "Не са намерени CI проверки за комит {sha}.", - "de": "Keine CI-Checks für Commit {sha} gefunden.", - "en": "No CI checks found for commit {sha}.", - "pl": "Nie znaleziono kontroli CI dla commita {sha}.", - "ru": "CI-проверки для коммита {sha} не найдены.", - "zh": "未找到提交 {sha} 的 CI 检查。" - }, - "No Python package found under src/ — skipping version check.": { - "bg": "", - "de": "", - "en": "No Python package found under src/ — skipping version check.", - "pl": "", - "ru": "", - "zh": "" - }, - "No REQ-ID lines found. Each requirement must be labeled (e.g., 'REQ-1: ').": { - "bg": "Не са намерени REQ-ID редове. Всяко изискване трябва да е означено (напр. 'REQ-1: <описание>').", - "de": "Keine REQ-ID-Zeilen gefunden. Jede Anforderung muss gekennzeichnet sein (z. B. 'REQ-1: ').", - "en": "No REQ-ID lines found. Each requirement must be labeled (e.g., 'REQ-1: ').", - "pl": "Nie znaleziono wierszy REQ-ID. Każde wymaganie musi być oznaczone (np. 'REQ-1: ').", - "ru": "Строки REQ-ID не найдены. Каждое требование должно быть помечено (напр. 'REQ-1: <описание>').", - "zh": "未找到 REQ-ID 行。每个需求必须标记(例如 'REQ-1: <描述>')。" - }, - "No badge SVG files generated": { - "bg": "Не са генерирани SVG файлове със значки", - "de": "Keine Badge-SVG-Dateien generiert", - "en": "No badge SVG files generated", - "pl": "Nie wygenerowano plików SVG odznak", - "ru": "SVG-файлы значков не сгенерированы", - "zh": "未生成徽章 SVG 文件" - }, - "No badge URLs found to update — README already up to date": { - "bg": "Не са намерени URL на значки за обновяване — README вече е актуално", - "de": "Keine Badge-URLs zum Aktualisieren gefunden — README bereits aktuell", - "en": "No badge URLs found to update — README already up to date", - "pl": "Nie znaleziono URL-i odznak do aktualizacji — README już aktualne", - "ru": "URL значков для обновления не найдены — README уже актуален", - "zh": "未找到需要更新的徽章 URL——README 已是最新" - }, - "No badge changes — skipping commit": { - "bg": "", - "de": "", - "en": "No badge changes — skipping commit", - "pl": "", - "ru": "", - "zh": "" - }, - "No changes between {base} and {head}.": { - "bg": "Няма промени между {base} и {head}.", - "de": "Keine Änderungen zwischen {base} und {head}.", - "en": "No changes between {base} and {head}.", - "pl": "Brak zmian między {base} i {head}.", - "ru": "Нет изменений между {base} и {head}.", - "zh": "{base} 和 {head} 之间没有更改。" - }, - "No changes to sync — wiki is up to date.": { - "bg": "", - "de": "", - "en": "No changes to sync — wiki is up to date.", - "pl": "", - "ru": "", - "zh": "" - }, - "No failed jobs.": { - "bg": "Няма неуспешни задачи.", - "de": "Keine fehlgeschlagenen Jobs.", - "en": "No failed jobs.", - "pl": "Brak nieudanych zadań.", - "ru": "Нет неудавшихся задач.", - "zh": "没有失败的任务。" - }, - "No job matching '{job}' found.": { - "bg": "Не е намерена задача, съответстваща на '{job}'.", - "de": "Kein Job gefunden, der '{job}' entspricht.", - "en": "No job matching '{job}' found.", - "pl": "Nie znaleziono zadania pasującego do '{job}'.", - "ru": "Задача, соответствующая '{job}', не найдена.", - "zh": "未找到匹配 '{job}' 的任务。" - }, - "No jobs found for run #{run_id}.": { - "bg": "Не са намерени задачи за run #{run_id}.", - "de": "Keine Jobs für Lauf #{run_id} gefunden.", - "en": "No jobs found for run #{run_id}.", - "pl": "Nie znaleziono zadań dla przebiegu #{run_id}.", - "ru": "Задачи для запуска #{run_id} не найдены.", - "zh": "未找到运行 #{run_id} 的任务。" - }, - "No open PR found for branch '{branch}'.": { - "bg": "Не е намерен отворен PR за клон '{branch}'.", - "de": "Kein offener PR für Branch '{branch}' gefunden.", - "en": "No open PR found for branch '{branch}'.", - "pl": "Nie znaleziono otwartego PR dla gałęzi '{branch}'.", - "ru": "Открытый PR для ветки '{branch}' не найден.", - "zh": "未找到分支 '{branch}' 的开放 PR。" - }, - "No push needed (no changes or push failed).": { - "bg": "", - "de": "", - "en": "No push needed (no changes or push failed).", - "pl": "", - "ru": "", - "zh": "" - }, - "No spec file found for task {task_id} in {dir}/. Expected: {dir}/{task_id}.md": { - "bg": "Не е намерен spec файл за задача {task_id} в {dir}/. Очаква се: {dir}/{task_id}.md", - "de": "Keine Spec-Datei für Task {task_id} in {dir}/ gefunden. Erwartet: {dir}/{task_id}.md", - "en": "No spec file found for task {task_id} in {dir}/. Expected: {dir}/{task_id}.md", - "pl": "Nie znaleziono pliku spec dla zadania {task_id} w {dir}/. Oczekiwano: {dir}/{task_id}.md", - "ru": "Spec-файл для задачи {task_id} в {dir}/ не найден. Ожидается: {dir}/{task_id}.md", - "zh": "在 {dir}/ 中未找到任务 {task_id} 的规范文件。应为:{dir}/{task_id}.md" - }, - "No staged changes — version and changelog already up to date.": { - "bg": "Няма staged промени — версията и changelog вече са актуални.", - "de": "Keine gestagten Änderungen — Version und Changelog bereits aktuell.", - "en": "No staged changes — version and changelog already up to date.", - "pl": "Brak zmian w staging — wersja i changelog są już aktualne.", - "ru": "Нет staged-изменений — версия и changelog уже актуальны.", - "zh": "没有暂存的更改——版本和 changelog 已是最新。" - }, - "No tag found — skipping publish.": { - "bg": "Не е намерен таг — публикуването се пропуска.", - "de": "Kein Tag gefunden — Veröffentlichung wird übersprungen.", - "en": "No tag found — skipping publish.", - "pl": "Nie znaleziono tagu — pomijanie publikacji.", - "ru": "Тег не найден — публикация пропускается.", - "zh": "未找到标签——跳过发布。" - }, - "No tags found — treating all changes as user-facing.": { - "bg": "Не са намерени тагове — всички промени се третират като видими за потребителя.", - "de": "Keine Tags gefunden — alle Änderungen werden als nutzersichtbar behandelt.", - "en": "No tags found — treating all changes as user-facing.", - "pl": "Nie znaleziono tagów — traktowanie wszystkich zmian jako widocznych dla użytkownika.", - "ru": "Теги не найдены — все изменения считаются пользовательскими.", - "zh": "未找到标签——所有更改视为面向用户。" - }, - "No task ID ({prefix}-N) found in commit message: {msg}. Every non-infrastructure commit must have a task ID.": { - "bg": "Не е намерен task ID ({prefix}-N) в съобщението на комита: {msg}. Всеки неинфраструктурен комит трябва да има task ID.", - "de": "Keine Task-ID ({prefix}-N) in Commit-Nachricht gefunden: {msg}. Jeder Nicht-Infrastruktur-Commit muss eine Task-ID haben.", - "en": "No task ID ({prefix}-N) found in commit message: {msg}. Every non-infrastructure commit must have a task ID.", - "pl": "Nie znaleziono ID zadania ({prefix}-N) w wiadomości commit: {msg}. Każdy commit nie-infrastrukturalny musi mieć ID zadania.", - "ru": "В сообщении коммита не найден ID задачи ({prefix}-N): {msg}. Каждый неинфраструктурный коммит должен иметь ID задачи.", - "zh": "提交信息中未找到任务 ID({prefix}-N):{msg}。每个非基础设施提交必须有任务 ID。" - }, - "No task ID found in branch '{branch}'. Expected format: {prefix}-N-description.": { - "bg": "Не е намерен task ID в клон '{branch}'. Очакван формат: {prefix}-N-description.", - "de": "Keine Task-ID in Branch '{branch}' gefunden. Erwartetes Format: {prefix}-N-description.", - "en": "No task ID found in branch '{branch}'. Expected format: {prefix}-N-description.", - "pl": "Nie znaleziono ID zadania w gałęzi '{branch}'. Oczekiwany format: {prefix}-N-description.", - "ru": "ID задачи не найден в ветке '{branch}'. Ожидаемый формат: {prefix}-N-description.", - "zh": "分支 '{branch}' 中未找到任务 ID。预期格式:{prefix}-N-description。" - }, - "No task ID found in branch name '{branch}'. Expected format: -N-description.": { - "bg": "Не е намерен task ID в името на клона '{branch}'. Очакван формат: -N-description.", - "de": "Keine Task-ID im Branch-Namen '{branch}' gefunden. Erwartetes Format: -N-description.", - "en": "No task ID found in branch name '{branch}'. Expected format: -N-description.", - "pl": "Nie znaleziono ID zadania w nazwie gałęzi '{branch}'. Oczekiwany format: -N-description.", - "ru": "ID задачи не найден в имени ветки '{branch}'. Ожидаемый формат: -N-description.", - "zh": "分支名称 '{branch}' 中未找到任务 ID。预期格式:-N-description。" - }, - "No task ID found in branch name '{branch}'. Expected format: {prefix}-N-description.": { - "bg": "Не е намерен task ID в името на клона '{branch}'. Очакван формат: {prefix}-N-description.", - "de": "Keine Task-ID im Branch-Namen '{branch}' gefunden. Erwartetes Format: {prefix}-N-description.", - "en": "No task ID found in branch name '{branch}'. Expected format: {prefix}-N-description.", - "pl": "Nie znaleziono ID zadania w nazwie gałęzi '{branch}'. Oczekiwany format: {prefix}-N-description.", - "ru": "ID задачи не найден в имени ветки '{branch}'. Ожидаемый формат: {prefix}-N-description.", - "zh": "分支名称 '{branch}' 中未找到任务 ID。预期格式:{prefix}-N-description。" - }, - "No unreleased changes found. Nothing to release.": { - "bg": "Не са намерени непубликувани промени. Няма какво да се издаде.", - "de": "Keine unveröffentlichten Änderungen gefunden. Nichts zu veröffentlichen.", - "en": "No unreleased changes found. Nothing to release.", - "pl": "Nie znaleziono nieopublikowanych zmian. Nic do wydania.", - "ru": "Не найдено невыпущенных изменений. Нечего выпускать.", - "zh": "未找到未发布的更改。没有可发布的内容。" - }, - "No user-facing changes since {tag} — only workflow/infrastructure files changed. Skipping release.": { - "bg": "Няма видими за потребителя промени от {tag} — променени са само workflow/инфраструктурни файлове. Изданието се пропуска.", - "de": "Keine nutzersichtbaren Änderungen seit {tag} — nur Workflow-/Infrastrukturdateien geändert. Release wird übersprungen.", - "en": "No user-facing changes since {tag} — only workflow/infrastructure files changed. Skipping release.", - "pl": "Brak zmian widocznych dla użytkownika od {tag} — tylko pliki workflow/infrastruktury uległy zmianie. Pomijanie wydania.", - "ru": "Нет пользовательских изменений с {tag} — изменены только workflow/инфраструктурные файлы. Релиз пропускается.", - "zh": "自 {tag} 以来没有面向用户的更改——仅更改了工作流/基础设施文件。跳过发布。" - }, - "No versions found.": { - "bg": "Не са намерени версии.", - "de": "Keine Versionen gefunden.", - "en": "No versions found.", - "pl": "Nie znaleziono wersji.", - "ru": "Версии не найдены.", - "zh": "未找到版本。" - }, - "No workflow runs found for SHA {sha}.": { - "bg": "Не са намерени workflow runs за SHA {sha}.", - "de": "Keine Workflow-Läufe für SHA {sha} gefunden.", - "en": "No workflow runs found for SHA {sha}.", - "pl": "Nie znaleziono przebiegów workflow dla SHA {sha}.", - "ru": "Workflow-запуски для SHA {sha} не найдены.", - "zh": "未找到 SHA {sha} 的工作流运行。" - }, - "Nothing to push.": { - "bg": "Няма какво да се push-не.", - "de": "Nichts zu pushen.", - "en": "Nothing to push.", - "pl": "Nic do wypchnięcia.", - "ru": "Нечего отправлять.", - "zh": "没有可推送的内容。" - }, - "Only check staged files (for pre-commit)": { - "bg": "Проверява само staged файлове (за pre-commit)", - "de": "Nur gestagte Dateien prüfen (für Pre-Commit)", - "en": "Only check staged files (for pre-commit)", - "pl": "Sprawdza tylko pliki staged (dla pre-commit)", - "ru": "Проверять только staged-файлы (для pre-commit)", - "zh": "仅检查暂存文件(用于 pre-commit)" - }, - "Oops! Commit message must follow conventional commit format.\n Expected: : \n Got: {subject}\n Allowed types: feat, fix, chore, docs, style, refactor,\n perf, test, ci, build, deps, revert, BREAKING CHANGE": { - "bg": "Опа! Съобщението за commit трябва да следва конвенционален формат.\n Очаква се: : \n Получено: {subject}\n Разрешени типове: feat, fix, chore, docs, style, refactor,\n perf, test, ci, build, deps, revert, BREAKING CHANGE", - "de": "Ups! Commit-Nachricht muss dem konventionellen Commit-Format folgen.\n Erwartet: : \n Erhalten: {subject}\n Erlaubte Typen: feat, fix, chore, docs, style, refactor,\n perf, test, ci, build, deps, revert, BREAKING CHANGE", - "en": "Oops! Commit message must follow conventional commit format.\n Expected: : \n Got: {subject}\n Allowed types: feat, fix, chore, docs, style, refactor,\n perf, test, ci, build, deps, revert, BREAKING CHANGE", - "pl": "Ups! Wiadomość commit musi być w formacie conventional commit.\n Oczekiwano: : \n Otrzymano: {subject}\n Dozwolone typy: feat, fix, chore, docs, style, refactor,\n perf, test, ci, build, deps, revert, BREAKING CHANGE", - "ru": "Ой! Сообщение коммита должно соответствовать формату conventional commit.\n Ожидается: : \n Получено: {subject}\n Допустимые типы: feat, fix, chore, docs, style, refactor,\n perf, test, ci, build, deps, revert, BREAKING CHANGE", - "zh": "哎呀!提交消息必须遵循 conventional commit 格式。\n 预期格式: : \n 实际: {subject}\n 允许的类型: feat, fix, chore, docs, style, refactor,\n perf, test, ci, build, deps, revert, BREAKING CHANGE" - }, - "Oops! Do not include task ID ({prefix}-N) in feature branch commits.\n The task ID will be added automatically on merge via CI.": { - "bg": "Не включвайте task ID ({prefix}-N) в комитите на feature клони.\n Task ID се добавя автоматично при merge чрез CI.", - "de": "Task-ID ({prefix}-N) nicht in Feature-Branch-Commits aufnehmen.\n Die Task-ID wird beim Merge automatisch via CI hinzugefügt.", - "en": "Oops! Do not include task ID ({prefix}-N) in feature branch commits.\n The task ID will be added automatically on merge via CI.", - "pl": "Ups! Nie dołączaj ID zadania ({prefix}-N) w commitach gałęzi feature.\n ID zadania zostanie dodane automatycznie przy scaleniu przez CI.", - "ru": "Не включайте ID задачи ({prefix}-N) в коммиты feature-веток.\n ID задачи будет добавлен автоматически при merge через CI.", - "zh": "请勿在功能分支提交中包含任务 ID({prefix}-N)。\n 任务 ID 将在合并时由 CI 自动添加。" - }, - "Oops! Gitea PyPI registry publish failed:\n{stderr}": { - "bg": "Опа! Публикуването в Gitea PyPI registry неуспешно:\n{stderr}", - "de": "Ups! Veröffentlichung in der Gitea PyPI-Registry fehlgeschlagen:\n{stderr}", - "en": "Oops! Gitea PyPI registry publish failed:\n{stderr}", - "pl": "Ups! Publikacja w rejestrze Gitea PyPI nie powiodła się:\n{stderr}", - "ru": "Ой! Публикация в Gitea PyPI registry не удалась:\n{stderr}", - "zh": "哎呀!Gitea PyPI registry 发布失败:\n{stderr}" - }, - "Oops! Master branch commit must follow conventional format after task ID.\n Expected: {prefix}-N: : \n Got: {subject}": { - "bg": "Комитът на master клона трябва да следва conventional формата след task ID.\n Очаква се: {prefix}-N: : \n Получено: {subject}", - "de": "Master-Branch-Commits müssen nach der Task-ID dem Conventional-Format folgen.\n Erwartet: {prefix}-N: : \n Erhalten: {subject}", - "en": "Oops! Master branch commit must follow conventional format after task ID.\n Expected: {prefix}-N: : \n Got: {subject}", - "pl": "Ups! Commit gałęzi master musi być w formacie conventional po ID zadania.\n Oczekiwano: {prefix}-N: : \n Otrzymano: {subject}", - "ru": "Коммит ветки master должен следовать conventional-формату после ID задачи.\n Ожидается: {prefix}-N: : \n Получено: {subject}", - "zh": "master 分支提交必须在任务 ID 后遵循 conventional 格式。\n 预期:{prefix}-N: : \n 实际:{subject}" - }, - "Oops! Master branch commits must start with a task ID.\n Expected: {prefix}-N: \n Got: {subject}": { - "bg": "Комитите на master клона трябва да започват с task ID.\n Очаква се: {prefix}-N: \n Получено: {subject}", - "de": "Master-Branch-Commits müssen mit einer Task-ID beginnen.\n Erwartet: {prefix}-N: \n Erhalten: {subject}", - "en": "Oops! Master branch commits must start with a task ID.\n Expected: {prefix}-N: \n Got: {subject}", - "pl": "Ups! Commity gałęzi master muszą zaczynać się od ID zadania.\n Oczekiwano: {prefix}-N: \n Otrzymano: {subject}", - "ru": "Коммиты ветки master должны начинаться с ID задачи.\n Ожидается: {prefix}-N: \n Получено: {subject}", - "zh": "master 分支提交必须以任务 ID 开头。\n 预期:{prefix}-N: \n 实际:{subject}" - }, - "Oops! No task ID found in branch name '{branch}'. Branch names must include the task ID prefix (e.g., DEVX-31-fix-bug).": { - "bg": "Ой! Не е намерен ID на задача в името на клона '{branch}'. Имената на клонове трябва да включват префикса за ID на задача (напр. DEVX-31-fix-bug).", - "de": "Hoppla! Keine Task-ID im Branch-Namen '{branch}' gefunden. Branch-Namen müssen das Task-ID-Präfix enthalten (z.B. DEVX-31-fix-bug).", - "en": "Oops! No task ID found in branch name '{branch}'. Branch names must include the task ID prefix (e.g., DEVX-31-fix-bug).", - "pl": "Ups! Nie znaleziono ID zadania w nazwie gałęzi '{branch}'. Nazwy gałęzi muszą zawierać prefiks ID zadania (np., DEVX-31-fix-bug).", - "ru": "Ой! ID задачи не найден в имени ветки '{branch}'. Имена веток должны включать префикс ID задачи (например, DEVX-31-fix-bug).", - "zh": "哎呀!在分支名称 '{branch}' 中未找到任务 ID。分支名称必须包含任务 ID 前缀(例如 DEVX-31-fix-bug)。" - }, - "Oops! PR title must follow format '{prefix}-N: '.\n Expected: {task_id}: \n Got: {pr_title}": { - "bg": "Заглавието на PR трябва да следва формата '{prefix}-N: <заглавие на задачата>'.\n Очаква се: {task_id}: <заглавие на задачата>\n Получено: {pr_title}", - "de": "Der PR-Titel muss dem Format '{prefix}-N: ' folgen.\n Erwartet: {task_id}: \n Erhalten: {pr_title}", - "en": "Oops! PR title must follow format '{prefix}-N: '.\n Expected: {task_id}: \n Got: {pr_title}", - "pl": "Ups! Tytuł PR musi być w formacie '{prefix}-N: '.\n Oczekiwano: {task_id}: \n Otrzymano: {pr_title}", - "ru": "Заголовок PR должен соответствовать формату '{prefix}-N: <название задачи>'.\n Ожидается: {task_id}: <название задачи>\n Получено: {pr_title}", - "zh": "PR 标题必须遵循格式 '{prefix}-N: <任务标题>'。\n 预期:{task_id}: <任务标题>\n 实际:{pr_title}" - }, - "Oops! PR title task ID mismatch.\n Branch task ID: {task_id}\n PR title: {pr_title}": { - "bg": "Несъответствие на task ID в заглавието на PR.\n Task ID на клона: {task_id}\n Заглавие на PR: {pr_title}", - "de": "Task-ID des PR-Titels stimmt nicht überein.\n Branch-Task-ID: {task_id}\n PR-Titel: {pr_title}", - "en": "Oops! PR title task ID mismatch.\n Branch task ID: {task_id}\n PR title: {pr_title}", - "pl": "Ups! Niezgodność ID zadania w tytule PR.\n ID zadania z gałęzi: {task_id}\n Tytuł PR: {pr_title}", - "ru": "Несоответствие ID задачи в заголовке PR.\n ID задачи ветки: {task_id}\n Заголовок PR: {pr_title}", - "zh": "PR 标题任务 ID 不匹配。\n 分支任务 ID:{task_id}\n PR 标题: {pr_title}" - }, - "Oops! Package build failed:\n{stderr}": { - "bg": "Опа! Сборката на пакета неуспешна:\n{stderr}", - "de": "Ups! Paket-Build fehlgeschlagen:\n{stderr}", - "en": "Oops! Package build failed:\n{stderr}", - "pl": "Ups! Budowanie pakietu nie powiodło się:\n{stderr}", - "ru": "Ой! Сборка пакета не удалась:\n{stderr}", - "zh": "哎呀!包构建失败:\n{stderr}" - }, - "Oops! PyPI publish failed:\n{stderr}": { - "bg": "Опа! Публикуването в PyPI неуспешно:\n{stderr}", - "de": "Ups! PyPI-Veröffentlichung fehlgeschlagen:\n{stderr}", - "en": "Oops! PyPI publish failed:\n{stderr}", - "pl": "Ups! Publikacja PyPI nie powiodła się:\n{stderr}", - "ru": "Ой! Публикация в PyPI не удалась:\n{stderr}", - "zh": "哎呀!PyPI 发布失败:\n{stderr}" - }, - "PASS: All documentation checks passed!": { - "bg": "УСПЕХ: Всички проверки на документацията преминаха!", - "de": "ERFOLG: Alle Dokumentationsprüfungen bestanden!", - "en": "PASS: All documentation checks passed!", - "pl": "SUKCES: Wszystkie kontrole dokumentacji przeszły!", - "ru": "УСПЕШНО: Все проверки документации пройдены!", - "zh": "通过:所有文档检查均已通过!" - }, - "PR #{pr} rebased successfully. A new CI run will start automatically.\nIf auto-merge is enabled (ready-to-merge label), the next CI run\nwill attempt to merge this PR.": { - "bg": "PR #{pr} е rebase-нат успешно. Нов CI run ще стартира автоматично.\nАко auto-merge е включен (етикет ready-to-merge), следващият CI run\nще опита да слее този PR.", - "de": "PR #{pr} erfolgreich rebased. Ein neuer CI-Lauf startet automatisch.\nWenn Auto-Merge aktiviert ist (ready-to-merge-Label), versucht der nächste\nCI-Lauf, diesen PR zu mergen.", - "en": "PR #{pr} rebased successfully. A new CI run will start automatically.\nIf auto-merge is enabled (ready-to-merge label), the next CI run\nwill attempt to merge this PR.", - "pl": "PR #{pr} rebased pomyślnie. Nowy przebieg CI rozpocznie się automatycznie.\nJeśli auto-merge jest włączony (etykieta ready-to-merge), następny przebieg CI\nspróbuje połączyć ten PR.", - "ru": "PR #{pr} успешно rebased. Новый CI-запуск начнётся автоматически.\nЕсли auto-merge включён (метка ready-to-merge), следующий CI-запуск\nпопытается слить этот PR.", - "zh": "PR #{pr} rebase 成功。新的 CI 运行将自动开始。\n如果启用了自动合并(ready-to-merge 标签),下一次 CI 运行\n将尝试合并此 PR。" - }, - "PR already exists: #{index} — {url}": { - "bg": "PR вече съществува: #{index} — {url}", - "de": "PR existiert bereits: #{index} — {url}", - "en": "PR already exists: #{index} — {url}", - "pl": "PR już istnieje: #{index} — {url}", - "ru": "PR уже существует: #{index} — {url}", - "zh": "PR 已存在: #{index} — {url}" - }, - "PR has 'refactoring' label — size check bypassed.": { - "bg": "PR има етикет 'refactoring' — проверката за размер се заобикаля.", - "de": "PR hat 'refactoring'-Label — Größenprüfung umgangen.", - "en": "PR has 'refactoring' label — size check bypassed.", - "pl": "PR ma etykietę 'refactoring' — kontrola rozmiaru pominięta.", - "ru": "PR имеет метку 'refactoring' — проверка размера обойдена.", - "zh": "PR 带有 'refactoring' 标签——大小检查已绕过。" - }, - "PR has {file_count} files changed (max {max_files}). Excluded: {excluded_count} files.": { - "bg": "PR има {file_count} променени файла (макс. {max_files}). Изключени: {excluded_count} файла.", - "de": "PR hat {file_count} geänderte Dateien (max. {max_files}). Ausgeschlossen: {excluded_count} Dateien.", - "en": "PR has {file_count} files changed (max {max_files}). Excluded: {excluded_count} files.", - "pl": "PR ma {file_count} zmienionych plików (maks. {max_files}). Wykluczone: {excluded_count} plików.", - "ru": "PR содержит {file_count} изменённых файлов (макс. {max_files}). Исключено: {excluded_count} файлов.", - "zh": "PR 有 {file_count} 个文件更改(上限 {max_files})。已排除:{excluded_count} 个文件。" - }, - "PR has {line_count} lines changed (max {max_lines}). Excluded: {excluded_count} files.": { - "bg": "PR има {line_count} променени реда (макс. {max_lines}). Изключени: {excluded_count} файла.", - "de": "PR hat {line_count} geänderte Zeilen (max. {max_lines}). Ausgeschlossen: {excluded_count} Dateien.", - "en": "PR has {line_count} lines changed (max {max_lines}). Excluded: {excluded_count} files.", - "pl": "PR ma {line_count} zmienionych linii (maks. {max_lines}). Wykluczone: {excluded_count} plików.", - "ru": "PR содержит {line_count} изменённых строк (макс. {max_lines}). Исключено: {excluded_count} файлов.", - "zh": "PR 有 {line_count} 行更改(上限 {max_lines})。已排除:{excluded_count} 个文件。" - }, - "PR number (to fetch title from Gitea)": { - "bg": "Номер на PR (за извличане на заглавие от Gitea)", - "de": "PR-Nummer (zum Abrufen des Titels von Gitea)", - "en": "PR number (to fetch title from Gitea)", - "pl": "Numer PR (do pobrania tytułu z Gitea)", - "ru": "Номер PR (для получения заголовка из Gitea)", - "zh": "PR 编号(用于从 Gitea 获取标题)" - }, - "PR number for label check": { - "bg": "Номер на PR за проверка на етикети", - "de": "PR-Nummer für die Label-Prüfung", - "en": "PR number for label check", - "pl": "Numer PR do kontroli etykiet", - "ru": "Номер PR для проверки меток", - "zh": "用于标签检查的 PR 编号" - }, - "PR number must be an integer, got: {pr_number}": { - "bg": "Номерът на PR трябва да е цяло число, получено: {pr_number}", - "de": "PR-Nummer muss eine Ganzzahl sein, erhalten: {pr_number}", - "en": "PR number must be an integer, got: {pr_number}", - "pl": "Numer PR musi być liczbą całkowitą, otrzymano: {pr_number}", - "ru": "Номер PR должен быть целым числом, получено: {pr_number}", - "zh": "PR 编号必须是整数,实际得到:{pr_number}" - }, - "PR number to fix": { - "bg": "Номер на PR за коригиране", - "de": "Zu korrigierende PR-Nummer", - "en": "PR number to fix", - "pl": "Numer PR do poprawy", - "ru": "Номер PR для исправления", - "zh": "要修复的 PR 编号" - }, - "PR size OK: {file_count} files, {line_count} lines (max {max_files} files, {max_lines} lines).": { - "bg": "Размерът на PR е ОК: {file_count} файла, {line_count} реда (макс. {max_files} файла, {max_lines} реда).", - "de": "PR-Größe OK: {file_count} Dateien, {line_count} Zeilen (max. {max_files} Dateien, {max_lines} Zeilen).", - "en": "PR size OK: {file_count} files, {line_count} lines (max {max_files} files, {max_lines} lines).", - "pl": "Rozmiar PR OK: {file_count} plików, {line_count} linii (maks. {max_files} plików, {max_lines} linii).", - "ru": "Размер PR в норме: {file_count} файлов, {line_count} строк (макс. {max_files} файлов, {max_lines} строк).", - "zh": "PR 大小正常:{file_count} 个文件,{line_count} 行(上限 {max_files} 个文件,{max_lines} 行)。" - }, - "PR size check failed.": { - "bg": "Проверката на размера на PR се провали.", - "de": "PR-Größenprüfung fehlgeschlagen.", - "en": "PR size check failed.", - "pl": "Kontrola rozmiaru PR nie powiodła się.", - "ru": "Проверка размера PR не пройдена.", - "zh": "PR 大小检查失败。" - }, - "PR title (auto-fetched if --pr-number given)": { - "bg": "Заглавие на PR (извлича се автоматично, ако е зададен --pr-number)", - "de": "PR-Titel (wird automatisch abgerufen, wenn --pr-number angegeben)", - "en": "PR title (auto-fetched if --pr-number given)", - "pl": "Tytuł PR (pobierany automatycznie, gdy podano --pr-number)", - "ru": "Заголовок PR (извлекается автоматически при указании --pr-number)", - "zh": "PR 标题(提供 --pr-number 时自动获取)" - }, - "PR title does not match Vikunja task title.\n Expected: {expected}\n Got: {pr_title}": { - "bg": "Заглавието на PR не съвпада със заглавието на Vikunja задачата.\n Очаква се: {expected}\n Получено: {pr_title}", - "de": "PR-Titel stimmt nicht mit Vikunja-Task-Titel überein.\n Erwartet: {expected}\n Erhalten: {pr_title}", - "en": "PR title does not match Vikunja task title.\n Expected: {expected}\n Got: {pr_title}", - "pl": "Tytuł PR nie pasuje do tytułu zadania Vikunja.\n Oczekiwano: {expected}\n Otrzymano: {pr_title}", - "ru": "Заголовок PR не совпадает с названием задачи Vikunja.\n Ожидается: {expected}\n Получено: {pr_title}", - "zh": "PR 标题与 Vikunja 任务标题不匹配。\n 预期:{expected}\n 实际:{pr_title}" - }, - "PR title does not match Vikunja task title.\n Expected: {expected}\n Got: {title}": { - "bg": "Заглавието на PR не съвпада със заглавието на Vikunja задачата.\n Очаква се: {expected}\n Получено: {title}", - "de": "PR-Titel stimmt nicht mit Vikunja-Task-Titel überein.\n Erwartet: {expected}\n Erhalten: {title}", - "en": "PR title does not match Vikunja task title.\n Expected: {expected}\n Got: {title}", - "pl": "Tytuł PR nie zgadza się z tytułem zadania Vikunja.\n Oczekiwano: {expected}\n Otrzymano: {title}", - "ru": "Заголовок PR не совпадает с названием задачи Vikunja.\n Ожидается: {expected}\n Получено: {title}", - "zh": "PR 标题与 Vikunja 任务标题不匹配。\n 预期:{expected}\n 实际:{title}" - }, - "PR title must follow format '{prefix}-N: '.\n Got: {title}": { - "bg": "Заглавието на PR трябва да следва формата '{prefix}-N: <заглавие на задачата>'.\n Получено: {title}", - "de": "Der PR-Titel muss dem Format '{prefix}-N: ' folgen.\n Erhalten: {title}", - "en": "PR title must follow format '{prefix}-N: '.\n Got: {title}", - "pl": "Tytuł PR musi być w formacie '{prefix}-N: '.\n Otrzymano: {title}", - "ru": "Заголовок PR должен соответствовать формату '{prefix}-N: <название задачи>'.\n Получено: {title}", - "zh": "PR 标题必须遵循格式 '{prefix}-N: <任务标题>'。\n 实际:{title}" - }, - "PR title task ID mismatch.\n Branch task ID: {task_id}\n PR title: {title}": { - "bg": "Несъответствие на task ID в заглавието на PR.\n Task ID на клона: {task_id}\n Заглавие на PR: {title}", - "de": "Task-ID des PR-Titels stimmt nicht überein.\n Branch-Task-ID: {task_id}\n PR-Titel: {title}", - "en": "PR title task ID mismatch.\n Branch task ID: {task_id}\n PR title: {title}", - "pl": "Niezgodność ID zadania w tytule PR.\n ID zadania gałęzi: {task_id}\n Tytuł PR: {title}", - "ru": "Несоответствие ID задачи в заголовке PR.\n ID задачи ветки: {task_id}\n Заголовок PR: {title}", - "zh": "PR 标题任务 ID 不匹配。\n 分支任务 ID:{task_id}\n PR 标题: {title}" - }, - "PYPI_TOKEN not set and no registry URL configured — skipping PyPI publish. No worries, we'll just create the Gitea release.": { - "bg": "PYPI_TOKEN не е зададен и няма конфигуриран URL на registry — пропускаме публикуването в PyPI. Без притеснения, просто ще създадем Gitea release.", - "de": "PYPI_TOKEN nicht gesetzt und keine Registry-URL konfiguriert — PyPI-Veröffentlichung wird übersprungen. Keine Sorge, wir erstellen einfach das Gitea-Release.", - "en": "PYPI_TOKEN not set and no registry URL configured — skipping PyPI publish. No worries, we'll just create the Gitea release.", - "pl": "PYPI_TOKEN nie ustawiony i brak URL rejestru — pomijanie publikacji PyPI. Bez obaw, utworzymy tylko wydanie Gitea.", - "ru": "PYPI_TOKEN не задан и URL registry не настроен — пропускаем публикацию в PyPI. Не беспокойтесь, мы просто создадим Gitea release.", - "zh": "未设置 PYPI_TOKEN 且未配置 registry URL — 跳过 PyPI 发布。别担心,我们直接创建 Gitea release。" - }, - "Package name to bump (e.g., grm, sso-bridge)": { - "bg": "Име на пакет за увеличаване (напр. grm, sso-bridge)", - "de": "Zu erhöhender Paketname (z. B. grm, sso-bridge)", - "en": "Package name to bump (e.g., grm, sso-bridge)", - "pl": "Nazwa pakietu do podbicia (np. grm, sso-bridge)", - "ru": "Имя пакета для повышения (напр. grm, sso-bridge)", - "zh": "要升级的包名(例如 grm、sso-bridge)" - }, - "Package owner not specified. Use --owner or set [tool.devx] repo_owner.": { - "bg": "Собственикът на пакета не е зададен. Използвайте --owner или задайте [tool.devx] repo_owner.", - "de": "Paket-Eigentümer nicht angegeben. Verwenden Sie --owner oder setzen Sie [tool.devx] repo_owner.", - "en": "Package owner not specified. Use --owner or set [tool.devx] repo_owner.", - "pl": "Nie określono właściciela pakietu. Użyj --owner lub ustaw [tool.devx] repo_owner.", - "ru": "Владелец пакета не указан. Используйте --owner или задайте [tool.devx] repo_owner.", - "zh": "未指定包所有者。使用 --owner 或设置 [tool.devx] repo_owner。" - }, - "Package: {owner}/{name}": { - "bg": "Пакет: {owner}/{name}", - "de": "Paket: {owner}/{name}", - "en": "Package: {owner}/{name}", - "pl": "Pakiet: {owner}/{name}", - "ru": "Пакет: {owner}/{name}", - "zh": "包:{owner}/{name}" - }, - "Parsed owner={owner}, repo={repo} from DEVX_REPO_NAME": { - "bg": "Разбор на owner={owner}, repo={repo} от DEVX_REPO_NAME", - "de": "Owner={owner}, repo={repo} aus DEVX_REPO_NAME analysiert", - "en": "Parsed owner={owner}, repo={repo} from DEVX_REPO_NAME", - "pl": "Przeanalizowano owner={owner}, repo={repo} z DEVX_REPO_NAME", - "ru": "Извлечён owner={owner}, repo={repo} из DEVX_REPO_NAME", - "zh": "从 DEVX_REPO_NAME 解析 owner={owner}, repo={repo}" - }, - "Path to pyproject.toml (default: pyproject.toml in CWD).": { - "bg": "Път до pyproject.toml (по подразбиране: pyproject.toml в CWD).", - "de": "Pfad zu pyproject.toml (Standard: pyproject.toml im CWD).", - "en": "Path to pyproject.toml (default: pyproject.toml in CWD).", - "pl": "Ścieżka do pyproject.toml (domyślnie: pyproject.toml w CWD).", - "ru": "Путь к pyproject.toml (по умолчанию: pyproject.toml в CWD).", - "zh": "pyproject.toml 的路径(默认:CWD 中的 pyproject.toml)。" - }, - "Per-test speed check FAILED: {count} test(s) exceed {limit}s limit.": { - "bg": "Проверката за скорост на тест СЕ ПРОВАЛИ: {count} тест(а) надвишават лимита от {limit}s.", - "de": "Pro-Test-Geschwindigkeitsprüfung FEHLGESCHLAGEN: {count} Test(s) überschreiten das {limit}s-Limit.", - "en": "Per-test speed check FAILED: {count} test(s) exceed {limit}s limit.", - "pl": "Kontrola szybkości pojedynczego testu NIEUDANA: {count} test(ów) przekracza limit {limit}s.", - "ru": "Проверка скорости тестов ПРОВАЛЕНА: {count} тест(ов) превышают лимит {limit}s.", - "zh": "单测试速度检查失败:{count} 个测试超过 {limit}s 限制。" - }, - "Pre-merge validation failed.": { - "bg": "Предmerge валидацията се провали.", - "de": "Pre-Merge-Validierung fehlgeschlagen.", - "en": "Pre-merge validation failed.", - "pl": "Walidacja przed merge nie powiodła się.", - "ru": "Проверка перед слиянием не пройдена.", - "zh": "合并前验证失败。" - }, - "Pre-push check passed: task {task_id} exists.": { - "bg": "Pre-push проверката премина: задача {task_id} съществува.", - "de": "Pre-push-Prüfung bestanden: Task {task_id} existiert.", - "en": "Pre-push check passed: task {task_id} exists.", - "pl": "Sprawdzanie pre-push zakończone: zadanie {task_id} istnieje.", - "ru": "Pre-push проверка пройдена: задача {task_id} существует.", - "zh": "Pre-push 检查通过: 任务 {task_id} 存在。" - }, - "Print warnings but always exit 0": { - "bg": "Печатай предупреждения, но винаги излизай с код 0", - "de": "Warnungen ausgeben, aber immer mit 0 beenden", - "en": "Print warnings but always exit 0", - "pl": "Wypisuj ostrzeżenia, ale zawsze kończ kodem 0", - "ru": "Выводить предупреждения, но всегда завершать с кодом 0", - "zh": "打印警告但始终以 0 退出" - }, - "Provide --manifest or both --dockerfile and --name": { - "bg": "Задайте --manifest или и --dockerfile, и --name", - "de": "--manifest oder sowohl --dockerfile als auch --name angeben", - "en": "Provide --manifest or both --dockerfile and --name", - "pl": "Podaj --manifest lub zarówno --dockerfile, jak i --name", - "ru": "Укажите --manifest или оба --dockerfile и --name", - "zh": "提供 --manifest 或同时提供 --dockerfile 和 --name" - }, - "Provide a commit message file or use --git.": { - "bg": "Предоставете файл със съобщение на комит или използвайте --git.", - "de": "Commit-Nachrichtendatei bereitstellen oder --git verwenden.", - "en": "Provide a commit message file or use --git.", - "pl": "Podaj plik komunikatu commitu lub użyj --git.", - "ru": "Укажите файл с сообщением коммита или используйте --git.", - "zh": "提供提交信息文件或使用 --git。" - }, - "Published to Gitea PyPI registry.": { - "bg": "Публикувано в Gitea PyPI registry.", - "de": "In der Gitea PyPI-Registry veröffentlicht.", - "en": "Published to Gitea PyPI registry.", - "pl": "Opublikowano w rejestrze Gitea PyPI.", - "ru": "Опубликовано в Gitea PyPI registry.", - "zh": "已发布到 Gitea PyPI registry。" - }, - "Published to PyPI.": { - "bg": "Публикувано в PyPI.", - "de": "In PyPI veröffentlicht.", - "en": "Published to PyPI.", - "pl": "Opublikowano w PyPI.", - "ru": "Опубликовано в PyPI.", - "zh": "已发布到 PyPI。" - }, - "Publishing release {tag}...": { - "bg": "Публикуване на версия {tag}...", - "de": "Veröffentliche Release {tag}...", - "en": "Publishing release {tag}...", - "pl": "Publikowanie wydania {tag}...", - "ru": "Публикация релиза {tag}...", - "zh": "正在发布 {tag}..." - }, - "Push attempt {n}/3 failed: {err}": { - "bg": "Опит {n}/3 за push се провали: {err}", - "de": "Push-Versuch {n}/3 fehlgeschlagen: {err}", - "en": "Push attempt {n}/3 failed: {err}", - "pl": "Próba {n}/3 push nie powiodła się: {err}", - "ru": "Попытка {n}/3 push не удалась: {err}", - "zh": "推送尝试 {n}/3 失败:{err}" - }, - "Push failed for {tag}: {error}": { - "bg": "Push за {tag} се провали: {error}", - "de": "Push für {tag} fehlgeschlagen: {error}", - "en": "Push failed for {tag}: {error}", - "pl": "Push dla {tag} nie powiódł się: {error}", - "ru": "Push для {tag} не удался: {error}", - "zh": "推送 {tag} 失败:{error}" - }, - "Push failed: {error}": { - "bg": "", - "de": "", - "en": "Push failed: {error}", - "pl": "", - "ru": "", - "zh": "" - }, - "Pushed README update with badge SHA {sha}": { - "bg": "Push-ната е README актуализация със SHA на значката {sha}", - "de": "README-Update mit Badge-SHA {sha} gepusht", - "en": "Pushed README update with badge SHA {sha}", - "pl": "Wypchnięto aktualizację README z SHA odznaki {sha}", - "ru": "Отправлено обновление README с SHA значка {sha}", - "zh": "已推送带徽章 SHA {sha} 的 README 更新" - }, - "Pushed release commit to master.": { - "bg": "Release комитът е push-нат към master.", - "de": "Release-Commit zu master gepusht.", - "en": "Pushed release commit to master.", - "pl": "Wypchnięto commit wydania do master.", - "ru": "Релизный коммит отправлен в master.", - "zh": "发布提交已推送到 master。" - }, - "Pushed {branch} to origin.": { - "bg": "Клонът {branch} е push-нат към origin.", - "de": "{branch} zu origin gepusht.", - "en": "Pushed {branch} to origin.", - "pl": "Wypchnięto {branch} do origin.", - "ru": "Ветка {branch} отправлена в origin.", - "zh": "已将 {branch} 推送到 origin。" - }, - "PyPI publish failed (non-fatal — continuing to Gitea release):\n{error}": { - "bg": "Публикуването в PyPI неуспешно (некритично — продължава към Gitea release):\n{error}", - "de": "PyPI-Veröffentlichung fehlgeschlagen (nicht fatal — Gitea-Release wird fortgesetzt):\n{error}", - "en": "PyPI publish failed (non-fatal — continuing to Gitea release):\n{error}", - "pl": "Publikacja PyPI nie powiodła się (niekrytyczne — kontynuacja Gitea release):\n{error}", - "ru": "Публикация в PyPI не удалась (некритично — продолжаем создание Gitea release):\n{error}", - "zh": "PyPI 发布失败(非致命 — 继续创建 Gitea release):\n{error}" - }, - "REPO argument is required (or set GITHUB_REPOSITORY env var).": { - "bg": "Аргументът REPO е задължителен (или задайте променливата GITHUB_REPOSITORY).", - "de": "REPO-Argument ist erforderlich (oder GITHUB_REPOSITORY-Umgebungsvariable setzen).", - "en": "REPO argument is required (or set GITHUB_REPOSITORY env var).", - "pl": "Argument REPO jest wymagany (lub ustaw zmienną GITHUB_REPOSITORY).", - "ru": "Аргумент REPO обязателен (или задайте переменную окружения GITHUB_REPOSITORY).", - "zh": "REPO 参数是必需的(或设置 GITHUB_REPOSITORY 环境变量)。" - }, - "Real subprocess call(s) detected in test '{test}' without @patch:": { - "bg": "Открити реални subprocess извиквания в тест '{test}' без @patch:", - "de": "Echte subprocess-Aufrufe in Test '{test}' ohne @patch erkannt:", - "en": "Real subprocess call(s) detected in test '{test}' without @patch:", - "pl": "Wykryto prawdziwe wywołania subprocess w teście '{test}' bez @patch:", - "ru": "Обнаружены реальные вызовы subprocess в тесте '{test}' без @patch:", - "zh": "在测试 '{test}' 中检测到未经 @patch 的真实 subprocess 调用:" - }, - "Rebase attempt {n}/3 failed: {err}": { - "bg": "Опит {n}/3 за rebase се провали: {err}", - "de": "Rebase-Versuch {n}/3 fehlgeschlagen: {err}", - "en": "Rebase attempt {n}/3 failed: {err}", - "pl": "Próba {n}/3 rebase nie powiodła się: {err}", - "ru": "Попытка {n}/3 rebase не удалась: {err}", - "zh": "Rebase 尝试 {n}/3 失败:{err}" - }, - "Rebase failed (conflicts or other error):\n{error}\nResolve conflicts and run: git rebase --continue": { - "bg": "Rebase се провали (конфликти или друга грешка):\n{error}\nРазрешете конфликтите и изпълнете: git rebase --continue", - "de": "Rebase fehlgeschlagen (Konflikte oder anderer Fehler):\n{error}\nKonflikte lösen und ausführen: git rebase --continue", - "en": "Rebase failed (conflicts or other error):\n{error}\nResolve conflicts and run: git rebase --continue", - "pl": "Rebase nie powiódł się (konflikty lub inny błąd):\n{error}\nRozwiąż konflikty i uruchom: git rebase --continue", - "ru": "Rebase не удался (конфликты или другая ошибка):\n{error}\nРазрешите конфликты и выполните: git rebase --continue", - "zh": "Rebase 失败(冲突或其他错误):\n{error}\n解决冲突并运行:git rebase --continue" - }, - "Rebase failed with HTTP {status}: {message}": { - "bg": "Rebase се провали с HTTP {status}: {message}", - "de": "Rebase mit HTTP {status} fehlgeschlagen: {message}", - "en": "Rebase failed with HTTP {status}: {message}", - "pl": "Rebase nie powiódł się z HTTP {status}: {message}", - "ru": "Rebase завершился с HTTP {status}: {message}", - "zh": "Rebase 失败,HTTP {status}:{message}" - }, - "Rebase successful.": { - "bg": "Rebase успешен.", - "de": "Rebase erfolgreich.", - "en": "Rebase successful.", - "pl": "Rebase powiódł się.", - "ru": "Rebase успешен.", - "zh": "Rebase 成功。" - }, - "Rebasing PR #{pr} via Gitea API...": { - "bg": "Rebase на PR #{pr} чрез Gitea API...", - "de": "Rebase von PR #{pr} via Gitea API...", - "en": "Rebasing PR #{pr} via Gitea API...", - "pl": "Rebase PR #{pr} przez Gitea API...", - "ru": "Rebase PR #{pr} через Gitea API...", - "zh": "正在通过 Gitea API 对 PR #{pr} 执行 rebase..." - }, - "Registry credentials required: set CI_GITEA_TOKEN and CI_GITEA_USERNAME env vars": { - "bg": "Изискват се идентификационни данни за регистъра: задайте променливите CI_GITEA_TOKEN и CI_GITEA_USERNAME", - "de": "Registry-Anmeldedaten erforderlich: Umgebungsvariablen CI_GITEA_TOKEN und CI_GITEA_USERNAME setzen", - "en": "Registry credentials required: set CI_GITEA_TOKEN and CI_GITEA_USERNAME env vars", - "pl": "Wymagane dane uwierzytelniające rejestru: ustaw zmienne CI_GITEA_TOKEN i CI_GITEA_USERNAME", - "ru": "Требуются учётные данные реестра: задайте переменные окружения CI_GITEA_TOKEN и CI_GITEA_USERNAME", - "zh": "需要注册表凭据:设置环境变量 CI_GITEA_TOKEN 和 CI_GITEA_USERNAME" - }, - "Registry login failed": { - "bg": "Входът в регистъра се провали", - "de": "Registry-Login fehlgeschlagen", - "en": "Registry login failed", - "pl": "Logowanie do rejestru nie powiodło się", - "ru": "Вход в реестр не удался", - "zh": "注册表登录失败" - }, - "Registry login failed: {error}": { - "bg": "Входът в регистъра се провали: {error}", - "de": "Registry-Login fehlgeschlagen: {error}", - "en": "Registry login failed: {error}", - "pl": "Logowanie do rejestru nie powiodło się: {error}", - "ru": "Вход в реестр не удался: {error}", - "zh": "注册表登录失败:{error}" - }, - "Regular merge commit — running all post-merge jobs.": { - "bg": "Обикновен merge комит — изпълняват се всички post-merge задачи.", - "de": "Regulärer Merge-Commit — alle Post-Merge-Jobs werden ausgeführt.", - "en": "Regular merge commit — running all post-merge jobs.", - "pl": "Zwykły commit merge — uruchamianie wszystkich zadań post-merge.", - "ru": "Обычный merge-коммит — выполняются все post-merge задачи.", - "zh": "常规合并提交——运行所有合并后任务。" - }, - "Release commit — skipping all post-merge jobs.": { - "bg": "Release комит — всички post-merge задачи се пропускат.", - "de": "Release-Commit — alle Post-Merge-Jobs werden übersprungen.", - "en": "Release commit — skipping all post-merge jobs.", - "pl": "Commit release — pomijanie wszystkich zadań post-merge.", - "ru": "Релизный коммит — все post-merge задачи пропускаются.", - "zh": "发布提交——跳过所有合并后任务。" - }, - "Release creation failed: {error}": { - "bg": "Създаването на версия се провали: {error}", - "de": "Release-Erstellung fehlgeschlagen: {error}", - "en": "Release creation failed: {error}", - "pl": "Tworzenie wydania nie powiodło się: {error}", - "ru": "Создание релиза не удалось: {error}", - "zh": "创建发布失败:{error}" - }, - "Release must be run on master, currently on '{branch}'.": { - "bg": "Release трябва да се изпълнява на master, в момента сте на '{branch}'.", - "de": "Release muss auf master ausgeführt werden, aktuell auf '{branch}'.", - "en": "Release must be run on master, currently on '{branch}'.", - "pl": "Wydanie musi być uruchomione na master, obecnie na '{branch}'.", - "ru": "Релиз должен выполняться на master, сейчас на '{branch}'.", - "zh": "发布必须在 master 上运行,当前在 '{branch}'。" - }, - "Repo (owner/name) for label check": { - "bg": "Репозитори (owner/name) за проверка на етикети", - "de": "Repo (owner/name) für die Label-Prüfung", - "en": "Repo (owner/name) for label check", - "pl": "Repo (owner/name) do kontroli etykiet", - "ru": "Репозиторий (owner/name) для проверки меток", - "zh": "用于标签检查的仓库(owner/name)" - }, - "Repo must be in 'owner/name' format, got: {repo}": { - "bg": "Репозиторият трябва да е във формат 'owner/name', получено: {repo}", - "de": "Repo muss im Format 'owner/name' sein, erhalten: {repo}", - "en": "Repo must be in 'owner/name' format, got: {repo}", - "pl": "Repo musi być w formacie 'owner/name', otrzymano: {repo}", - "ru": "Репозиторий должен быть в формате 'owner/name', получено: {repo}", - "zh": "仓库必须为 'owner/name' 格式,实际为:{repo}" - }, - "Repository configuration complete.": { - "bg": "Конфигурирането на хранилището е завършено.", - "de": "Repository-Konfiguration abgeschlossen.", - "en": "Repository configuration complete.", - "pl": "Konfiguracja repozytorium zakończona.", - "ru": "Конфигурация репозитория завершена.", - "zh": "仓库配置完成。" - }, - "Repository in owner/name format": { - "bg": "Репозитория във формат owner/name", - "de": "Repository im Format owner/name", - "en": "Repository in owner/name format", - "pl": "Repozytorium w formacie owner/name", - "ru": "Репозиторий в формате owner/name", - "zh": "owner/name 格式的仓库" - }, - "Repository name not set. Use DEVX_REPO_NAME, [tool.devx] repo_name, or GITHUB_REPOSITORY env var.": { - "bg": "Името на репозитория не е зададено. Използвайте DEVX_REPO_NAME, [tool.devx] repo_name или променливата GITHUB_REPOSITORY.", - "de": "Repository-Name nicht gesetzt. Verwenden Sie DEVX_REPO_NAME, [tool.devx] repo_name oder die Umgebungsvariable GITHUB_REPOSITORY.", - "en": "Repository name not set. Use DEVX_REPO_NAME, [tool.devx] repo_name, or GITHUB_REPOSITORY env var.", - "pl": "Nazwa repozytorium nie jest ustawiona. Użyj DEVX_REPO_NAME, [tool.devx] repo_name lub zmiennej GITHUB_REPOSITORY.", - "ru": "Имя репозитория не задано. Используйте DEVX_REPO_NAME, [tool.devx] repo_name или переменную окружения GITHUB_REPOSITORY.", - "zh": "未设置仓库名称。使用 DEVX_REPO_NAME、[tool.devx] repo_name 或 GITHUB_REPOSITORY 环境变量。" - }, - "Repository owner not set. Use --owner or DEVX_REPO_OWNER env var.": { - "bg": "Собственикът на хранилището не е зададен. Използвайте --owner или DEVX_REPO_OWNER env var.", - "de": "Repository-Owner nicht gesetzt. Verwende --owner oder DEVX_REPO_OWNER env var.", - "en": "Repository owner not set. Use --owner or DEVX_REPO_OWNER env var.", - "pl": "Właściciel repozytorium nie jest ustawiony. Użyj --owner lub DEVX_REPO_OWNER env var.", - "ru": "Владелец репозитория не установлен. Используйте --owner или DEVX_REPO_OWNER env var.", - "zh": "仓库所有者未设置。使用 --owner 或 DEVX_REPO_OWNER 环境变量。" - }, - "Required tools missing.": { - "bg": "Липсват задължителни инструменти.", - "de": "Erforderliche Werkzeuge fehlen.", - "en": "Required tools missing.", - "pl": "Brak wymaganych narzędzi.", - "ru": "Отсутствуют обязательные инструменты.", - "zh": "缺少必需的工具。" - }, - "Roles directory not found: {path}": { - "bg": "Директорията с роли не е намерена: {path}", - "de": "Rollenverzeichnis nicht gefunden: {path}", - "en": "Roles directory not found: {path}", - "pl": "Katalog ról nie znaleziony: {path}", - "ru": "Директория ролей не найдена: {path}", - "zh": "未找到角色目录:{path}" - }, - "Runner count: {count}": { - "bg": "Брой раннъри: {count}", - "de": "Runner-Anzahl: {count}", - "en": "Runner count: {count}", - "pl": "Liczba runnerów: {count}", - "ru": "Количество раннеров: {count}", - "zh": "Runner 数量:{count}" - }, - "Runner index {index} out of range (0..{max})": { - "bg": "Индексът на runner {index} е извън диапазона (0..{max})", - "de": "Runner-Index {index} außerhalb des Bereichs (0..{max})", - "en": "Runner index {index} out of range (0..{max})", - "pl": "Indeks runnera {index} poza zakresem (0..{max})", - "ru": "Индекс runner {index} вне диапазона (0..{max})", - "zh": "Runner 索引 {index} 超出范围 (0..{max})" - }, - "Runner index {runner_index} is out of range (must be >= 1)": { - "bg": "Индексът на runner {runner_index} е извън обхват (трябва да е >= 1)", - "de": "Runner-Index {runner_index} außerhalb des Bereichs (muss >= 1 sein)", - "en": "Runner index {runner_index} is out of range (must be >= 1)", - "pl": "Indeks runnera {runner_index} poza zakresem (musi być >= 1)", - "ru": "Индекс раннера {runner_index} вне диапазона (должен быть >= 1)", - "zh": "Runner 索引 {runner_index} 超出范围(必须 >= 1)" - }, - "Runner indices: {indices}": { - "bg": "Индекси на раннъри: {indices}", - "de": "Runner-Indizes: {indices}", - "en": "Runner indices: {indices}", - "pl": "Indeksy runnerów: {indices}", - "ru": "Индексы раннеров: {indices}", - "zh": "Runner 索引:{indices}" - }, - "Runner {i}: {labels}": { - "bg": "Раннер {i}: {labels}", - "de": "Runner {i}: {labels}", - "en": "Runner {i}: {labels}", - "pl": "Runner {i}: {labels}", - "ru": "Раннер {i}: {labels}", - "zh": "Runner {i}:{labels}" - }, - "Running lint checks...": { - "bg": "Изпълнение на lint проверки...", - "de": "Lint-Checks laufen...", - "en": "Running lint checks...", - "pl": "Uruchamianie kontroli lint...", - "ru": "Выполнение проверок lint...", - "zh": "正在运行 lint 检查..." - }, - "Running tests...": { - "bg": "Изпълнение на тестове...", - "de": "Tests laufen...", - "en": "Running tests...", - "pl": "Uruchamianie testów...", - "ru": "Выполнение тестов...", - "zh": "正在运行测试..." - }, - "Running: {cmd}": { - "bg": "Изпълнение: {cmd}", - "de": "Ausführen: {cmd}", - "en": "Running: {cmd}", - "pl": "Uruchamianie: {cmd}", - "ru": "Выполнение: {cmd}", - "zh": "运行中:{cmd}" - }, - "SSH key set up successfully": { - "bg": "SSH ключът е настроен успешно", - "de": "SSH-Schlüssel erfolgreich eingerichtet", - "en": "SSH key set up successfully", - "pl": "Klucz SSH skonfigurowany pomyślnie", - "ru": "SSH-ключ успешно настроен", - "zh": "SSH 密钥设置成功" - }, - "SSH key setup skipped (no key provided)": { - "bg": "Настройката на SSH ключ е пропусната (не е предоставен ключ)", - "de": "SSH-Schlüssel-Setup übersprungen (kein Schlüssel bereitgestellt)", - "en": "SSH key setup skipped (no key provided)", - "pl": "Pominięto konfigurację klucza SSH (brak klucza)", - "ru": "Настройка SSH-ключа пропущена (ключ не предоставлен)", - "zh": "SSH 密钥设置已跳过(未提供密钥)" - }, - "SSH_PRIVATE_KEY not set — skipping SSH key setup": { - "bg": "SSH_PRIVATE_KEY не е зададен — пропускане на SSH ключ настройката", - "de": "SSH_PRIVATE_KEY nicht gesetzt — SSH-Schlüssel-Setup übersprungen", - "en": "SSH_PRIVATE_KEY not set — skipping SSH key setup", - "pl": "SSH_PRIVATE_KEY nie ustawione — pomijanie konfiguracji klucza SSH", - "ru": "SSH_PRIVATE_KEY не задан — пропуск настройки SSH-ключа", - "zh": "SSH_PRIVATE_KEY 未设置 — 跳过 SSH 密钥设置" - }, - "Show what would be done without creating PR": { - "bg": "Покажи какво би било направено без създаване на PR", - "de": "Zeigen, was getan würde, ohne PR zu erstellen", - "en": "Show what would be done without creating PR", - "pl": "Pokaż, co zostałoby zrobione bez tworzenia PR", - "ru": "Показать, что было бы сделано без создания PR", - "zh": "显示将要执行的操作而不创建 PR" - }, - "Show what would change without updating": { - "bg": "Покажи какво би се променило без обновяване", - "de": "Zeigen, was sich ändern würde, ohne zu aktualisieren", - "en": "Show what would change without updating", - "pl": "Pokaż, co by się zmieniło bez aktualizacji", - "ru": "Показать, что изменилось бы без обновления", - "zh": "显示将要更改的内容而不更新" - }, - "Single platform to test against": { - "bg": "Единна платформа за тестване", - "de": "Einzelne Plattform zum Testen", - "en": "Single platform to test against", - "pl": "Pojedyncza platforma do testowania", - "ru": "Единая платформа для тестирования", - "zh": "用于测试的单一平台" - }, - "Skip Vikunja title match check": { - "bg": "Пропусни проверката за съвпадение на заглавието с Vikunja", - "de": "Vikunja-Titelübereinstimmungsprüfung überspringen", - "en": "Skip Vikunja title match check", - "pl": "Pomiń kontrolę zgodności tytułu z Vikunja", - "ru": "Пропустить проверку совпадения заголовка с Vikunja", - "zh": "跳过 Vikunja 标题匹配检查" - }, - "Skip branch-behind-master check": { - "bg": "Пропусни проверката дали клонът изостава от master", - "de": "Prüfung „Branch hinter master“ überspringen", - "en": "Skip branch-behind-master check", - "pl": "Pomiń kontrolę czy gałąź jest za master", - "ru": "Пропустить проверку отставания ветки от master", - "zh": "跳过分支落后于 master 的检查" - }, - "Skipping commit push — no staged changes.": { - "bg": "Пропуска се push на комита — няма staged промени.", - "de": "Commit-Push wird übersprungen — keine gestagten Änderungen.", - "en": "Skipping commit push — no staged changes.", - "pl": "Pomijanie wypchnięcia commit — brak zmian w staging.", - "ru": "Push коммита пропускается — нет staged-изменений.", - "zh": "跳过提交推送——没有暂存的更改。" - }, - "Skipping — runner index {runner_index} > max runners {max_runners}": { - "bg": "Пропуска се — индекс на runner {runner_index} > максимум раннъри {max_runners}", - "de": "Übersprungen — Runner-Index {runner_index} > max. Runner {max_runners}", - "en": "Skipping — runner index {runner_index} > max runners {max_runners}", - "pl": "Pomijanie — indeks runnera {runner_index} > maks. runnerów {max_runners}", - "ru": "Пропускается — индекс раннера {runner_index} > макс. раннеров {max_runners}", - "zh": "跳过——runner 索引 {runner_index} > 最大 runner 数 {max_runners}" - }, - "Source repo that published (owner/name)": { - "bg": "Изходно репозитори, което е публикувало (owner/name)", - "de": "Quell-Repo, das veröffentlicht hat (owner/name)", - "en": "Source repo that published (owner/name)", - "pl": "Repozytorium źródłowe, które opublikowało (owner/name)", - "ru": "Исходный репозиторий, выполнивший публикацию (owner/name)", - "zh": "已发布的源仓库(owner/name)" - }, - "Spec validation failed.": { - "bg": "Валидацията на spec се провали.", - "de": "Spec-Validierung fehlgeschlagen.", - "en": "Spec validation failed.", - "pl": "Walidacja spec nie powiodła się.", - "ru": "Проверка spec не пройдена.", - "zh": "规范验证失败。" - }, - "Synced to latest origin/{branch}": { - "bg": "Синхронизирано към последния origin/{branch}", - "de": "Mit neuestem origin/{branch} synchronisiert", - "en": "Synced to latest origin/{branch}", - "pl": "Zsynchronizowano z najnowszym origin/{branch}", - "ru": "Синхронизировано с последним origin/{branch}", - "zh": "已同步到最新的 origin/{branch}" - }, - "Syncing files...": { - "bg": "", - "de": "", - "en": "Syncing files...", - "pl": "", - "ru": "", - "zh": "" - }, - "Syncing {count} documentation pages to wiki via Git...": { - "bg": "", - "de": "", - "en": "Syncing {count} documentation pages to wiki via Git...", - "pl": "", - "ru": "", - "zh": "" - }, - "Tag consistency check failed.": { - "bg": "Проверката за консистентност на таговете се провали.", - "de": "Tag-Konsistenzprüfung fehlgeschlagen.", - "en": "Tag consistency check failed.", - "pl": "Kontrola zgodności tagów nie powiodła się.", - "ru": "Проверка согласованности тегов не пройдена.", - "zh": "标签一致性检查失败。" - }, - "Tag is required (or use --from-tag).": { - "bg": "Тагът е задължителен (или използвайте --from-tag).", - "de": "Tag ist erforderlich (oder --from-tag verwenden).", - "en": "Tag is required (or use --from-tag).", - "pl": "Tag jest wymagany (lub użyj --from-tag).", - "ru": "Тег обязателен (или используйте --from-tag).", - "zh": "标签是必需的(或使用 --from-tag)。" - }, - "Tag v{version} already existed. Publish workflow should already have been triggered.": { - "bg": "Тагът v{version} вече съществува. Workflow-ът за публикуване вече трябва да е задействан.", - "de": "Tag v{version} existierte bereits. Der Publish-Workflow sollte bereits ausgelöst worden sein.", - "en": "Tag v{version} already existed. Publish workflow should already have been triggered.", - "pl": "Tag v{version} już istniał. Workflow publikacji powinien już być uruchomiony.", - "ru": "Тег v{version} уже существует. Workflow публикации уже должен был быть запущен.", - "zh": "标签 v{version} 已存在。发布工作流应已被触发。" - }, - "Tag {tag} already exists and points to HEAD. Skipping creation.": { - "bg": "Тагът {tag} вече съществува и сочи към HEAD. Създаването се пропуска.", - "de": "Tag {tag} existiert bereits und zeigt auf HEAD. Erstellung wird übersprungen.", - "en": "Tag {tag} already exists and points to HEAD. Skipping creation.", - "pl": "Tag {tag} już istnieje i wskazuje na HEAD. Pomijanie tworzenia.", - "ru": "Тег {tag} уже существует и указывает на HEAD. Создание пропускается.", - "zh": "标签 {tag} 已存在且指向 HEAD。跳过创建。" - }, - "Tag {tag} already exists but points to {tag_commit} (expected HEAD {head_commit}). This indicates a tag/commit misalignment. Run 'python3 -m devx.ci.release --verify' for details.": { - "bg": "Тагът {tag} вече съществува, но сочи към {tag_commit} (очаква се HEAD {head_commit}). Това показва несъответствие таг/комит. Изпълнете 'python3 -m devx.ci.release --verify' за подробности.", - "de": "Tag {tag} existiert bereits, zeigt aber auf {tag_commit} (erwartet HEAD {head_commit}). Dies deutet auf eine Tag/Commit-Fehlzuordnung hin. Führen Sie 'python3 -m devx.ci.release --verify' für Details aus.", - "en": "Tag {tag} already exists but points to {tag_commit} (expected HEAD {head_commit}). This indicates a tag/commit misalignment. Run 'python3 -m devx.ci.release --verify' for details.", - "pl": "Tag {tag} już istnieje ale wskazuje na {tag_commit} (oczekiwano HEAD {head_commit}). Wskazuje to na niezgodność tag/commit. Uruchom 'python3 -m devx.ci.release --verify', aby uzyskać szczegóły.", - "ru": "Тег {tag} уже существует, но указывает на {tag_commit} (ожидается HEAD {head_commit}). Это указывает на несоответствие тег/коммит. Выполните 'python3 -m devx.ci.release --verify' для подробностей.", - "zh": "标签 {tag} 已存在但指向 {tag_commit}(预期为 HEAD {head_commit})。这表明标签/提交不匹配。运行 'python3 -m devx.ci.release --verify' 了解详情。" - }, - "Target repo (owner/name) to create PR in": { - "bg": "Целево репозитори (owner/name) за създаване на PR", - "de": "Ziel-Repo (owner/name) zum Erstellen des PR", - "en": "Target repo (owner/name) to create PR in", - "pl": "Docelowe repo (owner/name) do utworzenia PR", - "ru": "Целевой репозиторий (owner/name) для создания PR", - "zh": "用于创建 PR 的目标仓库(owner/name)" - }, - "Task ID: {task_id}": { - "bg": "ID на задача: {task_id}", - "de": "Task-ID: {task_id}", - "en": "Task ID: {task_id}", - "pl": "ID zadania: {task_id}", - "ru": "ID задачи: {task_id}", - "zh": "任务 ID:{task_id}" - }, - "Test '{name}' took {elapsed:.2f}s (limit: {limit}s). Optimise: use lighter fixtures, reduce I/O, or mock external calls.": { - "bg": "Тестът '{name}' отне {elapsed:.2f}s (лимит: {limit}s). Оптимизирайте: използвайте по-леки fixtures, намалете I/O или mock-нете външни извиквания.", - "de": "Test '{name}' dauerte {elapsed:.2f}s (Limit: {limit}s). Optimieren: leichtere Fixtures verwenden, I/O reduzieren oder externe Aufrufe mocken.", - "en": "Test '{name}' took {elapsed:.2f}s (limit: {limit}s). Optimise: use lighter fixtures, reduce I/O, or mock external calls.", - "pl": "Test '{name}' trwał {elapsed:.2f}s (limit: {limit}s). Optymalizuj: użyj lżejszych fixtures, zmniejsz I/O, lub mockuj zewnętrzne wywołania.", - "ru": "Тест '{name}' занял {elapsed:.2f}s (лимит: {limit}s). Оптимизируйте: используйте более лёгкие фикстуры, уменьшите I/O или замокайте внешние вызовы.", - "zh": "测试 '{name}' 耗时 {elapsed:.2f}s(限制:{limit}s)。优化:使用更轻的 fixtures、减少 I/O 或 mock 外部调用。" - }, - "Test isolation check FAILED: {count} violation(s) in {files} file(s).": { - "bg": "Проверката за изолация на тестовете СЕ ПРОВАЛИ: {count} нарушение(я) във {files} файл(а).", - "de": "Testisolierungsprüfung FEHLGESCHLAGEN: {count} Verstoß/Verstöße in {files} Datei(en).", - "en": "Test isolation check FAILED: {count} violation(s) in {files} file(s).", - "pl": "Kontrola izolacji testów NIEUDANA: {count} naruszeń w {files} plikach.", - "ru": "Проверка изоляции тестов ПРОВАЛЕНА: {count} нарушение(й) в {files} файл(ах).", - "zh": "测试隔离检查失败:{files} 个文件中存在 {count} 处违规。" - }, - "Test isolation check passed with {count} advisory warning(s) in {files} file(s).": { - "bg": "Проверката за изолация на тестовете премина с {count} предупредителни бележки във {files} файл(а).", - "de": "Testisolierungsprüfung mit {count} Hinweiswarnung(en) in {files} Datei(en) bestanden.", - "en": "Test isolation check passed with {count} advisory warning(s) in {files} file(s).", - "pl": "Kontrola izolacji testów przeszła z {count} ostrzeżeniami doradczymi w {files} plikach.", - "ru": "Проверка изоляции тестов пройдена с {count} предупреждением(ями) в {files} файл(ах).", - "zh": "测试隔离检查通过,{files} 个文件中有 {count} 条建议性警告。" - }, - "Test isolation check passed: {count} test files analyzed, no violations found.": { - "bg": "Проверката за изолация на тестове премина: анализирани са {count} тестови файла, няма нарушения.", - "de": "Testisolationsprüfung bestanden: {count} Testdateien analysiert, keine Verstöße gefunden.", - "en": "Test isolation check passed: {count} test files analyzed, no violations found.", - "pl": "Sprawdzenie izolacji testów zaliczone: przeanalizowano {count} plików testowych, brak naruszeń.", - "ru": "Проверка изоляции тестов пройдена: проанализировано {count} тестовых файлов, нарушений не найдено.", - "zh": "测试隔离检查通过:已分析 {count} 个测试文件,未发现违规。" - }, - "Tests failed — refusing to release. Fix test failures first.\n{stderr}": { - "bg": "Тестовете се провалиха — отказ за версия. Първо коригирайте неуспешните тестове.\n{stderr}", - "de": "Tests fehlgeschlagen — Release wird verweigert. Zuerst Testfehler beheben.\n{stderr}", - "en": "Tests failed — refusing to release. Fix test failures first.\n{stderr}", - "pl": "Testy nie powiodły się — odmowa wydania. Najpierw napraw niepowodzenia testów.\n{stderr}", - "ru": "Тесты не пройдены — отказ в релизе. Сначала исправьте ошибки тестов.\n{stderr}", - "zh": "测试失败——拒绝发布。请先修复测试失败。\n{stderr}" - }, - "Tests passed.": { - "bg": "Тестовете преминаха.", - "de": "Tests bestanden.", - "en": "Tests passed.", - "pl": "Testy zakończone pomyślnie.", - "ru": "Тесты пройдены.", - "zh": "测试通过。" - }, - "Timeout reached after {timeout}s.": { - "bg": "Достигнат таймаут след {timeout}s.", - "de": "Timeout nach {timeout}s erreicht.", - "en": "Timeout reached after {timeout}s.", - "pl": "Limit czasu osiągnięty po {timeout}s.", - "ru": "Таймаут достигнут после {timeout}s.", - "zh": "{timeout} 秒后达到超时。" - }, - "Transitive-subprocess advisories (runtime audit is authoritative):": { - "bg": "Съветващи бележки за транзитивни subprocess (runtime одитът е решаващ):", - "de": "Transitive-Subprocess-Hinweise (Runtime-Audit ist maßgeblich):", - "en": "Transitive-subprocess advisories (runtime audit is authoritative):", - "pl": "Ostrzeżenia dotyczące subprocessów przechodnich (audyt runtime jest rozstrzygający):", - "ru": "Предупреждения о транзитивных subprocess (авторитетен runtime-аудит):", - "zh": "传递性 subprocess 建议(以运行时审计为准):" - }, - "Unit tests passed in {duration:.2f}s (under {max}s limit, all tests under {single}s per-test limit).": { - "bg": "Модулните тестове преминаха за {duration:.2f}s (под лимита {max}s, всички тестове под лимита {single}s на тест).", - "de": "Unit-Tests in {duration:.2f}s bestanden (unter {max}s-Limit, alle Tests unter {single}s Pro-Test-Limit).", - "en": "Unit tests passed in {duration:.2f}s (under {max}s limit, all tests under {single}s per-test limit).", - "pl": "Testy jednostkowe zakończone pomyślnie w {duration:.2f}s (poniżej limitu {max}s, wszystkie testy poniżej limitu {single}s na test).", - "ru": "Модульные тесты пройдены за {duration:.2f}s (ниже лимита {max}s, все тесты ниже лимита {single}s на тест).", - "zh": "单元测试在 {duration:.2f}s 内通过(低于 {max}s 限制,所有测试均低于 {single}s 单测试限制)。" - }, - "Unit tests too slow: {duration:.2f}s (max allowed: {max}s).\n Fix: run 'make pytest-cov' to profile, then optimise slow tests.\n Hint: avoid unnecessary imports, use lighter mocks, or cache fixtures.": { - "bg": "Модулните тестове са твърде бавни: {duration:.2f}s (максимум: {max}s).\n Корекция: изпълнете 'make pytest-cov' за профилиране, след това оптимизирайте бавните тестове.\n Съвет: избягвайте ненужни импорти, използвайте по-леки mocks или кеширайте fixtures.", - "de": "Unit-Tests zu langsam: {duration:.2f}s (max. erlaubt: {max}s).\n Behebung: 'make pytest-cov' zum Profilieren ausführen, dann langsame Tests optimieren.\n Hinweis: unnötige Imports vermeiden, leichtere Mocks verwenden oder Fixtures cachen.", - "en": "Unit tests too slow: {duration:.2f}s (max allowed: {max}s).\n Fix: run 'make pytest-cov' to profile, then optimise slow tests.\n Hint: avoid unnecessary imports, use lighter mocks, or cache fixtures.", - "pl": "Testy jednostkowe zbyt wolne: {duration:.2f}s (maks. dozwolone: {max}s).\n Naprawa: uruchom 'make pytest-cov' do profilowania, następnie zoptymalizuj wolne testy.\n Wskazówka: unikaj niepotrzebnych importów, użyj lżejszych mocków, lub buforuj fixtures.", - "ru": "Модульные тесты слишком медленные: {duration:.2f}s (макс.: {max}s).\n Исправление: выполните 'make pytest-cov' для профилирования, затем оптимизируйте медленные тесты.\n Совет: избегайте ненужных импортов, используйте более лёгкие моки или кешируйте фикстуры.", - "zh": "单元测试过慢:{duration:.2f}s(最大允许:{max}s)。\n 修复:运行 'make pytest-cov' 进行性能分析,然后优化慢测试。\n 提示:避免不必要的导入,使用更轻的 mock 或缓存 fixtures。" - }, - "Unknown check category '{check}'. Available: all, user-facing{tags}": { - "bg": "Непозната категория проверка '{check}'. Налични: all, user-facing{tags}", - "de": "Unbekannte Check-Kategorie '{check}'. Verfügbar: all, user-facing{tags}", - "en": "Unknown check category '{check}'. Available: all, user-facing{tags}", - "pl": "Nieznana kategoria kontroli '{check}'. Dostępne: all, user-facing{tags}", - "ru": "Неизвестная категория проверки '{check}'. Доступны: all, user-facing{tags}", - "zh": "未知检查类别 '{check}'。可用:all、user-facing{tags}" - }, - "Unknown nightly status — staging deploy blocked.": { - "bg": "Непознат nightly статус — staging деплой е блокиран.", - "de": "Unbekannter Nightly-Status — Staging-Deploy blockiert.", - "en": "Unknown nightly status — staging deploy blocked.", - "pl": "Nieznany status nightly — wdrożenie staging zablokowane.", - "ru": "Неизвестный статус nightly — деплой на staging заблокирован.", - "zh": "未知的 nightly 状态——staging 部署已阻止。" - }, - "Updated badge URLs in {filename}": { - "bg": "Обновени URL на значки в {filename}", - "de": "Badge-URLs in {filename} aktualisiert", - "en": "Updated badge URLs in {filename}", - "pl": "Zaktualizowano URL-e odznak w {filename}", - "ru": "Обновлены URL значков в {filename}", - "zh": "已更新 {filename} 中的徽章 URL" - }, - "Updated documentation version references to v{version}": { - "bg": "", - "de": "", - "en": "Updated documentation version references to v{version}", - "pl": "", - "ru": "", - "zh": "" - }, - "Updated version in {init}": { - "bg": "Обновена версия в {init}", - "de": "Version in {init} aktualisiert", - "en": "Updated version in {init}", - "pl": "Zaktualizowano wersję w {init}", - "ru": "Версия обновлена в {init}", - "zh": "已更新 {init} 中的版本" - }, - "Updated {changelog_file}": { - "bg": "Обновен {changelog_file}", - "de": "{changelog_file} aktualisiert", - "en": "Updated {changelog_file}", - "pl": "Zaktualizowano {changelog_file}", - "ru": "Обновлён {changelog_file}", - "zh": "已更新 {changelog_file}" - }, - "Use string comparison or _is_truthy()/_is_falsy() helpers instead. Add '{marker}' to suppress individual lines.": { - "bg": "Използвайте сравнение на низове или _is_truthy()/_is_falsy() помощници. Добавете '{marker}' за потискане на отделни редове.", - "de": "Verwenden Sie String-Vergleich oder _is_truthy()/_is_falsy() Hilfsfunktionen. Fügen Sie '{marker}' hinzu, um einzelne Zeilen zu unterdrücken.", - "en": "Use string comparison or _is_truthy()/_is_falsy() helpers instead. Add '{marker}' to suppress individual lines.", - "pl": "Użyj porównania ciągów lub pomocników _is_truthy()/_is_falsy(). Dodaj '{marker}', aby pominąć pojedyncze linie.", - "ru": "Используйте строковое сравнение или помощники _is_truthy()/_is_falsy(). Добавьте '{marker}' для подавления отдельных строк.", - "zh": "使用字符串比较或 _is_truthy()/_is_falsy() 辅助函数。添加 '{marker}' 以抑制个别行。" - }, - "VIKUNJA_TOKEN is not set. Required to derive PR title.": { - "bg": "VIKUNJA_TOKEN не е зададен. Необходим за извличане на PR заглавие.", - "de": "VIKUNJA_TOKEN nicht gesetzt. Erforderlich zum Ableiten des PR-Titels.", - "en": "VIKUNJA_TOKEN is not set. Required to derive PR title.", - "pl": "VIKUNJA_TOKEN nie jest ustawiony. Wymagany do pobrania tytułu PR.", - "ru": "VIKUNJA_TOKEN не установлен. Требуется для получения заголовка PR.", - "zh": "VIKUNJA_TOKEN 未设置。推导 PR 标题所需。" - }, - "VIKUNJA_TOKEN is not set. Set it in .env or environment.": { - "bg": "VIKUNJA_TOKEN не е зададен. Задайте го в .env или средата.", - "de": "VIKUNJA_TOKEN nicht gesetzt. In .env oder Umgebung setzen.", - "en": "VIKUNJA_TOKEN is not set. Set it in .env or environment.", - "pl": "VIKUNJA_TOKEN nie jest ustawiony. Ustaw go w .env lub środowisku.", - "ru": "VIKUNJA_TOKEN не установлен. Установите его в .env или среде.", - "zh": "VIKUNJA_TOKEN 未设置。在 .env 或环境中设置它。" - }, - "VIKUNJA_TOKEN is not set. This is required in CI to validate PR titles.": { - "bg": "VIKUNJA_TOKEN не е зададен. Изисква се в CI за валидиране на заглавията на PR.", - "de": "VIKUNJA_TOKEN ist nicht gesetzt. In CI zur Validierung von PR-Titeln erforderlich.", - "en": "VIKUNJA_TOKEN is not set. This is required in CI to validate PR titles.", - "pl": "VIKUNJA_TOKEN nie jest ustawiony. Jest to wymagane w CI do walidacji tytułów PR.", - "ru": "VIKUNJA_TOKEN не задан. Требуется в CI для проверки заголовков PR.", - "zh": "未设置 VIKUNJA_TOKEN。CI 中验证 PR 标题时需要。" - }, - "Version file: {file}": { - "bg": "Файл с версия: {file}", - "de": "Versionsdatei: {file}", - "en": "Version file: {file}", - "pl": "Plik wersji: {file}", - "ru": "Файл версии: {file}", - "zh": "版本文件:{file}" - }, - "Version stays at v{version} — no version bump from git-cliff. Commits since last tag don't warrant a new release. Skipping.": { - "bg": "", - "de": "", - "en": "Version stays at v{version} — no version bump from git-cliff. Commits since last tag don't warrant a new release. Skipping.", - "pl": "", - "ru": "", - "zh": "" - }, - "Vikunja API error (HTTP {status}): {message}. Task {task_id} was NOT updated. The merge succeeded but the Vikunja task needs manual update.": { - "bg": "Грешка в Vikunja API (HTTP {status}): {message}. Задача {task_id} НЕ е обновена. Merge-ът успя, но Vikunja задачата изисква ръчно обновяване.", - "de": "Vikunja-API-Fehler (HTTP {status}): {message}. Task {task_id} wurde NICHT aktualisiert. Der Merge war erfolgreich, aber der Vikunja-Task muss manuell aktualisiert werden.", - "en": "Vikunja API error (HTTP {status}): {message}. Task {task_id} was NOT updated. The merge succeeded but the Vikunja task needs manual update.", - "pl": "Błąd API Vikunja (HTTP {status}): {message}. Zadanie {task_id} NIE zostało zaktualizowane. Scalenie powiodło się ale zadanie Vikunja wymaga ręcznej aktualizacji.", - "ru": "Ошибка Vikunja API (HTTP {status}): {message}. Задача {task_id} НЕ была обновлена. Слияние прошло успешно, но задачу Vikunja нужно обновить вручную.", - "zh": "Vikunja API 错误(HTTP {status}):{message}。任务 {task_id} 未更新。合并成功,但 Vikunja 任务需要手动更新。" - }, - "Vikunja task title '{title}' starts with '{prefix}:'. The task title should NOT include the '{prefix}' prefix — it is automatically added to the PR title. Update the Vikunja task title to remove the prefix.": { - "bg": "Заглавието на задачата във Vikunja '{title}' започва с '{prefix}:'. Заглавието на задачата НЕ трябва да съдържа префикса '{prefix}' — той се добавя автоматично към заглавието на PR. Актуализирайте заглавието на задачата във Vikunja, за да премахнете префикса.", - "de": "Der Vikunja-Aufgabentitel '{title}' beginnt mit '{prefix}:'. Der Aufgabentitel darf NICHT den Präfix '{prefix}' enthalten — er wird automatisch zum PR-Titel hinzugefügt. Aktualisieren Sie den Vikunja-Aufgabentitel, um den Präfix zu entfernen.", - "en": "Vikunja task title '{title}' starts with '{prefix}:'. The task title should NOT include the '{prefix}' prefix — it is automatically added to the PR title. Update the Vikunja task title to remove the prefix.", - "pl": "Tytuł zadania Vikunja '{title}' zaczyna się od '{prefix}:'. Tytuł zadania nie powinien zawierać prefiksu '{prefix}' — jest on automatycznie dodawany do tytułu PR. Zaktualizuj tytuł zadania Vikunja, aby usunąć prefiks.", - "ru": "Заголовок задачи Vikunja '{title}' начинается с '{prefix}:'. Заголовок задачи НЕ должен включать префикс '{prefix}' — он автоматически добавляется к заголовку PR. Обновите заголовок задачи Vikunja, чтобы удалить префикс.", - "zh": "Vikunja 任务标题 '{title}' 以 '{prefix}:' 开头。任务标题不应包含 '{prefix}' 前缀 — 它会自动添加到 PR 标题中。请更新 Vikunja 任务标题以删除前缀。" - }, - "Vikunja task {task_id} not found in project {project_id}.\n Create it first:\n python -m devx.tools.create_task --title \"Task title\"\n Or check that the task ID in the branch name is correct.": { - "bg": "Vikunja задача {task_id} не е намерена в проект {project_id}.\n Създайте я първо:\n python -m devx.tools.create_task --title \"Заглавие на задача\"\n Или проверете че ID на задачата в името на клона е правилно.", - "de": "Vikunja-Task {task_id} in Projekt {project_id} nicht gefunden.\n Zuerst erstellen:\n python -m devx.tools.create_task --title \"Task-Titel\"\n Oder prüfen, ob die Task-ID im Branch-Namen korrekt ist.", - "en": "Vikunja task {task_id} not found in project {project_id}.\n Create it first:\n python -m devx.tools.create_task --title \"Task title\"\n Or check that the task ID in the branch name is correct.", - "pl": "Zadanie Vikunja {task_id} nie znalezione w projekcie {project_id}.\n Utwórz je najpierw:\n python -m devx.tools.create_task --title \"Tytuł zadania\"\n Lub sprawdź, czy ID zadania w nazwie gałęzi jest poprawne.", - "ru": "Задача Vikunja {task_id} не найдена в проекте {project_id}.\n Сначала создайте её:\n python -m devx.tools.create_task --title \"Заголовок задачи\"\n Или проверьте, что ID задачи в имени ветки корректен.", - "zh": "在项目 {project_id} 中找不到 Vikunja 任务 {task_id}。\n 请先创建:\n python -m devx.tools.create_task --title \"任务标题\"\n 或检查分支名称中的任务 ID 是否正确。" - }, - "WARN: .venv has Python {version}, but >={req} is required.": { - "bg": "ПРЕДУПРЕЖДЕНИЕ: .venv има Python {version}, но се изисква >={req}.", - "de": "WARNUNG: .venv hat Python {version}, aber >={req} ist erforderlich.", - "en": "WARN: .venv has Python {version}, but >={req} is required.", - "pl": "OSTRZEŻENIE: .venv ma Python {version}, ale wymagane jest >={req}.", - "ru": "ПРЕДУПРЕЖДЕНИЕ: в .venv установлен Python {version}, но требуется >={req}.", - "zh": "警告: .venv 的 Python 版本为 {version},但要求 >={req}。" - }, - "WARN: .venv not found. Run 'make setup-venv' to create it.": { - "bg": "ПРЕДУПРЕЖДЕНИЕ: .venv не е намерен. Изпълнете 'make setup-venv' за създаване.", - "de": "WARNUNG: .venv nicht gefunden. Führen Sie 'make setup-venv' aus, um es zu erstellen.", - "en": "WARN: .venv not found. Run 'make setup-venv' to create it.", - "pl": "OSTRZEŻENIE: Nie znaleziono .venv. Uruchom 'make setup-venv', aby utworzyć.", - "ru": "ПРЕДУПРЕЖДЕНИЕ: .venv не найден. Выполните 'make setup-venv' для создания.", - "zh": "警告: 未找到 .venv。运行 'make setup-venv' 来创建。" - }, - "WARN: Could not determine Python version in .venv.": { - "bg": "ПРЕДУПРЕЖДЕНИЕ: Не може да се определи версията на Python в .venv.", - "de": "WARNUNG: Python-Version in .venv konnte nicht bestimmt werden.", - "en": "WARN: Could not determine Python version in .venv.", - "pl": "OSTRZEŻENIE: Nie można określić wersji Python w .venv.", - "ru": "ПРЕДУПРЕЖДЕНИЕ: Не удалось определить версию Python в .venv.", - "zh": "警告: 无法确定 .venv 中的 Python 版本。" - }, - "WARN: Could not parse Python version '{version}'.": { - "bg": "ПРЕДУПРЕЖДЕНИЕ: Не може да се анализира версията на Python '{version}'.", - "de": "WARNUNG: Python-Version '{version}' konnte nicht analysiert werden.", - "en": "WARN: Could not parse Python version '{version}'.", - "pl": "OSTRZEŻENIE: Nie można przeanalizować wersji Python '{version}'.", - "ru": "ПРЕДУПРЕЖДЕНИЕ: Не удалось разобрать версию Python '{version}'.", - "zh": "警告: 无法解析 Python 版本 '{version}'。" - }, - "WARNING: --skip-tests passed — skipping test verification.": { - "bg": "ПРЕДУПРЕЖДЕНИЕ: зададен е --skip-tests — проверката на тестовете се пропуска.", - "de": "WARNUNG: --skip-tests übergeben — Testverifizierung wird übersprungen.", - "en": "WARNING: --skip-tests passed — skipping test verification.", - "pl": "OSTRZEŻENIE: --skip-tests przekazane — pomijanie weryfikacji testów.", - "ru": "ПРЕДУПРЕЖДЕНИЕ: передан --skip-tests — проверка тестов пропускается.", - "zh": "警告:已传入 --skip-tests——跳过测试验证。" - }, - "WARNING: .taskid file ({file_id}) is deprecated and disagrees with branch name ({branch_id}). Delete .taskid from the repo — branch name is the sole source of truth.": { - "bg": "ВНИМАНИЕ: Файлът .taskid ({file_id}) е остарял и не съвпада с името на клона ({branch_id}). Изтрийте .taskid от хранилището — името на клона е единственият източник на истината.", - "de": "WARNUNG: Die Datei .taskid ({file_id}) ist veraltet und stimmt nicht mit dem Branch-Namen ({branch_id}) überein. Löschen Sie .taskid aus dem Repo — der Branch-Name ist die einzige Wahrheitsquelle.", - "en": "WARNING: .taskid file ({file_id}) is deprecated and disagrees with branch name ({branch_id}). Delete .taskid from the repo — branch name is the sole source of truth.", - "pl": "OSTRZEŻENIE: plik .taskid ({file_id}) jest przestarzały i niezgodny z nazwą gałęzi ({branch_id}). Usuń .taskid z repozytorium — nazwa gałęzi jest jedynym źródłem prawdy.", - "ru": "ВНИМАНИЕ: Файл .taskid ({file_id}) устарел и не совпадает с именем ветки ({branch_id}). Удалите .taskid из репозитория — имя ветки — единственный источник истины.", - "zh": "警告:.taskid 文件 ({file_id}) 已弃用,与分支名称 ({branch_id}) 不一致。请从仓库中删除 .taskid — 分支名称是唯一的真实来源。" - }, - "WARNING: VIKUNJA_TOKEN not set — skipping task existence check. Set it in .env to enable full validation.": { - "bg": "ПРЕДУПРЕЖДЕНИЕ: VIKUNJA_TOKEN не е зададен — пропускане на проверката за съществуване на задача. Задайте го в .env за пълна валидация.", - "de": "WARNUNG: VIKUNJA_TOKEN nicht gesetzt — Task-Existenzprüfung übersprungen. In .env setzen für volle Validierung.", - "en": "WARNING: VIKUNJA_TOKEN not set — skipping task existence check. Set it in .env to enable full validation.", - "pl": "OSTRZEŻENIE: VIKUNJA_TOKEN nie jest ustawiony — pomijanie sprawdzania istnienia zadania. Ustaw w .env, aby włączyć pełną walidację.", - "ru": "ПРЕДУПРЕЖДЕНИЕ: VIKUNJA_TOKEN не установлен — пропуск проверки существования задачи. Установите в .env для полной проверки.", - "zh": "警告: VIKUNJA_TOKEN 未设置 — 跳过任务存在性检查。在 .env 中设置以启用完整验证。" - }, - "WARNING: Version badge shows stale version (expected v{version}) — regenerating": { - "bg": "", - "de": "", - "en": "WARNING: Version badge shows stale version (expected v{version}) — regenerating", - "pl": "", - "ru": "", - "zh": "" - }, - "WARNING: check_doc_versions --fix failed (rc={rc}): {err}": { - "bg": "", - "de": "", - "en": "WARNING: check_doc_versions --fix failed (rc={rc}): {err}", - "pl": "", - "ru": "", - "zh": "" - }, - "Waiting 5s for Gitea to process pushed commits...": { - "bg": "", - "de": "", - "en": "Waiting 5s for Gitea to process pushed commits...", - "pl": "", - "ru": "", - "zh": "" - }, - "Waiting for CI checks to complete (timeout: {timeout}s)...": { - "bg": "Изчакване CI проверките да завършат (таймаут: {timeout}s)...", - "de": "Warte auf Abschluss der CI-Checks (Timeout: {timeout}s)...", - "en": "Waiting for CI checks to complete (timeout: {timeout}s)...", - "pl": "Oczekiwanie na zakończenie kontroli CI (limit: {timeout}s)...", - "ru": "Ожидание завершения CI-проверок (таймаут: {timeout}s)...", - "zh": "等待 CI 检查完成(超时:{timeout}s)..." - }, - "Warning: could not fetch tags from origin.": { - "bg": "Предупреждение: не могат да се извлекат таговете от origin.", - "de": "Warnung: Tags konnten nicht von origin abgerufen werden.", - "en": "Warning: could not fetch tags from origin.", - "pl": "Ostrzeżenie: nie udało się pobrać tagów z origin.", - "ru": "Предупреждение: не удалось получить теги из origin.", - "zh": "警告:无法从 origin 获取标签。" - }, - "Warning: instance-level runners query failed: {error}": { - "bg": "Предупреждение: заявката за раннъри на ниво инстанция се провали: {error}", - "de": "Warnung: Abfrage der Runner auf Instanzebene fehlgeschlagen: {error}", - "en": "Warning: instance-level runners query failed: {error}", - "pl": "Ostrzeżenie: zapytanie o runnery na poziomie instancji nie powiodło się: {error}", - "ru": "Предупреждение: запрос раннеров на уровне инстанса не удался: {error}", - "zh": "警告:实例级 runner 查询失败:{error}" - }, - "Warning: instance-level runners query returned HTTP {status}": { - "bg": "Предупреждение: заявката за раннъри на ниво инстанция върна HTTP {status}", - "de": "Warnung: Abfrage der Runner auf Instanzebene gab HTTP {status} zurück", - "en": "Warning: instance-level runners query returned HTTP {status}", - "pl": "Ostrzeżenie: zapytanie o runnery na poziomie instancji zwróciło HTTP {status}", - "ru": "Предупреждение: запрос раннеров на уровне инстанса вернул HTTP {status}", - "zh": "警告:实例级 runner 查询返回 HTTP {status}" - }, - "Warning: org-level runners query failed: {error}": { - "bg": "Предупреждение: заявката за раннъри на ниво организация се провали: {error}", - "de": "Warnung: Abfrage der Runner auf Organisationsebene fehlgeschlagen: {error}", - "en": "Warning: org-level runners query failed: {error}", - "pl": "Ostrzeżenie: zapytanie o runnery na poziomie organizacji nie powiodło się: {error}", - "ru": "Предупреждение: запрос раннеров на уровне организации не удался: {error}", - "zh": "警告:组织级 runner 查询失败:{error}" - }, - "Warning: org-level runners query returned HTTP {status}": { - "bg": "Предупреждение: заявката за раннъри на ниво организация върна HTTP {status}", - "de": "Warnung: Abfrage der Runner auf Organisationsebene gab HTTP {status} zurück", - "en": "Warning: org-level runners query returned HTTP {status}", - "pl": "Ostrzeżenie: zapytanie o runnery na poziomie organizacji zwróciło HTTP {status}", - "ru": "Предупреждение: запрос раннеров на уровне организации вернул HTTP {status}", - "zh": "警告:组织级 runner 查询返回 HTTP {status}" - }, - "Warning: repo-level runners query failed: {error}": { - "bg": "Предупреждение: заявката за раннъри на ниво репозитори се провали: {error}", - "de": "Warnung: Abfrage der Runner auf Repo-Ebene fehlgeschlagen: {error}", - "en": "Warning: repo-level runners query failed: {error}", - "pl": "Ostrzeżenie: zapytanie o runnery na poziomie repozytorium nie powiodło się: {error}", - "ru": "Предупреждение: запрос раннеров на уровне репозитория не удался: {error}", - "zh": "警告:仓库级 runner 查询失败:{error}" - }, - "Warning: repo-level runners query returned HTTP {status}": { - "bg": "Предупреждение: заявката за раннъри на ниво репозитори върна HTTP {status}", - "de": "Warnung: Abfrage der Runner auf Repo-Ebene gab HTTP {status} zurück", - "en": "Warning: repo-level runners query returned HTTP {status}", - "pl": "Ostrzeżenie: zapytanie o runnery na poziomie repozytorium zwróciło HTTP {status}", - "ru": "Предупреждение: запрос раннеров на уровне репозитория вернул HTTP {status}", - "zh": "警告:仓库级 runner 查询返回 HTTP {status}" - }, - "Wiki repo not found or empty — initializing fresh.": { - "bg": "", - "de": "", - "en": "Wiki repo not found or empty — initializing fresh.", - "pl": "", - "ru": "", - "zh": "" - }, - "Wiki synced successfully.": { - "bg": "", - "de": "", - "en": "Wiki synced successfully.", - "pl": "", - "ru": "", - "zh": "" - }, - "Wiki verification failed — could not clone wiki": { - "bg": "", - "de": "", - "en": "Wiki verification failed — could not clone wiki", - "pl": "", - "ru": "", - "zh": "" - }, - "Wiki verification failed — {failures} page(s) missing": { - "bg": "", - "de": "", - "en": "Wiki verification failed — {failures} page(s) missing", - "pl": "", - "ru": "", - "zh": "" - }, - "Write deploy-ref to $GITHUB_OUTPUT file.": { - "bg": "Запиши deploy-ref в $GITHUB_OUTPUT файла.", - "de": "Deploy-ref in $GITHUB_OUTPUT-Datei schreiben.", - "en": "Write deploy-ref to $GITHUB_OUTPUT file.", - "pl": "Zapisz deploy-ref do pliku $GITHUB_OUTPUT.", - "ru": "Записать deploy-ref в файл $GITHUB_OUTPUT.", - "zh": "将 deploy-ref 写入 $GITHUB_OUTPUT 文件。" - }, - "Write results to $GITHUB_OUTPUT": { - "bg": "Записва резултатите в $GITHUB_OUTPUT", - "de": "Ergebnisse nach $GITHUB_OUTPUT schreiben", - "en": "Write results to $GITHUB_OUTPUT", - "pl": "Zapisuje wyniki do $GITHUB_OUTPUT", - "ru": "Записывать результаты в $GITHUB_OUTPUT", - "zh": "将结果写入 $GITHUB_OUTPUT" - }, - "Wrote tag {tag} to GITHUB_OUTPUT.": { - "bg": "Тагът {tag} е записан в GITHUB_OUTPUT.", - "de": "Tag {tag} nach GITHUB_OUTPUT geschrieben.", - "en": "Wrote tag {tag} to GITHUB_OUTPUT.", - "pl": "Zapisano tag {tag} do GITHUB_OUTPUT.", - "ru": "Тег {tag} записан в GITHUB_OUTPUT.", - "zh": "已将标签 {tag} 写入 GITHUB_OUTPUT。" - }, - "[check-api-identity-checks] Passed: no unsafe identity checks found": { - "bg": "[check-api-identity-checks] Мина: не са намерени небрежни проверки за идентичност", - "de": "[check-api-identity-checks] Bestanden: keine unsicheren Identitätsprüfungen gefunden", - "en": "[check-api-identity-checks] Passed: no unsafe identity checks found", - "pl": "[check-api-identity-checks] Passed: nie znaleziono niebezpiecznych sprawdzeń tożsamości", - "ru": "[check-api-identity-checks] Пройдено: небезопасных проверок идентичности не найдено", - "zh": "[check-api-identity-checks] 通过:未发现不安全的身份检查" - }, - "[check-dep-docs] Passed: all dependencies are documented": { - "bg": "[check-dep-docs] Успешно: всички зависимости са документирани", - "de": "[check-dep-docs] Bestanden: alle Abhängigkeiten sind dokumentiert", - "en": "[check-dep-docs] Passed: all dependencies are documented", - "pl": "[check-dep-docs] Zaliczone: wszystkie zależności są udokumentowane", - "ru": "[check-dep-docs] Пройдено: все зависимости задокументированы", - "zh": "[check-dep-docs] 通过:所有依赖项均已记录" - }, - "[check-deps] All core tools present.": { - "bg": "[check-deps] Всички основни инструменти са налични.", - "de": "[check-deps] Alle Kernwerkzeuge vorhanden.", - "en": "[check-deps] All core tools present.", - "pl": "[check-deps] Wszystkie podstawowe narzędzia są dostępne.", - "ru": "[check-deps] Все основные инструменты доступны.", - "zh": "[check-deps] 所有核心工具均已就绪。" - }, - "[check-deps] Verifying tools...": { - "bg": "[check-deps] Проверка на инструментите...", - "de": "[check-deps] Werkzeuge werden überprüft...", - "en": "[check-deps] Verifying tools...", - "pl": "[check-deps] Sprawdzanie narzędzi...", - "ru": "[check-deps] Проверка инструментов...", - "zh": "[check-deps] 正在验证工具..." - }, - "[check-deps] Virtualenv .venv ready (Python {version}).": { - "bg": "[check-deps] Виртуална среда .venv готова (Python {version}).", - "de": "[check-deps] Virtuelle Umgebung .venv bereit (Python {version}).", - "en": "[check-deps] Virtualenv .venv ready (Python {version}).", - "pl": "[check-deps] Środowisko wirtualne .venv gotowe (Python {version}).", - "ru": "[check-deps] Виртуальное окружение .venv готово (Python {version}).", - "zh": "[check-deps] 虚拟环境 .venv 已就绪 (Python {version})。" - }, - "[check-mutable-globals] Passed: no mutable path globals found": { - "bg": "[check-mutable-globals] Успешно: не са намерени променливи пътеки глобали", - "de": "[check-mutable-globals] Bestanden: keine mutablen Pfad-Globals gefunden", - "en": "[check-mutable-globals] Passed: no mutable path globals found", - "pl": "[check-mutable-globals] Zaliczone: nie znaleziono mutowalnych globali ścieżek", - "ru": "[check-mutable-globals] Пройдено: изменяемых глобальных путей не найдено", - "zh": "[check-mutable-globals] 通过:未发现可变路径全局变量" - }, - "[check-test-speed] CI environment detected — scaling limits by {factor}x (total: {orig}s → {eff}s, per-test: {orig_s}s → {eff_s}s)": { - "bg": "[check-test-speed] Открита е CI среда — лимитите се скалират с {factor}x (общо: {orig}s → {eff}s, на тест: {orig_s}s → {eff_s}s)", - "de": "[check-test-speed] CI-Umgebung erkannt — Limits werden um Faktor {factor}x skaliert (gesamt: {orig}s → {eff}s, pro Test: {orig_s}s → {eff_s}s)", - "en": "[check-test-speed] CI environment detected — scaling limits by {factor}x (total: {orig}s → {eff}s, per-test: {orig_s}s → {eff_s}s)", - "pl": "[check-test-speed] Wykryto środowisko CI — limity skalowane {factor}x (razem: {orig}s → {eff}s, na test: {orig_s}s → {eff_s}s)", - "ru": "[check-test-speed] Обнаружена среда CI — лимиты масштабируются в {factor}x (всего: {orig}s → {eff}s, на тест: {orig_s}s → {eff_s}s)", - "zh": "[check-test-speed] 检测到 CI 环境——限制按 {factor}x 缩放(总计:{orig}s → {eff}s,单测试:{orig_s}s → {eff_s}s)" - }, - "[check_agent_docs] Passed: scanned {count} file(s), no stale references": { - "bg": "[check_agent_docs] Успешно: сканирани {count} файл(а), няма остарели препратки", - "de": "[check_agent_docs] Bestanden: {count} Datei(en) gescannt, keine veralteten Referenzen", - "en": "[check_agent_docs] Passed: scanned {count} file(s), no stale references", - "pl": "[check_agent_docs] Zaliczone: przeskanowano {count} plików, brak nieaktualnych odwołań", - "ru": "[check_agent_docs] Пройдено: проверено {count} файл(ов), устаревших ссылок нет", - "zh": "[check_agent_docs] 通过:已扫描 {count} 个文件,无过时引用" - }, - "[check_test_coverage] No changed files to check.": { - "bg": "[check_test_coverage] Няма променени файлове за проверка.", - "de": "[check_test_coverage] Keine geänderten Dateien zu prüfen.", - "en": "[check_test_coverage] No changed files to check.", - "pl": "[check_test_coverage] Brak zmienionych plików do sprawdzenia.", - "ru": "[check_test_coverage] Нет изменённых файлов для проверки.", - "zh": "[check_test_coverage] 没有需要检查的已更改文件。" - }, - "[dep-pr] Bumping {pkg} from {old} to {new} in {file}": { - "bg": "[dep-pr] Увеличаване на {pkg} от {old} на {new} в {file}", - "de": "[dep-pr] Erhöhe {pkg} von {old} auf {new} in {file}", - "en": "[dep-pr] Bumping {pkg} from {old} to {new} in {file}", - "pl": "[dep-pr] Podbijanie {pkg} z {old} do {new} w {file}", - "ru": "[dep-pr] Повышение {pkg} с {old} до {new} в {file}", - "zh": "[dep-pr] 将 {file} 中的 {pkg} 从 {old} 升级到 {new}" - }, - "[dep-pr] Could not find pinned version for {pkg} in infra repo.": { - "bg": "[dep-pr] Не е намерена фиксирана версия за {pkg} в infra репозиторито.", - "de": "[dep-pr] Keine gepinnte Version für {pkg} im Infra-Repo gefunden.", - "en": "[dep-pr] Could not find pinned version for {pkg} in infra repo.", - "pl": "[dep-pr] Nie znaleziono przypiętej wersji dla {pkg} w repo infra.", - "ru": "[dep-pr] Не найдена закреплённая версия для {pkg} в репозитории infra.", - "zh": "[dep-pr] 在 infra 仓库中未找到 {pkg} 的固定版本。" - }, - "[dep-pr] Created PR #{number}: {title}": { - "bg": "[dep-pr] Създаден PR #{number}: {title}", - "de": "[dep-pr] PR #{number} erstellt: {title}", - "en": "[dep-pr] Created PR #{number}: {title}", - "pl": "[dep-pr] Utworzono PR #{number}: {title}", - "ru": "[dep-pr] Создан PR #{number}: {title}", - "zh": "[dep-pr] 已创建 PR #{number}:{title}" - }, - "[dep-pr] PR already exists: #{number}": { - "bg": "[dep-pr] PR вече съществува: #{number}", - "de": "[dep-pr] PR existiert bereits: #{number}", - "en": "[dep-pr] PR already exists: #{number}", - "pl": "[dep-pr] PR już istnieje: #{number}", - "ru": "[dep-pr] PR уже существует: #{number}", - "zh": "[dep-pr] PR 已存在:#{number}" - }, - "[dep-pr] {pkg} already at {version} — no PR needed.": { - "bg": "[dep-pr] {pkg} вече е на {version} — не е нужен PR.", - "de": "[dep-pr] {pkg} bereits auf {version} — kein PR nötig.", - "en": "[dep-pr] {pkg} already at {version} — no PR needed.", - "pl": "[dep-pr] {pkg} już jest na {version} — PR niepotrzebny.", - "ru": "[dep-pr] {pkg} уже на версии {version} — PR не нужен.", - "zh": "[dep-pr] {pkg} 已处于 {version}——无需 PR。" - }, - "[docker-login] Logged in to {registry}.": { - "bg": "[docker-login] Влязъл в {registry}.", - "de": "[docker-login] Angemeldet bei {registry}.", - "en": "[docker-login] Logged in to {registry}.", - "pl": "[docker-login] Zalogowano do {registry}.", - "ru": "[docker-login] Выполнен вход в {registry}.", - "zh": "[docker-login] 已登录到 {registry}。" - }, - "[docker-login] Login to {registry} failed (continuing).": { - "bg": "[docker-login] Влизането в {registry} не успя (продължава).", - "de": "[docker-login] Anmeldung bei {registry} fehlgeschlagen (wird fortgesetzt).", - "en": "[docker-login] Login to {registry} failed (continuing).", - "pl": "[docker-login] Logowanie do {registry} nie powiodło się (kontynuowanie).", - "ru": "[docker-login] Ошибка входа в {registry} (продолжаем).", - "zh": "[docker-login] 登录 {registry} 失败(继续)。" - }, - "[docker-login] Skipping {registry} (token {env} not set).": { - "bg": "[docker-login] Пропускане на {registry} (токен {env} не е зададен).", - "de": "[docker-login] {registry} übersprungen (Token {env} nicht gesetzt).", - "en": "[docker-login] Skipping {registry} (token {env} not set).", - "pl": "[docker-login] Pomijanie {registry} (token {env} nie ustawiony).", - "ru": "[docker-login] Пропуск {registry} (токен {env} не задан).", - "zh": "[docker-login] 跳过 {registry}(未设置令牌 {env})。" - }, - "[dry-run] No changes pushed.": { - "bg": "", - "de": "", - "en": "[dry-run] No changes pushed.", - "pl": "", - "ru": "", - "zh": "" - }, - "[dry-run] Would commit and push wiki changes": { - "bg": "", - "de": "", - "en": "[dry-run] Would commit and push wiki changes", - "pl": "", - "ru": "", - "zh": "" - }, - "[dry-run] Would commit: release: v{version} [skip ci]": { - "bg": "[dry-run] Ще се комитне: release: v{version} [skip ci]", - "de": "[dry-run] Würde committen: release: v{version} [skip ci]", - "en": "[dry-run] Would commit: release: v{version} [skip ci]", - "pl": "[dry-run] Utworzono by commit: release: v{version} [skip ci]", - "ru": "[dry-run] Было бы закоммичено: release: v{version} [skip ci]", - "zh": "[dry-run] 将提交:release: v{version} [skip ci]" - }, - "[dry-run] Would create tag: v{version}": { - "bg": "[dry-run] Ще се създаде таг: v{version}", - "de": "[dry-run] Würde Tag erstellen: v{version}", - "en": "[dry-run] Would create tag: v{version}", - "pl": "[dry-run] Utworzono by tag: v{version}", - "ru": "[dry-run] Был бы создан тег: v{version}", - "zh": "[dry-run] 将创建标签:v{version}" - }, - "[dry-run] Would create tag: {tag}": { - "bg": "[dry-run] Ще се създаде таг: {tag}", - "de": "[dry-run] Würde Tag erstellen: {tag}", - "en": "[dry-run] Would create tag: {tag}", - "pl": "[dry-run] Utworzono by tag: {tag}", - "ru": "[dry-run] Был бы создан тег: {tag}", - "zh": "[dry-run] 将创建标签:{tag}" - }, - "[dry-run] Would push commit to master": { - "bg": "[dry-run] Ще се push-не комит към master", - "de": "[dry-run] Würde Commit zu master pushen", - "en": "[dry-run] Would push commit to master", - "pl": "[dry-run] Wypchnięto by commit do master", - "ru": "[dry-run] Коммит был бы отправлен в master", - "zh": "[dry-run] 将推送提交到 master" - }, - "[dry-run] Would update doc version references via check_doc_versions --fix": { - "bg": "", - "de": "", - "en": "[dry-run] Would update doc version references via check_doc_versions --fix", - "pl": "", - "ru": "", - "zh": "" - }, - "[dry-run] Would update {changelog_file}": { - "bg": "[dry-run] Ще се обнови {changelog_file}", - "de": "[dry-run] Würde {changelog_file} aktualisieren", - "en": "[dry-run] Would update {changelog_file}", - "pl": "[dry-run] Zaktualizowano by {changelog_file}", - "ru": "[dry-run] Был бы обновлён {changelog_file}", - "zh": "[dry-run] 将更新 {changelog_file}" - }, - "[dry-run] Would update {init}": { - "bg": "[dry-run] Ще се обнови {init}", - "de": "[dry-run] Würde {init} aktualisieren", - "en": "[dry-run] Would update {init}", - "pl": "[dry-run] Zaktualizowano by {init}", - "ru": "[dry-run] Был бы обновлён {init}", - "zh": "[dry-run] 将更新 {init}" - }, - "[fast-molecule] Changed roles: {roles}": { - "bg": "[fast-molecule] Променени роли: {roles}", - "de": "[fast-molecule] Geänderte Rollen: {roles}", - "en": "[fast-molecule] Changed roles: {roles}", - "pl": "[fast-molecule] Zmienione role: {roles}", - "ru": "[fast-molecule] Изменённые роли: {roles}", - "zh": "[fast-molecule] 已更改的角色:{roles}" - }, - "[nightly-gate] Nightly FAILED{run}. Staging deploys are blocked until nightly passes.": { - "bg": "[nightly-gate] Nightly СЕ ПРОВАЛИ{run}. Staging деплой е блокиран, докато nightly не премине.", - "de": "[nightly-gate] Nightly FEHLGESCHLAGEN{run}. Staging-Deploys sind blockiert, bis Nightly besteht.", - "en": "[nightly-gate] Nightly FAILED{run}. Staging deploys are blocked until nightly passes.", - "pl": "[nightly-gate] Nightly NIEUDANY{run}. Wdrożenia staging są zablokowane, dopóki nightly nie przejdzie.", - "ru": "[nightly-gate] Nightly ПРОВАЛЕН{run}. Деплои на staging заблокированы, пока nightly не пройдёт.", - "zh": "[nightly-gate] Nightly 失败{run}。在 nightly 通过之前,staging 部署被阻止。" - }, - "[nightly-gate] Set NIGHTLY_STATUS=failed{run}": { - "bg": "[nightly-gate] Зададено NIGHTLY_STATUS=failed{run}", - "de": "[nightly-gate] NIGHTLY_STATUS=failed{run} gesetzt", - "en": "[nightly-gate] Set NIGHTLY_STATUS=failed{run}", - "pl": "[nightly-gate] Ustawiono NIGHTLY_STATUS=failed{run}", - "ru": "[nightly-gate] Установлено NIGHTLY_STATUS=failed{run}", - "zh": "[nightly-gate] 已设置 NIGHTLY_STATUS=failed{run}" - }, - "[nightly-gate] Set NIGHTLY_STATUS=passed{run}": { - "bg": "[nightly-gate] Зададено NIGHTLY_STATUS=passed{run}", - "de": "[nightly-gate] NIGHTLY_STATUS=passed{run} gesetzt", - "en": "[nightly-gate] Set NIGHTLY_STATUS=passed{run}", - "pl": "[nightly-gate] Ustawiono NIGHTLY_STATUS=passed{run}", - "ru": "[nightly-gate] Установлено NIGHTLY_STATUS=passed{run}", - "zh": "[nightly-gate] 已设置 NIGHTLY_STATUS=passed{run}" - }, - "[nightly-gate] Unknown nightly status: {status} — blocking deploy (fail closed).": { - "bg": "[nightly-gate] Непознат nightly статус: {status} — деплой се блокира (fail closed).", - "de": "[nightly-gate] Unbekannter Nightly-Status: {status} — Deploy wird blockiert (fail closed).", - "en": "[nightly-gate] Unknown nightly status: {status} — blocking deploy (fail closed).", - "pl": "[nightly-gate] Nieznany status nightly: {status} — wdrożenie blokowane (fail closed).", - "ru": "[nightly-gate] Неизвестный статус nightly: {status} — деплой блокируется (fail closed).", - "zh": "[nightly-gate] 未知的 nightly 状态:{status}——部署被阻止(fail closed)。" - }, - "[spec-check] Spec validated: {path}": { - "bg": "[spec-check] Spec валидиран: {path}", - "de": "[spec-check] Spec validiert: {path}", - "en": "[spec-check] Spec validated: {path}", - "pl": "[spec-check] Spec zweryfikowany: {path}", - "ru": "[spec-check] Spec проверен: {path}", - "zh": "[spec-check] 规范已验证:{path}" - }, - "[tofu-init] Done.": { - "bg": "[tofu-init] Готово.", - "de": "[tofu-init] Fertig.", - "en": "[tofu-init] Done.", - "pl": "[tofu-init] Gotowe.", - "ru": "[tofu-init] Готово.", - "zh": "[tofu-init] 完成。" - }, - "[tofu-init] Initializing {dir}...": { - "bg": "[tofu-init] Инициализиране на {dir}...", - "de": "[tofu-init] Initialisiere {dir}...", - "en": "[tofu-init] Initializing {dir}...", - "pl": "[tofu-init] Inicjalizacja {dir}...", - "ru": "[tofu-init] Инициализация {dir}...", - "zh": "[tofu-init] 正在初始化 {dir}..." - }, - "[tofu-{mode}] All configurations valid.": { - "bg": "[tofu-{mode}] Всички конфигурации са валидни.", - "de": "[tofu-{mode}] Alle Konfigurationen gültig.", - "en": "[tofu-{mode}] All configurations valid.", - "pl": "[tofu-{mode}] Wszystkie konfiguracje są poprawne.", - "ru": "[tofu-{mode}] Все конфигурации валидны.", - "zh": "[tofu-{mode}] 所有配置有效。" - }, - "[tofu-{mode}] Validating OpenTofu configurations...": { - "bg": "[tofu-{mode}] Проверка на OpenTofu конфигурациите...", - "de": "[tofu-{mode}] Validiere OpenTofu-Konfigurationen...", - "en": "[tofu-{mode}] Validating OpenTofu configurations...", - "pl": "[tofu-{mode}] Sprawdzanie konfiguracji OpenTofu...", - "ru": "[tofu-{mode}] Проверка конфигураций OpenTofu...", - "zh": "[tofu-{mode}] 正在验证 OpenTofu 配置..." - }, - "[tool.devx] missing required keys: {keys}": { - "bg": "[tool.devx] липсват задължителни ключове: {keys}", - "de": "[tool.devx] fehlt erforderliche Schlüssel: {keys}", - "en": "[tool.devx] missing required keys: {keys}", - "pl": "[tool.devx] brak wymaganych kluczy: {keys}", - "ru": "[tool.devx] отсутствуют обязательные ключи: {keys}", - "zh": "[tool.devx] 缺少必需的键: {keys}" - }, - "active": { - "bg": "активен", - "de": "aktiv", - "en": "active", - "pl": "aktywny", - "ru": "активен", - "zh": "活跃" - }, - "completed": { - "bg": "завършен", - "de": "abgeschlossen", - "en": "completed", - "pl": "ukończony", - "ru": "завершён", - "zh": "已完成" - }, - "count={count}": { - "bg": "count={count}", - "de": "count={count}", - "en": "count={count}", - "pl": "count={count}", - "ru": "count={count}", - "zh": "count={count}" - }, - "devx version mismatch across extras: {detail}": { - "bg": "несъответствие на версията на devx между extras: {detail}", - "de": "devx-Versionskonflikt zwischen Extras: {detail}", - "en": "devx version mismatch across extras: {detail}", - "pl": "niezgodność wersji devx między extras: {detail}", - "ru": "несоответствие версии devx между extras: {detail}", - "zh": "devx 版本在 extras 之间不一致: {detail}" - }, - "failed": { - "bg": "неуспешен", - "de": "fehlgeschlagen", - "en": "failed", - "pl": "nieudany", - "ru": "неудачный", - "zh": "失败" - }, - "git command failed ({cmd}): {stderr}": { - "bg": "git командата се провали ({cmd}): {stderr}", - "de": "git-Befehl fehlgeschlagen ({cmd}): {stderr}", - "en": "git command failed ({cmd}): {stderr}", - "pl": "polecenie git nie powiodło się ({cmd}): {stderr}", - "ru": "git-команда завершилась с ошибкой ({cmd}): {stderr}", - "zh": "git 命令失败({cmd}):{stderr}" - }, - "git diff --numstat failed: {stderr}": { - "bg": "git diff --numstat се провали: {stderr}", - "de": "git diff --numstat fehlgeschlagen: {stderr}", - "en": "git diff --numstat failed: {stderr}", - "pl": "git diff --numstat nie powiódł się: {stderr}", - "ru": "git diff --numstat завершился с ошибкой: {stderr}", - "zh": "git diff --numstat 失败:{stderr}" - }, - "git-cliff generated empty changelog for v{version}. Check cliff.toml and commit history.": { - "bg": "git-cliff генерира празен changelog за v{version}. Проверете cliff.toml и историята на комитите.", - "de": "git-cliff hat ein leeres Changelog für v{version} generiert. Prüfen Sie cliff.toml und die Commit-Historie.", - "en": "git-cliff generated empty changelog for v{version}. Check cliff.toml and commit history.", - "pl": "git-cliff wygenerował pusty changelog dla v{version}. Sprawdź cliff.toml i historię commitów.", - "ru": "git-cliff сгенерировал пустой changelog для v{version}. Проверьте cliff.toml и историю коммитов.", - "zh": "git-cliff 为 v{version} 生成了空的 changelog。请检查 cliff.toml 和提交历史。" - }, - "git-cliff returned empty version.": { - "bg": "git-cliff върна празна версия.", - "de": "git-cliff gab eine leere Version zurück.", - "en": "git-cliff returned empty version.", - "pl": "git-cliff zwrócił pustą wersję.", - "ru": "git-cliff вернул пустую версию.", - "zh": "git-cliff 返回了空版本。" - }, - "git-cliff returned invalid version format: {version}. Expected semver (e.g., 0.4.1).": { - "bg": "git-cliff върна невалиден формат на версия: {version}. Очаква се semver (напр. 0.4.1).", - "de": "git-cliff gab ein ungültiges Versionsformat zurück: {version}. Erwartet: Semver (z. B. 0.4.1).", - "en": "git-cliff returned invalid version format: {version}. Expected semver (e.g., 0.4.1).", - "pl": "git-cliff zwrócił nieprawidłowy format wersji: {version}. Oczekiwano semver (np., 0.4.1).", - "ru": "git-cliff вернул неверный формат версии: {version}. Ожидается semver (напр. 0.4.1).", - "zh": "git-cliff 返回了无效的版本格式:{version}。应为 semver(例如 0.4.1)。" - }, - "importlib.reload({mod}) called {n} time(s) in test '{test}' — odd count leaves module in modified state. Add a final reload to restore defaults or wrap in try/finally.": { - "bg": "importlib.reload({mod}) е извикан {n} път(и) в тест '{test}' — нечетен брой оставя модула в променено състояние. Добавете финален reload за възстановяване на подразбираните или обвийте в try/finally.", - "de": "importlib.reload({mod}) wurde {n} Mal in Test '{test}' aufgerufen — ungerade Anzahl lässt Modul in verändertem Zustand. Finalen Reload hinzufügen oder in try/finally einhüllen.", - "en": "importlib.reload({mod}) called {n} time(s) in test '{test}' — odd count leaves module in modified state. Add a final reload to restore defaults or wrap in try/finally.", - "pl": "importlib.reload({mod}) wywołano {n} raz(y) w teście '{test}' — nieparzysta liczba pozostawia moduł w zmienionym stanie. Dodaj końcowy reload, aby przywrócić domyślne, lub owiń w try/finally.", - "ru": "importlib.reload({mod}) вызван {n} раз(а) в тесте '{test}' — нечётное количество оставляет модуль в изменённом состоянии. Добавьте финальный reload для восстановления или оберните в try/finally.", - "zh": "在测试 '{test}' 中调用了 {n} 次 importlib.reload({mod})——奇数次会使模块保持修改状态。请添加最后的 reload 恢复默认或用 try/finally 包裹。" - }, - "in_progress": { - "bg": "в процес", - "de": "in Bearbeitung", - "en": "in progress", - "pl": "w toku", - "ru": "в процессе", - "zh": "进行中" - }, - "inactive": { - "bg": "неактивен", - "de": "inaktiv", - "en": "inactive", - "pl": "nieaktywny", - "ru": "неактивен", - "zh": "未激活" - }, - "indices={indices}": { - "bg": "indices={indices}", - "de": "indices={indices}", - "en": "indices={indices}", - "pl": "indices={indices}", - "ru": "indices={indices}", - "zh": "indices={indices}" - }, - "mapping.json keys and values must be strings, got {k}={v}": { - "bg": "Ключовете и стойностите на mapping.json трябва да са низове, получено {k}={v}", - "de": "mapping.json-Schlüssel und -Werte müssen Strings sein, erhalten {k}={v}", - "en": "mapping.json keys and values must be strings, got {k}={v}", - "pl": "klucze i wartości mapping.json muszą być ciągami znaków, otrzymano {k}={v}", - "ru": "Ключи и значения mapping.json должны быть строками, получено {k}={v}", - "zh": "mapping.json 的键和值必须是字符串,实际得到 {k}={v}" - }, - "mapping.json must be a dict of file-path -> page-title, got {type}": { - "bg": "mapping.json трябва да е dict от file-path -> page-title, получено {type}", - "de": "mapping.json muss ein Dict von file-path -> page-title sein, erhalten {type}", - "en": "mapping.json must be a dict of file-path -> page-title, got {type}", - "pl": "mapping.json musi być słownikiem ścieżka-pliku -> tytuł-strony, otrzymano {type}", - "ru": "mapping.json должен быть dict вида file-path -> page-title, получено {type}", - "zh": "mapping.json 必须是 file-path -> page-title 的字典,实际得到 {type}" - }, - "pending": { - "bg": "в очакване", - "de": "ausstehend", - "en": "pending", - "pl": "oczekujący", - "ru": "ожидает", - "zh": "待处理" - }, - "pyproject.toml not found in current directory.": { - "bg": "pyproject.toml не е намерен в текущата директория.", - "de": "pyproject.toml im aktuellen Verzeichnis nicht gefunden.", - "en": "pyproject.toml not found in current directory.", - "pl": "nie znaleziono pyproject.toml w bieżącym katalogu.", - "ru": "pyproject.toml не найден в текущей директории.", - "zh": "在当前目录中未找到 pyproject.toml。" - }, - "tea login '{name}' already configured.": { - "bg": "tea входът '{name}' вече е конфигуриран.", - "de": "tea-Login '{name}' bereits konfiguriert.", - "en": "tea login '{name}' already configured.", - "pl": "Logowanie tea '{name}' już skonfigurowane.", - "ru": "Вход tea '{name}' уже настроен.", - "zh": "tea 登录 '{name}' 已配置。" - }, - "tea not installed — skipping login configuration.": { - "bg": "tea не е инсталиран — пропуска се конфигурацията за вход.", - "de": "tea nicht installiert — Login-Konfiguration wird übersprungen.", - "en": "tea not installed — skipping login configuration.", - "pl": "tea nie jest zainstalowany — pomijanie konfiguracji logowania.", - "ru": "tea не установлен — настройка входа пропускается.", - "zh": "未安装 tea——跳过登录配置。" - }, - "time.sleep called in test '{test}' without @patch — this causes real wall-clock delays. Add @patch(\".time.sleep\").": { - "bg": "time.sleep извикано в тест '{test}' без @patch — това причинява реални забавяния. Добавете @patch(\".time.sleep\").", - "de": "time.sleep in Test '{test}' ohne @patch aufgerufen — dies verursacht echte Wanduhr-Verzögerungen. @patch(\".time.sleep\") hinzufügen.", - "en": "time.sleep called in test '{test}' without @patch — this causes real wall-clock delays. Add @patch(\".time.sleep\").", - "pl": "time.sleep wywołane w teście '{test}' bez @patch — to powoduje rzeczywiste opóźnienia. Dodaj @patch(\".time.sleep\").", - "ru": "time.sleep вызвано в тесте '{test}' без @patch — это вызывает реальные задержки. Добавьте @patch(\".time.sleep\").", - "zh": "time.sleep 在测试 '{test}' 中被调用但没有 @patch — 这会导致真实的挂钟延迟。请添加 @patch(\".time.sleep\")。" - }, - "tofu command failed in {dir}: {error}": { - "bg": "командата tofu не успя в {dir}: {error}", - "de": "tofu-Befehl fehlgeschlagen in {dir}: {error}", - "en": "tofu command failed in {dir}: {error}", - "pl": "polecenie tofu nie powiodło się w {dir}: {error}", - "ru": "команда tofu не удалась в {dir}: {error}", - "zh": "tofu 命令在 {dir} 中失败: {error}" - }, - "unknown": { - "bg": "неизвестен", - "de": "unbekannt", - "en": "unknown", - "pl": "nieznany", - "ru": "неизвестно", - "zh": "未知" - }, - "{call} called in test '{test}' without @patch — this spawns a real subprocess. Add @patch(\".subprocess.run\") or patch the calling function.": { - "bg": "{call} извикано в тест '{test}' без @patch — това стартира реален subprocess. Добавете @patch(\".subprocess.run\") или patch-нете извикващата функция.", - "de": "{call} in Test '{test}' ohne @patch aufgerufen — dies startet einen echten subprocess. @patch(\".subprocess.run\") hinzufügen oder die aufrufende Funktion patchen.", - "en": "{call} called in test '{test}' without @patch — this spawns a real subprocess. Add @patch(\".subprocess.run\") or patch the calling function.", - "pl": "{call} wywołane w teście '{test}' bez @patch — to uruchamia rzeczywisty subprocess. Dodaj @patch(\".subprocess.run\") lub patchuj wywołującą funkcję.", - "ru": "{call} вызвано в тесте '{test}' без @patch — это запускает реальный subprocess. Добавьте @patch(\".subprocess.run\") или patch вызывающую функцию.", - "zh": "{call} 在测试 '{test}' 中被调用但没有 @patch — 这会启动真实的子进程。请添加 @patch(\".subprocess.run\") 或 patch 调用函数。" - }, - "{env} is not set. Set it in your .env file or pass it as an environment variable.": { - "bg": "{env} не е зададен. Задайте го във вашия .env файл или го подайте като променлива на средата.", - "de": "{env} ist nicht gesetzt. Setzen Sie es in Ihrer .env-Datei oder übergeben Sie es als Umgebungsvariable.", - "en": "{env} is not set. Set it in your .env file or pass it as an environment variable.", - "pl": "{env} nie jest ustawiony. Ustaw go w pliku .env lub przekaż jako zmienną środowiskową.", - "ru": "{env} не задан. Установите его в файле .env или передайте как переменную окружения.", - "zh": "{env} 未设置。请在 .env 文件中设置或作为环境变量传递。" - }, - "{env} is not set. Set it in your .env file.": { - "bg": "{env} не е зададен. Задайте го във вашия .env файл.", - "de": "{env} ist nicht gesetzt. Setzen Sie es in Ihrer .env-Datei.", - "en": "{env} is not set. Set it in your .env file.", - "pl": "{env} nie jest ustawiony. Ustaw go w pliku .env.", - "ru": "{env} не задан. Установите его в файле .env.", - "zh": "{env} 未设置。请在 .env 文件中设置。" - }, - "{file} already exists. Use --force to overwrite.": { - "bg": "{file} вече съществува. Използвайте --force за презаписване.", - "de": "{file} existiert bereits. Mit --force überschreiben.", - "en": "{file} already exists. Use --force to overwrite.", - "pl": "{file} już istnieje. Użyj --force, aby nadpisać.", - "ru": "{file} уже существует. Используйте --force для перезаписи.", - "zh": "{file} 已存在。使用 --force 覆盖。" - }, - "{func} called in test '{test}' without @patch — this function {desc}. Add @patch(\".{func}\").": { - "bg": "{func} извикано в тест '{test}' без @patch — тази функция {desc}. Добавете @patch(\".{func}\").", - "de": "{func} in Test '{test}' ohne @patch aufgerufen — diese Funktion {desc}. @patch(\".{func}\") hinzufügen.", - "en": "{func} called in test '{test}' without @patch — this function {desc}. Add @patch(\".{func}\").", - "pl": "{func} wywołane w teście '{test}' bez @patch — ta funkcja {desc}. Dodaj @patch(\".{func}\").", - "ru": "{func} вызвано в тесте '{test}' без @patch — эта функция {desc}. Добавьте @patch(\".{func}\").", - "zh": "{func} 在测试 '{test}' 中被调用但没有 @patch — 此函数 {desc}。请添加 @patch(\".{func}\")。" - }, - "{level}: {tool} not found.{hint}": { - "bg": "{level}: {tool} не е намерен.{hint}", - "de": "{level}: {tool} nicht gefunden.{hint}", - "en": "{level}: {tool} not found.{hint}", - "pl": "{level}: {tool} nie znaleziono.{hint}", - "ru": "{level}: {tool} не найден.{hint}", - "zh": "{level}: 未找到 {tool}。{hint}" - }, - "{separator}": { - "bg": "{separator}", - "de": "{separator}", - "en": "{separator}", - "pl": "{separator}", - "ru": "{separator}", - "zh": "{separator}" - } + "\n=== Summary ===": { + "bg": "\n=== Обобщение ===", + "de": "\n=== Zusammenfassung ===", + "en": "\n=== Summary ===", + "pl": "\n=== Podsumowanie ===", + "ru": "\n=== Сводка ===", + "zh": "\n=== 摘要 ===" + }, + "\nAll documentation coverage checks passed!": { + "bg": "\nВсички проверки за покритие на документацията преминаха успешно!", + "de": "\nAlle Dokumentations-Abdeckungsprüfungen bestanden!", + "en": "\nAll documentation coverage checks passed!", + "pl": "\nWszystkie kontrole pokrycia dokumentacji zakończone pomyślnie!", + "ru": "\nВсе проверки покрытия документации пройдены!", + "zh": "\n所有文档覆盖率检查均已通过!" + }, + "\nCHANGELOG version ordering:": { + "bg": "\nПодреждане на версиите в CHANGELOG:", + "de": "\nReihenfolge der CHANGELOG-Versionen:", + "en": "\nCHANGELOG version ordering:", + "pl": "\nKolejność wersji w CHANGELOG:", + "ru": "\nПорядок версий в CHANGELOG:", + "zh": "\nCHANGELOG 版本顺序:" + }, + "\nChecking CI script documentation in ci-cd-workflow.md...": { + "bg": "\nПроверка на документацията за CI скриптове в ci-cd-workflow.md...", + "de": "\nPrüfe CI-Skript-Dokumentation in ci-cd-workflow.md...", + "en": "\nChecking CI script documentation in ci-cd-workflow.md...", + "pl": "\nSprawdzanie dokumentacji skryptów CI w ci-cd-workflow.md...", + "ru": "\nПроверка документации CI-скриптов в ci-cd-workflow.md...", + "zh": "\n正在检查 ci-cd-workflow.md 中的 CI 脚本文档..." + }, + "\nChecking module documentation in architecture.md...": { + "bg": "\nПроверка на документацията за модулите в architecture.md...", + "de": "\nPrüfe Moduldokumentation in architecture.md...", + "en": "\nChecking module documentation in architecture.md...", + "pl": "\nSprawdzanie dokumentacji modułów w architecture.md...", + "ru": "\nПроверка документации модулей в architecture.md...", + "zh": "\n正在检查 architecture.md 中的模块文档..." + }, + "\nDoc coverage: {covered}/{total} ({pct}%)": { + "bg": "\nПокритие на документацията: {covered}/{total} ({pct}%)", + "de": "\nDokumentationsabdeckung: {covered}/{total} ({pct}%)", + "en": "\nDoc coverage: {covered}/{total} ({pct}%)", + "pl": "\nPokrycie dokumentacji: {covered}/{total} ({pct}%)", + "ru": "\nПокрытие документации: {covered}/{total} ({pct}%)", + "zh": "\n文档覆盖率:{covered}/{total} ({pct}%)" + }, + "\nDone! Synced: {synced}, Pruned: {pruned}": { + "bg": "", + "de": "", + "en": "\nDone! Synced: {synced}, Pruned: {pruned}", + "pl": "", + "ru": "", + "zh": "" + }, + "\nDone. Deleted {deleted}, kept {kept}, failed {failed}.": { + "bg": "\nГотово. Изтрити: {deleted}, запазени: {kept}, неуспешни: {failed}.", + "de": "\nFertig. Gelöscht: {deleted}, behalten: {kept}, fehlgeschlagen: {failed}.", + "en": "\nDone. Deleted {deleted}, kept {kept}, failed {failed}.", + "pl": "\nGotowe. Usunięto: {deleted}, zachowano: {kept}, błędów: {failed}.", + "ru": "\nГотово. Удалено: {deleted}, сохранено: {kept}, ошибок: {failed}.", + "zh": "\n完成。已删除 {deleted},保留 {kept},失败 {failed}。" + }, + "\nERROR: Documentation coverage is not 100%. Use --fail-on-missing to enforce.": { + "bg": "\nГРЕШКА: Покритието на документацията не е 100%. Използвайте --fail-on-missing за налагане.", + "de": "\nFEHLER: Die Dokumentationsabdeckung beträgt nicht 100%. Mit --fail-on-missing erzwingen.", + "en": "\nERROR: Documentation coverage is not 100%. Use --fail-on-missing to enforce.", + "pl": "\nBŁĄD: Pokrycie dokumentacji nie wynosi 100%. Użyj --fail-on-missing, aby to wymusić.", + "ru": "\nОШИБКА: Покрытие документации не составляет 100%. Используйте --fail-on-missing для принудительной проверки.", + "zh": "\n错误:文档覆盖率未达到 100%。使用 --fail-on-missing 强制执行。" + }, + "\nFAIL: {n} stale version reference(s) found:": { + "bg": "", + "de": "", + "en": "\nFAIL: {n} stale version reference(s) found:", + "pl": "", + "ru": "", + "zh": "" + }, + "\nFix the misaligned tags before creating new releases. Run 'python3 -m devx.ci.release --verify' for a full report.": { + "bg": "\nКоригирайте несъответстващите тагове преди създаване на нови версии. Изпълнете 'python3 -m devx.ci.release --verify' за пълен отчет.", + "de": "\nKorrigieren Sie die falsch zugeordneten Tags, bevor Sie neue Releases erstellen. Führen Sie 'python3 -m devx.ci.release --verify' für einen vollständigen Bericht aus.", + "en": "\nFix the misaligned tags before creating new releases. Run 'python3 -m devx.ci.release --verify' for a full report.", + "pl": "\nNapraw niezgodne tagi przed utworzeniem nowych wydań. Uruchom 'python3 -m devx.ci.release --verify', aby uzyskać pełny raport.", + "ru": "\nИсправьте несоответствующие теги перед созданием новых релизов. Выполните 'python3 -m devx.ci.release --verify' для полного отчёта.", + "zh": "\n请在创建新版本之前修正不匹配的标签。运行 'python3 -m devx.ci.release --verify' 获取完整报告。" + }, + "\nFixed {n} stale version reference(s).": { + "bg": "", + "de": "", + "en": "\nFixed {n} stale version reference(s).", + "pl": "", + "ru": "", + "zh": "" + }, + "\nGenerated {count} badges:": { + "bg": "\nГенерирани {count} значка:", + "de": "\n{count} Badges generiert:", + "en": "\nGenerated {count} badges:", + "pl": "\nWygenerowano {count} odznak:", + "ru": "\nСгенерировано значков: {count}:", + "zh": "\n已生成 {count} 个徽章:" + }, + "\nKeeping {kept}, would delete {count}": { + "bg": "\nЗапазени {kept}, ще бъдат изтрити {count}", + "de": "\nBehalte {kept}, würde {count} löschen", + "en": "\nKeeping {kept}, would delete {count}", + "pl": "\nZachowano {kept}, usunięto by {count}", + "ru": "\nСохранено {kept}, будет удалено {count}", + "zh": "\n保留 {kept},将删除 {count}" + }, + "\nLatest tag: {tag}": { + "bg": "\nПоследен таг: {tag}", + "de": "\nNeuestes Tag: {tag}", + "en": "\nLatest tag: {tag}", + "pl": "\nNajnowszy tag: {tag}", + "ru": "\nПоследний тег: {tag}", + "zh": "\n最新标签:{tag}" + }, + "\nMissing documentation:": { + "bg": "\nЛипсваща документация:", + "de": "\nFehlende Dokumentation:", + "en": "\nMissing documentation:", + "pl": "\nBrakująca dokumentacja:", + "ru": "\nОтсутствующая документация:", + "zh": "\n缺失的文档:" + }, + "\nNo APPROVED review found on the PR. If the PR author and the CI reviewer token map to the same Gitea user, self-approval is rejected — approve the PR via a non-author account, then re-run the auto-merge job.": { + "bg": "\nВ PR не е намерено ревю APPROVED. Ако авторът на PR и токенът на CI рецензента са един и същ потребител в Gitea, самоодобрението се отхвърля — одобрете PR чрез друг акаунт и стартирайте отново задачата за автоматично сливане.", + "de": "\nKein APPROVED-Review im PR gefunden. Wenn der PR-Autor und das CI-Reviewer-Token demselben Gitea-Benutzer entsprechen, wird die Selbstgenehmigung abgelehnt — genehmigen Sie den PR über ein anderes Konto und führen Sie den Auto-Merge-Job erneut aus.", + "en": "\nNo APPROVED review found on the PR. If the PR author and the CI reviewer token map to the same Gitea user, self-approval is rejected — approve the PR via a non-author account, then re-run the auto-merge job.", + "pl": "\nNie znaleziono recenzji APPROVED w PR. Jeśli autor PR i token recenzenta CI mapują na tego samego użytkownika Gitea, samoakceptacja jest odrzucana — zatwierdź PR za pomocą innego konta, a następnie ponownie uruchom zadanie automatycznego scalania.", + "ru": "\nВ PR не найдено ревью APPROVED. Если автор PR и токен CI-ревьюера принадлежат одному и тому же пользователю Gitea, самоодобрение отклоняется — одобрите PR через другой аккаунт, затем повторно запустите задачу автоматического слияния.", + "zh": "\n在 PR 中未找到 APPROVED 评审。如果 PR 作者和 CI 评审者令牌映射到同一个 Gitea 用户,自我批准将被拒绝 — 请通过非作者账户批准该 PR,然后重新运行自动合并任务。" + }, + "\nNo stale version references found.": { + "bg": "", + "de": "", + "en": "\nNo stale version references found.", + "pl": "", + "ru": "", + "zh": "" + }, + "\nPASS: All version references are current.": { + "bg": "", + "de": "", + "en": "\nPASS: All version references are current.", + "pl": "", + "ru": "", + "zh": "" + }, + "\nResult: {status}": { + "bg": "\nРезултат: {status}", + "de": "\nErgebnis: {status}", + "en": "\nResult: {status}", + "pl": "\nWynik: {status}", + "ru": "\nРезультат: {status}", + "zh": "\n结果:{status}" + }, + "\nRun with --fix to auto-update version references.": { + "bg": "", + "de": "", + "en": "\nRun with --fix to auto-update version references.", + "pl": "", + "ru": "", + "zh": "" + }, + "\nTag → Commit alignment:": { + "bg": "\nСъответствие таг → комит:", + "de": "\nTag-→-Commit-Zuordnung:", + "en": "\nTag → Commit alignment:", + "pl": "\nTag → Commit: zgodność:", + "ru": "\nСоответствие тег → коммит:", + "zh": "\n标签 → 提交对应关系:" + }, + "\nTest isolation check FAILED: {count} violation(s) in {files} file(s).\n": { + "bg": "\nПроверката за изолация на тестовете СЕ ПРОВАЛИ: {count} нарушение(я) във {files} файл(а).\n", + "de": "\nTestisolierungsprüfung FEHLGESCHLAGEN: {count} Verstoß/Verstöße in {files} Datei(en).\n", + "en": "\nTest isolation check FAILED: {count} violation(s) in {files} file(s).\n", + "pl": "\nKontrola izolacji testów NIEUDANA: {count} naruszeń w {files} plikach.\n", + "ru": "\nПроверка изоляции тестов ПРОВАЛЕНА: {count} нарушение(й) в {files} файл(ах).\n", + "zh": "\n测试隔离检查失败:{files} 个文件中存在 {count} 处违规。\n" + }, + "\nUntagged release commits:": { + "bg": "\nРелийз комити без таг:", + "de": "\nRelease-Commits ohne Tag:", + "en": "\nUntagged release commits:", + "pl": "\nCommity wydania bez tagu:", + "ru": "\nРелизные коммиты без тега:", + "zh": "\n未打标签的发布提交:" + }, + "\nUser-facing changes ({count}):": { + "bg": "\nВидими за потребителя промени ({count}):", + "de": "\nNutzersichtbare Änderungen ({count}):", + "en": "\nUser-facing changes ({count}):", + "pl": "\nZmiany widoczne dla użytkownika ({count}):", + "ru": "\nПользовательские изменения ({count}):", + "zh": "\n面向用户的更改({count}):" + }, + "\nVerification passed — all wiki pages exist.": { + "bg": "", + "de": "", + "en": "\nVerification passed — all wiki pages exist.", + "pl": "", + "ru": "", + "zh": "" + }, + "\nVerifying wiki pages...": { + "bg": "", + "de": "", + "en": "\nVerifying wiki pages...", + "pl": "", + "ru": "", + "zh": "" + }, + "\nWorkflow-only changes ({count}):": { + "bg": "\nПромени само в workflow ({count}):", + "de": "\nNur-Workflow-Änderungen ({count}):", + "en": "\nWorkflow-only changes ({count}):", + "pl": "\nZmiany tylko w workflow ({count}):", + "ru": "\nИзменения только в workflow ({count}):", + "zh": "\n仅工作流更改({count}):" + }, + "\n[check_test_coverage] Fix: add the missing test file(s) before committing.": { + "bg": "\n[check_test_coverage] Корекция: добавете липсващите тестови файл(ове) преди комит.", + "de": "\n[check_test_coverage] Behebung: fehlende Testdatei(en) vor dem Commit hinzufügen.", + "en": "\n[check_test_coverage] Fix: add the missing test file(s) before committing.", + "pl": "\n[check_test_coverage] Poprawka: dodaj brakujące pliki testowe przed commitem.", + "ru": "\n[check_test_coverage] Исправление: добавьте недостающие тестовые файл(ы) перед коммитом.", + "zh": "\n[check_test_coverage] 修复:提交前添加缺失的测试文件。" + }, + "\n[dry-run] Changelog:\n{changelog}": { + "bg": "\n[dry-run] Списък на промените:\n{changelog}", + "de": "\n[dry-run] Änderungsprotokoll:\n{changelog}", + "en": "\n[dry-run] Changelog:\n{changelog}", + "pl": "\n[dry-run] Dziennik zmian:\n{changelog}", + "ru": "\n[dry-run] Журнал изменений:\n{changelog}", + "zh": "\n[dry-run] 变更日志:\n{changelog}" + }, + "\n{label} files changed ({count}):": { + "bg": "\nПроменени файлове — {label} ({count}):", + "de": "\n{label} geänderte Dateien ({count}):", + "en": "\n{label} files changed ({count}):", + "pl": "\n{label} plików zmienionych ({count}):", + "ru": "\nИзменённые файлы — {label} ({count}):", + "zh": "\n{label} 个已更改文件({count}):" + }, + "\n{separator}": { + "bg": "\n{separator}", + "de": "\n{separator}", + "en": "\n{separator}", + "pl": "\n{separator}", + "ru": "\n{separator}", + "zh": "\n{separator}" + }, + "\n{tag} files ({count}):": { + "bg": "\n{tag} файла ({count}):", + "de": "\n{tag} Dateien ({count}):", + "en": "\n{tag} files ({count}):", + "pl": "\nPliki {tag} ({count}):", + "ru": "\n{tag} файлов ({count}):", + "zh": "\n{tag} 个文件({count}):" + }, + " Could not fetch logs: {error}": { + "bg": " Неуспешно извличане на логове: {error}", + "de": " Logs konnten nicht abgerufen werden: {error}", + "en": " Could not fetch logs: {error}", + "pl": " Nie udało się pobrać logów: {error}", + "ru": " Не удалось получить логи: {error}", + "zh": " 无法获取日志:{error}" + }, + " pytest stderr (last 300 chars): {stderr}": { + "bg": " pytest stderr (последни 300 символа): {stderr}", + "de": " pytest stderr (letzte 300 Zeichen): {stderr}", + "en": " pytest stderr (last 300 chars): {stderr}", + "pl": " pytest stderr (ostatnie 300 znaków): {stderr}", + "ru": " pytest stderr (последние 300 символов): {stderr}", + "zh": " pytest stderr(最后 300 个字符):{stderr}" + }, + " pytest stdout (last 300 chars): {stdout}": { + "bg": " pytest stdout (последни 300 символа): {stdout}", + "de": " pytest stdout (letzte 300 Zeichen): {stdout}", + "en": " pytest stdout (last 300 chars): {stdout}", + "pl": " pytest stdout (ostatnie 300 znaków): {stdout}", + "ru": " pytest stdout (последние 300 символов): {stdout}", + "zh": " pytest stdout(最后 300 个字符):{stdout}" + }, + " stderr: {stderr}": { + "bg": " stderr: {stderr}", + "de": " stderr: {stderr}", + "en": " stderr: {stderr}", + "pl": " stderr: {stderr}", + "ru": " stderr: {stderr}", + "zh": " stderr: {stderr}" + }, + " - Auto-delete branch after merge: yes": { + "bg": " - Автоматично изтриване на клон след сливане: да", + "de": " - Branch nach Merge automatisch löschen: ja", + "en": " - Auto-delete branch after merge: yes", + "pl": " - Auto-usuwanie gałęzi po scaleniu: tak", + "ru": " - Автоудаление ветки после слияния: да", + "zh": " - 合并后自动删除分支: 是" + }, + " - Block admin merge override: yes": { + "bg": " - Блокиране на admin merge override: да", + "de": " - Admin-Merge-Override blockieren: ja", + "en": " - Block admin merge override: yes", + "pl": " - Blokuj admin merge override: tak", + "ru": " - Блокировать admin merge override: да", + "zh": " - 阻止管理员合并覆盖:是" + }, + " - Block outdated branches: yes": { + "bg": " - Блокиране на остарели клонове: да", + "de": " - Veraltete Branches blockieren: ja", + "en": " - Block outdated branches: yes", + "pl": " - Blokowanie nieaktualnych gałęzi: tak", + "ru": " - Блокировать устаревшие ветки: да", + "zh": " - 阻止过时分支: 是" + }, + " - Block rejected reviews: yes": { + "bg": " - Блокиране на отхвърлени рецензии: да", + "de": " - Abgelehnte Reviews blockieren: ja", + "en": " - Block rejected reviews: yes", + "pl": " - Blokowanie odrzuconych recenzji: tak", + "ru": " - Блокировать отклонённые ревью: да", + "zh": " - 阻止被拒绝的审查: 是" + }, + " - Direct pushes: BLOCKED (require PR, whitelisted users can push)": { + "bg": " - Директни push-ове: БЛОКИРАНИ (изисква се PR; разрешени потребители могат да push-ват)", + "de": " - Direkte Pushes: BLOCKIERT (PR erforderlich, freigegebene Benutzer dürfen pushen)", + "en": " - Direct pushes: BLOCKED (require PR, whitelisted users can push)", + "pl": " - Bezpośrednie push-e: ZABLOKOWANE (wymagają PR, użytkownicy z białej listy mogą pushować)", + "ru": " - Прямые push: ЗАБЛОКИРОВАНЫ (требуется PR; разрешённые пользователи могут push)", + "zh": " - 直接推送:已阻止(需要 PR,白名单用户可推送)" + }, + " - Dismiss stale approvals: yes": { + "bg": " - Анулиране на остарели одобрения: да", + "de": " - Veraltete Genehmigungen ablehnen: ja", + "en": " - Dismiss stale approvals: yes", + "pl": " - Odrzucanie nieaktualnych zatwierdzeń: tak", + "ru": " - Отклонять устаревшие одобрения: да", + "zh": " - 忽略过时审批: 是" + }, + " - Required approvals: {count}": { + "bg": " - Необходими одобрения: {count}", + "de": " - Erforderliche Genehmigungen: {count}", + "en": " - Required approvals: {count}", + "pl": " - Wymagane zatwierdzenia: {count}", + "ru": " - Требуемые одобрения: {count}", + "zh": " - 必需审批数: {count}" + }, + " - Required status checks: {checks}": { + "bg": " - Необходими проверки на състоянието: {checks}", + "de": " - Erforderliche Status-Checks: {checks}", + "en": " - Required status checks: {checks}", + "pl": " - Wymagane kontrole statusu: {checks}", + "ru": " - Требуемые проверки статуса: {checks}", + "zh": " - 必需状态检查: {checks}" + }, + " - {count} standard labels verified": { + "bg": " - {count} стандартни етикета проверени", + "de": " - {count} Standard-Labels geprüft", + "en": " - {count} standard labels verified", + "pl": " - {count} standardowych etykiet zweryfikowanych", + "ru": " - {count} стандартных меток проверено", + "zh": " - 已验证 {count} 个标准标签" + }, + " -> {dir}": { + "bg": " -> {dir}", + "de": " -> {dir}", + "en": " -> {dir}", + "pl": " -> {dir}", + "ru": " -> {dir}", + "zh": " -> {dir}" + }, + " ... and {n} more": { + "bg": "", + "de": "", + "en": " ... and {n} more", + "pl": "", + "ru": "", + "zh": "" + }, + " Auto-fixed trailing whitespace in {n} files": { + "bg": " Автоматично коригирани крайни интервали в {n} файла", + "de": " Abschließende Leerzeichen in {n} Dateien automatisch korrigiert", + "en": " Auto-fixed trailing whitespace in {n} files", + "pl": " Automatycznie poprawiono końcowe białe znaki w {n} plikach", + "ru": " Автоматически исправлены конечные пробелы в {n} файлах", + "zh": " 已自动修复 {n} 个文件中的行尾空白" + }, + " Collecting code quality...": { + "bg": " Събиране на качество на кода...", + "de": " Codequalität wird erfasst...", + "en": " Collecting code quality...", + "pl": " Zbieranie jakości kodu...", + "ru": " Сбор данных о качестве кода...", + "zh": " 正在收集代码质量..." + }, + " Collecting coverage and tests...": { + "bg": " Събиране на покритие и тестове...", + "de": " Coverage und Tests werden erfasst...", + "en": " Collecting coverage and tests...", + "pl": " Zbieranie pokrycia i testów...", + "ru": " Сбор покрытия и тестов...", + "zh": " 正在收集覆盖率和测试..." + }, + " Collecting doc coverage...": { + "bg": " Събиране на покритие на документацията...", + "de": " Dokumentationsabdeckung wird erfasst...", + "en": " Collecting doc coverage...", + "pl": " Zbieranie pokrycia dokumentacji...", + "ru": " Сбор покрытия документации...", + "zh": " 正在收集文档覆盖率..." + }, + " Collecting version...": { + "bg": " Събиране на версия...", + "de": " Version wird erfasst...", + "en": " Collecting version...", + "pl": " Zbieranie wersji...", + "ru": " Сбор версии...", + "zh": " 正在收集版本..." + }, + " Deleted: {version}": { + "bg": " Изтрито: {version}", + "de": " Gelöscht: {version}", + "en": " Deleted: {version}", + "pl": " Usunięto: {version}", + "ru": " Удалено: {version}", + "zh": " 已删除:{version}" + }, + " FAIL: {title} — page not found in wiki!": { + "bg": "", + "de": "", + "en": " FAIL: {title} — page not found in wiki!", + "pl": "", + "ru": "", + "zh": "" + }, + " FAILED to delete: {version}": { + "bg": " НЕУСПЕШНО изтриване: {version}", + "de": " Löschen FEHLGESCHLAGEN: {version}", + "en": " FAILED to delete: {version}", + "pl": " NIE UDAŁO się usunąć: {version}", + "ru": " НЕ УДАЛОСЬ удалить: {version}", + "zh": " 删除失败:{version}" + }, + " Fix the PR title with:\n python3 -m devx.ci.fix_pr_title --repo {repo} --pr-number {pr}\n Or manually set the PR title to: '{expected}'": { + "bg": " Коригирайте заглавието на PR с:\n python3 -m devx.ci.fix_pr_title --repo {repo} --pr-number {pr}\n Или ръчно задайте заглавие на PR: '{expected}'", + "de": " Korrigieren Sie den PR-Titel mit:\n python3 -m devx.ci.fix_pr_title --repo {repo} --pr-number {pr}\n Oder setzen Sie den PR-Titel manuell auf: '{expected}'", + "en": " Fix the PR title with:\n python3 -m devx.ci.fix_pr_title --repo {repo} --pr-number {pr}\n Or manually set the PR title to: '{expected}'", + "pl": " Popraw tytuł PR poleceniem:\n python3 -m devx.ci.fix_pr_title --repo {repo} --pr-number {pr}\n Lub ręcznie ustaw tytuł PR na: '{expected}'", + "ru": " Исправьте заголовок PR командой:\n python3 -m devx.ci.fix_pr_title --repo {repo} --pr-number {pr}\n Или вручную установите заголовок PR: '{expected}'", + "zh": " 使用以下命令修复 PR 标题:\n python3 -m devx.ci.fix_pr_title --repo {repo} --pr-number {pr}\n 或手动将 PR 标题设置为:'{expected}'" + }, + " Fixed {fixes} version ref(s) in {file}": { + "bg": "", + "de": "", + "en": " Fixed {fixes} version ref(s) in {file}", + "pl": "", + "ru": "", + "zh": "" + }, + " Generated: {path}": { + "bg": " Генерирано: {path}", + "de": " Generiert: {path}", + "en": " Generated: {path}", + "pl": " Wygenerowano: {path}", + "ru": " Сгенерировано: {path}", + "zh": " 已生成:{path}" + }, + " HTTP 500 from registry, retrying in {wait:.0f}s (attempt {attempt}/5)...": { + "bg": " HTTP 500 от регистъра, повторен опит след {wait:.0f}с (опит {attempt}/5)...", + "de": " HTTP 500 vom Registry, Wiederholung in {wait:.0f}s (Versuch {attempt}/5)...", + "en": "HTTP 500 from registry, retrying in {wait:.0f}s (attempt {attempt}/5)...", + "pl": " HTTP 500 z rejestru, ponawianie za {wait:.0f}s (próba {attempt}/5)...", + "ru": " HTTP 500 от реестра, повтор через {wait:.0f}с (попытка {attempt}/5)...", + "zh": " 注册表返回 HTTP 500,{wait:.0f}秒后重试(第{attempt}/5次尝试)..." + }, + " MISSING: {cmd}": { + "bg": " ЛИПСВА: {cmd}", + "de": " FEHLT: {cmd}", + "en": " MISSING: {cmd}", + "pl": " BRAKUJE: {cmd}", + "ru": " ОТСУТСТВУЕТ: {cmd}", + "zh": " 缺失:{cmd}" + }, + " MISSING: {module}": { + "bg": " ЛИПСВА: {module}", + "de": " FEHLT: {module}", + "en": " MISSING: {module}", + "pl": " BRAK: {module}", + "ru": " ОТСУТСТВУЕТ: {module}", + "zh": " 缺失:{module}" + }, + " MISSING: {script}": { + "bg": " ЛИПСВА: {script}", + "de": " FEHLT: {script}", + "en": " MISSING: {script}", + "pl": " BRAK: {script}", + "ru": " ОТСУТСТВУЕТ: {script}", + "zh": " 缺失:{script}" + }, + " OK: {cmd}": { + "bg": " OK: {cmd}", + "de": " OK: {cmd}", + "en": " OK: {cmd}", + "pl": " OK: {cmd}", + "ru": " OK: {cmd}", + "zh": " 正常:{cmd}" + }, + " OK: {module}": { + "bg": " OK: {module}", + "de": " OK: {module}", + "en": " OK: {module}", + "pl": " OK: {module}", + "ru": " OK: {module}", + "zh": " 正常:{module}" + }, + " OK: {script}": { + "bg": " OK: {script}", + "de": " OK: {script}", + "en": " OK: {script}", + "pl": " OK: {script}", + "ru": " OK: {script}", + "zh": " 正常:{script}" + }, + " OK: {title}": { + "bg": "", + "de": "", + "en": " OK: {title}", + "pl": "", + "ru": "", + "zh": "" + }, + " Package: {pkg}": { + "bg": " Пакет: {pkg}", + "de": " Paket: {pkg}", + "en": " Package: {pkg}", + "pl": " Pakiet: {pkg}", + "ru": " Пакет: {pkg}", + "zh": " 包:{pkg}" + }, + " Pruned: {file} (not in mapping)": { + "bg": "", + "de": "", + "en": " Pruned: {file} (not in mapping)", + "pl": "", + "ru": "", + "zh": "" + }, + " Quality checks: {checks}": { + "bg": " Проверки на качеството: {checks}", + "de": " Qualitätsprüfungen: {checks}", + "en": " Quality checks: {checks}", + "pl": " Kontrole jakości: {checks}", + "ru": " Проверки качества: {checks}", + "zh": " 质量检查:{checks}" + }, + " Repo root: {root}": { + "bg": " Корен на репозитория: {root}", + "de": " Repo-Wurzel: {root}", + "en": " Repo root: {root}", + "pl": " Katalog główny repo: {root}", + "ru": " Корень репозитория: {root}", + "zh": " 仓库根目录:{root}" + }, + " Run 'make install-checkmake' to install the Makefile linter.": { + "bg": " Изпълнете 'make install-checkmake' за инсталиране на Makefile линтера.", + "de": " Führen Sie 'make install-checkmake' aus, um den Makefile-Linter zu installieren.", + "en": " Run 'make install-checkmake' to install the Makefile linter.", + "pl": " Uruchom 'make install-checkmake', aby zainstalować linter Makefile.", + "ru": " Выполните 'make install-checkmake' для установки линтера Makefile.", + "zh": " 运行 'make install-checkmake' 来安装 Makefile 检查器。" + }, + " Synced: {title} → {file}": { + "bg": "", + "de": "", + "en": " Synced: {title} → {file}", + "pl": "", + "ru": "", + "zh": "" + }, + " Test paths: {testpaths}": { + "bg": " Тестови пътища: {testpaths}", + "de": " Testpfade: {testpaths}", + "en": " Test paths: {testpaths}", + "pl": " Ścieżki testów: {testpaths}", + "ru": " Пути тестов: {testpaths}", + "zh": " 测试路径:{testpaths}" + }, + " WARN: Mapped file {file} is empty, skipping": { + "bg": "", + "de": "", + "en": " WARN: Mapped file {file} is empty, skipping", + "pl": "", + "ru": "", + "zh": "" + }, + " WARN: Mapped file {file} not found, skipping": { + "bg": "", + "de": "", + "en": " WARN: Mapped file {file} not found, skipping", + "pl": "", + "ru": "", + "zh": "" + }, + " WARNING: Could not extract coverage from pytest output (rc={rc})": { + "bg": " ПРЕДУПРЕЖДЕНИЕ: Не може да се извлече покритие от pytest изхода (rc={rc})", + "de": " WARNUNG: Coverage konnte nicht aus pytest-Ausgabe extrahiert werden (rc={rc})", + "en": " WARNING: Could not extract coverage from pytest output (rc={rc})", + "pl": " OSTRZEŻENIE: Nie można wyodrębnić pokrycia z wyjścia pytest (rc={rc})", + "ru": " ПРЕДУПРЕЖДЕНИЕ: Не удалось извлечь покрытие из вывода pytest (rc={rc})", + "zh": " 警告:无法从 pytest 输出中提取覆盖率 (rc={rc})" + }, + " WARNING: Could not extract doc coverage (rc={rc})": { + "bg": " ПРЕДУПРЕЖДЕНИЕ: Не може да се извлече покритие на документацията (rc={rc})", + "de": " WARNUNG: Dokumentationsabdeckung konnte nicht extrahiert werden (rc={rc})", + "en": " WARNING: Could not extract doc coverage (rc={rc})", + "pl": " OSTRZEŻENIE: Nie można wyodrębnić pokrycia dokumentacji (rc={rc})", + "ru": " ПРЕДУПРЕЖДЕНИЕ: Не удалось извлечь покрытие документации (rc={rc})", + "zh": " 警告:无法提取文档覆盖率 (rc={rc})" + }, + " WARNING: Could not extract test count from pytest output (rc={rc})": { + "bg": " ПРЕДУПРЕЖДЕНИЕ: Не може да се извлече брой тестове от pytest изхода (rc={rc})", + "de": " WARNUNG: Testanzahl konnte nicht aus pytest-Ausgabe extrahiert werden (rc={rc})", + "en": " WARNING: Could not extract test count from pytest output (rc={rc})", + "pl": " OSTRZEŻENIE: Nie można wyodrębnić liczby testów z wyjścia pytest (rc={rc})", + "ru": " ПРЕДУПРЕЖДЕНИЕ: Не удалось извлечь число тестов из вывода pytest (rc={rc})", + "zh": " 警告:无法从 pytest 输出中提取测试数量 (rc={rc})" + }, + " WARNING: No Python package found under src/ — version badge will show 'unknown'": { + "bg": " ПРЕДУПРЕЖДЕНИЕ: Не е намерен Python пакет под src/ — значкът за версия ще показва 'unknown'", + "de": " WARNUNG: Kein Python-Paket unter src/ gefunden — Versions-Badge zeigt 'unknown'", + "en": " WARNING: No Python package found under src/ — version badge will show 'unknown'", + "pl": " OSTRZEŻENIE: Nie znaleziono pakietu Python pod src/ — odznaka wersji pokaże 'unknown'", + "ru": " ПРЕДУПРЕЖДЕНИЕ: Python-пакет не найден в src/ — значок версии покажет 'unknown'", + "zh": " 警告:src/ 下未找到 Python 包——版本徽章将显示 'unknown'" + }, + " WARNING: No __version__ found in {init_file} — version badge will show 'unknown'": { + "bg": " ПРЕДУПРЕЖДЕНИЕ: Не е намерен __version__ в {init_file} — значкът за версия ще показва 'unknown'", + "de": " WARNUNG: Kein __version__ in {init_file} gefunden — Versions-Badge zeigt 'unknown'", + "en": " WARNING: No __version__ found in {init_file} — version badge will show 'unknown'", + "pl": " OSTRZEŻENIE: Nie znaleziono __version__ w {init_file} — odznaka wersji pokaże 'unknown'", + "ru": " ПРЕДУПРЕЖДЕНИЕ: __version__ не найден в {init_file} — значок версии покажет 'unknown'", + "zh": " 警告:{init_file} 中未找到 __version__——版本徽章将显示 'unknown'" + }, + " WARNING: No coverage target detected (no src/ package, no --cov in pyproject.toml)": { + "bg": " ПРЕДУПРЕЖДЕНИЕ: Не е открита цел за покритие (няма src/ пакет, няма --cov в pyproject.toml)", + "de": " WARNUNG: Kein Coverage-Ziel erkannt (kein src/-Paket, kein --cov in pyproject.toml)", + "en": " WARNING: No coverage target detected (no src/ package, no --cov in pyproject.toml)", + "pl": " OSTRZEŻENIE: Nie wykryto celu pokrycia (brak pakietu src/, brak --cov w pyproject.toml)", + "ru": " ПРЕДУПРЕЖДЕНИЕ: Цель покрытия не обнаружена (нет пакета src/, нет --cov в pyproject.toml)", + "zh": " 警告:未检测到覆盖率目标(无 src/ 包,pyproject.toml 中无 --cov)" + }, + " WARNING: {init_file} not found — version badge will show 'unknown'": { + "bg": " ПРЕДУПРЕЖДЕНИЕ: {init_file} не е намерен — значкът за версия ще показва 'unknown'", + "de": " WARNUNG: {init_file} nicht gefunden — Versions-Badge zeigt 'unknown'", + "en": " WARNING: {init_file} not found — version badge will show 'unknown'", + "pl": " OSTRZEŻENIE: Nie znaleziono {init_file} — odznaka wersji pokaże 'unknown'", + "ru": " ПРЕДУПРЕЖДЕНИЕ: {init_file} не найден — значок версии покажет 'unknown'", + "zh": " 警告:未找到 {init_file}——版本徽章将显示 'unknown'" + }, + " WARNING: {name} failed (rc={rc})": { + "bg": " ПРЕДУПРЕЖДЕНИЕ: {name} се провали (rc={rc})", + "de": " WARNUNG: {name} fehlgeschlagen (rc={rc})", + "en": " WARNING: {name} failed (rc={rc})", + "pl": " OSTRZEŻENIE: {name} nie powiodło się (rc={rc})", + "ru": " ПРЕДУПРЕЖДЕНИЕ: {name} завершился с ошибкой (rc={rc})", + "zh": " 警告:{name} 失败 (rc={rc})" + }, + " WARNING: {name} not installed — skipping (counted as pass)": { + "bg": " ПРЕДУПРЕЖДЕНИЕ: {name} не е инсталиран — пропуска се (отчита се като успешно)", + "de": " WARNUNG: {name} nicht installiert — übersprungen (als bestanden gezählt)", + "en": " WARNING: {name} not installed — skipping (counted as pass)", + "pl": " OSTRZEŻENIE: {name} nie jest zainstalowane — pomijanie (liczone jako zaliczone)", + "ru": " ПРЕДУПРЕЖДЕНИЕ: {name} не установлен — пропускается (засчитывается как успех)", + "zh": " 警告:{name} 未安装——跳过(计为通过)" + }, + " [dry-run] Would delete: {version}": { + "bg": " [dry-run] Ще бъде изтрито: {version}", + "de": " [dry-run] Würde löschen: {version}", + "en": " [dry-run] Would delete: {version}", + "pl": " [dry-run] Usunięto by: {version}", + "ru": " [dry-run] Было бы удалено: {version}", + "zh": " [dry-run] 将删除:{version}" + }, + " {name}: {label}={message} ({color})": { + "bg": " {name}: {label}={message} ({color})", + "de": " {name}: {label}={message} ({color})", + "en": " {name}: {label}={message} ({color})", + "pl": " {name}: {label}={message} ({color})", + "ru": " {name}: {label}={message} ({color})", + "zh": " {name}: {label}={message} ({color})" + }, + " {n} long lines found (warnings only)": { + "bg": "", + "de": "", + "en": " {n} long lines found (warnings only)", + "pl": "", + "ru": "", + "zh": "" + }, + " {n} orphan docs found (warnings only)": { + "bg": "", + "de": "", + "en": " {n} orphan docs found (warnings only)", + "pl": "", + "ru": "", + "zh": "" + }, + " {n} stale docs found (warnings only)": { + "bg": " Намерени {n} остарели документа (само предупреждения)", + "de": " {n} veraltete Dokumente gefunden (nur Warnungen)", + "en": " {n} stale docs found (warnings only)", + "pl": " Znaleziono {n} nieaktualnych dokumentów (tylko ostrzeżenia)", + "ru": " Найдено {n} устаревших документов (только предупреждения)", + "zh": " 发现 {n} 个过时文档(仅警告)" + }, + " {tool}: found at {path}": { + "bg": " {tool}: намерен на {path}", + "de": " {tool}: gefunden unter {path}", + "en": " {tool}: found at {path}", + "pl": " {tool}: znaleziono w {path}", + "ru": " {tool}: найден в {path}", + "zh": " {tool}: 在 {path} 找到" + }, + " {version} (created: {created})": { + "bg": " {version} (създадено: {created})", + "de": " {version} (erstellt: {created})", + "en": " {version} (created: {created})", + "pl": " {version} (utworzono: {created})", + "ru": " {version} (создано: {created})", + "zh": " {version}(创建于:{created})" + }, + "--push requires --registry": { + "bg": "--push изисква --registry", + "de": "--push erfordert --registry", + "en": "--push requires --registry", + "pl": "--push wymaga --registry", + "ru": "--push требует --registry", + "zh": "--push 需要 --registry" + }, + "--skip-build: skipping package build and PyPI publish.": { + "bg": "--skip-build: пропуска се изграждане на пакета и публикуване в PyPI.", + "de": "--skip-build: Paket-Build und PyPI-Veröffentlichung werden übersprungen.", + "en": "--skip-build: skipping package build and PyPI publish.", + "pl": "--skip-build: pomijanie budowania pakietu i publikacji PyPI.", + "ru": "--skip-build: сборка пакета и публикация в PyPI пропускаются.", + "zh": "--skip-build:跳过包构建和 PyPI 发布。" + }, + "=== Release Alignment Verification ===\n": { + "bg": "=== Проверка на съответствието на версиите ===\n", + "de": "=== Release-Abgleich-Verifizierung ===\n", + "en": "=== Release Alignment Verification ===\n", + "pl": "=== Weryfikacja zgodności wydań ===\n", + "ru": "=== Проверка соответствия релизов ===\n", + "zh": "=== 发布一致性验证 ===\n" + }, + "API poll warning: {exc}": { + "bg": "Предупреждение при API запитване: {exc}", + "de": "Warnung bei API-Abfrage: {exc}", + "en": "API poll warning: {exc}", + "pl": "Ostrzeżenie sondowania API: {exc}", + "ru": "Предупреждение при опросе API: {exc}", + "zh": "API 轮询警告:{exc}" + }, + "Acceptance Criteria has {count} unchecked item(s). All AC items must be checked (- [x]) before merge.": { + "bg": "Acceptance Criteria има {count} неотметнати елемента. Всички AC елементи трябва да са отметнати (- [x]) преди merge.", + "de": "Acceptance Criteria enthält {count} nicht abgehakte Elemente. Alle AC-Elemente müssen vor dem Merge abgehakt sein (- [x]).", + "en": "Acceptance Criteria has {count} unchecked item(s). All AC items must be checked (- [x]) before merge.", + "pl": "Acceptance Criteria ma {count} niezaznaczonych elementów. Wszystkie elementy AC muszą być zaznaczone (- [x]) przed merge.", + "ru": "Acceptance Criteria содержит {count} неотмеченных элементов. Все элементы AC должны быть отмечены (- [x]) перед merge.", + "zh": "验收标准有 {count} 个未勾选项目。所有 AC 项目必须在合并前勾选(- [x])。" + }, + "Acceptance Criteria section has no checklist items. Add at least one '- [ ] item'.": { + "bg": "Секцията Acceptance Criteria няма елементи от checklist. Добавете поне един '- [ ] item'.", + "de": "Der Abschnitt Acceptance Criteria enthält keine Checklisten-Elemente. Mindestens ein '- [ ] item' hinzufügen.", + "en": "Acceptance Criteria section has no checklist items. Add at least one '- [ ] item'.", + "pl": "Sekcja Acceptance Criteria nie zawiera elementów checklisty. Dodaj co najmniej jeden '- [ ] item'.", + "ru": "Раздел Acceptance Criteria не содержит элементов чек-листа. Добавьте хотя бы один '- [ ] item'.", + "zh": "验收标准部分没有清单项目。至少添加一个 '- [ ] item'。" + }, + "Action to perform": { + "bg": "Действие за изпълнение", + "de": "Auszuführende Aktion", + "en": "Action to perform", + "pl": "Akcja do wykonania", + "ru": "Выполняемое действие", + "zh": "要执行的操作" + }, + "Add @patch(\"subprocess.run\") or patch the calling function to fix this.": { + "bg": "Добавете @patch(\"subprocess.run\") или patch-нете извикващата функция, за да коригирате това.", + "de": "Fügen Sie @patch(\"subprocess.run\") hinzu oder patchen Sie die aufrufende Funktion.", + "en": "Add @patch(\"subprocess.run\") or patch the calling function to fix this.", + "pl": "Dodaj @patch(\"subprocess.run\") lub załataj funkcję wywołującą, aby to naprawić.", + "ru": "Добавьте @patch(\"subprocess.run\") или исправьте вызывающую функцию.", + "zh": "添加 @patch(\"subprocess.run\") 或修补调用函数以修复此问题。" + }, + "Added label '{label}' to PR #{pr}.": { + "bg": "Добавен етикет '{label}' към PR #{pr}.", + "de": "Label '{label}' zu PR #{pr} hinzugefügt.", + "en": "Added label '{label}' to PR #{pr}.", + "pl": "Dodano etykietę '{label}' do PR #{pr}.", + "ru": "Добавлена метка '{label}' к PR #{pr}.", + "zh": "已向 PR #{pr} 添加标签 '{label}'。" + }, + "Additional directory to scan (default: scripts, tests). Can be repeated.": { + "bg": "Допълнителна директория за сканиране (по подразбиране: scripts, tests). Може да се повтаря.", + "de": "Zusätzliches zu scannendes Verzeichnis (Standard: scripts, tests). Wiederholbar.", + "en": "Additional directory to scan (default: scripts, tests). Can be repeated.", + "pl": "Dodatkowy katalog do skanowania (domyślnie: scripts, tests). Można powtarzać.", + "ru": "Дополнительная директория для сканирования (по умолчанию: scripts, tests). Можно повторять.", + "zh": "要扫描的附加目录(默认:scripts、tests)。可重复使用。" + }, + "Additional excluded patterns (in addition to defaults)": { + "bg": "Допълнителни изключени шаблони (в допълнение към подразбираните)", + "de": "Zusätzliche ausgeschlossene Muster (zusätzlich zu den Standardwerten)", + "en": "Additional excluded patterns (in addition to defaults)", + "pl": "Dodatkowe wykluczone wzorce (oprócz domyślnych)", + "ru": "Дополнительные исключённые шаблоны (в дополнение к стандартным)", + "zh": "附加排除模式(除默认模式外)" + }, + "Allow empty tag (PR mode where SHA is concrete).": { + "bg": "Позволи празен таг (PR режим, където SHA е конкретен).", + "de": "Leeren Tag zulassen (PR-Modus, in dem SHA konkret ist).", + "en": "Allow empty tag (PR mode where SHA is concrete).", + "pl": "Zezwalaj na pusty tag (tryb PR, w którym SHA jest konkretne).", + "ru": "Разрешить пустой тег (режим PR, где SHA конкретен).", + "zh": "允许空标签(SHA 为具体值的 PR 模式)。" + }, + "Allow missing spec (warn only, don't fail)": { + "bg": "Позволи липсващ spec (само предупреждение, без грешка)", + "de": "Fehlende Spec erlauben (nur warnen, nicht fehlschlagen)", + "en": "Allow missing spec (warn only, don't fail)", + "pl": "Zezwól na brakujący spec (tylko ostrzeżenie, bez błędu)", + "ru": "Разрешить отсутствующий spec (только предупреждение, без ошибки)", + "zh": "允许缺少规范(仅警告,不失败)" + }, + "Another runner failed. Stopping this runner early.": { + "bg": "Друг runner се провали. Спиране на този runner по-рано.", + "de": "Ein anderer Runner ist fehlgeschlagen. Dieser Runner wird vorzeitig gestoppt.", + "en": "Another runner failed. Stopping this runner early.", + "pl": "Inny runner zakończył się niepowodzeniem. Wczesne zatrzymanie tego runnera.", + "ru": "Другой runner завершился с ошибкой. Останавливаю этот runner досрочно.", + "zh": "另一个 runner 失败。提前停止此 runner。" + }, + "Assigned {count} files to runner {runner_index}": { + "bg": "Разпределени {count} файла към runner {runner_index}", + "de": "{count} Dateien an Runner {runner_index} zugewiesen", + "en": "Assigned {count} files to runner {runner_index}", + "pl": "Przypisano {count} plików do runnera {runner_index}", + "ru": "Назначено {count} файлов раннеру {runner_index}", + "zh": "已将 {count} 个文件分配给 runner {runner_index}" + }, + "Assigned {count} items to runner {runner_index}: {encoded}": { + "bg": "Разпределени {count} елемента към runner {runner_index}: {encoded}", + "de": "{count} Elemente an Runner {runner_index} zugewiesen: {encoded}", + "en": "Assigned {count} items to runner {runner_index}: {encoded}", + "pl": "Przypisano {count} elementów do runnera {runner_index}: {encoded}", + "ru": "Назначено {count} элементов раннеру {runner_index}: {encoded}", + "zh": "已将 {count} 个项目分配给 runner {runner_index}:{encoded}" + }, + "Auto-rebase failed with HTTP {status}: {message}\nRebase manually:\n git fetch origin master && git rebase origin/master && git push --force-with-lease\nThen re-add the ready-to-merge label.": { + "bg": "Автоматичният rebase се провали с HTTP {status}: {message}\nНаправете rebase ръчно:\n git fetch origin master && git rebase origin/master && git push --force-with-lease\nСлед това добавете отново етикета ready-to-merge.", + "de": "Auto-Rebase mit HTTP {status} fehlgeschlagen: {message}\nManuell rebasen:\n git fetch origin master && git rebase origin/master && git push --force-with-lease\nDann das ready-to-merge-Label erneut hinzufügen.", + "en": "Auto-rebase failed with HTTP {status}: {message}\nRebase manually:\n git fetch origin master && git rebase origin/master && git push --force-with-lease\nThen re-add the ready-to-merge label.", + "pl": "Automatyczny rebase nie powiódł się z HTTP {status}: {message}\nWykonaj rebase ręcznie:\n git fetch origin master && git rebase origin/master && git push --force-with-lease\nNastępnie ponownie dodaj etykietę ready-to-merge.", + "ru": "Автоматический rebase завершился с HTTP {status}: {message}\nВыполните rebase вручную:\n git fetch origin master && git rebase origin/master && git push --force-with-lease\nЗатем снова добавьте метку ready-to-merge.", + "zh": "自动 rebase 失败,HTTP {status}:{message}\n请手动 rebase:\n git fetch origin master && git rebase origin/master && git push --force-with-lease\n然后重新添加 ready-to-merge 标签。" + }, + "Automated CI commit (badge) — skipping post-merge jobs.": { + "bg": "Автоматизиран CI комит (значка) — пропускат се post-merge задачите.", + "de": "Automatisierter CI-Commit (Badge) — Post-Merge-Jobs werden übersprungen.", + "en": "Automated CI commit (badge) — skipping post-merge jobs.", + "pl": "Zautomatyzowany commit CI (odznaka) — pomijanie zadań post-merge.", + "ru": "Автоматический CI-коммит (значок) — post-merge задачи пропускаются.", + "zh": "自动 CI 提交(徽章)——跳过后续合并任务。" + }, + "Badge push attempt {attempt}/{retries} failed — retrying: {error}": { + "bg": "Опит {attempt}/{retries} за push на значки се провали — повторен опит: {error}", + "de": "Badge-Push-Versuch {attempt}/{retries} fehlgeschlagen — erneuter Versuch: {error}", + "en": "Badge push attempt {attempt}/{retries} failed — retrying: {error}", + "pl": "Próba {attempt}/{retries} push odznak nie powiodła się — ponawianie: {error}", + "ru": "Попытка {attempt}/{retries} push значков не удалась — повтор: {error}", + "zh": "徽章推送尝试 {attempt}/{retries} 失败——正在重试:{error}" + }, + "Badge push failed after {retries} attempts: {error}": { + "bg": "Push на значки се провали след {retries} опита: {error}", + "de": "Badge-Push nach {retries} Versuchen fehlgeschlagen: {error}", + "en": "Badge push failed after {retries} attempts: {error}", + "pl": "Push odznak nie powiódł się po {retries} próbach: {error}", + "ru": "Push значков не удался после {retries} попыток: {error}", + "zh": "徽章推送在 {retries} 次尝试后失败:{error}" + }, + "Badges commit SHA: {sha}": { + "bg": "SHA на комита със значки: {sha}", + "de": "SHA des Badge-Commits: {sha}", + "en": "Badges commit SHA: {sha}", + "pl": "SHA commita z odznakami: {sha}", + "ru": "SHA коммита значков: {sha}", + "zh": "徽章提交 SHA:{sha}" + }, + "Badges pushed to badges branch": { + "bg": "Значките са push-нати към клона badges", + "de": "Badges zum badges-Branch gepusht", + "en": "Badges pushed to badges branch", + "pl": "Odznaki wypchnięte do gałęzi badges", + "ru": "Значки отправлены в ветку badges", + "zh": "徽章已推送到 badges 分支" + }, + "Base ref for diff": { + "bg": "Базов ref за diff", + "de": "Basis-Ref für Diff", + "en": "Base ref for diff", + "pl": "Bazowy ref dla diff", + "ru": "Базовый ref для diff", + "zh": "用于 diff 的基准 ref" + }, + "Branch '{branch}' does not contain a task ID.\n Expected format: {prefix}-N-short-description": { + "bg": "Клон '{branch}' не съдържа ID на задача.\n Очакван формат: {prefix}-N-кратко-описание", + "de": "Branch '{branch}' enthält keine Task-ID.\n Erwartetes Format: {prefix}-N-kurz-beschreibung", + "en": "Branch '{branch}' does not contain a task ID.\n Expected format: {prefix}-N-short-description", + "pl": "Gałąź '{branch}' nie zawiera ID zadania.\n Oczekiwany format: {prefix}-N-krótki-opis", + "ru": "Ветка '{branch}' не содержит ID задачи.\n Ожидаемый формат: {prefix}-N-краткое-описание", + "zh": "分支 '{branch}' 不包含任务 ID。\n 预期格式: {prefix}-N-简短描述" + }, + "Branch '{branch}' does not contain a task ID.\n Expected format: {prefix}-N-short-description\n Example: {prefix}-42-add-feature\n Fix: rename the branch or create a Vikunja task first:\n python -m devx.tools.create_task --title \"Task title\"": { + "bg": "Клон '{branch}' не съдържа ID на задача.\n Очакван формат: {prefix}-N-кратко-описание\n Пример: {prefix}-42-add-feature\n Решение: преименувайте клона или създайте Vikunja задача:\n python -m devx.tools.create_task --title \"Заглавие на задача\"", + "de": "Branch '{branch}' enthält keine Task-ID.\n Erwartetes Format: {prefix}-N-kurz-beschreibung\n Beispiel: {prefix}-42-add-feature\n Fix: Branch umbenennen oder Vikunja-Task erstellen:\n python -m devx.tools.create_task --title \"Task-Titel\"", + "en": "Branch '{branch}' does not contain a task ID.\n Expected format: {prefix}-N-short-description\n Example: {prefix}-42-add-feature\n Fix: rename the branch or create a Vikunja task first:\n python -m devx.tools.create_task --title \"Task title\"", + "pl": "Gałąź '{branch}' nie zawiera ID zadania.\n Oczekiwany format: {prefix}-N-krótki-opis\n Przykład: {prefix}-42-add-feature\n Naprawa: zmień nazwę gałęzi lub utwórz zadanie Vikunja:\n python -m devx.tools.create_task --title \"Tytuł zadania\"", + "ru": "Ветка '{branch}' не содержит ID задачи.\n Ожидаемый формат: {prefix}-N-краткое-описание\n Пример: {prefix}-42-add-feature\n Исправление: переименуйте ветку или создайте задачу Vikunja:\n python -m devx.tools.create_task --title \"Заголовок задачи\"", + "zh": "分支 '{branch}' 不包含任务 ID。\n 预期格式: {prefix}-N-简短描述\n 示例: {prefix}-42-add-feature\n 修复: 重命名分支或先创建 Vikunja 任务:\n python -m devx.tools.create_task --title \"任务标题\"" + }, + "Branch is already up-to-date with origin/master.": { + "bg": "Клонът вече е актуален спрямо origin/master.", + "de": "Branch ist bereits aktuell mit origin/master.", + "en": "Branch is already up-to-date with origin/master.", + "pl": "Gałąź jest już aktualna względem origin/master.", + "ru": "Ветка уже актуальна относительно origin/master.", + "zh": "分支已与 origin/master 同步。" + }, + "Branch is behind master. Auto-rebasing via Gitea API...\nA new CI run will start automatically after the rebase.\nThe next auto-merge attempt will merge this PR.": { + "bg": "Клонът изостава от master. Автоматичен rebase чрез Gitea API...\nНов CI run ще стартира автоматично след rebase.\nСледващият опит за auto-merge ще слее този PR.", + "de": "Branch liegt hinter master. Auto-Rebase via Gitea API...\nEin neuer CI-Lauf startet nach dem Rebase automatisch.\nDer nächste Auto-Merge-Versuch mergt diesen PR.", + "en": "Branch is behind master. Auto-rebasing via Gitea API...\nA new CI run will start automatically after the rebase.\nThe next auto-merge attempt will merge this PR.", + "pl": "Gałąź jest za master. Automatyczny rebase przez Gitea API...\nNowy przebieg CI rozpocznie się automatycznie po rebase.\nNastępna próba auto-merge połączy ten PR.", + "ru": "Ветка отстаёт от master. Автоматический rebase через Gitea API...\nНовый CI-запуск начнётся автоматически после rebase.\nСледующая попытка auto-merge сольёт этот PR.", + "zh": "分支落后于 master。正在通过 Gitea API 自动 rebase...\nrebase 后将自动开始新的 CI 运行。\n下一次自动合并尝试将合并此 PR。" + }, + "Branch is behind origin/master. Rebase first: git fetch origin master && git rebase origin/master": { + "bg": "Клонът изостава от origin/master. Първо rebase: git fetch origin master && git rebase origin/master", + "de": "Branch liegt hinter origin/master. Zuerst rebasen: git fetch origin master && git rebase origin/master", + "en": "Branch is behind origin/master. Rebase first: git fetch origin master && git rebase origin/master", + "pl": "Gałąź jest za origin/master. Najpierw wykonaj rebase: git fetch origin master && git rebase origin/master", + "ru": "Ветка отстаёт от origin/master. Сначала rebase: git fetch origin master && git rebase origin/master", + "zh": "分支落后于 origin/master。请先 rebase:git fetch origin master && git rebase origin/master" + }, + "Branch is {count} commit(s) behind master. Rebasing...": { + "bg": "Клонът изостава с {count} комит(а) от master. Rebase...", + "de": "Branch ist {count} Commit(s) hinter master. Rebase läuft...", + "en": "Branch is {count} commit(s) behind master. Rebasing...", + "pl": "Gałąź jest o {count} commit(ów) za master. Rebase...", + "ru": "Ветка отстаёт на {count} коммит(ов) от master. Rebase...", + "zh": "分支落后 master {count} 个提交。正在 rebase..." + }, + "Branch name (auto-fetched from PR if not given)": { + "bg": "Име на клон (извлича се автоматично от PR, ако не е зададено)", + "de": "Branch-Name (wird aus PR abgerufen, falls nicht angegeben)", + "en": "Branch name (auto-fetched from PR if not given)", + "pl": "Nazwa gałęzi (pobierana automatycznie z PR, jeśli nie podano)", + "ru": "Имя ветки (извлекается из PR, если не указано)", + "zh": "分支名称(未提供时从 PR 自动获取)" + }, + "Branch name (e.g., DEVX-256-fix-foo)": { + "bg": "Име на клон (напр. DEVX-256-fix-foo)", + "de": "Branch-Name (z. B. DEVX-256-fix-foo)", + "en": "Branch name (e.g., DEVX-256-fix-foo)", + "pl": "Nazwa gałęzi (np. DEVX-256-fix-foo)", + "ru": "Имя ветки (напр. DEVX-256-fix-foo)", + "zh": "分支名称(例如 DEVX-256-fix-foo)" + }, + "Branch name (e.g., OBL-INFRA-531-fix-foo)": { + "bg": "Име на клон (напр. OBL-INFRA-531-fix-foo)", + "de": "Branch-Name (z. B. OBL-INFRA-531-fix-foo)", + "en": "Branch name (e.g., OBL-INFRA-531-fix-foo)", + "pl": "Nazwa gałęzi (np. OBL-INFRA-531-fix-foo)", + "ru": "Имя ветки (напр. OBL-INFRA-531-fix-foo)", + "zh": "分支名称(例如 OBL-INFRA-531-fix-foo)" + }, + "Branch name must contain a task ID.": { + "bg": "Името на клона трябва да съдържа task ID.", + "de": "Der Branch-Name muss eine Task-ID enthalten.", + "en": "Branch name must contain a task ID.", + "pl": "Nazwa gałęzi musi zawierać ID zadania.", + "ru": "Имя ветки должно содержать ID задачи.", + "zh": "分支名称必须包含任务 ID。" + }, + "Build failed for {name}": { + "bg": "Изграждането на {name} се провали", + "de": "Build für {name} fehlgeschlagen", + "en": "Build failed for {name}", + "pl": "Budowanie {name} nie powiodło się", + "ru": "Сборка {name} не удалась", + "zh": "{name} 构建失败" + }, + "Bumping version: {current} -> v{new_version}": { + "bg": "Увеличаване на версията: {current} -> v{new_version}", + "de": "Version wird erhöht: {current} -> v{new_version}", + "en": "Bumping version: {current} -> v{new_version}", + "pl": "Zmiana wersji: {current} -> v{new_version}", + "ru": "Повышение версии: {current} -> v{new_version}", + "zh": "升级版本:{current} -> v{new_version}" + }, + "CI checks did not complete within timeout.": { + "bg": "CI проверките не завършиха в рамките на таймаута.", + "de": "CI-Checks wurden nicht innerhalb des Timeouts abgeschlossen.", + "en": "CI checks did not complete within timeout.", + "pl": "Kontrole CI nie zakończyły się w ramach limitu czasu.", + "ru": "CI-проверки не завершились в течение таймаута.", + "zh": "CI 检查未在超时时间内完成。" + }, + "CI checks failed.": { + "bg": "CI проверките се провалиха.", + "de": "CI-Checks fehlgeschlagen.", + "en": "CI checks failed.", + "pl": "Kontrole CI nie powiodły się.", + "ru": "CI-проверки завершились с ошибкой.", + "zh": "CI 检查失败。" + }, + "CI run ID (for set-failed/set-passed)": { + "bg": "ID на CI run (за set-failed/set-passed)", + "de": "CI-Run-ID (für set-failed/set-passed)", + "en": "CI run ID (for set-failed/set-passed)", + "pl": "ID przebiegu CI (dla set-failed/set-passed)", + "ru": "ID CI-запуска (для set-failed/set-passed)", + "zh": "CI 运行 ID(用于 set-failed/set-passed)" + }, + "CI run ID that triggered the publish": { + "bg": "ID на CI run, който задейства публикуването", + "de": "CI-Run-ID, die die Veröffentlichung ausgelöst hat", + "en": "CI run ID that triggered the publish", + "pl": "ID przebiegu CI, który wyzwolił publikację", + "ru": "ID CI-запуска, инициировавшего публикацию", + "zh": "触发发布的 CI 运行 ID" + }, + "CI_GITEA_API_TOKEN not set: {error}": { + "bg": "CI_GITEA_API_TOKEN не е зададен: {error}", + "de": "CI_GITEA_API_TOKEN nicht gesetzt: {error}", + "en": "CI_GITEA_API_TOKEN not set: {error}", + "pl": "CI_GITEA_API_TOKEN nie jest ustawiony: {error}", + "ru": "CI_GITEA_API_TOKEN не задан: {error}", + "zh": "未设置 CI_GITEA_API_TOKEN:{error}" + }, + "CI_GITEA_TOKEN environment variable required": { + "bg": "Изисква се променлива на средата CI_GITEA_TOKEN", + "de": "Umgebungsvariable CI_GITEA_TOKEN erforderlich", + "en": "CI_GITEA_TOKEN environment variable required", + "pl": "Wymagana zmienna środowiskowa CI_GITEA_TOKEN", + "ru": "Требуется переменная окружения CI_GITEA_TOKEN", + "zh": "需要环境变量 CI_GITEA_TOKEN" + }, + "CI_GITEA_TOKEN is not set.": { + "bg": "CI_GITEA_TOKEN не е зададен.", + "de": "CI_GITEA_TOKEN ist nicht gesetzt.", + "en": "CI_GITEA_TOKEN is not set.", + "pl": "CI_GITEA_TOKEN nie jest ustawiony.", + "ru": "CI_GITEA_TOKEN не задан.", + "zh": "未设置 CI_GITEA_TOKEN。" + }, + "CI_GITEA_TOKEN is not set. Add it to .env or export it.": { + "bg": "CI_GITEA_TOKEN не е зададен. Добавете го в .env или го експортирайте.", + "de": "CI_GITEA_TOKEN ist nicht gesetzt. Zu .env hinzufügen oder exportieren.", + "en": "CI_GITEA_TOKEN is not set. Add it to .env or export it.", + "pl": "CI_GITEA_TOKEN nie jest ustawiony. Dodaj go do .env lub wyeksportuj.", + "ru": "CI_GITEA_TOKEN не задан. Добавьте его в .env или экспортируйте.", + "zh": "未设置 CI_GITEA_TOKEN。请添加到 .env 或导出。" + }, + "CI_GITEA_TOKEN is not set. Required to create a PR.": { + "bg": "CI_GITEA_TOKEN не е зададен. Необходим за създаване на PR.", + "de": "CI_GITEA_TOKEN nicht gesetzt. Erforderlich zum Erstellen eines PR.", + "en": "CI_GITEA_TOKEN is not set. Required to create a PR.", + "pl": "CI_GITEA_TOKEN nie jest ustawiony. Wymagany do utworzenia PR.", + "ru": "CI_GITEA_TOKEN не установлен. Требуется для создания PR.", + "zh": "CI_GITEA_TOKEN 未设置。创建 PR 所需。" + }, + "CI_GITEA_TOKEN not set — skipping login configuration.": { + "bg": "CI_GITEA_TOKEN не е зададен — пропуска се конфигурацията за вход.", + "de": "CI_GITEA_TOKEN nicht gesetzt — Login-Konfiguration wird übersprungen.", + "en": "CI_GITEA_TOKEN not set — skipping login configuration.", + "pl": "CI_GITEA_TOKEN nie jest ustawiony — pomijanie konfiguracji logowania.", + "ru": "CI_GITEA_TOKEN не задан — настройка входа пропускается.", + "zh": "未设置 CI_GITEA_TOKEN——跳过登录配置。" + }, + "Cannot read __version__ from src/{pkg}/__init__.py — skipping.": { + "bg": "", + "de": "", + "en": "Cannot read __version__ from src/{pkg}/__init__.py — skipping.", + "pl": "", + "ru": "", + "zh": "" + }, + "Cannot rebase: not on a branch (detached HEAD).": { + "bg": "Не може rebase: не сте на клон (detached HEAD).", + "de": "Rebase nicht möglich: nicht auf einem Branch (detached HEAD).", + "en": "Cannot rebase: not on a branch (detached HEAD).", + "pl": "Nie można wykonać rebase: nie na gałęzi (detached HEAD).", + "ru": "Невозможно выполнить rebase: не на ветке (detached HEAD).", + "zh": "无法 rebase:不在分支上(detached HEAD)。" + }, + "Checking CLI command documentation...": { + "bg": "Проверка на документацията за CLI команди...", + "de": "Prüfe CLI-Befehlsdokumentation...", + "en": "Checking CLI command documentation...", + "pl": "Sprawdzanie dokumentacji poleceń CLI...", + "ru": "Проверка документации CLI-команд...", + "zh": "正在检查 CLI 命令文档..." + }, + "Checking code block languages...": { + "bg": "", + "de": "", + "en": "Checking code block languages...", + "pl": "", + "ru": "", + "zh": "" + }, + "Checking docs structure...": { + "bg": "Проверка на структурата на документацията...", + "de": "Prüfe Dokumentationsstruktur...", + "en": "Checking docs structure...", + "pl": "Sprawdzanie struktury dokumentacji...", + "ru": "Проверка структуры документации...", + "zh": "正在检查文档结构..." + }, + "Checking duplicate headings...": { + "bg": "Проверка за дублирани заглавия...", + "de": "Prüfe auf doppelte Überschriften...", + "en": "Checking duplicate headings...", + "pl": "Sprawdzanie zduplikowanych nagłówków...", + "ru": "Проверка дублирующихся заголовков...", + "zh": "正在检查重复标题..." + }, + "Checking for TODO/FIXME markers...": { + "bg": "Проверка за TODO/FIXME маркери...", + "de": "Prüfe auf TODO/FIXME-Marker...", + "en": "Checking for TODO/FIXME markers...", + "pl": "Sprawdzanie znaczników TODO/FIXME...", + "ru": "Проверка меток TODO/FIXME...", + "zh": "正在检查 TODO/FIXME 标记..." + }, + "Checking for orphan docs...": { + "bg": "", + "de": "", + "en": "Checking for orphan docs...", + "pl": "", + "ru": "", + "zh": "" + }, + "Checking for stale docs...": { + "bg": "Проверка за остарели документи...", + "de": "Prüfe auf veraltete Dokumente...", + "en": "Checking for stale docs...", + "pl": "Sprawdzanie nieaktualnych dokumentów...", + "ru": "Проверка устаревших документов...", + "zh": "正在检查过时文档..." + }, + "Checking heading hierarchy...": { + "bg": "Проверка на йерархията на заглавията...", + "de": "Prüfe Überschriftenhierarchie...", + "en": "Checking heading hierarchy...", + "pl": "Sprawdzanie hierarchii nagłówków...", + "ru": "Проверка иерархии заголовков...", + "zh": "正在检查标题层级..." + }, + "Checking internal links...": { + "bg": "Проверка на вътрешни връзки...", + "de": "Prüfe interne Links...", + "en": "Checking internal links...", + "pl": "Sprawdzanie linków wewnętrznych...", + "ru": "Проверка внутренних ссылок...", + "zh": "正在检查内部链接..." + }, + "Checking line length...": { + "bg": "", + "de": "", + "en": "Checking line length...", + "pl": "", + "ru": "", + "zh": "" + }, + "Checking max heading depth...": { + "bg": "", + "de": "", + "en": "Checking max heading depth...", + "pl": "", + "ru": "", + "zh": "" + }, + "Checking required files...": { + "bg": "Проверка на задължителните файлове...", + "de": "Prüfe erforderliche Dateien...", + "en": "Checking required files...", + "pl": "Sprawdzanie wymaganych plików...", + "ru": "Проверка обязательных файлов...", + "zh": "正在检查必需文件..." + }, + "Checking single H1 per file...": { + "bg": "", + "de": "", + "en": "Checking single H1 per file...", + "pl": "", + "ru": "", + "zh": "" + }, + "Checking status for PR #{pr_number}...": { + "bg": "Проверка на статуса на PR #{pr_number}...", + "de": "Prüfe Status für PR #{pr_number}...", + "en": "Checking status for PR #{pr_number}...", + "pl": "Sprawdzanie statusu PR #{pr_number}...", + "ru": "Проверка статуса PR #{pr_number}...", + "zh": "正在检查 PR #{pr_number} 的状态..." + }, + "Checking trailing whitespace...": { + "bg": "Проверка за крайни интервали...", + "de": "Prüfe auf abschließende Leerzeichen...", + "en": "Checking trailing whitespace...", + "pl": "Sprawdzanie końcowych białych znaków...", + "ru": "Проверка конечных пробелов...", + "zh": "正在检查行尾空白..." + }, + "Checking version references for {pkg} (current: v{version})": { + "bg": "", + "de": "", + "en": "Checking version references for {pkg} (current: v{version})", + "pl": "", + "ru": "", + "zh": "" + }, + "CliRunner.invoke({target}) in test '{test}' reaches unpatched dangerous functions: {funcs}. Add @patch for each or patch the calling function.": { + "bg": "CliRunner.invoke({target}) в тест '{test}' достига непачнати опасни функции: {funcs}. Добавете @patch за всяка или patch-нете извикващата функция.", + "de": "CliRunner.invoke({target}) in Test '{test}' erreicht ungepatchte gefährliche Funktionen: {funcs}. @patch für jede hinzufügen oder die aufrufende Funktion patchen.", + "en": "CliRunner.invoke({target}) in test '{test}' reaches unpatched dangerous functions: {funcs}. Add @patch for each or patch the calling function.", + "pl": "CliRunner.invoke({target}) w teście '{test}' sięga niezałatanych niebezpiecznych funkcji: {funcs}. Dodaj @patch dla każdej lub załataj funkcję wywołującą.", + "ru": "CliRunner.invoke({target}) в тесте '{test}' достигает незапатченных опасных функций: {funcs}. Добавьте @patch для каждой или запатчите вызывающую функцию.", + "zh": "测试 '{test}' 中的 CliRunner.invoke({target}) 触达未修补的危险函数:{funcs}。请为每个函数添加 @patch 或修补调用函数。" + }, + "Cloned existing wiki.": { + "bg": "", + "de": "", + "en": "Cloned existing wiki.", + "pl": "", + "ru": "", + "zh": "" + }, + "Cloning wiki repo...": { + "bg": "", + "de": "", + "en": "Cloning wiki repo...", + "pl": "", + "ru": "", + "zh": "" + }, + "Command failed ({cmd}): {stderr}": { + "bg": "Командата се провали ({cmd}): {stderr}", + "de": "Befehl fehlgeschlagen ({cmd}): {stderr}", + "en": "Command failed ({cmd}): {stderr}", + "pl": "Polecenie nie powiodło się ({cmd}): {stderr}", + "ru": "Команда завершилась с ошибкой ({cmd}): {stderr}", + "zh": "命令失败({cmd}):{stderr}" + }, + "Commit message: {msg}": { + "bg": "Съобщение на комит: {msg}", + "de": "Commit-Nachricht: {msg}", + "en": "Commit message: {msg}", + "pl": "Treść commita: {msg}", + "ru": "Сообщение коммита: {msg}", + "zh": "提交信息:{msg}" + }, + "Commit: {sha}": { + "bg": "Комит: {sha}", + "de": "Commit: {sha}", + "en": "Commit: {sha}", + "pl": "Commit: {sha}", + "ru": "Коммит: {sha}", + "zh": "提交:{sha}" + }, + "Committing and pushing...": { + "bg": "", + "de": "", + "en": "Committing and pushing...", + "pl": "", + "ru": "", + "zh": "" + }, + "Comparing {base}..{head} ({count} files changed)": { + "bg": "Сравняване на {base}..{head} ({count} променени файла)", + "de": "Vergleiche {base}..{head} ({count} geänderte Dateien)", + "en": "Comparing {base}..{head} ({count} files changed)", + "pl": "Porównywanie {base}..{head} ({count} zmienionych plików)", + "ru": "Сравнение {base}..{head} ({count} изменённых файлов)", + "zh": "正在比较 {base}..{head}({count} 个文件已更改)" + }, + "Configuration OK: [tool.devx] present, devx versions consistent.": { + "bg": "Конфигурацията е OK: [tool.devx] присъства, версиите на devx са консистентни.", + "de": "Konfiguration OK: [tool.devx] vorhanden, devx-Versionen konsistent.", + "en": "Configuration OK: [tool.devx] present, devx versions consistent.", + "pl": "Konfiguracja OK: [tool.devx] obecne, wersje devx spójne.", + "ru": "Конфигурация OK: [tool.devx] присутствует, версии devx согласованы.", + "zh": "配置正常: [tool.devx] 已存在, devx 版本一致。" + }, + "Configuration validation failed.": { + "bg": "Валидацията на конфигурацията се провали.", + "de": "Konfigurationsvalidierung fehlgeschlagen.", + "en": "Configuration validation failed.", + "pl": "Walidacja konfiguracji nie powiodła się.", + "ru": "Проверка конфигурации не удалась.", + "zh": "配置验证失败。" + }, + "Configuring branch protection for {branch}...": { + "bg": "Конфигуриране на защита на клона {branch}...", + "de": "Konfiguriere Branch-Schutz für {branch}...", + "en": "Configuring branch protection for {branch}...", + "pl": "Konfigurowanie ochrony gałęzi dla {branch}...", + "ru": "Настройка защиты ветки {branch}...", + "zh": "正在配置 {branch} 的分支保护..." + }, + "Configuring repository settings...": { + "bg": "Конфигуриране на настройките на хранилището...", + "de": "Repository-Einstellungen konfigurieren...", + "en": "Configuring repository settings...", + "pl": "Konfigurowanie ustawień repozytorium...", + "ru": "Настройка параметров репозитория...", + "zh": "正在配置仓库设置..." + }, + "Configuring tea login '{name}' for {url}...": { + "bg": "Конфигуриране на tea вход '{name}' за {url}...", + "de": "Konfiguriere tea-Login '{name}' für {url}...", + "en": "Configuring tea login '{name}' for {url}...", + "pl": "Konfigurowanie logowania tea '{name}' dla {url}...", + "ru": "Настройка входа tea '{name}' для {url}...", + "zh": "正在为 {url} 配置 tea 登录 '{name}'..." + }, + "Could not detect PR number. Use --pr to specify it explicitly,\nor run this command from a branch with an open PR.": { + "bg": "Не може да се определи номерът на PR. Използвайте --pr, за да го зададете изрично,\nили изпълнете командата от клон с отворен PR.", + "de": "PR-Nummer konnte nicht ermittelt werden. Mit --pr explizit angeben,\noder den Befehl von einem Branch mit offenem PR ausführen.", + "en": "Could not detect PR number. Use --pr to specify it explicitly,\nor run this command from a branch with an open PR.", + "pl": "Nie można wykryć numeru PR. Użyj --pr, aby go podać jawnie,\nlub uruchom polecenie z gałęzi z otwartym PR.", + "ru": "Не удалось определить номер PR. Укажите его явно через --pr,\nили выполните команду из ветки с открытым PR.", + "zh": "无法检测 PR 编号。请使用 --pr 明确指定,\n或在有开放 PR 的分支上运行此命令。" + }, + "Could not detect current branch: {error}": { + "bg": "Не може да се определи текущия клон: {error}", + "de": "Aktueller Branch konnte nicht erkannt werden: {error}", + "en": "Could not detect current branch: {error}", + "pl": "Nie można wykryć bieżącej gałęzi: {error}", + "ru": "Не удалось определить текущую ветку: {error}", + "zh": "无法检测当前分支: {error}" + }, + "Could not determine branch name from PR #{pr}": { + "bg": "Не може да се определи името на клона от PR #{pr}", + "de": "Branch-Name konnte aus PR #{pr} nicht ermittelt werden", + "en": "Could not determine branch name from PR #{pr}", + "pl": "Nie można określić nazwy gałęzi z PR #{pr}", + "ru": "Не удалось определить имя ветки из PR #{pr}", + "zh": "无法从 PR #{pr} 确定分支名称" + }, + "Could not determine head SHA for PR #{pr_number}.": { + "bg": "Не може да се определи head SHA за PR #{pr_number}.", + "de": "Head-SHA für PR #{pr_number} konnte nicht ermittelt werden.", + "en": "Could not determine head SHA for PR #{pr_number}.", + "pl": "Nie można określić head SHA dla PR #{pr_number}.", + "ru": "Не удалось определить head SHA для PR #{pr_number}.", + "zh": "无法确定 PR #{pr_number} 的 head SHA。" + }, + "Could not determine repository. Set DEVX_REPO_OWNER and DEVX_REPO_NAME\nor GITHUB_REPOSITORY environment variables.": { + "bg": "Не може да се определи репозитория. Задайте променливите DEVX_REPO_OWNER и DEVX_REPO_NAME\nили GITHUB_REPOSITORY.", + "de": "Repository konnte nicht ermittelt werden. Setzen Sie DEVX_REPO_OWNER und DEVX_REPO_NAME\noder die Umgebungsvariable GITHUB_REPOSITORY.", + "en": "Could not determine repository. Set DEVX_REPO_OWNER and DEVX_REPO_NAME\nor GITHUB_REPOSITORY environment variables.", + "pl": "Nie można określić repozytorium. Ustaw zmienne DEVX_REPO_OWNER i DEVX_REPO_NAME\nlub GITHUB_REPOSITORY.", + "ru": "Не удалось определить репозиторий. Задайте переменные DEVX_REPO_OWNER и DEVX_REPO_NAME\nили GITHUB_REPOSITORY.", + "zh": "无法确定仓库。请设置环境变量 DEVX_REPO_OWNER 和 DEVX_REPO_NAME\n或 GITHUB_REPOSITORY。" + }, + "Could not extract conventional commit message from PR commits.": { + "bg": "Не може да се извлече conventional commit съобщение от PR комитите.", + "de": "Konnte keine Conventional-Commit-Nachricht aus den PR-Commits extrahieren.", + "en": "Could not extract conventional commit message from PR commits.", + "pl": "Nie udało się wyodrębnić konwencjonalnej wiadomości commit z commitów PR.", + "ru": "Не удалось извлечь conventional commit сообщение из коммитов PR.", + "zh": "无法从 PR 提交中提取 conventional commit 信息。" + }, + "Could not fetch PR title from Gitea (CI_GITEA_TOKEN not set or PR not found).": { + "bg": "Не може да се извлече заглавието на PR от Gitea (CI_GITEA_TOKEN не е зададен или PR не е намерен).", + "de": "PR-Titel konnte nicht von Gitea abgerufen werden (CI_GITEA_TOKEN nicht gesetzt oder PR nicht gefunden).", + "en": "Could not fetch PR title from Gitea (CI_GITEA_TOKEN not set or PR not found).", + "pl": "Nie można pobrać tytułu PR z Gitea (CI_GITEA_TOKEN nie ustawiony lub PR nie znaleziony).", + "ru": "Не удалось получить заголовок PR из Gitea (CI_GITEA_TOKEN не задан или PR не найден).", + "zh": "无法从 Gitea 获取 PR 标题(CI_GITEA_TOKEN 未设置或 PR 未找到)。" + }, + "Could not find Vikunja task {task_id} in project {project_id}.": { + "bg": "Не е намерена Vikunja задача {task_id} в проект {project_id}.", + "de": "Vikunja-Task {task_id} in Projekt {project_id} nicht gefunden.", + "en": "Could not find Vikunja task {task_id} in project {project_id}.", + "pl": "Nie znaleziono zadania Vikunja {task_id} w projekcie {project_id}.", + "ru": "Не найдена задача Vikunja {task_id} в проекте {project_id}.", + "zh": "在项目 {project_id} 中找不到 Vikunja 任务 {task_id}。" + }, + "Could not find Vikunja task {task_id} in project {project_id}. Every PR must have a corresponding Vikunja task.": { + "bg": "Не е намерена Vikunja задача {task_id} в проект {project_id}. Всеки PR трябва да има съответна Vikunja задача.", + "de": "Vikunja-Task {task_id} in Projekt {project_id} nicht gefunden. Jeder PR muss einen entsprechenden Vikunja-Task haben.", + "en": "Could not find Vikunja task {task_id} in project {project_id}. Every PR must have a corresponding Vikunja task.", + "pl": "Nie znaleziono zadania Vikunja {task_id} w projekcie {project_id}. Każdy PR musi mieć odpowiadające zadanie Vikunja.", + "ru": "Задача Vikunja {task_id} в проекте {project_id} не найдена. Каждый PR должен иметь соответствующую задачу Vikunja.", + "zh": "在项目 {project_id} 中未找到 Vikunja 任务 {task_id}。每个 PR 必须有对应的 Vikunja 任务。" + }, + "Could not find __version__ in {file}": { + "bg": "Не е намерен __version__ в {file}", + "de": "__version__ in {file} nicht gefunden", + "en": "Could not find __version__ in {file}", + "pl": "Nie znaleziono __version__ w {file}", + "ru": "__version__ не найден в {file}", + "zh": "在 {file} 中未找到 __version__" + }, + "Could not find pinned version for {pkg}": { + "bg": "Не е намерена фиксирана версия за {pkg}", + "de": "Keine gepinnte Version für {pkg} gefunden", + "en": "Could not find pinned version for {pkg}", + "pl": "Nie znaleziono przypiętej wersji dla {pkg}", + "ru": "Не найдена закреплённая версия для {pkg}", + "zh": "未找到 {pkg} 的固定版本" + }, + "Could not parse test execution time from output.": { + "bg": "Не може да се извлече време за изпълнение на теста от изхода.", + "de": "Testausführungszeit konnte aus der Ausgabe nicht gelesen werden.", + "en": "Could not parse test execution time from output.", + "pl": "Nie udało się przeanalizować czasu wykonania testu z wyjścia.", + "ru": "Не удалось извлечь время выполнения теста из вывода.", + "zh": "无法从输出中解析测试执行时间。" + }, + "Created PR #{index}: {title}\n {url}": { + "bg": "Създаден PR #{index}: {title}\n {url}", + "de": "PR erstellt #{index}: {title}\n {url}", + "en": "Created PR #{index}: {title}\n {url}", + "pl": "Utworzono PR #{index}: {title}\n {url}", + "ru": "Создан PR #{index}: {title}\n {url}", + "zh": "已创建 PR #{index}: {title}\n {url}" + }, + "Created Vikunja task: {identifier} (id={task_id})": { + "bg": "Създадена Vikunja задача: {identifier} (id={task_id})", + "de": "Vikunja-Task erstellt: {identifier} (id={task_id})", + "en": "Created Vikunja task: {identifier} (id={task_id})", + "pl": "Utworzono zadanie Vikunja: {identifier} (id={task_id})", + "ru": "Создана задача Vikunja: {identifier} (id={task_id})", + "zh": "已创建 Vikunja 任务: {identifier} (id={task_id})" + }, + "Created issue #{issue_id}: {title}": { + "bg": "Създадено issue #{issue_id}: {title}", + "de": "Issue #{issue_id} erstellt: {title}", + "en": "Created issue #{issue_id}: {title}", + "pl": "Utworzono zgłoszenie #{issue_id}: {title}", + "ru": "Создано issue #{issue_id}: {title}", + "zh": "已创建 issue #{issue_id}:{title}" + }, + "Created release commit.": { + "bg": "Създаден е release комит.", + "de": "Release-Commit erstellt.", + "en": "Created release commit.", + "pl": "Utworzono commit wydania.", + "ru": "Создан релизный коммит.", + "zh": "已创建发布提交。" + }, + "Dependencies must have documentation comments.": { + "bg": "Зависимостите трябва да имат документиращи коментари.", + "de": "Abhängigkeiten müssen Dokumentationskommentare haben.", + "en": "Dependencies must have documentation comments.", + "pl": "Zależności muszą mieć komentarze dokumentacyjne.", + "ru": "Зависимости должны иметь документирующие комментарии.", + "zh": "依赖项必须有文档注释。" + }, + "Directory containing Ansible roles": { + "bg": "Директория, съдържаща Ansible роли", + "de": "Verzeichnis mit Ansible-Rollen", + "en": "Directory containing Ansible roles", + "pl": "Katalog zawierający role Ansible", + "ru": "Директория, содержащая роли Ansible", + "zh": "包含 Ansible 角色的目录" + }, + "Directory containing spec files": { + "bg": "Директория, съдържаща spec файлове", + "de": "Verzeichnis mit Spec-Dateien", + "en": "Directory containing spec files", + "pl": "Katalog zawierający pliki spec", + "ru": "Директория, содержащая spec-файлы", + "zh": "包含规范文件的目录" + }, + "Directory to scan (default: tests/integration). Can be repeated.": { + "bg": "Директория за сканиране (по подразбиране: tests/integration). Може да се повтаря.", + "de": "Zu scannendes Verzeichnis (Standard: tests/integration). Kann wiederholt werden.", + "en": "Directory to scan (default: tests/integration). Can be repeated.", + "pl": "Katalog do skanowania (domyślnie: tests/integration). Można powtarzać.", + "ru": "Директория для сканирования (по умолчанию: tests/integration). Можно повторять.", + "zh": "要扫描的目录(默认:tests/integration)。可重复。" + }, + "Docker daemon already running": { + "bg": "Докер демонът вече работи", + "de": "Docker-Daemon läuft bereits", + "en": "Docker daemon already running", + "pl": "Demon Docker już uruchomiony", + "ru": "Демон Docker уже работает", + "zh": "Docker 守护进程已在运行" + }, + "Docker daemon failed to start": { + "bg": "Docker демонът не успя да стартира", + "de": "Docker-Daemon konnte nicht gestartet werden", + "en": "Docker daemon failed to start", + "pl": "Nie udało się uruchomić demona Docker", + "ru": "Не удалось запустить Docker-демон", + "zh": "Docker 守护进程启动失败" + }, + "Docker daemon started": { + "bg": "Docker демонът стартира", + "de": "Docker-Daemon gestartet", + "en": "Docker daemon started", + "pl": "Demon Docker uruchomiony", + "ru": "Docker-демон запущен", + "zh": "Docker 守护进程已启动" + }, + "Dockerfile not found: {path}": { + "bg": "Dockerfile не е намерен: {path}", + "de": "Dockerfile nicht gefunden: {path}", + "en": "Dockerfile not found: {path}", + "pl": "Nie znaleziono Dockerfile: {path}", + "ru": "Dockerfile не найден: {path}", + "zh": "未找到 Dockerfile:{path}" + }, + "Dry-run mode: on branch '{branch}' (not master). Some checks may behave differently.": { + "bg": "Режим dry-run: на клон '{branch}' (не master). Някои проверки може да се държат различно.", + "de": "Dry-Run-Modus: auf Branch '{branch}' (nicht master). Einige Prüfungen können sich anders verhalten.", + "en": "Dry-run mode: on branch '{branch}' (not master). Some checks may behave differently.", + "pl": "Tryb dry-run: na gałęzi '{branch}' (nie master). Niektóre kontrole mogą zachowywać się inaczej.", + "ru": "Режим dry-run: в ветке '{branch}' (не master). Некоторые проверки могут вести себя иначе.", + "zh": "Dry-run 模式:在分支 '{branch}' 上(非 master)。某些检查可能表现不同。" + }, + "ERROR: CI_GITEA_TOKEN is not set.": { + "bg": "ГРЕШКА: CI_GITEA_TOKEN не е зададен.", + "de": "FEHLER: CI_GITEA_TOKEN ist nicht gesetzt.", + "en": "ERROR: CI_GITEA_TOKEN is not set.", + "pl": "BŁĄD: CI_GITEA_TOKEN nie jest ustawiony.", + "ru": "ОШИБКА: CI_GITEA_TOKEN не задан.", + "zh": "错误:未设置 CI_GITEA_TOKEN。" + }, + "ERROR: Repository name not specified. Use --repo or set DEVX_REPO_NAME.": { + "bg": "ГРЕШКА: Името на хранилището не е указано. Използвайте --repo или задайте DEVX_REPO_NAME.", + "de": "FEHLER: Repository-Name nicht angegeben. Verwenden Sie --repo oder setzen Sie DEVX_REPO_NAME.", + "en": "ERROR: Repository name not specified. Use --repo or set DEVX_REPO_NAME.", + "pl": "BŁĄD: Nazwa repozytorium nie jest określona. Użyj --repo lub ustaw DEVX_REPO_NAME.", + "ru": "ОШИБКА: Имя репозитория не указано. Используйте --repo или задайте DEVX_REPO_NAME.", + "zh": "错误:未指定仓库名称。请使用 --repo 或设置 DEVX_REPO_NAME。" + }, + "ERROR: Tag consistency check failed. Existing tags are misaligned:": { + "bg": "ГРЕШКА: Проверката за консистентност на таговете се провали. Съществуващите тагове са несъответстващи:", + "de": "FEHLER: Tag-Konsistenzprüfung fehlgeschlagen. Bestehende Tags sind falsch zugeordnet:", + "en": "ERROR: Tag consistency check failed. Existing tags are misaligned:", + "pl": "BŁĄD: Kontrola zgodności tagów nie powiodła się. Istniejące tagi są niezgodne:", + "ru": "ОШИБКА: Проверка согласованности тегов не удалась. Существующие теги несогласованы:", + "zh": "错误:标签一致性检查失败。现有标签不匹配:" + }, + "ERROR: VIKUNJA_TOKEN is not set.": { + "bg": "ГРЕШКА: VIKUNJA_TOKEN не е зададен.", + "de": "FEHLER: VIKUNJA_TOKEN ist nicht gesetzt.", + "en": "ERROR: VIKUNJA_TOKEN is not set.", + "pl": "BŁĄD: VIKUNJA_TOKEN nie jest ustawiony.", + "ru": "ОШИБКА: VIKUNJA_TOKEN не задан.", + "zh": "错误:未设置 VIKUNJA_TOKEN。" + }, + "ERROR: mapping.json not found at {path}": { + "bg": "ГРЕШКА: mapping.json не е намерен в {path}", + "de": "FEHLER: mapping.json nicht gefunden unter {path}", + "en": "ERROR: mapping.json not found at {path}", + "pl": "BŁĄD: mapping.json nie znaleziono w {path}", + "ru": "ОШИБКА: mapping.json не найден по пути {path}", + "zh": "错误:在 {path} 未找到 mapping.json" + }, + "Each item must be a string or an object with 'id', got {type}": { + "bg": "Всеки елемент трябва да е низ или обект с 'id', получено {type}", + "de": "Jedes Element muss ein String oder ein Objekt mit 'id' sein, erhalten {type}", + "en": "Each item must be a string or an object with 'id', got {type}", + "pl": "Każdy element musi być ciągiem lub obiektem z 'id', otrzymano {type}", + "ru": "Каждый элемент должен быть строкой или объектом с 'id', получено {type}", + "zh": "每个元素必须是字符串或带有 'id' 的对象,得到 {type}" + }, + "Ensuring standard labels...": { + "bg": "Осигуряване на стандартни етикети...", + "de": "Standard-Labels werden sichergestellt...", + "en": "Ensuring standard labels...", + "pl": "Zapewnianie standardowych etykiet...", + "ru": "Обеспечение стандартных меток...", + "zh": "正在确保标准标签..." + }, + "FAIL: Could not clone wiki for verification.": { + "bg": "", + "de": "", + "en": "FAIL: Could not clone wiki for verification.", + "pl": "", + "ru": "", + "zh": "" + }, + "FAIL: {n} documentation issues found:": { + "bg": "ГРЕШКА: Намерени {n} проблема в документацията:", + "de": "FEHLER: {n} Dokumentationsprobleme gefunden:", + "en": "FAIL: {n} documentation issues found:", + "pl": "BŁĄD: Znaleziono {n} problemów z dokumentacją:", + "ru": "ОШИБКА: Найдено {n} проблем в документации:", + "zh": "失败:发现 {n} 个文档问题:" + }, + "FAILED: {count} undocumented dependency/ies": { + "bg": "НЕУСПЕШНО: {count} недокументирани зависимости", + "de": "FEHLGESCHLAGEN: {count} undokumentierte Abhängigkeit(en)", + "en": "FAILED: {count} undocumented dependency/ies", + "pl": "NIEUDANE: {count} nieudokumentowanych zależności", + "ru": "ПРОВАЛЕНО: {count} недокументированных зависимостей", + "zh": "失败:{count} 个未记录的依赖项" + }, + "Failed images: {names}": { + "bg": "Неуспешни изображения: {names}", + "de": "Fehlgeschlagene Images: {names}", + "en": "Failed images: {names}", + "pl": "Nieudane obrazy: {names}", + "ru": "Неудавшиеся образы: {names}", + "zh": "失败的镜像:{names}" + }, + "Failed to create branch: {error}": { + "bg": "Неуспешно създаване на клон: {error}", + "de": "Branch konnte nicht erstellt werden: {error}", + "en": "Failed to create branch: {error}", + "pl": "Nie udało się utworzyć gałęzi: {error}", + "ru": "Не удалось создать ветку: {error}", + "zh": "创建分支失败:{error}" + }, + "Failed to create issue via tea: {error}": { + "bg": "Неуспешно създаване на issue чрез tea: {error}", + "de": "Issue konnte nicht via tea erstellt werden: {error}", + "en": "Failed to create issue via tea: {error}", + "pl": "Nie udało się utworzyć zgłoszenia przez tea: {error}", + "ru": "Не удалось создать issue через tea: {error}", + "zh": "通过 tea 创建 issue 失败:{error}" + }, + "Failed to delete {count} image version(s)": { + "bg": "Неуспешно изтриване на {count} версии на изображения", + "de": "{count} Image-Version(en) konnten nicht gelöscht werden", + "en": "Failed to delete {count} image version(s)", + "pl": "Nie udało się usunąć {count} wersji obrazów", + "ru": "Не удалось удалить {count} версий образов", + "zh": "删除 {count} 个镜像版本失败" + }, + "Failed to fetch PR #{pr}: {error}": { + "bg": "Неуспешно извличане на PR #{pr}: {error}", + "de": "PR #{pr} konnte nicht abgerufen werden: {error}", + "en": "Failed to fetch PR #{pr}: {error}", + "pl": "Nie udało się pobrać PR #{pr}: {error}", + "ru": "Не удалось получить PR #{pr}: {error}", + "zh": "获取 PR #{pr} 失败:{error}" + }, + "Failed to list versions for {name}: {error}": { + "bg": "Неуспешно изброяване на версиите за {name}: {error}", + "de": "Versionen für {name} konnten nicht aufgelistet werden: {error}", + "en": "Failed to list versions for {name}: {error}", + "pl": "Nie udało się wylistować wersji dla {name}: {error}", + "ru": "Не удалось получить список версий для {name}: {error}", + "zh": "列出 {name} 的版本失败:{error}" + }, + "Failed to push release commit after 3 attempts. Manual intervention required.": { + "bg": "Неуспешен push на release комита след 3 опита. Изисква се ръчна намеса.", + "de": "Release-Commit konnte nach 3 Versuchen nicht gepusht werden. Manuelles Eingreifen erforderlich.", + "en": "Failed to push release commit after 3 attempts. Manual intervention required.", + "pl": "Nie udało się wypchnąć commita release po 3 próbach. Wymagana ręczna interwencja.", + "ru": "Не удалось отправить релизный коммит после 3 попыток. Требуется ручное вмешательство.", + "zh": "3 次尝试后仍无法推送发布提交。需要人工干预。" + }, + "Failed to start ssh-agent: {error}": { + "bg": "Неуспешно стартиране на ssh-agent: {error}", + "de": "Starten von ssh-agent fehlgeschlagen: {error}", + "en": "Failed to start ssh-agent: {error}", + "pl": "Nie udało się uruchomić ssh-agent: {error}", + "ru": "Не удалось запустить ssh-agent: {error}", + "zh": "启动 ssh-agent 失败: {error}" + }, + "Failed to update PR #{pr}: {error}": { + "bg": "Неуспешно обновяване на PR #{pr}: {error}", + "de": "PR #{pr} konnte nicht aktualisiert werden: {error}", + "en": "Failed to update PR #{pr}: {error}", + "pl": "Nie udało się zaktualizować PR #{pr}: {error}", + "ru": "Не удалось обновить PR #{pr}: {error}", + "zh": "更新 PR #{pr} 失败:{error}" + }, + "Failed to update {file}": { + "bg": "Неуспешно обновяване на {file}", + "de": "{file} konnte nicht aktualisiert werden", + "en": "Failed to update {file}", + "pl": "Nie udało się zaktualizować {file}", + "ru": "Не удалось обновить {file}", + "zh": "更新 {file} 失败" + }, + "Fetch failed: {error}": { + "bg": "Извличането се провали: {error}", + "de": "Abruf fehlgeschlagen: {error}", + "en": "Fetch failed: {error}", + "pl": "Pobieranie nie powiodło się: {error}", + "ru": "Получение не удалось: {error}", + "zh": "获取失败:{error}" + }, + "Fetching logs for PR #{pr_number}...": { + "bg": "Извличане на логове за PR #{pr_number}...", + "de": "Rufe Logs für PR #{pr_number} ab...", + "en": "Fetching logs for PR #{pr_number}...", + "pl": "Pobieranie logów dla PR #{pr_number}...", + "ru": "Получение логов для PR #{pr_number}...", + "zh": "正在获取 PR #{pr_number} 的日志..." + }, + "Fetching origin/master...": { + "bg": "Извличане на origin/master...", + "de": "Rufe origin/master ab...", + "en": "Fetching origin/master...", + "pl": "Pobieranie origin/master...", + "ru": "Получение origin/master...", + "zh": "正在获取 origin/master..." + }, + "Fix: add @patch decorators or with patch() context managers for subprocess/time.sleep calls, or patch the calling function.": { + "bg": "Корекция: добавете @patch декоратори или with patch() контекстни мениджъри за subprocess/time.sleep извиквания, или patch-нете извикващата функция.", + "de": "Behebung: @patch-Dekoratoren oder with patch()-Kontextmanager für subprocess/time.sleep-Aufrufe hinzufügen, oder die aufrufende Funktion patchen.", + "en": "Fix: add @patch decorators or with patch() context managers for subprocess/time.sleep calls, or patch the calling function.", + "pl": "Poprawka: dodaj dekoratory @patch lub menedżery kontekstu with patch() dla wywołań subprocess/time.sleep, albo załataj funkcję wywołującą.", + "ru": "Исправление: добавьте декораторы @patch или контекстные менеджеры with patch() для вызовов subprocess/time.sleep, либо запатчите вызывающую функцию.", + "zh": "修复:为 subprocess/time.sleep 调用添加 @patch 装饰器或 with patch() 上下文管理器,或修补调用函数。" + }, + "Fix: add @patch decorators or with patch() context managers for subprocess/time.sleep calls, or patch the calling function.\n": { + "bg": "Корекция: добавете @patch декоратори или with patch() контекстни мениджъри за subprocess/time.sleep извиквания, или patch-нете извикващата функция.\n", + "de": "Behebung: @patch-Dekoratoren oder with patch()-Kontextmanager für subprocess/time.sleep-Aufrufe hinzufügen, oder die aufrufende Funktion patchen.\n", + "en": "Fix: add @patch decorators or with patch() context managers for subprocess/time.sleep calls, or patch the calling function.\n", + "pl": "Poprawka: dodaj dekoratory @patch lub menedżery kontekstu with patch() dla wywołań subprocess/time.sleep, albo załataj funkcję wywołującą.\n", + "ru": "Исправление: добавьте декораторы @patch или контекстные менеджеры with patch() для вызовов subprocess/time.sleep, либо запатчите вызывающую функцию.\n", + "zh": "修复:为 subprocess/time.sleep 调用添加 @patch 装饰器或 with patch() 上下文管理器,或修补调用函数。\n" + }, + "Force-push failed:\n{error}\nThe remote may have unexpected commits. Fetch and try again.": { + "bg": "Force-push се провали:\n{error}\nОтдалеченото репозитори може да съдържа неочаквани комити. Извличане и нов опит.", + "de": "Force-Push fehlgeschlagen:\n{error}\nDas Remote kann unerwartete Commits enthalten. Fetchen und erneut versuchen.", + "en": "Force-push failed:\n{error}\nThe remote may have unexpected commits. Fetch and try again.", + "pl": "Force-push nie powiódł się:\n{error}\nZdalne repozytorium może mieć nieoczekiwane commity. Pobierz i spróbuj ponownie.", + "ru": "Force-push не удался:\n{error}\nУдалённый репозиторий может содержать неожиданные коммиты. Выполните fetch и повторите.", + "zh": "强制推送失败:\n{error}\n远程可能有意外提交。请先 fetch 后重试。" + }, + "Force-pushing...": { + "bg": "Force-push...", + "de": "Force-Push läuft...", + "en": "Force-pushing...", + "pl": "Wymuszone wypychanie...", + "ru": "Force-push...", + "zh": "正在强制推送..." + }, + "Found {count} mutable global(s) — use factory functions or pytest fixtures.": { + "bg": "Намерени {count} променливи глобални — използвайте фабрични функции или pytest fixtures.", + "de": "{count} mutable Global(s) gefunden — Factory-Funktionen oder pytest-Fixtures verwenden.", + "en": "Found {count} mutable global(s) — use factory functions or pytest fixtures.", + "pl": "Znaleziono {count} mutowalnych globali — użyj funkcji fabrykujących lub fixture'ów pytest.", + "ru": "Найдено {count} изменяемых глобальных — используйте фабричные функции или pytest-фикстуры.", + "zh": "发现 {count} 个可变全局变量——请使用工厂函数或 pytest fixtures。" + }, + "Found {count} stale documentation reference(s)": { + "bg": "Намерени {count} остарели препратки в документацията", + "de": "{count} veraltete Dokumentationsreferenz(en) gefunden", + "en": "Found {count} stale documentation reference(s)", + "pl": "Znaleziono {count} nieaktualnych odwołań w dokumentacji", + "ru": "Найдено {count} устаревших ссылок в документации", + "zh": "发现 {count} 个过时的文档引用" + }, + "Found {count} unsafe identity check(s) in integration tests.": { + "bg": "Намерени са {count} небрежни проверки за идентичност в интеграционните тестове.", + "de": "{count} unsichere Identitätsprüfung(en) in Integrationstests gefunden.", + "en": "Found {count} unsafe identity check(s) in integration tests.", + "pl": "Znaleziono {count} niebezpiecznych sprawdzeń tożsamości w testach integracyjnych.", + "ru": "Найдено {count} небезопасных проверок идентичности в интеграционных тестах.", + "zh": "在集成测试中发现 {count} 个不安全的身份检查。" + }, + "Found {count} version(s):": { + "bg": "Намерени {count} версии:", + "de": "{count} Version(en) gefunden:", + "en": "Found {count} version(s):", + "pl": "Znaleziono {count} wersji:", + "ru": "Найдено {count} версий:", + "zh": "找到 {count} 个版本:" + }, + "GITEA_URL/CI_GITEA_TOKEN/RUN_ID not set; running without cross-runner cancellation.": { + "bg": "GITEA_URL/CI_GITEA_TOKEN/RUN_ID не са зададени; изпълнение без отмяна между раннъри.", + "de": "GITEA_URL/CI_GITEA_TOKEN/RUN_ID nicht gesetzt; läuft ohne Runner-übergreifende Abbrüche.", + "en": "GITEA_URL/CI_GITEA_TOKEN/RUN_ID not set; running without cross-runner cancellation.", + "pl": "GITEA_URL/CI_GITEA_TOKEN/RUN_ID nie ustawione; uruchamianie bez anulowania między runnerami.", + "ru": "GITEA_URL/CI_GITEA_TOKEN/RUN_ID не заданы; работа без отмены между раннерами.", + "zh": "未设置 GITEA_URL/CI_GITEA_TOKEN/RUN_ID;运行时无法进行跨 runner 取消。" + }, + "Generated {count} badge files": { + "bg": "Генерирани {count} файла със значки", + "de": "{count} Badge-Dateien generiert", + "en": "Generated {count} badge files", + "pl": "Wygenerowano {count} plików odznak", + "ru": "Сгенерировано {count} файлов значков", + "zh": "已生成 {count} 个徽章文件" + }, + "Generated {file} with prefix '{prefix}'.": { + "bg": "Генериран {file} с префикс '{prefix}'.", + "de": "{file} mit Präfix '{prefix}' generiert.", + "en": "Generated {file} with prefix '{prefix}'.", + "pl": "Wygenerowano {file} z prefiksem '{prefix}'.", + "ru": "Сгенерирован {file} с префиксом '{prefix}'.", + "zh": "已生成带前缀 '{prefix}' 的 {file}。" + }, + "Generating badges in {out}...": { + "bg": "Генериране на значки в {out}...", + "de": "Generiere Badges in {out}...", + "en": "Generating badges in {out}...", + "pl": "Generowanie odznak w {out}...", + "ru": "Генерация значков в {out}...", + "zh": "正在 {out} 中生成徽章..." + }, + "Git tag or ref that was deployed": { + "bg": "Git таг или референция, която беше разгърната", + "de": "Git-Tag oder Ref, der bereitgestellt wurde", + "en": "Git tag or ref that was deployed", + "pl": "Tag Git lub ref, który został wdrożony", + "ru": "Git-тег или ссылка, которые были развёрнуты", + "zh": "已部署的 Git 标签或引用" + }, + "Git tag to deploy (e.g. v0.28.1).": { + "bg": "Git таг за разгръщане (напр. v0.28.1).", + "de": "Git-Tag für Bereitstellung (z.B. v0.28.1).", + "en": "Git tag to deploy (e.g. v0.28.1).", + "pl": "Tag Git do wdrożenia (np. v0.28.1).", + "ru": "Git-тег для развёртывания (напр. v0.28.1).", + "zh": "要部署的 Git 标签(例如 v0.28.1)。" + }, + "Gitea API token not set. Set one of: {names}": { + "bg": "Gitea API токен не е зададен. Задайте един от: {names}", + "de": "Gitea-API-Token nicht gesetzt. Setzen Sie einen von: {names}", + "en": "Gitea API token not set. Set one of: {names}", + "pl": "Token API Gitea nie jest ustawiony. Ustaw jeden z: {names}", + "ru": "Токен Gitea API не задан. Установите один из: {names}", + "zh": "未设置 Gitea API 令牌。请设置以下之一:{names}" + }, + "Gitea PyPI registry: {tag} already published — continuing.": { + "bg": "Gitea PyPI registry: {tag} вече е публикуван — продължава.", + "de": "Gitea PyPI-Registry: {tag} bereits veröffentlicht — wird fortgesetzt.", + "en": "Gitea PyPI registry: {tag} already published — continuing.", + "pl": "Gitea PyPI registry: {tag} już opublikowano — kontynuacja.", + "ru": "Gitea PyPI registry: {tag} уже опубликован — продолжаем.", + "zh": "Gitea PyPI registry: {tag} 已发布 — 继续。" + }, + "Gitea release {tag} already exists — skipping creation.": { + "bg": "Gitea release {tag} вече съществува — прескачане на създаването.", + "de": "Gitea-Release {tag} existiert bereits — Erstellung übersprungen.", + "en": "Gitea release {tag} already exists — skipping creation.", + "pl": "Wydanie Gitea {tag} już istnieje — pomijanie tworzenia.", + "ru": "Gitea release {tag} уже существует — пропуск создания.", + "zh": "Gitea release {tag} 已存在 — 跳过创建。" + }, + "HEAD is a release commit ('{msg}') but tag {tag} is missing. Recovering by creating tag.": { + "bg": "HEAD е release комит ('{msg}'), но тагът {tag} липсва. Възстановяване чрез създаване на таг.", + "de": "HEAD ist ein Release-Commit ('{msg}'), aber Tag {tag} fehlt. Wiederherstellung durch Tag-Erstellung.", + "en": "HEAD is a release commit ('{msg}') but tag {tag} is missing. Recovering by creating tag.", + "pl": "HEAD jest commitem wydania ('{msg}') ale tag {tag} brakuje. Naprawa przez utworzenie tagu.", + "ru": "HEAD является релизным коммитом ('{msg}'), но тег {tag} отсутствует. Восстановление созданием тега.", + "zh": "HEAD 是发布提交('{msg}'),但缺少标签 {tag}。正在通过创建标签恢复。" + }, + "HEAD is a release commit for v{version} but tag {tag} points to a different commit ({tag_commit} vs HEAD {head_commit}). This indicates a tag/commit misalignment.": { + "bg": "HEAD е release комит за v{version}, но тагът {tag} сочи към различен комит ({tag_commit} срещу HEAD {head_commit}). Това показва несъответствие таг/комит.", + "de": "HEAD ist ein Release-Commit für v{version}, aber Tag {tag} zeigt auf einen anderen Commit ({tag_commit} vs. HEAD {head_commit}). Dies deutet auf eine Tag/Commit-Fehlzuordnung hin.", + "en": "HEAD is a release commit for v{version} but tag {tag} points to a different commit ({tag_commit} vs HEAD {head_commit}). This indicates a tag/commit misalignment.", + "pl": "HEAD jest commitem wydania dla v{version} ale tag {tag} wskazuje na inny commit ({tag_commit} vs HEAD {head_commit}). Wskazuje to na niezgodność tag/commit.", + "ru": "HEAD является релизным коммитом для v{version}, но тег {tag} указывает на другой коммит ({tag_commit} против HEAD {head_commit}). Это указывает на несоответствие тег/коммит.", + "zh": "HEAD 是 v{version} 的发布提交,但标签 {tag} 指向不同的提交({tag_commit} 与 HEAD {head_commit})。这表明标签/提交不匹配。" + }, + "HEAD is already a release commit ('{msg}') and tag {tag} points to HEAD. Skipping.": { + "bg": "HEAD вече е release комит ('{msg}') и тагът {tag} сочи към HEAD. Пропуска се.", + "de": "HEAD ist bereits ein Release-Commit ('{msg}') und Tag {tag} zeigt auf HEAD. Wird übersprungen.", + "en": "HEAD is already a release commit ('{msg}') and tag {tag} points to HEAD. Skipping.", + "pl": "HEAD jest już commitem wydania ('{msg}') a tag {tag} wskazuje na HEAD. Pomijanie.", + "ru": "HEAD уже является релизным коммитом ('{msg}') и тег {tag} указывает на HEAD. Пропускается.", + "zh": "HEAD 已是发布提交('{msg}')且标签 {tag} 指向 HEAD。跳过。" + }, + "HEAD is not a release commit for {tag} — skipping publish.": { + "bg": "HEAD не е release комит за {tag} — публикуването се пропуска.", + "de": "HEAD ist kein Release-Commit für {tag} — Veröffentlichung wird übersprungen.", + "en": "HEAD is not a release commit for {tag} — skipping publish.", + "pl": "HEAD nie jest commitem wydania dla {tag} — pomijanie publikacji.", + "ru": "HEAD не является релизным коммитом для {tag} — публикация пропускается.", + "zh": "HEAD 不是 {tag} 的发布提交——跳过发布。" + }, + "HTTP error: {status} — {message}": { + "bg": "HTTP грешка: {status} — {message}", + "de": "HTTP-Fehler: {status} — {message}", + "en": "HTTP error: {status} — {message}", + "pl": "Błąd HTTP: {status} — {message}", + "ru": "Ошибка HTTP: {status} — {message}", + "zh": "HTTP 错误: {status} — {message}" + }, + "HTTP {status} Forbidden — your token lacks admin rights.\nMake sure the token belongs to a repo owner or organisation admin.\nAlternatively, configure branch protection manually in Settings → Branches.": { + "bg": "HTTP {status} Забранено — вашият токен няма администраторски права.\nУверете се, че токенът принадлежи на собственик на хранилище или администратор на организация.\nАлтернативно, конфигурирайте защитата на клона ръчно в Настройки → Клонове.", + "de": "HTTP {status} Verboten — Ihr Token hat keine Admin-Rechte.\nStellen Sie sicher, dass das Token einem Repository-Besitzer oder Organisations-Admin gehört.\nAlternativ können Sie den Branch-Schutz manuell unter Einstellungen → Branches konfigurieren.", + "en": "HTTP {status} Forbidden — your token lacks admin rights.\nMake sure the token belongs to a repo owner or organisation admin.\nAlternatively, configure branch protection manually in Settings → Branches.", + "pl": "HTTP {status} Forbidden — twój token nie ma uprawnień administratora.\nUpewnij się, że token należy do właściciela repozytorium lub administratora organizacji.\nAlternatywnie skonfiguruj ochronę gałęzi ręcznie w Ustawienia → Gałęzie.", + "ru": "HTTP {status} Запрещено — у вашего токена нет прав администратора.\nУбедитесь, что токен принадлежит владельцу репозитория или администратору организации.\nЛибо настройте защиту ветки вручную в разделе Настройки → Ветки.", + "zh": "HTTP {status} 禁止访问 — 您的令牌缺少管理员权限。\n请确保令牌属于仓库所有者或组织管理员。\n或者,您可以在 设置 → 分支 中手动配置分支保护。" + }, + "Head ref for diff": { + "bg": "Head ref за diff", + "de": "Head-Ref für Diff", + "en": "Head ref for diff", + "pl": "Head ref dla diff", + "ru": "Head ref для diff", + "zh": "用于 diff 的 head ref" + }, + "Heavy import '{mod}' (~{ms:.0f}ms) at module level — this slows test collection for all tests. Move inside test functions or use lazy import.": { + "bg": "Тежък импорт '{mod}' (~{ms:.0f}ms) на ниво модул — това забавя събирането на всички тестове. Преместете в тестови функции или използвайте lazy import.", + "de": "Schwerer Import '{mod}' (~{ms:.0f}ms) auf Modulebene — verlangsamt die Testerfassung für alle Tests. In Testfunktionen verschieben oder Lazy-Import verwenden.", + "en": "Heavy import '{mod}' (~{ms:.0f}ms) at module level — this slows test collection for all tests. Move inside test functions or use lazy import.", + "pl": "Ciężki import '{mod}' (~{ms:.0f}ms) na poziomie modułu — spowalnia zbieranie wszystkich testów. Przenieś do funkcji testowych lub użyj leniwego importu.", + "ru": "Тяжёлый импорт '{mod}' (~{ms:.0f}ms) на уровне модуля — замедляет сбор всех тестов. Переместите внутрь тестовых функций или используйте ленивый импорт.", + "zh": "模块级重导入 '{mod}'(~{ms:.0f}ms)——减慢所有测试的收集速度。请移入测试函数内或使用惰性导入。" + }, + "Host Docker not available, starting local dockerd...": { + "bg": "Хост Docker не е наличен, стартиране на локален dockerd...", + "de": "Host-Docker nicht verfügbar, lokaler dockerd wird gestartet...", + "en": "Host Docker not available, starting local dockerd...", + "pl": "Host Docker niedostępny, uruchamianie lokalnego dockerd...", + "ru": "Хост Docker недоступен, запускается локальный dockerd...", + "zh": "主机 Docker 不可用,正在启动本地 dockerd..." + }, + "Image 'tags' must be a list": { + "bg": "Полето 'tags' на изображението трябва да е списък", + "de": "Image-'tags' muss eine Liste sein", + "en": "Image 'tags' must be a list", + "pl": "'tags' obrazu musi być listą", + "ru": "Поле 'tags' образа должно быть списком", + "zh": "镜像的 'tags' 必须是列表" + }, + "Image manifest entry missing 'dockerfile'": { + "bg": "Записът в манифеста на изображението няма 'dockerfile'", + "de": "Image-Manifest-Eintrag ohne 'dockerfile'", + "en": "Image manifest entry missing 'dockerfile'", + "pl": "Wpis manifestu obrazu nie zawiera 'dockerfile'", + "ru": "Запись манифеста образа не содержит 'dockerfile'", + "zh": "镜像清单条目缺少 'dockerfile'" + }, + "Image manifest entry missing 'name'": { + "bg": "Записът в манифеста на изображението няма 'name'", + "de": "Image-Manifest-Eintrag ohne 'name'", + "en": "Image manifest entry missing 'name'", + "pl": "Wpis manifestu obrazu nie zawiera 'name'", + "ru": "Запись манифеста образа не содержит 'name'", + "zh": "镜像清单条目缺少 'name'" + }, + "Infrastructure commit (no DEVX-N task ID), skipping Vikunja update: {msg}": { + "bg": "Инфраструктурен commit (без идентификатор на задача DEVX-N), пропускаме обновяването на Vikunja: {msg}", + "de": "Infrastruktur-Commit (keine DEVX-N Task-ID), Vikunja-Update wird übersprungen: {msg}", + "en": "Infrastructure commit (no DEVX-N task ID), skipping Vikunja update: {msg}", + "pl": "Commit infrastruktury (bez ID zadania DEVX-N), pomijanie aktualizacji Vikunja: {msg}", + "ru": "Инфраструктурный коммит (без ID задачи DEVX-N), пропуск обновления Vikunja: {msg}", + "zh": "基础设施提交(无 DEVX-N 任务 ID),跳过 Vikunja 更新: {msg}" + }, + "Integration tests cancelled — another runner failed.": { + "bg": "Интеграционните тестове са отменени — друг runner се провали.", + "de": "Integrationstests abgebrochen — ein anderer Runner ist fehlgeschlagen.", + "en": "Integration tests cancelled — another runner failed.", + "pl": "Testy integracyjne anulowane — inny runner zakończył się niepowodzeniem.", + "ru": "Интеграционные тесты отменены — другой раннер завершился с ошибкой.", + "zh": "集成测试已取消——另一个 runner 失败。" + }, + "Integration tests failed with exit code {code}": { + "bg": "Интеграционните тестове се провалиха с изходен код {code}", + "de": "Integrationstests mit Exit-Code {code} fehlgeschlagen", + "en": "Integration tests failed with exit code {code}", + "pl": "Testy integracyjne zakończone niepowodzeniem z kodem {code}", + "ru": "Интеграционные тесты завершились с кодом {code}", + "zh": "集成测试失败,退出码 {code}" + }, + "Integration tests passed.": { + "bg": "Интеграционните тестове преминаха.", + "de": "Integrationstests bestanden.", + "en": "Integration tests passed.", + "pl": "Testy integracyjne zakończone pomyślnie.", + "ru": "Интеграционные тесты пройдены.", + "zh": "集成测试通过。" + }, + "Invalid repo format: {repo}": { + "bg": "Невалиден формат на репозитория: {repo}", + "de": "Ungültiges Repo-Format: {repo}", + "en": "Invalid repo format: {repo}", + "pl": "Nieprawidłowy format repo: {repo}", + "ru": "Неверный формат репозитория: {repo}", + "zh": "无效的仓库格式:{repo}" + }, + "Invalid repo format: {repo}. Expected owner/name.": { + "bg": "Невалиден формат на репозитория: {repo}. Очаква се owner/name.", + "de": "Ungültiges Repo-Format: {repo}. Erwartet: owner/name.", + "en": "Invalid repo format: {repo}. Expected owner/name.", + "pl": "Nieprawidłowy format repo: {repo}. Oczekiwano owner/name.", + "ru": "Неверный формат репозитория: {repo}. Ожидается owner/name.", + "zh": "无效的仓库格式:{repo}。应为 owner/name。" + }, + "Items input must be a JSON array, got {type}": { + "bg": "Входните данни трябва да са JSON масив, получено {type}", + "de": "Eingabe muss ein JSON-Array sein, erhalten {type}", + "en": "Items input must be a JSON array, got {type}", + "pl": "Dane wejściowe muszą być tablicą JSON, otrzymano {type}", + "ru": "Входные данные должны быть JSON-массивом, получено {type}", + "zh": "输入必须是 JSON 数组,得到 {type}" + }, + "Label '{label}' already on PR #{pr}.": { + "bg": "Етикетът '{label}' вече е на PR #{pr}.", + "de": "Label '{label}' bereits auf PR #{pr}.", + "en": "Label '{label}' already on PR #{pr}.", + "pl": "Etykieta '{label}' już jest na PR #{pr}.", + "ru": "Метка '{label}' уже есть на PR #{pr}.", + "zh": "标签 '{label}' 已在 PR #{pr} 上。" + }, + "Latest run: #{run_id} (status: {status})": { + "bg": "Последен run: #{run_id} (статус: {status})", + "de": "Letzter Lauf: #{run_id} (Status: {status})", + "en": "Latest run: #{run_id} (status: {status})", + "pl": "Ostatni przebieg: #{run_id} (status: {status})", + "ru": "Последний запуск: #{run_id} (статус: {status})", + "zh": "最近运行:#{run_id}(状态:{status})" + }, + "Lint failed — refusing to release. Fix lint errors first.\n{stderr}": { + "bg": "Lint се провали — отказ за версия. Първо коригирайте lint грешките.\n{stderr}", + "de": "Lint fehlgeschlagen — Release wird verweigert. Zuerst Lint-Fehler beheben.\n{stderr}", + "en": "Lint failed — refusing to release. Fix lint errors first.\n{stderr}", + "pl": "Lint nie powiódł się — odmowa wydania. Najpierw napraw błędy lint.\n{stderr}", + "ru": "Lint не пройден — отказ в релизе. Сначала исправьте ошибки lint.\n{stderr}", + "zh": "Lint 失败——拒绝发布。请先修复 lint 错误。\n{stderr}" + }, + "Lint passed.": { + "bg": "Lint премина.", + "de": "Lint bestanden.", + "en": "Lint passed.", + "pl": "Lint zakończony pomyślnie.", + "ru": "Lint пройден.", + "zh": "Lint 通过。" + }, + "Linting documentation in {root}...": { + "bg": "Lint на документацията в {root}...", + "de": "Linting der Dokumentation in {root}...", + "en": "Linting documentation in {root}...", + "pl": "Lintowanie dokumentacji w {root}...", + "ru": "Проверка документации в {root}...", + "zh": "正在检查 {root} 中的文档..." + }, + "Login to {registry} failed: {error}": { + "bg": "Влизането в {registry} не успя: {error}", + "de": "Anmeldung bei {registry} fehlgeschlagen: {error}", + "en": "Login to {registry} failed: {error}", + "pl": "Logowanie do {registry} nie powiodło się: {error}", + "ru": "Ошибка входа в {registry}: {error}", + "zh": "登录 {registry} 失败: {error}" + }, + "Loop with {count} iterations in test '{test}' — consider property-based testing (hypothesis) or reduce to <= {max} iterations.": { + "bg": "Цикъл с {count} итерации в тест '{test}' — използвайте property-based тестове (hypothesis) или намалете до <= {max} итерации.", + "de": "Schleife mit {count} Iterationen in Test '{test}' — property-based testing (hypothesis) verwenden oder auf <= {max} Iterationen reduzieren.", + "en": "Loop with {count} iterations in test '{test}' — consider property-based testing (hypothesis) or reduce to <= {max} iterations.", + "pl": "Pętla z {count} iteracjami w teście '{test}' — rozważ testy oparte na właściwościach (hypothesis) lub zmniejsz do <= {max} iteracji.", + "ru": "Цикл с {count} итерациями в тесте '{test}' — используйте property-based тестирование (hypothesis) или уменьшите до <= {max} итераций.", + "zh": "测试 '{test}' 中有 {count} 次迭代的循环 — 考虑使用基于属性的测试 (hypothesis) 或减少到 <= {max} 次迭代。" + }, + "Manifest file not found: {path}": { + "bg": "Файлът на манифеста не е намерен: {path}", + "de": "Manifestdatei nicht gefunden: {path}", + "en": "Manifest file not found: {path}", + "pl": "Nie znaleziono pliku manifestu: {path}", + "ru": "Файл манифеста не найден: {path}", + "zh": "未找到清单文件:{path}" + }, + "Manifest must be a JSON list": { + "bg": "Манифестът трябва да е JSON списък", + "de": "Manifest muss eine JSON-Liste sein", + "en": "Manifest must be a JSON list", + "pl": "Manifest musi być listą JSON", + "ru": "Манифест должен быть JSON-списком", + "zh": "清单必须是 JSON 列表" + }, + "Max files changed (excluded files not counted)": { + "bg": "Максимум променени файлове (изключените файлове не се броят)", + "de": "Max. geänderte Dateien (ausgeschlossene Dateien nicht gezählt)", + "en": "Max files changed (excluded files not counted)", + "pl": "Maks. zmienionych plików (wykluczone pliki nie są liczone)", + "ru": "Макс. изменённых файлов (исключённые файлы не учитываются)", + "zh": "最大更改文件数(排除的文件不计入)" + }, + "Max lines changed (excluded files not counted)": { + "bg": "Максимум променени редове (изключените файлове не се броят)", + "de": "Max. geänderte Zeilen (ausgeschlossene Dateien nicht gezählt)", + "en": "Max lines changed (excluded files not counted)", + "pl": "Maks. zmienionych linii (wykluczone pliki nie są liczone)", + "ru": "Макс. изменённых строк (исключённые файлы не учитываются)", + "zh": "最大更改行数(排除的文件不计入)" + }, + "Merge failed with HTTP {status}: {message}\nPlease check the PR is ready and you have merge rights.": { + "bg": "Сливането неуспешно с HTTP {status}: {message}\nПроверете дали PR е готов и имате права за сливане.", + "de": "Merge fehlgeschlagen mit HTTP {status}: {message}\nBitte prüfen Sie, ob der PR bereit ist und Sie Merge-Rechte haben.", + "en": "Merge failed with HTTP {status}: {message}\nPlease check the PR is ready and you have merge rights.", + "pl": "Scalanie nie powiodło się z HTTP {status}: {message}\nSprawdź czy PR jest gotowy i masz uprawnienia do scalania.", + "ru": "Слияние не удалось: HTTP {status}: {message}\nПроверьте, что PR готов и у вас есть права на слияние.", + "zh": "合并失败: HTTP {status}: {message}\n请检查 PR 是否准备就绪且您具有合并权限。" + }, + "Missing required section: {section}": { + "bg": "Липсва задължителна секция: {section}", + "de": "Erforderlicher Abschnitt fehlt: {section}", + "en": "Missing required section: {section}", + "pl": "Brak wymaganej sekcji: {section}", + "ru": "Отсутствует обязательный раздел: {section}", + "zh": "缺少必需部分:{section}" + }, + "Missing tests for changed files.": { + "bg": "Липсват тестове за променените файлове.", + "de": "Tests für geänderte Dateien fehlen.", + "en": "Missing tests for changed files.", + "pl": "Brak testów dla zmienionych plików.", + "ru": "Отсутствуют тесты для изменённых файлов.", + "zh": "缺少已更改文件的测试。" + }, + "Module {mod} has no main() function": { + "bg": "Модул {mod} няма функция main()", + "de": "Modul {mod} hat keine main()-Funktion", + "en": "Module {mod} has no main() function", + "pl": "Moduł {mod} nie ma funkcji main()", + "ru": "Модуль {mod} не имеет функции main()", + "zh": "模块 {mod} 没有 main() 函数" + }, + "Molecule directory not found: {path}": { + "bg": "Директорията на molecule не е намерена: {path}", + "de": "Molecule-Verzeichnis nicht gefunden: {path}", + "en": "Molecule directory not found: {path}", + "pl": "Katalog molecule nie znaleziony: {path}", + "ru": "Директория molecule не найдена: {path}", + "zh": "未找到 molecule 目录: {path}" + }, + "New version to pin": { + "bg": "Нова версия за фиксиране", + "de": "Neue zu pinnende Version", + "en": "New version to pin", + "pl": "Nowa wersja do przypięcia", + "ru": "Новая версия для закрепления", + "zh": "要固定的新版本" + }, + "Next steps:\n 1. git checkout master && git pull\n 2. git checkout -b {prefix}-{num}-short-description\n 3. Implement changes, commit with conventional commit format\n 4. git push -u origin HEAD\n 5. make create-pr (creates PR with title: {identifier}: {title})": { + "bg": "Следващи стъпки:\n 1. git checkout master && git pull\n 2. git checkout -b {prefix}-{num}-кратко-описание\n 3. Имплементирайте промените, commit с conventional commit формат\n 4. git push -u origin HEAD\n 5. make create-pr (създава PR с заглавие: {identifier}: {title})", + "de": "Nächste Schritte:\n 1. git checkout master && git pull\n 2. git checkout -b {prefix}-{num}-kurz-beschreibung\n 3. Änderungen implementieren, mit Conventional-Commit-Format committen\n 4. git push -u origin HEAD\n 5. make create-pr (erstellt PR mit Titel: {identifier}: {title})", + "en": "Next steps:\n 1. git checkout master && git pull\n 2. git checkout -b {prefix}-{num}-short-description\n 3. Implement changes, commit with conventional commit format\n 4. git push -u origin HEAD\n 5. make create-pr (creates PR with title: {identifier}: {title})", + "pl": "Następne kroki:\n 1. git checkout master && git pull\n 2. git checkout -b {prefix}-{num}-krótki-opis\n 3. Wprowadź zmiany, commituj w formacie conventional commit\n 4. git push -u origin HEAD\n 5. make create-pr (tworzy PR z tytułem: {identifier}: {title})", + "ru": "Следующие шаги:\n 1. git checkout master && git pull\n 2. git checkout -b {prefix}-{num}-краткое-описание\n 3. Реализуйте изменения, коммитьте в conventional commit формате\n 4. git push -u origin HEAD\n 5. make create-pr (создаёт PR с заголовком: {identifier}: {title})", + "zh": "后续步骤:\n 1. git checkout master && git pull\n 2. git checkout -b {prefix}-{num}-简短描述\n 3. 实现更改,使用 conventional commit 格式提交\n 4. git push -u origin HEAD\n 5. make create-pr (创建 PR,标题: {identifier}: {title})" + }, + "Nice! Gitea release {tag} created.": { + "bg": "Отлично! Gitea release {tag} е създаден.", + "de": "Prima! Gitea-Release {tag} erstellt.", + "en": "Nice! Gitea release {tag} created.", + "pl": "Świetnie! Wydanie Gitea {tag} utworzone.", + "ru": "Отлично! Gitea release {tag} создан.", + "zh": "不错!Gitea release {tag} 已创建。" + }, + "Nice! PR #{pr_number} squash-merged with title: {merge_title}": { + "bg": "Отлично! PR #{pr_number} е squash-merge-нат със заглавие: {merge_title}", + "de": "Prima! PR #{pr_number} wurde mit Titel {merge_title} squash-gemergt.", + "en": "Nice! PR #{pr_number} squash-merged with title: {merge_title}", + "pl": "Świetnie! PR #{pr_number} squash-merged z tytułem: {merge_title}", + "ru": "Отлично! PR #{pr_number} squash-merge с заголовком: {merge_title}", + "zh": "不错!PR #{pr_number} 已 squash 合并,标题: {merge_title}" + }, + "Nice! Release v{version} tagged and pushed. The publish workflow will be triggered.": { + "bg": "Чудесно! Версия v{version} е тагната и push-ната. Workflow-ът за публикуване ще се задейства.", + "de": "Release v{version} getaggt und gepusht. Der Publish-Workflow wird ausgelöst.", + "en": "Nice! Release v{version} tagged and pushed. The publish workflow will be triggered.", + "pl": "Świetnie! Wydanie v{version} otagowane i wypchnięte. Workflow publikacji zostanie uruchomiony.", + "ru": "Релиз v{version} помечен и отправлен. Workflow публикации будет запущен.", + "zh": "发布 v{version} 已打标签并推送。发布工作流将被触发。" + }, + "Nice! Vikunja task {task_id} (ID {vikunja_id}) updated and marked done.": { + "bg": "Отлично! Задача Vikunja {task_id} (ID {vikunja_id}) е обновена и маркирана като готова.", + "de": "Prima! Vikunja-Aufgabe {task_id} (ID {vikunja_id}) aktualisiert und als erledigt markiert.", + "en": "Nice! Vikunja task {task_id} (ID {vikunja_id}) updated and marked done.", + "pl": "Świetnie! Zadanie Vikunja {task_id} (ID {vikunja_id}) zaktualizowane i oznaczone jako ukończone.", + "ru": "Отлично! Задача Vikunja {task_id} (ID {vikunja_id}) обновлена и отмечена как выполненная.", + "zh": "不错!Vikunja 任务 {task_id} (ID {vikunja_id}) 已更新并标记为完成。" + }, + "Nightly gate failed — staging deploy blocked.": { + "bg": "Nightly проверката се провали — staging деплой е блокиран.", + "de": "Nightly-Gate fehlgeschlagen — Staging-Deploy blockiert.", + "en": "Nightly gate failed — staging deploy blocked.", + "pl": "Brama nightly nie powiodła się — wdrożenie staging zablokowane.", + "ru": "Nightly-проверка не пройдена — деплой на staging заблокирован.", + "zh": "Nightly 门禁失败——staging 部署已阻止。" + }, + "No CI checks found for commit {sha}.": { + "bg": "Не са намерени CI проверки за комит {sha}.", + "de": "Keine CI-Checks für Commit {sha} gefunden.", + "en": "No CI checks found for commit {sha}.", + "pl": "Nie znaleziono kontroli CI dla commita {sha}.", + "ru": "CI-проверки для коммита {sha} не найдены.", + "zh": "未找到提交 {sha} 的 CI 检查。" + }, + "No Python package found under src/ — skipping version check.": { + "bg": "", + "de": "", + "en": "No Python package found under src/ — skipping version check.", + "pl": "", + "ru": "", + "zh": "" + }, + "No REQ-ID lines found. Each requirement must be labeled (e.g., 'REQ-1: ').": { + "bg": "Не са намерени REQ-ID редове. Всяко изискване трябва да е означено (напр. 'REQ-1: <описание>').", + "de": "Keine REQ-ID-Zeilen gefunden. Jede Anforderung muss gekennzeichnet sein (z. B. 'REQ-1: ').", + "en": "No REQ-ID lines found. Each requirement must be labeled (e.g., 'REQ-1: ').", + "pl": "Nie znaleziono wierszy REQ-ID. Każde wymaganie musi być oznaczone (np. 'REQ-1: ').", + "ru": "Строки REQ-ID не найдены. Каждое требование должно быть помечено (напр. 'REQ-1: <описание>').", + "zh": "未找到 REQ-ID 行。每个需求必须标记(例如 'REQ-1: <描述>')。" + }, + "No badge SVG files generated": { + "bg": "Не са генерирани SVG файлове със значки", + "de": "Keine Badge-SVG-Dateien generiert", + "en": "No badge SVG files generated", + "pl": "Nie wygenerowano plików SVG odznak", + "ru": "SVG-файлы значков не сгенерированы", + "zh": "未生成徽章 SVG 文件" + }, + "No badge URLs found to update — README already up to date": { + "bg": "Не са намерени URL на значки за обновяване — README вече е актуално", + "de": "Keine Badge-URLs zum Aktualisieren gefunden — README bereits aktuell", + "en": "No badge URLs found to update — README already up to date", + "pl": "Nie znaleziono URL-i odznak do aktualizacji — README już aktualne", + "ru": "URL значков для обновления не найдены — README уже актуален", + "zh": "未找到需要更新的徽章 URL——README 已是最新" + }, + "No badge changes — skipping commit": { + "bg": "", + "de": "", + "en": "No badge changes — skipping commit", + "pl": "", + "ru": "", + "zh": "" + }, + "No changes between {base} and {head}.": { + "bg": "Няма промени между {base} и {head}.", + "de": "Keine Änderungen zwischen {base} und {head}.", + "en": "No changes between {base} and {head}.", + "pl": "Brak zmian między {base} i {head}.", + "ru": "Нет изменений между {base} и {head}.", + "zh": "{base} 和 {head} 之间没有更改。" + }, + "No changes to sync — wiki is up to date.": { + "bg": "", + "de": "", + "en": "No changes to sync — wiki is up to date.", + "pl": "", + "ru": "", + "zh": "" + }, + "No failed jobs.": { + "bg": "Няма неуспешни задачи.", + "de": "Keine fehlgeschlagenen Jobs.", + "en": "No failed jobs.", + "pl": "Brak nieudanych zadań.", + "ru": "Нет неудавшихся задач.", + "zh": "没有失败的任务。" + }, + "No job matching '{job}' found.": { + "bg": "Не е намерена задача, съответстваща на '{job}'.", + "de": "Kein Job gefunden, der '{job}' entspricht.", + "en": "No job matching '{job}' found.", + "pl": "Nie znaleziono zadania pasującego do '{job}'.", + "ru": "Задача, соответствующая '{job}', не найдена.", + "zh": "未找到匹配 '{job}' 的任务。" + }, + "No jobs found for run #{run_id}.": { + "bg": "Не са намерени задачи за run #{run_id}.", + "de": "Keine Jobs für Lauf #{run_id} gefunden.", + "en": "No jobs found for run #{run_id}.", + "pl": "Nie znaleziono zadań dla przebiegu #{run_id}.", + "ru": "Задачи для запуска #{run_id} не найдены.", + "zh": "未找到运行 #{run_id} 的任务。" + }, + "No open PR found for branch '{branch}'.": { + "bg": "Не е намерен отворен PR за клон '{branch}'.", + "de": "Kein offener PR für Branch '{branch}' gefunden.", + "en": "No open PR found for branch '{branch}'.", + "pl": "Nie znaleziono otwartego PR dla gałęzi '{branch}'.", + "ru": "Открытый PR для ветки '{branch}' не найден.", + "zh": "未找到分支 '{branch}' 的开放 PR。" + }, + "No push needed (no changes or push failed).": { + "bg": "", + "de": "", + "en": "No push needed (no changes or push failed).", + "pl": "", + "ru": "", + "zh": "" + }, + "No spec file found for task {task_id} in {dir}/. Expected: {dir}/{task_id}.md": { + "bg": "Не е намерен spec файл за задача {task_id} в {dir}/. Очаква се: {dir}/{task_id}.md", + "de": "Keine Spec-Datei für Task {task_id} in {dir}/ gefunden. Erwartet: {dir}/{task_id}.md", + "en": "No spec file found for task {task_id} in {dir}/. Expected: {dir}/{task_id}.md", + "pl": "Nie znaleziono pliku spec dla zadania {task_id} w {dir}/. Oczekiwano: {dir}/{task_id}.md", + "ru": "Spec-файл для задачи {task_id} в {dir}/ не найден. Ожидается: {dir}/{task_id}.md", + "zh": "在 {dir}/ 中未找到任务 {task_id} 的规范文件。应为:{dir}/{task_id}.md" + }, + "No staged changes — version and changelog already up to date.": { + "bg": "Няма staged промени — версията и changelog вече са актуални.", + "de": "Keine gestagten Änderungen — Version und Changelog bereits aktuell.", + "en": "No staged changes — version and changelog already up to date.", + "pl": "Brak zmian w staging — wersja i changelog są już aktualne.", + "ru": "Нет staged-изменений — версия и changelog уже актуальны.", + "zh": "没有暂存的更改——版本和 changelog 已是最新。" + }, + "No tag found — skipping publish.": { + "bg": "Не е намерен таг — публикуването се пропуска.", + "de": "Kein Tag gefunden — Veröffentlichung wird übersprungen.", + "en": "No tag found — skipping publish.", + "pl": "Nie znaleziono tagu — pomijanie publikacji.", + "ru": "Тег не найден — публикация пропускается.", + "zh": "未找到标签——跳过发布。" + }, + "No tags found — treating all changes as user-facing.": { + "bg": "Не са намерени тагове — всички промени се третират като видими за потребителя.", + "de": "Keine Tags gefunden — alle Änderungen werden als nutzersichtbar behandelt.", + "en": "No tags found — treating all changes as user-facing.", + "pl": "Nie znaleziono tagów — traktowanie wszystkich zmian jako widocznych dla użytkownika.", + "ru": "Теги не найдены — все изменения считаются пользовательскими.", + "zh": "未找到标签——所有更改视为面向用户。" + }, + "No task ID ({prefix}-N) found in commit message: {msg}. Every non-infrastructure commit must have a task ID.": { + "bg": "Не е намерен task ID ({prefix}-N) в съобщението на комита: {msg}. Всеки неинфраструктурен комит трябва да има task ID.", + "de": "Keine Task-ID ({prefix}-N) in Commit-Nachricht gefunden: {msg}. Jeder Nicht-Infrastruktur-Commit muss eine Task-ID haben.", + "en": "No task ID ({prefix}-N) found in commit message: {msg}. Every non-infrastructure commit must have a task ID.", + "pl": "Nie znaleziono ID zadania ({prefix}-N) w wiadomości commit: {msg}. Każdy commit nie-infrastrukturalny musi mieć ID zadania.", + "ru": "В сообщении коммита не найден ID задачи ({prefix}-N): {msg}. Каждый неинфраструктурный коммит должен иметь ID задачи.", + "zh": "提交信息中未找到任务 ID({prefix}-N):{msg}。每个非基础设施提交必须有任务 ID。" + }, + "No task ID found in branch '{branch}'. Expected format: {prefix}-N-description.": { + "bg": "Не е намерен task ID в клон '{branch}'. Очакван формат: {prefix}-N-description.", + "de": "Keine Task-ID in Branch '{branch}' gefunden. Erwartetes Format: {prefix}-N-description.", + "en": "No task ID found in branch '{branch}'. Expected format: {prefix}-N-description.", + "pl": "Nie znaleziono ID zadania w gałęzi '{branch}'. Oczekiwany format: {prefix}-N-description.", + "ru": "ID задачи не найден в ветке '{branch}'. Ожидаемый формат: {prefix}-N-description.", + "zh": "分支 '{branch}' 中未找到任务 ID。预期格式:{prefix}-N-description。" + }, + "No task ID found in branch name '{branch}'. Expected format: -N-description.": { + "bg": "Не е намерен task ID в името на клона '{branch}'. Очакван формат: -N-description.", + "de": "Keine Task-ID im Branch-Namen '{branch}' gefunden. Erwartetes Format: -N-description.", + "en": "No task ID found in branch name '{branch}'. Expected format: -N-description.", + "pl": "Nie znaleziono ID zadania w nazwie gałęzi '{branch}'. Oczekiwany format: -N-description.", + "ru": "ID задачи не найден в имени ветки '{branch}'. Ожидаемый формат: -N-description.", + "zh": "分支名称 '{branch}' 中未找到任务 ID。预期格式:-N-description。" + }, + "No task ID found in branch name '{branch}'. Expected format: {prefix}-N-description.": { + "bg": "Не е намерен task ID в името на клона '{branch}'. Очакван формат: {prefix}-N-description.", + "de": "Keine Task-ID im Branch-Namen '{branch}' gefunden. Erwartetes Format: {prefix}-N-description.", + "en": "No task ID found in branch name '{branch}'. Expected format: {prefix}-N-description.", + "pl": "Nie znaleziono ID zadania w nazwie gałęzi '{branch}'. Oczekiwany format: {prefix}-N-description.", + "ru": "ID задачи не найден в имени ветки '{branch}'. Ожидаемый формат: {prefix}-N-description.", + "zh": "分支名称 '{branch}' 中未找到任务 ID。预期格式:{prefix}-N-description。" + }, + "No unreleased changes found. Nothing to release.": { + "bg": "Не са намерени непубликувани промени. Няма какво да се издаде.", + "de": "Keine unveröffentlichten Änderungen gefunden. Nichts zu veröffentlichen.", + "en": "No unreleased changes found. Nothing to release.", + "pl": "Nie znaleziono nieopublikowanych zmian. Nic do wydania.", + "ru": "Не найдено невыпущенных изменений. Нечего выпускать.", + "zh": "未找到未发布的更改。没有可发布的内容。" + }, + "No user-facing changes since {tag} — only workflow/infrastructure files changed. Skipping release.": { + "bg": "Няма видими за потребителя промени от {tag} — променени са само workflow/инфраструктурни файлове. Изданието се пропуска.", + "de": "Keine nutzersichtbaren Änderungen seit {tag} — nur Workflow-/Infrastrukturdateien geändert. Release wird übersprungen.", + "en": "No user-facing changes since {tag} — only workflow/infrastructure files changed. Skipping release.", + "pl": "Brak zmian widocznych dla użytkownika od {tag} — tylko pliki workflow/infrastruktury uległy zmianie. Pomijanie wydania.", + "ru": "Нет пользовательских изменений с {tag} — изменены только workflow/инфраструктурные файлы. Релиз пропускается.", + "zh": "自 {tag} 以来没有面向用户的更改——仅更改了工作流/基础设施文件。跳过发布。" + }, + "No versions found.": { + "bg": "Не са намерени версии.", + "de": "Keine Versionen gefunden.", + "en": "No versions found.", + "pl": "Nie znaleziono wersji.", + "ru": "Версии не найдены.", + "zh": "未找到版本。" + }, + "No workflow runs found for SHA {sha}.": { + "bg": "Не са намерени workflow runs за SHA {sha}.", + "de": "Keine Workflow-Läufe für SHA {sha} gefunden.", + "en": "No workflow runs found for SHA {sha}.", + "pl": "Nie znaleziono przebiegów workflow dla SHA {sha}.", + "ru": "Workflow-запуски для SHA {sha} не найдены.", + "zh": "未找到 SHA {sha} 的工作流运行。" + }, + "Nothing to push.": { + "bg": "Няма какво да се push-не.", + "de": "Nichts zu pushen.", + "en": "Nothing to push.", + "pl": "Nic do wypchnięcia.", + "ru": "Нечего отправлять.", + "zh": "没有可推送的内容。" + }, + "Only check staged files (for pre-commit)": { + "bg": "Проверява само staged файлове (за pre-commit)", + "de": "Nur gestagte Dateien prüfen (für Pre-Commit)", + "en": "Only check staged files (for pre-commit)", + "pl": "Sprawdza tylko pliki staged (dla pre-commit)", + "ru": "Проверять только staged-файлы (для pre-commit)", + "zh": "仅检查暂存文件(用于 pre-commit)" + }, + "Oops! Commit message must follow conventional commit format.\n Expected: : \n Got: {subject}\n Allowed types: feat, fix, chore, docs, style, refactor,\n perf, test, ci, build, deps, revert, BREAKING CHANGE": { + "bg": "Опа! Съобщението за commit трябва да следва конвенционален формат.\n Очаква се: : \n Получено: {subject}\n Разрешени типове: feat, fix, chore, docs, style, refactor,\n perf, test, ci, build, deps, revert, BREAKING CHANGE", + "de": "Ups! Commit-Nachricht muss dem konventionellen Commit-Format folgen.\n Erwartet: : \n Erhalten: {subject}\n Erlaubte Typen: feat, fix, chore, docs, style, refactor,\n perf, test, ci, build, deps, revert, BREAKING CHANGE", + "en": "Oops! Commit message must follow conventional commit format.\n Expected: : \n Got: {subject}\n Allowed types: feat, fix, chore, docs, style, refactor,\n perf, test, ci, build, deps, revert, BREAKING CHANGE", + "pl": "Ups! Wiadomość commit musi być w formacie conventional commit.\n Oczekiwano: : \n Otrzymano: {subject}\n Dozwolone typy: feat, fix, chore, docs, style, refactor,\n perf, test, ci, build, deps, revert, BREAKING CHANGE", + "ru": "Ой! Сообщение коммита должно соответствовать формату conventional commit.\n Ожидается: : \n Получено: {subject}\n Допустимые типы: feat, fix, chore, docs, style, refactor,\n perf, test, ci, build, deps, revert, BREAKING CHANGE", + "zh": "哎呀!提交消息必须遵循 conventional commit 格式。\n 预期格式: : \n 实际: {subject}\n 允许的类型: feat, fix, chore, docs, style, refactor,\n perf, test, ci, build, deps, revert, BREAKING CHANGE" + }, + "Oops! Do not include task ID ({prefix}-N) in feature branch commits.\n The task ID will be added automatically on merge via CI.": { + "bg": "Не включвайте task ID ({prefix}-N) в комитите на feature клони.\n Task ID се добавя автоматично при merge чрез CI.", + "de": "Task-ID ({prefix}-N) nicht in Feature-Branch-Commits aufnehmen.\n Die Task-ID wird beim Merge automatisch via CI hinzugefügt.", + "en": "Oops! Do not include task ID ({prefix}-N) in feature branch commits.\n The task ID will be added automatically on merge via CI.", + "pl": "Ups! Nie dołączaj ID zadania ({prefix}-N) w commitach gałęzi feature.\n ID zadania zostanie dodane automatycznie przy scaleniu przez CI.", + "ru": "Не включайте ID задачи ({prefix}-N) в коммиты feature-веток.\n ID задачи будет добавлен автоматически при merge через CI.", + "zh": "请勿在功能分支提交中包含任务 ID({prefix}-N)。\n 任务 ID 将在合并时由 CI 自动添加。" + }, + "Oops! Gitea PyPI registry publish failed:\n{stderr}": { + "bg": "Опа! Публикуването в Gitea PyPI registry неуспешно:\n{stderr}", + "de": "Ups! Veröffentlichung in der Gitea PyPI-Registry fehlgeschlagen:\n{stderr}", + "en": "Oops! Gitea PyPI registry publish failed:\n{stderr}", + "pl": "Ups! Publikacja w rejestrze Gitea PyPI nie powiodła się:\n{stderr}", + "ru": "Ой! Публикация в Gitea PyPI registry не удалась:\n{stderr}", + "zh": "哎呀!Gitea PyPI registry 发布失败:\n{stderr}" + }, + "Oops! Master branch commit must follow conventional format after task ID.\n Expected: {prefix}-N: : \n Got: {subject}": { + "bg": "Комитът на master клона трябва да следва conventional формата след task ID.\n Очаква се: {prefix}-N: : \n Получено: {subject}", + "de": "Master-Branch-Commits müssen nach der Task-ID dem Conventional-Format folgen.\n Erwartet: {prefix}-N: : \n Erhalten: {subject}", + "en": "Oops! Master branch commit must follow conventional format after task ID.\n Expected: {prefix}-N: : \n Got: {subject}", + "pl": "Ups! Commit gałęzi master musi być w formacie conventional po ID zadania.\n Oczekiwano: {prefix}-N: : \n Otrzymano: {subject}", + "ru": "Коммит ветки master должен следовать conventional-формату после ID задачи.\n Ожидается: {prefix}-N: : \n Получено: {subject}", + "zh": "master 分支提交必须在任务 ID 后遵循 conventional 格式。\n 预期:{prefix}-N: : \n 实际:{subject}" + }, + "Oops! Master branch commits must start with a task ID.\n Expected: {prefix}-N: \n Got: {subject}": { + "bg": "Комитите на master клона трябва да започват с task ID.\n Очаква се: {prefix}-N: \n Получено: {subject}", + "de": "Master-Branch-Commits müssen mit einer Task-ID beginnen.\n Erwartet: {prefix}-N: \n Erhalten: {subject}", + "en": "Oops! Master branch commits must start with a task ID.\n Expected: {prefix}-N: \n Got: {subject}", + "pl": "Ups! Commity gałęzi master muszą zaczynać się od ID zadania.\n Oczekiwano: {prefix}-N: \n Otrzymano: {subject}", + "ru": "Коммиты ветки master должны начинаться с ID задачи.\n Ожидается: {prefix}-N: \n Получено: {subject}", + "zh": "master 分支提交必须以任务 ID 开头。\n 预期:{prefix}-N: \n 实际:{subject}" + }, + "Oops! No task ID found in branch name '{branch}'. Branch names must include the task ID prefix (e.g., DEVX-31-fix-bug).": { + "bg": "Ой! Не е намерен ID на задача в името на клона '{branch}'. Имената на клонове трябва да включват префикса за ID на задача (напр. DEVX-31-fix-bug).", + "de": "Hoppla! Keine Task-ID im Branch-Namen '{branch}' gefunden. Branch-Namen müssen das Task-ID-Präfix enthalten (z.B. DEVX-31-fix-bug).", + "en": "Oops! No task ID found in branch name '{branch}'. Branch names must include the task ID prefix (e.g., DEVX-31-fix-bug).", + "pl": "Ups! Nie znaleziono ID zadania w nazwie gałęzi '{branch}'. Nazwy gałęzi muszą zawierać prefiks ID zadania (np., DEVX-31-fix-bug).", + "ru": "Ой! ID задачи не найден в имени ветки '{branch}'. Имена веток должны включать префикс ID задачи (например, DEVX-31-fix-bug).", + "zh": "哎呀!在分支名称 '{branch}' 中未找到任务 ID。分支名称必须包含任务 ID 前缀(例如 DEVX-31-fix-bug)。" + }, + "Oops! PR title must follow format '{prefix}-N: '.\n Expected: {task_id}: \n Got: {pr_title}": { + "bg": "Заглавието на PR трябва да следва формата '{prefix}-N: <заглавие на задачата>'.\n Очаква се: {task_id}: <заглавие на задачата>\n Получено: {pr_title}", + "de": "Der PR-Titel muss dem Format '{prefix}-N: ' folgen.\n Erwartet: {task_id}: \n Erhalten: {pr_title}", + "en": "Oops! PR title must follow format '{prefix}-N: '.\n Expected: {task_id}: \n Got: {pr_title}", + "pl": "Ups! Tytuł PR musi być w formacie '{prefix}-N: '.\n Oczekiwano: {task_id}: \n Otrzymano: {pr_title}", + "ru": "Заголовок PR должен соответствовать формату '{prefix}-N: <название задачи>'.\n Ожидается: {task_id}: <название задачи>\n Получено: {pr_title}", + "zh": "PR 标题必须遵循格式 '{prefix}-N: <任务标题>'。\n 预期:{task_id}: <任务标题>\n 实际:{pr_title}" + }, + "Oops! PR title task ID mismatch.\n Branch task ID: {task_id}\n PR title: {pr_title}": { + "bg": "Несъответствие на task ID в заглавието на PR.\n Task ID на клона: {task_id}\n Заглавие на PR: {pr_title}", + "de": "Task-ID des PR-Titels stimmt nicht überein.\n Branch-Task-ID: {task_id}\n PR-Titel: {pr_title}", + "en": "Oops! PR title task ID mismatch.\n Branch task ID: {task_id}\n PR title: {pr_title}", + "pl": "Ups! Niezgodność ID zadania w tytule PR.\n ID zadania z gałęzi: {task_id}\n Tytuł PR: {pr_title}", + "ru": "Несоответствие ID задачи в заголовке PR.\n ID задачи ветки: {task_id}\n Заголовок PR: {pr_title}", + "zh": "PR 标题任务 ID 不匹配。\n 分支任务 ID:{task_id}\n PR 标题: {pr_title}" + }, + "Oops! Package build failed:\n{stderr}": { + "bg": "Опа! Сборката на пакета неуспешна:\n{stderr}", + "de": "Ups! Paket-Build fehlgeschlagen:\n{stderr}", + "en": "Oops! Package build failed:\n{stderr}", + "pl": "Ups! Budowanie pakietu nie powiodło się:\n{stderr}", + "ru": "Ой! Сборка пакета не удалась:\n{stderr}", + "zh": "哎呀!包构建失败:\n{stderr}" + }, + "Oops! PyPI publish failed:\n{stderr}": { + "bg": "Опа! Публикуването в PyPI неуспешно:\n{stderr}", + "de": "Ups! PyPI-Veröffentlichung fehlgeschlagen:\n{stderr}", + "en": "Oops! PyPI publish failed:\n{stderr}", + "pl": "Ups! Publikacja PyPI nie powiodła się:\n{stderr}", + "ru": "Ой! Публикация в PyPI не удалась:\n{stderr}", + "zh": "哎呀!PyPI 发布失败:\n{stderr}" + }, + "PASS: All documentation checks passed!": { + "bg": "УСПЕХ: Всички проверки на документацията преминаха!", + "de": "ERFOLG: Alle Dokumentationsprüfungen bestanden!", + "en": "PASS: All documentation checks passed!", + "pl": "SUKCES: Wszystkie kontrole dokumentacji przeszły!", + "ru": "УСПЕШНО: Все проверки документации пройдены!", + "zh": "通过:所有文档检查均已通过!" + }, + "PR #{pr} rebased successfully. A new CI run will start automatically.\nIf auto-merge is enabled (ready-to-merge label), the next CI run\nwill attempt to merge this PR.": { + "bg": "PR #{pr} е rebase-нат успешно. Нов CI run ще стартира автоматично.\nАко auto-merge е включен (етикет ready-to-merge), следващият CI run\nще опита да слее този PR.", + "de": "PR #{pr} erfolgreich rebased. Ein neuer CI-Lauf startet automatisch.\nWenn Auto-Merge aktiviert ist (ready-to-merge-Label), versucht der nächste\nCI-Lauf, diesen PR zu mergen.", + "en": "PR #{pr} rebased successfully. A new CI run will start automatically.\nIf auto-merge is enabled (ready-to-merge label), the next CI run\nwill attempt to merge this PR.", + "pl": "PR #{pr} rebased pomyślnie. Nowy przebieg CI rozpocznie się automatycznie.\nJeśli auto-merge jest włączony (etykieta ready-to-merge), następny przebieg CI\nspróbuje połączyć ten PR.", + "ru": "PR #{pr} успешно rebased. Новый CI-запуск начнётся автоматически.\nЕсли auto-merge включён (метка ready-to-merge), следующий CI-запуск\nпопытается слить этот PR.", + "zh": "PR #{pr} rebase 成功。新的 CI 运行将自动开始。\n如果启用了自动合并(ready-to-merge 标签),下一次 CI 运行\n将尝试合并此 PR。" + }, + "PR already exists: #{index} — {url}": { + "bg": "PR вече съществува: #{index} — {url}", + "de": "PR existiert bereits: #{index} — {url}", + "en": "PR already exists: #{index} — {url}", + "pl": "PR już istnieje: #{index} — {url}", + "ru": "PR уже существует: #{index} — {url}", + "zh": "PR 已存在: #{index} — {url}" + }, + "PR has 'refactoring' label — size check bypassed.": { + "bg": "PR има етикет 'refactoring' — проверката за размер се заобикаля.", + "de": "PR hat 'refactoring'-Label — Größenprüfung umgangen.", + "en": "PR has 'refactoring' label — size check bypassed.", + "pl": "PR ma etykietę 'refactoring' — kontrola rozmiaru pominięta.", + "ru": "PR имеет метку 'refactoring' — проверка размера обойдена.", + "zh": "PR 带有 'refactoring' 标签——大小检查已绕过。" + }, + "PR has {file_count} files changed (max {max_files}). Excluded: {excluded_count} files.": { + "bg": "PR има {file_count} променени файла (макс. {max_files}). Изключени: {excluded_count} файла.", + "de": "PR hat {file_count} geänderte Dateien (max. {max_files}). Ausgeschlossen: {excluded_count} Dateien.", + "en": "PR has {file_count} files changed (max {max_files}). Excluded: {excluded_count} files.", + "pl": "PR ma {file_count} zmienionych plików (maks. {max_files}). Wykluczone: {excluded_count} plików.", + "ru": "PR содержит {file_count} изменённых файлов (макс. {max_files}). Исключено: {excluded_count} файлов.", + "zh": "PR 有 {file_count} 个文件更改(上限 {max_files})。已排除:{excluded_count} 个文件。" + }, + "PR has {line_count} lines changed (max {max_lines}). Excluded: {excluded_count} files.": { + "bg": "PR има {line_count} променени реда (макс. {max_lines}). Изключени: {excluded_count} файла.", + "de": "PR hat {line_count} geänderte Zeilen (max. {max_lines}). Ausgeschlossen: {excluded_count} Dateien.", + "en": "PR has {line_count} lines changed (max {max_lines}). Excluded: {excluded_count} files.", + "pl": "PR ma {line_count} zmienionych linii (maks. {max_lines}). Wykluczone: {excluded_count} plików.", + "ru": "PR содержит {line_count} изменённых строк (макс. {max_lines}). Исключено: {excluded_count} файлов.", + "zh": "PR 有 {line_count} 行更改(上限 {max_lines})。已排除:{excluded_count} 个文件。" + }, + "PR number (to fetch title from Gitea)": { + "bg": "Номер на PR (за извличане на заглавие от Gitea)", + "de": "PR-Nummer (zum Abrufen des Titels von Gitea)", + "en": "PR number (to fetch title from Gitea)", + "pl": "Numer PR (do pobrania tytułu z Gitea)", + "ru": "Номер PR (для получения заголовка из Gitea)", + "zh": "PR 编号(用于从 Gitea 获取标题)" + }, + "PR number for label check": { + "bg": "Номер на PR за проверка на етикети", + "de": "PR-Nummer für die Label-Prüfung", + "en": "PR number for label check", + "pl": "Numer PR do kontroli etykiet", + "ru": "Номер PR для проверки меток", + "zh": "用于标签检查的 PR 编号" + }, + "PR number must be an integer, got: {pr_number}": { + "bg": "Номерът на PR трябва да е цяло число, получено: {pr_number}", + "de": "PR-Nummer muss eine Ganzzahl sein, erhalten: {pr_number}", + "en": "PR number must be an integer, got: {pr_number}", + "pl": "Numer PR musi być liczbą całkowitą, otrzymano: {pr_number}", + "ru": "Номер PR должен быть целым числом, получено: {pr_number}", + "zh": "PR 编号必须是整数,实际得到:{pr_number}" + }, + "PR number to fix": { + "bg": "Номер на PR за коригиране", + "de": "Zu korrigierende PR-Nummer", + "en": "PR number to fix", + "pl": "Numer PR do poprawy", + "ru": "Номер PR для исправления", + "zh": "要修复的 PR 编号" + }, + "PR size OK: {file_count} files, {line_count} lines (max {max_files} files, {max_lines} lines).": { + "bg": "Размерът на PR е ОК: {file_count} файла, {line_count} реда (макс. {max_files} файла, {max_lines} реда).", + "de": "PR-Größe OK: {file_count} Dateien, {line_count} Zeilen (max. {max_files} Dateien, {max_lines} Zeilen).", + "en": "PR size OK: {file_count} files, {line_count} lines (max {max_files} files, {max_lines} lines).", + "pl": "Rozmiar PR OK: {file_count} plików, {line_count} linii (maks. {max_files} plików, {max_lines} linii).", + "ru": "Размер PR в норме: {file_count} файлов, {line_count} строк (макс. {max_files} файлов, {max_lines} строк).", + "zh": "PR 大小正常:{file_count} 个文件,{line_count} 行(上限 {max_files} 个文件,{max_lines} 行)。" + }, + "PR size check failed.": { + "bg": "Проверката на размера на PR се провали.", + "de": "PR-Größenprüfung fehlgeschlagen.", + "en": "PR size check failed.", + "pl": "Kontrola rozmiaru PR nie powiodła się.", + "ru": "Проверка размера PR не пройдена.", + "zh": "PR 大小检查失败。" + }, + "PR title (auto-fetched if --pr-number given)": { + "bg": "Заглавие на PR (извлича се автоматично, ако е зададен --pr-number)", + "de": "PR-Titel (wird automatisch abgerufen, wenn --pr-number angegeben)", + "en": "PR title (auto-fetched if --pr-number given)", + "pl": "Tytuł PR (pobierany automatycznie, gdy podano --pr-number)", + "ru": "Заголовок PR (извлекается автоматически при указании --pr-number)", + "zh": "PR 标题(提供 --pr-number 时自动获取)" + }, + "PR title does not match Vikunja task title.\n Expected: {expected}\n Got: {pr_title}": { + "bg": "Заглавието на PR не съвпада със заглавието на Vikunja задачата.\n Очаква се: {expected}\n Получено: {pr_title}", + "de": "PR-Titel stimmt nicht mit Vikunja-Task-Titel überein.\n Erwartet: {expected}\n Erhalten: {pr_title}", + "en": "PR title does not match Vikunja task title.\n Expected: {expected}\n Got: {pr_title}", + "pl": "Tytuł PR nie pasuje do tytułu zadania Vikunja.\n Oczekiwano: {expected}\n Otrzymano: {pr_title}", + "ru": "Заголовок PR не совпадает с названием задачи Vikunja.\n Ожидается: {expected}\n Получено: {pr_title}", + "zh": "PR 标题与 Vikunja 任务标题不匹配。\n 预期:{expected}\n 实际:{pr_title}" + }, + "PR title does not match Vikunja task title.\n Expected: {expected}\n Got: {title}": { + "bg": "Заглавието на PR не съвпада със заглавието на Vikunja задачата.\n Очаква се: {expected}\n Получено: {title}", + "de": "PR-Titel stimmt nicht mit Vikunja-Task-Titel überein.\n Erwartet: {expected}\n Erhalten: {title}", + "en": "PR title does not match Vikunja task title.\n Expected: {expected}\n Got: {title}", + "pl": "Tytuł PR nie zgadza się z tytułem zadania Vikunja.\n Oczekiwano: {expected}\n Otrzymano: {title}", + "ru": "Заголовок PR не совпадает с названием задачи Vikunja.\n Ожидается: {expected}\n Получено: {title}", + "zh": "PR 标题与 Vikunja 任务标题不匹配。\n 预期:{expected}\n 实际:{title}" + }, + "PR title must follow format '{prefix}-N: '.\n Got: {title}": { + "bg": "Заглавието на PR трябва да следва формата '{prefix}-N: <заглавие на задачата>'.\n Получено: {title}", + "de": "Der PR-Titel muss dem Format '{prefix}-N: ' folgen.\n Erhalten: {title}", + "en": "PR title must follow format '{prefix}-N: '.\n Got: {title}", + "pl": "Tytuł PR musi być w formacie '{prefix}-N: '.\n Otrzymano: {title}", + "ru": "Заголовок PR должен соответствовать формату '{prefix}-N: <название задачи>'.\n Получено: {title}", + "zh": "PR 标题必须遵循格式 '{prefix}-N: <任务标题>'。\n 实际:{title}" + }, + "PR title task ID mismatch.\n Branch task ID: {task_id}\n PR title: {title}": { + "bg": "Несъответствие на task ID в заглавието на PR.\n Task ID на клона: {task_id}\n Заглавие на PR: {title}", + "de": "Task-ID des PR-Titels stimmt nicht überein.\n Branch-Task-ID: {task_id}\n PR-Titel: {title}", + "en": "PR title task ID mismatch.\n Branch task ID: {task_id}\n PR title: {title}", + "pl": "Niezgodność ID zadania w tytule PR.\n ID zadania gałęzi: {task_id}\n Tytuł PR: {title}", + "ru": "Несоответствие ID задачи в заголовке PR.\n ID задачи ветки: {task_id}\n Заголовок PR: {title}", + "zh": "PR 标题任务 ID 不匹配。\n 分支任务 ID:{task_id}\n PR 标题: {title}" + }, + "PYPI_TOKEN not set and no registry URL configured — skipping PyPI publish. No worries, we'll just create the Gitea release.": { + "bg": "PYPI_TOKEN не е зададен и няма конфигуриран URL на registry — пропускаме публикуването в PyPI. Без притеснения, просто ще създадем Gitea release.", + "de": "PYPI_TOKEN nicht gesetzt und keine Registry-URL konfiguriert — PyPI-Veröffentlichung wird übersprungen. Keine Sorge, wir erstellen einfach das Gitea-Release.", + "en": "PYPI_TOKEN not set and no registry URL configured — skipping PyPI publish. No worries, we'll just create the Gitea release.", + "pl": "PYPI_TOKEN nie ustawiony i brak URL rejestru — pomijanie publikacji PyPI. Bez obaw, utworzymy tylko wydanie Gitea.", + "ru": "PYPI_TOKEN не задан и URL registry не настроен — пропускаем публикацию в PyPI. Не беспокойтесь, мы просто создадим Gitea release.", + "zh": "未设置 PYPI_TOKEN 且未配置 registry URL — 跳过 PyPI 发布。别担心,我们直接创建 Gitea release。" + }, + "Package name to bump (e.g., grm, sso-bridge)": { + "bg": "Име на пакет за увеличаване (напр. grm, sso-bridge)", + "de": "Zu erhöhender Paketname (z. B. grm, sso-bridge)", + "en": "Package name to bump (e.g., grm, sso-bridge)", + "pl": "Nazwa pakietu do podbicia (np. grm, sso-bridge)", + "ru": "Имя пакета для повышения (напр. grm, sso-bridge)", + "zh": "要升级的包名(例如 grm、sso-bridge)" + }, + "Package owner not specified. Use --owner or set [tool.devx] repo_owner.": { + "bg": "Собственикът на пакета не е зададен. Използвайте --owner или задайте [tool.devx] repo_owner.", + "de": "Paket-Eigentümer nicht angegeben. Verwenden Sie --owner oder setzen Sie [tool.devx] repo_owner.", + "en": "Package owner not specified. Use --owner or set [tool.devx] repo_owner.", + "pl": "Nie określono właściciela pakietu. Użyj --owner lub ustaw [tool.devx] repo_owner.", + "ru": "Владелец пакета не указан. Используйте --owner или задайте [tool.devx] repo_owner.", + "zh": "未指定包所有者。使用 --owner 或设置 [tool.devx] repo_owner。" + }, + "Package: {owner}/{name}": { + "bg": "Пакет: {owner}/{name}", + "de": "Paket: {owner}/{name}", + "en": "Package: {owner}/{name}", + "pl": "Pakiet: {owner}/{name}", + "ru": "Пакет: {owner}/{name}", + "zh": "包:{owner}/{name}" + }, + "Parsed owner={owner}, repo={repo} from DEVX_REPO_NAME": { + "bg": "Разбор на owner={owner}, repo={repo} от DEVX_REPO_NAME", + "de": "Owner={owner}, repo={repo} aus DEVX_REPO_NAME analysiert", + "en": "Parsed owner={owner}, repo={repo} from DEVX_REPO_NAME", + "pl": "Przeanalizowano owner={owner}, repo={repo} z DEVX_REPO_NAME", + "ru": "Извлечён owner={owner}, repo={repo} из DEVX_REPO_NAME", + "zh": "从 DEVX_REPO_NAME 解析 owner={owner}, repo={repo}" + }, + "Path to pyproject.toml (default: pyproject.toml in CWD).": { + "bg": "Път до pyproject.toml (по подразбиране: pyproject.toml в CWD).", + "de": "Pfad zu pyproject.toml (Standard: pyproject.toml im CWD).", + "en": "Path to pyproject.toml (default: pyproject.toml in CWD).", + "pl": "Ścieżka do pyproject.toml (domyślnie: pyproject.toml w CWD).", + "ru": "Путь к pyproject.toml (по умолчанию: pyproject.toml в CWD).", + "zh": "pyproject.toml 的路径(默认:CWD 中的 pyproject.toml)。" + }, + "Per-test speed check FAILED: {count} test(s) exceed {limit}s limit.": { + "bg": "Проверката за скорост на тест СЕ ПРОВАЛИ: {count} тест(а) надвишават лимита от {limit}s.", + "de": "Pro-Test-Geschwindigkeitsprüfung FEHLGESCHLAGEN: {count} Test(s) überschreiten das {limit}s-Limit.", + "en": "Per-test speed check FAILED: {count} test(s) exceed {limit}s limit.", + "pl": "Kontrola szybkości pojedynczego testu NIEUDANA: {count} test(ów) przekracza limit {limit}s.", + "ru": "Проверка скорости тестов ПРОВАЛЕНА: {count} тест(ов) превышают лимит {limit}s.", + "zh": "单测试速度检查失败:{count} 个测试超过 {limit}s 限制。" + }, + "Pre-merge validation failed.": { + "bg": "Предmerge валидацията се провали.", + "de": "Pre-Merge-Validierung fehlgeschlagen.", + "en": "Pre-merge validation failed.", + "pl": "Walidacja przed merge nie powiodła się.", + "ru": "Проверка перед слиянием не пройдена.", + "zh": "合并前验证失败。" + }, + "Pre-push check passed: task {task_id} exists.": { + "bg": "Pre-push проверката премина: задача {task_id} съществува.", + "de": "Pre-push-Prüfung bestanden: Task {task_id} existiert.", + "en": "Pre-push check passed: task {task_id} exists.", + "pl": "Sprawdzanie pre-push zakończone: zadanie {task_id} istnieje.", + "ru": "Pre-push проверка пройдена: задача {task_id} существует.", + "zh": "Pre-push 检查通过: 任务 {task_id} 存在。" + }, + "Print warnings but always exit 0": { + "bg": "Печатай предупреждения, но винаги излизай с код 0", + "de": "Warnungen ausgeben, aber immer mit 0 beenden", + "en": "Print warnings but always exit 0", + "pl": "Wypisuj ostrzeżenia, ale zawsze kończ kodem 0", + "ru": "Выводить предупреждения, но всегда завершать с кодом 0", + "zh": "打印警告但始终以 0 退出" + }, + "Provide --manifest or both --dockerfile and --name": { + "bg": "Задайте --manifest или и --dockerfile, и --name", + "de": "--manifest oder sowohl --dockerfile als auch --name angeben", + "en": "Provide --manifest or both --dockerfile and --name", + "pl": "Podaj --manifest lub zarówno --dockerfile, jak i --name", + "ru": "Укажите --manifest или оба --dockerfile и --name", + "zh": "提供 --manifest 或同时提供 --dockerfile 和 --name" + }, + "Provide a commit message file or use --git.": { + "bg": "Предоставете файл със съобщение на комит или използвайте --git.", + "de": "Commit-Nachrichtendatei bereitstellen oder --git verwenden.", + "en": "Provide a commit message file or use --git.", + "pl": "Podaj plik komunikatu commitu lub użyj --git.", + "ru": "Укажите файл с сообщением коммита или используйте --git.", + "zh": "提供提交信息文件或使用 --git。" + }, + "Published to Gitea PyPI registry.": { + "bg": "Публикувано в Gitea PyPI registry.", + "de": "In der Gitea PyPI-Registry veröffentlicht.", + "en": "Published to Gitea PyPI registry.", + "pl": "Opublikowano w rejestrze Gitea PyPI.", + "ru": "Опубликовано в Gitea PyPI registry.", + "zh": "已发布到 Gitea PyPI registry。" + }, + "Published to PyPI.": { + "bg": "Публикувано в PyPI.", + "de": "In PyPI veröffentlicht.", + "en": "Published to PyPI.", + "pl": "Opublikowano w PyPI.", + "ru": "Опубликовано в PyPI.", + "zh": "已发布到 PyPI。" + }, + "Publishing release {tag}...": { + "bg": "Публикуване на версия {tag}...", + "de": "Veröffentliche Release {tag}...", + "en": "Publishing release {tag}...", + "pl": "Publikowanie wydania {tag}...", + "ru": "Публикация релиза {tag}...", + "zh": "正在发布 {tag}..." + }, + "Push attempt {n}/3 failed: {err}": { + "bg": "Опит {n}/3 за push се провали: {err}", + "de": "Push-Versuch {n}/3 fehlgeschlagen: {err}", + "en": "Push attempt {n}/3 failed: {err}", + "pl": "Próba {n}/3 push nie powiodła się: {err}", + "ru": "Попытка {n}/3 push не удалась: {err}", + "zh": "推送尝试 {n}/3 失败:{err}" + }, + "Push failed for {tag}: {error}": { + "bg": "Push за {tag} се провали: {error}", + "de": "Push für {tag} fehlgeschlagen: {error}", + "en": "Push failed for {tag}: {error}", + "pl": "Push dla {tag} nie powiódł się: {error}", + "ru": "Push для {tag} не удался: {error}", + "zh": "推送 {tag} 失败:{error}" + }, + "Push failed: {error}": { + "bg": "", + "de": "", + "en": "Push failed: {error}", + "pl": "", + "ru": "", + "zh": "" + }, + "Pushed README update with badge SHA {sha}": { + "bg": "Push-ната е README актуализация със SHA на значката {sha}", + "de": "README-Update mit Badge-SHA {sha} gepusht", + "en": "Pushed README update with badge SHA {sha}", + "pl": "Wypchnięto aktualizację README z SHA odznaki {sha}", + "ru": "Отправлено обновление README с SHA значка {sha}", + "zh": "已推送带徽章 SHA {sha} 的 README 更新" + }, + "Pushed release commit to master.": { + "bg": "Release комитът е push-нат към master.", + "de": "Release-Commit zu master gepusht.", + "en": "Pushed release commit to master.", + "pl": "Wypchnięto commit wydania do master.", + "ru": "Релизный коммит отправлен в master.", + "zh": "发布提交已推送到 master。" + }, + "Pushed {branch} to origin.": { + "bg": "Клонът {branch} е push-нат към origin.", + "de": "{branch} zu origin gepusht.", + "en": "Pushed {branch} to origin.", + "pl": "Wypchnięto {branch} do origin.", + "ru": "Ветка {branch} отправлена в origin.", + "zh": "已将 {branch} 推送到 origin。" + }, + "PyPI publish failed (non-fatal — continuing to Gitea release):\n{error}": { + "bg": "Публикуването в PyPI неуспешно (некритично — продължава към Gitea release):\n{error}", + "de": "PyPI-Veröffentlichung fehlgeschlagen (nicht fatal — Gitea-Release wird fortgesetzt):\n{error}", + "en": "PyPI publish failed (non-fatal — continuing to Gitea release):\n{error}", + "pl": "Publikacja PyPI nie powiodła się (niekrytyczne — kontynuacja Gitea release):\n{error}", + "ru": "Публикация в PyPI не удалась (некритично — продолжаем создание Gitea release):\n{error}", + "zh": "PyPI 发布失败(非致命 — 继续创建 Gitea release):\n{error}" + }, + "REPO argument is required (or set GITHUB_REPOSITORY env var).": { + "bg": "Аргументът REPO е задължителен (или задайте променливата GITHUB_REPOSITORY).", + "de": "REPO-Argument ist erforderlich (oder GITHUB_REPOSITORY-Umgebungsvariable setzen).", + "en": "REPO argument is required (or set GITHUB_REPOSITORY env var).", + "pl": "Argument REPO jest wymagany (lub ustaw zmienną GITHUB_REPOSITORY).", + "ru": "Аргумент REPO обязателен (или задайте переменную окружения GITHUB_REPOSITORY).", + "zh": "REPO 参数是必需的(或设置 GITHUB_REPOSITORY 环境变量)。" + }, + "Real subprocess call(s) detected in test '{test}' without @patch:": { + "bg": "Открити реални subprocess извиквания в тест '{test}' без @patch:", + "de": "Echte subprocess-Aufrufe in Test '{test}' ohne @patch erkannt:", + "en": "Real subprocess call(s) detected in test '{test}' without @patch:", + "pl": "Wykryto prawdziwe wywołania subprocess w teście '{test}' bez @patch:", + "ru": "Обнаружены реальные вызовы subprocess в тесте '{test}' без @patch:", + "zh": "在测试 '{test}' 中检测到未经 @patch 的真实 subprocess 调用:" + }, + "Rebase attempt {n}/3 failed: {err}": { + "bg": "Опит {n}/3 за rebase се провали: {err}", + "de": "Rebase-Versuch {n}/3 fehlgeschlagen: {err}", + "en": "Rebase attempt {n}/3 failed: {err}", + "pl": "Próba {n}/3 rebase nie powiodła się: {err}", + "ru": "Попытка {n}/3 rebase не удалась: {err}", + "zh": "Rebase 尝试 {n}/3 失败:{err}" + }, + "Rebase failed (conflicts or other error):\n{error}\nResolve conflicts and run: git rebase --continue": { + "bg": "Rebase се провали (конфликти или друга грешка):\n{error}\nРазрешете конфликтите и изпълнете: git rebase --continue", + "de": "Rebase fehlgeschlagen (Konflikte oder anderer Fehler):\n{error}\nKonflikte lösen und ausführen: git rebase --continue", + "en": "Rebase failed (conflicts or other error):\n{error}\nResolve conflicts and run: git rebase --continue", + "pl": "Rebase nie powiódł się (konflikty lub inny błąd):\n{error}\nRozwiąż konflikty i uruchom: git rebase --continue", + "ru": "Rebase не удался (конфликты или другая ошибка):\n{error}\nРазрешите конфликты и выполните: git rebase --continue", + "zh": "Rebase 失败(冲突或其他错误):\n{error}\n解决冲突并运行:git rebase --continue" + }, + "Rebase failed with HTTP {status}: {message}": { + "bg": "Rebase се провали с HTTP {status}: {message}", + "de": "Rebase mit HTTP {status} fehlgeschlagen: {message}", + "en": "Rebase failed with HTTP {status}: {message}", + "pl": "Rebase nie powiódł się z HTTP {status}: {message}", + "ru": "Rebase завершился с HTTP {status}: {message}", + "zh": "Rebase 失败,HTTP {status}:{message}" + }, + "Rebase successful.": { + "bg": "Rebase успешен.", + "de": "Rebase erfolgreich.", + "en": "Rebase successful.", + "pl": "Rebase powiódł się.", + "ru": "Rebase успешен.", + "zh": "Rebase 成功。" + }, + "Rebasing PR #{pr} via Gitea API...": { + "bg": "Rebase на PR #{pr} чрез Gitea API...", + "de": "Rebase von PR #{pr} via Gitea API...", + "en": "Rebasing PR #{pr} via Gitea API...", + "pl": "Rebase PR #{pr} przez Gitea API...", + "ru": "Rebase PR #{pr} через Gitea API...", + "zh": "正在通过 Gitea API 对 PR #{pr} 执行 rebase..." + }, + "Registry credentials required: set CI_GITEA_TOKEN and CI_GITEA_USERNAME env vars": { + "bg": "Изискват се идентификационни данни за регистъра: задайте променливите CI_GITEA_TOKEN и CI_GITEA_USERNAME", + "de": "Registry-Anmeldedaten erforderlich: Umgebungsvariablen CI_GITEA_TOKEN und CI_GITEA_USERNAME setzen", + "en": "Registry credentials required: set CI_GITEA_TOKEN and CI_GITEA_USERNAME env vars", + "pl": "Wymagane dane uwierzytelniające rejestru: ustaw zmienne CI_GITEA_TOKEN i CI_GITEA_USERNAME", + "ru": "Требуются учётные данные реестра: задайте переменные окружения CI_GITEA_TOKEN и CI_GITEA_USERNAME", + "zh": "需要注册表凭据:设置环境变量 CI_GITEA_TOKEN 和 CI_GITEA_USERNAME" + }, + "Registry login failed": { + "bg": "Входът в регистъра се провали", + "de": "Registry-Login fehlgeschlagen", + "en": "Registry login failed", + "pl": "Logowanie do rejestru nie powiodło się", + "ru": "Вход в реестр не удался", + "zh": "注册表登录失败" + }, + "Registry login failed: {error}": { + "bg": "Входът в регистъра се провали: {error}", + "de": "Registry-Login fehlgeschlagen: {error}", + "en": "Registry login failed: {error}", + "pl": "Logowanie do rejestru nie powiodło się: {error}", + "ru": "Вход в реестр не удался: {error}", + "zh": "注册表登录失败:{error}" + }, + "Regular merge commit — running all post-merge jobs.": { + "bg": "Обикновен merge комит — изпълняват се всички post-merge задачи.", + "de": "Regulärer Merge-Commit — alle Post-Merge-Jobs werden ausgeführt.", + "en": "Regular merge commit — running all post-merge jobs.", + "pl": "Zwykły commit merge — uruchamianie wszystkich zadań post-merge.", + "ru": "Обычный merge-коммит — выполняются все post-merge задачи.", + "zh": "常规合并提交——运行所有合并后任务。" + }, + "Release commit — skipping all post-merge jobs.": { + "bg": "Release комит — всички post-merge задачи се пропускат.", + "de": "Release-Commit — alle Post-Merge-Jobs werden übersprungen.", + "en": "Release commit — skipping all post-merge jobs.", + "pl": "Commit release — pomijanie wszystkich zadań post-merge.", + "ru": "Релизный коммит — все post-merge задачи пропускаются.", + "zh": "发布提交——跳过所有合并后任务。" + }, + "Release creation failed: {error}": { + "bg": "Създаването на версия се провали: {error}", + "de": "Release-Erstellung fehlgeschlagen: {error}", + "en": "Release creation failed: {error}", + "pl": "Tworzenie wydania nie powiodło się: {error}", + "ru": "Создание релиза не удалось: {error}", + "zh": "创建发布失败:{error}" + }, + "Release must be run on master, currently on '{branch}'.": { + "bg": "Release трябва да се изпълнява на master, в момента сте на '{branch}'.", + "de": "Release muss auf master ausgeführt werden, aktuell auf '{branch}'.", + "en": "Release must be run on master, currently on '{branch}'.", + "pl": "Wydanie musi być uruchomione na master, obecnie na '{branch}'.", + "ru": "Релиз должен выполняться на master, сейчас на '{branch}'.", + "zh": "发布必须在 master 上运行,当前在 '{branch}'。" + }, + "Repo (owner/name) for label check": { + "bg": "Репозитори (owner/name) за проверка на етикети", + "de": "Repo (owner/name) für die Label-Prüfung", + "en": "Repo (owner/name) for label check", + "pl": "Repo (owner/name) do kontroli etykiet", + "ru": "Репозиторий (owner/name) для проверки меток", + "zh": "用于标签检查的仓库(owner/name)" + }, + "Repo must be in 'owner/name' format, got: {repo}": { + "bg": "Репозиторият трябва да е във формат 'owner/name', получено: {repo}", + "de": "Repo muss im Format 'owner/name' sein, erhalten: {repo}", + "en": "Repo must be in 'owner/name' format, got: {repo}", + "pl": "Repo musi być w formacie 'owner/name', otrzymano: {repo}", + "ru": "Репозиторий должен быть в формате 'owner/name', получено: {repo}", + "zh": "仓库必须为 'owner/name' 格式,实际为:{repo}" + }, + "Repository configuration complete.": { + "bg": "Конфигурирането на хранилището е завършено.", + "de": "Repository-Konfiguration abgeschlossen.", + "en": "Repository configuration complete.", + "pl": "Konfiguracja repozytorium zakończona.", + "ru": "Конфигурация репозитория завершена.", + "zh": "仓库配置完成。" + }, + "Repository in owner/name format": { + "bg": "Репозитория във формат owner/name", + "de": "Repository im Format owner/name", + "en": "Repository in owner/name format", + "pl": "Repozytorium w formacie owner/name", + "ru": "Репозиторий в формате owner/name", + "zh": "owner/name 格式的仓库" + }, + "Repository name not set. Use DEVX_REPO_NAME, [tool.devx] repo_name, or GITHUB_REPOSITORY env var.": { + "bg": "Името на репозитория не е зададено. Използвайте DEVX_REPO_NAME, [tool.devx] repo_name или променливата GITHUB_REPOSITORY.", + "de": "Repository-Name nicht gesetzt. Verwenden Sie DEVX_REPO_NAME, [tool.devx] repo_name oder die Umgebungsvariable GITHUB_REPOSITORY.", + "en": "Repository name not set. Use DEVX_REPO_NAME, [tool.devx] repo_name, or GITHUB_REPOSITORY env var.", + "pl": "Nazwa repozytorium nie jest ustawiona. Użyj DEVX_REPO_NAME, [tool.devx] repo_name lub zmiennej GITHUB_REPOSITORY.", + "ru": "Имя репозитория не задано. Используйте DEVX_REPO_NAME, [tool.devx] repo_name или переменную окружения GITHUB_REPOSITORY.", + "zh": "未设置仓库名称。使用 DEVX_REPO_NAME、[tool.devx] repo_name 或 GITHUB_REPOSITORY 环境变量。" + }, + "Repository owner not set. Use --owner or DEVX_REPO_OWNER env var.": { + "bg": "Собственикът на хранилището не е зададен. Използвайте --owner или DEVX_REPO_OWNER env var.", + "de": "Repository-Owner nicht gesetzt. Verwende --owner oder DEVX_REPO_OWNER env var.", + "en": "Repository owner not set. Use --owner or DEVX_REPO_OWNER env var.", + "pl": "Właściciel repozytorium nie jest ustawiony. Użyj --owner lub DEVX_REPO_OWNER env var.", + "ru": "Владелец репозитория не установлен. Используйте --owner или DEVX_REPO_OWNER env var.", + "zh": "仓库所有者未设置。使用 --owner 或 DEVX_REPO_OWNER 环境变量。" + }, + "Required tools missing.": { + "bg": "Липсват задължителни инструменти.", + "de": "Erforderliche Werkzeuge fehlen.", + "en": "Required tools missing.", + "pl": "Brak wymaganych narzędzi.", + "ru": "Отсутствуют обязательные инструменты.", + "zh": "缺少必需的工具。" + }, + "Roles directory not found: {path}": { + "bg": "Директорията с роли не е намерена: {path}", + "de": "Rollenverzeichnis nicht gefunden: {path}", + "en": "Roles directory not found: {path}", + "pl": "Katalog ról nie znaleziony: {path}", + "ru": "Директория ролей не найдена: {path}", + "zh": "未找到角色目录:{path}" + }, + "Runner count: {count}": { + "bg": "Брой раннъри: {count}", + "de": "Runner-Anzahl: {count}", + "en": "Runner count: {count}", + "pl": "Liczba runnerów: {count}", + "ru": "Количество раннеров: {count}", + "zh": "Runner 数量:{count}" + }, + "Runner index {index} out of range (0..{max})": { + "bg": "Индексът на runner {index} е извън диапазона (0..{max})", + "de": "Runner-Index {index} außerhalb des Bereichs (0..{max})", + "en": "Runner index {index} out of range (0..{max})", + "pl": "Indeks runnera {index} poza zakresem (0..{max})", + "ru": "Индекс runner {index} вне диапазона (0..{max})", + "zh": "Runner 索引 {index} 超出范围 (0..{max})" + }, + "Runner index {runner_index} is out of range (must be >= 1)": { + "bg": "Индексът на runner {runner_index} е извън обхват (трябва да е >= 1)", + "de": "Runner-Index {runner_index} außerhalb des Bereichs (muss >= 1 sein)", + "en": "Runner index {runner_index} is out of range (must be >= 1)", + "pl": "Indeks runnera {runner_index} poza zakresem (musi być >= 1)", + "ru": "Индекс раннера {runner_index} вне диапазона (должен быть >= 1)", + "zh": "Runner 索引 {runner_index} 超出范围(必须 >= 1)" + }, + "Runner indices: {indices}": { + "bg": "Индекси на раннъри: {indices}", + "de": "Runner-Indizes: {indices}", + "en": "Runner indices: {indices}", + "pl": "Indeksy runnerów: {indices}", + "ru": "Индексы раннеров: {indices}", + "zh": "Runner 索引:{indices}" + }, + "Runner {i}: {labels}": { + "bg": "Раннер {i}: {labels}", + "de": "Runner {i}: {labels}", + "en": "Runner {i}: {labels}", + "pl": "Runner {i}: {labels}", + "ru": "Раннер {i}: {labels}", + "zh": "Runner {i}:{labels}" + }, + "Running lint checks...": { + "bg": "Изпълнение на lint проверки...", + "de": "Lint-Checks laufen...", + "en": "Running lint checks...", + "pl": "Uruchamianie kontroli lint...", + "ru": "Выполнение проверок lint...", + "zh": "正在运行 lint 检查..." + }, + "Running tests...": { + "bg": "Изпълнение на тестове...", + "de": "Tests laufen...", + "en": "Running tests...", + "pl": "Uruchamianie testów...", + "ru": "Выполнение тестов...", + "zh": "正在运行测试..." + }, + "Running: {cmd}": { + "bg": "Изпълнение: {cmd}", + "de": "Ausführen: {cmd}", + "en": "Running: {cmd}", + "pl": "Uruchamianie: {cmd}", + "ru": "Выполнение: {cmd}", + "zh": "运行中:{cmd}" + }, + "SSH key set up successfully": { + "bg": "SSH ключът е настроен успешно", + "de": "SSH-Schlüssel erfolgreich eingerichtet", + "en": "SSH key set up successfully", + "pl": "Klucz SSH skonfigurowany pomyślnie", + "ru": "SSH-ключ успешно настроен", + "zh": "SSH 密钥设置成功" + }, + "SSH key setup skipped (no key provided)": { + "bg": "Настройката на SSH ключ е пропусната (не е предоставен ключ)", + "de": "SSH-Schlüssel-Setup übersprungen (kein Schlüssel bereitgestellt)", + "en": "SSH key setup skipped (no key provided)", + "pl": "Pominięto konfigurację klucza SSH (brak klucza)", + "ru": "Настройка SSH-ключа пропущена (ключ не предоставлен)", + "zh": "SSH 密钥设置已跳过(未提供密钥)" + }, + "SSH_PRIVATE_KEY not set — skipping SSH key setup": { + "bg": "SSH_PRIVATE_KEY не е зададен — пропускане на SSH ключ настройката", + "de": "SSH_PRIVATE_KEY nicht gesetzt — SSH-Schlüssel-Setup übersprungen", + "en": "SSH_PRIVATE_KEY not set — skipping SSH key setup", + "pl": "SSH_PRIVATE_KEY nie ustawione — pomijanie konfiguracji klucza SSH", + "ru": "SSH_PRIVATE_KEY не задан — пропуск настройки SSH-ключа", + "zh": "SSH_PRIVATE_KEY 未设置 — 跳过 SSH 密钥设置" + }, + "Show what would be done without creating PR": { + "bg": "Покажи какво би било направено без създаване на PR", + "de": "Zeigen, was getan würde, ohne PR zu erstellen", + "en": "Show what would be done without creating PR", + "pl": "Pokaż, co zostałoby zrobione bez tworzenia PR", + "ru": "Показать, что было бы сделано без создания PR", + "zh": "显示将要执行的操作而不创建 PR" + }, + "Show what would change without updating": { + "bg": "Покажи какво би се променило без обновяване", + "de": "Zeigen, was sich ändern würde, ohne zu aktualisieren", + "en": "Show what would change without updating", + "pl": "Pokaż, co by się zmieniło bez aktualizacji", + "ru": "Показать, что изменилось бы без обновления", + "zh": "显示将要更改的内容而不更新" + }, + "Single platform to test against": { + "bg": "Единна платформа за тестване", + "de": "Einzelne Plattform zum Testen", + "en": "Single platform to test against", + "pl": "Pojedyncza platforma do testowania", + "ru": "Единая платформа для тестирования", + "zh": "用于测试的单一平台" + }, + "Skip Vikunja title match check": { + "bg": "Пропусни проверката за съвпадение на заглавието с Vikunja", + "de": "Vikunja-Titelübereinstimmungsprüfung überspringen", + "en": "Skip Vikunja title match check", + "pl": "Pomiń kontrolę zgodności tytułu z Vikunja", + "ru": "Пропустить проверку совпадения заголовка с Vikunja", + "zh": "跳过 Vikunja 标题匹配检查" + }, + "Skip branch-behind-master check": { + "bg": "Пропусни проверката дали клонът изостава от master", + "de": "Prüfung „Branch hinter master“ überspringen", + "en": "Skip branch-behind-master check", + "pl": "Pomiń kontrolę czy gałąź jest za master", + "ru": "Пропустить проверку отставания ветки от master", + "zh": "跳过分支落后于 master 的检查" + }, + "Skipping commit push — no staged changes.": { + "bg": "Пропуска се push на комита — няма staged промени.", + "de": "Commit-Push wird übersprungen — keine gestagten Änderungen.", + "en": "Skipping commit push — no staged changes.", + "pl": "Pomijanie wypchnięcia commit — brak zmian w staging.", + "ru": "Push коммита пропускается — нет staged-изменений.", + "zh": "跳过提交推送——没有暂存的更改。" + }, + "Skipping — runner index {runner_index} > max runners {max_runners}": { + "bg": "Пропуска се — индекс на runner {runner_index} > максимум раннъри {max_runners}", + "de": "Übersprungen — Runner-Index {runner_index} > max. Runner {max_runners}", + "en": "Skipping — runner index {runner_index} > max runners {max_runners}", + "pl": "Pomijanie — indeks runnera {runner_index} > maks. runnerów {max_runners}", + "ru": "Пропускается — индекс раннера {runner_index} > макс. раннеров {max_runners}", + "zh": "跳过——runner 索引 {runner_index} > 最大 runner 数 {max_runners}" + }, + "Source repo that published (owner/name)": { + "bg": "Изходно репозитори, което е публикувало (owner/name)", + "de": "Quell-Repo, das veröffentlicht hat (owner/name)", + "en": "Source repo that published (owner/name)", + "pl": "Repozytorium źródłowe, które opublikowało (owner/name)", + "ru": "Исходный репозиторий, выполнивший публикацию (owner/name)", + "zh": "已发布的源仓库(owner/name)" + }, + "Spec validation failed.": { + "bg": "Валидацията на spec се провали.", + "de": "Spec-Validierung fehlgeschlagen.", + "en": "Spec validation failed.", + "pl": "Walidacja spec nie powiodła się.", + "ru": "Проверка spec не пройдена.", + "zh": "规范验证失败。" + }, + "Synced to latest origin/{branch}": { + "bg": "Синхронизирано към последния origin/{branch}", + "de": "Mit neuestem origin/{branch} synchronisiert", + "en": "Synced to latest origin/{branch}", + "pl": "Zsynchronizowano z najnowszym origin/{branch}", + "ru": "Синхронизировано с последним origin/{branch}", + "zh": "已同步到最新的 origin/{branch}" + }, + "Syncing files...": { + "bg": "", + "de": "", + "en": "Syncing files...", + "pl": "", + "ru": "", + "zh": "" + }, + "Syncing {count} documentation pages to wiki via Git...": { + "bg": "", + "de": "", + "en": "Syncing {count} documentation pages to wiki via Git...", + "pl": "", + "ru": "", + "zh": "" + }, + "Tag consistency check failed.": { + "bg": "Проверката за консистентност на таговете се провали.", + "de": "Tag-Konsistenzprüfung fehlgeschlagen.", + "en": "Tag consistency check failed.", + "pl": "Kontrola zgodności tagów nie powiodła się.", + "ru": "Проверка согласованности тегов не пройдена.", + "zh": "标签一致性检查失败。" + }, + "Tag is required (or use --from-tag).": { + "bg": "Тагът е задължителен (или използвайте --from-tag).", + "de": "Tag ist erforderlich (oder --from-tag verwenden).", + "en": "Tag is required (or use --from-tag).", + "pl": "Tag jest wymagany (lub użyj --from-tag).", + "ru": "Тег обязателен (или используйте --from-tag).", + "zh": "标签是必需的(或使用 --from-tag)。" + }, + "Tag v{version} already existed. Publish workflow should already have been triggered.": { + "bg": "Тагът v{version} вече съществува. Workflow-ът за публикуване вече трябва да е задействан.", + "de": "Tag v{version} existierte bereits. Der Publish-Workflow sollte bereits ausgelöst worden sein.", + "en": "Tag v{version} already existed. Publish workflow should already have been triggered.", + "pl": "Tag v{version} już istniał. Workflow publikacji powinien już być uruchomiony.", + "ru": "Тег v{version} уже существует. Workflow публикации уже должен был быть запущен.", + "zh": "标签 v{version} 已存在。发布工作流应已被触发。" + }, + "Tag {tag} already exists and points to HEAD. Skipping creation.": { + "bg": "Тагът {tag} вече съществува и сочи към HEAD. Създаването се пропуска.", + "de": "Tag {tag} existiert bereits und zeigt auf HEAD. Erstellung wird übersprungen.", + "en": "Tag {tag} already exists and points to HEAD. Skipping creation.", + "pl": "Tag {tag} już istnieje i wskazuje na HEAD. Pomijanie tworzenia.", + "ru": "Тег {tag} уже существует и указывает на HEAD. Создание пропускается.", + "zh": "标签 {tag} 已存在且指向 HEAD。跳过创建。" + }, + "Tag {tag} already exists but points to {tag_commit} (expected HEAD {head_commit}). This indicates a tag/commit misalignment. Run 'python3 -m devx.ci.release --verify' for details.": { + "bg": "Тагът {tag} вече съществува, но сочи към {tag_commit} (очаква се HEAD {head_commit}). Това показва несъответствие таг/комит. Изпълнете 'python3 -m devx.ci.release --verify' за подробности.", + "de": "Tag {tag} existiert bereits, zeigt aber auf {tag_commit} (erwartet HEAD {head_commit}). Dies deutet auf eine Tag/Commit-Fehlzuordnung hin. Führen Sie 'python3 -m devx.ci.release --verify' für Details aus.", + "en": "Tag {tag} already exists but points to {tag_commit} (expected HEAD {head_commit}). This indicates a tag/commit misalignment. Run 'python3 -m devx.ci.release --verify' for details.", + "pl": "Tag {tag} już istnieje ale wskazuje na {tag_commit} (oczekiwano HEAD {head_commit}). Wskazuje to na niezgodność tag/commit. Uruchom 'python3 -m devx.ci.release --verify', aby uzyskać szczegóły.", + "ru": "Тег {tag} уже существует, но указывает на {tag_commit} (ожидается HEAD {head_commit}). Это указывает на несоответствие тег/коммит. Выполните 'python3 -m devx.ci.release --verify' для подробностей.", + "zh": "标签 {tag} 已存在但指向 {tag_commit}(预期为 HEAD {head_commit})。这表明标签/提交不匹配。运行 'python3 -m devx.ci.release --verify' 了解详情。" + }, + "Target repo (owner/name) to create PR in": { + "bg": "Целево репозитори (owner/name) за създаване на PR", + "de": "Ziel-Repo (owner/name) zum Erstellen des PR", + "en": "Target repo (owner/name) to create PR in", + "pl": "Docelowe repo (owner/name) do utworzenia PR", + "ru": "Целевой репозиторий (owner/name) для создания PR", + "zh": "用于创建 PR 的目标仓库(owner/name)" + }, + "Task ID: {task_id}": { + "bg": "ID на задача: {task_id}", + "de": "Task-ID: {task_id}", + "en": "Task ID: {task_id}", + "pl": "ID zadania: {task_id}", + "ru": "ID задачи: {task_id}", + "zh": "任务 ID:{task_id}" + }, + "Test '{name}' took {elapsed:.2f}s (limit: {limit}s). Optimise: use lighter fixtures, reduce I/O, or mock external calls.": { + "bg": "Тестът '{name}' отне {elapsed:.2f}s (лимит: {limit}s). Оптимизирайте: използвайте по-леки fixtures, намалете I/O или mock-нете външни извиквания.", + "de": "Test '{name}' dauerte {elapsed:.2f}s (Limit: {limit}s). Optimieren: leichtere Fixtures verwenden, I/O reduzieren oder externe Aufrufe mocken.", + "en": "Test '{name}' took {elapsed:.2f}s (limit: {limit}s). Optimise: use lighter fixtures, reduce I/O, or mock external calls.", + "pl": "Test '{name}' trwał {elapsed:.2f}s (limit: {limit}s). Optymalizuj: użyj lżejszych fixtures, zmniejsz I/O, lub mockuj zewnętrzne wywołania.", + "ru": "Тест '{name}' занял {elapsed:.2f}s (лимит: {limit}s). Оптимизируйте: используйте более лёгкие фикстуры, уменьшите I/O или замокайте внешние вызовы.", + "zh": "测试 '{name}' 耗时 {elapsed:.2f}s(限制:{limit}s)。优化:使用更轻的 fixtures、减少 I/O 或 mock 外部调用。" + }, + "Test isolation check FAILED: {count} violation(s) in {files} file(s).": { + "bg": "Проверката за изолация на тестовете СЕ ПРОВАЛИ: {count} нарушение(я) във {files} файл(а).", + "de": "Testisolierungsprüfung FEHLGESCHLAGEN: {count} Verstoß/Verstöße in {files} Datei(en).", + "en": "Test isolation check FAILED: {count} violation(s) in {files} file(s).", + "pl": "Kontrola izolacji testów NIEUDANA: {count} naruszeń w {files} plikach.", + "ru": "Проверка изоляции тестов ПРОВАЛЕНА: {count} нарушение(й) в {files} файл(ах).", + "zh": "测试隔离检查失败:{files} 个文件中存在 {count} 处违规。" + }, + "Test isolation check passed with {count} advisory warning(s) in {files} file(s).": { + "bg": "Проверката за изолация на тестовете премина с {count} предупредителни бележки във {files} файл(а).", + "de": "Testisolierungsprüfung mit {count} Hinweiswarnung(en) in {files} Datei(en) bestanden.", + "en": "Test isolation check passed with {count} advisory warning(s) in {files} file(s).", + "pl": "Kontrola izolacji testów przeszła z {count} ostrzeżeniami doradczymi w {files} plikach.", + "ru": "Проверка изоляции тестов пройдена с {count} предупреждением(ями) в {files} файл(ах).", + "zh": "测试隔离检查通过,{files} 个文件中有 {count} 条建议性警告。" + }, + "Test isolation check passed: {count} test files analyzed, no violations found.": { + "bg": "Проверката за изолация на тестове премина: анализирани са {count} тестови файла, няма нарушения.", + "de": "Testisolationsprüfung bestanden: {count} Testdateien analysiert, keine Verstöße gefunden.", + "en": "Test isolation check passed: {count} test files analyzed, no violations found.", + "pl": "Sprawdzenie izolacji testów zaliczone: przeanalizowano {count} plików testowych, brak naruszeń.", + "ru": "Проверка изоляции тестов пройдена: проанализировано {count} тестовых файлов, нарушений не найдено.", + "zh": "测试隔离检查通过:已分析 {count} 个测试文件,未发现违规。" + }, + "Tests failed — refusing to release. Fix test failures first.\n{stderr}": { + "bg": "Тестовете се провалиха — отказ за версия. Първо коригирайте неуспешните тестове.\n{stderr}", + "de": "Tests fehlgeschlagen — Release wird verweigert. Zuerst Testfehler beheben.\n{stderr}", + "en": "Tests failed — refusing to release. Fix test failures first.\n{stderr}", + "pl": "Testy nie powiodły się — odmowa wydania. Najpierw napraw niepowodzenia testów.\n{stderr}", + "ru": "Тесты не пройдены — отказ в релизе. Сначала исправьте ошибки тестов.\n{stderr}", + "zh": "测试失败——拒绝发布。请先修复测试失败。\n{stderr}" + }, + "Tests passed.": { + "bg": "Тестовете преминаха.", + "de": "Tests bestanden.", + "en": "Tests passed.", + "pl": "Testy zakończone pomyślnie.", + "ru": "Тесты пройдены.", + "zh": "测试通过。" + }, + "Timeout reached after {timeout}s.": { + "bg": "Достигнат таймаут след {timeout}s.", + "de": "Timeout nach {timeout}s erreicht.", + "en": "Timeout reached after {timeout}s.", + "pl": "Limit czasu osiągnięty po {timeout}s.", + "ru": "Таймаут достигнут после {timeout}s.", + "zh": "{timeout} 秒后达到超时。" + }, + "Transitive-subprocess advisories (runtime audit is authoritative):": { + "bg": "Съветващи бележки за транзитивни subprocess (runtime одитът е решаващ):", + "de": "Transitive-Subprocess-Hinweise (Runtime-Audit ist maßgeblich):", + "en": "Transitive-subprocess advisories (runtime audit is authoritative):", + "pl": "Ostrzeżenia dotyczące subprocessów przechodnich (audyt runtime jest rozstrzygający):", + "ru": "Предупреждения о транзитивных subprocess (авторитетен runtime-аудит):", + "zh": "传递性 subprocess 建议(以运行时审计为准):" + }, + "Unit tests passed in {duration:.2f}s (under {max}s limit, all tests under {single}s per-test limit).": { + "bg": "Модулните тестове преминаха за {duration:.2f}s (под лимита {max}s, всички тестове под лимита {single}s на тест).", + "de": "Unit-Tests in {duration:.2f}s bestanden (unter {max}s-Limit, alle Tests unter {single}s Pro-Test-Limit).", + "en": "Unit tests passed in {duration:.2f}s (under {max}s limit, all tests under {single}s per-test limit).", + "pl": "Testy jednostkowe zakończone pomyślnie w {duration:.2f}s (poniżej limitu {max}s, wszystkie testy poniżej limitu {single}s na test).", + "ru": "Модульные тесты пройдены за {duration:.2f}s (ниже лимита {max}s, все тесты ниже лимита {single}s на тест).", + "zh": "单元测试在 {duration:.2f}s 内通过(低于 {max}s 限制,所有测试均低于 {single}s 单测试限制)。" + }, + "Unit tests too slow: {duration:.2f}s (max allowed: {max}s).\n Fix: run 'make pytest-cov' to profile, then optimise slow tests.\n Hint: avoid unnecessary imports, use lighter mocks, or cache fixtures.": { + "bg": "Модулните тестове са твърде бавни: {duration:.2f}s (максимум: {max}s).\n Корекция: изпълнете 'make pytest-cov' за профилиране, след това оптимизирайте бавните тестове.\n Съвет: избягвайте ненужни импорти, използвайте по-леки mocks или кеширайте fixtures.", + "de": "Unit-Tests zu langsam: {duration:.2f}s (max. erlaubt: {max}s).\n Behebung: 'make pytest-cov' zum Profilieren ausführen, dann langsame Tests optimieren.\n Hinweis: unnötige Imports vermeiden, leichtere Mocks verwenden oder Fixtures cachen.", + "en": "Unit tests too slow: {duration:.2f}s (max allowed: {max}s).\n Fix: run 'make pytest-cov' to profile, then optimise slow tests.\n Hint: avoid unnecessary imports, use lighter mocks, or cache fixtures.", + "pl": "Testy jednostkowe zbyt wolne: {duration:.2f}s (maks. dozwolone: {max}s).\n Naprawa: uruchom 'make pytest-cov' do profilowania, następnie zoptymalizuj wolne testy.\n Wskazówka: unikaj niepotrzebnych importów, użyj lżejszych mocków, lub buforuj fixtures.", + "ru": "Модульные тесты слишком медленные: {duration:.2f}s (макс.: {max}s).\n Исправление: выполните 'make pytest-cov' для профилирования, затем оптимизируйте медленные тесты.\n Совет: избегайте ненужных импортов, используйте более лёгкие моки или кешируйте фикстуры.", + "zh": "单元测试过慢:{duration:.2f}s(最大允许:{max}s)。\n 修复:运行 'make pytest-cov' 进行性能分析,然后优化慢测试。\n 提示:避免不必要的导入,使用更轻的 mock 或缓存 fixtures。" + }, + "Unknown check category '{check}'. Available: all, user-facing{tags}": { + "bg": "Непозната категория проверка '{check}'. Налични: all, user-facing{tags}", + "de": "Unbekannte Check-Kategorie '{check}'. Verfügbar: all, user-facing{tags}", + "en": "Unknown check category '{check}'. Available: all, user-facing{tags}", + "pl": "Nieznana kategoria kontroli '{check}'. Dostępne: all, user-facing{tags}", + "ru": "Неизвестная категория проверки '{check}'. Доступны: all, user-facing{tags}", + "zh": "未知检查类别 '{check}'。可用:all、user-facing{tags}" + }, + "Unknown nightly status — staging deploy blocked.": { + "bg": "Непознат nightly статус — staging деплой е блокиран.", + "de": "Unbekannter Nightly-Status — Staging-Deploy blockiert.", + "en": "Unknown nightly status — staging deploy blocked.", + "pl": "Nieznany status nightly — wdrożenie staging zablokowane.", + "ru": "Неизвестный статус nightly — деплой на staging заблокирован.", + "zh": "未知的 nightly 状态——staging 部署已阻止。" + }, + "Updated badge URLs in {filename}": { + "bg": "Обновени URL на значки в {filename}", + "de": "Badge-URLs in {filename} aktualisiert", + "en": "Updated badge URLs in {filename}", + "pl": "Zaktualizowano URL-e odznak w {filename}", + "ru": "Обновлены URL значков в {filename}", + "zh": "已更新 {filename} 中的徽章 URL" + }, + "Updated documentation version references to v{version}": { + "bg": "", + "de": "", + "en": "Updated documentation version references to v{version}", + "pl": "", + "ru": "", + "zh": "" + }, + "Updated version in {init}": { + "bg": "Обновена версия в {init}", + "de": "Version in {init} aktualisiert", + "en": "Updated version in {init}", + "pl": "Zaktualizowano wersję w {init}", + "ru": "Версия обновлена в {init}", + "zh": "已更新 {init} 中的版本" + }, + "Updated {changelog_file}": { + "bg": "Обновен {changelog_file}", + "de": "{changelog_file} aktualisiert", + "en": "Updated {changelog_file}", + "pl": "Zaktualizowano {changelog_file}", + "ru": "Обновлён {changelog_file}", + "zh": "已更新 {changelog_file}" + }, + "Use string comparison or _is_truthy()/_is_falsy() helpers instead. Add '{marker}' to suppress individual lines.": { + "bg": "Използвайте сравнение на низове или _is_truthy()/_is_falsy() помощници. Добавете '{marker}' за потискане на отделни редове.", + "de": "Verwenden Sie String-Vergleich oder _is_truthy()/_is_falsy() Hilfsfunktionen. Fügen Sie '{marker}' hinzu, um einzelne Zeilen zu unterdrücken.", + "en": "Use string comparison or _is_truthy()/_is_falsy() helpers instead. Add '{marker}' to suppress individual lines.", + "pl": "Użyj porównania ciągów lub pomocników _is_truthy()/_is_falsy(). Dodaj '{marker}', aby pominąć pojedyncze linie.", + "ru": "Используйте строковое сравнение или помощники _is_truthy()/_is_falsy(). Добавьте '{marker}' для подавления отдельных строк.", + "zh": "使用字符串比较或 _is_truthy()/_is_falsy() 辅助函数。添加 '{marker}' 以抑制个别行。" + }, + "VIKUNJA_TOKEN is not set. Required to derive PR title.": { + "bg": "VIKUNJA_TOKEN не е зададен. Необходим за извличане на PR заглавие.", + "de": "VIKUNJA_TOKEN nicht gesetzt. Erforderlich zum Ableiten des PR-Titels.", + "en": "VIKUNJA_TOKEN is not set. Required to derive PR title.", + "pl": "VIKUNJA_TOKEN nie jest ustawiony. Wymagany do pobrania tytułu PR.", + "ru": "VIKUNJA_TOKEN не установлен. Требуется для получения заголовка PR.", + "zh": "VIKUNJA_TOKEN 未设置。推导 PR 标题所需。" + }, + "VIKUNJA_TOKEN is not set. Set it in .env or environment.": { + "bg": "VIKUNJA_TOKEN не е зададен. Задайте го в .env или средата.", + "de": "VIKUNJA_TOKEN nicht gesetzt. In .env oder Umgebung setzen.", + "en": "VIKUNJA_TOKEN is not set. Set it in .env or environment.", + "pl": "VIKUNJA_TOKEN nie jest ustawiony. Ustaw go w .env lub środowisku.", + "ru": "VIKUNJA_TOKEN не установлен. Установите его в .env или среде.", + "zh": "VIKUNJA_TOKEN 未设置。在 .env 或环境中设置它。" + }, + "VIKUNJA_TOKEN is not set. This is required in CI to validate PR titles.": { + "bg": "VIKUNJA_TOKEN не е зададен. Изисква се в CI за валидиране на заглавията на PR.", + "de": "VIKUNJA_TOKEN ist nicht gesetzt. In CI zur Validierung von PR-Titeln erforderlich.", + "en": "VIKUNJA_TOKEN is not set. This is required in CI to validate PR titles.", + "pl": "VIKUNJA_TOKEN nie jest ustawiony. Jest to wymagane w CI do walidacji tytułów PR.", + "ru": "VIKUNJA_TOKEN не задан. Требуется в CI для проверки заголовков PR.", + "zh": "未设置 VIKUNJA_TOKEN。CI 中验证 PR 标题时需要。" + }, + "Version file: {file}": { + "bg": "Файл с версия: {file}", + "de": "Versionsdatei: {file}", + "en": "Version file: {file}", + "pl": "Plik wersji: {file}", + "ru": "Файл версии: {file}", + "zh": "版本文件:{file}" + }, + "Version stays at v{version} — no version bump from git-cliff. Commits since last tag don't warrant a new release. Skipping.": { + "bg": "", + "de": "", + "en": "Version stays at v{version} — no version bump from git-cliff. Commits since last tag don't warrant a new release. Skipping.", + "pl": "", + "ru": "", + "zh": "" + }, + "Vikunja API error (HTTP {status}): {message}. Task {task_id} was NOT updated. The merge succeeded but the Vikunja task needs manual update.": { + "bg": "Грешка в Vikunja API (HTTP {status}): {message}. Задача {task_id} НЕ е обновена. Merge-ът успя, но Vikunja задачата изисква ръчно обновяване.", + "de": "Vikunja-API-Fehler (HTTP {status}): {message}. Task {task_id} wurde NICHT aktualisiert. Der Merge war erfolgreich, aber der Vikunja-Task muss manuell aktualisiert werden.", + "en": "Vikunja API error (HTTP {status}): {message}. Task {task_id} was NOT updated. The merge succeeded but the Vikunja task needs manual update.", + "pl": "Błąd API Vikunja (HTTP {status}): {message}. Zadanie {task_id} NIE zostało zaktualizowane. Scalenie powiodło się ale zadanie Vikunja wymaga ręcznej aktualizacji.", + "ru": "Ошибка Vikunja API (HTTP {status}): {message}. Задача {task_id} НЕ была обновлена. Слияние прошло успешно, но задачу Vikunja нужно обновить вручную.", + "zh": "Vikunja API 错误(HTTP {status}):{message}。任务 {task_id} 未更新。合并成功,但 Vikunja 任务需要手动更新。" + }, + "Vikunja task title '{title}' starts with '{prefix}:'. The task title should NOT include the '{prefix}' prefix — it is automatically added to the PR title. Update the Vikunja task title to remove the prefix.": { + "bg": "Заглавието на задачата във Vikunja '{title}' започва с '{prefix}:'. Заглавието на задачата НЕ трябва да съдържа префикса '{prefix}' — той се добавя автоматично към заглавието на PR. Актуализирайте заглавието на задачата във Vikunja, за да премахнете префикса.", + "de": "Der Vikunja-Aufgabentitel '{title}' beginnt mit '{prefix}:'. Der Aufgabentitel darf NICHT den Präfix '{prefix}' enthalten — er wird automatisch zum PR-Titel hinzugefügt. Aktualisieren Sie den Vikunja-Aufgabentitel, um den Präfix zu entfernen.", + "en": "Vikunja task title '{title}' starts with '{prefix}:'. The task title should NOT include the '{prefix}' prefix — it is automatically added to the PR title. Update the Vikunja task title to remove the prefix.", + "pl": "Tytuł zadania Vikunja '{title}' zaczyna się od '{prefix}:'. Tytuł zadania nie powinien zawierać prefiksu '{prefix}' — jest on automatycznie dodawany do tytułu PR. Zaktualizuj tytuł zadania Vikunja, aby usunąć prefiks.", + "ru": "Заголовок задачи Vikunja '{title}' начинается с '{prefix}:'. Заголовок задачи НЕ должен включать префикс '{prefix}' — он автоматически добавляется к заголовку PR. Обновите заголовок задачи Vikunja, чтобы удалить префикс.", + "zh": "Vikunja 任务标题 '{title}' 以 '{prefix}:' 开头。任务标题不应包含 '{prefix}' 前缀 — 它会自动添加到 PR 标题中。请更新 Vikunja 任务标题以删除前缀。" + }, + "Vikunja task {task_id} not found in project {project_id}.\n Create it first:\n python -m devx.tools.create_task --title \"Task title\"\n Or check that the task ID in the branch name is correct.": { + "bg": "Vikunja задача {task_id} не е намерена в проект {project_id}.\n Създайте я първо:\n python -m devx.tools.create_task --title \"Заглавие на задача\"\n Или проверете че ID на задачата в името на клона е правилно.", + "de": "Vikunja-Task {task_id} in Projekt {project_id} nicht gefunden.\n Zuerst erstellen:\n python -m devx.tools.create_task --title \"Task-Titel\"\n Oder prüfen, ob die Task-ID im Branch-Namen korrekt ist.", + "en": "Vikunja task {task_id} not found in project {project_id}.\n Create it first:\n python -m devx.tools.create_task --title \"Task title\"\n Or check that the task ID in the branch name is correct.", + "pl": "Zadanie Vikunja {task_id} nie znalezione w projekcie {project_id}.\n Utwórz je najpierw:\n python -m devx.tools.create_task --title \"Tytuł zadania\"\n Lub sprawdź, czy ID zadania w nazwie gałęzi jest poprawne.", + "ru": "Задача Vikunja {task_id} не найдена в проекте {project_id}.\n Сначала создайте её:\n python -m devx.tools.create_task --title \"Заголовок задачи\"\n Или проверьте, что ID задачи в имени ветки корректен.", + "zh": "在项目 {project_id} 中找不到 Vikunja 任务 {task_id}。\n 请先创建:\n python -m devx.tools.create_task --title \"任务标题\"\n 或检查分支名称中的任务 ID 是否正确。" + }, + "WARN: .venv has Python {version}, but >={req} is required.": { + "bg": "ПРЕДУПРЕЖДЕНИЕ: .venv има Python {version}, но се изисква >={req}.", + "de": "WARNUNG: .venv hat Python {version}, aber >={req} ist erforderlich.", + "en": "WARN: .venv has Python {version}, but >={req} is required.", + "pl": "OSTRZEŻENIE: .venv ma Python {version}, ale wymagane jest >={req}.", + "ru": "ПРЕДУПРЕЖДЕНИЕ: в .venv установлен Python {version}, но требуется >={req}.", + "zh": "警告: .venv 的 Python 版本为 {version},但要求 >={req}。" + }, + "WARN: .venv not found. Run 'make setup-venv' to create it.": { + "bg": "ПРЕДУПРЕЖДЕНИЕ: .venv не е намерен. Изпълнете 'make setup-venv' за създаване.", + "de": "WARNUNG: .venv nicht gefunden. Führen Sie 'make setup-venv' aus, um es zu erstellen.", + "en": "WARN: .venv not found. Run 'make setup-venv' to create it.", + "pl": "OSTRZEŻENIE: Nie znaleziono .venv. Uruchom 'make setup-venv', aby utworzyć.", + "ru": "ПРЕДУПРЕЖДЕНИЕ: .venv не найден. Выполните 'make setup-venv' для создания.", + "zh": "警告: 未找到 .venv。运行 'make setup-venv' 来创建。" + }, + "WARN: Could not determine Python version in .venv.": { + "bg": "ПРЕДУПРЕЖДЕНИЕ: Не може да се определи версията на Python в .venv.", + "de": "WARNUNG: Python-Version in .venv konnte nicht bestimmt werden.", + "en": "WARN: Could not determine Python version in .venv.", + "pl": "OSTRZEŻENIE: Nie można określić wersji Python w .venv.", + "ru": "ПРЕДУПРЕЖДЕНИЕ: Не удалось определить версию Python в .venv.", + "zh": "警告: 无法确定 .venv 中的 Python 版本。" + }, + "WARN: Could not parse Python version '{version}'.": { + "bg": "ПРЕДУПРЕЖДЕНИЕ: Не може да се анализира версията на Python '{version}'.", + "de": "WARNUNG: Python-Version '{version}' konnte nicht analysiert werden.", + "en": "WARN: Could not parse Python version '{version}'.", + "pl": "OSTRZEŻENIE: Nie można przeanalizować wersji Python '{version}'.", + "ru": "ПРЕДУПРЕЖДЕНИЕ: Не удалось разобрать версию Python '{version}'.", + "zh": "警告: 无法解析 Python 版本 '{version}'。" + }, + "WARNING: --skip-tests passed — skipping test verification.": { + "bg": "ПРЕДУПРЕЖДЕНИЕ: зададен е --skip-tests — проверката на тестовете се пропуска.", + "de": "WARNUNG: --skip-tests übergeben — Testverifizierung wird übersprungen.", + "en": "WARNING: --skip-tests passed — skipping test verification.", + "pl": "OSTRZEŻENIE: --skip-tests przekazane — pomijanie weryfikacji testów.", + "ru": "ПРЕДУПРЕЖДЕНИЕ: передан --skip-tests — проверка тестов пропускается.", + "zh": "警告:已传入 --skip-tests——跳过测试验证。" + }, + "WARNING: .taskid file ({file_id}) is deprecated and disagrees with branch name ({branch_id}). Delete .taskid from the repo — branch name is the sole source of truth.": { + "bg": "ВНИМАНИЕ: Файлът .taskid ({file_id}) е остарял и не съвпада с името на клона ({branch_id}). Изтрийте .taskid от хранилището — името на клона е единственият източник на истината.", + "de": "WARNUNG: Die Datei .taskid ({file_id}) ist veraltet und stimmt nicht mit dem Branch-Namen ({branch_id}) überein. Löschen Sie .taskid aus dem Repo — der Branch-Name ist die einzige Wahrheitsquelle.", + "en": "WARNING: .taskid file ({file_id}) is deprecated and disagrees with branch name ({branch_id}). Delete .taskid from the repo — branch name is the sole source of truth.", + "pl": "OSTRZEŻENIE: plik .taskid ({file_id}) jest przestarzały i niezgodny z nazwą gałęzi ({branch_id}). Usuń .taskid z repozytorium — nazwa gałęzi jest jedynym źródłem prawdy.", + "ru": "ВНИМАНИЕ: Файл .taskid ({file_id}) устарел и не совпадает с именем ветки ({branch_id}). Удалите .taskid из репозитория — имя ветки — единственный источник истины.", + "zh": "警告:.taskid 文件 ({file_id}) 已弃用,与分支名称 ({branch_id}) 不一致。请从仓库中删除 .taskid — 分支名称是唯一的真实来源。" + }, + "WARNING: VIKUNJA_TOKEN not set — skipping task existence check. Set it in .env to enable full validation.": { + "bg": "ПРЕДУПРЕЖДЕНИЕ: VIKUNJA_TOKEN не е зададен — пропускане на проверката за съществуване на задача. Задайте го в .env за пълна валидация.", + "de": "WARNUNG: VIKUNJA_TOKEN nicht gesetzt — Task-Existenzprüfung übersprungen. In .env setzen für volle Validierung.", + "en": "WARNING: VIKUNJA_TOKEN not set — skipping task existence check. Set it in .env to enable full validation.", + "pl": "OSTRZEŻENIE: VIKUNJA_TOKEN nie jest ustawiony — pomijanie sprawdzania istnienia zadania. Ustaw w .env, aby włączyć pełną walidację.", + "ru": "ПРЕДУПРЕЖДЕНИЕ: VIKUNJA_TOKEN не установлен — пропуск проверки существования задачи. Установите в .env для полной проверки.", + "zh": "警告: VIKUNJA_TOKEN 未设置 — 跳过任务存在性检查。在 .env 中设置以启用完整验证。" + }, + "WARNING: Version badge shows stale version (expected v{version}) — regenerating": { + "bg": "", + "de": "", + "en": "WARNING: Version badge shows stale version (expected v{version}) — regenerating", + "pl": "", + "ru": "", + "zh": "" + }, + "WARNING: check_doc_versions --fix failed (rc={rc}): {err}": { + "bg": "", + "de": "", + "en": "WARNING: check_doc_versions --fix failed (rc={rc}): {err}", + "pl": "", + "ru": "", + "zh": "" + }, + "Waiting 5s for Gitea to process pushed commits...": { + "bg": "", + "de": "", + "en": "Waiting 5s for Gitea to process pushed commits...", + "pl": "", + "ru": "", + "zh": "" + }, + "Waiting for CI checks to complete (timeout: {timeout}s)...": { + "bg": "Изчакване CI проверките да завършат (таймаут: {timeout}s)...", + "de": "Warte auf Abschluss der CI-Checks (Timeout: {timeout}s)...", + "en": "Waiting for CI checks to complete (timeout: {timeout}s)...", + "pl": "Oczekiwanie na zakończenie kontroli CI (limit: {timeout}s)...", + "ru": "Ожидание завершения CI-проверок (таймаут: {timeout}s)...", + "zh": "等待 CI 检查完成(超时:{timeout}s)..." + }, + "Warning: could not fetch tags from origin.": { + "bg": "Предупреждение: не могат да се извлекат таговете от origin.", + "de": "Warnung: Tags konnten nicht von origin abgerufen werden.", + "en": "Warning: could not fetch tags from origin.", + "pl": "Ostrzeżenie: nie udało się pobrać tagów z origin.", + "ru": "Предупреждение: не удалось получить теги из origin.", + "zh": "警告:无法从 origin 获取标签。" + }, + "Warning: instance-level runners query failed: {error}": { + "bg": "Предупреждение: заявката за раннъри на ниво инстанция се провали: {error}", + "de": "Warnung: Abfrage der Runner auf Instanzebene fehlgeschlagen: {error}", + "en": "Warning: instance-level runners query failed: {error}", + "pl": "Ostrzeżenie: zapytanie o runnery na poziomie instancji nie powiodło się: {error}", + "ru": "Предупреждение: запрос раннеров на уровне инстанса не удался: {error}", + "zh": "警告:实例级 runner 查询失败:{error}" + }, + "Warning: instance-level runners query returned HTTP {status}": { + "bg": "Предупреждение: заявката за раннъри на ниво инстанция върна HTTP {status}", + "de": "Warnung: Abfrage der Runner auf Instanzebene gab HTTP {status} zurück", + "en": "Warning: instance-level runners query returned HTTP {status}", + "pl": "Ostrzeżenie: zapytanie o runnery na poziomie instancji zwróciło HTTP {status}", + "ru": "Предупреждение: запрос раннеров на уровне инстанса вернул HTTP {status}", + "zh": "警告:实例级 runner 查询返回 HTTP {status}" + }, + "Warning: org-level runners query failed: {error}": { + "bg": "Предупреждение: заявката за раннъри на ниво организация се провали: {error}", + "de": "Warnung: Abfrage der Runner auf Organisationsebene fehlgeschlagen: {error}", + "en": "Warning: org-level runners query failed: {error}", + "pl": "Ostrzeżenie: zapytanie o runnery na poziomie organizacji nie powiodło się: {error}", + "ru": "Предупреждение: запрос раннеров на уровне организации не удался: {error}", + "zh": "警告:组织级 runner 查询失败:{error}" + }, + "Warning: org-level runners query returned HTTP {status}": { + "bg": "Предупреждение: заявката за раннъри на ниво организация върна HTTP {status}", + "de": "Warnung: Abfrage der Runner auf Organisationsebene gab HTTP {status} zurück", + "en": "Warning: org-level runners query returned HTTP {status}", + "pl": "Ostrzeżenie: zapytanie o runnery na poziomie organizacji zwróciło HTTP {status}", + "ru": "Предупреждение: запрос раннеров на уровне организации вернул HTTP {status}", + "zh": "警告:组织级 runner 查询返回 HTTP {status}" + }, + "Warning: repo-level runners query failed: {error}": { + "bg": "Предупреждение: заявката за раннъри на ниво репозитори се провали: {error}", + "de": "Warnung: Abfrage der Runner auf Repo-Ebene fehlgeschlagen: {error}", + "en": "Warning: repo-level runners query failed: {error}", + "pl": "Ostrzeżenie: zapytanie o runnery na poziomie repozytorium nie powiodło się: {error}", + "ru": "Предупреждение: запрос раннеров на уровне репозитория не удался: {error}", + "zh": "警告:仓库级 runner 查询失败:{error}" + }, + "Warning: repo-level runners query returned HTTP {status}": { + "bg": "Предупреждение: заявката за раннъри на ниво репозитори върна HTTP {status}", + "de": "Warnung: Abfrage der Runner auf Repo-Ebene gab HTTP {status} zurück", + "en": "Warning: repo-level runners query returned HTTP {status}", + "pl": "Ostrzeżenie: zapytanie o runnery na poziomie repozytorium zwróciło HTTP {status}", + "ru": "Предупреждение: запрос раннеров на уровне репозитория вернул HTTP {status}", + "zh": "警告:仓库级 runner 查询返回 HTTP {status}" + }, + "Wiki repo not found or empty — initializing fresh.": { + "bg": "", + "de": "", + "en": "Wiki repo not found or empty — initializing fresh.", + "pl": "", + "ru": "", + "zh": "" + }, + "Wiki synced successfully.": { + "bg": "", + "de": "", + "en": "Wiki synced successfully.", + "pl": "", + "ru": "", + "zh": "" + }, + "Wiki verification failed — could not clone wiki": { + "bg": "", + "de": "", + "en": "Wiki verification failed — could not clone wiki", + "pl": "", + "ru": "", + "zh": "" + }, + "Wiki verification failed — {failures} page(s) missing": { + "bg": "", + "de": "", + "en": "Wiki verification failed — {failures} page(s) missing", + "pl": "", + "ru": "", + "zh": "" + }, + "Write deploy-ref to $GITHUB_OUTPUT file.": { + "bg": "Запиши deploy-ref в $GITHUB_OUTPUT файла.", + "de": "Deploy-ref in $GITHUB_OUTPUT-Datei schreiben.", + "en": "Write deploy-ref to $GITHUB_OUTPUT file.", + "pl": "Zapisz deploy-ref do pliku $GITHUB_OUTPUT.", + "ru": "Записать deploy-ref в файл $GITHUB_OUTPUT.", + "zh": "将 deploy-ref 写入 $GITHUB_OUTPUT 文件。" + }, + "Write results to $GITHUB_OUTPUT": { + "bg": "Записва резултатите в $GITHUB_OUTPUT", + "de": "Ergebnisse nach $GITHUB_OUTPUT schreiben", + "en": "Write results to $GITHUB_OUTPUT", + "pl": "Zapisuje wyniki do $GITHUB_OUTPUT", + "ru": "Записывать результаты в $GITHUB_OUTPUT", + "zh": "将结果写入 $GITHUB_OUTPUT" + }, + "Wrote tag {tag} to GITHUB_OUTPUT.": { + "bg": "Тагът {tag} е записан в GITHUB_OUTPUT.", + "de": "Tag {tag} nach GITHUB_OUTPUT geschrieben.", + "en": "Wrote tag {tag} to GITHUB_OUTPUT.", + "pl": "Zapisano tag {tag} do GITHUB_OUTPUT.", + "ru": "Тег {tag} записан в GITHUB_OUTPUT.", + "zh": "已将标签 {tag} 写入 GITHUB_OUTPUT。" + }, + "[check-api-identity-checks] Passed: no unsafe identity checks found": { + "bg": "[check-api-identity-checks] Мина: не са намерени небрежни проверки за идентичност", + "de": "[check-api-identity-checks] Bestanden: keine unsicheren Identitätsprüfungen gefunden", + "en": "[check-api-identity-checks] Passed: no unsafe identity checks found", + "pl": "[check-api-identity-checks] Passed: nie znaleziono niebezpiecznych sprawdzeń tożsamości", + "ru": "[check-api-identity-checks] Пройдено: небезопасных проверок идентичности не найдено", + "zh": "[check-api-identity-checks] 通过:未发现不安全的身份检查" + }, + "[check-dep-docs] Passed: all dependencies are documented": { + "bg": "[check-dep-docs] Успешно: всички зависимости са документирани", + "de": "[check-dep-docs] Bestanden: alle Abhängigkeiten sind dokumentiert", + "en": "[check-dep-docs] Passed: all dependencies are documented", + "pl": "[check-dep-docs] Zaliczone: wszystkie zależności są udokumentowane", + "ru": "[check-dep-docs] Пройдено: все зависимости задокументированы", + "zh": "[check-dep-docs] 通过:所有依赖项均已记录" + }, + "[check-deps] All core tools present.": { + "bg": "[check-deps] Всички основни инструменти са налични.", + "de": "[check-deps] Alle Kernwerkzeuge vorhanden.", + "en": "[check-deps] All core tools present.", + "pl": "[check-deps] Wszystkie podstawowe narzędzia są dostępne.", + "ru": "[check-deps] Все основные инструменты доступны.", + "zh": "[check-deps] 所有核心工具均已就绪。" + }, + "[check-deps] Verifying tools...": { + "bg": "[check-deps] Проверка на инструментите...", + "de": "[check-deps] Werkzeuge werden überprüft...", + "en": "[check-deps] Verifying tools...", + "pl": "[check-deps] Sprawdzanie narzędzi...", + "ru": "[check-deps] Проверка инструментов...", + "zh": "[check-deps] 正在验证工具..." + }, + "[check-deps] Virtualenv .venv ready (Python {version}).": { + "bg": "[check-deps] Виртуална среда .venv готова (Python {version}).", + "de": "[check-deps] Virtuelle Umgebung .venv bereit (Python {version}).", + "en": "[check-deps] Virtualenv .venv ready (Python {version}).", + "pl": "[check-deps] Środowisko wirtualne .venv gotowe (Python {version}).", + "ru": "[check-deps] Виртуальное окружение .venv готово (Python {version}).", + "zh": "[check-deps] 虚拟环境 .venv 已就绪 (Python {version})。" + }, + "[check-mutable-globals] Passed: no mutable path globals found": { + "bg": "[check-mutable-globals] Успешно: не са намерени променливи пътеки глобали", + "de": "[check-mutable-globals] Bestanden: keine mutablen Pfad-Globals gefunden", + "en": "[check-mutable-globals] Passed: no mutable path globals found", + "pl": "[check-mutable-globals] Zaliczone: nie znaleziono mutowalnych globali ścieżek", + "ru": "[check-mutable-globals] Пройдено: изменяемых глобальных путей не найдено", + "zh": "[check-mutable-globals] 通过:未发现可变路径全局变量" + }, + "[check-test-speed] CI environment detected — scaling limits by {factor}x (total: {orig}s → {eff}s, per-test: {orig_s}s → {eff_s}s)": { + "bg": "[check-test-speed] Открита е CI среда — лимитите се скалират с {factor}x (общо: {orig}s → {eff}s, на тест: {orig_s}s → {eff_s}s)", + "de": "[check-test-speed] CI-Umgebung erkannt — Limits werden um Faktor {factor}x skaliert (gesamt: {orig}s → {eff}s, pro Test: {orig_s}s → {eff_s}s)", + "en": "[check-test-speed] CI environment detected — scaling limits by {factor}x (total: {orig}s → {eff}s, per-test: {orig_s}s → {eff_s}s)", + "pl": "[check-test-speed] Wykryto środowisko CI — limity skalowane {factor}x (razem: {orig}s → {eff}s, na test: {orig_s}s → {eff_s}s)", + "ru": "[check-test-speed] Обнаружена среда CI — лимиты масштабируются в {factor}x (всего: {orig}s → {eff}s, на тест: {orig_s}s → {eff_s}s)", + "zh": "[check-test-speed] 检测到 CI 环境——限制按 {factor}x 缩放(总计:{orig}s → {eff}s,单测试:{orig_s}s → {eff_s}s)" + }, + "[check_agent_docs] Passed: scanned {count} file(s), no stale references": { + "bg": "[check_agent_docs] Успешно: сканирани {count} файл(а), няма остарели препратки", + "de": "[check_agent_docs] Bestanden: {count} Datei(en) gescannt, keine veralteten Referenzen", + "en": "[check_agent_docs] Passed: scanned {count} file(s), no stale references", + "pl": "[check_agent_docs] Zaliczone: przeskanowano {count} plików, brak nieaktualnych odwołań", + "ru": "[check_agent_docs] Пройдено: проверено {count} файл(ов), устаревших ссылок нет", + "zh": "[check_agent_docs] 通过:已扫描 {count} 个文件,无过时引用" + }, + "[check_test_coverage] No changed files to check.": { + "bg": "[check_test_coverage] Няма променени файлове за проверка.", + "de": "[check_test_coverage] Keine geänderten Dateien zu prüfen.", + "en": "[check_test_coverage] No changed files to check.", + "pl": "[check_test_coverage] Brak zmienionych plików do sprawdzenia.", + "ru": "[check_test_coverage] Нет изменённых файлов для проверки.", + "zh": "[check_test_coverage] 没有需要检查的已更改文件。" + }, + "[dep-pr] Bumping {pkg} from {old} to {new} in {file}": { + "bg": "[dep-pr] Увеличаване на {pkg} от {old} на {new} в {file}", + "de": "[dep-pr] Erhöhe {pkg} von {old} auf {new} in {file}", + "en": "[dep-pr] Bumping {pkg} from {old} to {new} in {file}", + "pl": "[dep-pr] Podbijanie {pkg} z {old} do {new} w {file}", + "ru": "[dep-pr] Повышение {pkg} с {old} до {new} в {file}", + "zh": "[dep-pr] 将 {file} 中的 {pkg} 从 {old} 升级到 {new}" + }, + "[dep-pr] Could not find pinned version for {pkg} in infra repo.": { + "bg": "[dep-pr] Не е намерена фиксирана версия за {pkg} в infra репозиторито.", + "de": "[dep-pr] Keine gepinnte Version für {pkg} im Infra-Repo gefunden.", + "en": "[dep-pr] Could not find pinned version for {pkg} in infra repo.", + "pl": "[dep-pr] Nie znaleziono przypiętej wersji dla {pkg} w repo infra.", + "ru": "[dep-pr] Не найдена закреплённая версия для {pkg} в репозитории infra.", + "zh": "[dep-pr] 在 infra 仓库中未找到 {pkg} 的固定版本。" + }, + "[dep-pr] Created PR #{number}: {title}": { + "bg": "[dep-pr] Създаден PR #{number}: {title}", + "de": "[dep-pr] PR #{number} erstellt: {title}", + "en": "[dep-pr] Created PR #{number}: {title}", + "pl": "[dep-pr] Utworzono PR #{number}: {title}", + "ru": "[dep-pr] Создан PR #{number}: {title}", + "zh": "[dep-pr] 已创建 PR #{number}:{title}" + }, + "[dep-pr] PR already exists: #{number}": { + "bg": "[dep-pr] PR вече съществува: #{number}", + "de": "[dep-pr] PR existiert bereits: #{number}", + "en": "[dep-pr] PR already exists: #{number}", + "pl": "[dep-pr] PR już istnieje: #{number}", + "ru": "[dep-pr] PR уже существует: #{number}", + "zh": "[dep-pr] PR 已存在:#{number}" + }, + "[dep-pr] {pkg} already at {version} — no PR needed.": { + "bg": "[dep-pr] {pkg} вече е на {version} — не е нужен PR.", + "de": "[dep-pr] {pkg} bereits auf {version} — kein PR nötig.", + "en": "[dep-pr] {pkg} already at {version} — no PR needed.", + "pl": "[dep-pr] {pkg} już jest na {version} — PR niepotrzebny.", + "ru": "[dep-pr] {pkg} уже на версии {version} — PR не нужен.", + "zh": "[dep-pr] {pkg} 已处于 {version}——无需 PR。" + }, + "[docker-login] Logged in to {registry}.": { + "bg": "[docker-login] Влязъл в {registry}.", + "de": "[docker-login] Angemeldet bei {registry}.", + "en": "[docker-login] Logged in to {registry}.", + "pl": "[docker-login] Zalogowano do {registry}.", + "ru": "[docker-login] Выполнен вход в {registry}.", + "zh": "[docker-login] 已登录到 {registry}。" + }, + "[docker-login] Login to {registry} failed (continuing).": { + "bg": "[docker-login] Влизането в {registry} не успя (продължава).", + "de": "[docker-login] Anmeldung bei {registry} fehlgeschlagen (wird fortgesetzt).", + "en": "[docker-login] Login to {registry} failed (continuing).", + "pl": "[docker-login] Logowanie do {registry} nie powiodło się (kontynuowanie).", + "ru": "[docker-login] Ошибка входа в {registry} (продолжаем).", + "zh": "[docker-login] 登录 {registry} 失败(继续)。" + }, + "[docker-login] Skipping {registry} (token {env} not set).": { + "bg": "[docker-login] Пропускане на {registry} (токен {env} не е зададен).", + "de": "[docker-login] {registry} übersprungen (Token {env} nicht gesetzt).", + "en": "[docker-login] Skipping {registry} (token {env} not set).", + "pl": "[docker-login] Pomijanie {registry} (token {env} nie ustawiony).", + "ru": "[docker-login] Пропуск {registry} (токен {env} не задан).", + "zh": "[docker-login] 跳过 {registry}(未设置令牌 {env})。" + }, + "[dry-run] No changes pushed.": { + "bg": "", + "de": "", + "en": "[dry-run] No changes pushed.", + "pl": "", + "ru": "", + "zh": "" + }, + "[dry-run] Would commit and push wiki changes": { + "bg": "", + "de": "", + "en": "[dry-run] Would commit and push wiki changes", + "pl": "", + "ru": "", + "zh": "" + }, + "[dry-run] Would commit: release: v{version} [skip ci]": { + "bg": "[dry-run] Ще се комитне: release: v{version} [skip ci]", + "de": "[dry-run] Würde committen: release: v{version} [skip ci]", + "en": "[dry-run] Would commit: release: v{version} [skip ci]", + "pl": "[dry-run] Utworzono by commit: release: v{version} [skip ci]", + "ru": "[dry-run] Было бы закоммичено: release: v{version} [skip ci]", + "zh": "[dry-run] 将提交:release: v{version} [skip ci]" + }, + "[dry-run] Would create tag: v{version}": { + "bg": "[dry-run] Ще се създаде таг: v{version}", + "de": "[dry-run] Würde Tag erstellen: v{version}", + "en": "[dry-run] Would create tag: v{version}", + "pl": "[dry-run] Utworzono by tag: v{version}", + "ru": "[dry-run] Был бы создан тег: v{version}", + "zh": "[dry-run] 将创建标签:v{version}" + }, + "[dry-run] Would create tag: {tag}": { + "bg": "[dry-run] Ще се създаде таг: {tag}", + "de": "[dry-run] Würde Tag erstellen: {tag}", + "en": "[dry-run] Would create tag: {tag}", + "pl": "[dry-run] Utworzono by tag: {tag}", + "ru": "[dry-run] Был бы создан тег: {tag}", + "zh": "[dry-run] 将创建标签:{tag}" + }, + "[dry-run] Would push commit to master": { + "bg": "[dry-run] Ще се push-не комит към master", + "de": "[dry-run] Würde Commit zu master pushen", + "en": "[dry-run] Would push commit to master", + "pl": "[dry-run] Wypchnięto by commit do master", + "ru": "[dry-run] Коммит был бы отправлен в master", + "zh": "[dry-run] 将推送提交到 master" + }, + "[dry-run] Would update doc version references via check_doc_versions --fix": { + "bg": "", + "de": "", + "en": "[dry-run] Would update doc version references via check_doc_versions --fix", + "pl": "", + "ru": "", + "zh": "" + }, + "[dry-run] Would update {changelog_file}": { + "bg": "[dry-run] Ще се обнови {changelog_file}", + "de": "[dry-run] Würde {changelog_file} aktualisieren", + "en": "[dry-run] Would update {changelog_file}", + "pl": "[dry-run] Zaktualizowano by {changelog_file}", + "ru": "[dry-run] Был бы обновлён {changelog_file}", + "zh": "[dry-run] 将更新 {changelog_file}" + }, + "[dry-run] Would update {init}": { + "bg": "[dry-run] Ще се обнови {init}", + "de": "[dry-run] Würde {init} aktualisieren", + "en": "[dry-run] Would update {init}", + "pl": "[dry-run] Zaktualizowano by {init}", + "ru": "[dry-run] Был бы обновлён {init}", + "zh": "[dry-run] 将更新 {init}" + }, + "[fast-molecule] Changed roles: {roles}": { + "bg": "[fast-molecule] Променени роли: {roles}", + "de": "[fast-molecule] Geänderte Rollen: {roles}", + "en": "[fast-molecule] Changed roles: {roles}", + "pl": "[fast-molecule] Zmienione role: {roles}", + "ru": "[fast-molecule] Изменённые роли: {roles}", + "zh": "[fast-molecule] 已更改的角色:{roles}" + }, + "[nightly-gate] Nightly FAILED{run}. Staging deploys are blocked until nightly passes.": { + "bg": "[nightly-gate] Nightly СЕ ПРОВАЛИ{run}. Staging деплой е блокиран, докато nightly не премине.", + "de": "[nightly-gate] Nightly FEHLGESCHLAGEN{run}. Staging-Deploys sind blockiert, bis Nightly besteht.", + "en": "[nightly-gate] Nightly FAILED{run}. Staging deploys are blocked until nightly passes.", + "pl": "[nightly-gate] Nightly NIEUDANY{run}. Wdrożenia staging są zablokowane, dopóki nightly nie przejdzie.", + "ru": "[nightly-gate] Nightly ПРОВАЛЕН{run}. Деплои на staging заблокированы, пока nightly не пройдёт.", + "zh": "[nightly-gate] Nightly 失败{run}。在 nightly 通过之前,staging 部署被阻止。" + }, + "[nightly-gate] Set NIGHTLY_STATUS=failed{run}": { + "bg": "[nightly-gate] Зададено NIGHTLY_STATUS=failed{run}", + "de": "[nightly-gate] NIGHTLY_STATUS=failed{run} gesetzt", + "en": "[nightly-gate] Set NIGHTLY_STATUS=failed{run}", + "pl": "[nightly-gate] Ustawiono NIGHTLY_STATUS=failed{run}", + "ru": "[nightly-gate] Установлено NIGHTLY_STATUS=failed{run}", + "zh": "[nightly-gate] 已设置 NIGHTLY_STATUS=failed{run}" + }, + "[nightly-gate] Set NIGHTLY_STATUS=passed{run}": { + "bg": "[nightly-gate] Зададено NIGHTLY_STATUS=passed{run}", + "de": "[nightly-gate] NIGHTLY_STATUS=passed{run} gesetzt", + "en": "[nightly-gate] Set NIGHTLY_STATUS=passed{run}", + "pl": "[nightly-gate] Ustawiono NIGHTLY_STATUS=passed{run}", + "ru": "[nightly-gate] Установлено NIGHTLY_STATUS=passed{run}", + "zh": "[nightly-gate] 已设置 NIGHTLY_STATUS=passed{run}" + }, + "[nightly-gate] Unknown nightly status: {status} — blocking deploy (fail closed).": { + "bg": "[nightly-gate] Непознат nightly статус: {status} — деплой се блокира (fail closed).", + "de": "[nightly-gate] Unbekannter Nightly-Status: {status} — Deploy wird blockiert (fail closed).", + "en": "[nightly-gate] Unknown nightly status: {status} — blocking deploy (fail closed).", + "pl": "[nightly-gate] Nieznany status nightly: {status} — wdrożenie blokowane (fail closed).", + "ru": "[nightly-gate] Неизвестный статус nightly: {status} — деплой блокируется (fail closed).", + "zh": "[nightly-gate] 未知的 nightly 状态:{status}——部署被阻止(fail closed)。" + }, + "[spec-check] Spec validated: {path}": { + "bg": "[spec-check] Spec валидиран: {path}", + "de": "[spec-check] Spec validiert: {path}", + "en": "[spec-check] Spec validated: {path}", + "pl": "[spec-check] Spec zweryfikowany: {path}", + "ru": "[spec-check] Spec проверен: {path}", + "zh": "[spec-check] 规范已验证:{path}" + }, + "[tofu-init] Done.": { + "bg": "[tofu-init] Готово.", + "de": "[tofu-init] Fertig.", + "en": "[tofu-init] Done.", + "pl": "[tofu-init] Gotowe.", + "ru": "[tofu-init] Готово.", + "zh": "[tofu-init] 完成。" + }, + "[tofu-init] Initializing {dir}...": { + "bg": "[tofu-init] Инициализиране на {dir}...", + "de": "[tofu-init] Initialisiere {dir}...", + "en": "[tofu-init] Initializing {dir}...", + "pl": "[tofu-init] Inicjalizacja {dir}...", + "ru": "[tofu-init] Инициализация {dir}...", + "zh": "[tofu-init] 正在初始化 {dir}..." + }, + "[tofu-{mode}] All configurations valid.": { + "bg": "[tofu-{mode}] Всички конфигурации са валидни.", + "de": "[tofu-{mode}] Alle Konfigurationen gültig.", + "en": "[tofu-{mode}] All configurations valid.", + "pl": "[tofu-{mode}] Wszystkie konfiguracje są poprawne.", + "ru": "[tofu-{mode}] Все конфигурации валидны.", + "zh": "[tofu-{mode}] 所有配置有效。" + }, + "[tofu-{mode}] Validating OpenTofu configurations...": { + "bg": "[tofu-{mode}] Проверка на OpenTofu конфигурациите...", + "de": "[tofu-{mode}] Validiere OpenTofu-Konfigurationen...", + "en": "[tofu-{mode}] Validating OpenTofu configurations...", + "pl": "[tofu-{mode}] Sprawdzanie konfiguracji OpenTofu...", + "ru": "[tofu-{mode}] Проверка конфигураций OpenTofu...", + "zh": "[tofu-{mode}] 正在验证 OpenTofu 配置..." + }, + "[tool.devx] missing required keys: {keys}": { + "bg": "[tool.devx] липсват задължителни ключове: {keys}", + "de": "[tool.devx] fehlt erforderliche Schlüssel: {keys}", + "en": "[tool.devx] missing required keys: {keys}", + "pl": "[tool.devx] brak wymaganych kluczy: {keys}", + "ru": "[tool.devx] отсутствуют обязательные ключи: {keys}", + "zh": "[tool.devx] 缺少必需的键: {keys}" + }, + "active": { + "bg": "активен", + "de": "aktiv", + "en": "active", + "pl": "aktywny", + "ru": "активен", + "zh": "活跃" + }, + "completed": { + "bg": "завършен", + "de": "abgeschlossen", + "en": "completed", + "pl": "ukończony", + "ru": "завершён", + "zh": "已完成" + }, + "count={count}": { + "bg": "count={count}", + "de": "count={count}", + "en": "count={count}", + "pl": "count={count}", + "ru": "count={count}", + "zh": "count={count}" + }, + "devx version mismatch across extras: {detail}": { + "bg": "несъответствие на версията на devx между extras: {detail}", + "de": "devx-Versionskonflikt zwischen Extras: {detail}", + "en": "devx version mismatch across extras: {detail}", + "pl": "niezgodność wersji devx między extras: {detail}", + "ru": "несоответствие версии devx между extras: {detail}", + "zh": "devx 版本在 extras 之间不一致: {detail}" + }, + "failed": { + "bg": "неуспешен", + "de": "fehlgeschlagen", + "en": "failed", + "pl": "nieudany", + "ru": "неудачный", + "zh": "失败" + }, + "git command failed ({cmd}): {stderr}": { + "bg": "git командата се провали ({cmd}): {stderr}", + "de": "git-Befehl fehlgeschlagen ({cmd}): {stderr}", + "en": "git command failed ({cmd}): {stderr}", + "pl": "polecenie git nie powiodło się ({cmd}): {stderr}", + "ru": "git-команда завершилась с ошибкой ({cmd}): {stderr}", + "zh": "git 命令失败({cmd}):{stderr}" + }, + "git diff --numstat failed: {stderr}": { + "bg": "git diff --numstat се провали: {stderr}", + "de": "git diff --numstat fehlgeschlagen: {stderr}", + "en": "git diff --numstat failed: {stderr}", + "pl": "git diff --numstat nie powiódł się: {stderr}", + "ru": "git diff --numstat завершился с ошибкой: {stderr}", + "zh": "git diff --numstat 失败:{stderr}" + }, + "git-cliff generated empty changelog for v{version}. Check cliff.toml and commit history.": { + "bg": "git-cliff генерира празен changelog за v{version}. Проверете cliff.toml и историята на комитите.", + "de": "git-cliff hat ein leeres Changelog für v{version} generiert. Prüfen Sie cliff.toml und die Commit-Historie.", + "en": "git-cliff generated empty changelog for v{version}. Check cliff.toml and commit history.", + "pl": "git-cliff wygenerował pusty changelog dla v{version}. Sprawdź cliff.toml i historię commitów.", + "ru": "git-cliff сгенерировал пустой changelog для v{version}. Проверьте cliff.toml и историю коммитов.", + "zh": "git-cliff 为 v{version} 生成了空的 changelog。请检查 cliff.toml 和提交历史。" + }, + "git-cliff returned empty version.": { + "bg": "git-cliff върна празна версия.", + "de": "git-cliff gab eine leere Version zurück.", + "en": "git-cliff returned empty version.", + "pl": "git-cliff zwrócił pustą wersję.", + "ru": "git-cliff вернул пустую версию.", + "zh": "git-cliff 返回了空版本。" + }, + "git-cliff returned invalid version format: {version}. Expected semver (e.g., 0.4.1).": { + "bg": "git-cliff върна невалиден формат на версия: {version}. Очаква се semver (напр. 0.4.1).", + "de": "git-cliff gab ein ungültiges Versionsformat zurück: {version}. Erwartet: Semver (z. B. 0.4.1).", + "en": "git-cliff returned invalid version format: {version}. Expected semver (e.g., 0.4.1).", + "pl": "git-cliff zwrócił nieprawidłowy format wersji: {version}. Oczekiwano semver (np., 0.4.1).", + "ru": "git-cliff вернул неверный формат версии: {version}. Ожидается semver (напр. 0.4.1).", + "zh": "git-cliff 返回了无效的版本格式:{version}。应为 semver(例如 0.4.1)。" + }, + "importlib.reload({mod}) called {n} time(s) in test '{test}' — odd count leaves module in modified state. Add a final reload to restore defaults or wrap in try/finally.": { + "bg": "importlib.reload({mod}) е извикан {n} път(и) в тест '{test}' — нечетен брой оставя модула в променено състояние. Добавете финален reload за възстановяване на подразбираните или обвийте в try/finally.", + "de": "importlib.reload({mod}) wurde {n} Mal in Test '{test}' aufgerufen — ungerade Anzahl lässt Modul in verändertem Zustand. Finalen Reload hinzufügen oder in try/finally einhüllen.", + "en": "importlib.reload({mod}) called {n} time(s) in test '{test}' — odd count leaves module in modified state. Add a final reload to restore defaults or wrap in try/finally.", + "pl": "importlib.reload({mod}) wywołano {n} raz(y) w teście '{test}' — nieparzysta liczba pozostawia moduł w zmienionym stanie. Dodaj końcowy reload, aby przywrócić domyślne, lub owiń w try/finally.", + "ru": "importlib.reload({mod}) вызван {n} раз(а) в тесте '{test}' — нечётное количество оставляет модуль в изменённом состоянии. Добавьте финальный reload для восстановления или оберните в try/finally.", + "zh": "在测试 '{test}' 中调用了 {n} 次 importlib.reload({mod})——奇数次会使模块保持修改状态。请添加最后的 reload 恢复默认或用 try/finally 包裹。" + }, + "in_progress": { + "bg": "в процес", + "de": "in Bearbeitung", + "en": "in progress", + "pl": "w toku", + "ru": "в процессе", + "zh": "进行中" + }, + "inactive": { + "bg": "неактивен", + "de": "inaktiv", + "en": "inactive", + "pl": "nieaktywny", + "ru": "неактивен", + "zh": "未激活" + }, + "indices={indices}": { + "bg": "indices={indices}", + "de": "indices={indices}", + "en": "indices={indices}", + "pl": "indices={indices}", + "ru": "indices={indices}", + "zh": "indices={indices}" + }, + "mapping.json keys and values must be strings, got {k}={v}": { + "bg": "Ключовете и стойностите на mapping.json трябва да са низове, получено {k}={v}", + "de": "mapping.json-Schlüssel und -Werte müssen Strings sein, erhalten {k}={v}", + "en": "mapping.json keys and values must be strings, got {k}={v}", + "pl": "klucze i wartości mapping.json muszą być ciągami znaków, otrzymano {k}={v}", + "ru": "Ключи и значения mapping.json должны быть строками, получено {k}={v}", + "zh": "mapping.json 的键和值必须是字符串,实际得到 {k}={v}" + }, + "mapping.json must be a dict of file-path -> page-title, got {type}": { + "bg": "mapping.json трябва да е dict от file-path -> page-title, получено {type}", + "de": "mapping.json muss ein Dict von file-path -> page-title sein, erhalten {type}", + "en": "mapping.json must be a dict of file-path -> page-title, got {type}", + "pl": "mapping.json musi być słownikiem ścieżka-pliku -> tytuł-strony, otrzymano {type}", + "ru": "mapping.json должен быть dict вида file-path -> page-title, получено {type}", + "zh": "mapping.json 必须是 file-path -> page-title 的字典,实际得到 {type}" + }, + "pending": { + "bg": "в очакване", + "de": "ausstehend", + "en": "pending", + "pl": "oczekujący", + "ru": "ожидает", + "zh": "待处理" + }, + "pyproject.toml not found in current directory.": { + "bg": "pyproject.toml не е намерен в текущата директория.", + "de": "pyproject.toml im aktuellen Verzeichnis nicht gefunden.", + "en": "pyproject.toml not found in current directory.", + "pl": "nie znaleziono pyproject.toml w bieżącym katalogu.", + "ru": "pyproject.toml не найден в текущей директории.", + "zh": "在当前目录中未找到 pyproject.toml。" + }, + "tea login '{name}' already configured.": { + "bg": "tea входът '{name}' вече е конфигуриран.", + "de": "tea-Login '{name}' bereits konfiguriert.", + "en": "tea login '{name}' already configured.", + "pl": "Logowanie tea '{name}' już skonfigurowane.", + "ru": "Вход tea '{name}' уже настроен.", + "zh": "tea 登录 '{name}' 已配置。" + }, + "tea not installed — skipping login configuration.": { + "bg": "tea не е инсталиран — пропуска се конфигурацията за вход.", + "de": "tea nicht installiert — Login-Konfiguration wird übersprungen.", + "en": "tea not installed — skipping login configuration.", + "pl": "tea nie jest zainstalowany — pomijanie konfiguracji logowania.", + "ru": "tea не установлен — настройка входа пропускается.", + "zh": "未安装 tea——跳过登录配置。" + }, + "time.sleep called in test '{test}' without @patch — this causes real wall-clock delays. Add @patch(\".time.sleep\").": { + "bg": "time.sleep извикано в тест '{test}' без @patch — това причинява реални забавяния. Добавете @patch(\".time.sleep\").", + "de": "time.sleep in Test '{test}' ohne @patch aufgerufen — dies verursacht echte Wanduhr-Verzögerungen. @patch(\".time.sleep\") hinzufügen.", + "en": "time.sleep called in test '{test}' without @patch — this causes real wall-clock delays. Add @patch(\".time.sleep\").", + "pl": "time.sleep wywołane w teście '{test}' bez @patch — to powoduje rzeczywiste opóźnienia. Dodaj @patch(\".time.sleep\").", + "ru": "time.sleep вызвано в тесте '{test}' без @patch — это вызывает реальные задержки. Добавьте @patch(\".time.sleep\").", + "zh": "time.sleep 在测试 '{test}' 中被调用但没有 @patch — 这会导致真实的挂钟延迟。请添加 @patch(\".time.sleep\")。" + }, + "tofu command failed in {dir}: {error}": { + "bg": "командата tofu не успя в {dir}: {error}", + "de": "tofu-Befehl fehlgeschlagen in {dir}: {error}", + "en": "tofu command failed in {dir}: {error}", + "pl": "polecenie tofu nie powiodło się w {dir}: {error}", + "ru": "команда tofu не удалась в {dir}: {error}", + "zh": "tofu 命令在 {dir} 中失败: {error}" + }, + "unknown": { + "bg": "неизвестен", + "de": "unbekannt", + "en": "unknown", + "pl": "nieznany", + "ru": "неизвестно", + "zh": "未知" + }, + "{call} called in test '{test}' without @patch — this spawns a real subprocess. Add @patch(\".subprocess.run\") or patch the calling function.": { + "bg": "{call} извикано в тест '{test}' без @patch — това стартира реален subprocess. Добавете @patch(\".subprocess.run\") или patch-нете извикващата функция.", + "de": "{call} in Test '{test}' ohne @patch aufgerufen — dies startet einen echten subprocess. @patch(\".subprocess.run\") hinzufügen oder die aufrufende Funktion patchen.", + "en": "{call} called in test '{test}' without @patch — this spawns a real subprocess. Add @patch(\".subprocess.run\") or patch the calling function.", + "pl": "{call} wywołane w teście '{test}' bez @patch — to uruchamia rzeczywisty subprocess. Dodaj @patch(\".subprocess.run\") lub patchuj wywołującą funkcję.", + "ru": "{call} вызвано в тесте '{test}' без @patch — это запускает реальный subprocess. Добавьте @patch(\".subprocess.run\") или patch вызывающую функцию.", + "zh": "{call} 在测试 '{test}' 中被调用但没有 @patch — 这会启动真实的子进程。请添加 @patch(\".subprocess.run\") 或 patch 调用函数。" + }, + "{env} is not set. Set it in your .env file or pass it as an environment variable.": { + "bg": "{env} не е зададен. Задайте го във вашия .env файл или го подайте като променлива на средата.", + "de": "{env} ist nicht gesetzt. Setzen Sie es in Ihrer .env-Datei oder übergeben Sie es als Umgebungsvariable.", + "en": "{env} is not set. Set it in your .env file or pass it as an environment variable.", + "pl": "{env} nie jest ustawiony. Ustaw go w pliku .env lub przekaż jako zmienną środowiskową.", + "ru": "{env} не задан. Установите его в файле .env или передайте как переменную окружения.", + "zh": "{env} 未设置。请在 .env 文件中设置或作为环境变量传递。" + }, + "{env} is not set. Set it in your .env file.": { + "bg": "{env} не е зададен. Задайте го във вашия .env файл.", + "de": "{env} ist nicht gesetzt. Setzen Sie es in Ihrer .env-Datei.", + "en": "{env} is not set. Set it in your .env file.", + "pl": "{env} nie jest ustawiony. Ustaw go w pliku .env.", + "ru": "{env} не задан. Установите его в файле .env.", + "zh": "{env} 未设置。请在 .env 文件中设置。" + }, + "{file} already exists. Use --force to overwrite.": { + "bg": "{file} вече съществува. Използвайте --force за презаписване.", + "de": "{file} existiert bereits. Mit --force überschreiben.", + "en": "{file} already exists. Use --force to overwrite.", + "pl": "{file} już istnieje. Użyj --force, aby nadpisać.", + "ru": "{file} уже существует. Используйте --force для перезаписи.", + "zh": "{file} 已存在。使用 --force 覆盖。" + }, + "{func} called in test '{test}' without @patch — this function {desc}. Add @patch(\".{func}\").": { + "bg": "{func} извикано в тест '{test}' без @patch — тази функция {desc}. Добавете @patch(\".{func}\").", + "de": "{func} in Test '{test}' ohne @patch aufgerufen — diese Funktion {desc}. @patch(\".{func}\") hinzufügen.", + "en": "{func} called in test '{test}' without @patch — this function {desc}. Add @patch(\".{func}\").", + "pl": "{func} wywołane w teście '{test}' bez @patch — ta funkcja {desc}. Dodaj @patch(\".{func}\").", + "ru": "{func} вызвано в тесте '{test}' без @patch — эта функция {desc}. Добавьте @patch(\".{func}\").", + "zh": "{func} 在测试 '{test}' 中被调用但没有 @patch — 此函数 {desc}。请添加 @patch(\".{func}\")。" + }, + "{level}: {tool} not found.{hint}": { + "bg": "{level}: {tool} не е намерен.{hint}", + "de": "{level}: {tool} nicht gefunden.{hint}", + "en": "{level}: {tool} not found.{hint}", + "pl": "{level}: {tool} nie znaleziono.{hint}", + "ru": "{level}: {tool} не найден.{hint}", + "zh": "{level}: 未找到 {tool}。{hint}" + }, + "{separator}": { + "bg": "{separator}", + "de": "{separator}", + "en": "{separator}", + "pl": "{separator}", + "ru": "{separator}", + "zh": "{separator}" + } } diff --git a/tests/unit/test_auto_merge.py b/tests/unit/test_auto_merge.py index 5fbb426..07270c4 100644 --- a/tests/unit/test_auto_merge.py +++ b/tests/unit/test_auto_merge.py @@ -468,3 +468,138 @@ def test_main_module_block() -> None: exec(compile(source, am.__file__, "exec"), namespace) # Verify main is callable assert callable(namespace["main"]) + + +# -- DEVX-164: Vikunja outage resilience + self-approval diagnostics -- + + +class TestVikunjaLookupRetry: + """REQ-1: transient Vikunja API failures are retried, not fatal.""" + + @patch.dict("os.environ", {"VIKUNJA_TOKEN": "tok"}, clear=True) + @patch("devx.ci.auto_merge.time.sleep") + @patch("devx.ci.auto_merge.VikunjaClient") + def test_retries_transient_api_error_then_succeeds(self, mock_client_cls: MagicMock, mock_sleep: MagicMock) -> None: + """A 404/502 during a Vikunja restart is retried until tasks list.""" + mock_client = MagicMock() + mock_client.list_project_tasks.side_effect = [ + APIError(404, "Not Found"), + APIError(502, "Bad Gateway"), + [{"id": 1, "identifier": "DEVX-19", "title": "Add new feature"}], + ] + mock_client_cls.return_value = mock_client + validate_pr_title_matches_vikunja("DEVX-19: Add new feature", "DEVX-19") + assert mock_client.list_project_tasks.call_count == 3 + assert mock_sleep.call_count == 2 + + @patch.dict("os.environ", {"VIKUNJA_TOKEN": "tok"}, clear=True) + @patch("devx.ci.auto_merge.time.sleep") + @patch("devx.ci.auto_merge.VikunjaClient") + def test_retry_exhaustion_propagates_error(self, mock_client_cls: MagicMock, _mock_sleep: MagicMock) -> None: + """Persistent outage still fails after the bounded attempt count.""" + mock_client = MagicMock() + mock_client.list_project_tasks.side_effect = APIError(502, "Bad Gateway") + mock_client_cls.return_value = mock_client + with pytest.raises(APIError, match="Bad Gateway"): + validate_pr_title_matches_vikunja("DEVX-19: test", "DEVX-19") + assert mock_client.list_project_tasks.call_count == 4 + + @patch.dict("os.environ", {"VIKUNJA_TOKEN": "tok"}, clear=True) + @patch("devx.ci.auto_merge.time.sleep") + @patch("devx.ci.auto_merge.VikunjaClient") + def test_retries_connection_error(self, mock_client_cls: MagicMock, mock_sleep: MagicMock) -> None: + """Connection-level failures during restart are also retried.""" + import requests as req + + mock_client = MagicMock() + mock_client.list_project_tasks.side_effect = [ + req.ConnectionError("refused"), + [{"id": 1, "identifier": "DEVX-19", "title": "Found me"}], + ] + mock_client_cls.return_value = mock_client + validate_pr_title_matches_vikunja("DEVX-19: Found me", "DEVX-19") + assert mock_sleep.call_count == 1 + + @patch.dict("os.environ", {"VIKUNJA_TOKEN": "tok"}, clear=True) + @patch("devx.ci.auto_merge.VikunjaClient") + def test_missing_task_still_fails_without_retry_sleep(self, mock_client_cls: MagicMock) -> None: + """A healthy Vikunja that simply lacks the task fails as before.""" + mock_client = MagicMock() + mock_client.list_project_tasks.return_value = [] + mock_client_cls.return_value = mock_client + with pytest.raises(click.ClickException, match="Could not find"): + validate_pr_title_matches_vikunja("DEVX-99: test", "DEVX-99") + + +class TestMergeApprovalDiagnostics: + """REQ-2: merge 405 reports approval state + self-approval remediation.""" + + @patch.dict("os.environ", {"CI_GITEA_TOKEN": "tok", "VIKUNJA_TOKEN": "tok"}, clear=True) + @patch("devx.ci.auto_merge.validate_pr_title_matches_vikunja") + @patch("devx.ci.auto_merge.GiteaClient") + def test_405_without_approvals_shows_self_approval_hint( + self, mock_client_cls: MagicMock, _mock_validate: MagicMock, tmp_path, monkeypatch + ) -> None: # type: ignore[no-untyped-def] + monkeypatch.chdir(tmp_path) + mock_client = MagicMock() + mock_client.get_pr_commits.return_value = [ + {"commit": {"message": "fix: resolve timeout"}}, + ] + mock_client.merge_pr.side_effect = APIError(405, "Does not have enough approvals") + mock_client.get_pr_reviews.return_value = [] + mock_client_cls.return_value = mock_client + runner = CliRunner() + result = runner.invoke( + main, + ["DEVX-19-fix-bug", "DEVX-19: Fix timeout", "owner/repo", "7"], + ) + assert result.exit_code != 0 + assert "Merge failed" in result.output + assert "APPROVED" in result.output + assert "non-author account" in result.output + + @patch.dict("os.environ", {"CI_GITEA_TOKEN": "tok", "VIKUNJA_TOKEN": "tok"}, clear=True) + @patch("devx.ci.auto_merge.validate_pr_title_matches_vikunja") + @patch("devx.ci.auto_merge.GiteaClient") + def test_405_with_approvals_omits_hint( + self, mock_client_cls: MagicMock, _mock_validate: MagicMock, tmp_path, monkeypatch + ) -> None: # type: ignore[no-untyped-def] + monkeypatch.chdir(tmp_path) + mock_client = MagicMock() + mock_client.get_pr_commits.return_value = [ + {"commit": {"message": "fix: resolve timeout"}}, + ] + mock_client.merge_pr.side_effect = APIError(405, "Does not have enough approvals") + mock_client.get_pr_reviews.return_value = [{"state": "APPROVED", "user": {"login": "kireto"}}] + mock_client_cls.return_value = mock_client + runner = CliRunner() + result = runner.invoke( + main, + ["DEVX-19-fix-bug", "DEVX-19: Fix timeout", "owner/repo", "7"], + ) + assert result.exit_code != 0 + assert "Merge failed" in result.output + assert "non-author account" not in result.output + + @patch.dict("os.environ", {"CI_GITEA_TOKEN": "tok", "VIKUNJA_TOKEN": "tok"}, clear=True) + @patch("devx.ci.auto_merge.validate_pr_title_matches_vikunja") + @patch("devx.ci.auto_merge.GiteaClient") + def test_405_reviews_fetch_failure_still_raises( + self, mock_client_cls: MagicMock, _mock_validate: MagicMock, tmp_path, monkeypatch + ) -> None: # type: ignore[no-untyped-def] + """If the reviews lookup itself fails, the merge error still surfaces.""" + monkeypatch.chdir(tmp_path) + mock_client = MagicMock() + mock_client.get_pr_commits.return_value = [ + {"commit": {"message": "fix: resolve timeout"}}, + ] + mock_client.merge_pr.side_effect = APIError(405, "Does not have enough approvals") + mock_client.get_pr_reviews.side_effect = APIError(403, "Forbidden") + mock_client_cls.return_value = mock_client + runner = CliRunner() + result = runner.invoke( + main, + ["DEVX-19-fix-bug", "DEVX-19: Fix timeout", "owner/repo", "7"], + ) + assert result.exit_code != 0 + assert "Merge failed" in result.output