swift 中本地化文件的动态变化

Dynamic change of localization file in swift

我在我的应用程序中使用德语,有两种称呼人的方式“Du”和“Sie”。我想在将使用“Du”的项目中添加另一个可本地化的文件。基本上,我想知道是否有可能以某种方式检查是否选择了德语和“Du”地址,如果是,使用“Du”本地化文件?现在项目中只存在“Sie”文件,并从中获取本地化。

找到了此处描述的此问题的解决方案:Forcing iOS localization at runtime。不过重点是Bundle.swizzleLocalization()main.swift文件中应该叫

if Locale.current.languageCode == "de" {
     let appConfig = ApplicationConfiguration()
     if appConfig.germanLanguageType == "du" {
         Bundle.swizzleLocalization()
     }
 }

因此,在 main.swift 文件中,我检查了设备的首选语言,如果是德语,我检查了我的 appConfig.swift 文件,其中指定了“du”还是“sie”寻址在应用程序中使用,如果它是“du”,我调用 Bundle.swizzleLocalization()

在 Bundle 的扩展中,我只是调整了应该使用的本地化文件的路径(之前在项目中添加)

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 func myLocaLizedString(forKey key: String,value: String?, table: String?) -> String {
        guard let bundlePath = Bundle.main.path(forResource: "de-DE", 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)
    }
}