一、语言本地化功能释义
语言本地化<语言国际化>是指根据用户设备系统的语言设置,自动将应用程序的语言设置为和用户设备系统语言设置一致的语言文本。
1.语言本地化意义
此功能的目的是:能够让讲不同语言的用户正常的使用App功能,让每个用户都能在App内读懂自己熟悉的语言文字信息。
2.语言本地化应用场景
- 应用程序需要提供给多个国家的人群使用。
- 同一个国家多个地域有多种语言的情况。
3.语言本地化两大需求
对于本地化的功能有很多种需求,往往多数应用的需求区别在于是否能在App内进行语言文字切换功能,由此分为两种方案:
一、应用语言随系统语言设置而变化。
二、应用可内切换语言。
一、应用语言随系统语言设置而变化
普及一个知识点:
想要切换模拟器的语言设置,无需在模拟器中设置App进行设置,只需要在Xcode中进行如下设置:
Edit->Scheme->Run->Arguments Passed On Launch ->AppleLanguages (语言代码)。
语言本地化前提工程配置步骤:
1.选中工程的“Project” -> “Info”路径,在“Localizations”栏中点击"+"按钮,添加需要国际化/本地化的语言选项。
备注:
“zh-Hans”和“zh-Hant”分别是“简体中文”和“繁体中文”的缩写,H可大写也可小写。
"en"是英语的缩写,ko是韩语的缩写,fr是法语的缩写。
其他语言可查询对应文档或是网络查询
2.在弹出的对话框中,直接点击Finish按钮,完成添加。
第一点:App名称的本地化实现
App名称本地化是指同一个App的名称随设备语言设置来显示不同的名称。比如,微信在语言设置为简体中文的设备中App名称显示为“微信”,在语言设置为英语的设备中App名称显示为“weChat”。实现App名称本地化的步骤:
1.选中工程的“Project” -> “Info”路径,在“Localizations”栏中点击"+"按钮,添加需要国际化/本地化(前提工程配置中必要步骤,此处仅为再次)
2.在Xcode的工程左侧文件栏中,新建文件选择Strings File(iOS->Resource->Strings File)创建InfoPlist.string文件。
3.选择刚刚创建InfoPlist.string文件,在右侧的File inspection选项卡中点击Localize功能按钮,并在该选项栏中勾选需要的本地化语言。
4.展开InfoPlist.string文件,在每个本地化语言中添加“CFBundleDisplayName = "WeChat";”这行代码
至此已经完成了App名称的本地化,运行代码,修改设备系统的语言设置,在设备的桌面就能查看到本地化文件中设置的App的名称。
第二点:App内的字符串的本地化
App内字符串的本地化是指在不同的语言环境下显示不同的内容。比如tabbar上的第一个标签"主页"这个标题字符串,在语言设置为简体中文的设备中显示为“主页”,在语言设置为英语的设备中显示为“Home”。
App内字符串的本地化的步骤和App名称本地化过程是一致的,只需要创建特定文件名(Localizable.strings)的文件即可。
根据设备系统语言设置实现App内的文案本地化具体步骤如下:
1.在Xcode的工程左侧文件栏中,新建文件选择Strings File(iOS->Resource->Strings File)创建Localizable.string文件。
2.选择刚刚创建Localizable.string文件,在右侧的File inspection选项卡中点击Localize功能按钮,并在该选项栏中勾选需要的本地化语言。
3.展开Localizable.string文件,在每个本地化语言中添加需要本地化的键值对代码,具体格式为:"key"="value";
4.在代码中使用系统的宏定义NSLocalizedString(key, comment)来取对应的值进行展示
注意:此方案是根据设备系统的语言设置来自动变化App内文案显示的方案!
不同的步骤:
使用方法:
二、应用可内切换语言
在需求搬运工的搬运下,如果遇到App内切换语言的需求,仅使用上面所述的方案是不能实现此功能的,我们需要做一些修改才能达到目的。
两种方案:
第一种方案:在系统的国际化的基础上,使用NSUserDefault强制修改本地的语言设置来达到App内切换语言的目的
第二种方案:仅使用系统国际化的文件,不使用系统的NSLocalizedString(key, comment)读取方法,改用自定义的类来读取本地化内容
注意:如果使用以上两种方案,在切换语言的时候需要发送一则通知,通知已经显示的文本控件,进行重新获取本地化内容并重新赋值显示。
第一种方案
需要在第一种方案的基础上,使用NSUserDefault强制修改本地的语言设置来达到目的,具体实现如下:
代码片段:
//切换语言
NSArray *lans = @[@"en"]; //想切换成英文版设置此种语言代码
[[NSUserDefaults standardUserDefaults] setObject:lans forKey:@"AppleLanguages"];
[[NSUserDefaults standardUserDefaults] synchronize];
可将此段代码在切换语言的时候添加到对应位置,并设置成对应的语言码。
第二种方案
如果不想使用NSUserDefault强制修改本地的语言设置,又想达到App内语言切换的功能怎么处理呢?初步思路是为每种语言都创建一个Localizable.string文件,并自己从对应的Localizable.string文件读取对应的内容!
方案思路具体实现:
第一步:为每种语言创建一个本地化语言文件(Localizable.strings)
第二步:为语言包创建目录(蓝色文件夹:en.lproj),并存放在包的根目录中
第三步:将本地化语言的键值对都添加到对应的语言文件中
第四步:创建一个用来获取包中的本地化语言内容的类
创建的读取本地化内容的类代码如下:
//
// LocalizedUtils.h
// LocalizationsDemo
//
// Created by Shixiong on 2017/11/15.
// Copyright © 2017年 Shixiong. All rights reserved.
//
#import
@interface LocalizedUtils : NSObject
/**
* 使用代码强制使用某一种语言处理
* [Language setLanguage:@"de"];
**/
+ (void)setLanguage:(NSString *)language;
/**
* 获取国际化语言内容
**/
+ (NSString *)get:(NSString *)key;
/**
* 获取国际化语言内容
**/
+ (NSString *)get:(NSString *)key alter:(NSString *)alternate;
@end
//
// LocalizedUtils.m
// Altopay
//
// Created by Shixiong on 2017/11/9.
// Copyright © 2017年 Shixiong. All rights reserved.
//
#import "LocalizedUtils.h"
static NSBundle *bundle = nil;
@implementation LocalizedUtils
+ (void)initialize
{
NSUserDefaults *defs = [NSUserDefaults standardUserDefaults];
NSArray *languages = [defs objectForKey:@"AppleLanguages"];
NSString *current = [languages firstObject];
if (![current hasPrefix:@"id"]) {
[self setLanguage:@"en"]; //默认使用英语
} else {
[self setLanguage:current]; //指定当前语言
}
}
+ (void)setLanguage:(NSString *)language
{
NSBundle *tmpBundle = [NSBundle mainBundle];
NSString *path = [tmpBundle pathForResource:language ofType:@"lproj"];
bundle = [NSBundle bundleWithPath:path];
}
+ (NSString *)get:(NSString *)key
{
return [[self class] get:key alter:@""];
}
+ (NSString *)get:(NSString *)key alter:(NSString *)alternate
{
return [bundle localizedStringForKey:key value:alternate table:nil];
}
@end
创建结果如下:
使用自定义本地化的功能代码:
至此已经完成了App内字符串的本地化功能以及App内本地化语言切换功能,修改代码中的语言设置,在App中就能查看到本地化文件中的内容了。