Highlight
Foundation 框架新增依赖一致性(dependency agreement)API,包括
agreeWithConcept和agreeWithArgument属性,以及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:12)TermOfAddress 类型支持 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、.neutralreferentConcept: 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 个代词形式
核心启发
-
为多语言应用添加语法一致性
- 如果应用支持西班牙语、法语、德语等,用
inflect: true和agreeWithArgument自动处理形容词和名词的一致性 - 不需要为每种语言写特殊逻辑
- 入口:在 String Catalog 中添加属性标注
- 如果应用支持西班牙语、法语、德语等,用
-
实现个性化代词支持
- 在用户资料中添加
preferredTermsOfAddress字段 - 用
TermOfAddress和referentConcept自动选择正确的代词 - 入口:
TermOfAddress.masculine/.feminine/.neutral
- 在用户资料中添加
-
修复现有本地化中的语法错误
- 检查西班牙语、法语等本地化字符串中形容词和名词是否一致
- 用
agreeWithConcept处理跨字符串的词形变化 - 入口:String Catalog 中的
agreeWithConcept和agreeWithArgument属性
关联 Session
- What’s new in Foundation — Foundation 框架的新特性
- Build accessible apps with SwiftUI and UIKit — 用 SwiftUI 和 UIKit 构建无障碍应用
- Localize your SwiftUI app — SwiftUI 应用本地化指南
- What’s new in SwiftUI — SwiftUI 2023 新特性
评论
GitHub Issues · utterances