ios - 应用程序的本地化不会改变应用程序中使用的 cocoapods 的语言
问题描述
我正在我的应用程序中进行本地化。当我更改语言时,它会在我的应用程序中的所有位置更新,除了我使用过的 pod。如果我重新启动应用程序,pod 的语言就会更新。当我更改应用程序的语言时,有什么方法可以更改 pod 的语言。
解决方案
mainBundle
一旦用户在应用程序中更改他们的语言偏好,您就需要交换应用程序的。
这个想法是有一个自定义的 Bundle 和扩展:
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页面中可用,例如这两个:
推荐阅读
- c# - 两种类型 A 和 B 的两个 DbSet 的问题,其中 B 继承自 A
- javascript - 如何将 CODE imagros 更改为 javascript
- docker-compose - Docker构建创建虚拟以太网接口
- amazon-web-services - aws.data.highio.i3 弹性云实例的 14 天试用期的核心数是多少?
- node.js - SequelizeJS,这是使用此模型创建此 JSON 结果的最佳方法吗
- javascript - 如何在 javascript 代码中读取 JSX 组件
- javascript - AJAX 请求无法被 PHP 脚本识别为 POST
- c# - 如何获取共享 PDF 文件的路径并在我们的应用程序中打开它?
- html - CSS填充父级
- python - 将分类报告中的准确性恢复到列表中