This is an automated email from the ASF dual-hosted git repository.

potiuk pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git


The following commit(s) were added to refs/heads/main by this push:
     new 89ce10103eb Improve check translation completeness script: (#55342)
89ce10103eb is described below

commit 89ce10103ebaa7bcaf4a1dab9b9825aa529bcc27
Author: Jarek Potiuk <ja...@potiuk.com>
AuthorDate: Sun Sep 7 11:23:38 2025 +0200

    Improve check translation completeness script: (#55342)
    
    * the file check at the beginning has languages sorted and only
      displays those languages in case of differences that have differences
      (and only shows the differences)
    
    * at the end of the check summary is printed for all language (sorted)
      showing the overall status of all languages.
---
 dev/i18n/check_translations_completeness.py | 46 ++++++++++++++++++++++-------
 1 file changed, 36 insertions(+), 10 deletions(-)

diff --git a/dev/i18n/check_translations_completeness.py 
b/dev/i18n/check_translations_completeness.py
index 450102ad2f2..1784e9a0a7f 100755
--- a/dev/i18n/check_translations_completeness.py
+++ b/dev/i18n/check_translations_completeness.py
@@ -73,7 +73,7 @@ class LocaleSummary(NamedTuple):
 
     Attributes:
         missing_keys: A dictionary mapping locale codes to lists of missing 
translation keys.
-        extra: A dictionary mapping locale codes to lists of extra translation 
keys.
+        extra_keys: A dictionary mapping locale codes to lists of extra 
translation keys.
     """
 
     missing_keys: dict[str, list[str]]
@@ -225,7 +225,7 @@ def print_locale_file_table(
     table = Table(show_header=True, header_style="bold magenta")
     table.add_column("Locale")
     table.add_column("Files")
-    filtered = (
+    filtered = sorted(
         locale_files if language is None else [lf for lf in locale_files if 
lf.locale in (language, "en")]
     )
     for lf in filtered:
@@ -244,11 +244,20 @@ def print_file_set_differences(
     all_file_sets = {lf.locale: set(lf.files) for lf in filtered}
     file_sets: list[set[str]] = list(all_file_sets.values())
     found_difference = False
+    en_files = set(all_file_sets["en"])
     if len(file_sets) > 1 and any(file_sets[0] != fs for fs in file_sets[1:]):
         found_difference = True
-        console.print("[bold red]Error: Locales have different sets of 
translation files![/bold red]")
-        for locale, files_set in all_file_sets.items():
-            console.print(f"[yellow]{locale}[/yellow]: 
{sorted(list(files_set))}")
+        console.print("[bold red]Error: Locales have different set of 
translation files![/bold red]")
+        all_locales_sorted = sorted(all_file_sets.keys())
+        for locale in all_locales_sorted:
+            files_missing = sorted(en_files - all_file_sets[locale])
+            if files_missing:
+                console.print(
+                    f"[yellow]{locale:<6}[/yellow] Missing 
{len(files_missing):>2}: {files_missing} "
+                )
+            files_extra = sorted(all_file_sets[locale] - en_files)
+            if files_extra:
+                console.print(f"[red]{locale:<6}[/red] Extra   
{len(files_extra):>2}: {files_extra} ")
     return found_difference
 
 
@@ -318,6 +327,7 @@ def count_todos(obj) -> int:
 def print_translation_progress(console, locale_files, missing_counts, summary):
     tables = defaultdict(lambda: Table(show_lines=True))
     all_files = set()
+    coverage_per_language = {}  # Collect total coverage per language
     for lf in locale_files:
         all_files.update(lf.files)
 
@@ -336,7 +346,7 @@ def print_translation_progress(console, locale_files, 
missing_counts, summary):
         table.add_column("Translated", style="green")
         table.add_column("Total", style="bold")
         table.add_column("Coverage", style="bold")
-        table.add_column("Completion", style="bold")
+        table.add_column("Completed", style="bold")
         total_missing = 0
         total_extra = 0
         total_todos = 0
@@ -414,6 +424,7 @@ def print_translation_progress(console, locale_files, 
missing_counts, summary):
         total_actual_translated = total_translated - total_todos
         total_complete_percent = 100 * total_actual_translated / 
total_translated if total_translated else 100
 
+        coverage_per_language[lang] = total_coverage_percent
         table.add_row(
             "All files",
             str(total_missing),
@@ -429,7 +440,7 @@ def print_translation_progress(console, locale_files, 
missing_counts, summary):
     for _lang, table in tables.items():
         console.print(table)
 
-    return has_todos
+    return has_todos, coverage_per_language
 
 
 @click.command()
@@ -478,16 +489,31 @@ def cli(language: str | None = None, add_missing: bool = 
False):
     else:
         lang_diff = print_language_summary(locale_files, summary, console)
         found_difference = found_difference or lang_diff
-    has_todos = print_translation_progress(
+    has_todos, coverage_per_language = print_translation_progress(
         console,
         [lf for lf in locale_files if language is None or lf.locale == 
language],
         missing_counts,
         summary,
     )
     if not found_difference and not has_todos:
-        console.print("\n[green]All translations are complete and 
consistent![/green]\n\n")
+        console.print("\n[green]All translations are complete![/green]\n\n")
     else:
-        console.print("\n[red]Some translations are neither complete nor 
consistent![/red]\n\n")
+        console.print("\n[red]Some translations are not complete![/red]\n\n")
+        # Print summary of total coverage per language
+        if coverage_per_language:
+            summary_table = Table(show_header=True, header_style="bold 
magenta")
+            summary_table.title = "Total Coverage per Language"
+            summary_table.add_column("Language", style="cyan")
+            summary_table.add_column("Coverage", style="green")
+            for lang, coverage in sorted(coverage_per_language.items()):
+                if coverage >= 95:
+                    coverage_str = f"[bold green]{coverage:.1f}%[/bold green]"
+                elif coverage > 80:
+                    coverage_str = f"[bold yellow]{coverage:.1f}%[/bold 
yellow]"
+                else:
+                    coverage_str = f"[red]{coverage:.1f}%[/red]"
+                summary_table.add_row(lang, coverage_str)
+            console.print(summary_table)
 
 
 def add_missing_translations(language: str, summary: dict[str, LocaleSummary], 
console: Console):

Reply via email to