本人只是记录下自己实现的过程, 大家可以参考:http://www.cnblogs.com/boai/p/5337558.html
或者:http://jingyan.baidu.com/article/fd8044fac8c0d55030137a4c.html
1.添加语言
在工程的info里面选择添加语言
2.创建.strings文件
因为是手动切换,所以文件名不需要为Localizable.strings
文件名可以自己取 这里是Language.strings
3.创建完成之后选择.strings文件, 点击右侧的Localization按钮, 会弹出一个框, 选择下拉框里的语言
勾选语言, Base可以勾选,也可以不勾选
然后会发现.string文件会多出两个文件,(English 和 Simplified)
4.在对应的文件里面进行设置不同语言下要显示的数据
格式为
"key" = "values";
没有@符号, 而且要用双引号,不要忘记最后的分号
英语文件里面
汉语文件里面
两个文件里面的values是最后显示的数据, key类似于字典里面的key, 两个文件key值要一致, 不然显示的时候数据会不是你想要的效果, 而且key值是唯一的,意味着不能重复, 否则会报错,键可以用中文,也可有用英文,性能有没差别看不出
5。
写个宏定义,用来读取语言文件和返回的value值。宏最好是全局的,毕竟在一个项目里会有多个文件会用到。(pch文件或者其他文件)
#define Localized(key) [[NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%@",[[NSUserDefaults standardUserDefaults] objectForKey:@"appLanguage"]] ofType:@"lproj"]] localizedStringForKey:(key) value:nil table:“创建.strings的文件名”]
其中“appLanguage”是保存在本地的语言key,这里保存在了NSUserDefaults中,table是指创建的.strings文件名称,这里是"Language",注意没有".string"后缀
6 保存当前使用语言到NSUserDefaults
在AppDelegate.m文件didFinishLaunchingWithOptions获取当前手机语言,并存储到NSUserDefaults。
if (![[NSUserDefaults standardUserDefaults]objectForKey:@"appLanguage"]) {
NSArray *languages = [NSLocale preferredLanguages];
NSString *language = [languages objectAtIndex:0];
if ([language hasPrefix:@"zh-Hans"]) {//开头匹配
[[NSUserDefaults standardUserDefaults] setObject:@"zh-Hans" forKey:@"appLanguage"];
}else{
[[NSUserDefaults standardUserDefaults] setObject:@"en" forKey:@"appLanguage"];
}
}
7 切换语言的事件
在ViewController.m创建并初始化UILabel用于显示多语言文字,UIButton切换语言按钮及响应事件。
//修改本地获取的语言文件-交替
NSString *language = [[NSUserDefaults standardUserDefaults]objectForKey:@"appLanguage"];
if ([language isEqualToString: @"en"]) {
[[NSUserDefaults standardUserDefaults] setObject:@"zh-Hans" forKey:@"appLanguage"];
}else {
[[NSUserDefaults standardUserDefaults] setObject:@"en" forKey:@"appLanguage"];
}
[[NSUserDefaults standardUserDefaults] synchronize];
8.因为切换语言之后要停留在当前页面,所以发送一个通知重新设置文字
[[NSNotificationCenter defaultCenter] postNotificationName:kLanguageChanged object:nil];
上面第二个语言是重新回到rootVc里面,相当于重新初始化整个vc,所以不需要重新设置文字, 因为虽然我们选择了语言, 但是只有在控件初始化的时候会读取我们的语言文件, 所以要么是回到rootVc, 要么是自己重新设置文字(暂时不知道其他方法, 如果有人知道请告知。 谢谢), 在自己pop回去的上一个页面里面接收通知,并设置文字, 但是如果是重新进入新的页面,那该页面不需要进行任何操作, 会自动切换语言