隨著移動App時(shí)代的發(fā)展哈雏,應(yīng)用程序相繼出現(xiàn)了不同語言的版本方案,中文衫生,英文裳瘪,法文,韓文等等罪针;想在應(yīng)用程序中實(shí)現(xiàn)語言的自由切換彭羹,需要配置多個(gè)語言的文件,根據(jù)用戶的動態(tài)選擇獲取不同語言文件下的語言文件泪酱,從而顯示到界面上面派殷。這里先說中英文的切換,至于其他語言操作復(fù)制即可N髀āS凇!
此篇文章岂津,是上一篇的文章 iOS 搭建一個(gè)基本框架(Swift工程)的延續(xù)與擴(kuò)展
話不多說虱黄,看最終效果(帶緩存記憶功能)
第一步,配置多語言環(huán)境
步驟1
工程-> PROJECT -> info -> Localizations吮成,點(diǎn)“+”橱乱,選擇(Chinese(Simplified))添加簡體中文,英文Xcode自帶有(English)粱甫,所以不需要再次添加泳叠。(點(diǎn)擊添加彈出語言菜單,即可選擇你所需要的語言)
步驟2
現(xiàn)在可以添加多語言文件了
直接點(diǎn)擊 Create按鈕就可以
這個(gè)時(shí)候,.strings文件還沒有箭頭,不能展開伏嗜,點(diǎn)擊右邊的Localize...
現(xiàn)在就可以展開了瘟忱,有我們添的.strings文件了,有中文扩借,英文腾降,兩個(gè)文件
步驟3
添加多語言的 key value系洛,如下圖
至此準(zhǔn)備工作全部完成
第二步螃征,封裝一個(gè)多語言工具類
代碼里面有詳細(xì)的注釋搪桂,可以參考
import Foundation
class MyLanguageManager: NSObject {
fileprivate static let kChooseLanguageKey = "ChooseLanguage"
/// 單例
static let shared = MyLanguageManager()
var language: Language
private override init() {
// 第一次初始語言, 看手機(jī)是什么語言
language = MyLanguageManager.localeIsChinese() ? .Chinese : .English
super.init()
}
enum Language: String {
/// 請注意, 這個(gè)命名不是隨意的, 是根據(jù)你本地的語言包,可以show in finder 看到. en.lproj / zh-Hans.lproj
case Chinese = "zh-Hans"
case English = "en"
var code: String {
return rawValue
}
}
/// 判斷手機(jī)語言是不是中文
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? {
/// 存起來, 避免一直創(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
}
}
}
}
/// 首先, 我們會在啟動時(shí)設(shè)置成我們自己的Bundle,這樣就可以做到,當(dāng)使用時(shí)會調(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)
}
}
}
第三步盯滚,使用工具類
使用的地方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é)尾
今天的分享至此接近尾聲嘍踢械,小伴們,覺得有點(diǎn)用的話,或者已經(jīng)看到這里面來的請點(diǎn)贊加關(guān)注吧~~
后續(xù)分享更多iOS原生技術(shù)及物聯(lián)網(wǎng)技術(shù)相關(guān)文章魄藕。如果有任何疑問的話内列,歡迎在下方留言~