将文本国际化常用的3个方面一一讲解
根据系统语言设置,应用名称的多语言切换
根据系统语言设置,应用内容的多语言切换
在应用内,手动切换多语言
优化
初体验多语言–APP应用图标的多语言
效果:
Uploading 屏幕快照 2016-11-17 上午9.10.00_240252.png …]
在设置——通用——语言 中选择日语
屏幕快照 2016-11-17 上午9.10.00.png
实现:
1 为项目添加支持的语言
在project——info——Localizations 添加简体中文和日语
屏幕快照 2016-11-17 上午9.30.49.png
如果项目中的sb和xib没用到多语言,不用勾选。默认勾选,不影响。
屏幕快照 2016-11-17 上午9.27.54.png
2 生成存放语言的strings文件
2.1 在Resource——Strings File 生成一个名字为 InfoPlist 的strings文件
屏幕快照 2016-11-17 上午9.33.45.png
2.2 点击 Localize 为InfoPlist.strings 生成支持的语言.strings
屏幕快照 2016-11-17 上午9.39.06.png
2.3 添加简体中文和日语
屏幕快照 2016-11-17 上午9.44.12.png
勾选支持的简体中文和日语
2.4 勾选完成后,在InfoPlist.strings文件下自动生成对应语言的.strings文件
屏幕快照 2016-11-17 上午9.49.11.png
3 在strings添加内容
3.1 在InfoPlist.strings(Simplified) 中输入 CFBundleDisplayName = “指尖弹灰”;
在InfoPlist.strings(Japanese) 中输入 CFBundleDisplayName = “指先デフレクタ”;
4 实现功能
4.1 在info.plst 中添加字段 Application has localized display name 并设置成Boolean类型的Yes
屏幕快照 2016-11-17 上午9.58.15.png
4.2 该功能已经实现了。按照效果图中的操作即可。很简单吧,如果改变系统语言,希望应用内的语言也改变,该怎么办呢?往下看!
注意:
1 Terminating since there is no system app.
系统切换语言后,应用发生闪退,要重启应用。
2 APP应用图标的多语言设置 ,strings文件只能叫 InfoPlist.strings
更近一步多语言–APP应用内容的多语言
根据系统语言,APP内语言的自动切换
效果:
当系统语言设为简体中文时,运行程序
屏幕快照 2016-11-17 上午10.42.30.png
当系统语言设为日语时,运行程序
屏幕快照 2016-11-17 上午10.46.32.png
实现:
1 为项目添加支持的语言
添加日语和简体中文
2 生成存放语言的strings文件
生成一个名字为Localizable的strings文件
屏幕快照 2016-11-17 上午10.24.41.png
3 在strings文件中添加多语言
3.1在InfoPlist.strings(Simplified) 中输入 “labelText” = “指尖弹灰”;
在InfoPlist.strings(Japanese) 中输入 “labelText = “指先デフレクタ”;
4 实现功能
为View添加一个label
UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(140, 200, 200, 30)];
label.text = NSLocalizedString(@"labelText", nil);
[self.view addSubview:label];
该功能已经实现了。按照效果图中的操作即可。
关键方法:
1 “labelText”是key , “指尖弹灰” “指先デフレクタ” 是不同语言strings中的value
2 NSLocalizedString(key, comment)
首先获取系统语言——日语
然后在Localizable.strings 文件下找到Localizable.strings(Japanese)文件中key对应的value值,将其返回.
理论:
define NSLocalizedString(key, comment) \
[[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:nil]
define NSLocalizedStringFromTable(key, tbl, comment) \
[[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:(tbl)]
key: 查找的key值
comment: 备注,从上面的预定义中可以看出它不参与代码的运行,只是为了我们好去知道这个字段是什么。如
label.text = NSLocalizedString(@”labelText”, @”程序中lable的名字”);
tbl: 对应的Strings文件的名称(如:InfoPlist ,Localizable)。预定义NSLocalizedString(key,comment)是第二个定义的简化版,它将tbl设为nil.如果tbl为nil则默认tbl是Localizable. 现在大家明白了为什么我们的Strings要命名为Localizable.Strings了吧。
//也可以这样写
label.text = NSLocalizedStringFromTable(@”labelText”, nil, nil);
更多的情况是我们想让用户可以在应用内去设置语言。这时我们的该怎么做呢?往下看
在APP内部,手动实现多语言切换
效果:
屏幕快照 2016-11-17 下午2.36.27.png
屏幕快照 2016-11-17 下午2.36.11.png
实现:
为项目添加支持的语言
为项目添加中文简体和*语 *(ug)
生成存放语言的strings文件
生成一个名字为demo的strings文件
屏幕快照 2016-11-20 下午5.53.38.png
在strings文件中添加多语言
在demo.strings(Simplified) 中添加
“labelName” =”订单签收”;
“buttonName” =”切换语言”;
在demo.strings(*) 中添加
labelName” =”زاكاس تالونغا ئىمزا قويۇپ ئېلىش”;
“buttonName” =”ئالماستۇرۇش”;
实现功能
4.1 获取当前保存在NSUerDefaults中的语言
define currentLanguage [NSString stringWithFormat:@”%@”,[NSUserDefaults standarUserDefaults] objectForKey:@”appLanguage”]]
4.2 获取当前语言文件所在的路径
define LanguagePath [[NSBundle mainBundle] pathForResource:currentLanguage ofType:@”lproj”]`
4.3 返回当前语言文件key所对应的value
define THLocalized(key) [[NSBundel bundleWithPath:LanguagePath] localizedStringForKey:(key) value:nil table:@”demo”]
4.4 为了简便,将上述3个预定义合在一起得到
define THLocalized(key) [[NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@”%@”,[[NSUserDefaults standardUserDefaults] objectForKey:@”appLanguage”]] ofType:@”lproj”]] localizedStringForKey:(key) value:nil table:@”demo”]
THLocalized(key) 和NSLocalizedString(key, comment)是不是很像呢?
4.5 如果第一次进入应用,NSUserDefaults中没有保存的语言怎么办?
在AppDelegate.m文件中,实现判断。如果NSUserDefaults中没有保存语言,则将系统设置的语言保存到NSUserDefaults中
-
(BOOL)application:(UIApplication )application didFinishLaunchingWithOptions:(NSDictionary )launchOptions {
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”];
}
}return YES;
}
4.6 View中添加一个label和一个button -
(void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(100, 300, 200, 50)];
label.text = THLocalized(@”labelName”);
[self.view addSubview:label];UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
button.frame = CGRectMake(100, 400, 200, 50);
[button setTitle:THLocalized(@”buttonName”) forState:UIControlStateNormal];
[button addTarget:self action:@selector(click) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button];
}
4.7 点击button时,将当前语言保存到NSUserDefaults中,并刷新应用 -
(void)click {
NSString *language = [[NSUserDefaults standardUserDefaults]objectForKey:@”appLanguage”];
if ([language isEqualToString: @”ug”]) {
[[NSUserDefaults standardUserDefaults] setObject:@”zh-Hans” forKey:@”appLanguage”];
}else {
[[NSUserDefaults standardUserDefaults] setObject:@”ug” forKey:@”appLanguage”];
}
[[NSUserDefaults standardUserDefaults] synchronize];// 可以将rootViewController设成刷新后停留的页面的controller
AppDelegate delegate = (AppDelegate )[UIApplication sharedApplication].delegate;
ViewController * vc = [[ViewController alloc]init];
delegate.window.rootViewController = vc;
}
补充说明: zh-Hans是中文简体的缩写,ug是*语的缩写.下图括号里面是缩写
屏幕快照 2016-11-17 下午2.33.20.png
优化
切换成其他语言后,view大小应该可以随内容去调整,使得text可以显示完全。
这讲是针对文本的国际化,实际上图片,storyboard,xib也都可以进行国际化