首先问一个弱弱的问题,在项目开发过程中,哪些内容需要国际化?App中出现的所有文本内容本文吗?非也非也。
本文将以适配中文和英文为例,分为四个部分来介绍国际化的实现。
1.哪些内容需要国际化?
首先来说开头提到的看似弱弱的问题。乍一看,你一定会觉得不就是所有的文本内容吗?非也。举个栗子:比如你要发一条微博,文本内容包括:用户名,XX分钟前,来自XX设备,正文内容。仅这四个对象,你觉得哪几个需要适应用户的语言呢?用户名,显然不需要翻译,我给自己起名叫二狗子,你给我翻译成 The second son of dog,你觉得合适么?XX分钟前,"分钟前"就是一个需要翻译的内容。同样,来自XX设备的“来自”也需要翻译,而XX设备则是获取的动态数据,不需要翻译,当然也不是所有的动态数据都不需要翻译,这个就要根据各自项目视不同情况而定了。正文内容,与用户名同理,比如我是个泰国人,我发个“萨瓦迪卡”,你给我翻译成“你好”,我反而看不懂了。这一段话写的稍显啰嗦,总结起来就一句话:固定文本内容一般需要翻译,动态数据要视情况而定,另外,项目名称依据实际需求而定。
2.需要哪些类,文件,配置作为支持?
- 类:皮肤管理者类,继承自NSObject
-
文件:Strings File如图
3.各个文件,类之间如何配合?
- 皮肤管理者类会包含三个方法供外部调用。
一、生成单利+ (instancetype)sharedInstance;
二、获取文本内容+ (NSString *)localizedStringWithKey:(NSString *)key;
三、切换语言+ (void)changeLanguage;
注意,正式项目中该方法会根据实际需求有所变化,在该例中仅做简单的中英文互相切换。
下面来具体说说,单利方法自不必多说。主要讲最核心的方法+localizedStringWithKey:它的内部是这样的
方法一共有四行代码
第一行[self currentLanguage] 会获取本地偏好中保存的当前语言,比如英文返回en,中文返回zh-Hans。获取这个值的目的是选择下图中红色标注的路径:
en.lproj中会保存 英文环境需要的strings文件。zh-Hans.lproj中则保存中文环境需要的stings文件。strings文件内部是这样的:
这个文件中每一行可以写一对 键值对, = 前面的是键(切换语言),= 后面的是要显示在界面上的值(language)。
第二行就是获取到当前语言环境的路径了。
第三行[[NSBundle bundleWithPath:lPath] localizedStringForKey:key value:nil table:@"Localizable"]
则是根据第二行获取到的路径再根据 刚才我们提到的=前面的键 比如“切换语言”,以及文件名字"Localizable" 获取到我们最终要在界面上显示的内容,就是前面说到的 =后面的值。
所以,外部的实例通过调用语言管理者的localizedStringWithKey:
方法,传入key(比如:传入切换语言),就能得到英文环境下要显示的内容:language,中文环境下则是:切换语言。
4.总结
通过上面的描述可以看到,国际化的核心在于
[[NSBundle bundleWithPath:lPath] localizedStringForKey:key value:nil table:@"Localizable"]
这个方法以及Localizable.strings文件。我们在切换语言时,仅仅是在本地偏好中保存了一个字符串,en或者zh-Hans,而最终显示的内容要依赖于我们在Localizable.strings文件中写的内容,以及NSBundle加载哪个路径的strings文件。
如果有不妥之处,欢迎指正补充。谢谢。