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)
新建一个类NSBundle+Language.h,NSBundle+Language.m。并且不要忘记添加桥接标头。
\n\nNSBundle+语言.h
\n\n#import <Foundation/Foundation.h>\n\n@interface NSBundle (Language)\n+(void)setLanguage:(NSString*)language;\n@end\nRun Code Online (Sandbox Code Playgroud)\n\nNSBundle+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\nRun Code Online (Sandbox Code Playgroud)\n\n之后使用此语言管理器更改语言:-
\n\nclass 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}\nRun Code Online (Sandbox Code Playgroud)\n\n定义语言选项如下:-
\n\nlet 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]\nRun Code Online (Sandbox Code Playgroud)\n\n使用以下代码更改所选语言
\n\nlet 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 }\nRun Code Online (Sandbox Code Playgroud)\n\n并且不要忘记在每次启动时添加此内容
\n\nif 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}\nRun Code Online (Sandbox Code Playgroud)\n\n希望这对您有帮助
\n