随着移动App时代的发展,应用程序相继出现了不同语言的版本方案,中文,英文,法文,韩文等等;想在应用程序中实现语言的自由切换,需要配置多个语言的文件,根据用户的动态选择获取不同语言文件下的语言文件,从而显示到界面上面。这里先说中英文的切换,至于其他语言操作复制即可!!!
此篇文章,是上一篇的文章 iOS 搭建一个基本框架(Swift工程)的延续与扩展
话不多说,看最终效果(带缓存记忆功能)
![](https://img.haomeiwen.com/i9472084/e5db699d2f97343b.gif)
第一步,配置多语言环境
步骤1
工程-> PROJECT -> info -> Localizations,点“+”,选择(Chinese(Simplified))添加简体中文,英文Xcode自带有(English),所以不需要再次添加。(点击添加弹出语言菜单,即可选择你所需要的语言)
![](https://img.haomeiwen.com/i9472084/09e0c19330f8aeb2.png)
步骤2
现在可以添加多语言文件了
![](https://img.haomeiwen.com/i9472084/cedca06d16593c9b.png)
直接点击 Create按钮就可以
![](https://img.haomeiwen.com/i9472084/a72eb3c2e08bf85a.png)
这个时候,.strings文件还没有箭头,不能展开,点击右边的Localize...
![](https://img.haomeiwen.com/i9472084/4503ca4a365a5bcf.png)
现在就可以展开了,有我们添的.strings文件了,有中文,英文,两个文件
![](https://img.haomeiwen.com/i9472084/c580f62a563c6f8d.png)
步骤3
添加多语言的 key value,如下图
![](https://img.haomeiwen.com/i9472084/769319d375481a52.png)
![](https://img.haomeiwen.com/i9472084/58058999bac4795d.png)
至此准备工作全部完成
第二步,封装一个多语言工具类
代码里面有详细的注释,可以参考
import Foundation
class MyLanguageManager: NSObject {
fileprivate static let kChooseLanguageKey = "ChooseLanguage"
/// 单例
static let shared = MyLanguageManager()
var language: Language
private override init() {
// 第一次初始语言, 看手机是什么语言
language = MyLanguageManager.localeIsChinese() ? .Chinese : .English
super.init()
}
enum Language: String {
/// 请注意, 这个命名不是随意的, 是根据你本地的语言包,可以show in finder 看到. en.lproj / zh-Hans.lproj
case Chinese = "zh-Hans"
case English = "en"
var code: String {
return rawValue
}
}
/// 判断手机语言是不是中文
static func localeIsChinese() -> Bool {
if let lang = Locale.preferredLanguages.first {
return lang.hasPrefix("zh") ? true : false ;
} else {
return false
}
}
/// 保存所选的语言
static func saveLanguage(chooseLanguage:Language) {
UserDefaults.standard.set(chooseLanguage.rawValue, forKey: MyLanguageManager.kChooseLanguageKey)
}
/// 获取上次保存的语言,如果从未保存过,获取回来的是Chinese
static func currentLanguage() -> Language? {
let langString = UserDefaults.standard.string(forKey: kChooseLanguageKey)
guard let desLangString = langString else {
return Language.Chinese
}
return Language(rawValue: desLangString)
}
}
private var bundleByLanguageCode: [String: Foundation.Bundle] = [:]
extension MyLanguageManager.Language {
var bundle: Foundation.Bundle? {
/// 存起来, 避免一直创建
if let bundle = bundleByLanguageCode[code] {
return bundle
} else {
let mainBundle = Foundation.Bundle.main
if let path = mainBundle.path(forResource: code, ofType: "lproj"),
let bundle = Foundation.Bundle(path: path) {
bundleByLanguageCode[code] = bundle
return bundle
} else {
return nil
}
}
}
}
/// 首先, 我们会在启动时设置成我们自己的Bundle,这样就可以做到,当使用时会调用这个方法.
class MyBundle: Foundation.Bundle {
override func localizedString(forKey key: String, value: String?, table tableName: String?) -> String {
if let bundle = MyLanguageManager.shared.language.bundle {
return bundle.localizedString(forKey: key, value: value, table: tableName)
} else {
return super.localizedString(forKey: key, value: value, table: tableName)
}
}
}
第三步,使用工具类
使用的地方1
![](https://img.haomeiwen.com/i9472084/5e14eec5c291329d.png)
代码如下:
//替换Bundle.main为自定义的MyBundle
object_setClass(Foundation.Bundle.main, MyBundle.self)
let lan = MyLanguageManager.currentLanguage()
MyLanguageManager.shared.language = lan!
使用的地方2
![](https://img.haomeiwen.com/i9472084/96786eaccfcb282b.png)
代码如下:
//
// OrderViewController.swift
// smart_light
//
// Created by ZZ on 2022/4/20.
//
import UIKit
class OrderViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .blue
title = "My Order"
let btn = UIButton()
btn.setTitle(NSLocalizedString("order_btn_zh", comment: ""), for: .normal)
btn.addTarget(self, action: #selector(clickBtn), for: .touchUpInside)
btn.frame = CGRect(x: 100, y:100, width: 100, height: 50)
view.addSubview(btn)
let btn2 = UIButton()
btn2.setTitle(NSLocalizedString("order_btn_en", comment: ""), for: .normal)
btn2.addTarget(self, action: #selector(clickBtn2), for: .touchUpInside)
btn2.frame = CGRect(x: 100, y:200, width: 100, height: 50)
view.addSubview(btn2)
}
@objc func clickBtn() {
print("clickBtn")
MyLanguageManager.shared.language = .Chinese
MyLanguageManager.saveLanguage(chooseLanguage: .Chinese)
dismiss(animated: true)
}
@objc func clickBtn2() {
print("clickBtn2")
MyLanguageManager.shared.language = .English
MyLanguageManager.saveLanguage(chooseLanguage: .English)
dismiss(animated: true)
}
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
if let appdelegate = UIApplication.shared.delegate {
let tabBarController = MyTabBarController.createTabBarController()
tabBarController.selectedIndex = 2
appdelegate.window??.rootViewController = tabBarController
}
}
}
结尾
今天的分享至此接近尾声喽,小伴们,觉得有点用的话,或者已经看到这里面来的请点赞加关注吧~~
后续分享更多iOS原生技术及物联网技术相关文章。如果有任何疑问的话,欢迎在下方留言~
网友评论