使用SwiftGen在运行时更改语言

时间:2017-08-17 09:15:51

标签: ios swift localization internationalization

我的应用程序应该支持运行时的语言更改。我使用的是SwiftGen 5.0。 ViewControllers订阅了语言更改通知,并且我已检查本地化功能是否正确触发。我的覆盖tr函数如下所示:

fileprivate static func tr(_ table: String, _ key: String, _ args: CVarArg...) -> String {
    guard let bundle = LanguageManager.shared.bundle else {
        fatalError("Cannot find bundle!")
    }
    let format = NSLocalizedString(key, tableName: table, bundle: bundle, comment: "")
    let locale = Locale(identifier: LanguageManager.shared.currentLanguageKey!)
    return String(format: format, locale: locale, arguments: args)
}

bundle设置如下:

if let path = Bundle.main.path(forResource: currentLanguageKey, ofType: "lproj") {
    bundle = Bundle(path: path)
} 

但是,tr函数主要返回以前的语言字符串。当前在内存中的所有标签中只有一个刷新。在函数内设置断点并打印bundle返回

NSBundle </var/containers/Bundle/Application/ED5A6C7D-1807-4319-8817-45E693BC45E2/MyApp.app/en_US.lproj> (not yet loaded)

这是正确的新语言。应用重启后,语言设置正确。我做错了吗?

1 个答案:

答案 0 :(得分:1)

好的,我发现了问题。模板生成静态变量:

static let label = L10n.tr("Localizable", "registration_verify.pin_code.label")

更改模板以生成计算属性可修复行为:

static var label: String { 
    return L10n.tr("Localizable", "registration_verify.pin_code.label")
}