我只需要在应用程序中添加一个切换语言的选项。 我只是坚持本地化内部框架。任何人都可以帮助我从应用程序本身本地化 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()
}
最佳答案
检查这个演示,它会为你工作。
关于ios - 强制本地化 UIKit 等内部框架,无需重启应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48498593/