我正在我的应用程序中进行本地化。当我更改语言时,它会在我的应用程序中的任何地方更新,除了我曾经使用过的Pod。如果我重新启动应用程序,则pod的语言会更新。更改应用程序的语言后,有什么方法可以更改pod的语言。
答案 0 :(得分:0)
一旦用户在应用程序中更改其语言首选项,您就需要交换应用程序的mainBundle
。
想法是拥有一个自定义的捆绑包和扩展名:
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 updateAppLanguageToIT() {
UserDefaults.standard.set("it", forKey: "AppleLanguages")
UserDefaults.standard.synchronize()
// Update the language by swaping bundle
Bundle.setLanguage("it")
// Done to reintantiate the storyboards instantly
let storyboard = UIStoryboard.init(name: "Main", bundle: nil)
UIApplication.shared.keyWindow?.rootViewController = storyboard.instantiateInitialViewController()
}
关于如何实现这一点的一些参考资料已经在类似这两个的一些帖子/ github页面中提供了: