字符串目录与本地化字符串
使用现代 String Catalog 本地化文本。
字符串目录与本地化字符串 是 CoddyKit 上的免费 Swift Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Swift Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Swift Academy 课程共包含 4 节课。
为什么要进行本地化
本地化(l10n)是指以用户的语言呈现应用文本;国际化(i18n)是指以便进行本地化为目标来组织代码。第一步是停止硬编码面向用户的字符串,改为从资源目录中获取它们。
// Hardcoded — bad for localization
// let title = "Welcome"
// Localized — looked up by key
let title = String(localized: "Welcome")字符串目录
现代 Xcode 项目使用字符串目录(.xcstrings 文件)。它是一个由 JSON 支持的单一文件,列出每个可本地化的 key、各语言对应的翻译,以及注释和复数形式等元数据。Xcode 可以自动从代码中提取 key。
// Localizable.xcstrings holds entries like:
// key: "Welcome"
// en: "Welcome"
// tr: "Hos geldiniz"
// ja: "Yokoso"String(localized:)
在代码中,String(localized:) 会在运行时将 key 解析为当前区域设置下的翻译。您传入的字面量同时充当 key 和开发语言的 fallback。
let greeting = String(localized: "Welcome back")
let cancel = String(localized: "Cancel")
print(greeting)为翻译人员添加注释
一个孤立的词语可能表示“执行”或“慢跑”。comment: 参数可以为翻译人员提供上下文,帮助他们选择正确的措辞。注释会自动流入字符串目录。
let runLabel = String(
localized: "Run",
comment: "Button that executes the user's code")插入运行时值
您可以在本地化字符串中嵌入运行时值。Swift 会将每个插值转换为格式占位符,以便翻译人员重新排列它们。不同语言中,主语和数字的位置各不相同。
let name = "Mira"
let count = 3
let msg = String(localized: "\(name) has \(count) new messages")
print(msg)SwiftUI 中的 LocalizedStringKey
在 SwiftUI 中,您很少会直接调用 String(localized:)。大多数接受文本的视图都会接收 LocalizedStringKey,因此普通字符串字面量会自动进行本地化。
// In SwiftUI — the literal is a LocalizedStringKey
// Text("Welcome back") // auto-localized
// Button("Save") { save() } // auto-localized
let key: LocalizedStringKey = "Welcome back"
_ = key避免意外本地化
由于 SwiftUI 会将字面量视为 key,因此动态的 String 变量不会进行本地化。如果您通过拼接构建文本,字符串目录永远看不到真正的 key。需要本地化时,请传入单个字面量;明确不需要本地化时,请使用 verbatim:。
let userInput = "hello"
// Text(userInput) // NOT a localization key
// Text(verbatim: userInput) // explicitly raw, never localized
let verbatimKey = userInput
_ = verbatimKey指定表
大型应用会将字符串拆分到多个目录(表)中。您可以指定目标表和捆绑包;当您要在框架或 Swift 软件包中随附字符串时,这一点至关重要。
let onboardingTitle = String(
localized: "Get Started",
table: "Onboarding",
bundle: .main)LocalizedStringResource
LocalizedStringResource 将可本地化字符串表示为一个可以存储并稍后解析的值,甚至可以跨进程使用(这对 App Intents 和小组件很有用)。它会将实际查找延迟到显示时。
let resource = LocalizedStringResource("Order shipped")
// Resolve later, possibly in another locale context
let resolved = String(localized: resource)
print(resolved)默认本地化
项目的开发语言会在翻译缺失时提供 fallback。您在代码中编写的字符串字面量会被视为源语言值,因此代码保持可读,并且您永远不会将类似 welcome_screen_title 的原始 key 发布给用户。
// If only 'en' is translated and device is set to 'fr',
// the development-language value is shown as fallback.
let fallback = String(localized: "Settings")
print(fallback)一次真实的查找
综合起来:一个返回完整本地化、带有上下文注释和插值、可供任何用户界面使用的消息的函数。
func welcomeMessage(for user: String) -> String {
return String(
localized: "Welcome, \(user)!",
comment: "Greeting shown after sign-in")
}
print(welcomeMessage(for: "Ada"))快速检查
回想 SwiftUI 如何决定是否对文本进行本地化。
总结
您已搭建本地化文本的基础:
- 将翻译存储在字符串目录(
.xcstrings)中。 - 使用
String(localized:)查找字符串,并添加comment:为翻译人员提供说明。 - 在 SwiftUI 中,字面量会成为
LocalizedStringKey并自动本地化;变量不会。 - 对框架使用
table:/bundle:,并使用LocalizedStringResource进行延迟解析。
常见问题解答
「字符串目录与本地化字符串」课时是免费的吗?
是的 — 「字符串目录与本地化字符串」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Swift Academy 课程的其余内容,请升级到 CoddyKit PRO。 Swift Academy 课程共包含 4 节课。
「字符串目录与本地化字符串」这节课中我会学到什么?
使用现代 String Catalog 本地化文本。 你通过在浏览器中直接运行的动手代码来练习 Swift Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Swift Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Swift Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「字符串目录与本地化字符串」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Swift Academy 课中编写并运行代码吗?
能。每节 Swift Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 字符串目录与本地化字符串
- 复数形式与 Stringsdict
- 区域设置感知的格式化
- 从右到左与布局方向