文章目录
  1. 1. 前言
  2. 2. 添加中文国际化文件夹
  3. 3. 修改应用程序的显示名称
  4. 4. 国际化文本
  5. 5. 如何访问到指定的资源文件?
  6. 6. 参考

前言

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
// 查看当前的 language
NSArray* langArray = [[NSUserDefaults standardUserDefaults] arrayForKey:@"AppleLanguages"];
NSString* currentLanguage = langArray[0];

用户在系统Settings里选择的首选语言,可以通过”AppleLanguages”在userDeaults中获得。如果我们不在代码里对这个值修改,系统默认就是使用这个language的。
因此,我们可以在代码这样修改:

1
2
3
4
// 设置当前的 language
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]; // 组装bundle
NSString *ok = NSLocalizedStringWithDefaultValue(@"OK", @"IPhoneStrings", finalBundle, @"OK", ""); // 在 FinalBundle 文件夹里的*.lproj子文件夹的 IPhonStrings.strings 文件里查找 key 为 @"OK" 字符串。

如果我们使用自己的key来记录当前language信息,那么需要自己组装指定 *.lproj的位置,构造bundle,示例

1
2
3
NSString* bundlePath = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%@",[[NSUserDefaults standardUserDefaults] objectForKey:@"appLanguage"]] ofType:@"lproj"]; // 自己找到诸如 zh-Hans.lproj 的文件夹
NSBundle* bundle = [NSBundle bundleWithPath:];
NSString* str = [bundle localizedStringForKey:@"OK" value:nil table:@"IPhoneStrings"]; //查找IPhoneStrings.strings文件里的@"OK"的字符串

可以用一个宏定义来指定整个过程,

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及自定义手势

文章目录
  1. 1. 前言
  2. 2. 添加中文国际化文件夹
  3. 3. 修改应用程序的显示名称
  4. 4. 国际化文本
  5. 5. 如何访问到指定的资源文件?
  6. 6. 参考