Swift实现本地化多语言,咋操作?

4,201 阅读2分钟

本地化多语言是啥?

在App项目中,通常开发者仅仅会支持一种语音。比如中国大陆区的开发者,仅支持汉语版。多语言的好处可以帮助运营适配各个国家的App名称,以及内容方便App进行出海前的准备工作。

咋配置呢?

1.添加配置

项目配置 -> “Info” -> “Localizations”区域下,可以看到工程默认只支持英文,我们可以再添加中文语言。实际根据自身需求,进行添加。

image.png
2.点击Finsh添加配置
image.png
3.添加Localizable配置

在工程中,右键添加文件(New File...),选择Resource下的Strings File文件类型,文件名定义为“Localizable.strings”

Localizable名字一定不要瞎起,不然无法正常使用!

image.png
4.创建需要的语言类型
image.png
5.分别在英文和中文资源下,输入如下键值对

;一定不能忘记了!

//中文资源里

"Welcome" = "欢迎你好";

//英文资源里

"Welcome" = "Welcome to Hello";

切换语言的话,咋配置呢?

1.创建一个单例类进行管理
import UIKit

enum LanguageType {
    case chinese,english,auto
}

class LocalizableManager: NSObject {  
    static func localValue(_ str:String) -> String {
        LocalizableManager.shared.localValue(str: str)
    } 
    static func setLanguage(_ type:LanguageType){
        LocalizableManager.shared.setLanguage(type)
    }
    
    //单例
    static let shared = LocalizableManager()
    
     private override init() {      }
    
    var bundle:Bundle = Bundle.main
    
    private func localValue(str:String) -> String{
        //table参数值传nil也是可以的,传nil系统就会默认为Localizable
        bundle.localizedString(forKey: str, value: nil, table: "Localizable")
    }
    
    /// 获取系统语言方法-->可以根据自身业务场景进行处理
    private func getCurrentLanguage() -> String {
        let preferredLang = NSLocale.preferredLanguages.first! as NSString
        switch String(describing: preferredLang) {
        case "en-US", "en-CN":
            return "en"//英文
        case "zh-Hans-US","zh-Hans-CN","zh-Hant-CN","zh-TW","zh-HK","zh-Hans":
            return "cn"//中文
        default:
            return "en"
        }
    }
    
    private func setLanguage(_ type:LanguageType){
        var typeStr = ""
        switch type {
        case .chinese:
            typeStr = "zh-Hans"
            UserDefaults.standard.setValue("zh-Hans", forKey: "language")
        case .english:
            typeStr = "en"
            UserDefaults.standard.setValue("en", forKey: "language")
        default:
            break
        }
        //返回项目中 en.lproj 文件的路径
        let path = Bundle.main.path(forResource: typeStr, ofType: "lproj")
        //用这个路径生成新的bundle
        bundle = Bundle(path: path!)!
        if type == .auto {
            //和系统语言一致
            bundle = Bundle.main
            UserDefaults.standard.removeObject(forKey: "language")
        }
        NotificationCenter.default.post(name: NSNotification.Name(rawValue: "languageChanged"), object: nil)
    }

}

2.在AppDelegate,获取设置的语言
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

        // Override point for customization after application launch.

        if let languageType = UserDefaults.standard.value(forKey: "language"){

            print(languageType)

            let type = languageType as! String

            switch type {

            case "en":

                LocalizableManager.setLanguage(.english)

            case "zh-Hans":

                LocalizableManager.setLanguage(.chinese)

            default:

                break

            }

        }

        return true

    }
3.使用示例

添加切换的监听事件

NotificationCenter.default.addObserver(forName: NSNotification.Name(rawValue: "languageChanged"), object: nil,  queue: nil) { (notification) in
    self.setUpdateUI()
}

func setUpdateUI(){
    //取值
    languageLabel.text = LocalizableManager.localValue("auto")
}


4.项目配置中切换语音
image.png

App名字,如何配置呢?

同理,还是需要创建一个 .String 的文件。名字命名为 InfoPlist.strings 千万不要改成其他的名字否则无效!

//中文配置:
"CFBundleDisplayName" = "名字"

//英文文配置:
"CFBundleDisplayName" = "Name"