【问题标题】:Adding strings localization files from a server从服务器添加字符串本地化文件
【发布时间】:2011-12-18 07:15:06
【问题描述】:

我们正在构建一个包含我们希望本地化的动态数据的应用程序。 我们知道如何在 iOS 和 Android 中本地化字符串,但在这种情况下,数据将从服务器动态下载,因此我们需要动态下载本地化文件。

通常我们将字符串文件存储在语言文件夹中。当文件来自服务器时,我们如何做到这一点?

【问题讨论】:

  • 你在这方面有什么成功吗?我站在同样的问题面前。是否可以使用下载的 Localizeable.strings 而不是应用捆绑的 .strings 文件?
  • 嗨,我正在使用下面的@Ole Begemann 答案,效果很好
  • 啊好的,非常感谢!是的,它工作得很好!

标签: android ios localization localizable.strings


【解决方案1】:

当文件来自服务器时,我们如何做到这一点?

你不能,因为 app bundle 在 iOS 设备上是不可写的。

不过,NSLocalizedStringFromTableInBundle() 允许您指定一个不同的包,您可以从中加载.strings 文件。我没有尝试过,但我想这个包也可以驻留在您应用的 Documents 或 Library 文件夹中。

【讨论】:

  • 这就是我所做的:使用 Xcode 创建一个包,然后将其移动到您的应用程序文档目录(例如在模拟器中),确保您从 Xcode 的项目导航器中删除它,然后创建其中包含一个带有 Localizable.strings 文件的 en.lproj 子目录。然后,您可以以编程方式创建具有适当路径的 NSBundle,并使用 -[NSBundle 本地化StringForKey:value:table:] 检索字符串文件的内容。
  • 最后一条评论有点奇怪...您需要做的就是在运行时在库文件夹中的fileManager 的帮助下创建一个文件夹FOLDER_NAME.bundle。然后将您的 custom_name.strings 文件放在语言适当的文件夹中(exp:en.lproj)。您可以将 .strings 文件与 NSLocalizedStringFromTableInBundle() 一起使用。
  • 实际上,它并不能真正动态地工作 :( 应用程序仅在下次启动时加载那些 .strings 文件。如果您需要真正动态添加 .strings 文件,look here
  • 在尝试实现动态本地化时也遇到了这个线程 - 我发现我可以在自己的自定义包中编辑自定义 .strings 文件(我已将其放在 Documents 目录中)虽然 NSLocalizedStringFromTableInBundle() 在模拟器或单元测试中对新添加到 .strings 文件的内容不起作用(直到下一个应用程序加载如前所述),但我可以使用 NSLocalizedStringFromTableInBundle() 立即从设备访问新内容(迄今为止在 iPad3/iOS7 和 iPadAir/iOS8 上测试并确认)。
【解决方案2】:

是的,这是可能的,但不使用标准方法。检查this github repository 以获得简单而优雅的解决方案。

它使用包含本地化信息的 .json 文件,可以从服务器下载。所有控制器都需要订阅本地化类发送的通知,并实现一个负责(重新)设置视图中所有文本的方法。

【讨论】:

    【解决方案3】:

    我们公司考虑的是将设备的语言和上次更新语言的时间发送到服务器。然后,服务器检查数据库中的语言,如果该语言存在,则发送,如果不存在,则默认发送英文翻译列表。响应由 key: value 数据数组的列表和上次更新时间组成,每次应用启动时都会发送。所以移动端应该缓存翻译列表,并且只使用缓存中的数据。在这种情况下,您不需要使用本地化的 xml 文件,并且由于服务器正在检查上次更新的时间,因此您不必每次都刷新键值数据,而只需刷新您从服务器获取的数据。

    【讨论】:

      【解决方案4】:

      在文档目录中创建一个自定义包。

      查看 Apple 的 Text 文档: https://developer.apple.com/documentation/swiftui/text

      SwiftUI 文本视图初始化程序接受 bundle 参数。

      1 - 我们需要创建一个自定义包。这可以使用带有指向我们自定义包的 URL 的便捷初始化程序来完成:
      convenience init?(url: URL)
      https://developer.apple.com/documentation/foundation/bundle/1409352-init

      2 - 以编程方式将语言文件夹放入其中(并在其中添加字符串文件)。

      设备上可用的语言位于:
      Bundle.main.localizations。它返回一个数组,例如:
      ["de", "en", "Base", "en-US", "de-DE"]

      您需要使用此数组并在您的自定义包中创建相应的文件夹“de.proj”、“en.proj”等。
      然后添加 .strings 文件和键 - 翻译值对,例如 en.proj 中的 ex assets.strings 和:
      `"Titlekey54" = "本地化标题英文";

      如果您在设置中选择了英语并且您将正确的捆绑包传递给 Text 初始化程序,这将在您的 UI 中显示“本地化标题英语”。

      注意:如果你传递一个变量,你需要传递一个 LocalizedStringKey 类型,否则它不会自动本地化

      (来自苹果文档)

      // a string variable will not be localized
      Text(writingImplement)
      
      // ...unless you explicitly convert it to a localized string key.
      Text(LocalizedStringKey(writingImplement))
      

      在这种情况下,我创建了一个类来保存当前的自定义捆绑包,并创建了一个设置器来在用户更改应用程序中的语言时更改它。

      创建目录的代码有点复杂,我不想让这篇文章太长。 稍后我会尝试提供我的代码。

      我让它在这个小型原型应用程序中工作:
      https://github.com/multitudes/MyLocalisationTestApp

      另外,为了在磁盘上创建自定义包,我在这个 repo 中找到了一些很好的资源。 ?? https://github.com/bharathi91/NextLevelLocalization

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-23
        • 1970-01-01
        • 1970-01-01
        • 2014-09-04
        • 1970-01-01
        相关资源
        最近更新 更多