Bundle在本地化中的用法
NSBundle是用来获取可执行资源的,通过bundle来定位具体的资源文件的位置,从而加载或执行代码操作。并且每一个可以获取到的bundle都是独立的
获取bundle本地化
//获取对应key字符串在表中的值
[[NSBundle mainBundle] localizedStringForKey:@"abc" value:nil table:@"Localized"];
//获取当前使用第一语言
[[NSBundle mainBundle] preferredLocalizations][0];
//获取应用默认development的语言
[[NSBundle mainBundle] developmentLocalization];
//返回顶部首选本地化
[NSBundle preferredLocalizationsFromArray:[[NSBundle mainBundle] localizations]];
//系统默认识别Localizable.strings表
NSLocalizedString(@"abc", nil);
//获取自定义表
NSLocalizedStringFromTable(@"abc", @"Localizable", nil);
本地资源国际化
1.字符串本地化
根据系统语言,识别不同的.lproj本地语言文件夹,替换对应的字符串文件
1.新建Strings File文件
2.Project新增App语言(图1示例)
3.本地化字符串文件列表(图2示例)
3.设置字符串资源(图4示例)
(1)可以替换Info.plist文件,例如CFBundleDisplayName (更改App名称)。
(2)也可以替换内置字符串名称。
"abc" = "111";//替换字符串
CFBundleDisplayName = "333";//替换info文件
4.运行App
2.资源文件本地化
具体来说是在找到本地资源文件,进行替换成我们对应的文件,如App图标、修饰图片等。
图片资源
1.统一管理图片,使用本地化字符串方式,通过NSLocalizedString(key,comment)来获取自定资源的图片名称
2.使用.lproj包来管理图片资源,通过图片名称,来访问不同语言包中的文件
第二种实现思路
1.选择需要本地化的图片或拖拽一张图片到你的App工程
2.点击右边栏Localization,勾选增加对应图片的本地化(图1示例)
由于在此之前我们为项目工程添加过我们需要的语言,每当生成一门本地化语言,系统会自动帮我们生成一个本地化文件夹.lproj,用来管理不同语言的本地化资源
3.这里成功勾选后,可以看到左边栏变成了一个折叠列表(图1示例)
4.为不同语言包替换新的图片(图2示例)
此时的两张图片相似,show in finder进入它的.lproj文件夹,删掉当前图片文件并且拖入新的图片,这时工程目录中我们使用的本地化图片会报红,因为找不到它对应路径下的文件,我们将图片名称更改为我们使用的名称,此时报红取消一切正常
3.infoPlist配置本地化
1)新建Strings File文件,命名为InfoPlist.strings
2)加入国际化语言
"CFBundleDisplayName"="MyApp";
"NSHumanReadableCopyright"="2016 Goldrush Computing Inc.版权所有。";
4.storyboard/xib本地化
如图1示例,有两种本地化文件的方式:
(1)为不同的语言环境使用单独的storyboard / xib文件。(生成storyboard/xib文件)
(2)使用不同语言的字符串文件并提供翻译文本。(生成.strings文件)
Interface Builder Cocoa Touch XIB/Interface Builder Storyboard
右侧未选中的NIB本地化方式,左侧为Main.storyboard下本地化文件的格式,中间部分是新的stroyboard文件
Localizable Strings
右侧为选中NIB本地化文件的方式,左侧为Main.storyboard下本地化文件的格式,中间部分是生成本地化字符串的位置,写法为:
三个元素缺一不可:(1)控件类型,(2)属性,(3)ObjectID
/* Class = "UILabel"; text = "zhong"; ObjectID = "dwh-91-MnC"; */
"dwh-91-MnC.text" = "zhong";//规范写法
如果我们在IB中更改了某些内容,strings不会更新文件,使用ibtool或AppleGlot(链接)来更新字符串文件
5.xcode调试语言环境
1.选中Edit Scheme,然后将Application Language--System Language更改为指定语言,可以在用模拟器调试的时候不用手动切换系统语言,只是更改成为我们应用需要的语言,在几中语言切换时比较方便查看本地化的效果
2.使用AppleLanguages的方式,更改key也能切换App本地化语言(如果全都勾选只会读取最上面的一个,如果上下两种方法一起实现,AppleLanguages的优先级 > System Language的优先级)
3.使用代码在应用内部切换语言
//获取当前应用所有的本地化语言
NSArray *langArr = [[NSUserDefaults standardUserDefaults] valueForKey:@"AppleLanguages"];
//获取应用默认语言
NSString *language1 = langArr.firstObject;
//切换语言
NSArray *lans = @[@"en"];
[[NSUserDefaults standardUserDefaults] setObject:lans forKey:@"AppleLanguages"];
6.Storyboard/ xib预览调试
通过预览Storyboard/ xib可以做的事情很多,不仅可以查看本地化语言的显示,同时也可以查看不同机型的显示效果,适合经常用NIB的开发者。需要注意的是,调试本地多语言的时候,只有通过Localizable Strings方式创建的本地化才可以预览效果。
服务端资源国际化
服务端国际化处理主要包括返回字段内信息、图片和需要下载的资源文件等,处理方式分为以下两种:
服务端不关心当前用户的本地化语言,返回所有适配的本地化内容,由客户端自己控制显示
特点:返回所有国际化资源,由客户端自己筛选
服务端获取当前用户的本地化信息,返回相应的本地化内容
特点:只返回对应语言的资源,由服务端处理,优点:过滤掉不需要的资源,客户端的处理更简单
总结思路:
所有nib、文本、资源的国际化都可以使用本地字符串方式,也可以通过生成新替代文件的方式来做国际化。