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