swift5 - 多語言 設置

1. 新建 Localizable.strings文件

2. 添加語言

項目名 --> info --> 添加語言


此時Localizable.strings文件下會多出相應語言的文件

3. 添加對應語言變量

Localizable.strings(English)文件中添加語言變量,注意:末尾有分號!

title = "Hello!";  

Localizable.strings(Simplified)文件中添加語言變量,注意:末尾有分號!

title = "你好!";  

4. 變量的使用

NSLocalizedString("topic", comment: "")

5. 切換語言

  • 在項目文件夾(finder中)可以看到對應的語言文件,如

    這就是我們切換語言時所需要獲取的文件
  • 獲取語言文件函數(shù)
// MARK: - 獲取 language bundle 文件  如 en.lproj
// 我也是剛學習,可能寫得不是很好,僅提供相關思路。
enum LanguageOptions: String {
    case english = "English"               // 英語
    case german = "Deutsche"                // 德語
    case chinese = "中文(簡體)"             // 中文(簡體)
    
    static func getFileName(title: String) -> String {
        switch title {
        case "English":
            return "en"
        case "Deutsche":
            return "de"
        case "中文(簡體)":
            return "zh-Hans"
        default:
            return "en"
        }
    }
}

extension Bundle {
    class func getLanguageBundle() -> Bundle? {
        // 根據(jù)用戶選擇的不同語言,獲取不同的語言的文件
       let language = LanguageOptions.getFileName(title: Defaults[.currentLanguage])

        let languageBundlePath = Bundle.main.path(forResource: language, ofType: "lproj")
        
        guard languageBundlePath != nil else {
            return nil
        }
        
        let languageBundle = Bundle.init(path: languageBundlePath!)
       
        guard languageBundle != nil else {
            return nil
        }
        
        return languageBundle!
    }
}
  • 獲取字符串
// MARK: - 根據(jù)語言文件 和 key 值獲取 相對應的 字符串
class LanguageManager {
    static func localizedLanguage(key: String) -> String {
        let languageBundle = Bundle.getLanguageBundle() ?? Bundle.main
        return NSLocalizedString(key, tableName: "Localizable", bundle: languageBundle, value: "?", comment: "")
    }
}

// MARK: - 字符串擴展(簡化本地化寫法)
extension String {
    func localized() -> String {
        
        // 如果用戶未設置字體,則使用系統(tǒng)默認字體
        if Defaults[.currentLanguage] == "" {
            return NSLocalizedString(self, comment: "")
        }
        
        // 如果用戶設置過字體,則使用用戶選擇的字體
        return LanguageManager.localizedLanguage(key: self)
    }
}

此時,當系統(tǒng)改變語言設置的時候(Defaults[.currentLanguage]),就可以通過 string.localized() 得到相應語言的字符串。

  • 用戶點擊語言,切換到相應的語言。
// 切換當點擊的語言
Defaults[.currentLanguage] = languageOptions[indexPath.row]
// 顯示切換時的loading
LCProgressHUD.showLoading("language_setting_language".localized())
// 重啟整個應用
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now()+1,
                                              execute: {
                                                LCProgressHUD.hide()
                                                UIView.animate(withDuration: 0.4, animations: {
                                                    UIApplication.shared.keyWindow?.alpha = 0
                                                }) { isFinished in
                                                    UIApplication.shared.keyWindow?.rootViewController = MainTabViewController()
                                                    UIView.animate(withDuration: 0.4, animations: {
                                                        UIApplication.shared.keyWindow?.alpha = 1
                                                    })
                                                }
                                            })

6. 使用方法

let label = UILabel()
// "title" 是前面 "Hello!"的變量名
label.text = "title".localized()
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容