一.前言
本地化是App开发中非常常用的功能, 一共分为两种
1.应用名称本地化
2.应用字段本地化
下面按顺序进行讲解
二.应用名称本地化
首先打开项目配置目录, 点击加号
选择你要添加的语言
直接点击finish
可以看到多出来一个中文
之后点击Info.plist
, 然后按cmd + n
新建, 也可以不点击只是来选择一下新建文件的目录 - -
新建一个本地化文件必须命名为InfoPlist
然后点击该文件在xcode
右侧会显示该文件的配置信息
点击localize...
来绑定多语言
选中English
点击Localize
, 我们发现会多出来两个东西, 把这两个都勾上
勾上后我们刚才新建的InfoPlist
就可以展开了
点击配置两个文件, 里面的格式如下
"CFBundleDisplayName" = "EnglishName";
中文的本地化文件内容如下
"CFBundleDisplayName" = "中文名称";
下面就可以运行项目试试了
系统语言是英文显示为这样
之后我们切换到中文试试
切换成中文后, 应用名称如图所示
三.应用字段本地化
新建文件必须命名为Localizable
操作同上, 需要本地化的语言都勾选上
然后在里面配置本地化字符串
"name" = "cat";
"name" = "猫";
配置完成后, 我们去AppDelegate
里面去试试
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
NSLog(@"%@", NSLocalizedString(@"name", @""));
return YES;
}
使用NSLocalizedString
宏来提取本地化字符串, 第一个是key
我们传递刚才定义好的name
, 另外一个是注释传空字符串即可
可以看到下面打印了猫, 因为我们是中文系统
下面切换到英文试试
可以看到打印的字符串变成cat
三.自定义本地化
经过上面的步骤已经可以实现本地化语言随着系统的语言而改变了, 那么还会有另外一种情况, 在代码里就能切换语言, 切换后立刻就能生效或刷新一下生效, 这种情况要怎么去做呢, 我们一起来看吧
其实很简单 系统已经为我们提供了自己选择语言的代码
public func NSLocalizedString(_ key: String, tableName: String? = nil, bundle: Bundle = Bundle.main, value: String = "", comment: String) -> String
key: 本地化文件中的`键`
tableName: 表名, 也就是`Localizable`
bundle: 包路径, 文件在哪个文件夹里, 也是在这里指定是什么语言的
value: 默认值 - 即当本地化字符串中没有匹配的key, 该value会默认显示出来
comment: 注释
弄清楚含义我们很容易就可以写出来
print(NSLocalizedString("name", tableName: "Localizable", bundle: Bundle(path: Bundle.main.path(forResource: "zh-Hans", ofType: "lproj") ?? "") ?? Bundle.main, value: "", comment: ""))
print(NSLocalizedString("name", tableName: "Localizable", bundle: Bundle(path: Bundle.main.path(forResource: "en", ofType: "lproj") ?? "") ?? Bundle.main, value: "", comment: ""))
// 猫
// cat
是不是觉得代码乱七八糟的非常冗长, 下面来解释一下含义, Localizable
是我们在第二节里新建的strings
文件, bundle
是指包内的路径, 什么是包内的路径?
来我们一起来找
Products -> xxx.app
右键Show in Finder
右键显示包内容
映入眼帘的就是你的
main bundle
, 看到上面选中的蓝色文件夹了么, 那就是你的本地化文件存放的位置, 例如zh-Hans.lproj
就是汉语本地化文件存放的路径, 我们要自己指定语言就要给出这个文件夹的路径, 然后系统会根据你传递的表名去寻找对应的本地化文件, 而不是由系统语言来自动寻找, 这就是自定义本地化的原理.
东西都搞懂了, 是否觉得有些麻烦呢, 我们可以封装一下
func MyLocalizedString(_ key: String, tableName: String = "Localizable", language: String = "zh-Hans") -> String {
return NSLocalizedString(key, tableName: tableName, bundle: Bundle(path: Bundle.main.path(forResource: language, ofType: "lproj") ?? "") ?? Bundle.main, value: "", comment: "")
}
调用变成了这样
MyLocalizedString("name")
那么怎么切换语言呢, 这就要用到我们的NSUserDefaults了, 我们给代码改造一下
func MyLocalizedString(_ key: String, tableName: String = "Localizable", language: String = "zh-Hans") -> String {
let ud = UserDefaults(suiteName: "language_store")!
// 先获取一下本地存储的语言
var lan = ud.string(forKey: "lan")
if lan == nil || lan == "" {
// 如果没有缓存语言就使用默认
lan = language
// 在本地保存默认设置的语言
ud.setValue(language, forKey: "lan")
}
return NSLocalizedString(key, tableName: tableName, bundle: Bundle(path: Bundle.main.path(forResource: lan, ofType: "lproj") ?? "") ?? Bundle.main, value: "", comment: "")
}
想切换语言的时候可以这么使用
let ud = UserDefaults(suiteName: "language_store")!
ud.setValue("en", forKey: "lan")
print(MyLocalizedString("name"))
至于怎么刷新应用界面的语言其实也很简单, 两个方案, 第一个是重新设置window.rootViewController
, 不过这样会退到起始界面, 还有一个种方式是通知或是viewWillAppear
里面处理, 随你, 过程略.