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里