隨著移動(dòng)App時(shí)代的發(fā)展,應(yīng)用程序相繼出現(xiàn)了不同語(yǔ)言的版本方案,中文,英文,法文,韓文等等;想在應(yīng)用程序中實(shí)現(xiàn)語(yǔ)言的自由切換,需要配置多個(gè)語(yǔ)言的文件,根據(jù)用戶(hù)的動(dòng)態(tài)選擇獲取不同語(yǔ)言文件下的語(yǔ)言文件,從而顯示到界面上面。這里先說(shuō)中英文的切換,至于其他語(yǔ)言操作復(fù)制即可?。?!
此篇文章,是上一篇的文章 iOS 搭建一個(gè)基本框架(Swift工程)的延續(xù)與擴(kuò)展
話(huà)不多說(shuō),看最終效果(帶緩存記憶功能)

第一步,配置多語(yǔ)言環(huán)境
步驟1
工程-> PROJECT -> info -> Localizations,點(diǎn)“+”,選擇(Chinese(Simplified))添加簡(jiǎn)體中文,英文Xcode自帶有(English),所以不需要再次添加。(點(diǎn)擊添加彈出語(yǔ)言菜單,即可選擇你所需要的語(yǔ)言)

步驟2
現(xiàn)在可以添加多語(yǔ)言文件了

直接點(diǎn)擊 Create按鈕就可以

這個(gè)時(shí)候,.strings文件還沒(méi)有箭頭,不能展開(kāi),點(diǎn)擊右邊的Localize...

現(xiàn)在就可以展開(kāi)了,有我們添的.strings文件了,有中文,英文,兩個(gè)文件

步驟3
添加多語(yǔ)言的 key value,如下圖


至此準(zhǔn)備工作全部完成
第二步,封裝一個(gè)多語(yǔ)言工具類(lèi)
代碼里面有詳細(xì)的注釋?zhuān)梢詤⒖?/p>
import Foundation
class MyLanguageManager: NSObject {
fileprivate static let kChooseLanguageKey = "ChooseLanguage"
/// 單例
static let shared = MyLanguageManager()
var language: Language
private override init() {
// 第一次初始語(yǔ)言, 看手機(jī)是什么語(yǔ)言
language = MyLanguageManager.localeIsChinese() ? .Chinese : .English
super.init()
}
enum Language: String {
/// 請(qǐng)注意, 這個(gè)命名不是隨意的, 是根據(jù)你本地的語(yǔ)言包,可以show in finder 看到. en.lproj / zh-Hans.lproj
case Chinese = "zh-Hans"
case English = "en"
var code: String {
return rawValue
}
}
/// 判斷手機(jī)語(yǔ)言是不是中文
static func localeIsChinese() -> Bool {
if let lang = Locale.preferredLanguages.first {
return lang.hasPrefix("zh") ? true : false ;
} else {
return false
}
}
/// 保存所選的語(yǔ)言
static func saveLanguage(chooseLanguage:Language) {
UserDefaults.standard.set(chooseLanguage.rawValue, forKey: MyLanguageManager.kChooseLanguageKey)
}
/// 獲取上次保存的語(yǔ)言,如果從未保存過(guò),獲取回來(lái)的是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? {
/// 存起來(lái), 避免一直創(chuàng)建
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
}
}
}
}
/// 首先, 我們會(huì)在啟動(dòng)時(shí)設(shè)置成我們自己的Bundle,這樣就可以做到,當(dāng)使用時(shí)會(huì)調(diào)用這個(gè)方法.
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)
}
}
}
第三步,使用工具類(lèi)
使用的地方1

代碼如下:
//替換Bundle.main為自定義的MyBundle
object_setClass(Foundation.Bundle.main, MyBundle.self)
let lan = MyLanguageManager.currentLanguage()
MyLanguageManager.shared.language = lan!
使用的地方2

代碼如下:
//
// 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
}
}
}
結(jié)尾
今天的分享至此接近尾聲嘍,小伴們,覺(jué)得有點(diǎn)用的話(huà),或者已經(jīng)看到這里面來(lái)的請(qǐng)點(diǎn)贊加關(guān)注吧~~
后續(xù)分享更多iOS原生技術(shù)及物聯(lián)網(wǎng)技術(shù)相關(guān)文章。如果有任何疑問(wèn)的話(huà),歡迎在下方留言~