Unlock the power of grammatical agreement
System & Services 进阶 20m

掌握语法一致性:让 App 的语言更地道

Unlock the power of grammatical agreement

2023年6月5日

在 Apple 官方观看视频

一句话判断

如果你在做多语言国际化,Foundation 新增的语法一致性 API 能帮你省掉大量手动处理词形变化的麻烦。

这场 Session 讲了什么

Apple 在 2021 年就在 Foundation 中引入了语法一致性(grammatical agreement)相关的 API,允许开发者根据用户选择的称呼方式(term of address)自动调整 UI 中的用词。到了 iOS 17,这套体系有了三项重要升级:

一是依赖一致性(dependency agreement)。在很多语言里,形容词要跟它修饰的名词在性、数上保持一致。比如西班牙语中”小沙拉”应该是”ensalada pequeña”而非”ensalada pequeño”——形容词的词尾要根据名词变化。过去这种跨词的语法关联很难处理,现在通过新的 agreeWithConceptagreeWithArgument 属性,可以轻松标注并让系统自动完成词形变化。

二是包容性语言(inclusive language)。新的 TermOfAddress 类型让你可以为用户设定 masculine、feminine 或 neutral 三种称呼方式,配合 referentConcept 属性,系统会自动选择正确的代词和性别化表达。

三是新增语言支持。继西班牙语、法语、意大利语和巴西葡萄牙语之后,今年加入了欧洲葡萄牙语和德语。

值得深挖的点

agreeWithConcept vs agreeWithArgument 的区别。前者处理的是两个不在同一个字符串里的词之间的关系,需要在代码层面通过 LocalizationOptionsconcepts 属性传入被依赖的词;后者处理的是同一个字符串内部的词间一致性,纯标记即可,不需要改代码。区分这两个场景是正确使用 API 的关键。

向后兼容设计agreeWithConcept 属性在旧系统上会被静默忽略,不会导致崩溃。这意味着你可以放心在代码中添加这些标注,不需要做版本判断。

TermOfAddress 的三种模式。masculine、feminine、neutral 不仅仅是代词替换,它会触发整个句子层面的一致性调整。对于外卖、打车这类展示他人信息的场景尤其重要。

代码片段

// 使用 agreeWithConcept 实现跨字符串的依赖一致性
let options = LocalizationOptions()
options.concepts = [
    .localizedPhrase(foodName)  // 被依赖的名词,如 "ensalada"
]
// 字符串中用 agreeWithConcept="1" 标注需要变化的形容词
// 1 表示与 concepts 数组中第一个概念保持一致
// 使用 TermOfAddress 实现包容性语言
struct DeliveryPerson {
    var name: String
    var termOfAddress: TermOfAddress  // 新类型
}

// 设置为 masculine,对应 he/him 代词
person.termOfAddress = .masculine
// 在字符串中用 referentConcept="1" 标注需要根据此人称呼变化的词

最佳实践

  • inflect 块尽量缩短,减少歧义。只包裹真正需要变化的词,而不是整段文本。
  • 在设计本地化字符串时就要考虑语法一致性的需求,提前规划哪些词需要标注属性。
  • 对于展示用户个人信息(如配送员名字)的场景,一定要使用 TermOfAddressreferentConcept,避免用错代词或性别化表达。
  • 测试时至少覆盖 masculine、feminine、neutral 三种称呼方式,确保所有路径都正确。

还有什么值得关注

  • 2021 年的语法一致性基础 API 回顾可以作为入门参考
  • 欧洲葡萄牙语和德语的加入意味着西欧主要语言基本全覆盖了
  • agreeWithArgument 不需要代码改动这一点非常适合历史遗留项目渐进式迁移
  • 如果你已经在用 Foundation 的本地化体系, adoption 成本很低——本质上就是在字符串文件里加几个属性标注
WWDC 2023