这篇文章介绍的多语言方案非常简单,就是使用string资源文件来实现多语言的支持。
string资源文件的创建和使用
第一步,在Xcode项目中添加你要支持的语言:
当前我使用的是Xcode11,默认支持的语言是English。此外还有一个Base,这篇文章不做讨论。
假设app要支持简体中文和英文,那么你的配置应该是这样的:
支持中文和英文
第二步,创建string资源文件:
创建string资源文件
随便起个名字,例如"abc"。创建好后是这样的:
string资源文件
第三步,国际化string资源文件:
国际化string资源文件
由于我们前面已经配置好支持简体中文和英文,所以我们可以把string资源文件国际化为简体中文和英文两种版本:
string资源文件
第四步,在string资源文件中添加我们的内容。string资源文件中的内容是键值对的形式,每一个键值对以分号结束:
简体中文string资源文件
英文string资源文件
这样“你好”(英文是“hello”)这个内容就创建好了,注意他们需要使用一样的键
hello_key
,后面是要通过hello_key
这个键来获取“你好”(“hello”)这个字符串的。第五步,使用string资源文件。经过上面的步骤,string资源文件已经创建完成。这时候查看我们的项目目录,就能看到相关的资源文件:
项目目录
需要使用
NSBundle
来获取string资源文件里的内容。根据上面的目录,我们知道简体中文资源的目录是zh-Hans.lproj
,所以获取简体中文资源内容的方法是:
// 获取中文资源的路径
NSString *path = [[NSBundle mainBundle] pathForResource:@"zh-Hans" ofType:@"lproj"];
// 获取中文资源的bundle
NSBundle *bundle = [NSBundle bundleWithPath:path];
// 根据键值获取对应的内容
NSString *hello = [bundle localizedStringForKey:@"hello_key" value:nil table:@"abc"];
// hello字符串是“你好”。根据你的需要使用内容。例如:
// someLabel.text = hello;
同理获取英文资源内容的方法是:
// 获取英文资源的路径
NSString *path = [[NSBundle mainBundle] pathForResource:@"en" ofType:@"lproj"];
// 获取英文资源的bundle
NSBundle *bundle = [NSBundle bundleWithPath:path];
// 根据键值获取对应的内容
NSString *hello = [bundle localizedStringForKey:@"hello_key" value:nil table:@"abc"];
// hello字符串内容是“hello”。根据你的需要使用内容。例如:
// someLabel.text = hello;
需要特别注意的是,使用NSBundle
的localizedStringForKey: value: table:
方法获取字符串时,table
参数要写你的string资源文件的名字。本例子是abc
。
初始化app的语言
有了string资源文件后,我们就能随心所欲地获取各种语言内容了。那么,用户第一次打开app时,应该显示什么语言呢?
我们首先获取用户当前手机的语言:
NSArray *langs = [NSLocale preferredLanguages];
NSLog(@"%@", langs);
如果用户当前手机的语言设置是这样的:
手机语言设置
那么上述代码就会打印:
(
"zh-Hans-US",
en,
"zh-Hant-US"
)
这样我们就能知道当前用户使用的语言是中文,那么就可以把app的语言初始化为中文。
一般用NSUseDefaults
来记录当前的语言:
[[NSUserDefaults standardUserDefaults] setObject:@"zh-Hans-US" forKey:@"your_key"];
需要特别注意的是iOS的语言代码,例如英文他会分为加拿大英文、印度英文等等,虽然都是英文,但是代码不一样:
(
"en-CA"
"en-IN",
)
但是他们的前缀都是en
,我们也不必分这么细,只要是en
开头我们就可以知道这是英文。
切换语言
一般是在app内提供切换语言的功能,切换后app可以马上更换到新的语言。要实现这样的功能,就需要使用新设置的语言刷新目前已经加载的所有页面,常见的做法,就是直接替换当前window
的rootViewController
,实现刷新全部页面的效果。
网友评论