Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions PythonScripts/audit_translations/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ uv run python -m audit_translations --list
* `--format`: Output format (`rich`, `jsonl`). `--output` is honored only for `jsonl`; rich output always prints to the console.
* `--rules-dir`: Override the Rules/Languages directory path.
* `--only`: Filter issue types (comma-separated): `missing`, `untranslated`, `extra`, `diffs`, `all`.
* `--verbose`: Show detailed output including English/translated snippets for rule differences (only affects rich format; default shows summary only).
* **Summary Stats:** Provides a statistical summary after every run.

**Examples:**
Expand All @@ -89,4 +90,7 @@ uv run python -m audit_translations es --format jsonl --output es-issues.jsonl

# Audit a regional variant (merges Rules/Languages/de and Rules/Languages/de/CH)
uv run python -m audit_translations de-CH

# Show detailed output with English/translated snippets for rule differences
uv run python -m audit_translations es --verbose
```
16 changes: 9 additions & 7 deletions PythonScripts/audit_translations/auditor.py
Original file line number Diff line number Diff line change
Expand Up @@ -161,16 +161,17 @@ def print_rule_item(rule: RuleInfo, context: str = ""):
console.print(f" [dim]•[/] {rule_label(rule)} [dim](line {rule.line_number}{context})[/]")


def print_diff_item(diff: RuleDifference):
def print_diff_item(diff: RuleDifference, verbose: bool = False):
"""Print a single rule difference"""
rule = diff.english_rule
console.print(
f" [dim]•[/] {rule_label(rule)} "
f"[dim](line {rule.line_number} en, {diff.translated_rule.line_number} tr)[/]"
)
console.print(f" [dim]{diff.description}:[/]")
console.print(f" [green]en:[/] {escape(diff.english_snippet)}")
console.print(f" [red]tr:[/] {escape(diff.translated_snippet)}")
console.print(f" [dim]{diff.description}[/]")
if verbose:
console.print(f" [green]en:[/] {escape(diff.english_snippet)}")
console.print(f" [red]tr:[/] {escape(diff.translated_snippet)}")


def issue_base(rule: RuleInfo, file_name: str, language: str) -> dict:
Expand Down Expand Up @@ -259,7 +260,7 @@ def write(self, issue: dict) -> None:
self.stream.write(json.dumps(issue, ensure_ascii=False) + "\n")


def print_warnings(result: ComparisonResult, file_name: str) -> int:
def print_warnings(result: ComparisonResult, file_name: str, verbose: bool = False) -> int:
"""Print warnings to console. Returns count of issues found."""
issues = 0

Expand Down Expand Up @@ -296,7 +297,7 @@ def print_warnings(result: ComparisonResult, file_name: str) -> int:
f"[[magenta]{total_diffs}[/]] [dim](structural differences between en and translation)[/]"
)
for diff in result.rule_differences:
print_diff_item(diff)
print_diff_item(diff, verbose)
issues += 1

if result.extra_rules:
Expand All @@ -315,6 +316,7 @@ def audit_language(
output_path: Optional[str] = None,
rules_dir: Optional[str] = None,
issue_filter: Optional[set[str]] = None,
verbose: bool = False,
) -> int:
"""Audit translations for a specific language. Returns total issue count."""
rules_dir_path = get_rules_dir(rules_dir)
Expand Down Expand Up @@ -382,7 +384,7 @@ def audit_language(
has_issues = result.missing_rules or result.untranslated_text or result.extra_rules or result.rule_differences
if output_format == "rich":
if has_issues:
issues = print_warnings(result, file_name)
issues = print_warnings(result, file_name, verbose)
if issues > 0:
files_with_issues += 1
total_issues += issues
Expand Down
6 changes: 6 additions & 0 deletions PythonScripts/audit_translations/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,11 @@ def main():
"--only",
help="Comma-separated issue types: missing, untranslated, extra, diffs, all",
)
parser.add_argument(
"--verbose",
action="store_true",
help="Show detailed output including rule snippets (only affects rich format)",
)

args = parser.parse_args()

Expand Down Expand Up @@ -70,6 +75,7 @@ def main():
args.output,
args.rules_dir,
issue_filter,
args.verbose,
)


Expand Down
Loading