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" },


Reply via email to