iOS 應(yīng)用內(nèi)切換語(yǔ)言

隨著移動(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ō),看最終效果(帶緩存記憶功能)


language.gif

第一步,配置多語(yǔ)言環(huán)境

步驟1

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

image.png
步驟2

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

image.png

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


image.png

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


image.png

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


image.png
步驟3

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


image.png
image.png

至此準(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
image.png

代碼如下:

 //替換Bundle.main為自定義的MyBundle
object_setClass(Foundation.Bundle.main, MyBundle.self)
let lan = MyLanguageManager.currentLanguage()
MyLanguageManager.shared.language = lan!
使用的地方2
image.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
        }
    }
}

結(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à),歡迎在下方留言~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容