强制本地化内部框架,如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()
}

检查此演示,它将为您工作。

链接

你的代码看起来不错,但我尝试的是......

当从应用程序更改语言时,然后...

Bundle.setLanguage("fr")
UserDefaults.standard.set(["fr"], forKey: kAppleLanguages)
UserDefaults.standard.synchronize()
NotificationCenter.default.post(name: NSNotification.Name.init("AppLanguageChangeNotification"), object: nil)

因此,每当更改语言时,都会触发此通知,并且将通知向其添加观察者的视图控制器,并根据该语言需要更改。

添加观察者

NotificationCenter.default.addObserver(viewController, selector: #selector(self.setLocalization), name: NSNotification.Name.init("AppLanguageChangeNotification"), object: nil)

方法

@objc fileprivate func setLocalization() {
self.lblProfile.text = NSLocalizedString("lblProfile", comment: "")
self.lbDetails.text = NSLocalizedString("lblDetails", comment: "")
.
.
}

是的,这是位日志过程,因为您需要拥有所有IBOutles来设置本地化文本。

这取决于您要本地化的特定框架。这需要知道从这个框架从哪里获得本地化。在大多数情况下,这是不可能的,因为您必须对框架的本地化文件的路径进行硬编码,或者了解一些破坏框架思想的框架:对实现了解较少,您应该知道的只是接口。

要实现您想要的,您应该拥有本地化的唯一来源。

使用 pod 或其他一些非系统框架,您可以分叉它们并更改它,以便您可以将字符串传递给它。

对于系统库,这可能是不可能的,因为没有机会以某种方式更改它。但是我知道的所有情况都可以在这些系统库的帮助下实现,例如,我说的是本地化的导航栏按钮。您可以制作自己的按钮并将其标题设置为您想要的任何内容。

希望对您有所帮助。如果没有,那么您可以展示您无法本地化的确切示例,我会尽力帮助您。

我遇到了同样的问题,唯一的解决方案是完全重新加载所有UIViewController

相关内容

最新更新