美文网首页
iOS 国际化所有内容

iOS 国际化所有内容

作者: 九龙 | 来源:发表于2018-07-09 10:59 被阅读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

    相关文章

      网友评论

          本文标题:iOS 国际化所有内容

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