介绍说明
App对于多语言这块无非2种需求,一是软件根据手机当前操作系统的语言来显示对应的语言;另外一种是,不论当前手机设置的是什么语言,用户可以通过设置(点击按钮)改变当前软件的语言。
下面先介绍第一种,根据手机当前操作系统的语言来显示对应的语言
1、在Xcode工程里面创建文件
2、添加多语言,在这里添加了简体中文和英语两个版本
3、多语言的使用
分别在不同的语言文件中添加测试代码
1. "text" = "English text";
2. "text" = "简体中文";
说到使用,就要了解下NSLocalizedString是什么
#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)]
其实就是宏,而宏定义的又是在资源文件中寻找对应的资源文件;
1. NSLocalizedString(key,comment)
2. NSLocalizedStringFromTable(key, tbl, comment)
第一种适合于,让应用跟随系统的语言版本进行切换,而用户却不能手动进行切换;
注意:如果用第一个方法实现多语言,多语言的文件名必须是 Localizable
参数说明:第一个参数是多语言文件中的key,第二个参数是对key的注释说明,一般为nil就可以了
如果要实现的是既可以跟随系统,又可以用户自己切换,就不能使用第一种了,那就要使用第二种 NSLocalizedStringFromTable(key, tbl, comment) tbl这个参数,就是我们自己命名的多语言文件名称;
注:直接使用第二种的话,会跟随系统语言
参数说明:第一个参数是多语言文件中的key,第二个参数是多语言文件的名字,第三个参数是对key的注释说明,一般为nil就可以了
代码中直接定义的Label控件就可以直接使用,实现语言根据系统的切换
_label.text = NSLocalizedString(@"text", nil);
下面先介绍第二种,用户可以设置语言
创建和上面的步骤一样,不再一一列举;主要看代码实现逻辑;
AppDelegate.h
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;
//用来记录选中的哪种语言
@property(strong, nonatomic)NSString *languageName;
//通过传进来的参数key,获取相应语言的文本
-(NSString*)getLanguageName:(NSString*)languageKey;
@end
AppDelegate.m
//实现方法
-(NSString*)getLanguageName:(NSString *)languageKey
{
//获取指定的语言文件的路径
NSString *path = [[NSBundle mainBundle]pathForResource:_languageName ofType:@"lproj"];
//在指定的路径下获取语言文件,并取出key所对应的语言文本
NSString *textLanguage = [[NSBundle bundleWithPath:path]localizedStringForKey:languageKey value:nil table:@"Localizable"];
return textLanguage;
}
下面是实现类里面的代码:
//添加两个button的监听事件,手动切换哪种语言
-(void)clickEnglish
{
//赋值指定相应的语言文件
_appDelegate.languageName = @"en";
//通过相应的key,在指定的语言文件取出相应的语言文本
_label.text = [_appDelegate getLanguageName:@"text"];
}
-(void)clickChinese
{
_appDelegate.languageName = @"zh-Hans";
_label.text = [_appDelegate getLanguageName:@"text"];
}
这里的@"en" @"zh-Hans"你可能会问,从哪来的?实际上当你前面按照上面的配置好了以后,你的工程文件夹下面会有几个文件夹。这样就知道该写什么了吧?