美文网首页
swift5 - 多语言 设置

swift5 - 多语言 设置

作者: promise96319 | 来源:发表于2019-07-14 16:52 被阅读0次

    1. 新建 Localizable.strings文件

    2. 添加语言

    项目名 --> info --> 添加语言


    此时Localizable.strings文件下会多出相应语言的文件

    3. 添加对应语言变量

    Localizable.strings(English)文件中添加语言变量,注意:末尾有分号!

    title = "Hello!";  
    

    Localizable.strings(Simplified)文件中添加语言变量,注意:末尾有分号!

    title = "你好!";  
    

    4. 变量的使用

    NSLocalizedString("topic", comment: "")
    

    5. 切换语言

    • 在项目文件夹(finder中)可以看到对应的语言文件,如

      这就是我们切换语言时所需要获取的文件
    • 获取语言文件函数
    // 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? {
            // 根据用户选择的不同语言,获取不同的语言的文件
           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: - 根据语言文件 和 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 {
            
            // 如果用户未设置字体,则使用系统默认字体
            if Defaults[.currentLanguage] == "" {
                return NSLocalizedString(self, comment: "")
            }
            
            // 如果用户设置过字体,则使用用户选择的字体
            return LanguageManager.localizedLanguage(key: self)
        }
    }
    

    此时,当系统改变语言设置的时候(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()
    

    相关文章

      网友评论

          本文标题:swift5 - 多语言 设置

          本文链接:https://www.haomeiwen.com/subject/ksfikctx.html