iOS - 总结 - i18n 多语言设置

i18n(其来源是英文单词 internationalization的首末字符 i 和 n,18为中间的字符数)是 “国际化” 的简称。

场景

项目很旧,前段时间客户提出一些涉及很少改动功能的需求比如应用中显示的咨询热线号码,这才从服务器端开发思路中切换至 iOS 开发。

该项目同一套代码发布两个应用,分别被大陆、香港两个部门使用,支持中、英两种语言。我在项目中后期接手,当时语言管理未曾出问题,就集中精力开发新功能,交付客户后未曾收到客户使用体验不佳的反馈。

实现客户提出的微调需求后,本地测试正常,把生成的 xcarchive 压缩文件发给客户打包部署在测试环境,结果就引出了该篇笔记的整理。

系统语言设置为英文时运行正常,设置为简本中文时部分多语言标签直接显示原宏定义代码,刚开始以为打包时丢失了语言资源包,再在本地使用中文环境测试时重现了异常现象,真相就是代码不够健壮。

解决方案

项目中对多语言管理的不合理设置,

  1. Localizable.strings 列表

    Localizable.strings
        Localizable.string(Base) // 中文
        Localizable.strings(English)
    

    虽然 Base 存放的中文字符串中与英文配置中的字段一致,但不理解为何中文简体语言包使用 Base,至少也要再加上中文语言包后,让 Base 成为多个语言包中的默认语言。

  2. Info.plist

    仅设置了部署时使用的默认语言,但整体配置项却看得让人模棱两可。

    Localization native development region: China
    

    不知为何能在这个节点中选择瓷器,当然可以强制手工输入,同时也未设置 Localizations 节点,是支持所有语言呢还是仅默认语言,无论哪种都不是期望的效果。

其实想整理的调试思路并不清晰,因为是在摸索中配置的。最后调试正常后项目中的配置选项都是清晰明了的,运行结果也是预期的,心中才感觉些踏实。

整个流程并非全是顺序,有时需要迂回着配置。

  1. 添加新语言

    模块跳转: Project Navigators - PROJECT 项目名称 - info - Localizations

    添加中文简体语言 Chinese (Simplified)(zh-Hans),从 Base 中导入,完成后会生成语言包文件 项目名称/zh-Hans.lproj

    删除 Base 语言包,回想起来感觉此操作有些多余,甚至不建议删除它。

    iOS - 总结 - i18n 多语言设置_第1张图片
    新建语言包
  • 设置项目使用的语言名称列表

    选中 Localizable.strings 文件后(其实它是虚拟节点),菜单项逐层点击 View - Utilities - Show File Inspector,在文件属性列表中设置 Localization,取消勾选 Base,添加勾选 Chinese (Simplified)

    iOS - 总结 - i18n 多语言设置_第2张图片
    设置使用那些语言包
  • 设置项目支持的语言列表,及默认语言

    在 Info.plist 文件配置项中设置两处:

    • 添加 Localizations 属性为 Array, 添加 English/Chinese (Simplified) 两个子节点。
    • 设置 Localization native development region 节点值为 en
    iOS - 总结 - i18n 多语言设置_第3张图片
    应用支持的语言列表及默认语言

项目支持两种语言,默认为英文。

乱又不乱

  1. Info.plist 配置 (扣环)

    主要涉及下面两个选项,感觉 Info.plist 的重要性比较虚,像手枪的扣环,但子弹未上膛把环扯断了也无用。

    Localization native development region
    Localizations
    
  2. 语言语言包的增加、删除(子弹)

    快捷键 Command + 1 或 菜单项逐层点击 view -> Navigators -> Show Project Navigators

    然后在属性列表 Project - info - Localizations 模块中查看已经存在的语言包列表。

    下面的加减号可增加删除,不可以修改,但可以通过删除、增加变相的实现修改效果。

    上述操作在项目中手工添加的语言包列表,并不会起作用,即系统语言切换时而项目就瞎了。

  3. 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 整个开发框架很稳定,跌代升级很合理。

iOS - 总结 - i18n 多语言设置_第4张图片
Xcode version

最后说一下为何语言管理不当出现满屏的宏定义代码字符,下面是懒人操作:

NSString* t(NSString *key) {
    return NSLocalizedString(key, key);
}

_popupText = t(@"LOGIN_JUMP_TO_SSO");

参考

  • Xcode7 本地化的一些处理方式
  • iOS 国际化多语言设置 xcode7
  • 151228 Xcode7 本地化
  • 请教如何添加localizable.strings本地化
  • iOS Xcode配置文件之Strings File文件

你可能感兴趣的:(iOS - 总结 - i18n 多语言设置)