前言
1 - 语言本地化,又叫做语言国际化。是指根据用户操作系统的语言设置,自动将应用程序的语言设置为和用户操作系统语言一致的语言
如何实现语言本地化:APP 名称本地化、代码中字符串本地化、图片本地化、storyboard/xib 本地化
实现 APP 语言本地化
1 - 首先要配置需要国际化的语言:这是国际化之前的准备工作。无论我们是国际化 APPT 名称、代码中的字符串、图片、还是 storyboard/xib,都需要进行这一步的准备工作。一个项目中需要且仅需要配置一次
① 选中project -> Info -> Localizations,然后点击 +,添加需要国际化/本地化的语言,如下图(默认需要勾选Use Base Internationalization)
② 日本语
2 - 应用名称本地化。是指同一个 APP 的名称,在不同的语言环境下(也就是手机设备的语言设置)显示不同的名称。比如微信在简体中文环境下 App 名称显示为微信,在英语环境下显示为 weChat
① 选中 Info.plist 后新建 command + N 文件,选择 Strings File(iOS -> Resource -> Strings File)。文件名字命名为 InfoPlist 且必须是这个名字,完事后 Xcode 左侧导航列表就会出现名为 InfoPlist.strings 的文件,如下图
② 选中 InfoPlist.strings 在 Xcode 的 File inspection(文件检查器)中点击 Localize,目的是选择我们需要本地化的语言,选择日本语(系统默认英语)。完事之后Xcode 右侧的 File inspection 变成了下图的样式
③ 此时 Xcode 左侧的 InfoPlist.stirings 多了一个箭头。如下图
从图中可以看出 InfoPlist.strings 文件下包含了English、 日本语这两种语言文件。原理:程序启动时会根据操作系统设置的语言,自动加载 InfoPlist.strings 文件下对应的语言文件,然后显示应用程序的名字
④ 接下来分别用不同的语言给 InfoPlist.strings 下的文件设置对应的名字即可:分别在 InfoPlist.strings(english) 、InfoPlist.strings(French) 中加入对应的代码
// 英语文件
CFBundleDisplayName = "English Name";// CFBundleDisplayName 可以使用双引号,也可以不使用双引号
// 日语文件
"CFBundleDisplayName" = "にほんご";
⑤ 修改模拟器语言环境为日本语。APP 名称如下
注:过去本地化 APP 名称,需要在 Info.plist 文件中增加一个名为 Application has localized display name 的 BOOL 类型的 Key,且要将其值设置为 YES,目的是让 APP 支持本地化 APP 名称,但是如今可以忽略这一步
3 - 代码中字符串的本地化:所谓字符串本地化就是指 APP 内的字符串在不同的语言环境下显示不同的内容。比如 主页 这个字符串在中文语言环境下显示 主页,在英语环境下显示 home
① 其实字符本地化和 APP 名称本地化过程如出一辙,只是创建的文件名成不一样(文件名必须是 Localizable.strings),上述步骤完全相同,这里不再赘述。我们直接看 Localize 后 Xcode 左侧的 Localizable.stirings 文件,同样以日本语为例
② 分别在 Localizable.strings 文件中以 Key-Value 的形式为代码中每一个需要本地化的字符串赋值
// 英语文件 "下一页" = "Next Page";
// 日语文件 "下一页" = "じよう";
③ 最后在需要本地化的代码中使用 Foundation 框架自带的 NSLocalizedString(key, comment) 这个宏根据 Key 获取对应的字符串即可
// NSLocalizedString 实质 // 第一个参数是内容:根据第一个参数去对应语言的文件中取对应的字符串 // 第二个参数将会转化为字符串文件里的注释,可以传 nil,也可以传空字符串 @"" #define NSLocalizedString(key, comment) [[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:nil]
效果如下(日语)
注:以英语为例,其实我们不需要给 Localizable.strings(English) 文件添加 Key-Value。原因:系统根据某个 key 去获取对应的字符串时,如果没有找到那么就会以 key 作为 value 返回。所以即使没有给键添加值那么在英语环境下 btn 最终显示的 title 会是 下一页
// 英语文件 "下一页";
效果如下
4 - 图片本地化
① 首先添加需要本地化的语言,就是配置所要国际化的语言,以日语为例
② 将图片 icon.png 拖入工程中,选中 icon.png 文件展开 Xcode 右侧的 file Inspection 后点击 Localize(过程同上,我们直接跳过)。完事后应该是这样的
③ 右击 icon.png -> show in Finder 会发现在 en.Iproj/ja.Iproj 文件中多了一个名为 ICON.png 的图片
④ 现在 en.Iproj/ja.Iproj 文件中图片默认是一模一样,我们只需把 ja/lproj 中的图片替换掉即可:拉进一张同名图片 ICON.png
效果如下(日本语)
结语
1 - 查看/切换本地语言
① 应用启动时首先会读取 NSUserDefaults 中的 key 为 AppleLanguages 对应的value,该 value 是一个 String 数组,也就是说我们访问这个名为 AppleLanguages 的 key 可以返回一个 string 数组,该数组存储着 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 字符串本地化和图片本地化,但是手机本身的语言环境仍是日本语,这也就意味着 APP 应用名称同样是日本语
2 - 多人协作下的字符串本地化
① 项目开发中独立开发的还是少数,经常会有多人开发的情况。如果多人同时操作本地化文件,极有可能会存在冲突。另一方面我们又不希望自己的本地化文件受到对方的污染。上面介绍的代码中字符串的本地化是使用的是默认的文件 Localizable,那么如何让系统加载我们自己命名的本地化文件而非系统默认的Localizable.strings 呢?这就是 NSLocalizedStringFromTable(<#key#>, <#tbl#>, <#comment#>) 的用处 ② 如果你的 strings 文件名字不是 Localizable 而是自定义的话,如 XXX.strings,那么就要使用 NSLocalizedStringFromTable 来读取本地化字符串// key:系统根据 key 取字符串 // tbl:自定义strings文件的名字 // comment:可以不传 NSLocalizedStringFromTable(<#key#>, <#tbl#>, <#comment#>)
③ 新建 XXX.strings 文件并完成需要国际化的语言配置,如下图
④ 代码配置
效果如下
标签:文件,APP,本地化,Xcode,字符串,strings,语言 From: https://www.cnblogs.com/self-epoch/p/17193110.html