国际化替换方案(一)

1,420 阅读5分钟

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";//规范写法


最后我们可以这样理解,如果您想为特定本地化提供稍微不同的布局效果,增加它的利用性使用单独的Storyboard/ xib来呈现,但是相应的也将会增加大型项目的应用程序包大小和维护难度,除非绝对必要,否则不应该这样做。

如果我们在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方式创建的本地化才可以预览效果。


服务端资源国际化

服务端国际化处理主要包括返回字段内信息、图片和需要下载的资源文件等,处理方式分为以下两种:

  1. 服务端不关心当前用户的本地化语言,返回所有适配的本地化内容,由客户端自己控制显示

    特点:返回所有国际化资源,由客户端自己筛选

  2. 服务端获取当前用户的本地化信息,返回相应的本地化内容

    特点:只返回对应语言的资源,由服务端处理,优点:过滤掉不需要的资源,客户端的处理更简单


总结思路:

所有nib、文本、资源的国际化都可以使用本地字符串方式,也可以通过生成新替代文件的方式来做国际化。