要审核 Mac 应用中的每个本地化键,请构建相关目标,逐一检查每个字符串表是否涵盖所有支持的语言,然后在运行中的应用里测试消息变体。目录完整性和运行时的正确显示需要分别检查。
此工作流程适用于使用 Xcode 维护 Mac 桌面应用的开发者。具体任务是生成可追溯的记录,列出缺失的消息、未完成的译文、不正确的参数以及显示问题。示例使用合成的标签和计数;它们说明的是一种可应用于自己项目的审核方法。
定义完整消息的标准
先建立一份简明的审核工作表。记录应用目标、资源包、字符串表、键、支持的本地化语言、必需的变体、翻译状态和运行时结果。将每个“资源包–字符串表–键”组合视为独立的消息标识,这样不同资源中相同的键文本就不会掩盖遗漏。
Apple 说明,本地化 API 可以指定字符串表和资源包,而主资源包之外的资源需要使用相应的资源包进行查找。因此,只检查默认的 Localizable.xcstrings 文件可能会漏掉应用中的其他消息。请参阅为应用文本做好翻译准备。
在项目编辑器中查看项目支持的本地化语言:在 Project 下选择项目,打开 Info,然后检查 Localizations。同时检查哪些资源参与了这些本地化。Apple 的添加对语言和地区的支持介绍了这些项目设置和资源选择。
在工作表中,你可以使用“本地化 A”“本地化 B”和“本地化 C”等合成名称。请在工作记录中保留它们与项目实际本地化标识符的对应关系。这些名称只是工作表标签,不应填入 Xcode。
审核时采用以下完成标准。这是一种建议的审查方法,并非 Apple 定义的完成状态。
| 检查项 | 记录的证据 |
|---|---|
| 清单 | 消息已标明目标、资源包、字符串表和键。 |
| 发现 | 消息从代码中提取,或经有意选择后手动维护。 |
| 覆盖范围 | 每种必需的本地化语言都包含必要的消息变体。 |
| 参数 | 每个参数都保留预期含义,并且类型兼容。 |
| 运行时 | 相关 Mac 界面中显示了正确的消息和值。 |
| 处理状态 | 每项发现都已修复、说明原因后有意排除,或仍未解决。 |
先建立目录清单,再审查译文
打开项目现有的字符串目录。如果某个目标没有目录,Apple 记录的创建路径是 File > New > File from Template,然后选择 String Catalog。默认名称是 Localizable;请使用代码预期的表名。选择 Product > Build 来填充和更新目录。请参阅使用字符串目录本地化文本并设置文本变体。
构建每个相关的 Mac 方案,不要把一次成功构建当作完整清单。Apple 说明,提取过程会发现当前方案和平台的字符串。某条消息没有出现在某次构建中,应先调查,再判断它是否已弃用。详见发现字符串目录。
检查 Use Compiler to Extract Swift Strings 构建设置。Apple 明确要求启用该设置,以便在本地化导出中包含所有可本地化的 Swift 文本。如果需要用于翻译工作的交换副本,请选择项目并依次选择 Product > Export Localizations,然后选择所需的本地化语言。导出的 .xcloc 包是 Xcode 本地化目录,与单个 .xcstrings 字符串表不同。请参阅导出本地化内容。
接下来,逐一检查应用常见的桌面界面:主窗口、菜单、工具栏、设置、面板、空状态,以及依赖计数的标签。对于遇到的每条应用自有消息,都要找到对应的工作表条目。这种从可见界面反向核对清单的做法,有助于发现从未进入目录的文本。
不要假设提取过程能发现所有任意字符串表达式。Apple 描述的是通过本地化 API 进行提取。当预期的消息缺失时,检查代码如何创建和传递该消息,再决定是否手动添加另一条记录。请参阅为应用文本做好翻译准备。
区分提取、查找和运行时格式化
这些操作回答的是不同问题。提取用于确认 Xcode 在开发期间能否发现某条消息。查找用于确定运行中的应用会请求哪个本地化资源。运行时格式化则提供所选消息要显示的变量内容。
对于 SwiftUI,参数类型很重要。像 Text("Open collection") 这样的字面量会参与本地化查找。将普通 String 变量传入相应的初始化器,通常会直接显示该变量,不进行本地化。Apple 在LocalizedStringKey中说明了这一差异。
从变量显式创建 LocalizedStringKey 会请求查找,但这不能证明构建时提取发现了所有可能的变量值。对于动态选择的键,请将允许使用的完整键集合与目录进行比对。逐一调查所有不匹配的值,不要依赖测试时碰巧出现的某个值。
插值也会影响消息本身。SwiftUI 可以查找包含格式说明符的本地化消息,并在渲染前替换插入的值。Apple 在Text 文档中建议使用插值来组合可本地化文本。
考虑一条用于报告项目数量的示例消息。目录存储的是可本地化的消息结构和变体;不断变化的计数属于运行时行为。测试数量为 1 和 24 时,不应仅仅因为数字不同就需要维护两条独立的键。
看起来合理的标签,并不能有力证明查找成功。Apple 指出,如果找不到本地化值,SwiftUI 可能会显示键本身。如果键是可读的源文本,查找问题看起来就像普通标签。请结合所选本地化语言和目录条目核对显示结果。请参阅为视图做好本地化准备。
检查每种语言和每个必需变体
一次处理一个字符串表,并逐一检查每种本地化语言。对于每条消息,检查翻译状态、文本、参数和展开后的变体。即使周围的消息都已完成,未完成的行也要保持未结状态。
Apple 的目录工作流程区分 New、Needs Review、已翻译条目和 Stale 字符串。过时条目表示在代码中已找不到对应字符串;手动管理的条目在同步期间不会自动更新或删除。删除过时键的译文前,请确认该键确实不再需要。请参阅发现字符串目录。
对于依赖计数的消息,按住 Control 键点按插入的键,然后选择 Vary by Plural。检查 Xcode 为每种本地化语言提供的所有形式。不同语言所需的形式可能不同,因此仅仅让行数与源语言一致并不足以完成检查。如果目录包含设备变体,请检查 Mac 专用值和通用值。Apple 在使用字符串目录本地化文本并设置文本变体中介绍了这两项设置。
检查参数时,既要看外观,也要确认含义。对于一条用合成数据报告多个组中项目数量的消息,请明确哪个参数表示项目数,哪个表示组数。译文可以调整它们的位置,但仍需保留各自的含义。Apple 的目录教程在发现字符串目录中介绍了参数位置、类型说明符和复数替换。
如果简短标签含义模糊,请添加上下文。对于 Open,注释可以说明它是集合行上的操作。SwiftUI 的 comment 参数会将该上下文传递到本地化输出中;Apple 在为视图做好本地化准备中对此作了说明。
使用覆盖矩阵显示未完成的工作
单个百分比适合跟踪目录进度,但审核还需要分别设置覆盖范围和行为两列。下面的示例说明了原因。数字均为合成数据,表示消息–本地化语言配对数量,并非来自某个应用的实际测量值。
假设清单中有 48 条必需消息和三种支持的本地化语言。这会产生 144 个必需配对:48 乘以 3。每个配对还可能包含复数或设备分支,这些分支也需要单独检查。
| 本地化语言 | 必需配对数 | 已完成的目录检查 | 已完成的运行时检查 |
|---|---|---|---|
| 本地化 A | 48 | 48 | 48 |
| 本地化 B | 48 | 46 | 44 |
| 本地化 C | 48 | 48 | 45 |
| 总计 | 144 | 142 | 137 |
这里有两个配对仍需处理目录工作,另有七个配对尚未完成运行时检查。这两组可能有重叠,因此将它们相加,无法得出可靠的未完成消息数。请将两类发现分别附在对应行上。
对于每一行未完成项,记录一项具体的后续操作:查找缺失的源消息、完成复数分支、核实参数、调查资源包选择,或在更窄的宽度下重新检查界面。这样,矩阵就能转化为修复队列,而不是一份装饰性的进度报告。
在每种支持的本地化语言下运行 Mac 应用
使用 Xcode 的方案设置,重复执行应用级检查。选择 Product > Scheme > Edit Scheme,选中 Run,打开 Options,然后选择 App Language 和 App Region。关闭对话框,选择 Mac 运行目标并运行应用。针对审核范围内支持的组合重复此操作。Apple 在运行应用时测试本地化中记录了这套步骤。
每次运行都沿相同路径检查界面。用相关状态测试每条消息:空集合、单个项目、多个项目以及较长的合成标签。对于复数消息,请选择能覆盖该本地化语言中各分支所需的其他数值;一组固定的小数值不足以证明所有分支都已覆盖。
检查完整句子、替换后的值、换行、截断,以及菜单或控件的宽度。如果一条消息包含两个计数,请分别改变它们。例如,保持组数不变,只改变项目数,有助于发现参数映射错误。
SwiftUI 预览可以缩短修复周期。Apple 支持设置预览的 locale 环境值,并在添加或导入本地化语言后创建多个本地化预览。可以用预览重新检查有问题的视图,然后再验证实际应用路径。请参阅预览本地化效果。
当每个必需的消息–本地化语言配对都有记录在案的处理状态,且必要分支均已检查时,即可结束审核。将清单、测试路径和未解决问题保存在一起。这样下次审核时便于采取行动:每条变更过的消息都有明确的位置、预期参数、必需变体,以及可重复使用的显示检查方法。
来源
- 使用字符串目录本地化文本并设置文本变体 — Apple Developer
- 为应用文本做好翻译准备 — Apple Developer
- 添加对语言和地区的支持 — Apple Developer
- 发现字符串目录 — Apple Developer
- 导出本地化内容 — Apple Developer
- LocalizedStringKey — Apple Developer
- Text — Apple Developer
- 为视图做好本地化准备 — Apple Developer
- 运行应用时测试本地化 — Apple Developer
- 预览本地化效果 — Apple Developer