ios - 使用 SwiftGen 在运行时更改语言

标签 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)

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

最佳答案

好的,我找到问题了。模板正在生成静态变量:

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

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

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

关于ios - 使用 SwiftGen 在运行时更改语言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45731079/

相关文章:

localization - WinXP 上的希伯来语密码

ios - 是否可以在构建已获准进行测试时上传新构建以供试飞审查?

ios - 如何在 Swift 中检查实例的类型?

ios - UIButton 在第一次加载时不响应触摸,但在从另一个 View Controller 返回后工作

ios - 快速放大位置

javascript - 语言更改时始终重定向到主页 - 带有本地化路由器的 Angular2

ios - Gamecenter "Welcome"- 横幅未显示

ios - 尝试打印整个数组,但只有最后一个打印到 textview

ios - View 关闭后 ObservedObject View 模型仍在内存中

localization - 生成带有谷歌翻译链接的本地化语言名称列表