Изменить язык раскадровки без перезапуска приложения - PullRequest
0 голосов
/ 19 сентября 2019

Во-первых, прежде чем вы отметите это как дублированный, вот список вопросов, которые я пытался, и ни один из них не работает для меня:

Этот список можно продолжить.

Теперь, что касается вопроса, я закончил свое приложение и хотел его локализовать. Я выполнил всю разработку с использованием раскадровок, поэтому локализовал свой файл 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()

это для английской кнопки то же самое для французской кнопки сначала я устанавливаю язык по умолчанию ивызовите функцию, в которой он будет повторноДобавьте значение по умолчанию и измените его соответствующим образом.

Теперь все это работает нормально, но мне нужно изменить язык без перезапуска приложения.

, поэтому, пожалуйста, любые предложения ??

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...