为了增加程序的用户使用数量,那么程序的国际化是不可或缺的一步。在Xcode中要实现程序的国际化,其实非常简单,开发者只需要简单配置,并修改相应的字符串键值对即可。
应用程序的国际化主要包括三个方面:A、程序名称国际化;B、程序内容国际化;C、程序资源国际化
在Xcode中新建项目后,可以在project的info选项卡中找到Localization的项目,可以添加应用程序需要支持的国际语言。
回到项目中可以发现在InfoPlist.strings、Main.storyboard(Main.strings)增加了相应项,而Localizable.strings文件如果已经存在的情况也会增加对应的语言版本。(默认情况,Xcode5+iOS7下Localizable文件需要新建,如下图)
完成以上的设置和文件添加,来看应用程序国际化的ABC。
A、应用名称国际化(InfoPlist.strings)
在InfoPList.strings的不同语言版本的文件中设置相应语言下程序的显示名称
英语版
/* Localized versions of Info.plist <span class="keyword" style="font-weight: bold;">keys</span> <span class="variable" style="color: rgb(0, 128, 128);">*/</span> CFBundleDisplayName=<span class="string" style="color: rgb(221, 17, 68);">"test"</span>;
中文版
<span style="font-size: 14px;">/* Localized versions of Info.plist <span class="keyword" style="font-weight: bold;">keys</span> <span class="variable" style="color: rgb(0, 128, 128);">*/</span></span>
CFBundleDisplayName= "测试" ;
这样程序在运行时,就会根据设备当前设置的语言版本显示对应语言的名称。同样,应用程序里面的内容(组件显示的名称、提示等)可以在Localizable.strings的对应文件以键值对的形式配置;
英文
/*
Localizable.strings
LocalizeMe
Created by gisxy on 14-3-5.
Copyright (c) 2014 年 esrixa. All rights reserved.
*/
"abc" = "cba" ;
"message" = "this is english" ;
"ok" = "ok" ;
中文
<span class="comment" style="color: rgb(153, 153, 136); font-style: italic;">/* Localizable.strings LocalizeMe Created by gisxy on 14-3-5. Copyright (c) 2014年 esrixa. All rights reserved. */</span> <span style="color: rgb(51, 51, 255);"><span class="string" style="color: rgb(221, 17, 68);">"abc"</span>=<span class="string" style="color: rgb(221, 17, 68);">"我是测试"</span>; <span class="string" style="color: rgb(221, 17, 68);">"message"</span>=<span class="string" style="color: rgb(221, 17, 68);">"这是中文信息提示"</span>; <span class="string" style="color: rgb(221, 17, 68);">"ok"</span>=<span class="string" style="color: rgb(221, 17, 68);">"确定"</span>;</span>
<span style="font-size: 18px; color: rgb(255, 0, 0);">需要注意的是代码里面:对于相应提示的代码应该使用<span class="s3" style="color: rgb(51, 51, 255); font-family: monospace; font-size: 14px; white-space: pre; background-color: rgb(240, 240, 240);">NSLocalizedString</span><span class="s1" style="color: rgb(51, 51, 255); font-family: monospace; font-size: 14px; white-space: pre; background-color: rgb(240, 240, 240);">(</span><span class="s4" style="color: rgb(51, 51, 255); font-family: monospace; font-size: 14px; white-space: pre; background-color: rgb(240, 240, 240);"><span class="string" style="color: rgb(221, 17, 68);">@"键值"</span></span><span class="s1" style="color: rgb(51, 51, 255); font-family: monospace; font-size: 14px; white-space: pre; background-color: rgb(240, 240, 240);">, </span><span class="s5" style="color: rgb(51, 51, 255); font-family: monospace; font-size: 14px; white-space: pre; background-color: rgb(240, 240, 240);">nil</span><span class="s1" style="color: rgb(51, 51, 255); font-family: monospace; font-size: 14px; white-space: pre; background-color: rgb(240, 240, 240);">)</span></span>
UIAlertView *alert = [[ UIAlertView alloc ] initWithTitle : NSLocalizedString ( @"abc" , nil )
message : NSLocalizedString ( @"message" , nil )
delegate : self
cancelButtonTitle : NSLocalizedString ( @"ok" , nil )
otherButtonTitles : nil ];
[alert show];
C、资源国际化在iOS7中storyboard生成的对应语言文本文件可以通过配置相应组件的显示名称来完成国际化
<span class="comment" style="color: rgb(153, 153, 136); font-style: italic;">/* Class = "IBUIButton"; normalTitle = "定位"; ObjectID = "qpS-qC-Lcy"; */</span> <span class="string" style="color: rgb(221, 17, 68);">"qpS-qC-Lcy.normalTitle"</span> = <span class="string" style="color: rgb(221, 17, 68);">"定位"</span>;对于使用xib文件组织布局的情况下,以上方法并不好使,个人建议是:复制xib文件改名,修改显示的名称,然后在代码里面来根据语言版本来加载对应的资源,该方法同样使用图片等资源。
NSArray <span class="variable" style="color: rgb(0, 128, 128);">*languages</span> = [NSLocale preferredLanguages]; NSString <span class="variable" style="color: rgb(0, 128, 128);">*currentLanguage</span> = [languages objectAtIndex:<span class="number" style="color: rgb(0, 153, 153);">0</span>]; NSLog(<span class="variable" style="color: rgb(0, 128, 128);">@"</span>language is <span class="variable" style="color: rgb(0, 128, 128);">%@</span><span class="string" style="color: rgb(221, 17, 68);">",currentLanguage);</span>
<span style="font-size: 14px;">如不同语言的图片资源位于不同文件夹下,然后可以根据语言版本来动态加载:</span>
<span class="setting">_chineseImagesPath = <span class="value">[[[NSBundle mainBundle] resourcePath] stringByAppendingString:@<span class="string" style="color: rgb(221, 17, 68);">"/Images_Chinese/"</span>];</span></span> <span class="setting">_englishImagesPath = <span class="value">[[[NSBundle mainBundle] resourcePath] stringByAppendingString:@<span class="string" style="color: rgb(221, 17, 68);">"/Images_English/"</span>];</span></span>