iOS 应用内切换语言

随着移动App时代的发展,应用程序相继出现了不同语言的版本方案,中文,英文,法文,韩文等等;想在应用程序中实现语言的自由切换,需要配置多个语言的文件,根据用户的动态选择获取不同语言文件下的语言文件,从而显示到界面上面。这里先说中英文的切换,至于其他语言操作复制即可!!!

此篇文章,是上一篇的文章 iOS 搭建一个基本框架(Swift工程)的延续与扩展

话不多说,看最终效果(带缓存记忆功能)


language.gif

第一步,配置多语言环境

步骤1

工程-> PROJECT -> info -> Localizations,点“+”,选择(Chinese(Simplified))添加简体中文,英文Xcode自带有(English),所以不需要再次添加。(点击添加弹出语言菜单,即可选择你所需要的语言)

image.png
步骤2

现在可以添加多语言文件了

image.png

直接点击 Create按钮就可以


image.png

这个时候,.strings文件还没有箭头,不能展开,点击右边的Localize...


image.png

现在就可以展开了,有我们添的.strings文件了,有中文,英文,两个文件


image.png
步骤3

添加多语言的 key value,如下图


image.png
image.png

至此准备工作全部完成

第二步,封装一个多语言工具类

代码里面有详细的注释,可以参考

import Foundation

class MyLanguageManager: NSObject {

    fileprivate static let kChooseLanguageKey = "ChooseLanguage"
    /// 单例
    static let shared = MyLanguageManager()

    var language: Language
    private override init() {
        // 第一次初始语言, 看手机是什么语言
        language = MyLanguageManager.localeIsChinese() ? .Chinese : .English
        super.init()
    }
    enum Language: String {
        /// 请注意, 这个命名不是随意的, 是根据你本地的语言包,可以show in finder 看到. en.lproj / zh-Hans.lproj
        case Chinese = "zh-Hans"
        case English = "en"
        var code: String {
            return rawValue
        }
    }
    /// 判断手机语言是不是中文
    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? {
        /// 存起来, 避免一直创建
        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
            }
        }
    }
}
/// 首先, 我们会在启动时设置成我们自己的Bundle,这样就可以做到,当使用时会调用这个方法.
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
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
        }
    }
}

结尾

今天的分享至此接近尾声喽,小伴们,觉得有点用的话,或者已经看到这里面来的请点赞加关注吧~~
后续分享更多iOS原生技术及物联网技术相关文章。如果有任何疑问的话,欢迎在下方留言~

你可能感兴趣的:(iOS 应用内切换语言)