WWDC Quick Look 💓 By SwiftGGTeam
Unlock the power of grammatical agreement

Unlock the power of grammatical agreement

观看原视频

Highlight

Foundation 框架新增依赖一致性(dependency agreement)API,包括 agreeWithConceptagreeWithArgument 属性,以及 TermOfAddress 类型和 referentConcept 属性,让应用自动处理跨词语法一致性和个性化代词选择。

核心内容

语法一致性的价值

软件中的语言影响用户每天的交互体验。处理语言很难,尤其是当你不会说那种语言时。

00:34)Apple 在 2021 年就在 Foundation 中引入了语法一致性 API,帮助应用根据用户的称呼方式自动调整用词。今年这套体系有三项重要升级:依赖一致性、包容性语言、新增语言支持。

依赖一致性

01:17)很多语言里,形容词要跟名词在性、数上保持一致。西班牙语中 “ensalada pequeña” 是正确的,“ensalada pequeño” 是错误的。形容词的词尾必须根据名词变化。

过去这种跨词的语法关联很难处理。今年引入了两个新属性解决:

agreeWithConcept 用于字符串外的词达成一致。比如食物尺寸的描述需要跟食物名称一致:

var options = AttributedString.LocalizationOptions()
options.concepts = [.localizedPhrase(food.localizedName)]

let size = AttributedString(localized: "small", options: options)

关键点:

  • concepts 传入影响语法变化但不直接插入字符串的对象
  • .localizedPhrase 包装需要达成一致的短语
  • 字符串中的 ^[small](agreeWithConcept: 1) 标注表示该词要跟第一个 concept 一致

agreeWithArgument 用于同一字符串内的词达成一致:

"^[Our](inflect: true) ^[pizza](arg1) is ^[made](agreeWithArgument: 1) fresh"

关键点:

  • inflect: true 让块内的词互相达成一致
  • agreeWithArgument: 1 让该词跟字符串中的第一个参数一致
  • 尽量保持 inflect 块简短,减少歧义

包容性语言

08:12TermOfAddress 类型支持 masculine、feminine、neutral 三种称呼方式。配合 referentConcept 属性,系统自动选择正确的代词。

struct DeliveryPerson {
    var name: String
    var avatar: Image
    var preferredTermsOfAddress: [TermOfAddress]
}

var options = AttributedString.LocalizationOptions()
options.concepts = [.termsOfAddress(person.preferredTermsOfAddress)]

let message = AttributedString(
    localized: "\(person.name) is on ^[their](referentConcept: 1) way.",
    options: options
)

关键点:

  • TermOfAddress 可以是 .masculine.feminine.neutral
  • referentConcept: 1 表示代词指代第一个 concept
  • 系统根据 TermOfAddress 自动替换为正确的代词形式
  • 也支持自定义代词,用 Morphology.Pronoun 指定具体形式

新增语言支持

02:29)2021 年支持西班牙语。2022 年加入法语、意大利语和巴西葡萄牙语。今年新增欧洲葡萄牙语和德语。

详细内容

String Catalog 中的语法标注

11:40)在 Xcode 的 String Catalog 中,可以直接给本地化字符串添加语法属性:

// 西班牙语:让 "nuestro" 和 "pizza" 达成一致
"^[Our](inflect: true) ^[pizza](arg1)"

// 让 "made" 跟第一个参数 "pizza" 达成一致
"^[made](agreeWithArgument: 1) fresh"

关键点:

  • 在 String Catalog 的编辑器中直接添加属性
  • inflect: true 适用于同一块内的词
  • agreeWithArgument 适用于距离较远的词
  • 1 表示跟第一个参数一致

食物尺寸的一致性

12:48)食物尺寸需要根据具体食物名称变化:

// 定义食物尺寸,支持本地化名称
enum FoodSize: String {
    case small, medium, large

    func localizedName(for food: Food) -> String {
        // 返回与食物性别一致的尺寸名称
    }
}

// 格式化尺寸按钮
var options = AttributedString.LocalizationOptions()
options.concepts = [.localizedPhrase(food.localizedName)]

let sizeButton = AttributedString(
    localized: "\(size.localizedName(for: food))",
    options: options
)

关键点:

  • localizedPhrase 把食物名称作为 concept 传入
  • 尺寸名称通过 agreeWithConcept 跟食物名称达成一致
  • 西班牙语中 pizza(阴性)对应 “pequeña”,sandwich(阳性)对应 “pequeño”

自定义代词

10:19)如果预设的 masculine/feminine/neutral 不够用,可以用 LocalizedTermOfAddress 指定具体代词:

let customPronouns = LocalizedTermOfAddress(
    language: "en",
    pronouns: [
        Morphology.Pronoun(
            pronoun: "they",
            morphology: Morphology(grammaticalCase: .nominative)
        ),
        Morphology.Pronoun(
            pronoun: "them",
            morphology: Morphology(grammaticalCase: .accusative)
        ),
        // ... 其他格
    ]
)

关键点:

  • 指定目标语言
  • 列出所有需要的代词形式
  • 每个代词包含词形和语法格信息
  • 英语需要 5 个代词形式

核心启发

  1. 为多语言应用添加语法一致性

    • 如果应用支持西班牙语、法语、德语等,用 inflect: trueagreeWithArgument 自动处理形容词和名词的一致性
    • 不需要为每种语言写特殊逻辑
    • 入口:在 String Catalog 中添加属性标注
  2. 实现个性化代词支持

    • 在用户资料中添加 preferredTermsOfAddress 字段
    • TermOfAddressreferentConcept 自动选择正确的代词
    • 入口:TermOfAddress.masculine / .feminine / .neutral
  3. 修复现有本地化中的语法错误

    • 检查西班牙语、法语等本地化字符串中形容词和名词是否一致
    • agreeWithConcept 处理跨字符串的词形变化
    • 入口:String Catalog 中的 agreeWithConceptagreeWithArgument 属性

关联 Session

评论

GitHub Issues · utterances