iOS Swift 本地化 Localizable 方案

PZXLanguageManager

iOS Swift 本地化 Localizable 方案

iOS Swift 本地化總結(jié)

一.自己建立LanguageManager的方式

1.建立Localizable文件

參考地址

https://blog.csdn.net/u010545480/article/details/128734679

上面地址可以建立Localizable文件

2.創(chuàng)建LanguageManager.swift

文件代碼

//
//  LanguageManager.swift
//  Localizable
//
//  Created by - on 2023/12/8.
//

import Foundation
import UIKit



enum LanguageType {
    case chinese,english,auto
}

class LocalizableManager: NSObject {
    
    static let languageChangedNotification = NSNotification.Name(rawValue: "LanguageChangedNotification")

    static func localValue(_ str:String) -> String {
        LocalizableManager.shared.localValue(str: str)
    }
    static func setLanguage(_ type:LanguageType){
        LocalizableManager.shared.setLanguage(type)
    }
    
    
    /// 單例
    static let shared: LocalizableManager = {
        let instance = LocalizableManager()
        do {
            try instance._initLanguage()
        } catch {
            print("Error initializing LocalizableManager: \(error)")
        }      
        return instance
    }()
    
    private override init() {
      
    }
    var bundle:Bundle = Bundle.main
    
    private func localValue(str:String) -> String{
        //table參數(shù)值傳nil也是可以的,傳nil系統(tǒng)就會默認(rèn)為Localizable
        bundle.localizedString(forKey: str, value: nil, table: "Localizable")
    }
    
    /// 獲取系統(tǒng)語言方法-->可以根據(jù)自身業(yè)務(wù)場景進(jìn)行處理
    func getSystemLanguage() -> LanguageType {
        let preferredLang = Locale.current.language.languageCode?.identifier ?? "en"
        print("preferredLang = \(preferredLang)")
        
        switch preferredLang {
        case "en":
            return .english
        case "zh":
            return .chinese
        default:
            return .english
        }
    }
    ///獲取當(dāng)前應(yīng)用的語言
    func getCurrentLanguage() -> LanguageType {
        if let languageType = UserDefaults.standard.value(forKey: "language") as? String {
            print("currentLanguage = \(languageType)")
            switch languageType {
            case "en":
                return .english
            case "zh-Hans":
                return .chinese
            default:
                return .english
            }
        } else {
            return .english
        }
    }
    
    private func setLanguage(_ type:LanguageType){
        var typeStr = ""
        switch type {
        case .chinese:
            typeStr = "zh-Hans"
            UserDefaults.standard.setValue("zh-Hans", forKey: "language")
        case .english:
            typeStr = "en"
            UserDefaults.standard.setValue("en", forKey: "language")
        default:
            break
        }
        //返回項目中 en.lproj 文件的路徑
        let path = Bundle.main.path(forResource: typeStr, ofType: "lproj")
        //用這個路徑生成新的bundle
        bundle = Bundle(path: path!)!
        if type == .auto {
            //和系統(tǒng)語言一致
            bundle = Bundle.main
            UserDefaults.standard.removeObject(forKey: "language")
        }
        NotificationCenter.default.post(name: LocalizableManager.languageChangedNotification, object: nil)
    }

}

extension LocalizableManager {
    /// 初始化語言文件
    private func _initLanguage() throws {
        
        if let languageType = UserDefaults.standard.value(forKey: "language") {
            print("languageType = \(languageType)")
            let type = languageType as! String
            switch type {
            case "en":
                setLanguage(.english)
            case "zh-Hans":
                setLanguage(.chinese)
            default:
                break
            }
        } else {
            // 如果沒有設(shè)置當(dāng)前語言,則使用系統(tǒng)首選語言
            setLanguage(getSystemLanguage())
        }
    }

}



3.使用

//
//  ViewController.swift
//  Localizable
//
//  Created by - on 2023/7/4.
//

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var textLabel: UILabel!
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        
//三方用法
//        textLabel.hc_Text = "geeting"

        setUpdateUI()
        
        NotificationCenter.default.addObserver(forName: LocalizableManager.languageChangedNotification, object: nil,  queue: nil) { (notification) in
            self.setUpdateUI()
        }



    }
    
    func setUpdateUI(){
        //取值
        //自己寫的LanguageManager用法
        textLabel.text = LocalizableManager.localValue("geeting")
    }


    @IBAction func jumpToSecondButtonPressed(_ sender: UIButton) {
        
        let vc : SecondLanguageViewController = UIStoryboard.init(name: "SecondLanguageViewController", bundle: nil).instantiateViewController(withIdentifier: "SecondLanguageViewController") as! SecondLanguageViewController;
        self.navigationController?.pushViewController(vc, animated: true)
    }
    
    @IBAction func switchChineseButtonPressed(_ sender: UIButton) {
        
        //自己寫的LanguageManager用法
        LocalizableManager.setLanguage(.chinese)

        //三方用法
//        HCLocalizableManager.share.updateLanguage("zh-Hans")
//        //語言切換監(jiān)聽
//        HCLocalizableManager.share.languageDidChange {
//            debugPrint("語言切換了")
//            // 當(dāng)前語言type,后端需要數(shù)據(jù)
//            debugPrint("當(dāng)前語言type:" + HCLocalizableResourcesFilter.share.currentLanguageType)
//        }

        
    }
    
    @IBAction func switchEnglishButtonPressed(_ sender: UIButton) {
        //自己寫的LanguageManager用法
        LocalizableManager.setLanguage(.english)

        //三方用法
//        HCLocalizableManager.share.updateLanguage("en")
//        //語言切換監(jiān)聽
//        HCLocalizableManager.share.languageDidChange {
//            debugPrint("語言切換了")
//            // 當(dāng)前語言type,后端需要數(shù)據(jù)
//            debugPrint("當(dāng)前語言type:" + HCLocalizableResourcesFilter.share.currentLanguageType)
//        }

        
    }
    
    
}


二.三方使用

1.使用三方HCLanguageSwitch

發(fā)現(xiàn)了一個三方HCLanguageSwitch

比較好用用法也在Demo里

Demo地址:https://github.com/PZXforXcode/PZXLanguageManager

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

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

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