diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 7354aedfbb1df..012fdef7da1d7 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -36,6 +36,7 @@ /airflow-core/src/airflow/ui/ @bbovenzi @pierrejeambrun @ryanahamilton @jscheffl @shubhamraj-git # Translations +airflow-core/src/airflow/ui/src/i18n/locales/de/ @jscheffl airflow-core/src/airflow/ui/src/i18n/locales/zh_TW/ @Lee-W # Security/Permissions diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 193dce32fdffb..6b9109a84adf5 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -343,7 +343,16 @@ repos: The word(s) should be in lowercase." && exec codespell "$@"' -- language: python types: [text] - exclude: material-icons\.css$|^images/.*$|^RELEASE_NOTES\.txt$|^.*package-lock\.json$|^.*/kinglear\.txt$|^.*pnpm-lock\.yaml$|.*/dist/.* + exclude: > + (?x) + material-icons\.css$| + ^images/.*$| + ^RELEASE_NOTES\.txt$| + ^.*package-lock\.json$| + ^.*/kinglear\.txt$| + ^.*pnpm-lock\.yaml$| + .*/dist/.*| + ^airflow-core/src/airflow/ui/src/i18n/locales/de/ args: - --ignore-words=docs/spelling_wordlist.txt - --skip=providers/.*/src/airflow/providers/*/*.rst,providers/*/docs/changelog.rst,docs/*/commits.rst,providers/*/docs/commits.rst,providers/*/*/docs/commits.rst,docs/apache-airflow/tutorial/pipeline_example.csv,*.min.js,*.lock,INTHEWILD.md,*.svg diff --git a/airflow-core/src/airflow/ui/src/i18n/config.ts b/airflow-core/src/airflow/ui/src/i18n/config.ts index 09787d34d1373..690d64fdb366f 100644 --- a/airflow-core/src/airflow/ui/src/i18n/config.ts +++ b/airflow-core/src/airflow/ui/src/i18n/config.ts @@ -20,6 +20,8 @@ import i18n from "i18next"; import LanguageDetector from "i18next-browser-languagedetector"; import { initReactI18next } from "react-i18next"; +import deCommon from "./locales/de/common.json"; +import deDashboard from "./locales/de/dashboard.json"; import enCommon from "./locales/en/common.json"; import enDashboard from "./locales/en/dashboard.json"; import zhTWCommon from "./locales/zh_TW/common.json"; @@ -29,6 +31,7 @@ import zhTWDashboard from "./locales/zh_TW/dashboard.json"; // import Backend from 'i18next-http-backend'; export const supportedLanguages = [ + { code: "de", name: "Deutsch" }, { code: "en", name: "English" }, { code: "zh_TW", name: "繁體中文" }, ] as const; @@ -37,6 +40,10 @@ export const defaultLanguage = "en"; export const namespaces = ["common", "dashboard"] as const; const resources = { + de: { + common: deCommon, + dashboard: deDashboard, + }, en: { common: enCommon, dashboard: enDashboard, diff --git a/airflow-core/src/airflow/ui/src/i18n/locales/de/common.json b/airflow-core/src/airflow/ui/src/i18n/locales/de/common.json new file mode 100644 index 0000000000000..a60ae023a3e1d --- /dev/null +++ b/airflow-core/src/airflow/ui/src/i18n/locales/de/common.json @@ -0,0 +1,78 @@ +{ + "defaultToGraphView": "Graph-Ansicht als Standard", + "defaultToGridView": "Gitter-Ansicht als Standard", + "logout": "Abmelden", + "switchToDarkMode": "Zum Dunkelmodus wechseln", + "switchToLightMode": "Zum Hellmodus wechseln", + "timezone": "Zeitzone", + "user": "Benutzer", + "language": { + "chinese": "Traditionelles Chinesisch", + "english": "Englisch", + "german": "Deutsch", + "select": "Sprache wählen" + }, + "nav": { + "home": "Start", + "assets": "Datensets (Assets)", + "browse": "Browsen", + "admin": "Verwaltung", + "docs": "Dokumentation", + "plugins": "Plug-ins" + }, + "browse": { + "auditLog": "Prüf-Log", + "xcoms": "Task Kommunikation (XComs)" + }, + "admin": { + "Variables": "Variablen", + "Pools": "Pools", + "Providers": "Providers", + "Plugins": "Plug-ins", + "Connections": "Verbindungen", + "Config": "Konfiguration" + }, + "timeRange": { + "duration": "Laufzeit", + "lastHour": "Letzte Stunde", + "last12Hours": "Letzte 12 Stunden", + "last24Hours": "Letzte 24 Stunden", + "pastWeek": "Letzte Woche" + }, + "docs": { + "documentation": "Dokumentation", + "githubRepo": "GitHub Ablage", + "restApiReference": "REST API Referenz" + }, + "states": { + "queued": "Wartend", + "running": "Laufend", + "success": "Erfolgreich", + "failed": "Fehlgeschlagen", + "skipped": "Übersprungen", + "removed": "Entfernt", + "scheduled": "Geplant", + "restarting": "Im Neustart", + "up_for_retry": "Wartet auf neuen Versuch", + "up_for_reschedule": "Wartet auf Neuplanung", + "upstream_failed": "Vorgelagerte fehlgeschlagen", + "deferred": "Delegiert", + "no_status": "Kein Status" + }, + "dagRun_one": "Dag Lauf", + "dagRun_other": "Dag Läufe", + "taskInstance_one": "Task Instanz", + "taskInstance_other": "Task Instanzen", + "assetEvent_one": "Ereignis zu Datensets (Asset)", + "assetEvent_other": "Ereignisse zu Datensets (Asset)", + "triggered": "Angestoßen", + "pools": { + "open": "Frei", + "running": "Laufend", + "queued": "Wartend", + "scheduled": "Geplant", + "deferred": "Delegiert", + "pools_one": "Pool", + "pools_other": "Pools" + } +} diff --git a/airflow-core/src/airflow/ui/src/i18n/locales/de/dashboard.json b/airflow-core/src/airflow/ui/src/i18n/locales/de/dashboard.json new file mode 100644 index 0000000000000..53e27af44aad4 --- /dev/null +++ b/airflow-core/src/airflow/ui/src/i18n/locales/de/dashboard.json @@ -0,0 +1,38 @@ +{ + "welcome": "Willkommen", + "stats": { + "stats": "Statistiken", + "failedDags": "Fehlgeschlagene Dags", + "runningDags": "Laufende Dags", + "activeDags": "Aktive Dags", + "queuedDags": "Dags in Warteschlange" + }, + "health": { + "health": "System-Gesundheit", + "metaDatabase": "Meta-Datenbank", + "scheduler": "Planer", + "triggerer": "Triggerer", + "dagProcessor": "Dag Prozessor", + "status": "Status", + "lastHeartbeat": "Letztes Lebenszeichen", + "healthy": "Gut", + "unhealthy": "Nicht in Ordnung" + }, + "importErrors": { + "searchByFile": "Nach Datei suchen", + "dagImportError_one": "Fehler beim Laden des Dags", + "dagImportError_other": "Fehler beim Laden der Dags", + "timestamp": "Zeitstempel" + }, + "poolSlots": "Pool Belegung", + "managePools": "Pools verwalten", + "history": "Historie", + "sortBy": { + "newestFirst": "Neueste zuerst", + "oldestFirst": "Älteste zuerst" + }, + "source": "Quellcode", + "group": "Gruppe", + "uri": "Uri", + "noAssetEvents": "Keine Ereignisse zu Datensets vorliegend." +}