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

隨著移動App時(shí)代的發(fā)展哈雏,應(yīng)用程序相繼出現(xiàn)了不同語言的版本方案,中文衫生,英文裳瘪,法文,韓文等等罪针;想在應(yīng)用程序中實(shí)現(xiàn)語言的自由切換彭羹,需要配置多個(gè)語言的文件,根據(jù)用戶的動態(tài)選擇獲取不同語言文件下的語言文件泪酱,從而顯示到界面上面派殷。這里先說中英文的切換,至于其他語言操作復(fù)制即可N髀āS凇!

此篇文章岂津,是上一篇的文章 iOS 搭建一個(gè)基本框架(Swift工程)的延續(xù)與擴(kuò)展

話不多說虱黄,看最終效果(帶緩存記憶功能)


language.gif

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

步驟1

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

image.png
步驟2

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

image.png

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


image.png

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


image.png

現(xiàn)在就可以展開了瘟忱,有我們添的.strings文件了,有中文扩借,英文腾降,兩個(gè)文件


image.png
步驟3

添加多語言的 key value系洛,如下圖


image.png
image.png

至此準(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
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é)尾

今天的分享至此接近尾聲嘍踢械,小伴們,覺得有點(diǎn)用的話,或者已經(jīng)看到這里面來的請點(diǎn)贊加關(guān)注吧~~
后續(xù)分享更多iOS原生技術(shù)及物聯(lián)網(wǎng)技術(shù)相關(guān)文章魄藕。如果有任何疑問的話内列,歡迎在下方留言~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市泼疑,隨后出現(xiàn)的幾起案子德绿,更是在濱河造成了極大的恐慌,老刑警劉巖退渗,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蕴纳,居然都是意外死亡会油,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進(jìn)店門古毛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來翻翩,“玉大人,你說我怎么就攤上這事稻薇∩┒常” “怎么了?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵塞椎,是天一觀的道長桨仿。 經(jīng)常有香客問我,道長案狠,這世上最難降的妖魔是什么服傍? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮骂铁,結(jié)果婚禮上吹零,老公的妹妹穿的比我還像新娘。我一直安慰自己拉庵,他們只是感情好灿椅,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般茫蛹。 火紅的嫁衣襯著肌膚如雪泣懊。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天麻惶,我揣著相機(jī)與錄音馍刮,去河邊找鬼。 笑死窃蹋,一個(gè)胖子當(dāng)著我的面吹牛卡啰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播警没,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼匈辱,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了杀迹?” 一聲冷哼從身側(cè)響起亡脸,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎树酪,沒想到半個(gè)月后浅碾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡续语,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年垂谢,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片疮茄。...
    茶點(diǎn)故事閱讀 39,926評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡滥朱,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出力试,到底是詐尸還是另有隱情徙邻,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布畸裳,位于F島的核電站缰犁,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏躯畴。R本人自食惡果不足惜民鼓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蓬抄。 院中可真熱鬧丰嘉,春花似錦、人聲如沸嚷缭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至路幸,卻和暖如春荐开,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背简肴。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工晃听, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人砰识。 一個(gè)月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓能扒,卻偏偏與公主長得像,于是被迫代替她去往敵國和親辫狼。 傳聞我的和親對象是個(gè)殘疾皇子初斑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評論 2 354

推薦閱讀更多精彩內(nèi)容