语言本地化,又叫做语言国际化,是指根据用户操作系统的语言设置,自动将应用程序的语言设置为和用户操作系统语言一致的语言,这就要求应用程序所展示的文字、图片等信息,能够让使用不同语言的用户读懂、看懂,进而需要为同一个应用程序适配多种语言,我们日常使用的微信、支付宝等 App,都做了比较好的本地化,App 会根据系统的语言匹配合适的 App 内部语言,也可以直接在 App 内部切换成自己需要的语言,趁着自己项目里需要做本地化,本文就说说 iOS APP 如何本地化
配置需要本地化的准备
首先在工程里使用 Command + N
,选择 iOS -> Resource -> Strings File
,新建一个 Strings 文件,文件名最好命名为 Localizable
,
创建成功之后在工程里多了一个名为 Localizable.strings
的文件
接着选中 Localizable.strings
在 Xcode 右边 File inspector
中点击 Localize...
,在弹框中选择 English
点击 Localize
然后选中 project -> Info -> Localizations
,然后点击 +
,添加需要本地化的语言,如下图
本文以中文简体、中文繁体、韩语以及英文作为本地化的语言
添加完需要本地化的语言之后,可以看到 Localizable.strings
下面自动生成四个语言的文件
这里
Base
并没有勾选,其实我们新建一个工程项目,在项目目录里都可以看到有一个Base.lproj
文件夹,实际上我们项目创建默认使用的是Base
的本地化。这也是为什么每次创建项目Main.storyboard
会在Base.lproj
的文件夹中的原因,系统默认创建的一个英文本地化配置(里面有两个文件正好跟Base.lproj
中的对应,目前可以理解Base
也是英文的一种本地化,实际上如果我们勾选了Base
,再取消 Xcode 会建议我们把 Base 文件移动到英语本地化文件中),我们要做多语言的本地化,所以全部使用我们自己文件化文件,所以这里不勾选Base
接下来再新建一个 InfoPlist.strings
文件,方法和上面 Localizable.strings
一样,同样的右边勾选需要本地化的语言
本地化
上面的准备工作准备好之后就可以开始对项目进行本地化操作了
应用名称本地化
应用名本地化是指同一个 APP 在不同的语言的设备上显示不同的名称,例如:微信在中文环境中 APP 名称为 微信,在英语环境中名称为 WeChat,支付宝在中文环境 App 名称为 支付宝,在英语环境中名称为 AliPay
比如我的应用名称希望在中文环境名称为:国际化,英文环境名称为:Localization,在香港地区名称为:國際化,应用名本地化要用到 InfoPlist.strings
文件,我们只需要在对应的语言文件中添对应的名字
简体环境,在 InfoPlist.strings(Chinese(Simplified))
添加
|
|
英文环境,在 InfoPlist.strings(Chinese(Traditional))
添加
|
|
繁体环境,在 InfoPlist.strings(english)
添加
|
|
韩文环境,在 InfoPlist.strings(Korea)
添加
|
|
CFBundleDisplayName可以使用双引号,也可以不使用双引号!
这样就完成了 APP 名称的本地化,当你在设置里面切换到不同的语言之后,App名称就会显示为相对应语言的 APP 名了,实际上 InfoPlist.strings
还可以完成 Info.plist
文件里面的全部本地化,比如当 APP 要访问系统相册的时候,请求用户允许的时候,相关提示语也可以根据不同的语言环境进行不同的语言提示,有兴趣的可以自行尝试,本文就不做讲解了
代码中字符串的本地化
字符串本地化,就是指 App 内的字符串在不同的语言环境下显示不同的内容,比如:标题文字、按钮文字、提示框文字等
字符本地化和 App 名称本地化过程是一样的原理,只不过使用的文件不同,字符串本地化需要使用 Localizable.strings
,具体做法和在 InfoPlist.strings
本地化应用名是一样的
我们需要在 Localizable.strings
下对应的文件中,分别以 Key = Value
的形式,为代码中每一个需要本地化的字符串赋值,比如
在 Localizable.strings(Chinese(Simplified))
添加
|
|
在 Localizable.strings(Chinese(Traditional))
添加
|
|
在 Localizable.strings(english)
添加
|
|
在 Localizable.strings(Korea)
添加
|
|
在添加完上面的本地化字符串之后,回到代码中,在需要设置字符串的地方使用 NSLocalizedString(key: String, comment: String)
读取本地化字符串
|
|
代码中使用本地化字符串:
|
|
效果如图
图片本地化
本地化图片,有两种方式,第一种方式和本地化代码中的字符串一样,通过 NSLocalizedString(key,comment)
来获取相应的字符串,然后根据这个字符串再获取图片,这就需要每种语言环境下用不同名称命名一套图片
第一种方法
|
|
第二种方法
把一张图片拖入工程,比如 icon.png
,选中图片,右边File inspector
中点击 Localize...
,接着在弹框中选择 English
点击 Localize
,再把 icon.png
的 File inspector
的语言本地化全部勾选上
选择 icon.png
然后 Show in Finder
,会发现 en.lproj
、ko.lproj
、zh-Hans.lproj
和 zh-Hant.lproj
四个本地化资源文件夹里面各有一张 icon.png
的图片
然后根据我们需要把不同语言环境下的图片名称都改为 icon.png
,放入各自对应的本地化资源文件夹中,替换掉之前的 icon.png
,本地化代码和第一种方式是一样的
|
|
效果如图
我觉得第一种方式要更简单,我们只需要新建一个 strings
文件专门用来本地化图片字符串,这样也可以方便管理
XIB(Storyboard)本地化
使用 Xib 自定义一个 View,往里面拖一个 UILabel ,选中 Xib 文件,点击右边 File inspector
中的 Localize...
,然后把对应的语言本地化全部勾选包括 Base
这时可以发现,CustomView.strings
文件里面自动添加了类似如下的内容
|
|
然后和之前一样,在对应的语言本地化文件中修改我们要显示的本地化文字,修改好之后效果如下
以后在 Xib 文件的中添加 UI 控件时,这里的文件并不会自动更新,
我们就要自己找到新添加控件的 Object Id
, 就是上面类似 J7V-O2-VkG
这样的东西,在 Xib 选中相应的控件,然后右边Identity inspector
里面找 Object Id
,然后手动添加上述类似的代码
如果不想通过代码改 Xib 的本地化,选中 Xib ,在右边语言本地化的右边,选择 Interface Builder Cocoa Touch XIB
,此时选择的 CustomView.strings
就变成了 CustomView.xib
,这样相当于为每一种本地化语言生成了一个对应的 Xib
不过,最好是把 Xib 中的页面全部布局好了,再去做本地化,后续添加控件再去更新,Storyboard 的本地化和 Xib 是类似的就不再赘述
其他国际化
项目里可能还有音频文件、视频文件等资源文件需要国际化,这些文件一般是通过文件目录访问的,完全可以用不同名字去区分,根据语言环境对应的加载这些资源文件
以上就是开发中 iOS 开发中本地化的基本过程
2016/06/11 补充
补充一下本地化的测试相关内容,本地化要看效果每次都去设置里切换语言是在太累
在 Xcode 中,可以使用预览功能,在不运行应用的情况下,检测国际化和本地化的结果,选择一个 .storyboard
或 .xib
文件,打开辅助编辑器,在左边的弹出菜单中选择 Preview
,通过右下角语言选项,选择不同的本地化语言查看预览效果
预览过后,可以通过设置应用启动时的参数,在设备上测试国际化和本地化的结果,而不需要修改设备的设置。编辑 Scheme
,选择 Run -> Options
,在 Application Language
一项中,可以选择对应语言资源,这样就不用测试不同的语言都去设置里面修改了
另外如果你的项目使用 Auto layout
,可以选择 Double-Length Pseudolocalizations
,它会重复重复本地化字符串,更改视图的大小和位置
还可以用选择 Right to Left Pseudolocalizations
,测试从右往左书写的语言如阿拉伯语言的效果
勾选 Show non-localized strings
项,可以检测未本地化的文本,其会以大写形式显示
相关文章阅读:
About Internationalization and Localization
Testing Your Internationalized App
本人刚开始写博客,主要是为了给自己的知识点做一个笔记,方便自己以后查阅,如果能让别人有所启发也是荣幸之至!如有错误,欢迎指正!