Apache Airflow 印地语(hi)UI 翻译规范:术语表、风格原则与源码实现对照
【免费下载链接】airflowApache Airflow - A platform to programmatically author, schedule, and monitor workflows项目地址: https://gitcode.com/GitHub_Trending/ai/airflow
本文以 Airflow 仓库中印地语(Hindi,hi)翻译 Agent Skill 规范文件 hi.md 为主体,完整解读其中的语调风格、保留英语术语清单、20 项推荐术语对照表和五条翻译原则,并结合 UI 国际化配置 config.ts、breeze 翻译校验工具 ui_commands.py 及已合并的印地语翻译文件(airflow-core/src/airflow/ui/public/i18n/locales/hi/)进行源码级佐证。读完后你将掌握:Airflow UI 国际化体系中文案术语规范如何制定、如何落地到 JSON 命名空间文件、以及如何用 breeze 命令验证翻译完整性。
一、定位:hi 语言规范在 Airflow 翻译体系中的角色
Airflow 的 UI 翻译工作由 SKILL.md 定义的翻译技能统一驱动。该文件规定了翻译任务的两种路径——新增语言(Adding a Translation)与更新已有语言(Updating an Existing Translation)——并给出全局翻译规则:哪些术语必须保留英文(如Airflow、Dag、XCom、Provider、REST API、JSON、ID、PID、UTC、Schema)、i18next 的{{variable}}插值占位符不可翻译但可调整顺序、复数后缀(_one、_other及语言需要的_zero/_two/_few/_many)、热键值不翻译等。
在 SKILL.md 的“Locale-Specific Guidelines(语言特定规范)”表格中,hi指向本文章解读的文件 locales/hi.md。这类语言特定规范包含三个部分:术语表(glossary)、语调规则(tone rules)与格式约定(formatting conventions)。SKILL.md 明确规定优先级规则:“若语言特定规范与本文档的全局规则冲突,遵循语言特定规范。”因此 hi.md 中的术语表和风格要求是印地语翻译的最高依据。
从源码结构看,hi已是正式受支持的语言:
- 前端语言注册表 config.ts 的
supportedLanguages数组中包含{ code: "hi", name: "हिन्दी" }; - 该文件的
convertDetectedLanguage函数(config.ts)会把浏览器区域码(如hi-IN)归一化到基础语言码hi,保证印度用户访问时 UI 正确加载印地语文案; - 翻译文件位于
airflow-core/src/airflow/ui/public/i18n/locales/hi/,包含 10 个与英文 locale 对应的命名空间 JSON:admin.json、assets.json、browse.json、common.json、components.json、dag.json、dags.json、dashboard.json、hitl.json、tasks.json。
二、语调与风格(Tone and Style)
hi.md 对印地语文案的风格规定了三条硬性要求:
- 使用正式、尊敬的语言(formal and respectful language);
- 以 “आप” 称呼用户——印地语有正式的“आप”与随意的“तुम/तू”之分,UI 面向所有专业用户,必须使用正式称谓;
- 句子结构清晰简洁,优先清晰易懂的短句。
这一风格在已合并的翻译文件中可以印证,例如 hi/tasks.json 中"selectOperator": "ऑपरेटर चुनें"(请选择 Operator)、"searchTasks": "टैस्क्स खोजें"(搜索任务)均为祈使式正式表达。同目录下的 hi/README.md 也用印地语复述了这一决策:“उपयोगकर्ता को 'आप' कहकर संबोधित किया गया है और विनम्र भाषा का प्रयोग किया गया है”(用户以“आप”称呼,并使用恭敬的语言)。
三、必须保留英语的术语(Keep in English)
hi.md 明确列出三类在印地语翻译中不得翻译的术语:
| 术语 | 保留原因 |
|---|---|
| XCom | Airflow 特有机制名(跨任务通信),翻译会造成歧义 |
| ID | 通用技术缩写 |
| Log Levels(CRITICAL、ERROR、WARNING、INFO、DEBUG) | 日志级别在日志输出中以英文原样出现,翻译会与实际日志脱节 |
这与 SKILL.md 的全局“保留英文术语”规则一致(全局表还包括Airflow、Dag、Provider、REST API、JSON、PID、UTC、Schema)。值得注意的是,Airflow 的书写惯例是Dag而非DAG——这一约定在 dag.json 等文件中以音译डैग体现。
四、推荐术语表(Preferred Translations)全解
hi.md 的核心资产是一张 20 行的“英文术语 → 印地语”对照表。它是未来所有印地语翻译必须复用的既定术语。完整继承如下:
| 英文术语 | 印地语 |
|---|---|
| Dag | डैग |
| Dag Run | डैग रन |
| Task | कार्य |
| Task Instance | टास्क इंस्टेंस |
| Asset | एसेट |
| Asset Event | एसेट इवेंट |
| Configuration | विन्यास |
| Connections | कनेक्शन |
| Operator | ऑपरेटर |
| Variable | वेरिएबल |
| Plugins | प्लगइन |
| Pools | पूल |
| Provider | प्रोवाइडर |
| Trigger | ट्रिगर |
| Backfill | बैकफ़िल |
| Bundle | बंडल |
| Scheduled | निर्धारित |
| Map Index | मैप इंडेक्स |
| Try Number | प्रयास संख्या |
| Key | कुंजी |
| Home | मुख्य पृष्ठ |
这些术语并非随意选定,而是遵循“纯印地语 vs 音译”的权衡,hi/README.md 对每项给出了决策理由:
- 音译(transliteration):
Dag→डैग、Task→टास्क、Asset→एसेट(避免与“数据资产/财产”歧义)、Trigger→ट्रिगर、Variable→वेरिएबल——这些都是 Airflow 特有概念或行业通用技术词,音译对印地语读者更直观; - 纯印地语词:
Configuration→विन्यास(而非音译“कॉन्फ़िगरेशन”)、Home→मुख्य पृष्ठ、Scheduled→निर्धारित、Try Number→प्रयास संख्या——这些是常见 UI 词汇,用纯印地语词表达更专业; - 细节取舍:
Key用कुंजी而非की(后者是占有格介词,会造成混淆);Asset Event用एसेट इवेंट而非“घटना”(“事件”),因为技术语境下 event 指系统事件;Backfill、Bundle、Map Index保持音译。
一个值得注意的一致性事实:hi.md 术语表中Task的推荐译法为कार्य,而已合并的翻译文件实际采用的是音译टास्क(见 hi/README.md 中 “Task→टास्क” 的说明,以及 hi/common.json 中的maxActiveTasks: "अधिकतम सक्रिय टास्क्स")。SKILL.md 明确规定“若某术语已有既定译法,必须原样复用”,因此实际 JSON 文件是运行时一致性的最终来源;维护翻译时应以 locale 目录下既有 JSON 为准。
五、五条翻译原则(Translation Principles)
hi.md 给出的五条原则构成了印地语翻译的决策框架:
- 正式的 UI 语言(Formal UI language):保持专业软件所需的礼貌与清晰;
- 常见 UI 词优先纯印地语(Pure Hindi for common UI words):在清晰度足够时用如
विन्यास(配置)这类纯印地语词,而非音译; - 技术概念用音译(Transliteration for technical concepts):Airflow 特有术语一律音译,如
डैग、टास्क; - 避免歧义(Avoid ambiguity):若直译可能让用户困惑,优先选择音译。例如
Asset直译为“资产/财产”会与财务含义混淆,故取एसेट; - 语境感知(Context awareness):翻译要匹配技术含义而非词典字面义。
原则 2 与 4 看似矛盾(一个要求纯印地语、一个要求音译),实际分工清晰:判断标准是词汇的“领域属性”——通用界面词(配置、首页、调度)走原则 2,Airflow 领域词(Dag、Asset、Backfill、Trigger)走原则 3/4。hi/common.json 开头几行即体现该分工:"Config": "विन्यास"(纯印地语)与"Connections": "कनेक्शन"、"Providers": "प्रोवाइडर"(音译)并存于同一 admin 命名空间。
六、状态词的特殊约定:states.none与states.no_status
hi.md 的 Notes 一节规定了两组极易混淆的 UI 状态文案:
states.none→“कुछ नहीं”(意为“什么都没有”)states.no_status→“कोई स्थिति नहीं”(意为“没有状态”)
这一区分在已合并的翻译文件中被精确落实:hi/common.json 中:
"no_status": "कोई स्थिति नहीं", "none": "कुछ नहीं"两者的语义差异在于:none表示“空值/无内容”,而no_status表示“实体存在但未设置状态”。若两者都译成“没有”,用户将无法区分任务实例的这两种情形。该约定同样被 hi/README.md 记录为“特殊注释”。
七、复数规则与源码实现:hi 只需_one/_other
Airflow UI 使用 i18next 处理复数,SKILL.md 要求为每种语言提供其所需的复数后缀集合。印地语的复数规则在后端校验工具 ui_commands.py 的PLURAL_SUFFIXES字典中定义:
MOST_COMMON_PLURAL_SUFFIXES = ["_one", "_other"] PLURAL_SUFFIXES = { "ar": ["_zero", "_one", "_two", "_few", "_many", "_other"], # 阿拉伯语 6 种 "pl": ["_one", "_few", "_many", "_other"], # 波兰语 4 种 ... "hi": MOST_COMMON_PLURAL_SUFFIXES, # 印地语:只需 _one 与 _other ... }从源码结构看,PLURAL_SUFFIXES决定 breeze 校验工具如何计算每个 locale 的“必需键集”——缺少任何一个后缀的键都会被判为 missing。印地语只需两种复数形式,这直接反映在 hi/common.json 的实际键名中:
"asset_one": "एसेट", "asset_other": "एसेट्स", "backfill_one": "बैकफ़िल", "backfill_other": "बैकफ़िल्स", "dag_one": "डैग", "dag_other": "डैग्स", "assetEvent_one": "एसेट इवेंट", "assetEvent_other": "एसेट इवेंट्स"可以看到单数/复数通过词尾-s音译变化区分(如एसेट/एसेट्स),符合 i18next 的{{count}}插值机制。
八、翻译文件的结构、加载链路与完整性校验
文件结构。所有翻译文件都是 JSON,位于airflow-core/src/airflow/ui/public/i18n/locales/<locale>/,每个 locale 目录包含与英文默认 locale(en/)镜像的命名空间文件。前端初始化时(config.ts)通过 i18next-http-backend 按${basePath}/static/i18n/locales/{{lng}}/{{ns}}.json?v=<version>的路径拉取对应语言的 JSON,并以 Airflow 版本号做缓存破坏(cache buster),保证新键随版本发布即时生效。
校验流程。按照 SKILL.md 的工作流,完成或修改印地语翻译后应执行:
# 1. 检查完整性(期望输出:0 missing、0 TODO、0 unused、100% coverage) breeze ui check-translation-completeness --language hi # 2. 如有缺失键,生成带 "TODO: translate:" 桩的脚手架 breeze ui check-translation-completeness --language hi --add-missing # 3. 如有冗余键(英文 locale 已删除的键、或多余的复数后缀),移除 breeze ui check-translation-completeness --language hi --remove-unused # 4. 运行 pre-commit 钩子修复格式、许可证与 lint 问题 prek run --from-ref main --hook-stage pre-commit其中--add-missing生成的桩形如"allRuns": "TODO: translate: All Runs",翻译时需连同前缀一并替换为目标文案;--remove-unused移除的是“英文 locale 中不存在”或“该语言不需要的复数后缀”键——对hi而言,若出现_few之类的键即属冗余。
当前完成度。hi/README.md 记录该 locale 的翻译状态为:100% 完整(638/638 条翻译)、9 个 JSON 文件、所有 linter 检查通过、无缺失键——hi.md 规范正是“从既有印地语 locale 指南中提炼而来”,用于保障未来翻译迭代的一致性。
九、小结:维护印地语翻译的三条实操依据
- 术语以既有 JSON 为准:翻译新键时先读
airflow-core/src/airflow/ui/public/i18n/locales/hi/下已用术语并原样复用,其次参照 hi.md 术语表,二者冲突时以 locale 实际文件为准; - 风格三不变:正式语气、以 “आप” 称呼用户、句子简短清晰;
XCom、ID、日志级别永不翻译; - 交付前跑校验:
breeze ui check-translation-completeness --language hi必须达到 0 missing / 0 TODO / 0 unused / 100% coverage,并用prek run --from-ref main --hook-stage pre-commit收尾。
掌握以上内容,即可在 Airflow 仓库中独立完成印地语 UI 翻译的新增键、修订与一致性维护工作。
【免费下载链接】airflowApache Airflow - A platform to programmatically author, schedule, and monitor workflows项目地址: https://gitcode.com/GitHub_Trending/ai/airflow
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考