AppleLanguages不会更改MenuController语言

时间:2020-02-02 05:22:54

标签: ios swift localizable.strings

我正在尝试更改我的应用程序语言设置“ AppleLanguages”。除了其中之一,一切都改变了。 UITextField菜单项保持不变。它始终拥有首次应用启动语言。

我已经关注了以下链接示例:Setting "AppleLanguages" doesn't change app language

我在这里使用以下代码:

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取消按钮文本,但其他项不能。

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

enter image description here

但是当我实现此代码示例时,菜单文本语言始终为英语

步骤 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);
    }
}
  1. 在AppDelegate中调用DoTheSwizzling

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        L012Localizer.DoTheSwizzling()
        return true
    }
    
  2. 创建语言实用程序

   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
        }
    }
  1. 创建语言类型

    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
            }
        }
       }
  1. 请记住,您必须在Scheme中将应用程序语言配置为SystemLanguage

  2. 然后,每当您需要对应用程序进行本地化时,只需致电即可。

    Utils.setLanguage({LanguageType})

enter image description here

这是我的info.plist

enter image description here

0 个答案:

没有答案