iOS支持多语言

这篇文章介绍的多语言方案非常简单,就是使用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;

需要特别注意的是,使用NSBundlelocalizedStringForKey: 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可以马上更换到新的语言。要实现这样的功能,就需要使用新设置的语言刷新目前已经加载的所有页面,常见的做法,就是直接替换当前windowrootViewController,实现刷新全部页面的效果。

你可能感兴趣的:(iOS支持多语言)