i18n(其来源是英文单词 internationalization的首末字符 i 和 n,18为中间的字符数)是 “国际化” 的简称。
场景
项目很旧,前段时间客户提出一些涉及很少改动功能的需求比如应用中显示的咨询热线号码,这才从服务器端开发思路中切换至 iOS 开发。
该项目同一套代码发布两个应用,分别被大陆、香港两个部门使用,支持中、英两种语言。我在项目中后期接手,当时语言管理未曾出问题,就集中精力开发新功能,交付客户后未曾收到客户使用体验不佳的反馈。
实现客户提出的微调需求后,本地测试正常,把生成的 xcarchive 压缩文件发给客户打包部署在测试环境,结果就引出了该篇笔记的整理。
系统语言设置为英文时运行正常,设置为简本中文时部分多语言标签直接显示原宏定义代码,刚开始以为打包时丢失了语言资源包,再在本地使用中文环境测试时重现了异常现象,真相就是代码不够健壮。
解决方案
项目中对多语言管理的不合理设置,
-
Localizable.strings 列表
Localizable.strings Localizable.string(Base) // 中文 Localizable.strings(English)
虽然 Base 存放的中文字符串中与英文配置中的字段一致,但不理解为何中文简体语言包使用 Base,至少也要再加上中文语言包后,让 Base 成为多个语言包中的默认语言。
-
Info.plist
仅设置了部署时使用的默认语言,但整体配置项却看得让人模棱两可。
Localization native development region: China
不知为何能在这个节点中选择瓷器,当然可以强制手工输入,同时也未设置
Localizations
节点,是支持所有语言呢还是仅默认语言,无论哪种都不是期望的效果。
其实想整理的调试思路并不清晰,因为是在摸索中配置的。最后调试正常后项目中的配置选项都是清晰明了的,运行结果也是预期的,心中才感觉些踏实。
整个流程并非全是顺序,有时需要迂回着配置。
-
添加新语言
模块跳转:
Project Navigators
-PROJECT 项目名称
-info - Localizations
添加中文简体语言
Chinese (Simplified)(zh-Hans)
,从 Base 中导入,完成后会生成语言包文件项目名称/zh-Hans.lproj
。删除 Base 语言包,回想起来感觉此操作有些多余,甚至不建议删除它。
新建语言包
-
设置项目使用的语言名称列表
选中
Localizable.strings
文件后(其实它是虚拟节点),菜单项逐层点击View
-Utilities
-Show File Inspector
,在文件属性列表中设置 Localization,取消勾选 Base,添加勾选Chinese (Simplified)
。设置使用那些语言包
-
设置项目支持的语言列表,及默认语言
在 Info.plist 文件配置项中设置两处:
- 添加
Localizations
属性为 Array, 添加English/Chinese (Simplified)
两个子节点。 - 设置
Localization native development region
节点值为en
。
应用支持的语言列表及默认语言
- 添加
项目支持两种语言,默认为英文。
乱又不乱
-
Info.plist 配置 (扣环)
主要涉及下面两个选项,感觉 Info.plist 的重要性比较虚,像手枪的扣环,但子弹未上膛把环扯断了也无用。
Localization native development region Localizations
-
语言语言包的增加、删除(子弹)
快捷键
Command + 1
或 菜单项逐层点击view
->Navigators
->Show Project Navigators
然后在属性列表
Project
-info
-Localizations
模块中查看已经存在的语言包列表。下面的加减号可增加删除,不可以修改,但可以通过删除、增加变相的实现修改效果。
上述操作在项目中手工添加的语言包列表,并不会起作用,即系统语言切换时而项目就瞎了。
-
Localizable.strings
不要妄图对它操作 (弹夹)Localizable.strings Localizable.string(Chinese (Simplified)) Localizable.strings(English)
它就像个影子,想通过对它修改语言包名称或试图右键添加都会让人败兴而归,但它的作用绝非摆设,只有定位到机关位置才能找到投射影子的主角。
选中它, 快捷键
Command + Alter + 1
或 菜单项逐层点击View
-Utilities
-Show File Inspector
,在属性列表Localization
模块中会看到手工添加的语言包列表,把想支持的语言包打上勾,这样 Info.plist 中的设置才会起作用。
没有子弹是绝对不行的,子弹再多只有放入弹夹才能上战场,最后扳动扣环让子弹飞一会儿杀敌于无形。
想法
Xcode 过于强大,之前只会使用快捷键,发现菜单项、布局按钮都设计的清晰合理,操作起来非常顺手。只会使用快捷键的后果是成为了哑巴,某些模块不知道叫什么名称。
在查询资料时总结解决方案的回答中涉及到 Xcode 版本从 4.*
到 7.*
,解法大致相同,不得不说 iOS 整个开发框架很稳定,跌代升级很合理。

最后说一下为何语言管理不当出现满屏的宏定义代码字符,下面是懒人操作:
NSString* t(NSString *key) {
return NSLocalizedString(key, key);
}
_popupText = t(@"LOGIN_JUMP_TO_SSO");
网友评论