为你的iOS应用突破语言障碍,触及全球用户,是提升影响力和用户基数的关键一步,iOS平台提供了强大且相对成熟的多语言(本地化)开发框架,让这个过程更加系统化,核心方案在于利用Localizable.strings文件结合NSLocalizedString宏,配合Xcode的国际化工具,实现文本、界面乃至资源的动态切换。

国际化(i18n)基础:准备你的项目
-
启用基础国际化:
- 在Xcode中打开你的项目。
- 选中项目文件(通常是顶层的蓝色项目图标)。
- 在项目设置的主标签页中,找到”Localization”部分。
- 勾选”Use Base Internationalization”,这会将你的
Main.storyboard(或初始界面文件)和LaunchScreen.storyboard移动到Base.lproj目录下,作为所有语言的基准界面。 - 首次启用时,Xcode会询问将哪些文件用于基础国际化,确保包含你的主要Storyboard和启动屏幕。
-
添加目标语言:
- 仍在项目设置的”Info”标签页下,找到”Localizations”区域。
- 点击”+”按钮。
- 从列表中选择你想要支持的语言(简体中文 – Chinese (Simplified),法语 – French,日语 – Japanese)。
- 在弹出的对话框中,Xcode会列出它可以自动本地化的文件(通常是你的
Main.storyboard和LaunchScreen.storyboard),保持默认勾选,点击”Finish”,Xcode会为每种语言创建对应的.lproj目录(如zh-Hans.lproj,fr.lproj,ja.lproj),并在其中生成对应语言的界面文件副本(.strings文件)。
字符串本地化:核心 Localizable.strings
-
创建
Localizable.strings文件:- 在Xcode中,右键点击你的项目或某个Group(通常在项目导航器中选择支持文件相关的Group)。
- 选择”New File…”。
- 在模板选择器中,找到”Resource”部分,选择”Strings File”。
- 将文件命名为
Localizable.strings(注意:这个名字是系统默认识别的,必须准确)。 - 点击”Create”。
-
添加翻译:
- 选中
Localizable.strings文件。 - 在Xcode的右侧文件检查器(Utilities pane)中,找到”Localization”区域。
- 点击”Localize…”按钮。
- 在弹出的对话框中,选择”Base”(或其他你希望作为基础的语言),然后点击”Localize”。
- “Localization”区域会出现你项目已支持语言的复选框,勾选所有你需要翻译的语言。
- 在项目导航器中展开
Localizable.strings文件,你会看到它下面列出了每种语言对应的子项(如English, Chinese (Simplified)等)。 - 点击打开每种语言的
Localizable.strings文件。 - 格式为键值对:
"KEY" = "Localized Value";- KEY: 一个唯一的、描述性的字符串标识符(通常使用英文描述),用来在代码中引用这个翻译。
"welcome_message","login_button_title"。 - Localized Value: 该语言下对应的翻译文本,在
zh-Hans文件中:"welcome_message" = "欢迎!";
- KEY: 一个唯一的、描述性的字符串标识符(通常使用英文描述),用来在代码中引用这个翻译。
- 确保每条翻译都以分号结尾。
- 选中
-
在代码中使用
NSLocalizedString:
- 在需要显示本地化文本的地方,替换硬编码的字符串为:
let localizedText = NSLocalizedString("KEY", comment: "Optional comment for translators") - “KEY”:必须与
Localizable.strings文件中定义的键完全匹配。 - comment: 这个参数是可选的,但强烈建议提供,它为翻译人员提供上下文信息,说明这个字符串用在什么地方、有什么含义,有助于提高翻译的准确性,这个注释不会出现在最终的应用中。
- 示例:
button.setTitle(NSLocalizedString("login_button_title", comment: "Title for the login button on the home screen"), for: .normal)
label.text = NSLocalizedString("welcome_message", comment: "Welcome message displayed after login")
- 在需要显示本地化文本的地方,替换硬编码的字符串为:
动态语言切换 (进阶)
iOS系统默认遵循用户设备的全局语言设置,但有时应用需要提供应用内语言切换功能,实现此功能需要额外步骤:
-
监听语言变化: 你需要一种机制(如设置界面中的选项)让用户选择应用内语言。
-
自定义语言Bundle:
-
核心思路是覆盖
Bundle加载资源(包括字符串文件)的行为。 -
创建一个自定义的
Bundle子类,或者更常见的做法是创建一个Bundle扩展,重写localizedString(forKey:value:table:)方法。 -
在你的应用内存储用户选择的语言代码(如
zh-Hans,fr),并在自定义Bundle方法中优先使用这个存储的语言代码去查找资源。
-
示例(简化概念):
extension Bundle { private static var customLanguageBundle: Bundle? static func setLanguage(_ languageCode: String) { // 1. 存储语言代码到UserDefaults UserDefaults.standard.set([languageCode], forKey: "AppleLanguages") UserDefaults.standard.synchronize() // 立即保存 // 2. 找到对应语言的lproj路径 guard let path = Bundle.main.path(forResource: languageCode, ofType: "lproj") ?? Bundle.main.path(forResource: "Base", ofType: "lproj"), let bundle = Bundle(path: path) else { return } customLanguageBundle = bundle } override open func localizedString(forKey key: String, value: String?, table tableName: String?) -> String { if let customBundle = Bundle.customLanguageBundle { return customBundle.localizedString(forKey: key, value: value, table: tableName) } return super.localizedString(forKey: key, value: value, table: tableName) } } -
重要: 调用
Bundle.setLanguage("zh-Hans")后,需要强制刷新当前所有界面,这通常意味着需要重新初始化UI(例如重置Window的rootViewController),这部分的实现复杂度取决于你的应用架构。
-
进阶技巧与最佳实践
- 格式化字符串: 使用
String(format:...)配合NSLocalizedString,在Localizable.strings中,使用,%d等占位符。"time_remaining" = "剩余时间: %d 分钟";- 代码:
String(format: NSLocalizedString("time_remaining", comment: ""), minutesLeft)
- 复数处理: 使用
.stringsdict文件,创建Localizable.stringsdict(命名规则同.strings),它是一个XML/PLIST格式文件,可以定义不同数量下的复数形式规则,Xcode对.stringsdict文件也支持多语言本地化。 - 图片与资源本地化:
- 在Xcode的文件检查器中,选中需要本地化的图片或其他资源文件(如音频、视频、xib/nib)。
- 在”Localization”区域点击”Localize…”,选择基础语言并启用。
- 勾选需要支持的目标语言,Xcode会将这些资源复制到对应的
.lproj目录下,应用运行时,系统会根据当前语言环境自动加载对应目录下的资源。
- Xcode 导出导入 (
xcloc):- Xcode 提供了强大的导出导入功能,方便与翻译人员协作。
- 导出: 选择菜单栏
Product->Export Localizations...,Xcode 会将所有需要翻译的内容(.strings,.stringsdict, 界面文件中的字符串)打包成一个.xcloc文件(本质是文件夹),这个文件包含了源语言文本、注释、目标语言的占位符以及一些元数据。 - 翻译: 将
.xcloc文件交给翻译人员,他们可以使用Xcode(开发人员工具中)或其他兼容工具编辑里面的.xliff文件或直接在特定文件中翻译。 - 导入: 翻译完成后,选择菜单栏
Product->Import Localizations...,选择翻译好的.xcloc文件,Xcode 会将翻译内容合并回你的项目对应位置。
- 伪翻译(Pseudo-Localization): 在开发阶段使用伪翻译语言(如将所有字符替换为带重音的类似字符、添加前后缀
[]、拉长字符串)来测试UI布局是否能容纳不同长度文本,以及是否所有该本地化的字符串都已处理,可以在Scheme设置中添加伪语言环境进行调试。
测试与发布
- 模拟器/设备测试:
- 在Xcode Scheme设置中(
Product->Scheme->Edit Scheme...->Run->Options),修改Application Language选项,选择你想测试的目标语言。 - 运行应用,仔细检查所有界面的文本、图片、布局是否正确显示为目标语言。
- 特别注意:
- 字符串是否完整翻译?有无遗漏的键?
- 格式化字符串(日期、数字、复数)是否正确?
- 界面布局是否因文本长度变化而错乱?
- 动态语言切换功能是否正常工作?切换后界面是否即时刷新?
- 在Xcode Scheme设置中(
- 真机测试: 务必在实际设备上测试,特别是使用应用内语言切换功能时,将设备的系统语言设置为与应用内目标语言不同的语言,验证应用内切换是否生效。
- App Store Connect 配置: 在提交应用到 App Store Connect 时,你需要为应用支持的每种语言填写元数据(应用名称、关键词、描述、宣传文本、截图等),确保这些内容也准确翻译。
- 持续迭代: 应用更新添加新功能或字符串时,记得同步更新
Localizable.strings文件,并重新导出.xcloc文件进行翻译。
拥抱iOS多语言开发,不仅是对全球用户的尊重,更是应用增长的重要策略,扎实运用Localizable.strings和NSLocalizedString,善用Xcode工具,遵循最佳实践,你的应用就能自信地走向世界舞台,你在本地化过程中遇到过哪些印象深刻的挑战?或者有什么高效的本地化协作经验想分享?欢迎在评论区交流探讨!
原创文章,作者:世雄 - 原生数据库架构专家,如若转载,请注明出处:https://idctop.com/article/17911.html