AppleLanguages ​​не меняет язык MenuController - PullRequest
1 голос
/ 02 февраля 2020

Я пытаюсь изменить настройку языка приложения "AppleLanguages". Все изменилось, кроме одного из них. Пункты меню UITextField не меняются. Он всегда содержит язык запуска приложения впервые.

Я уже следовал примеру ссылки: Настройка «AppleLanguages» не меняет язык приложения

Здесь я использовал этот код:

UserDefaults.standard.set(appleLanguages, forKey: "AppleLanguages")
UserDefaults.standard.synchronize()

if let languageDirectoryPath = Bundle.main.path(forResource: languageCode, ofType: "lproj"){
    bundle = Bundle.init(path: languageDirectoryPath)
}

Хотя я изменил текст кнопки отмены UIsearchbar в Engli sh, другие элементы не могут.

if let searchBtn = searchBar.value(forKey: "cancelButton") as? UIButton{
    searchBtn.setTitle(Messages.shared.CANCEL, for: .normal)
}

enter image description here

Но когда я реализовал этот код Например, язык текста меню всегда Engli sh

Шаг 1. Создайте расширение Bundle

import Foundation

class L012Localizer: NSObject {
    class func DoTheSwizzling() {
        MethodSwizzleGivenClassName(cls: Bundle.self, originalSelector: #selector(Bundle.localizedString(forKey:value:table:)), overrideSelector:
            #selector(Bundle.specialLocalizedString(key:value:table:)))
    }
}

extension Bundle {
    @objc func specialLocalizedString(key: String, value: String?, table tableName: String?) -> String {
        let currentLanguage = Utils.currentLanguage().rawValue
        var bundle = Bundle();
        if currentLanguage != "" , 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.specialLocalizedString(key: key, value: value, table: tableName))
    }
}

func MethodSwizzleGivenClassName(cls: AnyClass, originalSelector: Selector, overrideSelector: Selector){

    let origMethod: Method = class_getInstanceMethod(cls, originalSelector)!;
    let overrideMethod: Method = class_getInstanceMethod(cls, overrideSelector)!;
    if (class_addMethod(cls, originalSelector, method_getImplementation(overrideMethod), method_getTypeEncoding(overrideMethod))) {
        class_replaceMethod(cls, overrideSelector, method_getImplementation(origMethod), method_getTypeEncoding(origMethod));
    } else {
        method_exchangeImplementations(origMethod, overrideMethod);
    }
}

Вызов DoTheSwizzling в AppDelegate

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    L012Localizer.DoTheSwizzling()
    return true
}

Создание языковых утилит

   class Utils: NSObject {
        class func setLanguage(_ lang: LanguageType) {
            UserDefaults.standard.set([lang.rawValue], forKey: "AppleLanguages")
        }
        class func currentLanguage() -> LanguageType {
            if let langs = UserDefaults.standard.object(forKey: "AppleLanguages") as? [String], let currentLang = langs.first {
                return LanguageType(rawValue: currentLang) ?? .english
            }

            return .english
        }
    }
Создать тип языка

    enum LanguageType: String {
        case english = "en"
        case korea = "ko"
        case vietnamese = "vi-VN"

        func toString() -> String {
            switch self {
            case .korea:
                return "Korea".localized
            case .vietnamese:
                return "Vietnamese".localized
            default:
                return "English".localized
            }
        }
       }

Помните, что вы должны настроить язык приложения в Scheme на SystemLanguage

Затем Каждый раз, когда вам нужно локализовать ваше приложение, вам нужно только позвонить.

Utils.setLanguage({LanguageType})

enter image description here

Вот мой info.plist

enter image description here

...