// NSUserDefaults #define kLocale @"kLocale" // .plist #define kTypeLocalizable @"plist" //AppDelegate // ( ) if (![[NSUserDefaults standardUserDefaults]objectForKey:kLocale]) { // , NSString *langValue = kLangValue; //, , . NSString *key = (![langValue isEqualToString:@"ru"] && ![langValue isEqualToString:@"en"]) ? @"en" : langValue; // [[NSUserDefaults standardUserDefaults]setObject:[NSString stringWithFormat:@"%@_Localizable",key] forKey:kLocale]; } #define kLangValue ([kLanguserDefaultValue length]>2)? [kLanguserDefaultValue substringToIndex:[kLanguserDefaultValue length]-([kLanguserDefaultValue length]-2)]:kLanguserDefaultValue; // #define kNameFile [[NSUserDefaults standardUserDefaults]objectForKey:kLocale] // .plist NSDictionary #define KOLocalizable(key) [[NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:kNameFile ofType:kTypeLocalizable]] objectForKey:key]
textLabel.text = KOLocalizable(@"kText") // NSLocalizedString ("","" )
[[NSUserDefaults standardUserDefaults]setObject:@"ru_Localizable" forKey:kLocale];
textLabel.text = KOLocalized(key:"kText")
import Foundation func KOLocalized(key:String)->String{ return KOLocalizedClass.instanc.valueWith(key: key) }
class KOLocalizedClass: NSObject { static let instanc = KOLocalizedClass() private let localeArray:Array = ["ru","en"] private let keyLocale: String = "kLocale" private let endNameFile: String = "Localizable" private var localeDictionary : NSDictionary! private let typeLocalizable : String = "plist" private var nameFile : String! override init() { super.init() checkFirstInit() } //MARK: Public Methods public func changeLocalized(key:String){ UserDefaults.standard.set("\(key)_\(endNameFile)", forKey: keyLocale) nameFile = "\(key)_\(endNameFile)" updateDictionary() } //MARK: Internal Methods internal func valueWith(key:String) -> String { var value:String value = localeDictionary.object(forKey: key) as? String ?? key return value } //MARK: Privat Methods private func checkFirstInit(){ if UserDefaults.standard.object(forKey: keyLocale) == nil{ var langValue:String { var systemLocale : String = NSLocale.preferredLanguages[0] if systemLocale.characters.count > 2 { let index = systemLocale.range(of: "-")?.lowerBound systemLocale = systemLocale.substring(to: index!) } for localeString in localeArray{ if localeString == systemLocale{ systemLocale = localeString } } return systemLocale == "" ? systemLocale: "en" } UserDefaults.standard.set("\(langValue)_\(endNameFile)", forKey: keyLocale) nameFile = "\(langValue)_\(endNameFile)" }else{ nameFile = UserDefaults.standard.object(forKey: keyLocale) as! String } updateDictionary() } //Update Dictionary private func updateDictionary(){ if let path = Bundle.main.path(forResource: nameFile, ofType: typeLocalizable) { localeDictionary = NSDictionary(contentsOfFile: path)! } } }
private var localeDictionary : NSDictionary!
KOLocalizedClass.instanc.changeLocalized(key: "ru")
Source: https://habr.com/ru/post/311004/
All Articles