国际化,顾名思义就是让各国人使用你的app,能显示本国的语言。国际化,没有想象中那么难,只知道通过NSLocalizedString方法将相应语言的字符串加载进来即可。
本篇来自:http://blog.csdn.net/VictorMoKai/article/details/48894873
http://blog.sina.com.cn/s/blog_7b9d64af0101jncz.html
开发环境 :Xcode 5以上 & Object C
一、 iOS国际化原理分析
国际化其实都大同小异,其核心思想就是为每种语言单独定义一份资源。
iOS就是通过xxx.lproj目录来定义每个语言的资源,这里的资源可以是图片,文本,Storyboard,Xib等。我们可以看看 LocalDemo源代码的物理目录结构
每种语言都有自己的 语言代码.lproj文件夹,加载资源时只需要加载相应语言文件夹下的资源就OK,这步可以系统为我们完成(图一),也可以手动去做(图二)。
图一:
图二:
二 、国际化开始步骤
1. 首先点击项目->PROJECT->Info->Localizations中添加要支持的语言
注:此处Use Base Internationalization开启状态下,每个国际化资源文件会有个Base选项,主要针对String,Storyboard,Xib作为 一个基础的模板,像后述storyboard国际化中方案二就是基于Base StoryBoard进行改动。
在点击+添加相应语言时会弹出以下对话框,意思是为现有的资源添加语言文件,我们点击Finish就行了
2. 然后创建国际化语言文件(Xcode 5以下自动会生成)文件名必须为:Localizable.strings
选中Localizable.strings文件,在Utilites中,点击Localizable选项
创建English语言包。
三、文本的国际化
文本的国际化是通过一个Localizable.strings文件来存储每个语言的文本,它是iOS默认加载的文件。
每个资源文件如果想为一种语言添加支持,通过其属性面板中的Localization添加相应语言就行了,此时Localizable.strings处
于可展开状态,子级有着相应语言的副本。我们把相应语言的文本放在副本里面就行了
注:此处Base与前面提过到的开启Use BaseInternationalization是有关联的,只有开启了全局Use Base Internationalization此处才会显示。那为什么这里没有勾选Base?Base做为一个基础模板,作用于Strings文件是没有太大意义的,另外去掉Base意义着在Base.lproj中少了一个strings文件,APP大小也所有下降,这点对于图片的Base更是如此。
代码中这样写就行了
另外中文strings【Localizable.strings(Simplified)】可以不要的(可以理解为中文为APP的默认语言),因为key就是value,当找不到相应的语言strings或value时会直接返回key。nice!这样一来我们做文本的国际化就只要维护一个英文副本strings就O了
四、图片的国际化
图片的国际化可以通过原生支持与自定义命名
同上,Base副本去掉。另外需要注意的是,使用这种方式,在XIB或Storyboard中引用图片时如果只使用名称是实时显示不了的,一定要加上后缀名。如avater.png
代码中使用方式不变,iOS会自动找相应语言(xxx.lproj)下的图片
对于图片的放置,正确姿态应该是需要国际化的图片放在自定义Group里面,不需要国际化的图片放在Images.xcassets
五、获得当前设备的语言
你可以在AppDelegate的didFinishLaunchingWithOptions方法中获取当前的语言。
//取得用户默认信息
NSUserDefaults *defaults = [NSUserDefaultsstandardUserDefaults ];
// 取得 iPhone 支持的所有语言设置
NSArray *languages = [defaultsobjectForKey :@"AppleLanguages" ];
// 获得当前iPhone使用的语言
NSString* currentLanguage =[languagesobjectAtIndex:0];
NSLog(@"当前使用的语言:%@",currentLanguage);
注:1.代码有冲突,建议使用(图一)设置方式。
2.切记不要以为改变AppleLanguages值,就改变系统的设置语言,苹果官方API没有提供我们直接修改的AIP.