swift 应用内切换语言


1:在project info中的locations添加需要的语言
2:创建Localizable.strings文件 点击右边的localization勾选需要的语言
3:创建InfoPlist.strings翻译Info.plist中的提示文字和应用名称
4:创建 AppSettings.swift

import UIKit

class AppSettings: NSObject {
    
    fileprivate static let kSharedSettingsKey = "DefaultUserSettings"
    
    static let shared: AppSettings = {
        let appSettings: AppSettings
        if let savedData = UserDefaults.standard.object(forKey: AppSettings.kSharedSettingsKey) as? Data,
           let defaultSettings = NSKeyedUnarchiver.unarchiveObject(with: savedData) as? AppSettings {
            appSettings = defaultSettings
        } else {
            appSettings = AppSettings()
        }
        
        return appSettings
    }()
    
    static func saveSharedInstance() {
        let data = NSKeyedArchiver.archivedData(withRootObject: AppSettings.shared)
        UserDefaults.standard.set(data, forKey: AppSettings.kSharedSettingsKey)
    }
    
    enum Language: String {
        /// 请注意, 这个命名不是随意的, 是根据你本地的语言包,可以show in finder 看到. en.lproj / zh-Hans.lproj
        case English = "en"
        case Indonesian = "id-ID"
        case Japanese = "ja-JP"
        case Korean = "ko"
        case Singapore = "zh-Hant-TW"
        var code: String {
            return rawValue
        }
    }
    // 判断当前语言
    static func currentLanguage() -> String {
        /*
         本地缓存之前选择的语言, 若没有择返回系统语言。
         若不需要此功能, 择直接返回系统语言。
         */
        if stringDefaults(k: "AppLanguage").count > 0 {
            return stringDefaults(k: "AppLanguage")
        }
        else {
            return Locale.preferredLanguages[0]
        }
    }
    
    var language: Language
    override init() {
        // 第一次初始语言, 看手机是什么语言
        if AppSettings.currentLanguage().hasPrefix("id-ID") {
            language = .Indonesian
        }
        else if AppSettings.currentLanguage().hasPrefix("ja") {
            language = .Japanese
        }
        else if AppSettings.currentLanguage().hasPrefix("ko") {
            language = .Korean
        }
        else if AppSettings.currentLanguage().hasPrefix("zh-Hant-TW") {
            language = .Singapore
        }
        else {
            language = .English
        }
        
        super.init()
    }
    
}
private var bundleByLanguageCode: [String: Foundation.Bundle] = [:]
extension AppSettings.Language {
    var bundle: Foundation.Bundle? {
        /// 存起来, 避免一直创建
        if let bundle = bundleByLanguageCode[code] {
            return bundle
        } else {
            let mainBundle = Foundation.Bundle.main
            if let path = mainBundle.path(forResource: code, ofType: "lproj"),
               let bundle = Foundation.Bundle(path: path) {
                bundleByLanguageCode[code] = bundle
                return bundle
            } else {
                return nil
            }
        }
    }
}
/// 首先, 我们会在启动时设置成我们自己的Bundle,这样就可以做到,当使用时会调用这个方法.
class LanguageBundle: Foundation.Bundle {
    override func localizedString(forKey key: String, value: String?, table tableName: String?) -> String {
        if let bundle = AppSettings.shared.language.bundle {
            return bundle.localizedString(forKey: key, value: value, table: tableName)
        } else {
            return super.localizedString(forKey: key, value: value, table: tableName)
        }
    }
}

AppDelegate中

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        object_setClass(Foundation.Bundle.main, LanguageBundle.self)
        
        return true
    }

使用

//切换语言时,只要设置就可以:
AppSettings.shared.language = .English 
setDefaults(v: "en", k: "AppLanguage")

切换语言后重启app

func reStart()->Void {
        DispatchQueue.main.async(execute: {
            UIApplication.shared.keyWindow?.rootViewController = BulgeTabBarExample()
        })
    }


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM