Xcode - APP语言国际化
前言
1 - 语言国际化又叫做语言本地化。是指根据用户操作系统的语言设置,自动将应用程序的语言设置为和用户操作系统语言一致的语言
2 - 语言国际化:APP 名称国际化; 代码字符串国际化; 图片国际化; storyboard/xib 国际化;
如何让实现语言本地化
1 - 首先要配置需要国际化的语言:这是国际化之前的准备工作,一个项目中需要且仅需要配置一次
① 在 Project/Info/Localizations 选项中点击 + 添加需要国际化的语言(默认勾选 Use Base Internationalization)
② 添加需要国际化的语言:日语
2 - 应用名称本地化。是指同一个 APP 的名称在不同的语言环境下显示不同的名称
① 新建 Strings File(iOS/Resource/Strings File),文件名字命名是 InfoPlist 且必须是这个名字
② 选中 InfoPlist.strings 后在右侧文件检查器中选择 Localize。目的是选择我们需要国际化的语言(默认勾选英语):日本语
③ 现在查看左侧目录下的 InfoPlist.stirings 文件,它就多了一个箭头。展开如下
注:程序启动时会根据操作系统设置的语言自动加载 InfoPlist.strings 文件下对应的语言文件,然后显示应用程序的名字
④ 在不同语言对应的 InfoPlist.strings 文件中设置相应的APP名字即可
// 英语文件
CFBundleDisplayName = "English Name";// CFBundleDisplayName 可以使用双引号,也可以不使用
// 日语文件
"CFBundleDisplayName" = "にほんご";
⑤ 现在修改模拟器语言环境为日语,重新启动 APP
注:过去国际化 APP 名称时,需要在 Info.plist 文件中增加一个名为 Application has localized display name 的 BOOL 类型的 Key 且要将其值置 YES,如今可以忽略
3 - 代码字符串国际化:字符串国际化就是指 APP 内的字符串在不同的语言环境下显示出其对应的语言
① 字符国际化和 APP 名称国际化过程如出一辙,只是创建的文件名成不一样:文件名必须是 Localizable.string。新建文件和添加需要国际化的语言步骤不再展示,直接看如下结果
② 分别在不同的 Localizable.strings 文件中以 Key-Value 的形式,将代码中每一个需要国际化的字符串赋值
// 英语文件 "下一页" = "Next Page";
// 日语文件 "下一页" = "じよう";
③ 最后要在需要国家化的代码中,使用 Foundation 自带的宏 NSLocalizedString(key, comment) 根据 Key 获取对应的字符串
// NSLocalizedString // 第一个参数是内容:根据第一个参数去对应语言的文件中取对应的字符串 // 第二个参数将会转化为字符串文件里的注释,可以传 nil,也可以传空字符串 @"" #define NSLocalizedString(key, comment) [[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:nil]
运行效果:模拟器是日语环境
注:NSLocalizedString 是根据某个 key 去获取对应的字符串,如果没有找到那么就会以 key 作为 value 返回
// Localizable.strings(Ennglish) 中的 key 不再设值 "下一页";
运行效果:模拟器英语环境
4 - 图片国际化
① 首先同样要添加好需要国际化的语言,还是以日语为例
② 开始将图片国际化。在 icon.png 的文件检查器中添加需要的国家化语言(过程同上),添加完成后应该是这样的
③ 选中 icon.png 右击后选择 show in Finder,在打开的文件目录中会发 en.Iproj/ja.Iproj 中多了一个名为 ICON.png 的图片
④ 把 en.Iproj/ja.Iproj 中的图片替换成想要在该语言下展示的图片即可
运行效果:模拟器是日语环境
小结
1 - 如何查看/切换本地语言
① 除了在模拟器的设置中切换语言、还是在 Xcode 配置中实切换,其实我们应该知道当应用启动时首先会读取 NSUserDefaults 中 key 名时 AppleLanguages 对应的 value,该 value 是一个字符串数组,就是说我们访问这个名为 AppleLanguages 的 key 返回这个数组,该数组存储着 APP 支持的语言列表,数组的第一项就是 APP 当前默认的语言。现在默认的语言是日语,我们可以代码验证
- (void)viewDidLoad { [super viewDidLoad]; self.view.backgroundColor = [UIColor cyanColor]; NSArray *languages = [[NSUserDefaults standardUserDefaults] valueForKey:@"AppleLanguages"]; NSString *currentLanguage = languages.firstObject; NSLog(@"模拟器当前语言:%@",currentLanguage); // 模拟器当前语言:ja-US }
② 这就意味着可以给 AppleLanguages 这个 key 赋值来达到切换本地语言的目的
日志信息
运行效果:将要显示的图片由原应是 日语环境下的图片 变成了 英语环境下的图片
注:只切换了应用程序的国际化语言,但并改变不了手机本身的语言系统(模拟器仍是日语环境,APP 应用名称仍是日本语)
2 - 多人协作下的字符串国际化
// key:系统根据 key 取出对应的字符串 // tbl:自定义的 .strings 文件名 NSLocalizedStringFromTable(<#key#>, <#tbl#>, <#comment#>)
③ 新建 XXX.strings 文件并完成需要国际化的语言配置
④ 在代码中使用 NSLocalizedStringFromTable
运行效果:模拟器是日语环境