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

potiuk pushed a commit to branch v3-1-test
in repository https://gitbox.apache.org/repos/asf/airflow.git


The following commit(s) were added to refs/heads/v3-1-test by this push:
     new 0a65c9cc7e2 [v3-1-test] Add possibility of removing extra translations 
missing in en (#57060) (#57064)
0a65c9cc7e2 is described below

commit 0a65c9cc7e22e65c568ac29483de40a0440a9bd3
Author: github-actions[bot] 
<41898282+github-actions[bot]@users.noreply.github.com>
AuthorDate: Sat Oct 25 12:58:28 2025 +0200

    [v3-1-test] Add possibility of removing extra translations missing in en 
(#57060) (#57064)
    
    * [v3-1-test] Fix Outlet Event Extra Data is Empty in Task Instance Success 
Listener (#54568) (#57031)
    
    Co-authored-by: Kevin Yang <[email protected]>
    
    * [v3-1-test] Fix: Adjust PanelButtons spacing and alignment (#56570) 
(#57062)
    
    * [v3-1-test] Fix Outlet Event Extra Data is Empty in Task Instance Success 
Listener (#54568) (#57031)
    
    Co-authored-by: Kevin Yang <[email protected]>
    
    * [v3-1-test] Fix Extra Links translation key. (#57030) (#57040)
    
    (cherry picked from commit 8d71c0710c533da2ea54ef15064a3f0c7a1f00b5)
    
    Co-authored-by: Karthikeyan Singaravelan <[email protected]>
    
    * [v3-1-test] Fix dags list not rendering (#57037) (#57046)
    
    (cherry picked from commit 8668fe575272ccec478c1a9b1afc829844772a73)
    
    Co-authored-by: Pierre Jeambrun <[email protected]>
    
    * [v3-1-test] fix(scheduler): load dag_run eagering for execution API 
validation (#57010) (#57045)
    
    Co-authored-by: Wei Lee <[email protected]>
    fix(scheduler): load dag_run eagering for execution API validation 
(#56916)" (#56943)
    
    * [v3-1-test] Fix dag list cache invalidation on favouriting a dag (#57039) 
(#57047)
    
    Fix dag list cache invalidation on favouriting a dag
    (cherry picked from commit 4e4621251a72a0737e7b918318630481f7a27981)
    
    Co-authored-by: Pierre Jeambrun <[email protected]>
    
    * [v3-1-test] Add new PL translations. (#56359) (#57055)
    
    (cherry picked from commit 6583b6da952deb1b9ea6ecc80e6830cbdc1cdef2)
    
    * Add last missing translation for 3.1.1 (#57057)
    
    * [v3-1-test] Close German translation gaps for full UI translation 
2025-10-21 (#56980) (#57048)
    
    * [v3-1-test] Fix: Adjust PanelButtons spacing and alignment (#56570)
    
    * fix: adjust PanelButtons spacing and alignment
    
    * Fix PanelButtons layout and button styling
    
    * Fix PanelButtons: use bg.subtle and remove unnecessary _hover
    (cherry picked from commit 4c35cd2006ae356713e463b26706350ca1d758e3)
    
    Co-authored-by: anshuksi282-ksolves <[email protected]>
    
    ---------
    
    Co-authored-by: github-actions[bot] 
<41898282+github-actions[bot]@users.noreply.github.com>
    Co-authored-by: Kevin Yang <[email protected]>
    Co-authored-by: Karthikeyan Singaravelan <[email protected]>
    Co-authored-by: Pierre Jeambrun <[email protected]>
    Co-authored-by: Wei Lee <[email protected]>
    Co-authored-by: Jarek Potiuk <[email protected]>
    Co-authored-by: anshuksi282-ksolves <[email protected]>
    
    * [v3-1-test] Add possibility of removing extra translations missing in en 
(#57060)
    
    Sometimes we rename/move translation - we did not have a tool to
    remove such dangling translations. Now we have.
    (cherry picked from commit 2314099290225765f53375891082bf45fd72524f)
    
    Co-authored-by: Jarek Potiuk <[email protected]>
    
    ---------
    
    Co-authored-by: github-actions[bot] 
<41898282+github-actions[bot]@users.noreply.github.com>
    Co-authored-by: Kevin Yang <[email protected]>
    Co-authored-by: Karthikeyan Singaravelan <[email protected]>
    Co-authored-by: Pierre Jeambrun <[email protected]>
    Co-authored-by: Wei Lee <[email protected]>
    Co-authored-by: Jarek Potiuk <[email protected]>
    Co-authored-by: anshuksi282-ksolves <[email protected]>
---
 airflow-core/src/airflow/ui/public/i18n/README.md  | 12 ++++
 .../ui/public/i18n/locales/ar/components.json      |  1 -
 .../airflow/ui/public/i18n/locales/ar/dags.json    |  3 +-
 .../ui/public/i18n/locales/ca/components.json      |  1 -
 .../airflow/ui/public/i18n/locales/de/common.json  |  5 --
 .../airflow/ui/public/i18n/locales/de/hitl.json    |  5 --
 .../airflow/ui/public/i18n/locales/el/common.json  |  3 -
 .../ui/public/i18n/locales/es/components.json      |  1 -
 .../airflow/ui/public/i18n/locales/es/dags.json    |  3 +-
 .../airflow/ui/public/i18n/locales/fr/dags.json    |  3 +-
 .../ui/public/i18n/locales/he/components.json      |  1 -
 .../airflow/ui/public/i18n/locales/he/dags.json    |  3 +-
 .../airflow/ui/public/i18n/locales/hi/common.json  |  3 -
 .../ui/public/i18n/locales/hi/components.json      |  1 -
 .../src/airflow/ui/public/i18n/locales/hi/dag.json |  5 +-
 .../airflow/ui/public/i18n/locales/hi/dags.json    |  3 +-
 .../airflow/ui/public/i18n/locales/hu/common.json  |  2 -
 .../ui/public/i18n/locales/hu/components.json      |  1 -
 .../airflow/ui/public/i18n/locales/hu/dags.json    |  3 +-
 .../ui/public/i18n/locales/it/components.json      |  1 -
 .../airflow/ui/public/i18n/locales/it/dags.json    |  3 +-
 .../ui/public/i18n/locales/ko/components.json      |  1 -
 .../src/airflow/ui/public/i18n/locales/ko/dag.json |  2 -
 .../ui/public/i18n/locales/nl/components.json      |  1 -
 .../airflow/ui/public/i18n/locales/nl/dags.json    |  3 +-
 .../airflow/ui/public/i18n/locales/pl/common.json  |  2 -
 .../airflow/ui/public/i18n/locales/pl/hitl.json    |  3 -
 .../ui/public/i18n/locales/pt/components.json      |  1 -
 .../airflow/ui/public/i18n/locales/pt/dags.json    |  3 +-
 .../airflow/ui/public/i18n/locales/th/common.json  |  2 -
 .../ui/public/i18n/locales/tr/components.json      |  1 -
 .../airflow/ui/public/i18n/locales/tr/dags.json    |  3 +-
 .../ui/public/i18n/locales/zh-CN/components.json   |  1 -
 .../airflow/ui/public/i18n/locales/zh-CN/dags.json |  3 +-
 .../ui/public/i18n/locales/zh-TW/components.json   |  1 -
 dev/i18n/check_translations_completeness.py        | 70 +++++++++++++++++++++-
 36 files changed, 93 insertions(+), 67 deletions(-)

diff --git a/airflow-core/src/airflow/ui/public/i18n/README.md 
b/airflow-core/src/airflow/ui/public/i18n/README.md
index 18e4d44284d..60eb4485c5f 100644
--- a/airflow-core/src/airflow/ui/public/i18n/README.md
+++ b/airflow-core/src/airflow/ui/public/i18n/README.md
@@ -316,6 +316,18 @@ Adding missing translations (with `TODO: translate` 
prefix):
 uv run dev/i18n/check_translations_completeness.py --language <language_code> 
--add-missing
 ```
 
+You can also remove extra translations from the language of your choice:
+
+```bash
+uv run dev/i18n/check_translations_completeness.py --language <language_code> 
--remove-extra
+```
+
+Or from all languages:
+
+```bash
+uv run dev/i18n/check_translations_completeness.py --remove-extra
+```
+
 The script is also added as a prek hook (manual) so that it can be run from 
within `prek` and CI:
 
 ```bash
diff --git a/airflow-core/src/airflow/ui/public/i18n/locales/ar/components.json 
b/airflow-core/src/airflow/ui/public/i18n/locales/ar/components.json
index 0b1c5d74aa9..df1b9d69d9b 100644
--- a/airflow-core/src/airflow/ui/public/i18n/locales/ar/components.json
+++ b/airflow-core/src/airflow/ui/public/i18n/locales/ar/components.json
@@ -120,7 +120,6 @@
   "limitedList.clickToInteract": "انقر على علامة لتصفية Dags",
   "limitedList.clickToOpenFull": "انقر \"+{{count}} المزيد\" لعرض القائمة 
الكاملة",
   "limitedList.copyPasteText": "يمكنك نسخ ولصق النص أعلاه",
-  "limitedList.showingItems": "عرض {{count}} عنصرًا",
   "logs": {
     "file": "ملف",
     "location": "سطر {{line}} في {{name}}"
diff --git a/airflow-core/src/airflow/ui/public/i18n/locales/ar/dags.json 
b/airflow-core/src/airflow/ui/public/i18n/locales/ar/dags.json
index b7f8e60bbd8..12961f79af6 100644
--- a/airflow-core/src/airflow/ui/public/i18n/locales/ar/dags.json
+++ b/airflow-core/src/airflow/ui/public/i18n/locales/ar/dags.json
@@ -20,8 +20,7 @@
       "all": "الكل",
       "paused": "متوقف"
     },
-    "runIdPatternFilter": "بحث تشغيلات الDag",
-    "triggeringUserNameFilter": "البحث حسب المستخدم صاحب الاطلاق"
+    "runIdPatternFilter": "بحث تشغيلات الDag"
   },
   "ownerLink": "رابط المالك لـ{{owner}}",
   "runAndTaskActions": {
diff --git a/airflow-core/src/airflow/ui/public/i18n/locales/ca/components.json 
b/airflow-core/src/airflow/ui/public/i18n/locales/ca/components.json
index d5e7b5c197c..b63b043d53f 100644
--- a/airflow-core/src/airflow/ui/public/i18n/locales/ca/components.json
+++ b/airflow-core/src/airflow/ui/public/i18n/locales/ca/components.json
@@ -92,7 +92,6 @@
   "limitedList.clickToInteract": "Fes clic en una etiqueta per filtrar els 
Dags",
   "limitedList.clickToOpenFull": "Fes clic a \"+{{count}} més\" per veure la 
llista completa",
   "limitedList.copyPasteText": "Pots copiar i enganxar el text de dalt",
-  "limitedList.showingItems": "Mostrant {{count}} elements",
   "logs": {
     "file": "Fitxer",
     "location": "línia {{line}} a {{name}}"
diff --git a/airflow-core/src/airflow/ui/public/i18n/locales/de/common.json 
b/airflow-core/src/airflow/ui/public/i18n/locales/de/common.json
index e4d46a928f3..fe14e8e0d67 100644
--- a/airflow-core/src/airflow/ui/public/i18n/locales/de/common.json
+++ b/airflow-core/src/airflow/ui/public/i18n/locales/de/common.json
@@ -78,11 +78,6 @@
     "githubRepo": "GitHub Ablage",
     "restApiReference": "REST API Referenz"
   },
-  "download": {
-    "download": "Herunterladen",
-    "hotkey": "d",
-    "tooltip": "Drücken Sie {{hotkey}}, um Protokolle herunterzuladen"
-  },
   "duration": "Laufzeit",
   "endDate": "Enddatum",
   "error": {
diff --git a/airflow-core/src/airflow/ui/public/i18n/locales/de/hitl.json 
b/airflow-core/src/airflow/ui/public/i18n/locales/de/hitl.json
index 48212bcd9d4..56162417601 100644
--- a/airflow-core/src/airflow/ui/public/i18n/locales/de/hitl.json
+++ b/airflow-core/src/airflow/ui/public/i18n/locales/de/hitl.json
@@ -1,8 +1,5 @@
 {
   "filters": {
-    "body": "Nachricht",
-    "createdAtFrom": "Erstellt von ",
-    "createdAtTo": "Erstellt bis ",
     "response": {
       "all": "Alle",
       "pending": "Ausstehend",
@@ -15,13 +12,11 @@
   "requiredActionCount_other": "{{count}} offene Interaktionen",
   "requiredActionState": "Status der Interaktion",
   "response": {
-    "created": "Antwort erstellt um ",
     "error": "Senden der Antwort fehlgeschlagen",
     "optionsDescription": "Wählen Sie Ihre Optionen für diesen Task",
     "optionsLabel": "Optionen",
     "received": "Antwort empfangen um ",
     "respond": "Antworten",
-    "responded_by_user_name": "Beantwortet von (Benutzername)",
     "success": "{{taskId}} Interaktion erfolgreich",
     "title": "Erforderliche Interaktion - {{taskId}}"
   },
diff --git a/airflow-core/src/airflow/ui/public/i18n/locales/el/common.json 
b/airflow-core/src/airflow/ui/public/i18n/locales/el/common.json
index f3b725d02fd..2870dda2c27 100644
--- a/airflow-core/src/airflow/ui/public/i18n/locales/el/common.json
+++ b/airflow-core/src/airflow/ui/public/i18n/locales/el/common.json
@@ -101,8 +101,6 @@
   },
   "filter": "Φίλτρο",
   "filters": {
-    "durationFrom": "Διάρκεια Από",
-    "durationTo": "Διάρκεια Έως",
     "logicalDateFrom": "Λογική Ημερομηνία Από",
     "logicalDateTo": "Λογική Ημερομηνία Έως",
     "runAfterFrom": "Εκτέλεση Μετά Από",
@@ -163,7 +161,6 @@
     },
     "tooltip": "Πατήστε {{hotkey}} για κύλιση προς τα {{direction}}"
   },
-  "seconds": "{{count}}δ",
   "security": {
     "actions": "Ενέργειες",
     "permissions": "Δικαιώματα",
diff --git a/airflow-core/src/airflow/ui/public/i18n/locales/es/components.json 
b/airflow-core/src/airflow/ui/public/i18n/locales/es/components.json
index 20f31033ee0..ad1edcd1b39 100644
--- a/airflow-core/src/airflow/ui/public/i18n/locales/es/components.json
+++ b/airflow-core/src/airflow/ui/public/i18n/locales/es/components.json
@@ -99,7 +99,6 @@
   "limitedList.clickToInteract": "Haz clic en una etiqueta para filtrar Dags",
   "limitedList.clickToOpenFull": "Haz clic en \"+{{count}} más\" para ver la 
lista completa",
   "limitedList.copyPasteText": "Puedes copiar y pegar el texto de arriba",
-  "limitedList.showingItems": "Mostrando {{count}} elementos",
   "logs": {
     "file": "Archivo",
     "location": "línea {{line}} en {{name}}"
diff --git a/airflow-core/src/airflow/ui/public/i18n/locales/es/dags.json 
b/airflow-core/src/airflow/ui/public/i18n/locales/es/dags.json
index 7d93addccfc..353ae56534a 100644
--- a/airflow-core/src/airflow/ui/public/i18n/locales/es/dags.json
+++ b/airflow-core/src/airflow/ui/public/i18n/locales/es/dags.json
@@ -20,8 +20,7 @@
       "all": "Todos",
       "paused": "Pausado"
     },
-    "runIdPatternFilter": "Buscar Ejecuciones de Dag",
-    "triggeringUserNameFilter": "Buscar por usuario que activó"
+    "runIdPatternFilter": "Buscar Ejecuciones de Dag"
   },
   "ownerLink": "Enlace de Propietario para {{owner}}",
   "runAndTaskActions": {
diff --git a/airflow-core/src/airflow/ui/public/i18n/locales/fr/dags.json 
b/airflow-core/src/airflow/ui/public/i18n/locales/fr/dags.json
index cd6b2c27356..b8a68745b81 100644
--- a/airflow-core/src/airflow/ui/public/i18n/locales/fr/dags.json
+++ b/airflow-core/src/airflow/ui/public/i18n/locales/fr/dags.json
@@ -20,8 +20,7 @@
       "all": "Tous",
       "paused": "En pause"
     },
-    "runIdPatternFilter": "Rechercher des exécutions de Dag",
-    "triggeringUserNameFilter": "Rechercher par utilisateur déclencheur"
+    "runIdPatternFilter": "Rechercher des exécutions de Dag"
   },
   "ownerLink": "Lien du propriétaire pour {{owner}}",
   "runAndTaskActions": {
diff --git a/airflow-core/src/airflow/ui/public/i18n/locales/he/components.json 
b/airflow-core/src/airflow/ui/public/i18n/locales/he/components.json
index 424d5f675b1..453f3819801 100644
--- a/airflow-core/src/airflow/ui/public/i18n/locales/he/components.json
+++ b/airflow-core/src/airflow/ui/public/i18n/locales/he/components.json
@@ -99,7 +99,6 @@
   "limitedList.clickToInteract": "לחץ על תגית כדי לסנן Dags",
   "limitedList.clickToOpenFull": "לחץ על \"+{{count}} נוספים\" כדי לפתוח את 
התצוגה המלאה",
   "limitedList.copyPasteText": "ניתן להעתיק ולהדביק את הטקסט שמעל",
-  "limitedList.showingItems": "מציג {{count}} פריטים",
   "logs": {
     "file": "קובץ",
     "location": "שורה {{line}} ב{{name}}"
diff --git a/airflow-core/src/airflow/ui/public/i18n/locales/he/dags.json 
b/airflow-core/src/airflow/ui/public/i18n/locales/he/dags.json
index 15729c5f1e8..1b3b06d4bf6 100644
--- a/airflow-core/src/airflow/ui/public/i18n/locales/he/dags.json
+++ b/airflow-core/src/airflow/ui/public/i18n/locales/he/dags.json
@@ -20,8 +20,7 @@
       "all": "הכל",
       "paused": "מושהה"
     },
-    "runIdPatternFilter": "חפש הרצת Dag",
-    "triggeringUserNameFilter": "חפש לפי שם המשתמש המפעיל"
+    "runIdPatternFilter": "חפש הרצת Dag"
   },
   "ownerLink": "קישור בעלים ל-{{owner}}",
   "runAndTaskActions": {
diff --git a/airflow-core/src/airflow/ui/public/i18n/locales/hi/common.json 
b/airflow-core/src/airflow/ui/public/i18n/locales/hi/common.json
index a506b9198b8..1dcef4cb0cc 100644
--- a/airflow-core/src/airflow/ui/public/i18n/locales/hi/common.json
+++ b/airflow-core/src/airflow/ui/public/i18n/locales/hi/common.json
@@ -25,7 +25,6 @@
   "dag_other": "डैग्स",
   "dagDetails": {
     "catchup": "पकड़ना",
-    "concurrency": "समानांतरता",
     "dagRunTimeout": "डैग रन टाइमआउट",
     "defaultArgs": "डिफ़ॉल्ट तर्क",
     "description": "विवरण",
@@ -188,8 +187,6 @@
     "up_for_retry": "पुनः प्रयास के लिए",
     "upstream_failed": "अपस्ट्रीम विफल"
   },
-  "switchToDarkMode": "डार्क मोड में स्विच करें",
-  "switchToLightMode": "लाइट मोड में स्विच करें",
   "table": {
     "completedAt": "पर पूर्ण",
     "createdAt": "पर बनाया",
diff --git a/airflow-core/src/airflow/ui/public/i18n/locales/hi/components.json 
b/airflow-core/src/airflow/ui/public/i18n/locales/hi/components.json
index 4efe768e9be..d3caf8c34c5 100644
--- a/airflow-core/src/airflow/ui/public/i18n/locales/hi/components.json
+++ b/airflow-core/src/airflow/ui/public/i18n/locales/hi/components.json
@@ -92,7 +92,6 @@
   "limitedList.clickToInteract": "टैग पर क्लिक करके Dags फ़िल्टर करें",
   "limitedList.clickToOpenFull": "\"+{{count}} और\" पर क्लिक करके पूरी सूची 
खोलें",
   "limitedList.copyPasteText": "आप ऊपर दिए गए पाठ को कॉपी और पेस्ट कर सकते 
हैं",
-  "limitedList.showingItems": "{{count}} आइटम दिखाए जा रहे हैं",
   "logs": {
     "file": "फ़ाइल",
     "location": "{{name}} में लाइन {{line}}"
diff --git a/airflow-core/src/airflow/ui/public/i18n/locales/hi/dag.json 
b/airflow-core/src/airflow/ui/public/i18n/locales/hi/dag.json
index 253ed958540..36e5d3adfca 100644
--- a/airflow-core/src/airflow/ui/public/i18n/locales/hi/dag.json
+++ b/airflow-core/src/airflow/ui/public/i18n/locales/hi/dag.json
@@ -40,7 +40,6 @@
     "warning": "WARNING"
   },
   "navigation": {
-    "jump": "जंप: Shift+{{arrow}}",
     "navigation": "नेवीगेशन: {{arrow}}",
     "toggleGroup": "ग्रुप टॉगल करें: Space"
   },
@@ -64,9 +63,7 @@
   },
   "panel": {
     "buttons": {
-      "options": "विकल्प",
-      "showGraph": "ग्राफ़ दिखाएं",
-      "showGrid": "ग्रिड दिखाएं"
+      "options": "विकल्प"
     },
     "dagRuns": {
       "label": "डैग रन्स की संख्या"
diff --git a/airflow-core/src/airflow/ui/public/i18n/locales/hi/dags.json 
b/airflow-core/src/airflow/ui/public/i18n/locales/hi/dags.json
index 54cac115336..74c112d0dfb 100644
--- a/airflow-core/src/airflow/ui/public/i18n/locales/hi/dags.json
+++ b/airflow-core/src/airflow/ui/public/i18n/locales/hi/dags.json
@@ -20,8 +20,7 @@
       "all": "सभी",
       "paused": "रोका गया"
     },
-    "runIdPatternFilter": "डैग रन्स खोजें",
-    "triggeringUserNameFilter": "ट्रिगर करने वाले उपयोगकर्ता द्वारा खोजें"
+    "runIdPatternFilter": "डैग रन्स खोजें"
   },
   "ownerLink": "{{owner}} के लिए स्वामी लिंक",
   "runAndTaskActions": {
diff --git a/airflow-core/src/airflow/ui/public/i18n/locales/hu/common.json 
b/airflow-core/src/airflow/ui/public/i18n/locales/hu/common.json
index f26a1540f08..084a73f3c44 100644
--- a/airflow-core/src/airflow/ui/public/i18n/locales/hu/common.json
+++ b/airflow-core/src/airflow/ui/public/i18n/locales/hu/common.json
@@ -189,8 +189,6 @@
     "up_for_retry": "Újrapróbálkozásra vár",
     "upstream_failed": "Előfeltétel sikertelen"
   },
-  "switchToDarkMode": "Váltás sötét módra",
-  "switchToLightMode": "Váltás világos módra",
   "table": {
     "completedAt": "Befejezve ekkor",
     "createdAt": "Létrehozva ekkor",
diff --git a/airflow-core/src/airflow/ui/public/i18n/locales/hu/components.json 
b/airflow-core/src/airflow/ui/public/i18n/locales/hu/components.json
index ded34869e9d..014e8242b43 100644
--- a/airflow-core/src/airflow/ui/public/i18n/locales/hu/components.json
+++ b/airflow-core/src/airflow/ui/public/i18n/locales/hu/components.json
@@ -92,7 +92,6 @@
   "limitedList.clickToInteract": "Kattintson egy címkére a Dag-ok szűréséhez",
   "limitedList.clickToOpenFull": "Kattintson a \"+{{count}} további\" gombra a 
teljes nézethez",
   "limitedList.copyPasteText": "A fenti szöveg másolható és beilleszthető",
-  "limitedList.showingItems": "{{count}} elem megjelenítése",
   "logs": {
     "file": "Fájl",
     "location": "{{name}} fájl {{line}}. sora"
diff --git a/airflow-core/src/airflow/ui/public/i18n/locales/hu/dags.json 
b/airflow-core/src/airflow/ui/public/i18n/locales/hu/dags.json
index 93a925c7c4d..6394092f747 100644
--- a/airflow-core/src/airflow/ui/public/i18n/locales/hu/dags.json
+++ b/airflow-core/src/airflow/ui/public/i18n/locales/hu/dags.json
@@ -20,8 +20,7 @@
       "all": "Összes",
       "paused": "Szüneteltetett"
     },
-    "runIdPatternFilter": "Dag futások keresése",
-    "triggeringUserNameFilter": "Keresés indító felhasználó alapján"
+    "runIdPatternFilter": "Dag futások keresése"
   },
   "ownerLink": "Tulajdonosi hivatkozás: {{owner}}",
   "runAndTaskActions": {
diff --git a/airflow-core/src/airflow/ui/public/i18n/locales/it/components.json 
b/airflow-core/src/airflow/ui/public/i18n/locales/it/components.json
index e8903d951a2..3978d69905b 100644
--- a/airflow-core/src/airflow/ui/public/i18n/locales/it/components.json
+++ b/airflow-core/src/airflow/ui/public/i18n/locales/it/components.json
@@ -106,7 +106,6 @@
   "limitedList.clickToInteract": "Fai clic su un'etichetta per filtrare i Dag",
   "limitedList.clickToOpenFull": "Fai clic su \"+{{count}} altro\" per 
visualizzare tutto",
   "limitedList.copyPasteText": "Puoi copiare e incollare il testo sopra",
-  "limitedList.showingItems": "Visualizzazione di {{count}} elementi",
   "logs": {
     "file": "File",
     "location": "linea {{line}} in {{name}}"
diff --git a/airflow-core/src/airflow/ui/public/i18n/locales/it/dags.json 
b/airflow-core/src/airflow/ui/public/i18n/locales/it/dags.json
index 0cb4eac8ac7..6c6ab552ddc 100644
--- a/airflow-core/src/airflow/ui/public/i18n/locales/it/dags.json
+++ b/airflow-core/src/airflow/ui/public/i18n/locales/it/dags.json
@@ -20,8 +20,7 @@
       "all": "Tutti",
       "paused": "In Pausa"
     },
-    "runIdPatternFilter": "Cercare Dag Runs",
-    "triggeringUserNameFilter": "Cercare per Utente che ha Attivato"
+    "runIdPatternFilter": "Cercare Dag Runs"
   },
   "ownerLink": "Link dell'Owner per {{owner}}",
   "runAndTaskActions": {
diff --git a/airflow-core/src/airflow/ui/public/i18n/locales/ko/components.json 
b/airflow-core/src/airflow/ui/public/i18n/locales/ko/components.json
index e4dfd34a9f5..190a430bd44 100644
--- a/airflow-core/src/airflow/ui/public/i18n/locales/ko/components.json
+++ b/airflow-core/src/airflow/ui/public/i18n/locales/ko/components.json
@@ -90,7 +90,6 @@
   "limitedList.clickToInteract": "태그를 클릭하여 Dag를 필터링하세요",
   "limitedList.clickToOpenFull": "\"+{{count}}개 더 보기\"를 클릭하여 전체 보기 열기",
   "limitedList.copyPasteText": "위의 텍스트를 복사하여 붙여넣을 수 있습니다",
-  "limitedList.showingItems": "{{count}}개 항목 표시 중",
   "logs": {
     "file": "파일",
     "location": "{{name}}의 {{line}}번째 줄"
diff --git a/airflow-core/src/airflow/ui/public/i18n/locales/ko/dag.json 
b/airflow-core/src/airflow/ui/public/i18n/locales/ko/dag.json
index 554d8d5263e..fc722b1f826 100644
--- a/airflow-core/src/airflow/ui/public/i18n/locales/ko/dag.json
+++ b/airflow-core/src/airflow/ui/public/i18n/locales/ko/dag.json
@@ -95,9 +95,7 @@
     "buttons": {
       "options": "옵션",
       "showGantt": "간트 차트 보기",
-      "showGraph": "그래프 보기",
       "showGraphShortcut": "그래프 보기 (g 키)",
-      "showGrid": "그리드 보기",
       "showGridShortcut": "그리드 보기 (g 키)"
     },
     "dagRuns": {
diff --git a/airflow-core/src/airflow/ui/public/i18n/locales/nl/components.json 
b/airflow-core/src/airflow/ui/public/i18n/locales/nl/components.json
index 83785a7112a..9997e067172 100644
--- a/airflow-core/src/airflow/ui/public/i18n/locales/nl/components.json
+++ b/airflow-core/src/airflow/ui/public/i18n/locales/nl/components.json
@@ -92,7 +92,6 @@
   "limitedList.clickToInteract": "Klik op een label om Dags te filteren",
   "limitedList.clickToOpenFull": "Klik op \"+{{count}} meer\" om de volledige 
lijst te openen",
   "limitedList.copyPasteText": "Je kunt de bovenstaande tekst kopiëren en 
plakken",
-  "limitedList.showingItems": "{{count}} items weergegeven",
   "logs": {
     "file": "Bestand",
     "location": "regel {{line}} in {{name}}"
diff --git a/airflow-core/src/airflow/ui/public/i18n/locales/nl/dags.json 
b/airflow-core/src/airflow/ui/public/i18n/locales/nl/dags.json
index b57b2290a92..23fdb3bc2d4 100644
--- a/airflow-core/src/airflow/ui/public/i18n/locales/nl/dags.json
+++ b/airflow-core/src/airflow/ui/public/i18n/locales/nl/dags.json
@@ -20,8 +20,7 @@
       "all": "Alles",
       "paused": "Gepauzeerd"
     },
-    "runIdPatternFilter": "Zoek Dag Runs",
-    "triggeringUserNameFilter": "Zoek op Triggering User"
+    "runIdPatternFilter": "Zoek Dag Runs"
   },
   "ownerLink": "Eigenaarslink voor {{owner}}",
   "runAndTaskActions": {
diff --git a/airflow-core/src/airflow/ui/public/i18n/locales/pl/common.json 
b/airflow-core/src/airflow/ui/public/i18n/locales/pl/common.json
index eaafe9c4b5a..04ca807223b 100644
--- a/airflow-core/src/airflow/ui/public/i18n/locales/pl/common.json
+++ b/airflow-core/src/airflow/ui/public/i18n/locales/pl/common.json
@@ -113,8 +113,6 @@
   },
   "filter": "Filtr",
   "filters": {
-    "durationFrom": "Czas trwania od",
-    "durationTo": "Czas trwania do",
     "logicalDateFrom": "Data logiczna od",
     "logicalDateTo": "Data logiczna do",
     "runAfterFrom": "Uruchom po (od)",
diff --git a/airflow-core/src/airflow/ui/public/i18n/locales/pl/hitl.json 
b/airflow-core/src/airflow/ui/public/i18n/locales/pl/hitl.json
index c5023a8ad12..428f1313ce1 100644
--- a/airflow-core/src/airflow/ui/public/i18n/locales/pl/hitl.json
+++ b/airflow-core/src/airflow/ui/public/i18n/locales/pl/hitl.json
@@ -1,8 +1,5 @@
 {
   "filters": {
-    "body": "Treść",
-    "createdAtFrom": "Utworzono od",
-    "createdAtTo": "Utworzono do",
     "response": {
       "all": "Wszystkie",
       "pending": "Oczekujące",
diff --git a/airflow-core/src/airflow/ui/public/i18n/locales/pt/components.json 
b/airflow-core/src/airflow/ui/public/i18n/locales/pt/components.json
index ae83855677a..5b30826d8b7 100644
--- a/airflow-core/src/airflow/ui/public/i18n/locales/pt/components.json
+++ b/airflow-core/src/airflow/ui/public/i18n/locales/pt/components.json
@@ -106,7 +106,6 @@
   "limitedList.clickToInteract": "Clique em uma etiqueta para filtrar os Dags",
   "limitedList.clickToOpenFull": "Clique em \"+{{count}} mais\" para ver a 
lista completa",
   "limitedList.copyPasteText": "Você pode copiar e colar o texto acima",
-  "limitedList.showingItems": "Exibindo {{count}} itens",
   "logs": {
     "file": "Arquivo",
     "location": "linha {{line}} em {{name}}"
diff --git a/airflow-core/src/airflow/ui/public/i18n/locales/pt/dags.json 
b/airflow-core/src/airflow/ui/public/i18n/locales/pt/dags.json
index 683cf090a8b..6ac6422c19e 100644
--- a/airflow-core/src/airflow/ui/public/i18n/locales/pt/dags.json
+++ b/airflow-core/src/airflow/ui/public/i18n/locales/pt/dags.json
@@ -20,8 +20,7 @@
       "all": "Todos",
       "paused": "Pausado"
     },
-    "runIdPatternFilter": "Pesquisar Execuções de DAG",
-    "triggeringUserNameFilter": "Pesquisar por Usuário que Disparou"
+    "runIdPatternFilter": "Pesquisar Execuções de DAG"
   },
   "ownerLink": "Link do Proprietário para {{owner}}",
   "runAndTaskActions": {
diff --git a/airflow-core/src/airflow/ui/public/i18n/locales/th/common.json 
b/airflow-core/src/airflow/ui/public/i18n/locales/th/common.json
index 543603805bd..f55f6598827 100644
--- a/airflow-core/src/airflow/ui/public/i18n/locales/th/common.json
+++ b/airflow-core/src/airflow/ui/public/i18n/locales/th/common.json
@@ -101,8 +101,6 @@
   },
   "filter": "ตัวกรอง",
   "filters": {
-    "durationFrom": "ระยะเวลาตั้งแต่",
-    "durationTo": "ระยะเวลาถึง",
     "logicalDateFrom": "วันที่ตามกำหนดทำงานตั้งแต่",
     "logicalDateTo": "วันที่ตามกำหนดทำงานถึง",
     "runAfterFrom": "ทำงานตั้งแต่",
diff --git a/airflow-core/src/airflow/ui/public/i18n/locales/tr/components.json 
b/airflow-core/src/airflow/ui/public/i18n/locales/tr/components.json
index 69d80a7672b..0a32afc28b3 100644
--- a/airflow-core/src/airflow/ui/public/i18n/locales/tr/components.json
+++ b/airflow-core/src/airflow/ui/public/i18n/locales/tr/components.json
@@ -92,7 +92,6 @@
   "limitedList.clickToInteract": "Bir etikete tıklayarak Dag'leri filtreleyin",
   "limitedList.clickToOpenFull": "\"+{{count}} daha\" tıklayarak tam görünümü 
açın",
   "limitedList.copyPasteText": "Yukarıdaki metni kopyalayıp 
yapıştırabilirsiniz",
-  "limitedList.showingItems": "{{count}} öğe gösteriliyor",
   "logs": {
     "file": "Dosya",
     "location": "{{name}} içinde satır {{line}}"
diff --git a/airflow-core/src/airflow/ui/public/i18n/locales/tr/dags.json 
b/airflow-core/src/airflow/ui/public/i18n/locales/tr/dags.json
index 2974a4d4f48..8c6d0213052 100644
--- a/airflow-core/src/airflow/ui/public/i18n/locales/tr/dags.json
+++ b/airflow-core/src/airflow/ui/public/i18n/locales/tr/dags.json
@@ -20,8 +20,7 @@
       "all": "Tümü",
       "paused": "Duraklatılmış"
     },
-    "runIdPatternFilter": "Dag Çalıştırmalarında Ara",
-    "triggeringUserNameFilter": "Tetikleyen Kullanıcıya Göre Ara"
+    "runIdPatternFilter": "Dag Çalıştırmalarında Ara"
   },
   "ownerLink": "{{owner}} için sahip bağlantısı",
   "runAndTaskActions": {
diff --git 
a/airflow-core/src/airflow/ui/public/i18n/locales/zh-CN/components.json 
b/airflow-core/src/airflow/ui/public/i18n/locales/zh-CN/components.json
index e7255110e8f..652011da2be 100644
--- a/airflow-core/src/airflow/ui/public/i18n/locales/zh-CN/components.json
+++ b/airflow-core/src/airflow/ui/public/i18n/locales/zh-CN/components.json
@@ -90,7 +90,6 @@
   "limitedList.clickToInteract": "点击标签以筛选 DAGs",
   "limitedList.clickToOpenFull": "点击 \"+{{count}} 更多\" 打开完整视图",
   "limitedList.copyPasteText": "你可以复制并粘贴上方文本",
-  "limitedList.showingItems": "显示 {{count}} 项",
   "logs": {
     "file": "文件",
     "location": "第 {{line}} 行,位于 {{name}}"
diff --git a/airflow-core/src/airflow/ui/public/i18n/locales/zh-CN/dags.json 
b/airflow-core/src/airflow/ui/public/i18n/locales/zh-CN/dags.json
index b8e4f0929d4..90ba4ff9588 100644
--- a/airflow-core/src/airflow/ui/public/i18n/locales/zh-CN/dags.json
+++ b/airflow-core/src/airflow/ui/public/i18n/locales/zh-CN/dags.json
@@ -20,8 +20,7 @@
       "all": "全部",
       "paused": "暂停"
     },
-    "runIdPatternFilter": "搜索 Dag 执行",
-    "triggeringUserNameFilter": "搜索触发用户名称"
+    "runIdPatternFilter": "搜索 Dag 执行"
   },
   "ownerLink": "拥有者 {{owner}} 的地址",
   "runAndTaskActions": {
diff --git 
a/airflow-core/src/airflow/ui/public/i18n/locales/zh-TW/components.json 
b/airflow-core/src/airflow/ui/public/i18n/locales/zh-TW/components.json
index c655e241acd..bd4fe614be2 100644
--- a/airflow-core/src/airflow/ui/public/i18n/locales/zh-TW/components.json
+++ b/airflow-core/src/airflow/ui/public/i18n/locales/zh-TW/components.json
@@ -90,7 +90,6 @@
   "limitedList.clickToInteract": "點擊標籤以篩選 Dags",
   "limitedList.clickToOpenFull": "點擊 \"+{{count}} 更多\" 以開啟完整檢視",
   "limitedList.copyPasteText": "你可以複製並貼上上方文字",
-  "limitedList.showingItems": "顯示 {{count}} 個項目",
   "logs": {
     "file": "檔案",
     "location": "第 {{line}} 行,位於 {{name}}"
diff --git a/dev/i18n/check_translations_completeness.py 
b/dev/i18n/check_translations_completeness.py
index e3c2e0d8418..5972087b9ff 100755
--- a/dev/i18n/check_translations_completeness.py
+++ b/dev/i18n/check_translations_completeness.py
@@ -458,7 +458,13 @@ def print_translation_progress(console, locale_files, 
missing_counts, summary):
     default=False,
     help="Add missing translations for all languages except English, prefixed 
with 'TODO: translate:'.",
 )
-def cli(language: str | None = None, add_missing: bool = False):
[email protected](
+    "--remove-extra",
+    is_flag=True,
+    default=False,
+    help="Remove extra translations that are present in the language but 
missing in English.",
+)
+def cli(language: str | None = None, add_missing: bool = False, remove_extra: 
bool = False):
     locale_files = get_locale_files()
     console = Console(force_terminal=True, color_system="auto")
     print_locale_file_table(locale_files, console, language)
@@ -481,6 +487,22 @@ def cli(language: str | None = None, add_missing: bool = 
False):
             add_missing_translations(lf.locale, filtered_summary, console)
         # After adding, re-run the summary for all languages
         summary, missing_counts = compare_keys(get_locale_files(), console)
+    if remove_extra and language != "en":
+        # Loop through all languages except 'en' and remove extra translations
+        if language:
+            language_files = [lf for lf in locale_files if lf.locale == 
language]
+        else:
+            language_files = [lf for lf in locale_files if lf.locale != "en"]
+        for lf in language_files:
+            filtered_summary = {}
+            for filename, diff in summary.items():
+                filtered_summary[filename] = LocaleSummary(
+                    missing_keys={lf.locale: diff.missing_keys.get(lf.locale, 
[])},
+                    extra_keys={lf.locale: diff.extra_keys.get(lf.locale, [])},
+                )
+            remove_extra_translations(lf.locale, filtered_summary, console)
+        # After removing, re-run the summary for all languages
+        summary, missing_counts = compare_keys(get_locale_files(), console)
     if language:
         locales = [lf.locale for lf in locale_files]
         if language not in locales:
@@ -594,5 +616,51 @@ def add_missing_translations(language: str, summary: 
dict[str, LocaleSummary], c
         console.print(f"[green]Added missing translations to 
{lang_path}[/green]")
 
 
+def remove_extra_translations(language: str, summary: dict[str, 
LocaleSummary], console: Console):
+    """
+    Remove extra translations for the selected language.
+
+    Removes keys that are present in the language file but missing in the 
English file.
+    """
+    for filename, diff in summary.items():
+        extra_keys = set(diff.extra_keys.get(language, []))
+        if not extra_keys:
+            continue
+        lang_path = LOCALES_DIR / language / filename
+        try:
+            lang_data = load_json(lang_path)
+        except Exception as e:
+            console.print(f"[yellow]Failed to load {language} file 
{lang_path}: {e}[/yellow]")
+            continue
+
+        # Helper to recursively remove extra keys
+        def remove_keys(dst, prefix=""):
+            keys_to_remove = []
+            for k, v in list(dst.items()):
+                full_key = f"{prefix}.{k}" if prefix else k
+                if full_key in extra_keys:
+                    keys_to_remove.append(k)
+                elif isinstance(v, dict):
+                    remove_keys(v, full_key)
+                    # Remove empty dictionaries after recursion
+                    if not v:
+                        keys_to_remove.append(k)
+            for k in keys_to_remove:
+                del dst[k]
+
+        remove_keys(lang_data)
+
+        def natural_key_sort(obj):
+            if isinstance(obj, dict):
+                return {k: natural_key_sort(obj[k]) for k in sorted(obj)}
+            return obj
+
+        lang_data = natural_key_sort(lang_data)
+        with open(lang_path, "w", encoding="utf-8") as f:
+            json.dump(lang_data, f, ensure_ascii=False, indent=2)
+            f.write("\n")  # Ensure newline at the end of the file
+        console.print(f"[green]Removed {len(extra_keys)} extra translations 
from {lang_path}[/green]")
+
+
 if __name__ == "__main__":
     cli()


Reply via email to