iOS国际化原理分析
国际化其实都大同小异,其核心思想就是为每种语言单独定义一份资源。
iOS就是通过xxx.lproj目录来定义每个语言的资源,这里的资源可以是图片,文本,Storyboard,Xib等。
每种语言都有自己的 语言代码.lproj文件夹,加载资源时只需要加载相应语言文件夹下的资源就OK,这步可以系统为我们完成,也可以手动去做。
项目源代码中如果有多个不同目录的国际化资源,则会有产生多个xxx.lproj。
开始国际化:-------------
首先点击项目->PROJECT->Info->Localizations中添加要支持的语言。
.
infopist里面的国际化显示displayname和文本的国际化----------
备注:CFBundleDisplayName可以使用双引号,也可以不使用双引号!
所谓字符串本地化,就是指App内的字符串在不同的语言环境下显示不同的内容。
比如,"主页"这个字符串在中文语言环境下显示“主页”,在英语环境下显示“home”。下面就开始进行字符串本地化。
通过一个Localizable.strings文件来存储每个语言的文本,它是iOS默认加载的文件,
如果想用自定义名称命名,在使用NSLocalizedString方法时指定tableName为自定义名称就好了。
下面时名字为Localizable.strings时的使用--------
下面时名字为自定义xxx.strings时的使用--------
如果你的strings文件名字不是Localizable而是自定义的话,如VVS.strings,那么你就得使用NSLocalizedStringFromTable这个宏来读取本地化字符串。
NSLocalizedStringFromTable(<#key#>, <#tbl#>, <#comment#>);
// key:系统根据key取字符串
// tbl:自定义strings文件的名字
// comment:可以不传
NSString *title = NSLocalizedStringFromTable(@
"click"
, @
"VVS"
, nil);
[self.btn setTitle:title forState:UIControlStateNormal];
图片的 国际化-------有两种方式:
新版Xcode中Images.xcassets不支持国际化(属性页面中没有Localization);
在XIB或Storyboard中引用图片时如果只使用名称是实时显示不了的,一定要加上后缀名。如avater.png。
在不同的语言下面设置同的显示,同上面的文本国际化;
第一种方式:===
这种方式和本地化代码中的字符串一样,通过NSLocalizedString(key,comment)来获取相应的字符串,然后根据这个字符串再获取图片。
这种方式获取的是同一张图片。
|
=====国际化图片的第二种方式:这种方式可以根据不同的语言设置不同的图片;
以下引用别人的文章:
首先需要添加需要本地化的语言,具体步骤参考第一章配置需要国际化的语言。因为我演示的demo中在本地化App名称时已经添加了需要国际化的语言。所以不需要再设置。
将图片拖入工程中,例如“icon.png”,然后选中icon.png,展开Xcode右侧的file Inspection,点击Localize,如下图:
然后,右击icon.png->show in Finder,我们发现在en.Iproj文件中多了一个名为icon.png的图片,如下图:
当然,zh-Hans.Iproj文件夹下并没有图片,如下图:
我们只需给zh-Hans.Iproj添加一个名字也为icon.png的图片。如下图:
然后把zh-Hans.Iproj中的icon.png拖到Xcode中,如下图:
然后发现,icon.png左边出现了一个可以展开的三角形。如下图:
展开后发现里面包含两张图片,如下图:
然后控制器中添加如下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | |
english环境下运行效果如下:
中文环境改下运行效果如下:
其他语言环境,例如法语、中文繁体、韩语,操作步骤完全和上面相同。
都是在对应的.Iproj文件夹下添加同名的图片,然后把图片拖放到Xcode中,不再赘述。
storyBoard和Xib国际化-----------
基于一个基础的Storyboard,可以看作是一个基础的模板,Storyboard里面所有的文本类资源(如UILabel的text)都会被放在相应语言的strings里面。
此时我们为Storyboard里的字符类资源作国际化只需要编辑相应语言的strings就行了。
查看/切换本地语言------------
原理:应用启动时,首先会读取NSUserDefaults中的key为AppleLanguages对应的value,该value是一个String数组,
也就是说,我们访问这个名为AppleLanguages的key可以返回一个string数组,该数组存储着APP支持的语言列表,
数组的第一项为APP当前默认的语言。
既然我们可以通过AppleLanguages这个key从NSUserDefaults中取出语言数组,
那么我们也可以给AppleLanguages这个key赋值来达到切换本地语言的效果。
- (void)viewDidLoad {
[
super
viewDidLoad];
// 切换语言前
NSArray *langArr1 = [[NSUserDefaults standardUserDefaults] valueForKey:@
"AppleLanguages"
];
NSString *language1 = langArr1.firstObject;
NSLog(@
"模拟器语言切换之前:%@"
,language1);
// 切换语言
NSArray *lans = @[@
"en"
];
[[NSUserDefaults standardUserDefaults] setObject:lans forKey:@
"AppleLanguages"
];
// 切换语言后
NSArray *langArr2 = [[NSUserDefaults standardUserDefaults] valueForKey:@
"AppleLanguages"
];
NSString *language2 = langArr2.firstObject;
NSLog(@
"模拟器语言切换之后:%@"
,language2);
}
获取当前语言
#define skyCurrentLanguage ([[NSLocale preferredLanguages] objectAtIndex:0])
https://www.jianshu.com/p/88c1b65e3ddb/