Swift 中的国际化 (i18n):iOS 和 macOS 完整指南
国际化(简称 i18n)是指设计应用程序的过程,使其能够适应不同的语言和地区,而无需修改源代码。对于 Apple 平台(iOS、macOS、watchOS、tvOS)的开发者来说,Swift 提供了一套强大且优雅的工具。在本文中,我们将详细讨论如何使用 Apple 内置机制在您的 Swift 项目中配置 i18n。
为什么 i18n 至关重要?
即使您的应用程序最初只用一种语言创建,国际化也应在架构阶段就考虑进去。这可以:
- 扩大受众:来自不同国家的用户更喜欢使用母语应用程序。
- 简化本地化:正确的 i18n 将添加新语言变成简单的文件操作。
- 避免硬编码:所有字符串都提取到单独的资源中,从而提高代码的可读性和可维护性。
核心工具:NSLocalizedString
Swift 中国际化的核心是宏 NSLocalizedString。它会在本地化文件(.strings)中查找字符串,并返回翻译后的版本。如果未找到翻译,则使用键(通常是英文字符串)。
// Swift 中的使用示例let welcomeMessage = NSLocalizedString("welcome_message", comment: "主屏幕上的问候语")label.text = welcomeMessage建议始终指定 comment——它有助于翻译人员理解上下文。
本地化文件结构
在 Xcode 中,通过 Project Settings > Info > Localizations 添加语言。之后会创建 xx.lproj 文件夹(例如 en.lproj、ru.lproj)。其中包含:
- Localizable.strings — 包含“键” = “值”对的主文件;
- InfoPlist.strings — 用于本地化应用程序名称和系统字符串;
- Storyboard.strings — 为在故事板中创建的界面自动生成的文件。
Localizable.strings 格式
文件语法简单:
// 英语 (en.lproj/Localizable.strings)"welcome_message" = "Welcome to our app!";"login_button" = "Log In";
// 俄语 (ru.lproj/Localizable.strings)"welcome_message" = "Добро пожаловать в наше приложение!";"login_button" = "Войти";重要提示:字符串以分号结尾。文件编码应为 UTF-8 或 UTF-16。
带参数的字符串格式化
通常需要在字符串中插入动态数据(用户名、项目数量)。为此使用 String(format:):
// 在 Localizable.strings 中:"items_count" = "You have %d items.";"user_greeting" = "Hello, %@!";
// 在 Swift 代码中:let count = 5let itemsText = String(format: NSLocalizedString("items_count", comment: "项目数量"), count)
let userName = "Алексей"let greeting = String(format: NSLocalizedString("user_greeting", comment: "用户问候语"), userName)要支持复数形式(1 个苹果,2 个苹果,5 个苹果),请使用 StringDict(.stringsdict 文件)。
为翻译人员使用 XLIFF
Apple 支持 XLIFF(XML 本地化交换文件)格式。这是用于交换翻译的行业标准。在 Xcode 中,您可以将所有字符串导出到 XLIFF 文件,交给翻译人员,然后再导入回来。
// 用于导出的终端命令:xcodebuild -exportLocalizations -localizationPath ./translations -project YourProject.xcodeproj
// 导入完成的翻译: