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 b3dea080ed467..0b1c5d74aa9c8 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 9c7a9b71c91a5..d5e7b5c197c12 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 fa0aceedf599d..47398e4db6c1e 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 e8335d6d7e202..eed0d7784c716 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 2fd8bda7c4e9d..20f31033ee064 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 fb8ef56e93d57..d38f4bc9702c0 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 5922fcebe4fb8..424d5f675b14d 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 bfcf144af622d..4efe768e9bebf 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 91f52c3f0ccea..ded34869e9dac 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 564a2fcba5a46..e8903d951a2a8 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 364868b4afc21..e4dfd34a9f500 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 afd5ecbfe089f..83785a7112a41 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 02d7df2529d35..4dbb12e7a6cfb 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 a2aac0c0d599d..ae83855677a6c 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 c9d290d3ddcf7..69d80a7672ba9 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 a112bf6744079..e7255110e8f3b 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 e24717385e75f..c655e241acda4 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 60f1e7ab88f3e..5c37909d6c7f3 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 ? (
- }>{remainingItems}
- ) : (
- `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 ? (
{remainingItems[0]}
) : (
-
-
- {translate("limitedList", { count: remainingItems.length })}
-
-
+
+
+
+
+
+
+
+
+ {translate("limitedList.allItems", { count: items.length })}
+
+
+
+ {interactive ? (
+
+ {items.map((item, index) => (
+
+ {item}
+
+ ))}
+
+ ) : (
+
+ {items.map((item, index) => (
+
+ {item}
+
+ ))}
+
+ )}
+
+
+
+ {interactive
+ ? translate("limitedList.clickToInteract")
+ : translate("limitedList.copyPasteText")}
+
+
+
+
)
) : undefined}
diff --git a/dev/i18n/check_translations_completeness.py b/dev/i18n/check_translations_completeness.py
index 0386aaa3c4751..db03465e36e54 100755
--- a/dev/i18n/check_translations_completeness.py
+++ b/dev/i18n/check_translations_completeness.py
@@ -454,20 +454,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:
@@ -487,8 +498,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