Freerouting 国际化翻译指南:LLM 驱动的 i18n 流水线、术语词表与多语言维护实践
发布时间:2026/10/15 5:55:36 锦皓数字建站

硬件开发桌面应用【免费下载链接】freeroutingAdvanced PCB auto-router项目地址https://gitcode.com/gh_mirrors/fr/freerouting点击查看免费下载本文是 Freerouting 开源自动布线器的官方翻译工作流指南完整讲解其基于 LLMGemini的国际化翻译流水线为什么*_{locale}.properties是构建产物而非修改对象、如何通过编辑术语词表glossary修正错误翻译、如何维护英文源术语标准以及维护者如何执行整语言重译。读完本文你将能够以合规的方式提交翻译修复、运行上下文提取/增量翻译/校验命令并理解底层源码scripts/i18n/ 目录与 i18n 测试用例的实现原理。一、翻译工作流概览为什么.properties是构建产物Freerouting 的 UI 字符串以 Java.properties资源包的形式存放在src/main/resources/app/freerouting/下包括顶层公共包Common_*.properties、Freerouting_*.properties、drc/AirLine_*.properties以及gui/下按菜单、窗口、交互状态划分的 40 余个 bundle如gui/menus/BoardMenuFile_*.properties、gui/windows/routing/WindowNetClasses_*.properties。这些字符串并非手工翻译维护而是由 scripts/i18n/ 下的 Python 流水线调用 LLM 从英文源生成英文源字符串*_en.properties由开发者维护文案审校、新增键、占位符修复各语言 locale 文件*_{locale}.properties是流水线构建输出不是修词的首选位置。流水线的代码布局见 scripts/i18n/README.md按三层组织脚本职责extract-context.py第 1 层扫描英文.properties与 Java 源码生成context/元数据translate.py第 2 层基于上下文增强提示词的 LLM 批量/增量翻译validate.py第 3 层键覆盖parity、占位符、HTML、转义校验prune-unused-keys.py清理所有 locale 中已不被 Java 引用的键properties_io.py/context_store.py/java_scanner.py/llm_client.py/prompt_builder.py/i18n_output.py共享的.properties读写、上下文存取、TextManager.getText()扫描、LLM 调用重试/退避、提示词构建、Windows 安全输出等支撑模块参与角色分工明确译者/审校者负责修词表并申请整语言重译维护者负责运行流水线命令、提交再生成的 locale 文件。二、译者和审校者修词的正确姿势2.1 禁止直接编辑 locale.properties文件请勿手工修改诸如Common_de.properties、gui/BoardMenuFile_ar.properties等src/main/resources/app/freerouting/下的*_{locale}.properties文件。直接编辑被明确反对原因有四下一次该语言运行流水线时会被整体覆盖修好一个字符串但同一 PCB 术语在别处仍是错的例如只修了某个对话框里的 clearance工具栏、Common 键、错误消息里依然是旧译法绕过词表一致性检查glossary consistency checks让维护者难以判断哪些键仍需重新生成。唯一例外英文源字符串*_en.properties由开发者维护文案审校、新增键、占位符修复。译者通常不编辑英文除非他们同时也在改进源文案。2.2 修复错误翻译的三步流程先识别 PCB 或 UI 概念例如 clearance、shove fixed、net class而不是只盯着一处菜单文案只编辑语言词表scripts/i18n/glossary/{locale}.json。词条值必须以用户应看到的本地化术语开头不要把英文嵌在值里当这些词出现在 UI 文本中时保持拉丁字母书写DSN、SES、Specctra、Freerouting、Andras Fuchs如果术语缺失先在_default.json中补上同一键再为每个{locale}.json补上参见 scripts/i18n/README.md#glossaries提交 Pull Request 或 Issue内容必须包含词表修改必需针对整个语言的重译请求该语言所有*_{locale}.properties示例 Issue 标题i18n: re-translate de after glossary fix (clearance terms)简要说明哪里错了、词表中改了什么。除非维护者明确要求热修复否则不要提交只修补个别*_{locale}.properties行的 PR。2.3 为什么必须整语言重译词表条目驱动每一个提及该术语的字符串。如果在某个对话框里修好clearance而工具栏、Common 键、错误消息里仍是旧译界面就会变成新旧混排。重新生成整个语言才能让词表一致地应用到全部字符串上。从实现看词表是通过 scripts/i18n/glossary.py 注入 LLM 提示词的glossary_prompt_lines(locale)把_default.json与{locale}.json合并后逐行生成term → 本地化释义的约束文本由 prompt_builder.py 追加到单条、批量与分段三种提示词模板中并要求英文键只是查找标签必须使用右侧的本地化形式、在本批所有字符串中保持一致。这就是词表能够驱动一切字符串的底层机制。三、英文源术语标准source language英文 UI 文案与词表遵循单一规范术语标准。修改英文字符串的译者与贡献者必须遵守以下约定表格中左侧为唯一允许形式右侧为禁止形式3.1 功能名称Feature names角色规范写法不要使用引擎Autorouterauto-router, Auto-router动词/按钮Autoroute把 Autorouting 当动词流水线阶段Auto-routingAutorouting, Post-routing优化引擎OptimizerPostroute, Post-router优化阶段Optimizationpost-route pass3.2 领域术语Domain terms角色规范写法UI 中不要使用飞线指标Incomplete connectionsUnrouted Connections作为标签状态动词remain unrouted—仅允许出现在句子里内部保存.frb.bin设计导入 / Save AsSpecctra design file (.dsn)把 .frb 当作开放格式Specctra 导出Specctra session file (.ses)把 session script 说成 .scrFusion 导出Autodesk Fusion Script (.scr)EAGLE session script放置禁布Component keepoutplace keepout孤立布线Unconnected traces and viasDangling copper, Unconnected Routes短线残铜Route stubsDangling copper铜区模型Conduction areacopper pour词表 KiCad 别名除外已布铜走线Tracetrack词表 KiCad 别名除外飞线图形Air wireair line实现名AirLine保持不变3.3 核心术语规则Autorouter / Auto-routing / Autoroute批量引擎用Autorouter动作/动词用Autoroute流水线阶段用Auto-routing。窗口标题使用 Title Case如Auto-routing Completed。在句中Autorouter与Optimizer作为正式功能名保持大写Incomplete connections vs remain unrouted标签、指标和评分汇总用incomplete connections动词形式remain unrouted仅允许出现在描述性句子中例如Autoroute completed; X connections remain unrouted.文件格式Freerouting 内部板图快照用.frb绝不用.binSpecctra 交换设计文件用.dsn会话文件用.sesAutodesk Fusion 脚本用.scr。绝不要把.scr称为 EAGLE 脚本或 session script禁布区面向用户的 UI 元素必须用Component keepout绝不用place keepoutplace keepout仅保留为词表和文件解析器中的 Specctra 文法别名scripts/i18n/glossary/_default.json 中即有该别名说明风格与拼写统一美式英语产品名恒为大写Freerouting普通 UI 标签使用push-and-shove、rip-up与 sentence case。词表术语正是从*_en.properties和 Java UI 字符串中挖掘出来的autorouter、net class、conduction area、push/shove、Specctra DSN/SES 等_default.json目前收录约 90 个 Freerouting/Specctra 术语。以 scripts/i18n/glossary/zh.json 为例词条采用本地化术语在前、英文说明在后的风格component keepout: 元件禁布区禁止放置元件的区域界面用语。Specctra 文法称 place keepout, trace: 走线单层铜导体。Freerouting 界面用语KiCad 别名为 track, clearance: 间距铜或机械特征之间的最小距离词表校验逻辑位于 scripts/i18n/glossary.pyvalidate_glossaries()会检查GLOSSARY_LOCALES列表中的每个{locale}.json是否存在、且覆盖_default.json的全部术语键缺失即报错validate.py会调用该函数。四、维护者运行整语言重译当贡献者更新了scripts/i18n/glossary/{locale}.json并请求刷新该语言时维护者执行如下命令序列仓库根目录下Windows PowerShell# Navigate to the repository root pip install -r scripts/i18n/requirements.txt $env:GEMINI_API_KEY AQ.... # API key for the translation model $env:LLM_MODEL gemini-3.6-flash # optional; default is gemini-3.6-flash $locale de # target locale # Full overwrite for that locale Get-ChildItem -Path src/main/resources/app/freerouting -Recurse -Filter *_$locale.properties | Remove-Item python scripts/i18n/extract-context.py python scripts/i18n/translate.py --locale $locale python scripts/i18n/extract-context.py --sync-translated --locale $locale python scripts/i18n/validate.py --locale $locale -v ./gradlew test --tests app.freerouting.i18n.*提交时需包含再生成的*_{locale}.properties、更新的词表以及如有变化scripts/i18n/context/。不做全量删除的增量刷新仅当键被标记为 stale 时python scripts/i18n/translate.py --locale $locale --missing-only注意仅改词表不会自动标记键为 stale因此优先采用上面的整语言再生成流程。4.1 模型与环境变量配置LLM 翻译依赖 Gemini REST 端点当前完整配置项见 scripts/i18n/README.md变量默认值说明GEMINI_API_KEY必填Google AI Studio API 密钥AQ.…或旧版AIza…GOOGLE_API_KEY是别名LLM_MODELgemini-3.7-flashGemini 模型 ID用于generateContentLLM_BASE_URLhttps://generativelanguage.googleapis.com/v1betaGemini REST 基础地址仅测试时覆盖LLM_GEMINI_THINKING_LEVELminimal仅 Gemini 3.xminimal/low/medium/highLLM_GEMINI_THINKING_BUDGET0Gemini 2.5 及更早思考 token 预算0关-1/default模型默认LLM_BATCH_SIZE15每次 Gemini 请求的键数1–25说明翻译指南正文中的示例以gemini-3.6-flash为默认模型而 scripts/i18n/README.md 的当前默认值已更新为gemini-3.7-flash两处均正确反映了各自文档撰写时的配置运行前请以 README 为准。Google AI Studio 现已签发带AQ.前缀的 auth key取代旧版AIza…密钥通过GEMINI_API_KEY传入客户端在原生 Gemini REST 端点的x-goog-api-key头中发送该密钥。设置环境变量后需重启终端或 CursorPython 子进程才能继承它。4.2translate.py命令行参数源码级从 scripts/i18n/translate.py 的argparse定义可见参数简写作用--locale-l目标语言代码如de、fr--all-a翻译所有支持的语言--input-icontext 目录默认scripts/i18n/context--dry-run-n预览模式不调用 LLM、不写文件--missing-only-m只翻译缺失或 stale 的键推荐--bundle-b限定一个或多个 bundle如gui.BoardMenuFile可重复--exclude-locale-x配合--all跳过某些语言可重复典型用法bashpip install -r scripts/i18n/requirements.txt export GEMINI_API_KEY... python scripts/i18n/extract-context.py python scripts/i18n/translate.py --locale de --missing-only python scripts/i18n/validate.py --locale de ./gradlew test --tests app.freerouting.i18n.EnglishPropertiesParityTest其他常用变体单 bundle 开发调试--locale de --bundle gui.BoardMenuFile --missing-only新语言一次性全量引导--locale pt批量除某语言外全译--all --exclude-locale ar全量翻译后同步标志extract-context.py --sync-translated --all。五、流水线三层架构上下文提取、翻译、校验5.1 第 1 层extract-context.py对每个 bundle 生成一份 JSONscripts/i18n/context/ 下约 44 个文件如Common.json、gui.menus.BoardMenuFile.json、gui.windows.routing.WindowNetClasses.json字段含义字段用途english_hash英文值的 SHA-256变更检测needs_retranslation英文自上次提交后变化时为trueui_roletooltip、button_label、dialog_title、error_message等grammatical_roleverb_phrase、noun_phrase、full_sentence、fragmentplaceholders/has_placeholders%s、{{name}}等占位符is_html是否必须保留 HTMLrelated_keys同前缀键如cancel_and_exit与cancel_and_exit_tooltipcode_references引用该键的 Java 类来自源码扫描java_class/bundle_desc/max_length_hint所属类、bundle 描述与长度提示实际 JSON 中可见它同时扫描 Java 源码中的TextManager.getText(key)调用scripts/i18n/java_scanner.py 负责。context JSON 以确定性顺序写入属性键排序、列表字段排序、sort_keys稳定元数据顺序保证 git diff 只显示真正变化的行且不存储英文值本身只存变更标志。CI 中通过python scripts/i18n/extract-context.py --check校验已提交的 context 与英文源一致无需 API 密钥。5.2 第 2 层translate.py批量模式键按批次发给 Gemini默认每批 15 个设LLM_BATCH_SIZE1可强制逐键批解析失败会回退为单键调用并带重试/退避scripts/i18n/llm_client.pystale 键当needs_retranslation置位时旧译文会作为过时提示加入提示词图标键{{icon:…}}形式的键永不翻译成功清标翻译成功后清除needs_retranslation标志LLM/校验失败时进程以非零退出码结束便于 CI 或脚本捕获。5.3 第 3 层validate.py针对每个 locale 逐 bundle 检查scripts/i18n/validate.py键覆盖locale 缺失英文键时报missing占位符比对英文与译文的占位符集合缺/多均告警PLACEHOLDER_RE匹配%s、{{name}}等HTML 保持trace_hover_info、pin_hover_info、via_hover_info、net_hover_info等键必须保留 HTML转义校验检查.properties的 Java 转义序列validate_property_escapesLLM 包装残留检测模型输出中的包装痕迹find_llm_wrapper_artifacts词表校验调用validate_glossaries()保证每个GLOSSARY_LOCALES文件齐全且覆盖_default.json全部术语内置text_manager_fallback_class_probe/text_manager_fallback_common_probe探针键参与校验但用于运行时回退测试见下文不计入缺失。5.4 清理未用键prune-unused-keys.py 与 parity 测试当 Java 重构删除了 UI 字符串菜单调整、窗口移除等时需从所有locale 文件与 context 元数据中清理失效键# 1. 检测未用键写 build/reports/i18n/EnglishBundlesContainUnusedKeysReport.* ./gradlew test --tests app.freerouting.i18n.EnglishPropertiesParityTest.englishBundlesDoNotContainUnusedKeys # 2. 预览将删除的键 python scripts/i18n/prune-unused-keys.py # 3. 执行删除 刷新 context python scripts/i18n/prune-unused-keys.py --apply python scripts/i18n/extract-context.py ./gradlew test --tests app.freerouting.i18n.EnglishPropertiesParityTestEnglishPropertiesParityTest 是这套纪律的核心测试产出 4 份报告源码键缺失于英文包、locale 包未覆盖英文键、locale 中存在但英文缺失的键、英文包中未被 Java 引用的键。它通过正则扫描new TextManager(...)、tm.getText(...)、setText、SegmentedButtons、动态枚举键.values()等用法来建立bundle → 使用键映射并含 bundle 别名与子类继承映射如WindowNets继承WindowObjectList。注意未用键测试不会让 CI 失败只是写报告并告警——因为扫描器会漏掉继承 bundle 与动态枚举键盲目--apply可能误删仍在使用的字符串请先人工审阅报告。六、运行时回退机制与测试佐证Locale 文件缺失时UI 不会崩Freerouting 的TextManagerapp.freerouting.util实现了多级回退。测试 TextManagerFallbackTest 验证了类 bundle 缺键时回退到English 类 bundleInteractiveState的text_manager_fallback_class_probe子类缺键时回退到父类 locale bundle阿拉伯语WindowClearanceViolations的filter解析为تصفية:类 bundle 缺键时回退到English Common bundletext_manager_fallback_common_probelocale 键存在时确实返回译文autorouter_started中英文不同camelCase 键可从 snake_case 属性条目解析如listEmptyMessage→No clearance violations found.意大利语it-IT可解析Annulla (Esc)。仓库还包含 HungarianResourceParityCheckTest 等其他 i18n 测试共同构成翻译质量 运行时回退的双重保障。七、推荐执行时机与 CI 纪律触发场景应执行的操作英文*_en.properties变化extract-context.py→ 提交context/Java 重构删除了 UI 字符串parity 测试 →prune-unused-keys.py --apply→extract-context.py补语言缺口translate.py --locale xx --missing-only合并翻译 PR 前validate.py --locale xx新语言一次性全量translate.py --locale xx之后用--missing-only发版卫生validate.py --all词表术语修复译者编辑glossary/{locale}.json→ 申请整语言重跑每个 PRCIextract-context.py --check无需 LLM、无需 API 密钥增量保证--missing-only跳过已有 locale 值且未被标记needs_retranslation的键extract-context.py通过与已提交context/快照比对来设置needs_retranslationtranslate.py翻译成功后清除该标志LLM/校验失败时非零退出图标键{{icon:…}}永不翻译。不要做没有英文变更时按计划任务跑translate.py --all --missing-only编辑英文后跳过extract-context.py在 CI 里跑 LLM 翻译CI 只用--check与validate.py手工编辑*_{locale}.properties修翻译参见本文第二节。八、支持的语言与词表文件源语言sourceen目标语言targetsar,bn,ca,cs,da,de,el,es,fi,fr,he,hi,hr,hu,id,it,ja,ko,lt,nb,nl,pl,pt,pt_br,ro,ru,sk,sl,sv,th,tr,uk,vi,zh,zh_tw共 35 个另有英文en词表用于回退与规范化。词表目录 scripts/i18n/glossary/ 中每个语言一个 JSON_default.json之外的ar.json、de.json、zh.json、zh_tw.json等。其中部分语言仅有词表为即将开展的新翻译做准备validate.py会校验GLOSSARY_LOCALES中列出的每个文件都存在且覆盖_default.json的全部术语。引入新的 PCB 术语时同样遵循先扩展_default.json再给每个{locale}.json补同一键的规则。词表值风格每个 locale 词条应以本地化 UI 术语开头即用户应看到的文本英文词表键只是查找标签。当DSN、SES、Specctra、Freerouting、Andras Fuchs出现在 UI 文本中时要保持拉丁字母不要在非英文词表值里嵌入英文 UI 词如clearance、shove fixed否则会导致 LLM 原样照抄而不翻译。九、相关文档文档受众scripts/i18n/README.md流水线安装、LLM 配置、校验docs/developer.md#translations-i18n英文文案修改后的开发者工作流开发者侧的工作流与本文互补docs/developer.md 给出了编辑英文后的典型命令序列extract-context.py→translate.py --locale de --missing-only→validate.py→EnglishPropertiesParityTest并同样强调译者见 docs/translations.md、不要手工改 locale 文件、修词表并申请整语言重译CI 在 PR 上运行extract-context.py --check以保证已提交的 context 元数据与英文源一致。将本文的修词流程、术语标准与 scripts/i18n/README.md 的流水线细节配合使用即可完整覆盖 Freerouting 从英文源到 35 种目标语言的全部翻译生命周期。赞分享硬件开发桌面应用【免费下载链接】freeroutingAdvanced PCB auto-router项目地址https://gitcode.com/gh_mirrors/fr/freerouting点击查看免费下载相关推荐OpenCode 泰语th翻译词汇表LLM 驱动国际化流水线中的术语治理规范OpenCode 泰语th翻译词汇表LLM 驱动国际化流水线中的术语治理规范 本文以 OpenCode 仓库中的泰语 locale 词汇表 th.md h人工智能AI 应用AI Agent代码智能体CLI开发者工具QuickRecorder 快速上手macOS 轻量录屏工具三步录出系统声音QuickRecorder 快速上手macOS 轻量录屏工具三步录出系统声音 QuickRecorder 是基于系统 ScreenCapture Kit 的桌面应用音视频屏幕录制SparkyFitness 多语言翻译架构指南Weblate 驱动的五组件 i18n 流水线SparkyFitness 多语言翻译架构指南Weblate 驱动的五组件 i18n 流水线 本文是 SparkyFitness 项目Web 前端、Reac后端前端移动开发上一篇ReClip高清视频怎么选4K/1080p/720p选择指南与体积对比全解下一篇10个终极JavaScript技巧从入门到精通的完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。