首先要了解本地化和国际化的概念有很多人将这两者概念混淆。
本地化是将应用翻译成多种语言的过程。但在本地化之前需要将应用国际化,国际化是让应用能够适应不同的语言,地区和文化的过程。国际化有两个概念需要说明一下,一个是语言,一个是区域。
区域:每个区域(例如美国,中国,西班牙)文化和习俗都不一样,如果过开发一款应用需要显示时间,那么中国人习惯看的时间是这样
上午 9:40
,而美国人习惯看时间是这样9:40 AM
。显示的位置有区别。所以开发应用时显示时间需要对中国
和美国
这两个区域进行差异化区分,再有一个例子,我们阅读习惯和输入习惯是从左向右,而阿拉伯语与我们阅读习惯刚好相反是从右向左,因为阿拉伯语是从右向左的语言。故如果支持应用阿拉伯语那么也需要进行差异化区分。语言:语言和区域是多对多的,多个区域可能使用一种语言(美国,英国),一个区域可能使用多种语言,我们现在基本上都是双语了(中文,英文)。所以我们的应用也要能够根据使用的语言不同显示不同的语言。
故可以看出本地化只是国际化一部分,一般本地化的工作交付给专门的本地化团队去做,我们需要做的是根据用户语言区域不同所对应的数据显示差异,布局差异等相关支持。
在我们手机里有相关的语言和地区的选择。例如:en-GB
,en-IN
。前半部分代表使用语言,后半部分代表所属区域。en-GB
是English(United Kingdom)缩写。en-IN
是English(India)缩写。所以我们根据用户所选的区域在应用中需要进行差异化显示,然后在应用中支持用户所选的语言。
我们再看一个例子,在iOS系统中自带的日历应用看其是怎样进行国际化的:
这个是显示上的差异化再看一个布局上差异化的例子,还是同样的应用:
下面我们按照步骤一步一步让应用支持国际化。
启用基本的国际化支持
如果我们应用要支持国际化那么需要在项目中进行如下设置
- 在Xcode中选中PROJECT,并且在info选项卡的下面勾选
Use Base Internationalization
。最新的Xcode是默认勾选的可以看见默认的开发语言是English。
- 在
Localizations
下面添加需要支持的语言。
- 这里我们选择Chinese(Simplified)与Japnese两种语言如下图。默认都选上需要国际化的storyboard与xib资源文件。选好如下
这样我们发现在项目导航我们选中的资源文件下都有以.string
结尾的字符串文件。这个就是我们进行本地化的文件。目前还什么都没有。然后我们进行下一步操作。
本地化
因为本地化用storyboard和xib创建的界面与本地化代码中创建的界面有些区别。所以这里我们分别介绍如何本地化storyboard和xib和如何本地化代码。
初始化storyboard与xib文件
首先明白我们要使用Autolayout来进行布局,不应该把视图的尺寸固定,因为不同的语言表达一样的意思需要的字符串长度也不一样。我们在Main.storyboard上放置几个Lable并加以约束,如下:
上面是三个Label每个Label都加了约束,上边距固定并水平居中,Label上的文案是用默认的开发语言书写,所以我们只要本地化中文
和日文
即可。这里目前本地化相关的字符串文件还空的。
本地化代码
本地化代码需要使用下面的宏定义。
NSLocalizedString(@"this is my blog", @"介绍");
本地化的字符串文件都是以key-value
形式存在的。以中文本地化文件为例,如下所示
"this is my blog" : "这是我的博客"
在NSLocalizedString
这个宏中,第一个参数是对应的key,如果语言环境是中文那么就会查找中文对应的字符串文件里是否有这个key。如果有那么显示对应的vaule。如果没有对应语言环境的字符串文件或者字符串文件没有相关的key的话,那么就会显示key的值。第二个参数用来表述说明这个key值的,具体在导出字符串文件会用到。
我们不在代码中单独创建一个视图来显示本地化的字符串,简单一点直接打印出来,在Main.storyboard
文件对应的源文件中写如下代码:
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
NSLog(@"%@",NSLocalizedString(@"this is my csdn's name", @"介绍"));
NSLog(@"%@",NSLocalizedString(@"my csdn's name is GGGHub", @"说明"));
}
这里我们前期工作做完了,项目中只有一开始对应.storyboard生成的字符串文件。并且里面什么都没有。下面我们开始本地化我们的应用。
本地化应用
具体本地化的流程如下:
将字符串文件导出为标准XML本地化交换文件格式(XLIFF)。 将XLIFF文件提交给本地化团队,以翻译成多种语言。 在等待翻译的同时继续开发您的应用。 将XLIFF翻译导入到项目中并使用您添加的每种语言测试应用程序。 根据需要重复该过程。下面我们导出相关的本地化文件:
1. 选中PROJECT并且在上方的菜单栏中选择Editor-> Export For Localization
2. 可以指定要导出的本地化文件
3. 导出的本地化文件如下
4. 我们使用相关的工具打开并本地化相关的字符串。这里我是用的XLIFFTool在App Store上是免费的应用。我们打开其中一个显示如下:
其中第二行是storyboard中需要本地化的字符串,第三行是本地化应用的名称。第三行是代码中NSLocalizedString
宏本地化的字符串。依次填写,并且将所有的语言的xliff文件填写完成我们这里只有中文对应的zh-Hans.xliff与日文对应的ja.xliff。如下:
- 填写完成之后将这两个文件导入Xcode中:选中PROJECT并且在上方的菜单栏中选择
Editor-> Import Localizations
- 这是我们发现项目里多出了两个文件如下:
其中Localizable.string
对应代码里用NSLocalizedString
宏声明的本地化字符串。
InfoPlist.string
文件包含应用和公司的属性该字符串文件允许选择本地化信息属性列表中的某些属性值,例如应用程序名称(包显示名称)和版权声明。具体字段信息需要参考官方文档这里我们知道了应用显示名称的属性。
这是我们查看storyboard中对应的字符串文件发现里面有了相关本地化的信息。这是本地化工作基本上完成了。
本地化调试
storyboard和xib本地化调试
- 选择Assistant Editor后选择Automatic,在弹出的菜单中选择最后的一个Preview选项
- 在右下角可以选择语言预览,如图
代码调试
在Edit Scheme中可以设置调试相关的信息,比如自动布局,从右向左显示,缺失的本地化信息等等。
运行应用
我们切换到日语的环境运行应用,模拟器显示如下:
控制台输出:
其他
这样本地化工作已经做完了,如果想要看实际展示效果需要运行应用并且切换到不同的语言环境下。上面还说道不同地区习惯不同一些数字,日期,姓名可能在不同地区展示不太一样,这样需要用到Formatter。系统自带的Formatter如下所示
- DateFormatter
- PersonNameComponentsFormatter
- ByteCounyFormatter
- DateComponentsFormatter
- DateIntervalFormatter
- NmuberFormatter
- MeasurementFormatter
具体的用法请查看相关的文档。本文参考了苹果官方文档Internationalization and Localization Guide