[Swift]項目語言國際化

項目語言國際化流程崎脉,以作備忘囚灼!

1 創(chuàng)建配置文件

工程內(nèi)新建Strings File文件灶体,并命名Localizable

新建Strings File文件

命名Localizable

創(chuàng)建好后如下圖所示

創(chuàng)建后

2 添加語言

選中Localizable.strings文件,點擊右側(cè)Localize...

添加語言

點擊后如下所示

添加語言

3 設(shè)置語言

前往工程PROJECT樟结,點擊Localizations下的+

添加語言

在彈出的語言中選擇想要使用的語言即可瓢宦,本次以簡體中文英文為例
簡體中文為Chinese(Simplified)
英文為English

選擇語言

在彈出的窗口上點擊Finish即可
有使用Main.storyboardLaunchScreen.storyboard可以勾選這兩個

添加語言

完成后就會如下圖所示,這兩個文件就是當前工程的簡體中文英文配置文件

4 簡單使用

配置文件填寫對應(yīng)的文字

英文

簡體中文

加載對應(yīng)文字的時候如下

let label = UILabel(frame: CGRect(x: 20, y: 200, width: UIScreen.main.bounds.width - 40, height: 40))
label.backgroundColor = UIColor.lightGray
label.text = NSLocalizedString("國際化語言展示", comment: "")
label.textColor = UIColor.red
label.textAlignment = .center
label.font = UIFont.boldSystemFont(ofSize: 16)
view.addSubview(label)

模擬器語言為英文和簡體中文狀態(tài)下的展示結(jié)果

模擬器語言為英文

模擬器語言為簡體中文

5 手動切換語言

創(chuàng)建國際化語言管理工具類

import UIKit

fileprivate let UserLanguage   = "UserLanguage"
fileprivate let AppleLanguages = "AppleLanguages"

enum LanguageType: Int {
    case Chinese = 0
    case English
}

class InternationalTool {

    /// 單例
    static var shared: InternationalTool {
        struct Static {
            static let instance: InternationalTool = InternationalTool()
        }
        return Static.instance
    }
    
    private var bundle: Bundle?
    
    /// 獲取國際化語言
    ///
    /// - Parameter key: key
    /// - Returns: 國際化語言
    public func string(_ key: String) -> String {
        let bundle = InternationalTool.shared.bundle
        let str = bundle?.localizedString(forKey: key, value: nil, table: nil)
        return str ?? ""
    }
    
    /// 初始化語言 Appdelegate 中使用
    public func initUserLanguage() {
        var str = UserDefaults.standard.value(forKey: UserLanguage) as? String
        if str?.count == 0 || str == nil {
            let languages = UserDefaults.standard.object(forKey: AppleLanguages) as? NSArray
            if languages?.count != 0 {
                let current = languages?.object(at: 0) as? String
                if current != nil {
                    str = current ?? ""
                    UserDefaults.standard.set(current, forKey: UserLanguage)
                    UserDefaults.standard.synchronize()
                }
            }
        }
        str = str?.replacingOccurrences(of: "-CN", with: "")
        str = str?.replacingOccurrences(of: "-US", with: "")
        var path = Bundle.main.path(forResource: str, ofType: "lproj")
        if path == nil {
            path = Bundle.main.path(forResource: "en", ofType: "lproj")
        }
        bundle = Bundle(path: path!)
    }
    
    /// 設(shè)置當前語言
    ///
    /// - Parameter language: 當前語言
    public func setLanguage(_ type: LanguageType) {
        var str = ""
        switch type {
        case .Chinese:
            str = "zh-Hans"
        case .English:
            str = "en"
        }
        let path = Bundle.main.path(forResource: str, ofType: "lproj")
        bundle = Bundle(path: path!)
        UserDefaults.standard.set(str, forKey: UserLanguage)
        UserDefaults.standard.synchronize()
    }
    
    /// 當前語言
    ///
    /// - Returns: 當前語言類型
    public func current() -> String {
        return UserDefaults.standard.value(forKey: UserLanguage) as! String
    }
}

APPdelegate中調(diào)用摘悴,建議在Window加載前調(diào)用蹂喻,就不會出現(xiàn)因為加載過快導致第一個界面語言沒有國際化的現(xiàn)象

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        
        InternationalTool.shared.initUserLanguage()
        
        window = UIWindow(frame: UIScreen.main.bounds)
        window?.backgroundColor = UIColor.white
        window?.rootViewController = ViewController()
        window?.makeKeyAndVisible()
        
        return true
    }

加載文字時口四,直接調(diào)用工具類的方法即可

label.text = InternationalTool.shared.string("國際化語言展示")

創(chuàng)建界面進行手動切換語言

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        let label = UILabel(frame: CGRect(x: 20, y: 200, width: UIScreen.main.bounds.width - 40, height: 40))
        label.backgroundColor = UIColor.lightGray
        label.text = InternationalTool.shared.string("國際化語言展示")
        label.textColor = UIColor.red
        label.textAlignment = .center
        label.font = UIFont.boldSystemFont(ofSize: 16)
        view.addSubview(label)
        
        let button = UIButton(type: .custom)
        button.frame = CGRect(x: 40, y: 260, width: 140, height: 50)
        button.backgroundColor = UIColor.purple
        button.setTitle(InternationalTool.shared.string("英文"), for: .normal)
        button.setTitleColor(UIColor.white, for: .normal)
        button.addTarget(self, action: #selector(buttonClick), for: .touchUpInside)
        view.addSubview(button)
        
        let button02 = UIButton(type: .custom)
        button02.frame = CGRect(x: 200, y: 260, width: 140, height: 50)
        button02.backgroundColor = UIColor.purple
        button02.setTitle(InternationalTool.shared.string("中文"), for: .normal)
        button02.setTitleColor(UIColor.white, for: .normal)
        button02.addTarget(self, action: #selector(button02Click), for: .touchUpInside)
        view.addSubview(button02)
    }
    
    @objc func buttonClick(_ sender: UIButton) {
        
        InternationalTool.shared.setLanguage(.English)
        
        UIApplication.shared.keyWindow?.rootViewController = ViewController()
    }
    
    @objc func button02Click(_ sender: UIButton) {
        
        InternationalTool.shared.setLanguage(.Chinese)
        
        UIApplication.shared.keyWindow?.rootViewController = ViewController()
    }
}

具體效果如下

6 App名稱國際化

創(chuàng)建Strings File文件,并命名為InfoPlist.strings

選中創(chuàng)建好的文件赤嚼,點擊右側(cè)Localize...

在彈出的窗口中點擊Localize

在右側(cè)勾選語言

配置InfoPlist.strings

CFBundleDisplayName = ""

效果如下

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蹂空,一起剝皮案震驚了整個濱河市上枕,隨后出現(xiàn)的幾起案子弱恒,更是在濱河造成了極大的恐慌,老刑警劉巖锈玉,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嘲玫,死亡現(xiàn)場離奇詭異并扇,居然都是意外死亡,警方通過查閱死者的電腦和手機土陪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門鬼雀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蛙吏,“玉大人鞋吉,你說我怎么就攤上這事谓着√陈樱” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵舷蒲,是天一觀的道長牲平。 經(jīng)常有香客問我,道長欠拾,這世上最難降的妖魔是什么骗绕? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任酬土,我火速辦了婚禮,結(jié)果婚禮上撤缴,老公的妹妹穿的比我還像新娘。我一直安慰自己微宝,他們只是感情好虎眨,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著岳守,像睡著了一般碌冶。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上譬重,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機與錄音消恍,去河邊找鬼。 笑死,一個胖子當著我的面吹牛约啊,可吹牛的內(nèi)容都是我干的恰矩。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼纪吮,長吁一口氣:“原來是場噩夢啊……” “哼萎胰!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起冰肴,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤熙尉,失蹤者是張志新(化名)和其女友劉穎搓扯,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體锨推,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡爱态,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年锦担,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片洞渔。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖堤瘤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情桥帆,我是刑警寧澤慎皱,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站祈匙,受9級特大地震影響天揖,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜些阅,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一万细、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧腰素,春花似錦雪营、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽姻政。三九已至岂嗓,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背侈咕。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工耀销, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留铲汪,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓帽揪,卻偏偏與公主長得像辅斟,于是被迫代替她去往敵國和親士飒。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344