前言
Xcode创建的iOS项目中默认包含了一个base.lproj文件夹,这就是该项目为英语环境提供的本地化文件夹。如果希望iOS项目支持更多的语言、国家环境,就必须提供更多的本地化文件夹。
添加中文国际化文件夹
在 Project->Build Settings-> Localizations里,可以看到默认的为English-Development Language。 点击『+』号,可以添加Chinese(Simplified),默认为Main.storyboad和LaunchScreen.storyboard两个文件添加中文版本文件。点击’Finish’就可以看到新增加了一个 zh-Hans.lproj文件夹。
修改应用程序的显示名称
应用程序的显示名称默认为PRODUCT_NAME变量的值,即『产品名』。可以在info.plist里添加 CFBundleDisplayName 中文名 修改显示的应用的显示名称
国际化文本
国际化文本的过程本质上就是根据指定的language,找到对应存放国际化字符串的资源文件,然后在该文件中查找指定key所对应的字符串。
那么如何获得指定的language?
1 2 3
| NSArray* langArray = [[NSUserDefaults standardUserDefaults] arrayForKey:@"AppleLanguages"]; NSString* currentLanguage = langArray[0];
|
用户在系统Settings里选择的首选语言,可以通过”AppleLanguages”在userDeaults中获得。如果我们不在代码里对这个值修改,系统默认就是使用这个language的。
因此,我们可以在代码这样修改:
1 2 3 4
| NSArray* newLangArray = [NSArray arrayWithObjects:@"zh-Hans", nil]; [[NSUserDefaults standardUserDefaults] setObject:newLangArray forKey:@"AppleLanguages"]; [[NSUserDefaults standardUserDefaults] synchronize];
|
这样就不用手动在Settings里设置了。
当然了,我们也可以自己定义一个如 ‘appLanguage’这样的key,来存放我们希望使用的language,以便在需要用的时候再从userDefaults中读取。这需要我们自己来维护。
如何访问到指定的资源文件?
在NSBundle.h中,系统提供了4个供获取国际化字符串的宏定义:
1 2 3 4 5 6 7 8
| #define NSLocalizedString(key, comment) \ [NSBundle.mainBundle localizedStringForKey:(key) value:@"" table:nil] #define NSLocalizedStringFromTable(key, tbl, comment) \ [NSBundle.mainBundle localizedStringForKey:(key) value:@"" table:(tbl)] #define NSLocalizedStringFromTableInBundle(key, tbl, bundle, comment) \ [bundle localizedStringForKey:(key) value:@"" table:(tbl)] #define NSLocalizedStringWithDefaultValue(key, tbl, bundle, val, comment) \ [bundle localizedStringForKey:(key) value:(val) table:(tbl)]
|
如果我们使用了AppleLanguages里保存的language信息,这四个方法会自动在bundle里查找对应 language.lproj文件夹。方法一中没有指定table,因此会自动查找文件夹下名为Localizable.strings的文件;方法二可以指定任意其他的文件名,如iPhonstring.strings;方法三、四可以自己指定bundel,方法四还可以指定默认值。
如果使用方法一,需要我们在如 zh-Hans.lproj 文件夹添加中添加 名为 Localizable.strings 的空白文件,然后添加国际化字符串的key-value值, 如 "book" = "书"
;。
如果使用方法四,示例:
1 2 3
| NSString *finalBundlePath = [[NSBundle mainBundle] pathForResource:@"FinalBundle" ofType:@"bundle"]; NSBundle *finalBundle = [NSBundle bundleWithPath:finalBundlePath]; NSString *ok = NSLocalizedStringWithDefaultValue(@"OK", @"IPhoneStrings", finalBundle, @"OK", "");
|
如果我们使用自己的key来记录当前language信息,那么需要自己组装指定 *.lproj的位置,构造bundle,示例
1 2 3
| NSString* bundlePath = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%@",[[NSUserDefaults standardUserDefaults] objectForKey:@"appLanguage"]] ofType:@"lproj"]; NSBundle* bundle = [NSBundle bundleWithPath:]; NSString* str = [bundle localizedStringForKey:@"OK" value:nil table:@"IPhoneStrings"];
|
可以用一个宏定义来指定整个过程,
1
| #define Localized(key) [[NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%@",[[NSUserDefaults standardUserDefaults] objectForKey:@"appLanguage"]] ofType:@"lproj"]] localizedStringForKey:(key) value:nil table:@"IPhoneStrings"]
|
使用时,直接 NSString* str = Localized(@”OK”); 即可。
参考
API之UIGestureRecognizer及自定义手势