在学习iOS的国际化以前,我有想过,假如多国语言化的全部工作都由我自己来做,该怎么做?
首先,所谓的国际化,无非是针对界面上显示给用户看的内容,按照用户设定的语言类型来显示不同的字符串。在此之前,我写过一个GO语言的Web项目,由于目前GO并没有相对成熟的类似Java的i18n框架,所以我只能全部自己动手来做。
我的构想是,在界面上,用户可以选择所需要显示的某个语言,然后将此选择保存到后台的用户设置偏好里,假定此设置language字段可以为cn和en(中文和英文),每次用户请求得到的页面,可以按照此项设置去查找相应的界面显示字段,进行显示,这些字段的映射当然采用Key-Value的形式,可是Key-Value怎么存储呢?如果字段数据量很大,可以选择配置在静态的配置文件里或者数据库里,如果比较少的话也可以使用某个静态类,然后在生成动态页面时,按照对应的Key,根据language字段的选择,索引出对应的界面显示值,放到界面上显示出来。
按照这个思路,最后算是实现了。
因为iOS本身已经有了比较好的静态字符串Key-Value存取框架,所以我们需要做的,其实只需要借用框架填充我们需要进行国际化处理的内容就可以了。比较普遍的做法就是创建注入InfoPlist.strings文件和Localization.strings或者其他自定义的strings文件,XCode提供了及其方便的语言选择和索引读取对应的Key-Value的方法,不需要我们自己写,这一部分,网上有很多人都写了使用方法,假设某个用户选择了中文作为语言偏好,那么就去对应的中文偏好国际化文件,如Localization.string(zh-CN)文件中查找出某界面上显示对应Key的Value,放到界面上即可。
另一方面,我尝试过直接使用自定义的plist来存储和数据库来存储,这当然是可以的,只需要在对应的plist文件里或者数据库表中写好对应的Key和Value,然后自己写读取的方法进行读取。
综合起来说,自己写plist封装和使用iOS已有的机制其实都很简单,这类似于静态文件的读取,数据库的相对而言会稍微复杂一点,当然实际上因为不怎么方便和不实用,也不建议使用数据库存储的方式。总结起来,其实国际化的实现思路还是比较简单的,按照当前系统/用户选择的语言偏好,去对应的语言设定的Key-Value存储文件/数据库查找出对应的值,然后显示在界面上即可。