diff --git a/src/devx/ci/detect_release_commit.py b/src/devx/ci/detect_release_commit.py index b0a9dce..0c76587 100644 --- a/src/devx/ci/detect_release_commit.py +++ b/src/devx/ci/detect_release_commit.py @@ -18,6 +18,7 @@ import subprocess # nosec B404 import click from devx.ci._shared import write_github_output +from devx.i18n import _ RELEASE_RE = re.compile(r"^release: v\d+\.\d+\.\d+") @@ -44,13 +45,13 @@ def is_release_commit(message: str) -> bool: def main() -> None: """Detect if the latest commit is a release commit and set GITHUB_OUTPUT.""" msg = get_commit_message() - click.echo(f"Commit message: {msg}") + click.echo(_("Commit message: {msg}", msg=msg)) is_release = is_release_commit(msg) write_github_output("is-release", "true" if is_release else "false") if is_release: - click.echo("Release commit — skipping all post-merge jobs.") + click.echo(_("Release commit — skipping all post-merge jobs.")) else: - click.echo("Regular merge commit — running all post-merge jobs.") + click.echo(_("Regular merge commit — running all post-merge jobs.")) if __name__ == "__main__": # pragma: no cover diff --git a/src/devx/ci/discover_runners.py b/src/devx/ci/discover_runners.py index c73df1a..943cc79 100644 --- a/src/devx/ci/discover_runners.py +++ b/src/devx/ci/discover_runners.py @@ -30,6 +30,7 @@ import click import requests from devx.config import GITEA_API_URL, REPO_NAME, REPO_OWNER +from devx.i18n import _ DEFAULT_MAX_RUNNERS = 3 @@ -55,9 +56,9 @@ def query_runners(api_url: str, token: str, owner: str, repo: str) -> int: data = r.json() total += data.get("total_count", 0) else: - click.echo(f"Warning: repo-level runners query returned HTTP {r.status_code}", err=True) + click.echo(_("Warning: repo-level runners query returned HTTP {status}", status=r.status_code), err=True) except (requests.RequestException, ValueError) as e: - click.echo(f"Warning: repo-level runners query failed: {e}", err=True) + click.echo(_("Warning: repo-level runners query failed: {error}", error=e), err=True) # 2. Organization-level runners try: @@ -70,9 +71,9 @@ def query_runners(api_url: str, token: str, owner: str, repo: str) -> int: data = r.json() total += data.get("total_count", 0) else: - click.echo(f"Warning: org-level runners query returned HTTP {r.status_code}", err=True) + click.echo(_("Warning: org-level runners query returned HTTP {status}", status=r.status_code), err=True) except (requests.RequestException, ValueError) as e: - click.echo(f"Warning: org-level runners query failed: {e}", err=True) + click.echo(_("Warning: org-level runners query failed: {error}", error=e), err=True) # 3. Instance-level runners (requires admin scope) try: @@ -85,9 +86,12 @@ def query_runners(api_url: str, token: str, owner: str, repo: str) -> int: data = r.json() total += data.get("total_count", 0) elif r.status_code != 403: # 403 is expected without admin scope - click.echo(f"Warning: instance-level runners query returned HTTP {r.status_code}", err=True) + click.echo( + _("Warning: instance-level runners query returned HTTP {status}", status=r.status_code), + err=True, + ) except (requests.RequestException, ValueError) as e: - click.echo(f"Warning: instance-level runners query failed: {e}", err=True) + click.echo(_("Warning: instance-level runners query failed: {error}", error=e), err=True) return total @@ -165,8 +169,8 @@ def main( with open(gh_output, "a", encoding="utf-8") as f: # noqa: PTH123 f.write(f"runner-count={count}\n") f.write(f"runner-indices={json.dumps(indices)}\n") - click.echo(f"Runner count: {count}") - click.echo(f"Runner indices: {indices}") + click.echo(_("Runner count: {count}", count=count)) + click.echo(_("Runner indices: {indices}", indices=indices)) return if output_count: @@ -178,8 +182,8 @@ def main( return # Default: output both as key=value pairs for CI consumption - click.echo(f"count={count}") - click.echo(f"indices={json.dumps(indices)}") + click.echo(_("count={count}", count=count)) + click.echo(_("indices={indices}", indices=json.dumps(indices))) if __name__ == "__main__": # pragma: no cover diff --git a/src/devx/ci/distribute_files.py b/src/devx/ci/distribute_files.py index 97c02ac..2fa2a6c 100644 --- a/src/devx/ci/distribute_files.py +++ b/src/devx/ci/distribute_files.py @@ -102,17 +102,25 @@ def main(pattern: str, runner_index: int | None, max_runners: int, github_env: b groups = distribute(files, max_runners) for i, group in enumerate(groups): labels = " ".join(group) if group else "(none)" - click.echo(f"Runner {i}: {labels}") + click.echo(_("Runner {i}: {labels}", i=i, labels=labels)) return if skip_if_excess and github_env and runner_index > max_runners: - click.echo(f"Skipping — runner index {runner_index} > max runners {max_runners}") + click.echo( + _( + "Skipping — runner index {runner_index} > max runners {max_runners}", + runner_index=runner_index, + max_runners=max_runners, + ) + ) write_github_env("ASSIGNED_FILES", "") write_github_env("SKIP", "true") return if runner_index < 1: - raise click.ClickException(f"Runner index {runner_index} is out of range (must be >= 1)") + raise click.ClickException( + _("Runner index {runner_index} is out of range (must be >= 1)", runner_index=runner_index) + ) zero_based = runner_index - 1 assigned = files_for_runner(files, zero_based, max_runners) @@ -121,7 +129,7 @@ def main(pattern: str, runner_index: int | None, max_runners: int, github_env: b if github_env: write_github_env("ASSIGNED_FILES", encoded) write_github_env("SKIP", "false") - click.echo(f"Assigned {len(assigned)} files to runner {runner_index}") + click.echo(_("Assigned {count} files to runner {runner_index}", count=len(assigned), runner_index=runner_index)) return click.echo(encoded) diff --git a/src/devx/ci/distribute_items.py b/src/devx/ci/distribute_items.py index ac2a1b2..dc17058 100644 --- a/src/devx/ci/distribute_items.py +++ b/src/devx/ci/distribute_items.py @@ -162,17 +162,25 @@ def main( groups = distribute(items, weights, max_runners) for i, group in enumerate(groups): labels = " ".join(group) if group else "(none)" - click.echo(f"Runner {i}: {labels}") + click.echo(_("Runner {i}: {labels}", i=i, labels=labels)) return if skip_if_excess and github_env and runner_index > max_runners: - click.echo(f"Skipping — runner index {runner_index} > max runners {max_runners}") + click.echo( + _( + "Skipping — runner index {runner_index} > max runners {max_runners}", + runner_index=runner_index, + max_runners=max_runners, + ) + ) write_github_env("ASSIGNED_ITEMS", "") write_github_env("SKIP", "true") return if runner_index < 1: - raise click.ClickException(f"Runner index {runner_index} is out of range (must be >= 1)") + raise click.ClickException( + _("Runner index {runner_index} is out of range (must be >= 1)", runner_index=runner_index) + ) zero_based = runner_index - 1 assigned = items_for_runner(items, weights, zero_based, max_runners) @@ -181,7 +189,14 @@ def main( if github_env: write_github_env("ASSIGNED_ITEMS", encoded) write_github_env("SKIP", "false") - click.echo(f"Assigned {len(assigned)} items to runner {runner_index}: {encoded}") + click.echo( + _( + "Assigned {count} items to runner {runner_index}: {encoded}", + count=len(assigned), + runner_index=runner_index, + encoded=encoded, + ) + ) return click.echo(encoded) diff --git a/src/devx/ci/integration_guard.py b/src/devx/ci/integration_guard.py index bafdd1a..a35992a 100644 --- a/src/devx/ci/integration_guard.py +++ b/src/devx/ci/integration_guard.py @@ -86,7 +86,7 @@ def cli(pytest_args: tuple[str, ...]) -> None: cmd = [sys.executable, "-m", "pytest"] cmd.extend(pytest_args) - click.echo(f"Running: {' '.join(cmd)}") + click.echo(_("Running: {cmd}", cmd=" ".join(cmd))) process = subprocess.Popen( # nosec B603 cmd, diff --git a/src/devx/ci/push_badges.py b/src/devx/ci/push_badges.py index 682b4f0..896f66b 100644 --- a/src/devx/ci/push_badges.py +++ b/src/devx/ci/push_badges.py @@ -28,6 +28,8 @@ from typing import Any import click +from devx.i18n import _ + def _repo_root() -> Path: """Resolve repo root from GITHUB_WORKSPACE or cwd.""" @@ -68,7 +70,7 @@ def fetch_latest_master(branch: str = "master") -> None: """ _run(["git", "fetch", "origin", branch]) # nosec B607 _run(["git", "reset", "--hard", f"origin/{branch}"]) # nosec B607 - click.echo(f"Synced to latest origin/{branch}") + click.echo(_("Synced to latest origin/{branch}", branch=branch)) def generate_badges(output_dir: str) -> None: @@ -76,8 +78,8 @@ def generate_badges(output_dir: str) -> None: _run([sys.executable, "-m", "devx.tools.generate_badges", "--output-dir", output_dir]) badges = list(Path(output_dir).glob("*.svg")) if not badges: - raise click.ClickException("No badge SVG files generated") - click.echo(f"Generated {len(badges)} badge files") + raise click.ClickException(_("No badge SVG files generated")) + click.echo(_("Generated {count} badge files", count=len(badges))) def push_to_badges_branch(badges_dir: str) -> str: @@ -99,12 +101,12 @@ def push_to_badges_branch(badges_dir: str) -> str: _run(["git", "add", "./*.svg"]) # nosec B607 _run(["git", "commit", "--no-verify", "-m", "Update badges [skip ci]"]) # nosec B607 _run(["git", "push", "origin", "badges", "--force"]) # nosec B607 - click.echo("Badges pushed to badges branch") + click.echo(_("Badges pushed to badges branch")) # Get the commit SHA of the badges branch result = _run_capture(["git", "rev-parse", "HEAD"]) # nosec B607 sha = result.stdout.strip() - click.echo(f"Badges commit SHA: {sha}") + click.echo(_("Badges commit SHA: {sha}", sha=sha)) return sha @@ -142,11 +144,11 @@ def update_readme_with_badge_sha(badges_sha: str, repo_root: Path | None = None) new_content = update_badge_urls(content, badges_sha) if new_content != content: filepath.write_text(new_content) - click.echo(f"Updated badge URLs in {filename}") + click.echo(_("Updated badge URLs in {filename}", filename=filename)) updated_any = True if not updated_any: - click.echo("No badge URLs found to update — README already up to date") + click.echo(_("No badge URLs found to update — README already up to date")) return _run(["git", "add", "README.md", "docs/index.md"]) # nosec B607 @@ -160,7 +162,7 @@ def update_readme_with_badge_sha(badges_sha: str, repo_root: Path | None = None) ] ) # nosec B607 _run(["git", "push", "origin", "master"]) # nosec B607 - click.echo(f"Pushed README update with badge SHA {badges_sha[:8]}") + click.echo(_("Pushed README update with badge SHA {sha}", sha=badges_sha[:8])) @click.command() @@ -193,13 +195,22 @@ def main(output_dir: str, branch: str, no_readme_update: bool, retries: int) -> except (subprocess.CalledProcessError, RuntimeError) as exc: last_error = exc if attempt < retries: - click.echo(f"Badge push attempt {attempt}/{retries} failed — retrying: {exc}") + click.echo( + _( + "Badge push attempt {attempt}/{retries} failed — retrying: {error}", + attempt=attempt, + retries=retries, + error=exc, + ) + ) time.sleep(10) with contextlib.suppress(subprocess.CalledProcessError): fetch_latest_master(branch) else: - click.echo(f"Badge push failed after {retries} attempts: {exc}") - raise click.ClickException(f"Badge push failed after {retries} attempts: {last_error}") + click.echo(_("Badge push failed after {retries} attempts: {error}", retries=retries, error=exc)) + raise click.ClickException( + _("Badge push failed after {retries} attempts: {error}", retries=retries, error=last_error) + ) if __name__ == "__main__": # pragma: no cover diff --git a/src/devx/tools/clean_images.py b/src/devx/tools/clean_images.py index e09d542..f829886 100644 --- a/src/devx/tools/clean_images.py +++ b/src/devx/tools/clean_images.py @@ -200,9 +200,9 @@ def main( total_kept = 0 total_failed = 0 for name in names: - click.echo(f"\n{'=' * 60}") - click.echo(f"Package: {owner}/{name}") - click.echo(f"{'=' * 60}") + click.echo(_("\n{separator}", separator="=" * 60)) + click.echo(_("Package: {owner}/{name}", owner=owner, name=name)) + click.echo(_("{separator}", separator="=" * 60)) try: versions = list_package_versions(base_url, owner, name, token) except requests.RequestException as exc: @@ -217,17 +217,19 @@ def main( click.echo(_("No versions found.")) continue - click.echo(f"Found {len(versions)} version(s):") + click.echo(_("Found {count} version(s):", count=len(versions))) for v in sort_versions_by_date(versions): - click.echo(f" {v.get('version', '?')} (created: {v.get('created_at', '?')})") + click.echo( + _(" {version} (created: {created})", version=v.get("version", "?"), created=v.get("created_at", "?")) + ) to_delete = select_for_deletion(versions, keep) kept_count = len(versions) - len(to_delete) - click.echo(f"\nKeeping {kept_count}, would delete {len(to_delete)}") + click.echo(_("\nKeeping {kept}, would delete {count}", kept=kept_count, count=len(to_delete))) if dry_run: for v in to_delete: - click.echo(f" [dry-run] Would delete: {v.get('version', '?')}") + click.echo(_(" [dry-run] Would delete: {version}", version=v.get("version", "?"))) total_kept += kept_count continue @@ -236,17 +238,24 @@ def main( for v in to_delete: version = str(v.get("version", "")) if delete_package_version(base_url, owner, name, version, token): - click.echo(f" Deleted: {version}") + click.echo(_(" Deleted: {version}", version=version)) deleted_count += 1 else: - click.echo(f" FAILED to delete: {version}", err=True) + click.echo(_(" FAILED to delete: {version}", version=version), err=True) failed_count += 1 total_deleted += deleted_count total_kept += kept_count total_failed += failed_count - click.echo(f"\nDone. Deleted {total_deleted}, kept {total_kept}, failed {total_failed}.") + click.echo( + _( + "\nDone. Deleted {deleted}, kept {kept}, failed {failed}.", + deleted=total_deleted, + kept=total_kept, + failed=total_failed, + ) + ) if total_failed > 0: raise click.ClickException(_("Failed to delete {count} image version(s)", count=total_failed)) diff --git a/src/devx/tools/generate_badges.py b/src/devx/tools/generate_badges.py index ff1f89c..df68cf6 100644 --- a/src/devx/tools/generate_badges.py +++ b/src/devx/tools/generate_badges.py @@ -27,6 +27,8 @@ from pathlib import Path import click +from devx.i18n import _ + # Coverage regex matches "TOTAL ... NN%" or "TOTAL ... NN.NN%" _COVERAGE_RE = re.compile(r"TOTAL.*?(\d+(?:\.\d+)?)%") _PASSED_RE = re.compile(r"(\d+) passed") @@ -197,17 +199,19 @@ def read_version(repo_root: Path) -> str: """ pkg = detect_package_name(repo_root) if pkg is None: - click.echo(" WARNING: No Python package found under src/ — version badge will show 'unknown'") + click.echo(_(" WARNING: No Python package found under src/ — version badge will show 'unknown'")) return "unknown" init_file = repo_root / "src" / pkg / "__init__.py" if not init_file.exists(): - click.echo(f" WARNING: {init_file} not found — version badge will show 'unknown'") + click.echo(_(" WARNING: {init_file} not found — version badge will show 'unknown'", init_file=init_file)) return "unknown" content = init_file.read_text() match = re.search(r'__version__\s*=\s*["\']([^"\']+)["\']', content) if match: return match.group(1) - click.echo(f" WARNING: No __version__ found in {init_file} — version badge will show 'unknown'") + click.echo( + _(" WARNING: No __version__ found in {init_file} — version badge will show 'unknown'", init_file=init_file) + ) return "unknown" @@ -278,11 +282,11 @@ def collect_coverage_and_tests(repo_root: Path) -> tuple[dict[str, str | int], d """ cov_target = detect_coverage_target(repo_root) if cov_target is None: - click.echo(" WARNING: No coverage target detected (no src/ package, no --cov in pyproject.toml)") + click.echo(_(" WARNING: No coverage target detected (no src/ package, no --cov in pyproject.toml)")) return make_badge("coverage", "unknown", "lightgrey"), make_badge("tests", "unknown", "lightgrey") testpaths = detect_testpaths(repo_root) - click.echo(f" Test paths: {testpaths or '(pytest defaults)'}") + click.echo(_(" Test paths: {testpaths}", testpaths=testpaths or "(pytest defaults)")) cmd = [ sys.executable, @@ -302,18 +306,18 @@ def collect_coverage_and_tests(repo_root: Path) -> tuple[dict[str, str | int], d if coverage is not None: cov_badge = make_badge("coverage", f"{coverage:.0f}%", coverage_color(coverage)) else: - click.echo(f" WARNING: Could not extract coverage from pytest output (rc={rc})") - click.echo(f" pytest stdout (last 300 chars): {stdout.strip()[-300:]}") - click.echo(f" pytest stderr (last 300 chars): {stderr.strip()[-300:]}") + click.echo(_(" WARNING: Could not extract coverage from pytest output (rc={rc})", rc=rc)) + click.echo(_(" pytest stdout (last 300 chars): {stdout}", stdout=stdout.strip()[-300:])) + click.echo(_(" pytest stderr (last 300 chars): {stderr}", stderr=stderr.strip()[-300:])) cov_badge = make_badge("coverage", "unknown", "red") test_count = extract_test_count(combined) if test_count is not None: tests_badge = make_badge("tests", f"{test_count} passing", "brightgreen" if rc == 0 else "red") else: - click.echo(f" WARNING: Could not extract test count from pytest output (rc={rc})") - click.echo(f" pytest stdout (last 300 chars): {stdout.strip()[-300:]}") - click.echo(f" pytest stderr (last 300 chars): {stderr.strip()[-300:]}") + click.echo(_(" WARNING: Could not extract test count from pytest output (rc={rc})", rc=rc)) + click.echo(_(" pytest stdout (last 300 chars): {stdout}", stdout=stdout.strip()[-300:])) + click.echo(_(" pytest stderr (last 300 chars): {stderr}", stderr=stderr.strip()[-300:])) tests_badge = make_badge("tests", "unknown", "red") return cov_badge, tests_badge @@ -328,8 +332,8 @@ def collect_doc_coverage(repo_root: Path) -> dict[str, str | int]: doc_pct = extract_doc_coverage(stdout) if doc_pct is not None: return make_badge("docs", f"{doc_pct}%", doc_coverage_color(doc_pct)) - click.echo(f" WARNING: Could not extract doc coverage (rc={rc})") - click.echo(f" stderr: {stderr.strip()[:200]}") + click.echo(_(" WARNING: Could not extract doc coverage (rc={rc})", rc=rc)) + click.echo(_(" stderr: {stderr}", stderr=stderr.strip()[:200])) return make_badge("docs", "unknown", "red") @@ -356,16 +360,16 @@ def collect_quality(repo_root: Path) -> dict[str, str | int]: results.append(False) # Distinguish "tool not installed" from "tool found issues" if "No module named" in stderr or "not found" in stderr.lower(): - click.echo(f" WARNING: {name} not installed — skipping (counted as pass)") + click.echo(_(" WARNING: {name} not installed — skipping (counted as pass)", name=name)) results[-1] = True tool_names.append(f"{name}: not installed (skipped)") else: tool_names.append(f"{name}: FAIL") - click.echo(f" WARNING: {name} failed (rc={rc})") - click.echo(f" stderr: {stderr.strip()[:200]}") + click.echo(_(" WARNING: {name} failed (rc={rc})", name=name, rc=rc)) + click.echo(_(" stderr: {stderr}", stderr=stderr.strip()[:200])) all_pass = all(results) - click.echo(f" Quality checks: {', '.join(tool_names)}") + click.echo(_(" Quality checks: {checks}", checks=", ".join(tool_names))) return make_badge("code quality", "A" if all_pass else "F", "brightgreen" if all_pass else "red") @@ -377,28 +381,28 @@ def generate_badges(output_dir: Path, repo_root: Path | None = None) -> dict[str repo_root: Repository root (auto-detected if None). """ root = repo_root or resolve_repo_root() - click.echo(f" Repo root: {root}") + click.echo(_(" Repo root: {root}", root=root)) pkg = detect_package_name(root) - click.echo(f" Package: {pkg or 'none'}") + click.echo(_(" Package: {pkg}", pkg=pkg or "none")) badges: dict[str, dict[str, str | int]] = {} # 1. Code coverage + test count (single pytest-cov run) - click.echo(" Collecting coverage and tests...") + click.echo(_(" Collecting coverage and tests...")) cov_badge, tests_badge = collect_coverage_and_tests(root) badges["coverage"] = cov_badge badges["tests"] = tests_badge # 2. Documentation coverage - click.echo(" Collecting doc coverage...") + click.echo(_(" Collecting doc coverage...")) badges["docs"] = collect_doc_coverage(root) # 3. Code quality (ruff + pyright + bandit) - click.echo(" Collecting code quality...") + click.echo(_(" Collecting code quality...")) badges["quality"] = collect_quality(root) # 4. Version - click.echo(" Collecting version...") + click.echo(_(" Collecting version...")) version = read_version(root) badges["version"] = make_badge("version", f"v{version}", "blue") @@ -411,7 +415,7 @@ def generate_badges(output_dir: Path, repo_root: Path | None = None) -> dict[str svg = render_svg(str(badge["label"]), str(badge["message"]), str(badge["color"])) path = output_dir / f"{name}.svg" path.write_text(svg) - click.echo(f" Generated: {path}") + click.echo(_(" Generated: {path}", path=path)) return badges @@ -431,11 +435,19 @@ def cli(output_dir: str, repo_root: str | None) -> None: """Generate self-contained SVG badge files from project metrics.""" out = Path(output_dir) root = Path(repo_root) if repo_root else None - click.echo(f"Generating badges in {out}...") + click.echo(_("Generating badges in {out}...", out=out)) badges = generate_badges(out, repo_root=root) - click.echo(f"\nGenerated {len(badges)} badges:") + click.echo(_("\nGenerated {count} badges:", count=len(badges))) for name, badge in badges.items(): - click.echo(f" {name}: {badge['label']}={badge['message']} ({badge['color']})") + click.echo( + _( + " {name}: {label}={message} ({color})", + name=name, + label=badge["label"], + message=badge["message"], + color=badge["color"], + ) + ) if __name__ == "__main__": # pragma: no cover diff --git a/src/devx/translations.json b/src/devx/translations.json index 4a30a67..0620144 100644 --- a/src/devx/translations.json +++ b/src/devx/translations.json @@ -55,6 +55,14 @@ "ru": "\nDone! Created: {created}, Updated: {updated}, Skipped: {skipped}", "zh": "\nDone! Created: {created}, Updated: {updated}, Skipped: {skipped}" }, + "\nDone. Deleted {deleted}, kept {kept}, failed {failed}.": { + "bg": "\nDone. Deleted {deleted}, kept {kept}, failed {failed}.", + "de": "\nDone. Deleted {deleted}, kept {kept}, failed {failed}.", + "en": "\nDone. Deleted {deleted}, kept {kept}, failed {failed}.", + "pl": "\nDone. Deleted {deleted}, kept {kept}, failed {failed}.", + "ru": "\nDone. Deleted {deleted}, kept {kept}, failed {failed}.", + "zh": "\nDone. Deleted {deleted}, kept {kept}, failed {failed}." + }, "\nERROR: Documentation coverage is not 100%. Use --fail-on-missing to enforce.": { "bg": "\nERROR: Documentation coverage is not 100%. Use --fail-on-missing to enforce.", "de": "\nERROR: Documentation coverage is not 100%. Use --fail-on-missing to enforce.", @@ -71,6 +79,14 @@ "ru": "\nFix the misaligned tags before creating new releases. Run 'python3 -m devx.ci.release --verify' for a full report.", "zh": "\nFix the misaligned tags before creating new releases. Run 'python3 -m devx.ci.release --verify' for a full report." }, + "\nGenerated {count} badges:": { + "bg": "\nGenerated {count} badges:", + "de": "\nGenerated {count} badges:", + "en": "\nGenerated {count} badges:", + "pl": "\nGenerated {count} badges:", + "ru": "\nGenerated {count} badges:", + "zh": "\nGenerated {count} badges:" + }, "\nIntegrity check FAILED ({count} issues):": { "bg": "\nIntegrity check FAILED ({count} issues):", "de": "\nIntegrity check FAILED ({count} issues):", @@ -87,6 +103,14 @@ "ru": "\nIntegrity check passed — all {count} pages verified.", "zh": "\nIntegrity check passed — all {count} pages verified." }, + "\nKeeping {kept}, would delete {count}": { + "bg": "\nKeeping {kept}, would delete {count}", + "de": "\nKeeping {kept}, would delete {count}", + "en": "\nKeeping {kept}, would delete {count}", + "pl": "\nKeeping {kept}, would delete {count}", + "ru": "\nKeeping {kept}, would delete {count}", + "zh": "\nKeeping {kept}, would delete {count}" + }, "\nLatest tag: {tag}": { "bg": "\nLatest tag: {tag}", "de": "\nLatest tag: {tag}", @@ -119,6 +143,14 @@ "ru": "\nReview #{review_id} posted on PR #{pr_number} with event '{event}' ({num_comments} inline comments).", "zh": "\nReview #{review_id} posted on PR #{pr_number} with event '{event}' ({num_comments} inline comments)." }, + "\nReview #{review_id} posted on PR #{pr_number} with event '{event}'.": { + "en": "\nReview #{review_id} posted on PR #{pr_number} with event '{event}'.", + "bg": "\nReview #{review_id} posted on PR #{pr_number} with event '{event}'.", + "de": "\nReview #{review_id} posted on PR #{pr_number} with event '{event}'.", + "pl": "\nReview #{review_id} posted on PR #{pr_number} with event '{event}'.", + "ru": "\nReview #{review_id} posted on PR #{pr_number} with event '{event}'.", + "zh": "\nReview #{review_id} posted on PR #{pr_number} with event '{event}'." + }, "\nRunning full wiki integrity check...": { "bg": "\nRunning full wiki integrity check...", "de": "\nRunning full wiki integrity check...", @@ -183,6 +215,14 @@ "ru": "\nWorkflow-only changes ({count}):", "zh": "\nWorkflow-only changes ({count}):" }, + "\n[check_test_coverage] Fix: add the missing test file(s) before committing.": { + "en": "\n[check_test_coverage] Fix: add the missing test file(s) before committing.", + "bg": "\n[check_test_coverage] Fix: add the missing test file(s) before committing.", + "de": "\n[check_test_coverage] Fix: add the missing test file(s) before committing.", + "pl": "\n[check_test_coverage] Fix: add the missing test file(s) before committing.", + "ru": "\n[check_test_coverage] Fix: add the missing test file(s) before committing.", + "zh": "\n[check_test_coverage] Fix: add the missing test file(s) before committing." + }, "\n[dry-run] Changelog:\n{changelog}": { "bg": "\n[dry-run] Changelog:\n{changelog}", "de": "\n[dry-run] Changelog:\n{changelog}", @@ -199,6 +239,14 @@ "ru": "\n{label} files changed ({count}):", "zh": "\n{label} files changed ({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} files ({count}):", "de": "\n{tag} files ({count}):", @@ -207,6 +255,38 @@ "ru": "\n{tag} files ({count}):", "zh": "\n{tag} files ({count}):" }, + " Could not fetch logs: {error}": { + "en": " Could not fetch logs: {error}", + "bg": " Could not fetch logs: {error}", + "de": " Could not fetch logs: {error}", + "pl": " Could not fetch logs: {error}", + "ru": " Could not fetch logs: {error}", + "zh": " Could not fetch logs: {error}" + }, + " pytest stderr (last 300 chars): {stderr}": { + "bg": " pytest stderr (last 300 chars): {stderr}", + "de": " pytest stderr (last 300 chars): {stderr}", + "en": " pytest stderr (last 300 chars): {stderr}", + "pl": " pytest stderr (last 300 chars): {stderr}", + "ru": " pytest stderr (last 300 chars): {stderr}", + "zh": " pytest stderr (last 300 chars): {stderr}" + }, + " pytest stdout (last 300 chars): {stdout}": { + "bg": " pytest stdout (last 300 chars): {stdout}", + "de": " pytest stdout (last 300 chars): {stdout}", + "en": " pytest stdout (last 300 chars): {stdout}", + "pl": " pytest stdout (last 300 chars): {stdout}", + "ru": " pytest stdout (last 300 chars): {stdout}", + "zh": " pytest stdout (last 300 chars): {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", @@ -215,6 +295,14 @@ "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", @@ -263,6 +351,38 @@ "ru": " - Требуемые проверки статуса: {checks}", "zh": " - 必需状态检查: {checks}" }, + " Collecting code quality...": { + "bg": " Collecting code quality...", + "de": " Collecting code quality...", + "en": " Collecting code quality...", + "pl": " Collecting code quality...", + "ru": " Collecting code quality...", + "zh": " Collecting code quality..." + }, + " Collecting coverage and tests...": { + "bg": " Collecting coverage and tests...", + "de": " Collecting coverage and tests...", + "en": " Collecting coverage and tests...", + "pl": " Collecting coverage and tests...", + "ru": " Collecting coverage and tests...", + "zh": " Collecting coverage and tests..." + }, + " Collecting doc coverage...": { + "bg": " Collecting doc coverage...", + "de": " Collecting doc coverage...", + "en": " Collecting doc coverage...", + "pl": " Collecting doc coverage...", + "ru": " Collecting doc coverage...", + "zh": " Collecting doc coverage..." + }, + " Collecting version...": { + "bg": " Collecting version...", + "de": " Collecting version...", + "en": " Collecting version...", + "pl": " Collecting version...", + "ru": " Collecting version...", + "zh": " Collecting version..." + }, " Created: {title}": { "bg": " Created: {title}", "de": " Created: {title}", @@ -271,6 +391,14 @@ "ru": " Created: {title}", "zh": " Created: {title}" }, + " Deleted: {version}": { + "bg": " Deleted: {version}", + "de": " Deleted: {version}", + "en": " Deleted: {version}", + "pl": " Deleted: {version}", + "ru": " Deleted: {version}", + "zh": " Deleted: {version}" + }, " FAIL: {title} — content mismatch or empty!": { "bg": " FAIL: {title} — content mismatch or empty!", "de": " FAIL: {title} — content mismatch or empty!", @@ -279,6 +407,22 @@ "ru": " FAIL: {title} — content mismatch or empty!", "zh": " FAIL: {title} — content mismatch or empty!" }, + " FAILED to delete: {version}": { + "bg": " FAILED to delete: {version}", + "de": " FAILED to delete: {version}", + "en": " FAILED to delete: {version}", + "pl": " FAILED to delete: {version}", + "ru": " FAILED to delete: {version}", + "zh": " FAILED to delete: {version}" + }, + " Generated: {path}": { + "bg": " Generated: {path}", + "de": " Generated: {path}", + "en": " Generated: {path}", + "pl": " Generated: {path}", + "ru": " Generated: {path}", + "zh": " Generated: {path}" + }, " MISSING: devx {cmd}": { "bg": " ЛИПСВА: devx {cmd}", "de": " FEHLT: devx {cmd}", @@ -335,6 +479,38 @@ "ru": " OK: {title} ({chars} chars)", "zh": " OK: {title} ({chars} chars)" }, + " Package: {pkg}": { + "bg": " Package: {pkg}", + "de": " Package: {pkg}", + "en": " Package: {pkg}", + "pl": " Package: {pkg}", + "ru": " Package: {pkg}", + "zh": " Package: {pkg}" + }, + " Quality checks: {checks}": { + "bg": " Quality checks: {checks}", + "de": " Quality checks: {checks}", + "en": " Quality checks: {checks}", + "pl": " Quality checks: {checks}", + "ru": " Quality checks: {checks}", + "zh": " Quality checks: {checks}" + }, + " Repo root: {root}": { + "bg": " Repo root: {root}", + "de": " Repo root: {root}", + "en": " Repo root: {root}", + "pl": " Repo root: {root}", + "ru": " Repo root: {root}", + "zh": " Repo root: {root}" + }, + " Test paths: {testpaths}": { + "bg": " Test paths: {testpaths}", + "de": " Test paths: {testpaths}", + "en": " Test paths: {testpaths}", + "pl": " Test paths: {testpaths}", + "ru": " Test paths: {testpaths}", + "zh": " Test paths: {testpaths}" + }, " Updated: {title}": { "bg": " Updated: {title}", "de": " Updated: {title}", @@ -343,6 +519,118 @@ "ru": " Updated: {title}", "zh": " Updated: {title}" }, + " WARNING: Could not extract coverage from pytest output (rc={rc})": { + "bg": " WARNING: Could not extract coverage from pytest output (rc={rc})", + "de": " WARNING: Could not extract coverage from pytest output (rc={rc})", + "en": " WARNING: Could not extract coverage from pytest output (rc={rc})", + "pl": " WARNING: Could not extract coverage from pytest output (rc={rc})", + "ru": " WARNING: Could not extract coverage from pytest output (rc={rc})", + "zh": " WARNING: Could not extract coverage from pytest output (rc={rc})" + }, + " WARNING: Could not extract doc coverage (rc={rc})": { + "bg": " WARNING: Could not extract doc coverage (rc={rc})", + "de": " WARNING: Could not extract doc coverage (rc={rc})", + "en": " WARNING: Could not extract doc coverage (rc={rc})", + "pl": " WARNING: Could not extract doc coverage (rc={rc})", + "ru": " WARNING: Could not extract doc coverage (rc={rc})", + "zh": " WARNING: Could not extract doc coverage (rc={rc})" + }, + " WARNING: Could not extract test count from pytest output (rc={rc})": { + "bg": " WARNING: Could not extract test count from pytest output (rc={rc})", + "de": " WARNING: Could not extract test count from pytest output (rc={rc})", + "en": " WARNING: Could not extract test count from pytest output (rc={rc})", + "pl": " WARNING: Could not extract test count from pytest output (rc={rc})", + "ru": " WARNING: Could not extract test count from pytest output (rc={rc})", + "zh": " WARNING: Could not extract test count from pytest output (rc={rc})" + }, + " WARNING: No Python package found under src/ — version badge will show 'unknown'": { + "bg": " WARNING: No Python package found under src/ — version badge will show 'unknown'", + "de": " WARNING: No Python package found under src/ — version badge will show 'unknown'", + "en": " WARNING: No Python package found under src/ — version badge will show 'unknown'", + "pl": " WARNING: No Python package found under src/ — version badge will show 'unknown'", + "ru": " WARNING: No Python package found under src/ — version badge will show 'unknown'", + "zh": " WARNING: No Python package found under src/ — version badge will show 'unknown'" + }, + " WARNING: No __version__ found in {init_file} — version badge will show 'unknown'": { + "bg": " WARNING: No __version__ found in {init_file} — version badge will show 'unknown'", + "de": " WARNING: No __version__ found in {init_file} — version badge will show 'unknown'", + "en": " WARNING: No __version__ found in {init_file} — version badge will show 'unknown'", + "pl": " WARNING: No __version__ found in {init_file} — version badge will show 'unknown'", + "ru": " WARNING: No __version__ found in {init_file} — version badge will show 'unknown'", + "zh": " WARNING: No __version__ found in {init_file} — version badge will show 'unknown'" + }, + " WARNING: No coverage target detected (no src/ package, no --cov in pyproject.toml)": { + "bg": " WARNING: No coverage target detected (no src/ package, no --cov in pyproject.toml)", + "de": " WARNING: No coverage target detected (no src/ package, no --cov in pyproject.toml)", + "en": " WARNING: No coverage target detected (no src/ package, no --cov in pyproject.toml)", + "pl": " WARNING: No coverage target detected (no src/ package, no --cov in pyproject.toml)", + "ru": " WARNING: No coverage target detected (no src/ package, no --cov in pyproject.toml)", + "zh": " WARNING: No coverage target detected (no src/ package, no --cov in pyproject.toml)" + }, + " WARNING: {init_file} not found — version badge will show 'unknown'": { + "bg": " WARNING: {init_file} not found — version badge will show 'unknown'", + "de": " WARNING: {init_file} not found — version badge will show 'unknown'", + "en": " WARNING: {init_file} not found — version badge will show 'unknown'", + "pl": " WARNING: {init_file} not found — version badge will show 'unknown'", + "ru": " WARNING: {init_file} not found — version badge will show 'unknown'", + "zh": " WARNING: {init_file} not found — version badge will show 'unknown'" + }, + " WARNING: {name} failed (rc={rc})": { + "bg": " WARNING: {name} failed (rc={rc})", + "de": " WARNING: {name} failed (rc={rc})", + "en": " WARNING: {name} failed (rc={rc})", + "pl": " WARNING: {name} failed (rc={rc})", + "ru": " WARNING: {name} failed (rc={rc})", + "zh": " WARNING: {name} failed (rc={rc})" + }, + " WARNING: {name} not installed — skipping (counted as pass)": { + "bg": " WARNING: {name} not installed — skipping (counted as pass)", + "de": " WARNING: {name} not installed — skipping (counted as pass)", + "en": " WARNING: {name} not installed — skipping (counted as pass)", + "pl": " WARNING: {name} not installed — skipping (counted as pass)", + "ru": " WARNING: {name} not installed — skipping (counted as pass)", + "zh": " WARNING: {name} not installed — skipping (counted as pass)" + }, + " [dry-run] Would delete: {version}": { + "bg": " [dry-run] Would delete: {version}", + "de": " [dry-run] Would delete: {version}", + "en": " [dry-run] Would delete: {version}", + "pl": " [dry-run] Would delete: {version}", + "ru": " [dry-run] Would delete: {version}", + "zh": " [dry-run] Would delete: {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})" + }, + " {version} (created: {created})": { + "bg": " {version} (created: {created})", + "de": " {version} (created: {created})", + "en": " {version} (created: {created})", + "pl": " {version} (created: {created})", + "ru": " {version} (created: {created})", + "zh": " {version} (created: {created})" + }, + "--checklist-categories must list at least 8 of 13 categories. Got {count}.": { + "en": "--checklist-categories must list at least 8 of 13 categories. Got {count}.", + "bg": "--checklist-categories must list at least 8 of 13 categories. Got {count}.", + "de": "--checklist-categories must list at least 8 of 13 categories. Got {count}.", + "pl": "--checklist-categories must list at least 8 of 13 categories. Got {count}.", + "ru": "--checklist-categories must list at least 8 of 13 categories. Got {count}.", + "zh": "--checklist-categories must list at least 8 of 13 categories. Got {count}." + }, + "--checklist-confirmed is required for APPROVE events.": { + "en": "--checklist-confirmed is required for APPROVE events.", + "bg": "--checklist-confirmed is required for APPROVE events.", + "de": "--checklist-confirmed is required for APPROVE events.", + "pl": "--checklist-confirmed is required for APPROVE events.", + "ru": "--checklist-confirmed is required for APPROVE events.", + "zh": "--checklist-confirmed is required for APPROVE events." + }, "--push requires --registry": { "bg": "--push requires --registry", "de": "--push requires --registry", @@ -375,6 +663,14 @@ "ru": "API poll warning: {exc}", "zh": "API poll warning: {exc}" }, + "Added label '{label}' to PR #{pr}.": { + "en": "Added label '{label}' to PR #{pr}.", + "bg": "Added label '{label}' to PR #{pr}.", + "de": "Added label '{label}' to PR #{pr}.", + "pl": "Added label '{label}' to PR #{pr}.", + "ru": "Added label '{label}' to PR #{pr}.", + "zh": "Added label '{label}' to PR #{pr}." + }, "Additional directory to scan (default: scripts, tests). Can be repeated.": { "bg": "Additional directory to scan (default: scripts, tests). Can be repeated.", "de": "Additional directory to scan (default: scripts, tests). Can be repeated.", @@ -399,6 +695,54 @@ "ru": "Another molecule runner failed. Stopping this runner early.", "zh": "Another molecule runner failed. Stopping this runner early." }, + "Assigned {count} files to runner {runner_index}": { + "bg": "Assigned {count} files to runner {runner_index}", + "de": "Assigned {count} files to runner {runner_index}", + "en": "Assigned {count} files to runner {runner_index}", + "pl": "Assigned {count} files to runner {runner_index}", + "ru": "Assigned {count} files to runner {runner_index}", + "zh": "Assigned {count} files to runner {runner_index}" + }, + "Assigned {count} items to runner {runner_index}: {encoded}": { + "bg": "Assigned {count} items to runner {runner_index}: {encoded}", + "de": "Assigned {count} items to runner {runner_index}: {encoded}", + "en": "Assigned {count} items to runner {runner_index}: {encoded}", + "pl": "Assigned {count} items to runner {runner_index}: {encoded}", + "ru": "Assigned {count} items to runner {runner_index}: {encoded}", + "zh": "Assigned {count} items to runner {runner_index}: {encoded}" + }, + "Badge push attempt {attempt}/{retries} failed — retrying: {error}": { + "bg": "Badge push attempt {attempt}/{retries} failed — retrying: {error}", + "de": "Badge push attempt {attempt}/{retries} failed — retrying: {error}", + "en": "Badge push attempt {attempt}/{retries} failed — retrying: {error}", + "pl": "Badge push attempt {attempt}/{retries} failed — retrying: {error}", + "ru": "Badge push attempt {attempt}/{retries} failed — retrying: {error}", + "zh": "Badge push attempt {attempt}/{retries} failed — retrying: {error}" + }, + "Badge push failed after {retries} attempts: {error}": { + "bg": "Badge push failed after {retries} attempts: {error}", + "de": "Badge push failed after {retries} attempts: {error}", + "en": "Badge push failed after {retries} attempts: {error}", + "pl": "Badge push failed after {retries} attempts: {error}", + "ru": "Badge push failed after {retries} attempts: {error}", + "zh": "Badge push failed after {retries} attempts: {error}" + }, + "Badges commit SHA: {sha}": { + "bg": "Badges commit SHA: {sha}", + "de": "Badges commit SHA: {sha}", + "en": "Badges commit SHA: {sha}", + "pl": "Badges commit SHA: {sha}", + "ru": "Badges commit SHA: {sha}", + "zh": "Badges commit SHA: {sha}" + }, + "Badges pushed to badges branch": { + "bg": "Badges pushed to badges branch", + "de": "Badges pushed to badges branch", + "en": "Badges pushed to badges branch", + "pl": "Badges pushed to badges branch", + "ru": "Badges pushed to badges branch", + "zh": "Badges pushed to badges branch" + }, "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", @@ -463,6 +807,54 @@ "ru": "Bumping version: {current} -> v{new_version}", "zh": "Bumping version: {current} -> v{new_version}" }, + "CI checks did not complete within timeout.": { + "en": "CI checks did not complete within timeout.", + "bg": "CI checks did not complete within timeout.", + "de": "CI checks did not complete within timeout.", + "pl": "CI checks did not complete within timeout.", + "ru": "CI checks did not complete within timeout.", + "zh": "CI checks did not complete within timeout." + }, + "CI checks failed.": { + "en": "CI checks failed.", + "bg": "CI checks failed.", + "de": "CI checks failed.", + "pl": "CI checks failed.", + "ru": "CI checks failed.", + "zh": "CI checks failed." + }, + "CI_GITEA_TOKEN environment variable required": { + "bg": "CI_GITEA_TOKEN environment variable required", + "de": "CI_GITEA_TOKEN environment variable required", + "en": "CI_GITEA_TOKEN environment variable required", + "pl": "CI_GITEA_TOKEN environment variable required", + "ru": "CI_GITEA_TOKEN environment variable required", + "zh": "CI_GITEA_TOKEN environment variable required" + }, + "CI_GITEA_TOKEN is not set.": { + "en": "CI_GITEA_TOKEN is not set.", + "bg": "CI_GITEA_TOKEN is not set.", + "de": "CI_GITEA_TOKEN is not set.", + "pl": "CI_GITEA_TOKEN is not set.", + "ru": "CI_GITEA_TOKEN is not set.", + "zh": "CI_GITEA_TOKEN is not set." + }, + "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 not set — skipping login configuration.", + "de": "CI_GITEA_TOKEN not set — skipping login configuration.", + "en": "CI_GITEA_TOKEN not set — skipping login configuration.", + "pl": "CI_GITEA_TOKEN not set — skipping login configuration.", + "ru": "CI_GITEA_TOKEN not set — skipping login configuration.", + "zh": "CI_GITEA_TOKEN not set — skipping login configuration." + }, "Checking CLI command documentation...": { "bg": "Checking CLI command documentation...", "de": "Checking CLI command documentation...", @@ -471,6 +863,14 @@ "ru": "Checking CLI command documentation...", "zh": "Checking CLI command documentation..." }, + "Checking status for PR #{pr_number}...": { + "en": "Checking status for PR #{pr_number}...", + "bg": "Checking status for PR #{pr_number}...", + "de": "Checking status for PR #{pr_number}...", + "pl": "Checking status for PR #{pr_number}...", + "ru": "Checking status for PR #{pr_number}...", + "zh": "Checking status for PR #{pr_number}..." + }, "Command failed ({cmd}): {stderr}": { "bg": "Command failed ({cmd}): {stderr}", "de": "Command failed ({cmd}): {stderr}", @@ -479,6 +879,22 @@ "ru": "Command failed ({cmd}): {stderr}", "zh": "Command failed ({cmd}): {stderr}" }, + "Commit message: {msg}": { + "bg": "Commit message: {msg}", + "de": "Commit message: {msg}", + "en": "Commit message: {msg}", + "pl": "Commit message: {msg}", + "ru": "Commit message: {msg}", + "zh": "Commit message: {msg}" + }, + "Commit: {sha}": { + "en": "Commit: {sha}", + "bg": "Commit: {sha}", + "de": "Commit: {sha}", + "pl": "Commit: {sha}", + "ru": "Commit: {sha}", + "zh": "Commit: {sha}" + }, "Comparing {base}..{head} ({count} files changed)": { "bg": "Comparing {base}..{head} ({count} files changed)", "de": "Comparing {base}..{head} ({count} files changed)", @@ -495,6 +911,14 @@ "ru": "Конфигурация OK: [tool.devx] присутствует, версии devx согласованы.", "zh": "配置正常: [tool.devx] 已存在, devx 版本一致。" }, + "Configuration validation failed.": { + "en": "Configuration validation failed.", + "bg": "Configuration validation failed.", + "de": "Configuration validation failed.", + "pl": "Configuration validation failed.", + "ru": "Configuration validation failed.", + "zh": "Configuration validation failed." + }, "Configuring branch protection for {branch}...": { "bg": "Конфигуриране на защита на клона {branch}...", "de": "Konfiguriere Branch-Schutz für {branch}...", @@ -511,6 +935,14 @@ "ru": "Настройка параметров репозитория...", "zh": "正在配置仓库设置..." }, + "Configuring tea login '{name}' for {url}...": { + "bg": "Configuring tea login '{name}' for {url}...", + "de": "Configuring tea login '{name}' for {url}...", + "en": "Configuring tea login '{name}' for {url}...", + "pl": "Configuring tea login '{name}' for {url}...", + "ru": "Configuring tea login '{name}' for {url}...", + "zh": "Configuring tea login '{name}' for {url}..." + }, "Could not detect current branch: {error}": { "bg": "Не може да се определи текущия клон: {error}", "de": "Aktueller Branch konnte nicht erkannt werden: {error}", @@ -519,6 +951,14 @@ "ru": "Не удалось определить текущую ветку: {error}", "zh": "无法检测当前分支: {error}" }, + "Could not determine head SHA for PR #{pr_number}.": { + "en": "Could not determine head SHA for PR #{pr_number}.", + "bg": "Could not determine head SHA for PR #{pr_number}.", + "de": "Could not determine head SHA for PR #{pr_number}.", + "pl": "Could not determine head SHA for PR #{pr_number}.", + "ru": "Could not determine head SHA for PR #{pr_number}.", + "zh": "Could not determine head SHA for PR #{pr_number}." + }, "Could not extract conventional commit message from PR commits.": { "bg": "Could not extract conventional commit message from PR commits.", "de": "Could not extract conventional commit message from PR commits.", @@ -639,14 +1079,6 @@ "ru": "Dockerfile not found: {path}", "zh": "Dockerfile not found: {path}" }, - "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}" - }, "Dry-run mode: on branch '{branch}' (not master). Some checks may behave differently.": { "bg": "Dry-run mode: on branch '{branch}' (not master). Some checks may behave differently.", "de": "Dry-run mode: on branch '{branch}' (not master). Some checks may behave differently.", @@ -695,6 +1127,14 @@ "ru": "ERROR: mapping.json not found at {path}", "zh": "ERROR: mapping.json not found at {path}" }, + "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}" + }, "FAILED: {count} undocumented dependency/ies": { "bg": "FAILED: {count} undocumented dependency/ies", "de": "FAILED: {count} undocumented dependency/ies", @@ -727,6 +1167,14 @@ "ru": "Failed to create issue via tea: {error}", "zh": "Failed to create issue via tea: {error}" }, + "Failed to delete {count} image version(s)": { + "bg": "Failed to delete {count} image version(s)", + "de": "Failed to delete {count} image version(s)", + "en": "Failed to delete {count} image version(s)", + "pl": "Failed to delete {count} image version(s)", + "ru": "Failed to delete {count} image version(s)", + "zh": "Failed to delete {count} image version(s)" + }, "Failed to list versions for {name}: {error}": { "bg": "Failed to list versions for {name}: {error}", "de": "Failed to list versions for {name}: {error}", @@ -735,6 +1183,14 @@ "ru": "Failed to list versions for {name}: {error}", "zh": "Failed to list versions for {name}: {error}" }, + "Fetching logs for PR #{pr_number}...": { + "en": "Fetching logs for PR #{pr_number}...", + "bg": "Fetching logs for PR #{pr_number}...", + "de": "Fetching logs for PR #{pr_number}...", + "pl": "Fetching logs for PR #{pr_number}...", + "ru": "Fetching logs for PR #{pr_number}...", + "zh": "Fetching logs for PR #{pr_number}..." + }, "Found {count} existing wiki pages.": { "bg": "Found {count} existing wiki pages.", "de": "Found {count} existing wiki pages.", @@ -759,6 +1215,14 @@ "ru": "Found {count} stale documentation reference(s)", "zh": "Found {count} stale documentation reference(s)" }, + "Found {count} version(s):": { + "bg": "Found {count} version(s):", + "de": "Found {count} version(s):", + "en": "Found {count} version(s):", + "pl": "Found {count} version(s):", + "ru": "Found {count} version(s):", + "zh": "Found {count} version(s):" + }, "GITEA_URL/CI_GITEA_TOKEN/RUN_ID not set; running without cross-runner cancellation.": { "bg": "GITEA_URL/CI_GITEA_TOKEN/RUN_ID not set; running without cross-runner cancellation.", "de": "GITEA_URL/CI_GITEA_TOKEN/RUN_ID not set; running without cross-runner cancellation.", @@ -767,6 +1231,14 @@ "ru": "GITEA_URL/CI_GITEA_TOKEN/RUN_ID not set; running without cross-runner cancellation.", "zh": "GITEA_URL/CI_GITEA_TOKEN/RUN_ID not set; running without cross-runner cancellation." }, + "Generated {count} badge files": { + "bg": "Generated {count} badge files", + "de": "Generated {count} badge files", + "en": "Generated {count} badge files", + "pl": "Generated {count} badge files", + "ru": "Generated {count} badge files", + "zh": "Generated {count} badge files" + }, "Generated {file} with prefix '{prefix}'.": { "bg": "Generated {file} with prefix '{prefix}'.", "de": "Generated {file} with prefix '{prefix}'.", @@ -775,6 +1247,14 @@ "ru": "Generated {file} with prefix '{prefix}'.", "zh": "Generated {file} with prefix '{prefix}'." }, + "Generating badges in {out}...": { + "bg": "Generating badges in {out}...", + "de": "Generating badges in {out}...", + "en": "Generating badges in {out}...", + "pl": "Generating badges in {out}...", + "ru": "Generating badges in {out}...", + "zh": "Generating badges in {out}..." + }, "Gitea PyPI registry: {tag} already published — continuing.": { "bg": "Gitea PyPI registry: {tag} вече е публикуван — продължава.", "de": "Gitea PyPI-Registry: {tag} bereits veröffentlicht — wird fortgesetzt.", @@ -903,6 +1383,38 @@ "ru": "Integration tests passed.", "zh": "Integration tests passed." }, + "Invalid checklist category: {cat}. Must be numbers.": { + "en": "Invalid checklist category: {cat}. Must be numbers.", + "bg": "Invalid checklist category: {cat}. Must be numbers.", + "de": "Invalid checklist category: {cat}. Must be numbers.", + "pl": "Invalid checklist category: {cat}. Must be numbers.", + "ru": "Invalid checklist category: {cat}. Must be numbers.", + "zh": "Invalid checklist category: {cat}. Must be numbers." + }, + "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}.": { + "en": "Label '{label}' already on PR #{pr}.", + "bg": "Label '{label}' already on PR #{pr}.", + "de": "Label '{label}' already on PR #{pr}.", + "pl": "Label '{label}' already on PR #{pr}.", + "ru": "Label '{label}' already on PR #{pr}.", + "zh": "Label '{label}' already on PR #{pr}." + }, + "Latest run: #{run_id} (status: {status})": { + "en": "Latest run: #{run_id} (status: {status})", + "bg": "Latest run: #{run_id} (status: {status})", + "de": "Latest run: #{run_id} (status: {status})", + "pl": "Latest run: #{run_id} (status: {status})", + "ru": "Latest run: #{run_id} (status: {status})", + "zh": "Latest run: #{run_id} (status: {status})" + }, "Lint failed — refusing to release. Fix lint errors first.\n{stderr}": { "bg": "Lint failed — refusing to release. Fix lint errors first.\n{stderr}", "de": "Lint failed — refusing to release. Fix lint errors first.\n{stderr}", @@ -959,6 +1471,14 @@ "ru": "Слияние не удалось: HTTP {status}: {message}\nПроверьте, что PR готов и у вас есть права на слияние.", "zh": "合并失败: HTTP {status}: {message}\n请检查 PR 是否准备就绪且您具有合并权限。" }, + "Missing tests for changed files.": { + "en": "Missing tests for changed files.", + "bg": "Missing tests for changed files.", + "de": "Missing tests for changed files.", + "pl": "Missing tests for changed files.", + "ru": "Missing tests for changed files.", + "zh": "Missing tests for changed files." + }, "Module {mod} has no main() function": { "bg": "Модул {mod} няма функция main()", "de": "Modul {mod} hat keine main()-Funktion", @@ -1015,6 +1535,30 @@ "ru": "Отлично! Задача Vikunja {task_id} (ID {vikunja_id}) обновлена и отмечена как выполненная.", "zh": "不错!Vikunja 任务 {task_id} (ID {vikunja_id}) 已更新并标记为完成。" }, + "No CI checks found for commit {sha}.": { + "en": "No CI checks found for commit {sha}.", + "bg": "No CI checks found for commit {sha}.", + "de": "No CI checks found for commit {sha}.", + "pl": "No CI checks found for commit {sha}.", + "ru": "No CI checks found for commit {sha}.", + "zh": "No CI checks found for commit {sha}." + }, + "No badge SVG files generated": { + "bg": "No badge SVG files generated", + "de": "No badge SVG files generated", + "en": "No badge SVG files generated", + "pl": "No badge SVG files generated", + "ru": "No badge SVG files generated", + "zh": "No badge SVG files generated" + }, + "No badge URLs found to update — README already up to date": { + "bg": "No badge URLs found to update — README already up to date", + "de": "No badge URLs found to update — README already up to date", + "en": "No badge URLs found to update — README already up to date", + "pl": "No badge URLs found to update — README already up to date", + "ru": "No badge URLs found to update — README already up to date", + "zh": "No badge URLs found to update — README already up to date" + }, "No changes between {base} and {head}.": { "bg": "No changes between {base} and {head}.", "de": "No changes between {base} and {head}.", @@ -1023,6 +1567,38 @@ "ru": "No changes between {base} and {head}.", "zh": "No changes between {base} and {head}." }, + "No failed jobs.": { + "en": "No failed jobs.", + "bg": "No failed jobs.", + "de": "No failed jobs.", + "pl": "No failed jobs.", + "ru": "No failed jobs.", + "zh": "No failed jobs." + }, + "No job matching '{job}' found.": { + "en": "No job matching '{job}' found.", + "bg": "No job matching '{job}' found.", + "de": "No job matching '{job}' found.", + "pl": "No job matching '{job}' found.", + "ru": "No job matching '{job}' found.", + "zh": "No job matching '{job}' found." + }, + "No jobs found for run #{run_id}.": { + "en": "No jobs found for run #{run_id}.", + "bg": "No jobs found for run #{run_id}.", + "de": "No jobs found for run #{run_id}.", + "pl": "No jobs found for run #{run_id}.", + "ru": "No jobs found for run #{run_id}.", + "zh": "No jobs found for run #{run_id}." + }, + "No open PR found for branch '{branch}'.": { + "en": "No open PR found for branch '{branch}'.", + "bg": "No open PR found for branch '{branch}'.", + "de": "No open PR found for branch '{branch}'.", + "pl": "No open PR found for branch '{branch}'.", + "ru": "No open PR found for branch '{branch}'.", + "zh": "No open PR found for branch '{branch}'." + }, "No staged changes — version and changelog already up to date.": { "bg": "No staged changes — version and changelog already up to date.", "de": "No staged changes — version and changelog already up to date.", @@ -1087,6 +1663,14 @@ "ru": "No versions found.", "zh": "No versions found." }, + "No workflow runs found for SHA {sha}.": { + "en": "No workflow runs found for SHA {sha}.", + "bg": "No workflow runs found for SHA {sha}.", + "de": "No workflow runs found for SHA {sha}.", + "pl": "No workflow runs found for SHA {sha}.", + "ru": "No workflow runs found for SHA {sha}.", + "zh": "No workflow runs found for SHA {sha}." + }, "Note: Self-approval not allowed. Posting COMMENT instead.": { "bg": "Note: Self-approval not allowed. Posting COMMENT instead.", "de": "Note: Self-approval not allowed. Posting COMMENT instead.", @@ -1263,6 +1847,22 @@ "ru": "PYPI_TOKEN не задан и URL registry не настроен — пропускаем публикацию в PyPI. Не беспокойтесь, мы просто создадим Gitea release.", "zh": "未设置 PYPI_TOKEN 且未配置 registry URL — 跳过 PyPI 发布。别担心,我们直接创建 Gitea release。" }, + "Package owner not specified. Use --owner or set [tool.devx] repo_owner.": { + "en": "Package owner not specified. Use --owner or set [tool.devx] repo_owner.", + "bg": "Package owner not specified. Use --owner or set [tool.devx] repo_owner.", + "de": "Package owner not specified. Use --owner or set [tool.devx] repo_owner.", + "pl": "Package owner not specified. Use --owner or set [tool.devx] repo_owner.", + "ru": "Package owner not specified. Use --owner or set [tool.devx] repo_owner.", + "zh": "Package owner not specified. Use --owner or set [tool.devx] repo_owner." + }, + "Package: {owner}/{name}": { + "bg": "Package: {owner}/{name}", + "de": "Package: {owner}/{name}", + "en": "Package: {owner}/{name}", + "pl": "Package: {owner}/{name}", + "ru": "Package: {owner}/{name}", + "zh": "Package: {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", @@ -1359,6 +1959,14 @@ "ru": "Push failed for {tag}: {error}", "zh": "Push failed for {tag}: {error}" }, + "Pushed README update with badge SHA {sha}": { + "bg": "Pushed README update with badge SHA {sha}", + "de": "Pushed README update with badge SHA {sha}", + "en": "Pushed README update with badge SHA {sha}", + "pl": "Pushed README update with badge SHA {sha}", + "ru": "Pushed README update with badge SHA {sha}", + "zh": "Pushed README update with badge SHA {sha}" + }, "Pushed release commit to master.": { "bg": "Pushed release commit to master.", "de": "Pushed release commit to master.", @@ -1383,30 +1991,6 @@ "ru": "REPO argument is required (or set GITHUB_REPOSITORY env var).", "zh": "REPO argument is required (or set GITHUB_REPOSITORY env var)." }, - "CI_GITEA_TOKEN environment variable required": { - "bg": "CI_GITEA_TOKEN environment variable required", - "de": "CI_GITEA_TOKEN environment variable required", - "en": "CI_GITEA_TOKEN environment variable required", - "pl": "CI_GITEA_TOKEN environment variable required", - "ru": "CI_GITEA_TOKEN environment variable required", - "zh": "CI_GITEA_TOKEN environment variable required" - }, - "Failed to delete {count} image version(s)": { - "bg": "Failed to delete {count} image version(s)", - "de": "Failed to delete {count} image version(s)", - "en": "Failed to delete {count} image version(s)", - "pl": "Failed to delete {count} image version(s)", - "ru": "Failed to delete {count} image version(s)", - "zh": "Failed to delete {count} image version(s)" - }, - "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 所需。" - }, "Registry credentials required: set CI_GITEA_TOKEN and CI_GITEA_USERNAME env vars": { "bg": "Registry credentials required: set CI_GITEA_TOKEN and CI_GITEA_USERNAME env vars", "de": "Registry credentials required: set CI_GITEA_TOKEN and CI_GITEA_USERNAME env vars", @@ -1431,6 +2015,22 @@ "ru": "Registry login failed: {error}", "zh": "Registry login failed: {error}" }, + "Regular merge commit — running all post-merge jobs.": { + "bg": "Regular merge commit — running all post-merge jobs.", + "de": "Regular merge commit — running all post-merge jobs.", + "en": "Regular merge commit — running all post-merge jobs.", + "pl": "Regular merge commit — running all post-merge jobs.", + "ru": "Regular merge commit — running all post-merge jobs.", + "zh": "Regular merge commit — running all post-merge jobs." + }, + "Release commit — skipping all post-merge jobs.": { + "bg": "Release commit — skipping all post-merge jobs.", + "de": "Release commit — skipping all post-merge jobs.", + "en": "Release commit — skipping all post-merge jobs.", + "pl": "Release commit — skipping all post-merge jobs.", + "ru": "Release commit — skipping all post-merge jobs.", + "zh": "Release commit — skipping all post-merge jobs." + }, "Release creation failed: {error}": { "bg": "Release creation failed: {error}", "de": "Release creation failed: {error}", @@ -1471,6 +2071,14 @@ "ru": "Repository in owner/name format", "zh": "Repository in owner/name format" }, + "Repository name not set. Use DEVX_REPO_NAME, [tool.devx] repo_name, or GITHUB_REPOSITORY env var.": { + "en": "Repository name not set. Use DEVX_REPO_NAME, [tool.devx] repo_name, or GITHUB_REPOSITORY env var.", + "bg": "Repository name not set. Use DEVX_REPO_NAME, [tool.devx] repo_name, or GITHUB_REPOSITORY env var.", + "de": "Repository name not set. Use DEVX_REPO_NAME, [tool.devx] repo_name, or GITHUB_REPOSITORY env var.", + "pl": "Repository name not set. Use DEVX_REPO_NAME, [tool.devx] repo_name, or GITHUB_REPOSITORY env var.", + "ru": "Repository name not set. Use DEVX_REPO_NAME, [tool.devx] repo_name, or GITHUB_REPOSITORY env var.", + "zh": "Repository name not set. Use DEVX_REPO_NAME, [tool.devx] repo_name, or GITHUB_REPOSITORY env var." + }, "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.", @@ -1479,6 +2087,14 @@ "ru": "Владелец репозитория не установлен. Используйте --owner или DEVX_REPO_OWNER env var.", "zh": "仓库所有者未设置。使用 --owner 或 DEVX_REPO_OWNER 环境变量。" }, + "Review body must be at least 50 characters.": { + "en": "Review body must be at least 50 characters.", + "bg": "Review body must be at least 50 characters.", + "de": "Review body must be at least 50 characters.", + "pl": "Review body must be at least 50 characters.", + "ru": "Review body must be at least 50 characters.", + "zh": "Review body must be at least 50 characters." + }, "Roles directory not found: {path}": { "bg": "Roles directory not found: {path}", "de": "Roles directory not found: {path}", @@ -1487,6 +2103,14 @@ "ru": "Roles directory not found: {path}", "zh": "Roles directory not found: {path}" }, + "Runner count: {count}": { + "bg": "Runner count: {count}", + "de": "Runner count: {count}", + "en": "Runner count: {count}", + "pl": "Runner count: {count}", + "ru": "Runner count: {count}", + "zh": "Runner count: {count}" + }, "Runner index {index} out of range (0..{max})": { "bg": "Индексът на runner {index} е извън диапазона (0..{max})", "de": "Runner-Index {index} außerhalb des Bereichs (0..{max})", @@ -1495,6 +2119,30 @@ "ru": "Индекс runner {index} вне диапазона (0..{max})", "zh": "Runner 索引 {index} 超出范围 (0..{max})" }, + "Runner index {runner_index} is out of range (must be >= 1)": { + "bg": "Runner index {runner_index} is out of range (must be >= 1)", + "de": "Runner index {runner_index} is out of range (must be >= 1)", + "en": "Runner index {runner_index} is out of range (must be >= 1)", + "pl": "Runner index {runner_index} is out of range (must be >= 1)", + "ru": "Runner index {runner_index} is out of range (must be >= 1)", + "zh": "Runner index {runner_index} is out of range (must be >= 1)" + }, + "Runner indices: {indices}": { + "bg": "Runner indices: {indices}", + "de": "Runner indices: {indices}", + "en": "Runner indices: {indices}", + "pl": "Runner indices: {indices}", + "ru": "Runner indices: {indices}", + "zh": "Runner indices: {indices}" + }, + "Runner {i}: {labels}": { + "bg": "Runner {i}: {labels}", + "de": "Runner {i}: {labels}", + "en": "Runner {i}: {labels}", + "pl": "Runner {i}: {labels}", + "ru": "Runner {i}: {labels}", + "zh": "Runner {i}: {labels}" + }, "Running lint checks...": { "bg": "Running lint checks...", "de": "Running lint checks...", @@ -1511,6 +2159,14 @@ "ru": "Running tests...", "zh": "Running tests..." }, + "Running: {cmd}": { + "bg": "Running: {cmd}", + "de": "Running: {cmd}", + "en": "Running: {cmd}", + "pl": "Running: {cmd}", + "ru": "Running: {cmd}", + "zh": "Running: {cmd}" + }, "Running: {scenario} on {platform}": { "bg": "Running: {scenario} on {platform}", "de": "Running: {scenario} on {platform}", @@ -1543,6 +2199,22 @@ "ru": "Skipping commit push — no staged changes.", "zh": "Skipping commit push — no staged changes." }, + "Skipping — runner index {runner_index} > max runners {max_runners}": { + "bg": "Skipping — runner index {runner_index} > max runners {max_runners}", + "de": "Skipping — runner index {runner_index} > max runners {max_runners}", + "en": "Skipping — runner index {runner_index} > max runners {max_runners}", + "pl": "Skipping — runner index {runner_index} > max runners {max_runners}", + "ru": "Skipping — runner index {runner_index} > max runners {max_runners}", + "zh": "Skipping — runner index {runner_index} > max runners {max_runners}" + }, + "Synced to latest origin/{branch}": { + "bg": "Synced to latest origin/{branch}", + "de": "Synced to latest origin/{branch}", + "en": "Synced to latest origin/{branch}", + "pl": "Synced to latest origin/{branch}", + "ru": "Synced to latest origin/{branch}", + "zh": "Synced to latest origin/{branch}" + }, "Syncing {count} documentation pages to wiki...": { "bg": "Syncing {count} documentation pages to wiki...", "de": "Syncing {count} documentation pages to wiki...", @@ -1623,6 +2295,14 @@ "ru": "Tests passed.", "zh": "Tests passed." }, + "Timeout reached after {timeout}s.": { + "en": "Timeout reached after {timeout}s.", + "bg": "Timeout reached after {timeout}s.", + "de": "Timeout reached after {timeout}s.", + "pl": "Timeout reached after {timeout}s.", + "ru": "Timeout reached after {timeout}s.", + "zh": "Timeout reached after {timeout}s." + }, "Unit tests passed in {duration:.2f}s (under {max}s limit, all tests under {single}s per-test limit).": { "bg": "Unit tests passed in {duration:.2f}s (under {max}s limit, all tests under {single}s per-test limit).", "de": "Unit tests passed in {duration:.2f}s (under {max}s limit, all tests under {single}s per-test limit).", @@ -1647,6 +2327,14 @@ "ru": "Unknown check category '{check}'. Available: all, user-facing{tags}", "zh": "Unknown check category '{check}'. Available: all, user-facing{tags}" }, + "Updated badge URLs in {filename}": { + "bg": "Updated badge URLs in {filename}", + "de": "Updated badge URLs in {filename}", + "en": "Updated badge URLs in {filename}", + "pl": "Updated badge URLs in {filename}", + "ru": "Updated badge URLs in {filename}", + "zh": "Updated badge URLs in {filename}" + }, "Updated version in {init}": { "bg": "Updated version in {init}", "de": "Updated version in {init}", @@ -1695,6 +2383,14 @@ "ru": "Version file: {file}", "zh": "Version file: {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 error (HTTP {status}): {message}. Task {task_id} was NOT updated. The merge succeeded but the Vikunja task needs manual update.", "de": "Vikunja API error (HTTP {status}): {message}. Task {task_id} was NOT updated. The merge succeeded but the Vikunja task needs manual update.", @@ -1735,6 +2431,14 @@ "ru": "ПРЕДУПРЕЖДЕНИЕ: VIKUNJA_TOKEN не установлен — пропуск проверки существования задачи. Установите в .env для полной проверки.", "zh": "警告: VIKUNJA_TOKEN 未设置 — 跳过任务存在性检查。在 .env 中设置以启用完整验证。" }, + "Waiting for CI checks to complete (timeout: {timeout}s)...": { + "en": "Waiting for CI checks to complete (timeout: {timeout}s)...", + "bg": "Waiting for CI checks to complete (timeout: {timeout}s)...", + "de": "Waiting for CI checks to complete (timeout: {timeout}s)...", + "pl": "Waiting for CI checks to complete (timeout: {timeout}s)...", + "ru": "Waiting for CI checks to complete (timeout: {timeout}s)...", + "zh": "Waiting for CI checks to complete (timeout: {timeout}s)..." + }, "Warning: could not fetch tags from origin.": { "bg": "Warning: could not fetch tags from origin.", "de": "Warning: could not fetch tags from origin.", @@ -1743,6 +2447,54 @@ "ru": "Warning: could not fetch tags from origin.", "zh": "Warning: could not fetch tags from origin." }, + "Warning: instance-level runners query failed: {error}": { + "bg": "Warning: instance-level runners query failed: {error}", + "de": "Warning: instance-level runners query failed: {error}", + "en": "Warning: instance-level runners query failed: {error}", + "pl": "Warning: instance-level runners query failed: {error}", + "ru": "Warning: instance-level runners query failed: {error}", + "zh": "Warning: instance-level runners query failed: {error}" + }, + "Warning: instance-level runners query returned HTTP {status}": { + "bg": "Warning: instance-level runners query returned HTTP {status}", + "de": "Warning: instance-level runners query returned HTTP {status}", + "en": "Warning: instance-level runners query returned HTTP {status}", + "pl": "Warning: instance-level runners query returned HTTP {status}", + "ru": "Warning: instance-level runners query returned HTTP {status}", + "zh": "Warning: instance-level runners query returned HTTP {status}" + }, + "Warning: org-level runners query failed: {error}": { + "bg": "Warning: org-level runners query failed: {error}", + "de": "Warning: org-level runners query failed: {error}", + "en": "Warning: org-level runners query failed: {error}", + "pl": "Warning: org-level runners query failed: {error}", + "ru": "Warning: org-level runners query failed: {error}", + "zh": "Warning: org-level runners query failed: {error}" + }, + "Warning: org-level runners query returned HTTP {status}": { + "bg": "Warning: org-level runners query returned HTTP {status}", + "de": "Warning: org-level runners query returned HTTP {status}", + "en": "Warning: org-level runners query returned HTTP {status}", + "pl": "Warning: org-level runners query returned HTTP {status}", + "ru": "Warning: org-level runners query returned HTTP {status}", + "zh": "Warning: org-level runners query returned HTTP {status}" + }, + "Warning: repo-level runners query failed: {error}": { + "bg": "Warning: repo-level runners query failed: {error}", + "de": "Warning: repo-level runners query failed: {error}", + "en": "Warning: repo-level runners query failed: {error}", + "pl": "Warning: repo-level runners query failed: {error}", + "ru": "Warning: repo-level runners query failed: {error}", + "zh": "Warning: repo-level runners query failed: {error}" + }, + "Warning: repo-level runners query returned HTTP {status}": { + "bg": "Warning: repo-level runners query returned HTTP {status}", + "de": "Warning: repo-level runners query returned HTTP {status}", + "en": "Warning: repo-level runners query returned HTTP {status}", + "pl": "Warning: repo-level runners query returned HTTP {status}", + "ru": "Warning: repo-level runners query returned HTTP {status}", + "zh": "Warning: repo-level runners query returned HTTP {status}" + }, "Wiki integrity check failed — {count} issue(s)": { "bg": "Wiki integrity check failed — {count} issue(s)", "de": "Wiki integrity check failed — {count} issue(s)", @@ -1879,6 +2631,14 @@ "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}", @@ -1943,6 +2703,14 @@ "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 keys and values must be strings, got {k}={v}", "de": "mapping.json keys and values must be strings, got {k}={v}", @@ -1975,6 +2743,22 @@ "ru": "pyproject.toml не найден в текущей директории.", "zh": "在当前目录中未找到 pyproject.toml。" }, + "tea login '{name}' already configured.": { + "bg": "tea login '{name}' already configured.", + "de": "tea login '{name}' already configured.", + "en": "tea login '{name}' already configured.", + "pl": "tea login '{name}' already configured.", + "ru": "tea login '{name}' already configured.", + "zh": "tea login '{name}' already configured." + }, + "tea not installed — skipping login configuration.": { + "bg": "tea not installed — skipping login configuration.", + "de": "tea not installed — skipping login configuration.", + "en": "tea not installed — skipping login configuration.", + "pl": "tea not installed — skipping login configuration.", + "ru": "tea not installed — skipping login configuration.", + "zh": "tea not installed — skipping login configuration." + }, "unknown": { "bg": "неизвестен", "de": "unbekannt", @@ -1991,292 +2775,12 @@ "ru": "{file} already exists. Use --force to overwrite.", "zh": "{file} already exists. Use --force to overwrite." }, - "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": "" - }, - "tea not installed — skipping login configuration.": { - "bg": "tea not installed — skipping login configuration.", - "de": "tea not installed — skipping login configuration.", - "en": "tea not installed — skipping login configuration.", - "pl": "tea not installed — skipping login configuration.", - "ru": "tea not installed — skipping login configuration.", - "zh": "tea not installed — skipping login configuration." - }, - "CI_GITEA_TOKEN not set — skipping login configuration.": { - "bg": "CI_GITEA_TOKEN not set — skipping login configuration.", - "de": "CI_GITEA_TOKEN not set — skipping login configuration.", - "en": "CI_GITEA_TOKEN not set — skipping login configuration.", - "pl": "CI_GITEA_TOKEN not set — skipping login configuration.", - "ru": "CI_GITEA_TOKEN not set — skipping login configuration.", - "zh": "CI_GITEA_TOKEN not set — skipping login configuration." - }, - "tea login '{name}' already configured.": { - "bg": "tea login '{name}' already configured.", - "de": "tea login '{name}' already configured.", - "en": "tea login '{name}' already configured.", - "pl": "tea login '{name}' already configured.", - "ru": "tea login '{name}' already configured.", - "zh": "tea login '{name}' already configured." - }, - "Configuring tea login '{name}' for {url}...": { - "bg": "Configuring tea login '{name}' for {url}...", - "de": "Configuring tea login '{name}' for {url}...", - "en": "Configuring tea login '{name}' for {url}...", - "pl": "Configuring tea login '{name}' for {url}...", - "ru": "Configuring tea login '{name}' for {url}...", - "zh": "Configuring tea login '{name}' for {url}..." - }, - " Could not fetch logs: {error}": { - "en": " Could not fetch logs: {error}", - "bg": " Could not fetch logs: {error}", - "de": " Could not fetch logs: {error}", - "pl": " Could not fetch logs: {error}", - "ru": " Could not fetch logs: {error}", - "zh": " Could not fetch logs: {error}" - }, - "Added label '{label}' to PR #{pr}.": { - "en": "Added label '{label}' to PR #{pr}.", - "bg": "Added label '{label}' to PR #{pr}.", - "de": "Added label '{label}' to PR #{pr}.", - "pl": "Added label '{label}' to PR #{pr}.", - "ru": "Added label '{label}' to PR #{pr}.", - "zh": "Added label '{label}' to PR #{pr}." - }, - "CI checks did not complete within timeout.": { - "en": "CI checks did not complete within timeout.", - "bg": "CI checks did not complete within timeout.", - "de": "CI checks did not complete within timeout.", - "pl": "CI checks did not complete within timeout.", - "ru": "CI checks did not complete within timeout.", - "zh": "CI checks did not complete within timeout." - }, - "CI checks failed.": { - "en": "CI checks failed.", - "bg": "CI checks failed.", - "de": "CI checks failed.", - "pl": "CI checks failed.", - "ru": "CI checks failed.", - "zh": "CI checks failed." - }, - "CI_GITEA_TOKEN is not set.": { - "en": "CI_GITEA_TOKEN is not set.", - "bg": "CI_GITEA_TOKEN is not set.", - "de": "CI_GITEA_TOKEN is not set.", - "pl": "CI_GITEA_TOKEN is not set.", - "ru": "CI_GITEA_TOKEN is not set.", - "zh": "CI_GITEA_TOKEN is not set." - }, - "Checking status for PR #{pr_number}...": { - "en": "Checking status for PR #{pr_number}...", - "bg": "Checking status for PR #{pr_number}...", - "de": "Checking status for PR #{pr_number}...", - "pl": "Checking status for PR #{pr_number}...", - "ru": "Checking status for PR #{pr_number}...", - "zh": "Checking status for PR #{pr_number}..." - }, - "Commit: {sha}": { - "en": "Commit: {sha}", - "bg": "Commit: {sha}", - "de": "Commit: {sha}", - "pl": "Commit: {sha}", - "ru": "Commit: {sha}", - "zh": "Commit: {sha}" - }, - "Could not determine head SHA for PR #{pr_number}.": { - "en": "Could not determine head SHA for PR #{pr_number}.", - "bg": "Could not determine head SHA for PR #{pr_number}.", - "de": "Could not determine head SHA for PR #{pr_number}.", - "pl": "Could not determine head SHA for PR #{pr_number}.", - "ru": "Could not determine head SHA for PR #{pr_number}.", - "zh": "Could not determine head SHA for PR #{pr_number}." - }, - "Fetching logs for PR #{pr_number}...": { - "en": "Fetching logs for PR #{pr_number}...", - "bg": "Fetching logs for PR #{pr_number}...", - "de": "Fetching logs for PR #{pr_number}...", - "pl": "Fetching logs for PR #{pr_number}...", - "ru": "Fetching logs for PR #{pr_number}...", - "zh": "Fetching logs for PR #{pr_number}..." - }, - "Label '{label}' already on PR #{pr}.": { - "en": "Label '{label}' already on PR #{pr}.", - "bg": "Label '{label}' already on PR #{pr}.", - "de": "Label '{label}' already on PR #{pr}.", - "pl": "Label '{label}' already on PR #{pr}.", - "ru": "Label '{label}' already on PR #{pr}.", - "zh": "Label '{label}' already on PR #{pr}." - }, - "Latest run: #{run_id} (status: {status})": { - "en": "Latest run: #{run_id} (status: {status})", - "bg": "Latest run: #{run_id} (status: {status})", - "de": "Latest run: #{run_id} (status: {status})", - "pl": "Latest run: #{run_id} (status: {status})", - "ru": "Latest run: #{run_id} (status: {status})", - "zh": "Latest run: #{run_id} (status: {status})" - }, - "No CI checks found for commit {sha}.": { - "en": "No CI checks found for commit {sha}.", - "bg": "No CI checks found for commit {sha}.", - "de": "No CI checks found for commit {sha}.", - "pl": "No CI checks found for commit {sha}.", - "ru": "No CI checks found for commit {sha}.", - "zh": "No CI checks found for commit {sha}." - }, - "No failed jobs.": { - "en": "No failed jobs.", - "bg": "No failed jobs.", - "de": "No failed jobs.", - "pl": "No failed jobs.", - "ru": "No failed jobs.", - "zh": "No failed jobs." - }, - "No job matching '{job}' found.": { - "en": "No job matching '{job}' found.", - "bg": "No job matching '{job}' found.", - "de": "No job matching '{job}' found.", - "pl": "No job matching '{job}' found.", - "ru": "No job matching '{job}' found.", - "zh": "No job matching '{job}' found." - }, - "No jobs found for run #{run_id}.": { - "en": "No jobs found for run #{run_id}.", - "bg": "No jobs found for run #{run_id}.", - "de": "No jobs found for run #{run_id}.", - "pl": "No jobs found for run #{run_id}.", - "ru": "No jobs found for run #{run_id}.", - "zh": "No jobs found for run #{run_id}." - }, - "No open PR found for branch '{branch}'.": { - "en": "No open PR found for branch '{branch}'.", - "bg": "No open PR found for branch '{branch}'.", - "de": "No open PR found for branch '{branch}'.", - "pl": "No open PR found for branch '{branch}'.", - "ru": "No open PR found for branch '{branch}'.", - "zh": "No open PR found for branch '{branch}'." - }, - "No workflow runs found for SHA {sha}.": { - "en": "No workflow runs found for SHA {sha}.", - "bg": "No workflow runs found for SHA {sha}.", - "de": "No workflow runs found for SHA {sha}.", - "pl": "No workflow runs found for SHA {sha}.", - "ru": "No workflow runs found for SHA {sha}.", - "zh": "No workflow runs found for SHA {sha}." - }, - "Repository name not set. Use DEVX_REPO_NAME, [tool.devx] repo_name, or GITHUB_REPOSITORY env var.": { - "en": "Repository name not set. Use DEVX_REPO_NAME, [tool.devx] repo_name, or GITHUB_REPOSITORY env var.", - "bg": "Repository name not set. Use DEVX_REPO_NAME, [tool.devx] repo_name, or GITHUB_REPOSITORY env var.", - "de": "Repository name not set. Use DEVX_REPO_NAME, [tool.devx] repo_name, or GITHUB_REPOSITORY env var.", - "pl": "Repository name not set. Use DEVX_REPO_NAME, [tool.devx] repo_name, or GITHUB_REPOSITORY env var.", - "ru": "Repository name not set. Use DEVX_REPO_NAME, [tool.devx] repo_name, or GITHUB_REPOSITORY env var.", - "zh": "Repository name not set. Use DEVX_REPO_NAME, [tool.devx] repo_name, or GITHUB_REPOSITORY env var." - }, - "Timeout reached after {timeout}s.": { - "en": "Timeout reached after {timeout}s.", - "bg": "Timeout reached after {timeout}s.", - "de": "Timeout reached after {timeout}s.", - "pl": "Timeout reached after {timeout}s.", - "ru": "Timeout reached after {timeout}s.", - "zh": "Timeout reached after {timeout}s." - }, - "Waiting for CI checks to complete (timeout: {timeout}s)...": { - "en": "Waiting for CI checks to complete (timeout: {timeout}s)...", - "bg": "Waiting for CI checks to complete (timeout: {timeout}s)...", - "de": "Waiting for CI checks to complete (timeout: {timeout}s)...", - "pl": "Waiting for CI checks to complete (timeout: {timeout}s)...", - "ru": "Waiting for CI checks to complete (timeout: {timeout}s)...", - "zh": "Waiting for CI checks to complete (timeout: {timeout}s)..." - }, - "\n[check_test_coverage] Fix: add the missing test file(s) before committing.": { - "en": "\n[check_test_coverage] Fix: add the missing test file(s) before committing.", - "bg": "\n[check_test_coverage] Fix: add the missing test file(s) before committing.", - "de": "\n[check_test_coverage] Fix: add the missing test file(s) before committing.", - "pl": "\n[check_test_coverage] Fix: add the missing test file(s) before committing.", - "ru": "\n[check_test_coverage] Fix: add the missing test file(s) before committing.", - "zh": "\n[check_test_coverage] Fix: add the missing test file(s) before committing." - }, - "Package owner not specified. Use --owner or set [tool.devx] repo_owner.": { - "en": "Package owner not specified. Use --owner or set [tool.devx] repo_owner.", - "bg": "Package owner not specified. Use --owner or set [tool.devx] repo_owner.", - "de": "Package owner not specified. Use --owner or set [tool.devx] repo_owner.", - "pl": "Package owner not specified. Use --owner or set [tool.devx] repo_owner.", - "ru": "Package owner not specified. Use --owner or set [tool.devx] repo_owner.", - "zh": "Package owner not specified. Use --owner or set [tool.devx] repo_owner." - }, - "Configuration validation failed.": { - "en": "Configuration validation failed.", - "bg": "Configuration validation failed.", - "de": "Configuration validation failed.", - "pl": "Configuration validation failed.", - "ru": "Configuration validation failed.", - "zh": "Configuration validation failed." - }, - "Missing tests for changed files.": { - "en": "Missing tests for changed files.", - "bg": "Missing tests for changed files.", - "de": "Missing tests for changed files.", - "pl": "Missing tests for changed files.", - "ru": "Missing tests for changed files.", - "zh": "Missing tests for changed files." - }, - "\nReview #{review_id} posted on PR #{pr_number} with event '{event}'.": { - "en": "\nReview #{review_id} posted on PR #{pr_number} with event '{event}'.", - "bg": "\nReview #{review_id} posted on PR #{pr_number} with event '{event}'.", - "de": "\nReview #{review_id} posted on PR #{pr_number} with event '{event}'.", - "pl": "\nReview #{review_id} posted on PR #{pr_number} with event '{event}'.", - "ru": "\nReview #{review_id} posted on PR #{pr_number} with event '{event}'.", - "zh": "\nReview #{review_id} posted on PR #{pr_number} with event '{event}'." - }, - "--checklist-categories must list at least 8 of 13 categories. Got {count}.": { - "en": "--checklist-categories must list at least 8 of 13 categories. Got {count}.", - "bg": "--checklist-categories must list at least 8 of 13 categories. Got {count}.", - "de": "--checklist-categories must list at least 8 of 13 categories. Got {count}.", - "pl": "--checklist-categories must list at least 8 of 13 categories. Got {count}.", - "ru": "--checklist-categories must list at least 8 of 13 categories. Got {count}.", - "zh": "--checklist-categories must list at least 8 of 13 categories. Got {count}." - }, - "--checklist-confirmed is required for APPROVE events.": { - "en": "--checklist-confirmed is required for APPROVE events.", - "bg": "--checklist-confirmed is required for APPROVE events.", - "de": "--checklist-confirmed is required for APPROVE events.", - "pl": "--checklist-confirmed is required for APPROVE events.", - "ru": "--checklist-confirmed is required for APPROVE events.", - "zh": "--checklist-confirmed is required for APPROVE events." - }, - "Invalid checklist category: {cat}. Must be numbers.": { - "en": "Invalid checklist category: {cat}. Must be numbers.", - "bg": "Invalid checklist category: {cat}. Must be numbers.", - "de": "Invalid checklist category: {cat}. Must be numbers.", - "pl": "Invalid checklist category: {cat}. Must be numbers.", - "ru": "Invalid checklist category: {cat}. Must be numbers.", - "zh": "Invalid checklist category: {cat}. Must be numbers." - }, - "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}" - }, - "Review body must be at least 50 characters.": { - "en": "Review body must be at least 50 characters.", - "bg": "Review body must be at least 50 characters.", - "de": "Review body must be at least 50 characters.", - "pl": "Review body must be at least 50 characters.", - "ru": "Review body must be at least 50 characters.", - "zh": "Review body must be at least 50 characters." - }, - " - 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": " - 阻止管理员合并覆盖:是" + "{separator}": { + "bg": "{separator}", + "de": "{separator}", + "en": "{separator}", + "pl": "{separator}", + "ru": "{separator}", + "zh": "{separator}" } }