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 - 多人协作下的字符串国际化

① 项目开发中独立开发的还是少数,如果多人同时操作本地化文件,极有可能会存在冲突。上面介绍的代码中字符串的国际化使用的是默认文件 Localizable,那么如何让系统加载我们自己命名的国际化文件而非系统默认的 Localizable.strings 呢 ?这就是 NSLocalizedStringFromTable(<#key#>, <#tbl#>, <#comment#>) 
② 如果你的文件名不是默认的 Localizable 而是自定义的话,那么就要使用 NSLocalizedStringFromTable 来读取国际化字符串
// key:系统根据 key 取出对应的字符串
// tbl:自定义的 .strings 文件名
NSLocalizedStringFromTable(<#key#>, <#tbl#>, <#comment#>)

③ 新建 XXX.strings 文件并完成需要国际化的语言配置

④ 在代码中使用 NSLocalizedStringFromTable

运行效果:模拟器是日语环境

 

posted on 2023-03-08 21:28  低头捡石頭  阅读(1305)  评论(0编辑  收藏  举报

导航