This is an automated email from the ASF dual-hosted git repository.
bbovenzi 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 3b22cdeaf77 Fix view for many DAG tags (#55604)
3b22cdeaf77 is described below
commit 3b22cdeaf77d5aa5c22941653710964cae33d6b7
Author: Steve Ahn <[email protected]>
AuthorDate: Thu Oct 16 06:29:24 2025 -0700
Fix view for many DAG tags (#55604)
* fix view for many tags
* fixup! fix view for many tags
* Update
airflow-core/src/airflow/ui/public/i18n/locales/zh-TW/components.json
Co-authored-by: Jarek Potiuk <[email protected]>
* Update airflow-core/src/airflow/ui/public/i18n/locales/ar/components.json
Co-authored-by: Jarek Potiuk <[email protected]>
* Update airflow-core/src/airflow/ui/public/i18n/locales/de/components.json
Co-authored-by: Jens Scheffler <[email protected]>
* Update airflow-core/src/airflow/ui/public/i18n/locales/es/components.json
Co-authored-by: Jarek Potiuk <[email protected]>
* Update airflow-core/src/airflow/ui/public/i18n/locales/hi/components.json
Co-authored-by: Jarek Potiuk <[email protected]>
* Update airflow-core/src/airflow/ui/public/i18n/locales/it/components.json
Co-authored-by: Jarek Potiuk <[email protected]>
* Update airflow-core/src/airflow/ui/public/i18n/locales/ko/components.json
Co-authored-by: Jarek Potiuk <[email protected]>
* Update airflow-core/src/airflow/ui/public/i18n/locales/ar/components.json
Co-authored-by: Shahar Epstein <[email protected]>
* Update airflow-core/src/airflow/ui/public/i18n/locales/hu/components.json
Co-authored-by: Jarek Potiuk <[email protected]>
* Update
airflow-core/src/airflow/ui/public/i18n/locales/zh-TW/components.json
Co-authored-by: LIU ZHE YOU <[email protected]>
* Update airflow-core/src/airflow/ui/public/i18n/locales/tr/components.json
Co-authored-by: Bugra Ozturk <[email protected]>
* Update airflow-core/src/airflow/ui/public/i18n/locales/tr/components.json
Co-authored-by: Bugra Ozturk <[email protected]>
* Update airflow-core/src/airflow/ui/public/i18n/locales/ca/components.json
Co-authored-by: Jarek Potiuk <[email protected]>
* Update airflow-core/src/airflow/ui/public/i18n/locales/he/components.json
Co-authored-by: Shahar Epstein <[email protected]>
* Update airflow-core/src/airflow/ui/public/i18n/locales/en/components.json
Co-authored-by: Jarek Potiuk <[email protected]>
* Update airflow-core/src/airflow/ui/public/i18n/locales/pl/components.json
Co-authored-by: Jarek Potiuk <[email protected]>
* Update airflow-core/src/airflow/ui/public/i18n/locales/pt/components.json
Co-authored-by: Jarek Potiuk <[email protected]>
* Update airflow-core/src/airflow/ui/public/i18n/locales/nl/components.json
Co-authored-by: Jarek Potiuk <[email protected]>
* Update airflow-core/src/airflow/ui/public/i18n/locales/fr/components.json
Co-authored-by: Jarek Potiuk <[email protected]>
* plurals & render fixes
* fixup! plurals & render fixes
* disable tooltip & enable modal, fix dutch translation
* modal to popver, rmv subtitle, rmv tooltip comp
* Update airflow-core/src/airflow/ui/src/components/LimitedItemsList.tsx
Co-authored-by: Brent Bovenzi <[email protected]>
* Apply suggestion from @Lee-W
Co-authored-by: Wei Lee <[email protected]>
* Update airflow-core/src/airflow/ui/src/components/LimitedItemsList.tsx
* Update airflow-core/src/airflow/ui/src/components/LimitedItemsList.tsx
---------
Co-authored-by: Jarek Potiuk <[email protected]>
Co-authored-by: Jens Scheffler <[email protected]>
Co-authored-by: Shahar Epstein <[email protected]>
Co-authored-by: LIU ZHE YOU <[email protected]>
Co-authored-by: Bugra Ozturk <[email protected]>
Co-authored-by: Brent Bovenzi <[email protected]>
Co-authored-by: Wei Lee <[email protected]>
---
.../ui/public/i18n/locales/ar/components.json | 5 ++
.../ui/public/i18n/locales/ca/components.json | 5 ++
.../ui/public/i18n/locales/de/components.json | 5 ++
.../ui/public/i18n/locales/en/components.json | 8 +++
.../ui/public/i18n/locales/es/components.json | 5 ++
.../ui/public/i18n/locales/fr/components.json | 5 ++
.../ui/public/i18n/locales/he/components.json | 5 ++
.../ui/public/i18n/locales/hi/components.json | 5 ++
.../ui/public/i18n/locales/hu/components.json | 5 ++
.../ui/public/i18n/locales/it/components.json | 5 ++
.../ui/public/i18n/locales/ko/components.json | 5 ++
.../ui/public/i18n/locales/nl/components.json | 9 ++-
.../ui/public/i18n/locales/pl/components.json | 13 ++++
.../ui/public/i18n/locales/pt/components.json | 5 ++
.../ui/public/i18n/locales/tr/components.json | 5 ++
.../ui/public/i18n/locales/zh-CN/components.json | 5 ++
.../ui/public/i18n/locales/zh-TW/components.json | 5 ++
.../airflow/ui/src/components/LimitedItemsList.tsx | 70 ++++++++++++++++++----
dev/i18n/check_translations_completeness.py | 25 +++++---
19 files changed, 173 insertions(+), 22 deletions(-)
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 b3dea080ed4..0b1c5d74aa9 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
@@ -116,6 +116,11 @@
"taskGroup": "مجموعة المهام"
},
"limitedList": "+{{count}} المزيد",
+ "limitedList.allItems": "جميع العناصر {{count}}:",
+ "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/ca/components.json
b/airflow-core/src/airflow/ui/public/i18n/locales/ca/components.json
index 9c7a9b71c91..d5e7b5c197c 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
@@ -88,6 +88,11 @@
"taskGroup": "Grup de tasques"
},
"limitedList": "+{{count}} més",
+ "limitedList.allItems": "Tots els {{count}} elements:",
+ "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/components.json
b/airflow-core/src/airflow/ui/public/i18n/locales/de/components.json
index fa0aceedf59..47398e4db6c 100644
--- a/airflow-core/src/airflow/ui/public/i18n/locales/de/components.json
+++ b/airflow-core/src/airflow/ui/public/i18n/locales/de/components.json
@@ -88,6 +88,11 @@
"taskGroup": "Task Gruppe"
},
"limitedList": "+{{count}} mehr",
+ "limitedList.allItems": "Alle {{count}} Einträge:",
+ "limitedList.clickToInteract": "Klicken Sie auf eine Markierung, um Dags zu
filtern",
+ "limitedList.clickToOpenFull": "Klicken Sie auf \"+{{count}} mehr\" für die
vollständige Ansicht",
+ "limitedList.copyPasteText": "Sie können den obigen Text kopieren und
einfügen",
+ "limitedList.showingItems": "{{count}} Einträge werden angezeigt",
"logs": {
"file": "Datei",
"location": "Zeile {{line}} in {{name}}"
diff --git a/airflow-core/src/airflow/ui/public/i18n/locales/en/components.json
b/airflow-core/src/airflow/ui/public/i18n/locales/en/components.json
index e8335d6d7e2..eed0d7784c7 100644
--- a/airflow-core/src/airflow/ui/public/i18n/locales/en/components.json
+++ b/airflow-core/src/airflow/ui/public/i18n/locales/en/components.json
@@ -86,6 +86,14 @@
"taskGroup": "Task Group"
},
"limitedList": "+{{count}} more",
+ "limitedList.allItems": "All {{count}} items:",
+ "limitedList.allTags_one": "All Tags (1)",
+ "limitedList.allTags_other": "All Tags ({{count}})",
+ "limitedList.clickToInteract": "Click a tag to filter Dags",
+ "limitedList.clickToOpenFull": "Click \"+{{count}} more\" to open full view",
+ "limitedList.copyPasteText": "You can copy and paste the text above",
+ "limitedList.showingItems_one": "Showing 1 item",
+ "limitedList.showingItems_other": "Showing {{count}} items",
"logs": {
"file": "File",
"location": "line {{line}} in {{name}}"
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 2fd8bda7c4e..20f31033ee0 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
@@ -95,6 +95,11 @@
"taskGroup": "Grupo de Tareas"
},
"limitedList": "+{{count}} más",
+ "limitedList.allItems": "Todos los {{count}} elementos:",
+ "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/fr/components.json
b/airflow-core/src/airflow/ui/public/i18n/locales/fr/components.json
index fb8ef56e93d..d38f4bc9702 100644
--- a/airflow-core/src/airflow/ui/public/i18n/locales/fr/components.json
+++ b/airflow-core/src/airflow/ui/public/i18n/locales/fr/components.json
@@ -95,6 +95,11 @@
"taskGroup": "Groupe de tâches"
},
"limitedList": "+{{count}} supplémentaires",
+ "limitedList.allItems": "Tous les {{count}} éléments :",
+ "limitedList.clickToInteract": "Cliquez sur une étiquette pour filtrer les
Dags",
+ "limitedList.clickToOpenFull": "Cliquez sur \"+{{count}} supplémentaires\"
pour ouvrir la vue complète",
+ "limitedList.copyPasteText": "Vous pouvez copier et coller le texte
ci-dessus",
+ "limitedList.showingItems": "Affichage de {{count}} éléments",
"logs": {
"file": "Fichier",
"location": "ligne {{line}} dans {{name}}"
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 5922fcebe4f..424d5f675b1 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
@@ -95,6 +95,11 @@
"taskGroup": "קבוצת משימות"
},
"limitedList": "+ {{count}} נוספים",
+ "limitedList.allItems": "כל {{count}} הפריטים:",
+ "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/hi/components.json
b/airflow-core/src/airflow/ui/public/i18n/locales/hi/components.json
index bfcf144af62..4efe768e9be 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
@@ -88,6 +88,11 @@
"taskGroup": "टास्क ग्रुप"
},
"limitedList": "+{{count}} और",
+ "limitedList.allItems": "सभी {{count}} आइटम:",
+ "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/hu/components.json
b/airflow-core/src/airflow/ui/public/i18n/locales/hu/components.json
index 91f52c3f0cc..ded34869e9d 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
@@ -88,6 +88,11 @@
"taskGroup": "Feladatcsoport"
},
"limitedList": "+{{count}} további",
+ "limitedList.allItems": "Összes {{count}} elem:",
+ "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/it/components.json
b/airflow-core/src/airflow/ui/public/i18n/locales/it/components.json
index 564a2fcba5a..e8903d951a2 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
@@ -102,6 +102,11 @@
"taskGroup": "Task Group"
},
"limitedList": "+{{count}} altro",
+ "limitedList.allItems": "Tutti i {{count}} elementi:",
+ "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/ko/components.json
b/airflow-core/src/airflow/ui/public/i18n/locales/ko/components.json
index 364868b4afc..e4dfd34a9f5 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
@@ -86,6 +86,11 @@
"taskGroup": "작업 그룹"
},
"limitedList": "+{{count}}개 더 보기",
+ "limitedList.allItems": "모든 {{count}}개 항목:",
+ "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/nl/components.json
b/airflow-core/src/airflow/ui/public/i18n/locales/nl/components.json
index afd5ecbfe08..83785a7112a 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
@@ -1,7 +1,7 @@
{
"backfill": {
- "affected_one": "1 run zal getriggered worden.",
- "affected_other": "{{count}} Runs zullen getriggered worden.",
+ "affected_one": "1 run zal getriggerd worden.",
+ "affected_other": "{{count}} Runs zullen getriggerd worden.",
"affectedNone": "Geen Runs komen overeen met de geselecteerde criteria.",
"allRuns": "Alle Runs",
"backwards": "Run achterstevoren",
@@ -88,6 +88,11 @@
"taskGroup": "Task Group"
},
"limitedList": "+{{count}} meer",
+ "limitedList.allItems": "Alle {{count}} items:",
+ "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/pl/components.json
b/airflow-core/src/airflow/ui/public/i18n/locales/pl/components.json
index 02d7df2529d..4dbb12e7a6c 100644
--- a/airflow-core/src/airflow/ui/public/i18n/locales/pl/components.json
+++ b/airflow-core/src/airflow/ui/public/i18n/locales/pl/components.json
@@ -1,4 +1,8 @@
{
+ "allTags_few": "Wszystkie tagi ({{count}})",
+ "allTags_many": "Wszystkie tagi ({{count}})",
+ "allTags_one": "Wszystkie tagi ({{count}})",
+ "allTags_other": "Wszystkie tagi ({{count}})",
"backfill": {
"affected_few": "{{count}} wykonania zostaną uruchomione.",
"affected_many": "{{count}} wykonań zostanie uruchomionych.",
@@ -102,11 +106,20 @@
"taskGroup": "Grupa zadań"
},
"limitedList": "+{{count}} więcej",
+ "limitedList.allItems": "Wszystkie {{count}} elementy:",
+ "limitedList.clickToInteract": "Kliknij etykietę, aby przefiltrować Dagi",
+ "limitedList.clickToOpenFull": "Kliknij \"+{{count}} więcej\", aby zobaczyć
pełną listę",
+ "limitedList.copyPasteText": "Możesz skopiować i wkleić powyższy tekst",
+ "limitedList.showingItems": "Wyświetlanie {{count}} elementów",
"logs": {
"file": "Plik",
"location": "linia {{line}} w {{name}}"
},
"reparseDag": "Ponowne przetworznie Daga",
+ "showingItems_few": "Wyświetlanie {{count}} elementy",
+ "showingItems_many": "Wyświetlanie {{count}} elementów",
+ "showingItems_one": "Wyświetlanie {{count}} elementu",
+ "showingItems_other": "Wyświetlanie {{count}} elementów",
"sortedAscending": "posortowane rosnąco",
"sortedDescending": "posortowane malejąco",
"sortedUnsorted": "nieposortowane",
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 a2aac0c0d59..ae83855677a 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
@@ -102,6 +102,11 @@
"taskGroup": "Grupo de Tarefas"
},
"limitedList": "+{{count}} mais",
+ "limitedList.allItems": "Todos os {{count}} itens:",
+ "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/tr/components.json
b/airflow-core/src/airflow/ui/public/i18n/locales/tr/components.json
index c9d290d3ddc..69d80a7672b 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
@@ -88,6 +88,11 @@
"taskGroup": "Görev Grubu"
},
"limitedList": "+{{count}} daha",
+ "limitedList.allItems": "Tüm {{count}} öğeler:",
+ "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/zh-CN/components.json
b/airflow-core/src/airflow/ui/public/i18n/locales/zh-CN/components.json
index a112bf67440..e7255110e8f 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
@@ -86,6 +86,11 @@
"taskGroup": "任务分组"
},
"limitedList": "+ 其他 {{count}} 项",
+ "limitedList.allItems": "所有 {{count}} 项:",
+ "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-TW/components.json
b/airflow-core/src/airflow/ui/public/i18n/locales/zh-TW/components.json
index e24717385e7..c655e241acd 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
@@ -86,6 +86,11 @@
"taskGroup": "任務群組"
},
"limitedList": "+ 其他 {{count}} 項",
+ "limitedList.allItems": "所有 {{count}} 個項目:",
+ "limitedList.clickToInteract": "點擊標籤以篩選 Dags",
+ "limitedList.clickToOpenFull": "點擊 \"+{{count}} 更多\" 以開啟完整檢視",
+ "limitedList.copyPasteText": "你可以複製並貼上上方文字",
+ "limitedList.showingItems": "顯示 {{count}} 個項目",
"logs": {
"file": "檔案",
"location": "第 {{line}} 行,位於 {{name}}"
diff --git a/airflow-core/src/airflow/ui/src/components/LimitedItemsList.tsx
b/airflow-core/src/airflow/ui/src/components/LimitedItemsList.tsx
index 60f1e7ab88f..5c37909d6c7 100644
--- a/airflow-core/src/airflow/ui/src/components/LimitedItemsList.tsx
+++ b/airflow-core/src/airflow/ui/src/components/LimitedItemsList.tsx
@@ -16,11 +16,11 @@
* specific language governing permissions and limitations
* under the License.
*/
-import { Box, Text, HStack, StackSeparator } from "@chakra-ui/react";
+import { Box, Text, HStack, Stack } from "@chakra-ui/react";
import React, { type ReactNode } from "react";
import { useTranslation } from "react-i18next";
-import { Tooltip } from "./ui";
+import { Popover, Button } from "./ui";
type ListProps = {
readonly icon?: ReactNode;
@@ -41,11 +41,6 @@ export const LimitedItemsList = ({
const shouldTruncate = maxItems !== undefined && items.length > maxItems;
const displayItems = shouldTruncate ? items.slice(0, maxItems) : items;
const remainingItems = shouldTruncate ? items.slice(maxItems) : [];
- const remainingItemsList = interactive ? (
- <HStack separator={<StackSeparator />}>{remainingItems}</HStack>
- ) : (
- `More items: ${remainingItems.map((item) => (typeof item === "string" ?
item : "item")).join(", ")}`
- );
if (!items.length) {
return undefined;
@@ -69,11 +64,62 @@ export const LimitedItemsList = ({
remainingItems.length === 1 ? (
<Text as="span">{remainingItems[0]}</Text>
) : (
- <Tooltip content={remainingItemsList} interactive={interactive}>
- <Text as="span" cursor="help">
- {translate("limitedList", { count: remainingItems.length })}
- </Text>
- </Tooltip>
+ <Popover.Root lazyMount unmountOnExit>
+ <Popover.Trigger asChild>
+ <Button
+ colorPalette="brand"
+ cursor="pointer"
+ fontSize="sm"
+ minH="auto"
+ px={1}
+ py={0}
+ size="xs"
+ variant="ghost"
+ >
+ {translate("limitedList", { count: remainingItems.length })}
+ </Button>
+ </Popover.Trigger>
+ <Popover.Content maxW="400px" width="fit-content">
+ <Popover.Arrow />
+ <Popover.Body>
+ <Text fontSize="sm" fontWeight="medium" mb={3}>
+ {translate("limitedList.allItems", { count: items.length
})}
+ </Text>
+
+ <Box maxH="300px" overflowY="auto">
+ {interactive ? (
+ <HStack flexWrap="wrap" gap={2}>
+ {items.map((item, index) => (
+ <Box
+ bg="bg.subtle"
+ borderRadius="sm"
+ key={typeof item === "string" ? item : index}
+ px={2}
+ py={1}
+ >
+ {item}
+ </Box>
+ ))}
+ </HStack>
+ ) : (
+ <Stack gap={1}>
+ {items.map((item, index) => (
+ <Text fontSize="sm" key={typeof item === "string" ?
item : index} userSelect="text">
+ {item}
+ </Text>
+ ))}
+ </Stack>
+ )}
+ </Box>
+
+ <Text fontSize="xs" mt={3}>
+ {interactive
+ ? translate("limitedList.clickToInteract")
+ : translate("limitedList.copyPasteText")}
+ </Text>
+ </Popover.Body>
+ </Popover.Content>
+ </Popover.Root>
)
) : undefined}
</Box>
diff --git a/dev/i18n/check_translations_completeness.py
b/dev/i18n/check_translations_completeness.py
index d9c910e93d6..79ee1c44d7d 100755
--- a/dev/i18n/check_translations_completeness.py
+++ b/dev/i18n/check_translations_completeness.py
@@ -455,20 +455,31 @@ def print_translation_progress(console, locale_files,
missing_counts, summary):
"--add-missing",
is_flag=True,
default=False,
- help="Add missing translations for the selected language, prefixed with
'TODO: translate:'.",
+ help="Add missing translations for all languages except English, prefixed
with 'TODO: translate:'.",
)
def cli(language: str | None = None, add_missing: bool = False):
- if add_missing:
- if not language:
- raise ValueError("--language is required when passing
--add_missing")
- locale_path = LOCALES_DIR / language
- locale_path.mkdir(exist_ok=True)
locale_files = get_locale_files()
console = Console(force_terminal=True, color_system="auto")
print_locale_file_table(locale_files, console, language)
found_difference = print_file_set_differences(locale_files, console,
language)
summary, missing_counts = compare_keys(locale_files, console)
console.print("\n[bold underline]Summary of differences by language:[/bold
underline]", style="cyan")
+ if add_missing and language != "en":
+ # Loop through all languages except 'en' and add missing 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, [])},
+ )
+ 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 language:
locales = [lf.locale for lf in locale_files]
if language not in locales:
@@ -488,8 +499,6 @@ def cli(language: str | None = None, add_missing: bool =
False):
[lf for lf in locale_files if lf.locale == language],
filtered_summary, console
)
found_difference = found_difference or lang_diff
- if add_missing:
- add_missing_translations(language, filtered_summary, console)
else:
lang_diff = print_language_summary(locale_files, summary, console)
found_difference = found_difference or lang_diff