This is an automated email from the ASF dual-hosted git repository.
jscheffl 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 b94a95a95b8 Add Catalan language to Airflow (#55013)
b94a95a95b8 is described below
commit b94a95a95b844c0a67c2280a11f348c202ebdadc
Author: ecodina <[email protected]>
AuthorDate: Mon Sep 1 22:48:19 2025 +0200
Add Catalan language to Airflow (#55013)
* add catalan translations
* change amiftrió to host
* add new terms
* add new terms
* 1st revision
* add codeowner and translation owner
* 2nd revision
* close gap
* Update .github/CODEOWNERS to add bugraoz93
---------
Co-authored-by: Bugra Ozturk <[email protected]>
---
.github/CODEOWNERS | 1 +
.github/boring-cyborg.yml | 3 +
.../airflow/ui/public/i18n/locales/ca/admin.json | 167 +++++++++++
.../airflow/ui/public/i18n/locales/ca/assets.json | 30 ++
.../airflow/ui/public/i18n/locales/ca/browse.json | 26 ++
.../airflow/ui/public/i18n/locales/ca/common.json | 315 +++++++++++++++++++++
.../ui/public/i18n/locales/ca/components.json | 136 +++++++++
.../src/airflow/ui/public/i18n/locales/ca/dag.json | 149 ++++++++++
.../airflow/ui/public/i18n/locales/ca/dags.json | 97 +++++++
.../ui/public/i18n/locales/ca/dashboard.json | 45 +++
.../airflow/ui/public/i18n/locales/ca/hitl.json | 31 ++
.../airflow/ui/public/i18n/locales/ca/tasks.json | 10 +
airflow-core/src/airflow/ui/src/i18n/config.ts | 1 +
13 files changed, 1011 insertions(+)
diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index 61238d0c1d1..5f3b5a3effa 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -39,6 +39,7 @@
# Note: Non committer engaged translators are listed in comments prevent
making file syntax invalid
# See:
https://github.com/apache/airflow/blob/main/airflow-core/src/airflow/ui/public/i18n/README.md#43-engaged-translator
airflow-core/src/airflow/ui/public/i18n/locales/ar/ @shahar1 @hussein-awala #
+ @ahmadtfarhan
+airflow-core/src/airflow/ui/public/i18n/locales/ca/ @jscheffl @bugraoz93 # +
@ecodina
airflow-core/src/airflow/ui/public/i18n/locales/de/ @jscheffl # + @TJaniF
@m1racoli
airflow-core/src/airflow/ui/public/i18n/locales/es/ @bbovenzi # + @aoelvp94
airflow-core/src/airflow/ui/public/i18n/locales/fr/ @pierrejeambrun @vincbeck
diff --git a/.github/boring-cyborg.yml b/.github/boring-cyborg.yml
index 6c2797c6b83..89f17686434 100644
--- a/.github/boring-cyborg.yml
+++ b/.github/boring-cyborg.yml
@@ -375,6 +375,9 @@ labelPRBasedOnFilePath:
translation:ar:
- airflow-core/src/airflow/ui/public/i18n/locales/ar/*
+ translation:ca:
+ - airflow-core/src/airflow/ui/public/i18n/locales/ca/*
+
translation:de:
- airflow-core/src/airflow/ui/public/i18n/locales/de/*
diff --git a/airflow-core/src/airflow/ui/public/i18n/locales/ca/admin.json
b/airflow-core/src/airflow/ui/public/i18n/locales/ca/admin.json
new file mode 100644
index 00000000000..a8a6a26c8e9
--- /dev/null
+++ b/airflow-core/src/airflow/ui/public/i18n/locales/ca/admin.json
@@ -0,0 +1,167 @@
+{
+ "columns": {
+ "description": "Descripció",
+ "key": "Clau",
+ "name": "Nom",
+ "value": "Valor"
+ },
+ "config": {
+ "columns": {
+ "section": "Secció"
+ },
+ "title": "Configuració d'Airflow"
+ },
+ "connections": {
+ "add": "Afegir connexió",
+ "columns": {
+ "connectionId": "ID de connexió",
+ "connectionType": "Tipus de connexió",
+ "host": "Host",
+ "port": "Port"
+ },
+ "connection_one": "Connexió",
+ "connection_other": "Connexions",
+ "delete": {
+ "deleteConnection_one": "Eliminar 1 connexió",
+ "deleteConnection_other": "Eliminar {{count}} connexions",
+ "firstConfirmMessage_one": "Estàs a punt d'eliminar la següent
connexió:",
+ "firstConfirmMessage_other": "Estàs a punt d'eliminar les següents
connexions:",
+ "title": "Eliminar connexió"
+ },
+ "edit": "Editar connexió",
+ "form": {
+ "connectionIdRequired": "L'ID de connexió és obligatori",
+ "connectionIdRequirement": "L'ID de connexió no pot tenir únicament
espais",
+ "connectionTypeRequired": "El tipus de connexió és obligatori",
+ "extraFields": "Camps addicionals",
+ "extraFieldsJson": "Camps addicionals JSON",
+ "helperText": "Falta el tipus de connexió? Assegureu-vos d'haver
instal·lat el paquet de proveïdors d'Airflow corresponent.",
+ "helperTextForRedactedFields": "Els camps redactats ('***') romandran
sense canvis si no es modifiquen.",
+ "selectConnectionType": "Seleccioneu el tipus de connexió",
+ "standardFields": "Camps estàndard"
+ },
+ "nothingFound": {
+ "description": "Les connexions definides a través de variables d'entorn
o gestors de secrets no es mostren aquí.",
+ "documentationLink": "Més informació a la documentació d'Airflow.",
+ "learnMore": "Aquestes es resolen en temps d'execució i no són visibles
a la interfície d'usuari.",
+ "title": "No s'ha trobat cap connexió!"
+ },
+ "searchPlaceholder": "Cercar connexions",
+ "test": "Provar connexió",
+ "testDisabled": "La funció de prova de connexió està desactivada. Si us
plau, contacteu amb un administrador per activar-la.",
+ "typeMeta": {
+ "error": "No s'ha pogut recuperar la informació del tipus de connexió",
+ "standardFields": {
+ "description": "Descripció",
+ "host": "Host",
+ "login": "Inici de sessió",
+ "password": "Contrasenya",
+ "port": "Port",
+ "url_schema": "Esquema"
+ }
+ }
+ },
+ "deleteActions": {
+ "button": "Eliminar",
+ "modal": {
+ "confirmButton": "Sí, eliminar",
+ "secondConfirmMessage": "Aquesta acció és permanent i no es pot desfer.",
+ "thirdConfirmMessage": "Estàs segur que vols continuar?"
+ },
+ "selected": "Seleccionades",
+ "tooltip": "Eliminar connexions seleccionades"
+ },
+ "formActions": {
+ "reset": "Restablir",
+ "save": "Desar"
+ },
+ "plugins": {
+ "columns": {
+ "source": "Font"
+ },
+ "importError_one": "Error d'importació d'extensió",
+ "importError_other": "Errors d'importació d'extensió",
+ "searchPlaceholder": "Cercar per fitxer"
+ },
+ "pools": {
+ "add": "Afegir pool",
+ "deferredSlotsIncluded": "Slots diferits inclosos",
+ "delete": {
+ "title": "Eliminar pool",
+ "warning": "Això eliminarà tota la metadada relacionada amb el pool i
pot afectar les tasques que utilitzin aquest pool."
+ },
+ "edit": "Editar pool",
+ "form": {
+ "checkbox": "Marqueu per incloure les tasques diferides per calcular els
slots oberts del pool",
+ "description": "Descripció",
+ "includeDeferred": "Incloure diferides",
+ "nameMaxLength": "El nom pot contenir un màxim de 256 caràcters",
+ "nameRequired": "El nom és obligatori",
+ "slots": "Slots"
+ },
+ "noPoolsFound": "No s'han trobat pools",
+ "pool_one": "Pool",
+ "pool_other": "Pools",
+ "searchPlaceholder": "Cercar pools",
+ "sort": {
+ "asc": "Nom (A-Z)",
+ "desc": "Nom (Z-A)",
+ "placeholder": "Ordenar per"
+ }
+ },
+ "providers": {
+ "columns": {
+ "packageName": "Nom del paquet",
+ "version": "Versió"
+ }
+ },
+ "variables": {
+ "add": "Afegir variable",
+ "columns": {
+ "isEncrypted": "Està xifrat"
+ },
+ "delete": {
+ "deleteVariable_one": "Eliminar 1 Variable",
+ "deleteVariable_other": "Eliminar {{count}} Variables",
+ "firstConfirmMessage_one": "Estàs a punt d'eliminar la següent
variable:",
+ "firstConfirmMessage_other": "Estàs a punt d'eliminar les següents
variables:",
+ "title": "Eliminar Variable",
+ "tooltip": "Eliminar variables seleccionades"
+ },
+ "edit": "Editar Variable",
+ "export": "Exportar",
+ "exportTooltip": "Exportar les variables seleccionades",
+ "form": {
+ "invalidJson": "JSON no vàlid",
+ "keyMaxLength": "La clau pot contenir un màxim de 250 caràcters",
+ "keyRequired": "La clau és obligatòria",
+ "valueRequired": "El valor és obligatori"
+ },
+ "import": {
+ "button": "Importar",
+ "conflictResolution": "Seleccionar resolució de conflicte de variables",
+ "errorParsingJsonFile": "Error a l'analitzar el fitxer JSON: Puja un
fitxer JSON que contingui variables (per exemple, {\"key\": \"value\", ...}).",
+ "options": {
+ "fail": {
+ "description": "Error en la importació si es detecten variables
existents.",
+ "title": "Error"
+ },
+ "overwrite": {
+ "description": "Sobreescriu la variable en cas de conflicte.",
+ "title": "Sobreescriure"
+ },
+ "skip": {
+ "description": "Ignora la importació de variables que ja
existeixen.",
+ "title": "Ignorar"
+ }
+ },
+ "title": "Importar Variables",
+ "upload": "Penjar un fitxer JSON",
+ "uploadPlaceholder": "Penjar un fitxer JSON que contingui variables (per
exemple, {\"key\": \"value\", ...})"
+ },
+ "noRowsMessage": "No s'han trobat variables",
+ "searchPlaceholder": "Cercar claus",
+ "variable_one": "Variable",
+ "variable_other": "Variables"
+ }
+}
diff --git a/airflow-core/src/airflow/ui/public/i18n/locales/ca/assets.json
b/airflow-core/src/airflow/ui/public/i18n/locales/ca/assets.json
new file mode 100644
index 00000000000..0538c04501d
--- /dev/null
+++ b/airflow-core/src/airflow/ui/public/i18n/locales/ca/assets.json
@@ -0,0 +1,30 @@
+{
+ "consumingDags": "Dags consumidors",
+ "createEvent": {
+ "button": "Crear esdeveniment",
+ "manual": {
+ "description": "Crear manualment un esdeveniment d'Asset",
+ "extra": "Camps suplementaris de l'esdeveniment d'Asset",
+ "label": "Manual"
+ },
+ "materialize": {
+ "description": "Executa el Dag en amunt d'aquest Asset",
+ "descriptionWithDag": "Executa el Dag en amunt d'aquest Asset:
{{dagName}}",
+ "label": "Materialitzar",
+ "unpauseDag": "Reactivar {{dagName}} a l'executar"
+ },
+ "success": {
+ "manualDescription": "La creació manual de l'esdeveniment d'Asset ha
estat exitosa.",
+ "manualTitle": "Esdeveniment d'Asset creat",
+ "materializeDescription": "El Dag aigües amunt {{dagId}} s'ha executat
exitosament.",
+ "materializeTitle": "Materialitzant l'Asset"
+ },
+ "title": "Crear esdeveniment d'Asset per {{name}}"
+ },
+ "group": "Grup",
+ "lastAssetEvent": "Darrer esdeveniment d'Asset",
+ "name": "Nom",
+ "producingTasks": "Tasques productores",
+ "scheduledDags": "Dags programats",
+ "searchPlaceholder": "Cercar Assets"
+}
diff --git a/airflow-core/src/airflow/ui/public/i18n/locales/ca/browse.json
b/airflow-core/src/airflow/ui/public/i18n/locales/ca/browse.json
new file mode 100644
index 00000000000..217f330c565
--- /dev/null
+++ b/airflow-core/src/airflow/ui/public/i18n/locales/ca/browse.json
@@ -0,0 +1,26 @@
+{
+ "auditLog": {
+ "actions": {
+ "collapseAllExtra": "Col·lapsar tots els camps extra json",
+ "expandAllExtra": "Expandir tots els camps extra json"
+ },
+ "columns": {
+ "event": "Esdeveniment",
+ "extra": "Extra",
+ "user": "Usuari",
+ "when": "Quan"
+ },
+ "filters": {
+ "eventType": "Tipus d'esdeveniment"
+ },
+ "title": "Registre d'auditoria"
+ },
+ "xcom": {
+ "columns": {
+ "dag": "Dag",
+ "key": "Clau",
+ "value": "Valor"
+ },
+ "title": "XCom"
+ }
+}
diff --git a/airflow-core/src/airflow/ui/public/i18n/locales/ca/common.json
b/airflow-core/src/airflow/ui/public/i18n/locales/ca/common.json
new file mode 100644
index 00000000000..cd0bcd290b7
--- /dev/null
+++ b/airflow-core/src/airflow/ui/public/i18n/locales/ca/common.json
@@ -0,0 +1,315 @@
+{
+ "admin": {
+ "Config": "Configuració",
+ "Connections": "Connexions",
+ "Plugins": "Extensions",
+ "Pools": "Pools",
+ "Providers": "Proveïdors",
+ "Variables": "Variables"
+ },
+ "allOperators": "Tots els operadors",
+ "asset_one": "Asset",
+ "asset_other": "Assets",
+ "assetEvent_one": "Esdeveniment d'Asset",
+ "assetEvent_other": "Esdeveniments d'Asset",
+ "backfill_one": "Reompliment",
+ "backfill_other": "Reompliments",
+ "browse": {
+ "auditLog": "Registre d'auditoria",
+ "requiredActions": "Accions requerides",
+ "xcoms": "XComs"
+ },
+ "collapseDetailsPanel": "Col·lapsar el panell de detalls",
+ "createdAssetEvent_one": "Esdeveniment d'Asset creat",
+ "createdAssetEvent_other": "Esdeveniments d'Asset creats",
+ "dag_one": "Dag",
+ "dag_other": "Dags",
+ "dagDetails": {
+ "catchup": "Recuperar (catchup)",
+ "dagRunTimeout": "Temps d'espera de l'execució del Dag",
+ "defaultArgs": "Arguments per defecte",
+ "description": "Descripció",
+ "documentation": "Documentació del Dag",
+ "fileLocation": "Ubicació del fitxer",
+ "hasTaskConcurrencyLimits": "Té límits de concurrència de tasques",
+ "lastExpired": "Últim caducat",
+ "lastParsed": "Últim anàlitzat",
+ "latestDagVersion": "Última versió del Dag",
+ "latestRun": "Última execució",
+ "maxActiveRuns": "Màxim d'execucions actives",
+ "maxActiveTasks": "Màxim de tasques actives",
+ "maxConsecutiveFailedDagRuns": "Màxim d'execucions fallides consecutives
del Dag",
+ "nextRun": "Propera execució",
+ "owner": "Propietari",
+ "params": "Paràmetres",
+ "schedule": "Programació",
+ "tags": "Etiquetes"
+ },
+ "dagId": "ID del Dag",
+ "dagRun": {
+ "conf": "Configuració",
+ "dagVersions": "Versió/ns del Dag",
+ "dataIntervalEnd": "Fi de l'interval de dades",
+ "dataIntervalStart": "Inici de l'interval de dades",
+ "lastSchedulingDecision": "Última decisió de programació",
+ "queuedAt": "Enviat a cua a les",
+ "runAfter": "Executar després de",
+ "runType": "Tipus d'execució",
+ "sourceAssetEvent": "Esdeveniment d'Asset d'origen",
+ "triggeredBy": "Executat per",
+ "triggeringUser": "Nom de l'usuari que executa"
+ },
+ "dagRun_one": "Execució de Dag",
+ "dagRun_other": "Execucions de Dag",
+ "dagRunId": "ID d'Execució del Dag",
+ "dagWarnings": "Advertències/errors del Dag",
+ "defaultToGraphView": "Visualització de gràfic per defecte",
+ "defaultToGridView": "Visualització de graella per defecte",
+ "direction": "Direcció",
+ "docs": {
+ "documentation": "Documentació",
+ "githubRepo": "Repositori de GitHub",
+ "restApiReference": "Referència de l'API REST"
+ },
+ "duration": "Duració",
+ "endDate": "Data de finalització",
+ "error": {
+ "back": "Tornar",
+ "defaultMessage": "S'ha produït un error inesperat",
+ "home": "Inici",
+ "notFound": "Pàgina no trobada",
+ "title": "Error"
+ },
+ "expand": {
+ "collapse": "Col·lapsar",
+ "expand": "Expandir",
+ "hotkey": "e",
+ "tooltip": "Prem {{hotkey}} per alternar l'expansió"
+ },
+ "expression": {
+ "all": "Tots",
+ "and": "I",
+ "any": "Qualsevol",
+ "or": "O"
+ },
+ "filters": {
+ "dagDisplayNamePlaceholder": "Filtrar per Dag",
+ "keyPlaceholder": "Filtrar per clau XCom",
+ "logicalDateFromPlaceholder": "Data Lògica Des de",
+ "logicalDateToPlaceholder": "Data Lògica Fins a",
+ "mapIndexPlaceholder": "Filtrar per Índex del Mapa",
+ "runAfterFromPlaceholder": "Executar Després de",
+ "runAfterToPlaceholder": "Executar Després de",
+ "runIdPlaceholder": "Filtrar per ID d'Execució",
+ "taskIdPlaceholder": "Filtrar per ID de Tasca"
+ },
+ "logicalDate": "Data Lògica",
+ "logout": "Tancar sessió",
+ "logoutConfirmation": "Està a punt de tancar sessió de l'aplicació.",
+ "mapIndex": "Índex del mapa",
+ "modal": {
+ "cancel": "Cancel·lar",
+ "confirm": "Confirmar",
+ "delete": {
+ "button": "Eliminar",
+ "confirmation": "Està segur que vol eliminar {{resourceName}}? Aquesta
acció no es pot desfer."
+ }
+ },
+ "nav": {
+ "admin": "Configuració",
+ "assets": "Assets",
+ "browse": "Navegar",
+ "dags": "Dags",
+ "docs": "Docs",
+ "home": "Inici",
+ "legacyFabViews": "Vistes obsoletes",
+ "plugins": "Extensions",
+ "security": "Seguretat"
+ },
+ "noItemsFound": "No s'ha trobat {{modelName}}",
+ "note": {
+ "add": "Afegir una nota",
+ "dagRun": "Nota de l'execució del Dag",
+ "label": "Nota",
+ "placeholder": "Afegir una nota...",
+ "taskInstance": "Nota de la instància de la tasca"
+ },
+ "pools": {
+ "deferred": "Diferit",
+ "open": "Obert",
+ "pools_one": "pool",
+ "pools_other": "pools",
+ "queued": "En cua",
+ "running": "Executant-se",
+ "scheduled": "Programat"
+ },
+ "runId": "ID de l'execució",
+ "runTypes": {
+ "asset_triggered": "Executat per Asset",
+ "backfill": "Reomplir",
+ "manual": "Manual",
+ "scheduled": "Programat"
+ },
+ "scroll": {
+ "direction": {
+ "bottom": "Avall",
+ "top": "Amunt"
+ },
+ "tooltip": "Prem {{hotkey}} per desplaçar-te cap a {{direction}}"
+ },
+ "seconds": "{{count}}s",
+ "security": {
+ "actions": "Accions",
+ "permissions": "Permisos",
+ "resources": "Recursos",
+ "roles": "Rols",
+ "users": "Usuaris"
+ },
+ "selectLanguage": "Seleccionar idioma",
+ "showDetailsPanel": "Mostrar panell de detalls",
+ "source": {
+ "hide": "Amagar origen",
+ "hotkey": "s",
+ "show": "Mostrar origen"
+ },
+ "sourceAssetEvent_one": "Esdeveniment d'Asset d'origen",
+ "sourceAssetEvent_other": "Esdeveniments d'Asset d'origen",
+ "startDate": "Data d'inici",
+ "state": "Estat",
+ "states": {
+ "deferred": "Diferit",
+ "failed": "Fallit",
+ "no_status": "Sense estat",
+ "none": "Sense estat",
+ "planned": "Planificat",
+ "queued": "En cua",
+ "removed": "Eliminat",
+ "restarting": "Reiniciant",
+ "running": "Executant-se",
+ "scheduled": "Programat",
+ "skipped": "Saltat",
+ "success": "Exitós",
+ "up_for_reschedule": "A reprogramar",
+ "up_for_retry": "A reintentar",
+ "upstream_failed": "Fallit aigües amunt"
+ },
+ "switchToDarkMode": "Canviar a mode fosc",
+ "switchToLightMode": "Canviar a mode clar",
+ "table": {
+ "completedAt": "Completat a",
+ "createdAt": "Creat a",
+ "filterByTag": "Filtrar Dags per etiqueta",
+ "filterColumns": "Filtrar columnes de la taula",
+ "filterReset_one": "Restablir filtre",
+ "filterReset_other": "Restablir filtres",
+ "from": "De",
+ "maxActiveRuns": "Màxim d'execucions actives",
+ "noTagsFound": "No s'han trobat etiquetes",
+ "tagMode": {
+ "all": "Totes",
+ "any": "Qualsevol"
+ },
+ "tagPlaceholder": "Filtrar per etiqueta",
+ "to": "A"
+ },
+ "task": {
+ "documentation": "Documentació de la tasca",
+ "lastInstance": "Última instància",
+ "operator": "Operador",
+ "triggerRule": "Regla d'execució"
+ },
+ "task_one": "Tasca",
+ "task_other": "Tasques",
+ "taskGroup": "Grup de tasques",
+ "taskId": "ID de la tasca",
+ "taskInstance": {
+ "dagVersion": "Versió del Dag",
+ "executor": "Executor",
+ "executorConfig": "Configuració de l'executor",
+ "hostname": "Nom del Host",
+ "maxTries": "Màxim de reintents",
+ "pid": "PID",
+ "pool": "Pool",
+ "poolSlots": "Slots de pool",
+ "priorityWeight": "Pes de prioritat",
+ "queue": "Cua",
+ "queuedWhen": "Enviat a cua a les",
+ "scheduledWhen": "Programat a les",
+ "triggerer": {
+ "assigned": "Triggerer assignat",
+ "class": "Classe del trigger",
+ "createdAt": "Hora de creació del trigger",
+ "id": "ID del trigger",
+ "latestHeartbeat": "Darrer batec del triggerer",
+ "title": "Informació del Triggerer"
+ },
+ "unixname": "Nom Unix"
+ },
+ "taskInstance_one": "Instància de tasca",
+ "taskInstance_other": "Instàncies de tasca",
+ "timeRange": {
+ "last12Hours": "Darreres 12 hores",
+ "last24Hours": "Darreres 24 hores",
+ "lastHour": "Darrera hora",
+ "pastWeek": "Darrera setmana"
+ },
+ "timestamp": {
+ "hide": "Amagar segell de temps",
+ "hotkey": "t",
+ "show": "Mostrar segell de temps"
+ },
+ "timezone": "Zona horària",
+ "timezoneModal": {
+ "current-timezone": "Hora actual a",
+ "placeholder": "Selecciona una zona horària",
+ "title": "Selecciona la zona horària",
+ "utc": "UTC (Temps Universal Coordinat)"
+ },
+ "toaster": {
+ "bulkDelete": {
+ "error": "Error en la sol·licitud de supressió massiva de
{{resourceName}}",
+ "success": {
+ "description": "{{count}} {{resourceName}} s'han suprimit
correctament. Claus: {{keys}}",
+ "title": "Sol·licitud de supressió massiva de {{resourceName}} enviada"
+ }
+ },
+ "create": {
+ "error": "Error en la sol·licitud de creació de {{resourceName}}",
+ "success": {
+ "description": "{{resourceName}} s'ha creat correctament.",
+ "title": "Sol·licitud de creació de {{resourceName}} enviada"
+ }
+ },
+ "delete": {
+ "error": "Error en la sol·licitud de supressió de {{resourceName}}",
+ "success": {
+ "description": "{{resourceName}} s'ha suprimit correctament.",
+ "title": "Sol·licitud de supressió de {{resourceName}} enviada"
+ }
+ },
+ "import": {
+ "error": "Error en la sol·licitud d'importació de {{resourceName}}",
+ "success": {
+ "description": "{{count}} {{resourceName}} s'han importat
correctament.",
+ "title": "Sol·licitud d'importació de {{resourceName}} enviada"
+ }
+ },
+ "update": {
+ "error": "Error en la sol·licitud d'actualització de {{resourceName}}",
+ "success": {
+ "description": "{{resourceName}} s'ha actualitzat correctament.",
+ "title": "Sol·licitud d'actualització de {{resourceName}} enviada"
+ }
+ }
+ },
+ "total": "Total {{state}}",
+ "triggered": "Executat",
+ "tryNumber": "Número d'intent",
+ "user": "Usuari",
+ "wrap": {
+ "hotkey": "w",
+ "tooltip": "Premeu {{hotkey}} per alternar l'ajust de línia",
+ "unwrap": "Desactiva l'ajust de línia",
+ "wrap": "Activa l'ajust de línia"
+ }
+}
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
new file mode 100644
index 00000000000..dc85dd9c133
--- /dev/null
+++ b/airflow-core/src/airflow/ui/public/i18n/locales/ca/components.json
@@ -0,0 +1,136 @@
+{
+ "backfill": {
+ "affected_one": "S'activarà 1 execució.",
+ "affected_other": "S'activaran {{count}} execucions.",
+ "affectedNone": "No hi ha execuccions que compleixin els criteris
seleccionats.",
+ "allRuns": "Totes les execucions",
+ "backwards": "Executar enrere",
+ "dateRange": "Interval de dates",
+ "dateRangeFrom": "Des de",
+ "dateRangeTo": "Fins",
+ "errorStartDateBeforeEndDate": "La data d'inici ha de ser anterior a la
data de finalització",
+ "maxRuns": "Màxim d'execucions actives",
+ "missingAndErroredRuns": "Execucions absents i amb errors",
+ "missingRuns": "Execucions absents",
+ "reprocessBehavior": "Comportament de reprocessament",
+ "run": "Executar reompliment",
+ "selectDescription": "Executar aquest Dag per a un interval de dates",
+ "selectLabel": "Reompliment",
+ "title": "Execució de reompliment",
+ "toaster": {
+ "success": {
+ "description": "Les tasques de reompliment s'han executat
correctament.",
+ "title": "Reompliment generat"
+ }
+ },
+ "tooltip": "El reompliment necessita una programació",
+ "unpause": "Reactivar {{dag_display_name}} a l'executar",
+ "validation": {
+ "datesRequired": "S'ha de proporcionar tant la data d'inici com la data
de finalització.",
+ "startBeforeEnd": "La data d'inici de l'interval de dates ha de ser
anterior o igual a la data de finalització de l'interval de dates."
+ }
+ },
+ "banner": {
+ "backfillInProgress": "Reompliment en curs",
+ "cancel": "Cancel·lar reompliment",
+ "pause": "Pausar reompliment",
+ "unpause": "Reactivar reompliment"
+ },
+ "clipboard": {
+ "copy": "Copiar"
+ },
+ "close": "Tancar",
+ "configForm": {
+ "advancedOptions": "Opcions avançades",
+ "configJson": "Configuració JSON",
+ "invalidJson": "Format JSON no vàlid: {{errorMessage}}"
+ },
+ "dagWarnings": {
+ "error_one": "1 Error",
+ "error_other": "{{count}} Errors",
+ "errorAndWarning": "1 Error i {{warningText}}",
+ "warning_one": "1 Advertència",
+ "warning_other": "{{count}} Advertències"
+ },
+ "durationChart": {
+ "duration": "Duració (segons)",
+ "lastDagRun_one": "Última execució del Dag",
+ "lastDagRun_other": "Últimes {{count}} execucions del Dag",
+ "lastTaskInstance_one": "Última instance de tasca",
+ "lastTaskInstance_other": "Últimes {{count}} instàncies de tasca",
+ "queuedDuration": "Durada en cua",
+ "runAfter": "Executar després",
+ "runDuration": "Durada d'execució"
+ },
+ "fileUpload": {
+ "files_one": "{{count}} fitxer",
+ "files_other": "{{count}} fitxers"
+ },
+ "flexibleForm": {
+ "placeholder": "Seleccionar valor",
+ "placeholderArray": "Escriu cada cadena en una nova línia",
+ "placeholderExamples": "Comença a escriure per veure opcions",
+ "placeholderMulti": "Selecciona un o diversos valors",
+ "validationErrorArrayNotArray": "El valor ha de ser un array.",
+ "validationErrorArrayNotNumbers": "Tots els elements de l'array han de ser
números.",
+ "validationErrorArrayNotObject": "Tots els elements de l'array han de ser
objectes.",
+ "validationErrorRequired": "Aquest camp és obligatori"
+ },
+ "graph": {
+ "directionDown": "De dalt a baix",
+ "directionLeft": "De dreta a esquerra",
+ "directionRight": "D'esquerra a dreta",
+ "directionUp": "De baix a dalt",
+ "downloadImage": "Descarregar imatge del gràfic",
+ "downloadImageError": "Error en descarregar la imatge del gràfic.",
+ "downloadImageErrorTitle": "Error en la descàrrega de la imatge",
+ "otherDagRuns": "+Altres execucions de Dag",
+ "taskCount_one": "{{count}} Tasca",
+ "taskCount_other": "{{count}} Tasques",
+ "taskGroup": "Grup de tasques"
+ },
+ "limitedList": "+{{count}} més",
+ "logs": {
+ "file": "Fitxer",
+ "location": "línia {{line}} a {{name}}"
+ },
+ "reparseDag": "Reanalitzar el Dag",
+ "sortedAscending": "ordenat de manera ascendent",
+ "sortedDescending": "ordenat de manera descendent",
+ "sortedUnsorted": "no ordenat",
+ "taskTries": "Reintents de tasca",
+ "toggleCardView": "Mostrar vista de targeta",
+ "toggleTableView": "Mostrar vista de taula",
+ "triggerDag": {
+ "button": "Executar",
+ "loading": "Carregant informació del Dag...",
+ "loadingFailed": "No s'ha pogut carregar la informació del Dag. Si us
plau, torneu-ho a intentar.",
+ "runIdHelp": "Opcional - es generarà si no es proporciona",
+ "selectDescription": "Executar una única execució d'aquest Dag",
+ "selectLabel": "Execució única",
+ "title": "Executar Dag",
+ "toaster": {
+ "success": {
+ "description": "El Dag s'ha executat correctament.",
+ "title": "Execució del Dag correcta"
+ }
+ },
+ "unpause": "Reactivar {{dagDisplayName}} a l'executar"
+ },
+ "trimText": {
+ "details": "Detalls",
+ "empty": "Buit",
+ "noContent": "No hi ha contingut disponible."
+ },
+ "versionDetails": {
+ "bundleLink": "Enllaç de la col·lecció",
+ "bundleName": "Nom de la col·lecció",
+ "bundleVersion": "Versió de la col·lecció",
+ "createdAt": "Creat a",
+ "versionId": "ID de la versió"
+ },
+ "versionSelect": {
+ "dagVersion": "Versió del Dag",
+ "versionCode": "v{{versionCode}}"
+ }
+}
diff --git a/airflow-core/src/airflow/ui/public/i18n/locales/ca/dag.json
b/airflow-core/src/airflow/ui/public/i18n/locales/ca/dag.json
new file mode 100644
index 00000000000..06e922fbd47
--- /dev/null
+++ b/airflow-core/src/airflow/ui/public/i18n/locales/ca/dag.json
@@ -0,0 +1,149 @@
+{
+ "allRuns": "Totes les execucions",
+ "blockingDeps": {
+ "dependency": "Dependència",
+ "reason": "Raó",
+ "title": "Dependències que bloquegen la programació de la tasca"
+ },
+ "calendar": {
+ "daily": "Diari",
+ "hourly": "Horari",
+ "legend": {
+ "less": "Menys",
+ "more": "Més"
+ },
+ "navigation": {
+ "nextMonth": "Proper mes",
+ "nextYear": "Proper any",
+ "previousMonth": "Mes anterior",
+ "previousYear": "Any anterior"
+ },
+ "noData": "No hi ha dades disponibles",
+ "noRuns": "No hi ha execucions",
+ "totalRuns": "Total d'execucions",
+ "week": "Setmana {{weekNumber}}",
+ "weekdays": {
+ "friday": "DV",
+ "monday": "DL",
+ "saturday": "DS",
+ "sunday": "DG",
+ "thursday": "DJ",
+ "tuesday": "DT",
+ "wednesday": "DC"
+ }
+ },
+ "code": {
+ "bundleUrl": "Url de la col·lecció",
+ "noCode": "No s'ha trobat codi",
+ "parsedAt": "Analitzat a:"
+ },
+ "extraLinks": "Enllaços addicionals",
+ "grid": {
+ "buttons": {
+ "resetToLatest": "Restablir a l'últim",
+ "toggleGroup": "Alternar grup"
+ }
+ },
+ "header": {
+ "buttons": {
+ "advanced": "Avançat",
+ "dagDocs": "Documentació del Dag"
+ }
+ },
+ "logs": {
+ "allLevels": "Tots els nivells de registre",
+ "allSources": "Totes les fonts",
+ "critical": "CRÍTIC",
+ "debug": "DEPURACIÓ",
+ "error": "ERROR",
+ "fullscreen": {
+ "button": "Pantalla completa",
+ "tooltip": "Prem {{hotkey}} per a pantalla completa"
+ },
+ "info": "INFO",
+ "noTryNumber": "Sense número d'intent",
+ "settings": "Configuració dels registres",
+ "viewInExternal": "Veure els registres a {{name}} (intent {{attempt}})",
+ "warning": "ADVERTIMENT"
+ },
+ "navigation": {
+ "navigation": "Navegació: Shift+{{arrow}}",
+ "toggleGroup": "Alternar grup: Espai"
+ },
+ "overview": {
+ "buttons": {
+ "failedRun_one": "Execució fallida",
+ "failedRun_other": "Execucions fallides",
+ "failedTask_one": "Tasca fallida",
+ "failedTask_other": "Tasques fallides",
+ "failedTaskInstance_one": "Instància de tasca fallida",
+ "failedTaskInstance_other": "Instàncies de tasca fallides"
+ },
+ "charts": {
+ "assetEvent_one": "Esdeveniment d'Asset creat",
+ "assetEvent_other": "Esdeveniments d'Asset creats"
+ },
+ "failedLogs": {
+ "title": "Registres de tasques fallides recents",
+ "viewFullLogs": "Veure els registres complets"
+ }
+ },
+ "panel": {
+ "buttons": {
+ "options": "Opcions",
+ "showGantt": "Mostrar Gantt",
+ "showGraphShortcut": "Mostrar gràfic (prem g)",
+ "showGridShortcut": "Mostrar quadrícula (prem g)"
+ },
+ "dagRuns": {
+ "label": "Nombre d'execucions de Dag"
+ },
+ "dependencies": {
+ "label": "Dependències",
+ "options": {
+ "allDagDependencies": "Totes les dependències de Dag",
+ "externalConditions": "Condicions externes",
+ "onlyTasks": "Només tasques"
+ },
+ "placeholder": "Dependències"
+ },
+ "graphDirection": {
+ "label": "Direcció del gràfic"
+ }
+ },
+ "paramsFailed": "No s'han pogut carregar els paràmetres",
+ "parse": {
+ "toaster": {
+ "error": {
+ "description": "La sol·licitud d'anàlisi del Dag ha fallat. Podria
haver-hi sol·licituds d'anàlisi pendents que encara s'han de processar.",
+ "title": "El Dag no s'ha pogut tornar a analitzar"
+ },
+ "success": {
+ "description": "El Dag s'ha de tornar a analitzar aviat.",
+ "title": "Sol·licitud de tornar a analitzar el Dag enviada amb èxit"
+ }
+ }
+ },
+ "tabs": {
+ "assetEvents": "Esdeveniments d'Asset",
+ "auditLog": "Registre d'auditoria",
+ "backfills": "Reompliments",
+ "calendar": "Calendari",
+ "code": "Codi",
+ "details": "Detalls",
+ "logs": "Registres",
+ "mappedTaskInstances_one": "Instància de tasca [{{count}}]",
+ "mappedTaskInstances_other": "Instàncies de tasca [{{count}}]",
+ "overview": "Visió general",
+ "renderedTemplates": "Plantilles renderitzades",
+ "requiredActions": "Accions requerides",
+ "runs": "Execucions",
+ "taskInstances": "Instàncies de tasca",
+ "tasks": "Tasques",
+ "xcom": "XCom"
+ },
+ "taskGroups": {
+ "collapseAll": "Col·lapsar tots els grups de tasques",
+ "expandAll": "Expandir tots els grups de tasques"
+ }
+}
diff --git a/airflow-core/src/airflow/ui/public/i18n/locales/ca/dags.json
b/airflow-core/src/airflow/ui/public/i18n/locales/ca/dags.json
new file mode 100644
index 00000000000..b0211605467
--- /dev/null
+++ b/airflow-core/src/airflow/ui/public/i18n/locales/ca/dags.json
@@ -0,0 +1,97 @@
+{
+ "assetSchedule": "Actualitzats {{count}} de {{total}} Assets",
+ "dagActions": {
+ "delete": {
+ "button": "Eliminar Dag",
+ "warning": "Això eliminarà tota la metadada relacionada amb el Dag,
incloent-hi Execucions i Tasques."
+ }
+ },
+ "favoriteDag": "Dag favorit",
+ "filters": {
+ "allRunTypes": "Tots els tipus d'execució",
+ "allStates": "Tots els estats",
+ "favorite": {
+ "all": "Tots",
+ "favorite": "Favorits",
+ "unfavorite": "No favorits"
+ },
+ "paused": {
+ "active": "Actius",
+ "all": "Tots",
+ "paused": "Pausats"
+ },
+ "runIdPatternFilter": "Cerca execucions de Dag",
+ "triggeringUserNameFilter": "Cerca per Usuari que executa"
+ },
+ "ownerLink": "Enllaç del propietari {{owner}}",
+ "runAndTaskActions": {
+ "affectedTasks": {
+ "noItemsFound": "No s'han trobat tasques.",
+ "title": "Tasques afectades: {{count}}"
+ },
+ "clear": {
+ "button": "Rellançar {{type}}",
+ "buttonTooltip": "Prem shift+c per a rellançar",
+ "error": "No s'ha pogut rellançar {{type}}",
+ "title": "Rellançar {{type}}"
+ },
+ "delete": {
+ "button": "Eliminar {{type}}",
+ "dialog": {
+ "resourceName": "{{type}} {{id}}",
+ "title": "Eliminar {{type}}",
+ "warning": "Això eliminarà tota la metadada relacionada amb el
{{type}}."
+ },
+ "error": "Error eliminant {{type}}",
+ "success": {
+ "description": "La sol·licitud d'eliminació del {{type}} ha estat
exitosa.",
+ "title": "{{type}} eliminat exitosament"
+ }
+ },
+ "markAs": {
+ "button": "Marcar {{type}} com a...",
+ "buttonTooltip": {
+ "failed": "Prem shift+f per a marcar com a fallit",
+ "success": "Prem shift+s per a marcar com a exitós"
+ },
+ "title": "Marcar {{type}} com a {{state}}"
+ },
+ "options": {
+ "downstream": "Aigües avall",
+ "existingTasks": "Rellançar tasques existents",
+ "future": "Futur",
+ "onlyFailed": "Rellançar només tasques fallides",
+ "past": "Passat",
+ "queueNew": "Afegir noves tasques a la cua",
+ "runOnLatestVersion": "Executar amb la última versió de la col·lecció",
+ "upstream": "Aigües amunt"
+ }
+ },
+ "search": {
+ "advanced": "Cerca avançada",
+ "clear": "Netejar cerca",
+ "dags": "Cercar Dags",
+ "hotkey": "+K",
+ "tasks": "Cercar Tasques"
+ },
+ "sort": {
+ "displayName": {
+ "asc": "Ordenar per nom mostrat (A-Z)",
+ "desc": "Ordenar per nom mostrat (Z-A)"
+ },
+ "lastRunStartDate": {
+ "asc": "Ordenar per data d'inici de l'última execució (Més antic-Més
recent)",
+ "desc": "Ordenar per data d'inici de l'última execució (Més recent-Més
antic)"
+ },
+ "lastRunState": {
+ "asc": "Ordenar per estat de l'última execució (A-Z)",
+ "desc": "Ordenar per estat de l'última execució (Z-A)"
+ },
+ "nextDagRun": {
+ "asc": "Ordenar per pròxima execució del Dag (Més antic-Més recent)",
+ "desc": "Ordenar per pròxima execució del Dag (Més recent-Més antic)"
+ },
+ "placeholder": "Ordenar per"
+ },
+ "unfavoriteDag": "Desmarcar el Dag com a favorit"
+}
diff --git a/airflow-core/src/airflow/ui/public/i18n/locales/ca/dashboard.json
b/airflow-core/src/airflow/ui/public/i18n/locales/ca/dashboard.json
new file mode 100644
index 00000000000..0921f642fc9
--- /dev/null
+++ b/airflow-core/src/airflow/ui/public/i18n/locales/ca/dashboard.json
@@ -0,0 +1,45 @@
+{
+ "favorite": {
+ "favoriteDags_one": "Primer {{count}} Dag favorit",
+ "favoriteDags_other": "Primers {{count}} Dags favorits",
+ "noDagRuns": "No hi ha execucions per a aquest Dag encara.",
+ "noFavoriteDags": "No hi ha favorits encara. Fes clic a la icona
d'estrella al costat d'un Dag a la llista per a afegir-lo als teus favorits."
+ },
+ "group": "Grup",
+ "health": {
+ "dagProcessor": "Processador de Dags",
+ "health": "Estat de salut",
+ "healthy": "Saludable",
+ "lastHeartbeat": "Últim batec",
+ "metaDatabase": "Base de dades meta",
+ "scheduler": "Programador",
+ "status": "Estat",
+ "triggerer": "Triggerer",
+ "unhealthy": "No saludable"
+ },
+ "history": "Historial",
+ "importErrors": {
+ "dagImportError_one": "Error d'importació de Dag",
+ "dagImportError_other": "Errors d'importació de Dag",
+ "searchByFile": "Cerca per fitxer",
+ "timestamp": "Segell de temps"
+ },
+ "managePools": "Gestionar Pools",
+ "noAssetEvents": "No s'han trobat esdeveniments d'Asset.",
+ "poolSlots": "Slots de Pool",
+ "sortBy": {
+ "newestFirst": "Més recent primer",
+ "oldestFirst": "Més antic primer"
+ },
+ "source": "Font",
+ "stats": {
+ "activeDags": "Dags actius",
+ "failedDags": "Dags fallits",
+ "queuedDags": "Dags en cua",
+ "requiredActions": "Accions requerides",
+ "runningDags": "Dags en execució",
+ "stats": "Estadístiques"
+ },
+ "uri": "Uri",
+ "welcome": "Benvingut"
+}
diff --git a/airflow-core/src/airflow/ui/public/i18n/locales/ca/hitl.json
b/airflow-core/src/airflow/ui/public/i18n/locales/ca/hitl.json
new file mode 100644
index 00000000000..ecf36d039f4
--- /dev/null
+++ b/airflow-core/src/airflow/ui/public/i18n/locales/ca/hitl.json
@@ -0,0 +1,31 @@
+{
+ "filters": {
+ "response": {
+ "all": "Totes",
+ "pending": "Pendents",
+ "received": "Revisades"
+ }
+ },
+ "requiredAction_one": "Acció requerida",
+ "requiredAction_other": "Accions requerides",
+ "requiredActionState": "Estat de l'acció requerida",
+ "response": {
+ "error": "Resposta fallida",
+ "optionsDescription": "Escull les teves opcions per a aquesta instància de
tasca",
+ "optionsLabel": "Opcions",
+ "received": "Resposta rebuda a ",
+ "respond": "Respondre",
+ "success": "Resposta de {{taskId}} exitosa",
+ "title": "Instància de tasca humana - {{taskId}}"
+ },
+ "state": {
+ "approvalReceived": "Aprovació rebuda",
+ "approvalRequired": "Aprovació requerida",
+ "choiceReceived": "Elecció rebuda",
+ "choiceRequired": "Elecció requerida",
+ "rejectionReceived": "Rebuig rebut",
+ "responseReceived": "Resposta rebuda",
+ "responseRequired": "Resposta requerida"
+ },
+ "subject": "Assumpte"
+}
diff --git a/airflow-core/src/airflow/ui/public/i18n/locales/ca/tasks.json
b/airflow-core/src/airflow/ui/public/i18n/locales/ca/tasks.json
new file mode 100644
index 00000000000..62f8e8aa2b1
--- /dev/null
+++ b/airflow-core/src/airflow/ui/public/i18n/locales/ca/tasks.json
@@ -0,0 +1,10 @@
+{
+ "mapped": "Mapejat",
+ "notMapped": "No mapejat",
+ "retries": "Reintents",
+ "searchTasks": "Cercar tasques",
+ "selectMapped": "Seleccionar mapejats",
+ "selectOperator": "Seleccionar operadors",
+ "selectRetryValues": "Seleccionar valors de reintents",
+ "selectTriggerRules": "Seleccionar regles d'execució"
+}
diff --git a/airflow-core/src/airflow/ui/src/i18n/config.ts
b/airflow-core/src/airflow/ui/src/i18n/config.ts
index 63d3bf61c4f..87e235b1b7f 100644
--- a/airflow-core/src/airflow/ui/src/i18n/config.ts
+++ b/airflow-core/src/airflow/ui/src/i18n/config.ts
@@ -24,6 +24,7 @@ import { initReactI18next } from "react-i18next";
export const supportedLanguages = [
{ code: "en", name: "English" },
{ code: "ar", name: "العربية" },
+ { code: "ca", name: "Català" },
{ code: "de", name: "Deutsch" },
{ code: "es", name: "Español" },
{ code: "fr", name: "Français" },