该全球化Quality Control中的检查功能可确保国际化项目具备全球适配能力。它会在任务QA和拉取请求阶段运行,仅扫描变更所涉及的内容:
- 目录。变更新增或修改的字符串,涵盖所有语言版本。
- 代码。变更新增的代码行,这类文本和格式设定仅适用于特定语言或文化场景。
- 页面。当项目指定应用的启动方式时,其页面会通过伪翻译。
一旦pull request被合并,向导便会默认开启此项检查功能。相关设置位于Quality Control → 全球化;工作台的设置会显示该功能是否处于开启状态。
默认阻断项
若变更导致字符串缺失或损坏,或者新增代码将用户可读文本直接嵌入代码、或把多个片段拼成句子,该变更就会被退回要求修复。其余问题仅会作为发现项记录,除非您主动设置为阻断项,否则不会阻碍流程。格式、排序和布局类发现项会持续记录,直至项目自身代码中不再出现此类问题。
在“Quality Control → 全球化”下选择要阻断的项:目录代码、代码中导致变更被退回的因素,以及导致变更被退回要求修复的页面问题。检查源代码和渲染页面来关闭代码和页面检查步骤。
目录代码
| 代码 | 含义 | 默认阻断项 |
|---|---|---|
missing | 该字符串没有对应译文 | 是 |
invalid_syntax | 译文无法解析,例如ICU格式错误 | 是 |
placeholder_mismatch | 占位符与源文本不一致 | 是 |
plural_categories | 缺少该语言所需的复数形式 | 是 |
stale | 字符串翻译完成后源文本发生了变更 | 否 |
当配置文件启用相关规则时,术语表、长度及禁用词规则会自行生成对应代码。
代码代码
| 代码 | 检测到的内容 | 默认阻断项 |
|---|---|---|
hardcoded_text | 用户可读文本被写入代码而非目录中:包括JSX和模板文本、可见属性如placeholder、title、alt和aria-label、提示框和警告信息 | 是 |
concatenated_text | 由多个片段拼接而成的句子:译文与文本或数值通过+、模板字面量或相邻元素拼接而成 | 是 |
locale_number | 数字格式未遵循用户所在地区的本地化规则,例如UI代码中的toFixed或没有指定本地化规则的toLocaleString()无本地化设置 | 否 |
locale_date | 日期或时间格式未遵循用户所在地区的本地化规则,或使用固定格式如MM/dd/yyyy | 否 |
hardcoded_currency | 金额旁边显示的货币符号或代码 | 否 |
ordinal_sort | 按字符编码排序或比较的文本,或没有指定本地化规则的localeCompare无本地化设置 | 否 |
case_mapping | toUpperCase()或toLowerCase()在没有指定本地化规则的情况下应用于文本 | 否 |
physical_direction | 在包含从右到左语言的项目中,CSS和工具类中的左右方向设置 | 否 |
postal_code_format | 采用某个国家邮政编码格式的邮政编码 | 否 |
phone_number_format | 符合北美规范的电话号码 | 否 |
latin_only_input | 姓名、城市、街道或地址仅允许使用a-z字符 | 否 |
joined_list | 用户可读列表通过逗号或“和”连接 | 否 |
calendar_names | 星期或月份名称直接写在代码中,或每周第一天被固定设定 | 否 |
paper_size | 打印或PDF设置中固定为Letter、A4等规格 | 否 |
fixed_unit | 显示的数字旁边附带mi、lb或°F等单位 | 否 |
locale_parsing | 用户输入的数字通过parseFloat或Number | 否 |
ime_composition | 文本输入框中处理回车键时,未检测中文、日文或韩文单词是否仍在输入中 | 否 |
面向各市场的设计会显示针对每项问题的修复方案。
检查功能检测的内容
代码检查步骤可解析JavaScript和TypeScript,支持JSX,同时能读取Vue、Svelte、Astro、HTML、ERB、Handlebars模板以及CSS文本。只有当规则上下文明确指定时才会触发:例如邮政编码模式仅在邮政编码字段附近才会被检测为问题,拼接列表也仅在用户可读场景下才会被识别。
- 按定义已翻译。项目翻译调用和组件内的文本(
t()、formatMessage、<Trans>、<FormattedMessage>、$t()) 以及配置文件中列出的函数。 - 永不 text。受保护的术语,以及配置文件允许的词语。
- 故意省略。包含 “” 的一行:
i18n-ignore注释,以及其后的行。请说明原因:// i18n-ignore: product name。
可选的world的.coroid/i18n.json用于设置其余内容:
{
"world": {
"exclude": ["src/legacy/**", "scripts/**"],
"translate": ["translateText", "i18n.translate"],
"allow": ["Storefront", "OK"]
}
}| 字段 | 含义 |
|---|---|
exclude | 规则忽略的文件通配符 |
translate | 框架自带的之外的翻译函数 |
allow | 除受保护术语外永不翻译的词语 |
formatter、currencies | 由向导的“文化”步骤设置;详见文化 |
render | 如何启动应用以生成伪本地化页面;详见伪本地化 |
发现结果和修复项
每条发现结果都存储在检查的运行记录中,并列在任务的“发现结果”里。发现的问题:按目录、键和语言归类发现结果,按文件、行和发现的文本归类代码发现结果,按页面、元素和文本归类页面发现结果。当对同一工作的最后一次检查不再包含某条发现结果时,该结果即被修复。
- 打开ui · checkout.total · fr: missing全球化 · 未翻译
- 正在修复src/pricing.tsx:7 · “简洁的定价方案”全球化 · 写入代码的文本
- 打开/{locale}/ · p#promo · “所有订单均享免费配送” · runtime_text (de-DE, ar-SA)全球化 · 未来自目录的文本
- 正在修复ui · cart.items · ja: placeholder_mismatch全球化 · 占位符与源文本不符
- 已修复ui · cart.count · ar: plural_categories全球化 · 该语区缺少复数形式
全球化检查的质量发现:目录字符串、代码变更及伪本地化页面,每个问题对应一个代码。仅为示意数据。
在拉取请求中,代码发现结果也会作为标注出现在变更行上:若阻碍任务则标记为失败,仅作报告则标记为警告。
当检查阻塞任务时,开发者智能体会获取每条阻塞性发现结果,例如src/pricing.tsx:7 hardcoded_text: “Simple pricing”,并获知修复方法。它通过为任务开启翻译会话来修复翻译,绝不会手动编辑其他语言的目录。它会将文本移入源目录,把组合句子重写为带有占位符的单条消息,并在移交任务前对自身变更执行代码规则。
来自各渠道的贡献
无论由谁编写,检查都会按同一标准衡量所有变更:
- Coroid的智能体参与国际化项目的智能体会在每个任务中获知相关信息:源目录和翻译函数、每句对应一条消息、项目的格式化工具、从右向左书写的语言的逻辑布局,以及“文化”设定的市场惯例。
- 来自人员和其他工具的拉取请求会通过Coroid Check接受检查,显示相同的发现结果和标注。启用审核每个PR以在每个pull request上运行它。
- 未通过检查即合并的变更会在合并后被捕获。 翻译在Coroid之外合并的字符串会读取在pull request上运行的检查结果。若字符串缺失或已过时,它会创建翻译任务。若检查阻塞了代码发现结果,它还会创建名为 对合并的代码进行国际化处理pull request,列出查找位置。每次合并最多生成一种类型的任务。
现有代码绝不会被阻塞:全球就绪性会列出相关内容,并创建你可随时启动的修复任务。
自行运行
该引擎就是命令行工具coroid-i18n,即配置文件中指定的版本:
coroid-i18n check # catalogues
coroid-i18n source --changed main # the code a branch adds since main
coroid-i18n check --source --changed mainsource无需读取目录即可分析代码,因此即便目录尚未设置也能正常工作。没有--changed或--diff时,它会扫描整个代码库。发现问题时这两个命令会返回退出码1;添加--format json可生成机器可读的报告。