首页
/ Apache Airflow UI 荷兰语(nl)本地化指南:翻译原则、术语约定与 i18n 加载实现解析

Apache Airflow UI 荷兰语(nl)本地化指南:翻译原则、术语约定与 i18n 加载实现解析

2026-09-09 20:14:17作者:谭伦延

Airflow 的 Web UI 现已内置完整的荷兰语(Dutch, nl)翻译,并在 语言选择器 中作为官方支持语言提供(Nederlands)。本文以仓库中面向翻译维护者的 荷兰语翻译指南 为核心,系统讲解荷兰语本地化的术语选择原则、一致性校验方法,并结合前端 i18n 源码说明这些翻译文件是如何被加载、探测与回退的。读完本文,你可以独立评估、补充或修正 Airflow UI 的荷兰语翻译,并理解其背后的 i18n 架构。

一、荷兰语翻译文件的仓库位置与结构

Airflow UI 的前端源码位于 airflow-core/src/airflow/ui,其国际化资源按 语言代码/命名空间 两级目录组织,位于:

airflow-core/src/airflow/ui/public/i18n/locales/
├── en/       # 英文基准(默认语言)
├── nl/       # 荷兰语
├── zh-CN/    # 简体中文
├── zh-TW/    # 繁体中文
└── ...       # 共 21 种语言

其中 nl/ 目录内容与英文基准 en/ 逐文件对齐,共 10 个命名空间文件加 1 份指南:

文件 对应 UI 区域
common.json 全局通用词条(按钮、状态、弹窗、导航、表格)
dags.json DAG 列表页与 DAG 操作
dag.json DAG 详情页
dashboard.json 仪表盘页
assets.json Assets(数据资产)页
browse.json Browse(浏览)菜单
admin.json Admin 管理区域
components.json 通用组件
hitl.json Human-in-the-loop 相关界面
tasks.json 任务相关界面
README.md 荷兰语翻译指南(本文核心)

这份 README 正是翻译维护者的"准入文档":它规定荷兰语翻译应遵守的术语口径,任何新翻译都必须先对照它再落笔。

二、荷兰语翻译的四大核心原则

1. Airflow 专有术语一律保留英文

DagXComAsset 等是 Airflow 生态中被广泛认可的技术对象,翻译后反而会破坏用户的既有认知,因此指南明确要求保留英文原词,并且统一拼写为 Dag(而非全大写的 DAG),以与 Airflow 自身的命名约定保持一致。

这在翻译文件中可以找到大量印证:

  • "dag_one": "Dag""dag_other": "Dags"common.json
  • "asset_one": "Asset""asset_other": "Assets"common.json
  • 导航栏中的 "dags": "Dags""assets": "Assets"common.json

2. 对用户使用非正式称呼 "je/jouw"

指南规定荷兰语翻译统一采用非正式的 "je/jouw"(你/你的) 语域,而不是正式的 "u"。这一选择顺应了荷兰语技术软件本地化的普遍趋势,让 UI 更现代、更亲切。例如 common.json 中的登出确认语:

"logoutConfirmation": "Je staat op het punt om uit te loggen uit de applicatie."

以及权限拒绝提示(common.json):

"errors": {
  "forbidden": {
    "description": "Je hebt geen permissies om deze actie uit te voeren.",
    "title": "Toegang geweigerd"
  }
}

3. 翻译一致性:Task 固定译为 taak

基于维护者共识,Task所有位置统一翻译为 taak(句首时首字母大写为 Taak),而不是像其他技术对象那样保留英文。从 common.json 可以看到复数形式也保持一致:

"task_one": "Taak",
"task_other": "Taken"

以此派生出的复合词同样遵守该约定:Taakgroep(Task Group)、Taakinstantie(Task Instance)、Taak documentatie(Task documentation)等。

4. 既定 UI 映射表

指南给出了以下已经定案、不可随意更改的界面词映射:

英文 荷兰语
Schedule Planning
Queue Wachtrij
State Status
Run Run(数据工程领域的标准术语,保留英文)

这些映射在实际翻译文件中均有对应实现,例如:

  • DAG 详情页的调度字段 "schedule": "Planning"common.json
  • 任务实例的队列字段 "queue": "Wachtrij"common.json
  • 状态总称 "state": "Status"common.json
  • Run 相关的 "dagRun_one": "Dag Run""runId": "Run ID"common.json

三、一致性校验:以 common.json 为唯一基准

指南的 Consistency 一节给出了一条硬性规则:

所有新翻译都必须对照 common.json 进行校验,确保按钮(如 OpslaanAnnulerenVerwijderen)与状态(如 LopendMisluktSuccesvol)使用标准的荷兰语术语。

也就是说,common.json 是整个荷兰语本地化的术语基准库。任何新词条若涉及按钮或状态,都应先查基准库,而不是凭个人偏好新造译法。从源码中可以提取出当前基准库中的核心标准译法:

按钮与操作(common.json):

"modal": {
  "add": "Toevoegen",
  "cancel": "Annuleer",
  "confirm": "Bevestig",
  "delete": { "button": "Verwijder", "...": "..." },
  "save": "Opslaan"
}

值得注意的细节:指南中举例按钮标准译法为 Annuleren,而当前 common.jsonmodal.cancel 的实际值为 Annuleer。这正是"必须对照基准库核实"这条规则存在的意义——维护文档与词条文件之间偶有细微出入,翻译者应以仓库中实际生效的 JSON 为准。

任务状态全集(common.json):

"states": {
  "awaiting_input": "Wachtend op invoer",
  "deferred": "Uitgesteld",
  "failed": "Mislukt",
  "no_status": "Geen status",
  "none": "Geen status",
  "open": "Open",
  "planned": "Gepland",
  "queued": "Wachtend",
  "removed": "Verwijderd",
  "restarting": "Herstartend",
  "running": "Lopend",
  "scheduled": "Gepland",
  "skipped": "Overgeslagen",
  "success": "Succesvol",
  "up_for_reschedule": "Wachtend op herplanning",
  "up_for_retry": "Wachtend op een nieuwe poging",
  "upstream_failed": "Upstream mislukt"
}

这套状态译法是所有页面(DAG 列表、Dag Run 详情、任务实例详情)共用的,新增翻译时状态类词条必须与之一致。

四、源码视角:荷兰语翻译是如何被加载的

理解了"翻译什么",再看"翻译怎么生效"。Airflow UI 使用 i18next + react-i18next 构建国际化层,核心配置在 airflow-core/src/airflow/ui/src/i18n/config.ts

  • 命名空间(namespaces)commondashboarddagsadminbrowseassetscomponentshitl,与 nl/ 目录下的 JSON 文件一一对应(dag.jsontasks.json 等按需加载);
  • 默认语言与回退defaultLanguage = "en",即某个键在荷兰语文件中缺失时自动回退英文,避免 UI 出现空白;
  • 加载路径${basePath}/static/i18n/locales/{{lng}}/{{ns}}.json?v={{version}},翻译文件作为静态资源随 UI 分发,并带版本号参数做缓存失效(cache busting),防止部署新版本后浏览器/CDN 继续使用旧翻译;
  • 语言探测顺序localStoragenavigatorhtmlTag,用户在设置中手动选择的语言会持久化到 localStorage;
  • 区域码归约convertDetectedLanguage 会把 nl-BE 之类的浏览器区域码归约为受支持的 nl,同时保证 zh-CN/zh-TW 这类需要保留区域后缀的语言不被误折叠。

这套机制意味着:只要 nl/ 下的 JSON 词条完整、键名与英文基准 en/ 对齐,荷兰语 UI 就能自动生效,无需改动任何组件代码。对应的语言探测逻辑还有专门的单元测试覆盖,见 airflow-core/src/airflow/ui/src/i18n/config.test.ts

此外,日期、时间等会随语言切换的本地化内容,由 registerDayjsLocaleSync 与 i18next 的 languageChanged 事件联动同步(config.ts),保证切换到荷兰语后时间显示也符合荷兰语习惯。

五、从实际词条看荷兰语本地化的覆盖范围

荷兰语翻译并非只覆盖少量高频词,而是深入到了 Airflow UI 的各个业务模块:

DAG 列表与操作(dags.json 覆盖了排序、筛选、收藏、删除等交互,例如:

"dagActions": {
  "delete": {
    "button": "Verwijder Dag",
    "warning": "Dit zal alle metadata gerelateerd aan de Dag verwijderen, inclusief Runs en Tasks."
  }
},
"filters": {
  "paused": { "active": "Actief", "all": "Alles", "paused": "Gepauzeerd" }
},
"sort": {
  "displayName": { "asc": "Sorteer op weergavenaam (A-Z)", "desc": "Sorteer op weergavenaam (Z-A)" }
}

仪表盘(dashboard.json 覆盖健康检查、统计卡片、截止期限等,例如:

"health": {
  "dagProcessor": "Dag Processor",
  "metaDatabase": "MetaDatabase",
  "scheduler": "Scheduler",
  "triggerer": "Triggerer",
  "healthy": "OK",
  "unhealthy": "Fout"
},
"stats": {
  "activeDags": "Actieve Dags",
  "failedDags": "Mislukte Dags",
  "runningDags": "Lopende Dags",
  "queuedDags": "Dags in de wachtrij"
}

复数与插值机制:荷兰语词条大量使用 i18next 的复数形式(_one/_other)与插值变量,例如 "pendingDagRun_one": "{{count}} Wachtende Dag Run""pendingDagRun_other": "{{count}} Wachtende Dag Runs"common.json)。新增翻译时必须保留这些键名后缀与 {{变量}} 占位符,否则页面会显示原始键名或丢失动态数据。

六、给翻译维护者的实操建议

结合指南与源码,梳理一份可执行的荷兰语翻译工作流:

  1. 以英文基准为底稿:对照 en/ 目录下同名 JSON,确保键名完全一致、无遗漏键;
  2. 先读指南再动笔:通读 nl/README.md,遵守四大原则——专有名词(Dag/XCom/Asset/Run)保留英文、非正式 je/jouw 语域、Task 统一为 taak、既定映射表不可推翻;
  3. 以 common.json 为准绳:涉及按钮与状态时,从 common.json 复用标准译法,保证跨页面一致;
  4. 保留结构占位符:不破坏 {{count}}{{resourceName}} 等插值变量,不省略 _one/_other 复数键;
  5. 留意潜在笔误:仓库现有词条中仍存在个别拼写问题,例如 common.json"Taaakgroep documentatie"(多了一个 a),这类问题可以作为贡献者着手修正的低风险切入点;
  6. 验证加载路径:翻译属于静态资源,通过 static/i18n/locales/nl/{{ns}}.json 按版本号分发,改动后需配合版本刷新观察 UI 效果。

总结

Airflow UI 的荷兰语本地化由"指南 + 词条文件 + i18n 运行时"三层构成:nl/README.md 定口径,nl/ 下 10 个 JSON 文件承载词条,i18n/config.ts 负责按语言探测、按命名空间加载并以英文兜底。对开发者而言,理解了这套结构与术语约定,无论是为荷兰语贡献翻译、审查 PR,还是借鉴这套"语言目录 + 翻译指南"模式搭建其他语言的本地化流程,都能直接上手、有据可依。

登录后查看全文
热门项目推荐
相关项目推荐

项目优选

收起
kernelkernel
deepin linux kernel
C
33
18
ops-transformerops-transformer
本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。
C++
1.14 K
2.76 K
pytorchpytorch
作为 Ascend for PyTorch 社区的核心组件,TorchNPU 是昇腾专为 PyTorch 打造的深度学习适配插件,使 PyTorch 框架能够直接调用昇腾 NPU,为开发者提供昇腾 AI 处理器的超强算力。
Python
860
1.35 K
docsdocs
暂无描述
Markdown
899
5.83 K
ops-nnops-nn
本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。
C++
925
1.85 K
jiuwenswarmjiuwenswarm
JiuwenSwarm 是一款基于openJiuwen开发的智能AI Agent,它能够将大语言模型的强大能力,通过你日常使用的各类通讯应用,直接延伸至你的指尖。
Python
3.84 K
1.02 K
kernelkernel
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
533
601
cann-learning-hubcann-learning-hub
CANN 学习中心仓,支持在线互动运行、边学边练,提供教程、示例与优化方案,一站式助力昇腾开发者快速上手。
Jupyter Notebook
1.03 K
525
ops-mathops-math
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
1.37 K
1.46 K
AscendNPU-IRAscendNPU-IR
AscendNPU-IR是基于MLIR(Multi-Level Intermediate Representation)构建的,面向昇腾亲和算子编译时使用的中间表示,提供昇腾完备表达能力,通过编译优化提升昇腾AI处理器计算效率,支持通过生态框架使能昇腾AI处理器与深度调优
C++
548
395