ios - 强制本地化 UIKit 等内部框架,无需重启应用程序

标签 ios swift localization uikit

我只需要在应用程序中添加一个切换语言的选项。 我只是坚持本地化内部框架。任何人都可以帮助我从应用程序本身本地化 UIKit 等内部框架而无需重新启动。我的代码工作正常,但对于内部框架的情况需要重新启动。只是内部框架没有本地化。

我当前的代码是:

创建一个名为 BundleExtension.swift 的文件并向其中添加以下代码 -

var bundleKey: UInt8 = 0

class AnyLanguageBundle: Bundle {

override func localizedString(forKey key: String,
                              value: String?,
                              table tableName: String?) -> String {

    guard let path = objc_getAssociatedObject(self, &bundleKey) as? String,
        let bundle = Bundle(path: path) else {

            return super.localizedString(forKey: key, value: value, table: tableName)
    }

    return bundle.localizedString(forKey: key, value: value, table: tableName)
  }
}

extension Bundle {

class func setLanguage(_ language: String) {

    defer {

        object_setClass(Bundle.main, AnyLanguageBundle.self)
    }

    objc_setAssociatedObject(Bundle.main, &bundleKey,    Bundle.main.path(forResource: language, ofType: "lproj"), .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
  }
}

现在每当你需要改变语言时调用这个方法:

func languageButtonAction() {
    // This is done so that network calls now have the Accept-Language as "hi" (Using Alamofire) Check if you can remove these
    UserDefaults.standard.set(["hi"], forKey: "AppleLanguages")
    UserDefaults.standard.synchronize()

    // Update the language by swaping bundle
    Bundle.setLanguage("hi")

    // Done to reintantiate the storyboards instantly
    let storyboard = UIStoryboard.init(name: "Main", bundle: nil)
    UIApplication.shared.keyWindow?.rootViewController = storyboard.instantiateInitialViewController()
}

最佳答案

检查这个演示,它会为你工作。

Link

关于ios - 强制本地化 UIKit 等内部框架,无需重启应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48498593/

相关文章:

ios - 如何在 Swift 中使用 place_id 从 Google Places API 请求地点详情?

android - 移动应用程序发布后是否可以从远程服务器更新?

json - 当对象具有相同的值时,如何在我的 tableView 中显示 JSON 数据?

ios - Xcode 11/iOS 13 本地化问题

ios - 如何改变UIWebview的字体颜色、字体名称和字体大小?

ios - UICollectionView 警告

ios - 使用 codegen 的核心数据实体导致 "initializer required ' init(entity :insertInto: )' " error

ios - Swift:按钮如何执行序列

javascript - ASP.NET 阿拉伯语文本 - 句号错误地出现在句首

iphone - 'right to left' 书面语言的 UITextView 对齐