Прежде всего, я добавил свой арабский язык 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
}