从db动态生成i18n属性文件

时间:2014-03-31 16:08:57

标签: internationalization

我想设置一个简单的服务器,其中包含用于不同消息的密钥和翻译的数据库。我不同的其他应用程序将请求此服务器,这将只给他们提供有关它们的消息列表,比如JSON。然后,不同的应用程序会将此列表“编译”为几个可以使用的经典i18n .properties文件。

优点是翻译服务与不同的应用程序不相关,必须在应用服务器上重新部署甚至更新nofile。我甚至可以设置一个GUI来对消息进行siplify操作。

此外,我发现在我工作的不同项目中,属性文件的手动维护可能会非常麻烦超时(一个语言环境缺少标签,当文件变大时很难找到哪一个,我们以前使用过一个管理和生成.properties文件的中央excel文件,但它只是一个巨大的混乱)。

无论如何,你认为这是一个好的/可行的想法吗?有关如何做到这一点的任何见解?如何轻松地将JSON转换为.properties? (有工具吗?)(或者我应该使用除JSON之外的其他格式?)。感谢您的任何评论:)

2 个答案:

答案 0 :(得分:1)

说实话,我不知道你为什么要重新发明轮子,让它更像方形。

可行吗?是的。
你应该这样做吗?的 没有

也就是说,您可以使用JSON提供翻译,这没有任何问题。这通常是有道理的。

什么不是,将所有翻译放在数据库中。如果你这样做,我希望本地化者一切顺利 在标准文本文件中修改翻译(特别是如果它是UTF-8编码...)比在数据库中更容易。 谈到翻译,您可能希望(或被迫)聘请翻译服务提供商。这些家伙有自己的翻译记忆系统和机器翻译系统,猜猜怎么样?他们不关心您的数据库,也不关心GUI。他们希望以标准方式处理翻译,即使用典型的文件格式。 Java属性文件恰好是其中之一。数据库脚本不是......

现在,关于如何将Java属性文件转换为JSON。假设您使用的是Java,它相当简单。您首先需要阅读您的属性文件:

// you somehow need to detect a Locale
ResourceBundle messages = ResourceBundle.getBundle("messages", locale);

您检测Locale的方式取决于上下文。例如,您可能希望在用户配置文件中分配一个(允许用户更改其区域首选项),或者您可能希望创建一个将语言标记作为参数的Web服务。在这两种情况下,它可能会归结为:

Locale locale = Locale.forLanguageTag(langTag);

其中langTag是包含所需语言标记的String(从用户个人资料中读取,建议使用,或作为对Web服务调用的参数读取)。

当您阅读资源文件时,您需要做的就是获取所需的部分并将其放入地图:

Map<String, String> keyToTranslation = new HashMap<>();
for (String key : messages.keySet()) {
    // filter the key somehow, for example:
    // if (key.startsWith(moduleName))
    keyToTranslation.put(key, messages.getString(key));
}

然后您可以使用Jackson将地图转换为JSON。实际上,任何JAX-RS兼容的库(如RESTEasy)都会在内部使用它来执行转换。

使用完全不同的技术堆栈,即使用Node.js,当然可以进行这种转换。但是,要记住的事情很少:

  • 用户可能拥有他们首选语言的列表,他们在HTTP Accept-Language标头中做广告。最好根据此列表返回翻译。
  • 有一种叫做资源加载回退的东西。例如,您可能没有加拿大版法语的翻译,但您可能会有常规的法语翻译,您可能希望将其返回给用户。 ResourceBundle为你处理这个问题,如果你想使用别的东西,最好把它放在脑后。

答案 1 :(得分:0)

您可以使用i18n Maven Plugin来处理国际化。配置项目非常简单。您渲染不同的输出格式文件。

  • JS​​ON
  • XML
  • 属性

查看示例i18n resource files