1、介绍
国际化(Internationalization)是指应用程序在运行的时候,可以根据客户端请求来自的国家/地区,语言的不同而显示不同的界面。根据用户的语言设置,展示不同的应用程序名称,不同的图片,应用的描绘语言。
1.1、iOS本地化的思路
把程序的标签,提示信息,图片等(所有的包含文字的内容)放在一个资源文件夹中,程序需要支持哪些国家,语言环境,就提供对应的资源文件。
NSLocale:特定的国家区域的语言环境。
NSLocale *local = [NSLocale currentLocale];//获取当前的语言环境
NSString *string = local.localeIdentifier; // 获取当前的应用程序的语言
NSLocalizedString(<#key#>, <#comment#>):根据key来获取国际化的语言设置信息。
为了实现本地化,必须提供程序所需要的资源文件。资源文件的内容是很多的键值对(key-value),其中key是程序编写时需要使用到的,value是应用程序界面展示时便显出的内容。
资源文件的名称通常是localizable.strings.
1.2、本地化文件夹
本地化文件夹的命名有着严格的规范,本地化文件夹一般有两种形式。(创建项目之后,打开项目工程在finder中显示,都会有一个Base.lproj文件 里面包含launch 和main的故事板)。在iOS系统中,简体中文的代号是zh-Hans。繁体中文的代号为zh-Hant。英文的代号为en。
1、langauge-country.lproj
2、langauge.lproj
语言和国家/区域都是不可变的,必须是iOS支持的语言。
注意:Base.lproj是一个典型的本地化文件夹,只不过它为所有的语言提供环境提供服务,所以它是所有的语言环境最后的选择。Base.lproj文件夹下默认保存了Main.storyBoard文件。主故事板可以为所有语言环境提供界面。
查看国际上不同国家和语言的编码网址
获取iOS支持的所有语言和国家,需要通过NSLocale的availableLocaleIdentifiers类方法获取。这个方法返回一个NSArray集合,然后遍历这个集合来获取iOS支持的NSLocale的标识字符串。
//获取所有的本地化标识字符串
NSArray *locale = [NSLocale availableLocaleIdentifiers];
for (NSString *locl in locale) {
NSLog(@"%@",locl);
}
运行结果(部分打印结果):
2、应用程序的本地化主要包括应程序名称本地化,storyBoard本地化,图片本地化,字符串本地化。
2.1应用程序名称本地化
Bundle name 简单来说就是 App 安装到 iOS 机子里的 App 文件夹名。
Executable name – 执行程序名,默认与 PRODUCT_NAME 一致。
Bundle display name – 真正显示到用户屏幕上的 App 名称。
在模拟器/真机上显示的名字是由Bundle Display Name决定的。默认情况下Bundle Display Name就等同于Product Name。
Bundle name – is folder name, where your app (including executable file and all resources) will be stored (Cool Program.app). Executable name – is a program binary name, i.e. Cool Program.app/CoolProgram Bundle display name – is what will be shown on iPhone screen, for example Cool Prog (since Cool Program probably will not fit on Springboard). And, Apple claims, that Bundle Display name must correspond to Bundle name, i.e. you cannot use bundle name TheApplication, and bundle display name Something Other
在部分情况下如果Product Name为中文字符,会导致编译运行在真机时,第一次必报 Could not inspect the application package. 错误,这个可以参考《使用 Xcode6 在 iOS8 设备上调试报错 Could not inspect the application package》。
2.2注意:
遇到了这种情况,将Product Name设置成为了英文名,而将Bundle Display Name设置为中文名。
参考stackOverFlow:Bundle Name, Executable Name, Product Name…anything else?
2.3实现步骤。
2.3.1、打开Xcode, 选中项目文件夹下的project图标,再选中文件Dock目录中的project图标。
2.3.2、选中project面板上的info选项
2.3.3、选择简体中文Chinese(Simplified,China)(zh-Hans-CN)
2.3.4、在Xcode界面上使用快捷键 Command + N 新建文件 Resource中选择 Strings File
2.3.5、命名为 InfoPlist.strings,然后创建。(即为项目添加一份本地化资源文件)
2.3.6、选中InfoPlist.strings文件,打开Xcode家岔气面板,找到其中的Localization选项。
2.3.7、选中Chinese(Simplified,China)添加中文的本地化(选中English添加英文的本地化)
2.3.8、选中检查面板的Localization,勾选☑️Base既可以添加Base的本地化文件。(勾选☑️English既可以添加English的本地化文件。)
2.3.9、选择Xcode的info.plist ,显示原始键值对(Show Raw Keys/Values)
2.3.10、在English的InfoPlist.strings文件中,配置 CFBundleDisplayName
CFBundleDisplayName = "locale"; // 一定要设置分号 并且不要在字符串前面添加@符号
2.3.11、在Chinese(Simplified,China)的InfoPlist.strings中配置CFBundleDisplayName
CFBundleDisplayName = "本地化"; // 一定要设置分号 并且不要在字符串前面添加@符号
如果模拟器的语言设置是英文,将会看到应用的显示名称为“Locale”。语言设置为简体中文是,将会看到应用的显示名称为@"本地化"。【模拟器的Home键--->command + shift + H返回到应用程序列表。设置(Settings)----》通用(Gneral)------》语言和区域(Langauge and Rigion)--------》区域(Rigion) -------》对应的语言------》Done(确定)】。模拟器在运行时可能看不到最新的应用名称,这是因为模拟器有时候会缓存一些信息。这就需要我们把模拟器上已经运行的应用程序卸掉【选中模拟器中应用程序图标,长按,点击应用程序图标左上角的❌】,重新运行一次。
3、图片的本地化
3.1、拖入一张照片到iOS项目中。(需要☑️Copy items if needed 和 Create groups 还有Add To Targets)
3.2、在项目中选中图片,打开Xcode右侧的文件检查面板,找到其中的Localization选项。
3.3、在对应的对话框中选择Chinese(Simplified,China),那么图片会被添加到zh-Hans-CN.lproj文件夹中。
3.4、同理把对应的图片(英语语言的图片、基础语言的图片(中文的应用程序就选择中文的图片))添加到对应的本地化文件夹中。(XXXX.lproj文件夹)
需要注意的是图片的名称需要时相同的。
4、文本的本地化(字符串的本地化操作)
4.1、和之前创建InfoPlist.strings文件相同,不同的是文件名称为Localizable.strings。
补充:也可以通过genstrings命令来生成资源文件,这种方式创建的资源文件会自动包含应用程序需要用到的所有的key【启动OS X系统的终端窗口,使用cd命令进入到iOS项目所在目录执行这个命令。】
Objective-C语言使用 genstrings *.m
命令
swift语言使用 genstrings *.swift
命令
4.2、分别对应的文件夹中写入对应的文本内容。注意,zh-Hans-CN.lproj和en.lproj两个文件中的key需要保持一致。
/*
Localizable.strings
名称本地化
Localizable.strings(Chinese(Simplified))
*/
"loacl" = "我们 我们都是好孩子";
/*
Localizable.strings
名称本地化
Localizable.strings(English)
*/
"loacl" = "Hello! we are good boys";
4.3、获取key所对应的内容。【在这里key最好定义成一个宏,避免在书写的时候出现错误】
self.iconView.image = [UIImage imageNamed:@"1.png"];
self.nameLabel.text = NSLocalizedString(@"loacl", @"这是一个注释的内容");
注意:当故事板是以Main.strings的样式展示的时候需要选择Main.storyBoard的格式才会正常显示。
解决办法