AppSettings.swift 8.34 KB
//
//  AppSettings.swift
//  zc
//
//  Created by wyp on 2021/1/18.
//  Copyright © 2021 wyp. All rights reserved.
//
import Foundation
import MBProgressHUD

class AppSettings: NSObject {

    fileprivate static let kSharedSettingsKey = "DefaultUserSettings"

    static let shared: AppSettings = AppSettings()
    
//    {
//        let appSettings: AppSettings
//        if let savedData = UserDefaults.standard.object(forKey: AppSettings.kSharedSettingsKey) as? Data,
//            let defaultSettings = NSKeyedUnarchiver.unarchiveObject(with: savedData) as? AppSettings {
//            self.langua
//        } else {
//            appSettings = AppSettings()
//        }
//
//        return appSettings
//    }()

    func saveSharedInstance() {
        UserDefaults.standard.set(language.rawValue, forKey: AppSettings.kSharedSettingsKey)
    }

    enum Language: String {
        case Chinese = "zh-Hans"
        case English = "en"
        case Russisch = "ru"
        case Spanish = "es"
        case German = "de"
        case Italy = "it"
        case French = "fr"
        case Vietnamese = "vi"
        case Poland = "pl"
        case Dutch = "nl"
        case Greek = "el" //10
        case Turkey = "en??1"
        case Ronmanian = "en??2"
        case Bulgarian = "en?3"
        case TChinese = "en??4"
        case Hebrew = "he"
        case Danish = "da"
        case Serbia = "en??5"
        case Sweden = "en??6"
        case Czech = "cs" //19
        case Skovak = "sk"
        case Hungarian = "hu"
        case WHERE = "en????"
        case Japanese = "ja"
        case Thai = "th"
        case Ukraine = "en??7"
        case Suomi = "en??8"
        case Norsk = "en??9"
        case Korean = "ko"
        case Indonesian = "id"
        case Latvia = "lv" //30
        case Lithuania = "lt"
        case Estonia = "et"
        case Portuguese = "pt"
        case Arab = "ar"
        case Malay = "ms"
        
        case system = "system"
        var code: String {
            return rawValue
        }
    }
//        var cmd: UInt8 {
//            switch rawValue: {
//            case  "zh-Hans":
//                return 0x01
//            case  "en":
//                return 0x00
//            default:
//                return 0x00
//            }
//        }
        

        
    
    static func localeIsChinese() -> Bool {
        if let lang = Locale.preferredLanguages.first {
            if lang.hasPrefix("zh") {
                return true
            } else {
                return false
            }
        } else {
            return false
        }
    }
    
    static func localeLanguage() -> Language {
        if let lang = Locale.preferredLanguages.first {
            if lang.hasPrefix("zh") {
                return .Chinese
            }  else if lang.hasPrefix("en") {
                return .English
            } else if lang.hasPrefix("ru") {
                return .Russisch
            } else if lang.hasPrefix("es") {
                return .Spanish
            } else if lang.hasPrefix("de") {
                return .German
            } else if lang.hasPrefix("it") {
                return .Italy
            } else if lang.hasPrefix("fr") {
                return .French
            } else if lang.hasPrefix("pl") {
                return .Poland
            } else if lang.hasPrefix("cs") {
                return .Czech
            } else if lang.hasPrefix("sk") {
                return .Skovak
            } else if lang.hasPrefix("hu") {
                return .Hungarian
            } else if lang.hasPrefix("ja") {
                return .Japanese
            } else if lang.hasPrefix("lv") {
                return .Latvia
            } else if lang.hasPrefix("lt") {
                return .Lithuania
            } else if lang.hasPrefix("et") {
                return .Estonia
            } else if lang.hasPrefix("pt") {
                return .Portuguese
            } else if lang.hasPrefix("ar") {
                return .Arab
            } else if lang.hasPrefix("th") {
                return .Thai
            }  else if lang.hasPrefix("ms") {
                return .Malay
            } else  {
                return .English
            }
        }
        return .English
    }


    var language: Language = {
//        return .English
//        return .Chinese
        return AppSettings.localeLanguage()
//        if let savedData = UserDefaults.standard.object(forKey: AppSettings.kSharedSettingsKey) as? String {
//            return Language(rawValue: savedData) ?? .Chinese
//        } else {
//            return  AppSettings.localeIsChinese() ? .Chinese : .English
//        }
    }()
    
    
    var _bundle: UInt8 = 0;
    func setLanguage(language: Language) {
        if self.language != language {
            self.language = language
            saveSharedInstance()
            let hud = MBProgressHUD.showMessage("")
            DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
                hud?.hide(animated: true)
                KeyWindow.rootViewController = ZCTabBarController()
            }
//            if let appdelegate = UIApplication.shared.delegate {
//                let storyBoard = UIStoryboard.init(name: "Main", bundle: nil)
//                if let mainController = storyBoard.instantiateViewController(withIdentifier: "rootViewController") as? UINavigationController {
                
//                }
//            }
        } else {
            
        }
        self.language = language
        saveSharedInstance()
    }
    
    
    override init() {
        // 第一次初始语言, 看手机是什么语言
//        language = AppSettings.localeIsChinese() ? .Chinese : .English
//        language = .system
        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
            }
        }
    }
    
    var cmd: UInt8 {
        switch self {
        case .Chinese:
            return 0x00
        case .English:
            return 0x01
        case .Russisch:
            return 0x02
        case .Spanish:
            return 0x03
        case .German:
            return 0x04
        case .Italy:
            return 0x05
        case .French:
            return 0x06
        case .Vietnamese:
            return 0x07
        case .Poland:
            return 0x08
        case .Dutch:
            return 0x09
        case .Greek: //
            return 10
        case .Turkey:
            return 11
        case .Ronmanian:
            return 12
        case .Bulgarian:
            return 13
        case .TChinese:
            return 14
        case .Hebrew:
            return 15
        case .Danish:
            return 16
        case .Serbia:
            return 17
        case .Sweden:
            return 18
        case .Czech:
            return 19
        case .Skovak:
            return 20
        case .Hungarian:
            return 21
        case .WHERE:
            return 22
        case .Japanese:
            return 23
        case .Thai:
            return 24
        case .Ukraine:
            return 25
        case .Suomi:
            return 26
        case .Norsk:
            return 27
        case .Korean:
            return 28
        case .Indonesian:
            return 29
        case .Latvia:
            return 30
        case .Lithuania:
            return 31
        case .Estonia:
            return 32
        case .Portuguese:
            return 33
        case .Arab:
            return 34
        case .system:
            return 0x00
        case .Malay:
            return 0x00
        }
    }
}

class HDFBundle: 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)
        }
    }
}