一、应用程序国际化
包括app名称和各种权限的提示文字。
1.1 创建工程,再在“PROJECT”的“Info”里面,添加所需语言。
1.2 从代码中分离出文本
创建一个 “.strings” 扩展名的文件
来本地化字符串,需要把这些字符串全部放在一个单独的文件中。它将会在包中简单地引用这些字符串,而不是在实现、使用的方法中进行硬编码。
Xcode使用带有 “.strings” 扩展名的文件来存储和检索 程序中使用的所有字符串,以及支持的每种语言。根据iOS设备当前所使用的语言,在代码中一个简单的方法调用将会查找并返回符合设备语言要求的字符串。点击右键,选择“New File…”,选择“iOS”对应的“Resource”中的“Strings File”,如图:
点击“Next”,为文件命名为InfoPlist.strings,然后点击“save”。
1.3 添加语言
创建完“InfoPlist.strings”(命名随意~),工程目录结构文件如下,单击“InfoPlist.strings”,查看右边的属性,在Localizable栏添加语言。如图:
添加之后,效果如下:
这个时候就可以在对应语言的“InfoPlist.strings”文件中,添加所支持的字符串了。
中文对应的文件里添加:
"CFBundleDisplayName" = "App名字";
"NSCameraUsageDescription" = "App 需要访问您的相机来扫描二维码绑定设备";
"NSContactsUsageDescription" = "App 需要访问您的通讯录来实现通讯录备份";
"NSPhotoLibraryAddUsageDescription" = "App 需要访问您的相册来保存图片或视频";
"NSPhotoLibraryUsageDescription" = "App 需要访问您的相册来发送图片或扫描二维码";
"NSLocationWhenInUseUsageDescription" = "App 需要您允许定位以把位置保存到照片中";
英文对应的文件里添加:
"CFBundleDisplayName" = "=App Name";
"NSCameraUsageDescription" = "App needs access to your camera to scan QR code binding devices";
"NSContactsUsageDescription" = "App needs to access your address book to achieve address book backup";
"NSPhotoLibraryAddUsageDescription" = "App needs access to your photo album to save images or videos";
"NSPhotoLibraryUsageDescription" = "App needs to access your photo album to send pictures or scan QR code";
"NSLocationWhenInUseUsageDescription" = "App requires you to allow positioning to save the location to the photo";
二、内容国际化
2.1 创建一个“Localizable.strings” 文件
创建一个“Localizable.strings” 文件(点击右键,选择“New File…”,选择“iOS”对应的“Resource”中的“Strings File”)。
注意:Localizable.strings 是系统默认名字,不能更改。
2.2 添加内容
添加语言在Localization.strings 中,按照"key" = “value"的格式。在使用时,用NSLocalizedString(@“key”, @”")读取内容。
Localization.strings (English)文件中,添加:
"第一!绝对不意气用事!" = "The first!Absolutely not impulsive!";
"第二!绝对不漏判任何一件坏事!" = "The second!Definitely not missing any bad thing!";
"第三!绝对裁判的公正漂亮!" = "The third!Absolutely the referee just beautiful!";
Localization.strings (Chinese)文件中,添加:
"第一!绝对不意气用事!" = "第一!绝对不意气用事!";
"第二!绝对不漏判任何一件坏事!" = "第二!绝对不漏判任何一件坏事!";
"第三!绝对裁判的公正漂亮!" = "第三!绝对裁判的公正漂亮!";
如图所示:
调用:
NSString * label_Str1 = NSLocalizedString(@"第一!绝对不意气用事!", nil);
NSString * label_Str2 = NSLocalizedString(@"第二!绝对不漏判任何一件坏事!", nil);
NSString * label_Str3 = NSLocalizedString(@"第三!绝对裁判的公正漂亮!", nil);
NSString * label_Str = [NSString stringWithFormat:@"%@\n%@\n%@",label_Str1,label_Str2,label_Str3];
UILabel * label = [[UILabel alloc] initWithFrame:CGRectMake(10, 240, self.view.frame.size.width, 120.f)];
label.text = label_Str;
//自动换行
label.numberOfLines = 0;
[self.view addSubview:label];
优化: 在pch头文件中,定义一个国际化对应的宏!
//宏定义国际化字符
#define NSLocalString(a) (NSLocalizedString(a, nil))
使用:
NSString * label_Str1 = NSLocalString(@"第一!绝对不意气用事!");
判断支持的语言、当前语言:
NSArray *languages = [NSLocale preferredLanguages];
NSLog(@"支持的languages:%@",languages);
NSString *currentLanguage = [languages objectAtIndex:0];
NSLog(@"当前语言currentLanguage:%@",currentLanguage); //日语:ja-CN、法语:fr-CN、fr-CA
三、多语言文件编译报错
项目实现国际化功能,编译时遇到错误,read failed: Couldn’t parse property list because the input data was in an invalid format。
3.1 问题分析
数据格式错误一般会有下面几种情况:
末尾少了分号
字符使用了全角字符(中文字符)
中间少了 =
少了双引号或者引号没有成对出现
文本中出现了不必要的特殊字符
这是个小问题,主要看怎么快速查找出问题,下面给出三种方法
3.2 问题解决
3.1 肉眼检索
最简单最直接的方式,肉眼检索,找到问题改正。
这种方式一般适用于文件小,内容少的情况。
如果内容多,有十几个国家的翻译文件,这种方法显然不合适。
3.2 减半筛查
把翻译文件中的内容每次注释掉一半,再编译,如果没有报错,问题就出现另外一半。将另外一半再注释掉一半,再编译,如此重复也能快速的排查出问题所在。
3.3 借助工具 Localizable (付费)
Localizable 是 Mac 上的一款桌面工具,在商店搜索 Localizable 就可以找到,使用方式也很简单,只需要将 Localizable.strings 文件拖到对应区域就可以,然后会反馈哪一行格式有问题,对应解决就好,非常方便。