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

本地化多语言是啥?

在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"




© 版权声明
THE END
喜欢就支持一下吧
点赞0

Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MYeMpSmd' (Errcode: 28 - No space left on device) in /www/wwwroot/583.cn/wp-includes/class-wpdb.php on line 2345
admin的头像-五八三
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

图形验证码
取消
昵称代码图片