локализация в swift 5 (кнопка смены языка не работает) - PullRequest
0 голосов
/ 10 апреля 2020

Прежде всего, я добавил свой арабский язык c и все готово, и я протестировал его на примере, но моя проблема, когда я нажимаю кнопку смены языка, он должен изменить язык с арабского c на английский sh и наоборот. но, похоже, он не работает, и я видел видео, этот пример работал со swift2: здесь есть проблема, если я сделал что-то не так, потому что я добавил код в AppDelegate, а не SceneDelegate .. вот и все, что я знаю: теперь вот мой код

// кнопка изменения языка в моем viewController, а rootV C - это мой идентификатор раскадровки:

@IBAction func changelanguage(sender:UIButton) {
        if Language.currentLanguage() == "ar" {
            Language.setAppLanguage(lang: "en-US")
        }else{
            Language.setAppLanguage(lang: "ar")

        }
        let window = (UIApplication.shared.delegate as? AppDelegate)?.window

        let sb = UIStoryboard.init(name: "Main", bundle: nil)
        window?.rootViewController = sb.instantiateViewController(withIdentifier: "rootVC")
    }

//and here is my Language swift file :

import Foundation

class Language {

   class func currentLanguage() -> String {
    let def = UserDefaults.standard

             let langs = def.object(forKey: "AppleLanguages") as! NSArray
        let firstLang = langs.firstObject as! String

         return firstLang
        }

    class func  setAppLanguage(lang: String) {
        let def = UserDefaults.standard

        def.set([lang, currentLanguage()],forKey: "AppleLanguages")
        def.synchronize()
    }
}

//and the swift file called Localizer:

import Foundation

class Localizer {
    class func doTheExchange(){
        exchangeMethodsForClass(className: Bundle.self, originalSelector: #selector(Bundle.localizedString(forKey:value:table:)), overrideSelector: #selector(Bundle.customLocalizedStringForKey(key:value:table:)))
    }

}

    extension Bundle {
        @objc func customLocalizedStringForKey(key:String, value: String?,table tableName: String) -> String {


        let currentLanguage = Language.currentLanguage()

        var bundle = Bundle()

        if let path = Bundle.main.path(forResource: currentLanguage, ofType:"lproj") {
            bundle = Bundle(path: path)!
        }else{
            let path = Bundle.main.path(forResource: "Base", ofType: "lproj")
            bundle = Bundle(path: path!)!
        }
        return bundle.customLocalizedStringForKey(key: key, value: value, table: tableName)

    }

}

func exchangeMethodsForClass(className:AnyClass, originalSelector:Selector,overrideSelector:Selector){

    let originalMethod:Method = class_getInstanceMethod(className, overrideSelector)!
    let overrideMethod:Method = class_getInstanceMethod(className, overrideSelector)!

    if class_addMethod(className, originalSelector, method_getImplementation(overrideMethod), method_getTypeEncoding(overrideMethod)){

    class_replaceMethod(className, overrideSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod))
    }else{

        method_exchangeImplementations(originalMethod, overrideMethod)
    }
}

and finally my AppDelegate file:
and here is my question is the problem from here !!
//should I do this in sceneDelegate not AppDelegate !! , if yes how can I do this in SceneDelegate

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        Localizer.doTheExchange()
        return true
    }

1 Ответ

0 голосов
/ 10 апреля 2020

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

func exchangeMethodsForClass(className:AnyClass, originalSelector:Selector,overrideSelector:Selector){

    let originalMethod:Method = class_getInstanceMethod(className, overrideSelector)!
    let overrideMethod:Method = class_getInstanceMethod(className, originalSelector)!
...