iOS 国际化所有内容

2018-07-09  本文已影响10人  九龙

1.基本配置国际化步骤网上已经有非常详细的教程了:https://www.jianshu.com/p/99768bb6051e

2.启动图国际化:

注意:

启动页只会保留一份, 也就是说, 你第一次加载完以后, 切换了语言, 再重新打开App, 它的启动页不会跟着更新的。 这也符合苹果的用户交互指引。
如果你想要动态修改启动页面图LaunchImage, 抱歉!根据苹果的用户交互指引,该页面是在程序加载时显示的,不建议动态修改.
正确的做法一般都是用固定的图片做启动页面图,在启动页面结束之后做任何你想做的事.
如果真想动态修改启动页面,启动页面是固定的名字,可以在程序执行之后强制把页面替换掉,不过这样APP可能会被拒.'

当我们做项目时,产品要求启动页也跟着变,我们只能在启动页完成后设置window的rootViewController为一张和启动页一样的图片的controller 然后利用图片的国际化,来实现app内部切换语言启动图也改变,如果系统语言为英语,系统第一次启动页就是英文界面,第二张启动图也是英文界面,然后App内部切换语言为中文,杀掉程序再进入,第一张系统启动图还是英文的,第二张就变成英文的了

3.APP内部切换语言:

直接上代码:

Localized:

import UIKit

let kSetLanguage ="setLanguage"

let kNotificationLanguageChanged ="languageChanged"

class Localized:NSObject{

    staticletshared =Localized()

    staticletenglish = ["en","en-CN"]

    staticletchineseHans = ["zh-Hans","zh-Hans-CN"]

    staticletchineseHant = ["zh-Hant","zh-Hant-CN"]

 static var userLanguage:String{

    get{

        var language:String=""

        let localLanguage =UserDefaults.standard.value(forKey:kSetLanguage)as?String

        guard  localLanguage !=nil && localLanguage?.count!=0 else{

            let systemLanguages = Bundle.main.preferredLocalizations

            language = systemLanguages.first!

            return language

        }

        return localLanguage!

    }

}



static func getLanguage() -> String{

    varlanguage =userLanguage

    ifchineseHans.contains(language) {

        language =chineseHans.first!

    }elseifchineseHant.contains(language){

        language =chineseHant.first!

    }else{

        language =english.first!

    }

    returnlanguage

}



static func initUserLanguage() {
    let language = getLanguage()
    Bundle.setLanguage(language)
    NotificationCenter.default.post(name: NSNotification.Name(kNotificationLanguageChanged), object: nil)
}

static func setUserlanguage(_ language:String) {
    guard Localized.userLanguage != language else{ return }
    setLanguage(language)
}

fileprivate static func setLanguage(_ language:String){
    UserDefaults.standard.set(language, forKey: kSetLanguage)
    UserDefaults.standard.synchronize()
    Bundle.setLanguage(language)
    NotificationCenter.default.post(name: NSNotification.Name(kNotificationLanguageChanged), object: nil)
}
}

BundleEx:

import UIKit

class BundleEx: Bundle {
    override func localizedString(forKey key: String, value: String?, table tableName: String?) -> String {
        if let bundle = Bundle.getLanguageBundel() {
            return bundle.localizedString(forKey: key, value: value, table: tableName)
        }else {
            return super.localizedString(forKey: key, value: value, table: tableName)
        }
    }
}
extension Bundle{

    static func setLanguage(_ language :String){
        object_setClass(Bundle.main, BundleEx.self)
        let bundle = getLanguageBundel() ?? nil
        objc_setAssociatedObject(Bundle.main, kSetLanguage, bundle, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
    }
    
    private static var onLanguageDispatchOnce: ()->Void = {
        //替换Bundle.main为自定义的BundleEx
        object_setClass(Bundle.main, BundleEx.self)
    }

    func onLanguage(){
        Bundle.onLanguageDispatchOnce()
    }
    
    class func getLanguageBundel() -> Bundle? {
        let languageBundlePath = Bundle.main.path(forResource: Localized.getLanguage(), ofType: "lproj")
        guard let bundlePath = languageBundlePath else { return nil }
        guard let languageBundle = Bundle.init(path: bundlePath) else { return nil }
        return languageBundle
    }

}
后面就简单了,直接在app加载完成后调用
    Localized.initUserLanguage()
在内部切换语言时调用
      Localized.setUserlanguage(languange)

基于[XLIFF]的本地化:

对于成熟的团队而言,项目代码量大,统计汉字是十分头疼的事情,苹果给我们开发者提供的这个工具 - xliff ,就可以把项目代码中的中文字符串 export 到 xliff文件中,给翻译团队进行翻译,翻译团队翻译成功再 import 回项目中
Export -> translation -> Import
xliff是兼容Storyboard的这点很重要
具体就不多介绍了,网上一大堆https://www.jianshu.com/p/0a345752f87a

上一篇下一篇

猜你喜欢

热点阅读