文档

全球化检查

检查所有变更中是否存在缺失或错误的翻译,以及新代码中是否包含仅适配单一语言或文化的文本和格式;配置完成后,还会检查其他语言页面是否出现显示异常。

该全球化Quality Control中的检查功能可确保国际化项目具备全球适配能力。它会在任务QA和拉取请求阶段运行,仅扫描变更所涉及的内容:

  1. 目录。变更新增或修改的字符串,涵盖所有语言版本。
  2. 代码。变更新增的代码行,这类文本和格式设定仅适用于特定语言或文化场景。
  3. 页面。当项目指定应用的启动方式时,其页面会通过伪翻译。

一旦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_mappingtoUpperCase()或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 main

source无需读取目录即可分析代码,因此即便目录尚未设置也能正常工作。没有--changed或--diff时,它会扫描整个代码库。发现问题时这两个命令会返回退出码1;添加--format json可生成机器可读的报告。