Swift 更新有关语言更改的文本

Swift update text on language change

我已经搜索了几个小时,但一直找不到答案。我正在制作一个使用多种语言的应用程序,用户可以在运行时更改这些语言,这对于产品来说是必需的。现在我可以使用以下代码更改语言:

userDefaults.setObject(["\(cc)"], forKey: "AppleLanguages")
userDefaults.synchronize()

这段代码效果很好。如果我将语言设置从荷兰语更改为英语,它确实会发生变化。底层代码是。我的应用程序使用服务器,当我尝试使用不同的凭据登录英语或荷兰语服务时,它会识别它们并让我登录。但是,在重新启动之前视图不会改变。我试着用这个改变它:

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(true)
    check.text = NSLocalizedString("currentLangauge", comment: "Just a check")
}

检查标签声明为:

@IBOutlet weak var check: UILabel!

重启后它会更新,但不会在运行时更新,我知道这应该是可能的,因为我已经看到应用程序这样做了。我在 Objective-C 中找到了一些使用 NSBundle 的示例,但我不熟悉 Objective-C,并且我不知道如何将其转换为 Swift。

Objective-C中的示例之一:iOS Change app Language doesn't take effect

有人有这方面的经验吗?

很遗憾,您需要手动管理进程。您需要编写自己的 NSLocalizedString 替换 class,检查用户默认值并读取语言,然后从正确的字符串文件加载字符串。

您还需要一种机制来通知标签/文本视图/按钮它们应该在用户更改语言时re-render它们的标题,因为当设置更改时,很可能会有公平很少有视图在内存中显示文本。一个粗略的解决方案是子 class 基础 classes,用一个字符串键初始化它们,用它来执行自己的文本查找。然后让他们响应您在用户更改语言时触发的语言更改通知。然后他们可以使用您的 NSLocalizedString 替换 class.

执行另一个字符串查找

其实没有说的那么努力,但就是努力。尽可能多地了解字符串本地化可能是值得的。这里有一些很好的资源。

http://nshipster.com/nslocalizedstring/

http://www.objc.io/issue-9/index.html

尽管 "P-double" 就如何解决这个问题给出了很好的建议。我真的想不出一种方法来真正实现这一点,所以我选择了一个不同的解决方案,可能只需要多一点点。我决定不只使用 "Localizable.strings" 文件,而是为每种语言创建一个新的字符串文件,并通过语言标识调用它们(例如 mexico = es-MX,english = en)。

我没有重写 NSLocalizedString,而是选择添加 "tableName" 选项,然后可以默认为正确的 .strings 文件。因此,当我现在更改语言时,我会这样做:

cc = currentCell.langString
userDefaults.setObject(api, forKey: "api")
userDefaults.setObject(["\(cc)"], forKey: "AppleLanguages")
defaultTable = cc
userDefaults.synchronize()

当我请求一个本地化的字符串时,我只是这样做:

check.text = NSLocalizedString("currentLangauge", tableName: defaultTable, comment: "Just a check")

我可以将它用于我可以在故事板上显示的所有内容,我唯一需要做的额外工作就是真正定义故事板上的每个对象,以便我可以调整文本。有了这个 "solution" 你就不需要再本地化你的故事板了。只有代码。