如何在不重新启动应用程序swift4的情况下更改本地化语言?

Jho*_*ony 6 multilingual localization ios swift

你好我试图在不重新启动应用程序的情况下更改本地化字符串文件,更改语言后,我需要重新启动应用程序以查看新语言,这就是我正在更改应用程序语言的方式,但是我需要重新启动应用程序才能使用此库查看更改 https ://github.com/marmelroy/Localize-Swift我需要以编程方式设置所有标签值,这令人头疼,我不想这样

var selectedLanguage:Languages
let preferredLanguage : String = Bundle.main.preferredLocalizations.first!
print("app langugage \(preferredLanguage)")
if(preferredLanguage == "en") {
    // Localize.setCurrentLanguage("de")
    selectedLanguage = .de
    LanguageManger.shared.setLanguage(language: selectedLanguage)
}
else {
    // Localize.setCurrentLanguage("en")
    selectedLanguage = .en
    LanguageManger.shared.setLanguage(language: selectedLanguage)

}

LanguageManger.shared.setLanguage(language: selectedLanguage)

// return to root view contoller and reload it

let transition: UIViewAnimationOptions = .transitionFlipFromLeft
let rootviewcontroller: UIWindow = ((UIApplication.shared.delegate?.window)!)!
        rootviewcontroller.rootViewController = self.storyboard?.instantiateViewController(withIdentifier: "rootnav")
        let mainwindow = (UIApplication.shared.delegate?.window!)!
        mainwindow.backgroundColor = UIColor(hue: 0.6477, saturation: 0.6314, brightness: 0.6077, alpha: 0.8)
        UIView.transition(with: mainwindow, duration: 0.55001, options: transition, animations: { () -> Void in
        }) { (finished) -> Void in

}
Run Code Online (Sandbox Code Playgroud)

Hus*_*ala 1

新建一个类NSBundle+Language.h,NSBundle+Language.m。并且不要忘记添加桥接标头。

\n\n

NSBundle+语言.h

\n\n
#import <Foundation/Foundation.h>\n\n@interface NSBundle (Language)\n+(void)setLanguage:(NSString*)language;\n@end\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

NSBundle+Language.m

\n\n
#import "NSBundle+Language.h"\n\n#import <objc/runtime.h>\n\nstatic const char _bundle=0;\n\n@interface BundleEx: NSBundle\n@end\n\n@implementation BundleEx\n-(NSString*)localizedStringForKey:(NSString *)key value:(NSString *)value table:(NSString *)tableName\n{\n    NSBundle* bundle=objc_getAssociatedObject(self, &_bundle);\n    return bundle ? [bundle localizedStringForKey:key value:value table:tableName]: [super localizedStringForKey:key value:value table:tableName];\n}\n@end\n\n@implementation NSBundle (Language)\n\n+(void)setLanguage:(NSString*)language\n{\n    static dispatch_once_t onceToken;\n    dispatch_once(&onceToken, ^\n                  {\n                      object_setClass([NSBundle mainBundle],[BundleEx class]);\n                  });\n    objc_setAssociatedObject([NSBundle mainBundle], &_bundle, language ? [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:language ofType:@"lproj"]]: nil, OBJC_ASSOCIATION_RETAIN_NONATOMIC);\n}\n@end\n
Run Code Online (Sandbox Code Playgroud)\n\n

之后使用此语言管理器更改语言:-

\n\n
class LanguageManager: NSObject {\n    //MARK: Set language preference\n\n    class func setSelectedLanguage(dictionary: [String: String]) {\n        let userDefaults = UserDefaults.standard\n        userDefaults.set(dictionary, forKey: kSelectedLanguageDetails)\n        userDefaults.synchronize()\n    }\n\n    class  func getSelectedLanguage() ->  [String: String]? {\n\n        let userDefaults = UserDefaults.standard\n        return userDefaults.value(forKey: kSelectedLanguageDetails) as?  [String: String]\n    }\n\n    class func getSelectedLangaugeCode() -> String{\n        if let selectedLanguageDetails = LanguageManager.getSelectedLanguage() {\n            if let languageCode =  selectedLanguageDetails[LocalizationKeys.kLanguageCode.rawValue]  {\n                Bundle.setLanguage(LanguageManager.getAppleLanguageCode(languageCode: languageCode.lowercased()))\n                return languageCode.lowercased()\n            }\n            else {\n                let languageDetails = [LocalizationKeys.kLanguageCode.rawValue:"EN", LocalizationKeys.kLanguageName.rawValue:"English", LocalizationKeys.kLanguageID.rawValue:"1"]\n                LanguageManager.setSelectedLanguage(dictionary: languageDetails)\n                if let languageCode =  languageDetails[LocalizationKeys.kLanguageCode.rawValue] {\n                    Bundle.setLanguage(LanguageManager.getAppleLanguageCode(languageCode: languageCode.lowercased()))\n                    return languageCode.lowercased()\n                }\n            }\n        }\n        else {\n            let languageDetails = [LocalizationKeys.kLanguageCode.rawValue:"EN", LocalizationKeys.kLanguageName.rawValue:"English", LocalizationKeys.kLanguageID.rawValue:"1"]\n            LanguageManager.setSelectedLanguage(dictionary: languageDetails )\n            if let languageCode =  languageDetails[LocalizationKeys.kLanguageCode.rawValue] {\n                Bundle.setLanguage(LanguageManager.getAppleLanguageCode(languageCode: languageCode.lowercased()))\n                return languageCode.lowercased()\n            }\n        }\n        return "en"\n    }\n\n    /// Checks for the Language preferences selected by user\n    class func checkLanguagePreferenceAndSetToDefaults() {\n        if let selectedLanguageDetails = LanguageManager.getSelectedLanguage() {\n            if let languageCode =  selectedLanguageDetails[LocalizationKeys.kLanguageCode.rawValue]  {\n                Bundle.setLanguage(LanguageManager.getAppleLanguageCode(languageCode: languageCode.lowercased()))\n            }\n            else {\n                let languageDetails = [LocalizationKeys.kLanguageCode.rawValue:"EN", LocalizationKeys.kLanguageName.rawValue:"English", LocalizationKeys.kLanguageID.rawValue:"1"]\n                LanguageManager.setSelectedLanguage(dictionary: languageDetails)\n                if let languageCode =  languageDetails[LocalizationKeys.kLanguageCode.rawValue] {\n                    Bundle.setLanguage(LanguageManager.getAppleLanguageCode(languageCode: languageCode.lowercased()))\n                }\n            }\n        }\n        else {\n            let languageDetails = [LocalizationKeys.kLanguageCode.rawValue:"EN", LocalizationKeys.kLanguageName.rawValue:"English", LocalizationKeys.kLanguageID.rawValue:"1"]\n            LanguageManager.setSelectedLanguage(dictionary: languageDetails )\n            if let languageCode =  languageDetails[LocalizationKeys.kLanguageCode.rawValue] {\n                Bundle.setLanguage(LanguageManager.getAppleLanguageCode(languageCode: languageCode.lowercased()))\n            }\n        }\n    }\n\n\n    //MARK: Get Language Code\n\n    /// Return apple specific language code\n    ///\n    /// - parameter languageCode: language code string\n    ///\n    /// - returns: apples language code\n    static func getAppleLanguageCode(languageCode:String) -> String{\n        switch languageCode.lowercased() {\n        case "en":\n            return "en"\n        case "es":\n            return "es"\n        case "fr":\n            return "fr"\n        case "de":\n            return "de"\n        case "it":\n            return "it"\n\n        default:\n            return languageCode\n        }\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

定义语言选项如下:-

\n\n
let KlanguageOptionArray: [[String:String]] = [\n    [\n        "LanguageCode": "EN",\n        "Name": "English",\n        "LanguageID": "1"\n        ],\n    [\n        "LanguageCode": "ES",\n        "Name": "Espa\xc3\xb1ol",\n        "LanguageID": "2"\n        ],\n    [\n        "LanguageCode": "FR",\n        "Name": "Fran\xc3\xa7ais",\n        "LanguageID": "3"\n        ],\n    [\n        "LanguageCode": "DE",\n        "Name": "Deutsch",\n        "LanguageID": "4"\n        ],\n    [\n        "LanguageCode": "IT",\n        "Name": "Italiano",\n        "LanguageID": "5"\n        ]\n]\n
Run Code Online (Sandbox Code Playgroud)\n\n

使用以下代码更改所选语言

\n\n
let selectedLanguageDetails = self.languageOptionArray[indexPath.row]\nLanguageManager.setSelectedLanguage(dictionary: selectedLanguageDetails)\nif let languageCode = selectedLanguageDetails[LocalizationKeys.kLanguageCode.rawValue] {\n            Bundle.setLanguage(LanguageManager.getAppleLanguageCode(languageCode: languageCode.lowercased()))\n      NotificationCenter.default.post(name: NSNotification.Name(rawValue: NotificationCenterTypes.ReloadTableOnLanguageChangeNotification), object: nil)\n   }\n
Run Code Online (Sandbox Code Playgroud)\n\n

并且不要忘记在每次启动时添加此内容

\n\n
if let selectedLanguageDetails = LanguageManager.getSelectedLanguage() {\n    if let languageCode =  selectedLanguageDetails[LocalizationKeys.kLanguageCode.rawValue]  {\n        Bundle.setLanguage(LanguageManager.getAppleLanguageCode(languageCode: languageCode.lowercased()))\n    }\n    else {\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

希望这对您有帮助

\n