Я добавляю это в файл main.swift
(swift-3, но можно перенести в swift-4) ..
import Foundation
struct Static {
static var token: dispatch_once_t = 0
static var kBundleKey:Int = 0
static var kLanguageKey:Int = 0
}
class SwizzleBundle : NSBundle {
override func localizedStringForKey(key: String, value: String?, table tableName: String?) -> String {
let bundle: NSBundle? = objc_getAssociatedObject(self, &Static.kBundleKey) as? NSBundle
guard (bundle != nil) else {
return super.localizedStringForKey(key, value: value, table: tableName)
}
return (bundle?.localizedStringForKey(key, value: value, table: tableName))!
}
override var preferredLocalizations: [String] {
let bundle: NSBundle? = objc_getAssociatedObject(self, &Static.kBundleKey) as? NSBundle
let language: String? = objc_getAssociatedObject(self, &Static.kLanguageKey) as? String
guard (bundle != nil) else {
return super.preferredLocalizations
}
return [language ?? : "en-CA"]
}
}
extension NSBundle {
static func setLanguage(language: String?) -> Void {
dispatch_once(&Static.token) {
object_setClass(NSBundle.mainBundle(), SwizzleBundle.self);
}
var path = NSBundle.mainBundle().pathForResource("Base", ofType: "lproj")!
if let language = language {
path = NSBundle.mainBundle().pathForResource(language, ofType: "lproj")!
}
objc_setAssociatedObject(NSBundle.mainBundle(), &Static.kBundleKey, NSBundle(path: path), .OBJC_ASSOCIATION_RETAIN_NONATOMIC);
objc_setAssociatedObject(NSBundle.mainBundle(), &Static.kLanguageKey, language, .OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
}
NSBundle.setLanguage("en-CA")
UIApplicationMain(Process.argc, Process.unsafeArgv, NSStringFromClass(Application), NSStringFromClass(AppDelegate))
Работает, изменяя язык ДО вызова UIApplicationMain
.С этого момента вы можете менять язык в любое время, когда хотите, чтобы функция была быстро изменена.
Это сработало для меня на iOS 9. Я еще не тестировал его ни для чего выше.