Во-первых, прежде чем вы отметите это как дублированный, вот список вопросов, которые я пытался, и ни один из них не работает для меня:
Этот список можно продолжить.
Теперь, что касается вопроса, я закончил свое приложение и хотел его локализовать. Я выполнил всю разработку с использованием раскадровок, поэтому локализовал свой файл Main.storyboard
с помощью Localizable Strings
, что дало мне main.storyboard (Base)и main.strings (французский) я перевел все компоненты, и у меня есть кнопка внутри одного из моих контроллеров представления, который используется для изменения языка по умолчанию, поэтому я добавил здесь расширение для класса Bundle, код: private var relatedLanguageBundle: Character =«0»
class PrivateBundle: Bundle {
override func localizedString(forKey key: String, value: String?, table tableName: String?) -> String {
let bundle: Bundle? = objc_getAssociatedObject(self, &associatedLanguageBundle) as? Bundle
return (bundle != nil) ? (bundle!.localizedString(forKey: key, value: value, table: tableName)) : (super.localizedString(forKey: key, value: value, table: tableName))
}
}
extension Bundle {
static func swizzleLocalization() {
let orginalSelector = #selector(localizedString(forKey:value:table:))
guard let orginalMethod = class_getInstanceMethod(self, orginalSelector) else { return }
let mySelector = #selector(myLocaLizedString(forKey:value:table:))
guard let myMethod = class_getInstanceMethod(self, mySelector) else { return }
if class_addMethod(self, orginalSelector, method_getImplementation(myMethod), method_getTypeEncoding(myMethod)) {
class_replaceMethod(self, mySelector, method_getImplementation(orginalMethod), method_getTypeEncoding(orginalMethod))
} else {
method_exchangeImplementations(orginalMethod, myMethod)
}
}
@objc private func myLocaLizedString(forKey key: String,value: String?, table: String?) -> String {
guard let appDelegate = UIApplication.shared.delegate as? AppDelegate,
let bundlePath = Bundle.main.path(forResource: UserDefaults.standard.string(forKey: "AppleLanguages"), ofType: "lproj"),
let bundle = Bundle(path: bundlePath) else {
return Bundle.main.myLocaLizedString(forKey: key, value: value, table: table)
}
return bundle.myLocaLizedString(forKey: key, value: value, table: table)
}
class func setLanguage(_ language: String) {
var onceToken: Int = 0
if (onceToken == 0) {
/* TODO: move below code to a static variable initializer (dispatch_once is deprecated) */
object_setClass(Bundle.main, PrivateBundle.self)
}
onceToken = 1
objc_setAssociatedObject(Bundle.main, &associatedLanguageBundle, (language != nil) ? Bundle(path: Bundle.main.path(forResource: language, ofType: "lproj") ?? "") : nil, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}
}
так что теперь на событии click моего языка изменения
UserDefaults.standard.set("en", forKey: "AppleLanguages")
Bundle.swizzleLocalization()
это для английской кнопки то же самое для французской кнопки сначала я устанавливаю язык по умолчанию ивызовите функцию, в которой он будет повторноДобавьте значение по умолчанию и измените его соответствующим образом.
Теперь все это работает нормально, но мне нужно изменить язык без перезапуска приложения.
, поэтому, пожалуйста, любые предложения ??