Internationalization 从数据库动态生成i18n属性文件

Internationalization 从数据库动态生成i18n属性文件,internationalization,Internationalization,我想设置一个简单的服务器,其中包含不同消息的密钥和翻译。我的其他不同的应用程序会请求这个服务器,它只会给他们关于它们的消息列表,比如JSON。然后,不同的应用程序将这个列表“编译”成几个他们可以使用的经典i18n.properties文件 优点是翻译服务与不同的应用程序不相关,因此必须在应用程序服务器上重新部署甚至更新文件。我甚至可以设置一个GUI来对消息进行siplify操作 此外,我发现在我从事的不同项目中,属性文件的手动维护会随着时间的推移变得非常混乱(一个区域设置缺少标签,当文件变大时很

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

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

此外,我发现在我从事的不同项目中,属性文件的手动维护会随着时间的推移变得非常混乱(一个区域设置缺少标签,当文件变大时很难找到哪个区域设置,我们过去使用一个中心excel文件来管理和生成.properties文件,但这只是一个巨大的混乱)


不管怎样,你认为这是个好主意吗?对如何做到这一点有什么见解吗?如何轻松地将JSON转换为.properties?(有这样的工具吗?)。谢谢你的评论:)

坦率地说,我不知道你为什么要重新发明轮子,让它更像正方形

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

也就是说,您可以使用JSON提供翻译,这没有什么错。这通常是有道理的

不需要的是将所有翻译放在数据库中。如果您这样做,我祝愿本地化人员一切顺利。
在标准文本文件(尤其是UTF-8编码的文件)中修复翻译比在数据库中修复翻译更容易。

谈到翻译,你可能想(或被迫)雇佣翻译服务提供商。这些家伙有自己的翻译记忆系统和机器翻译系统,猜猜看?他们不关心您的数据库,也不关心GUI。他们希望以标准方式处理翻译,即使用典型的文件格式。Java属性文件恰好是其中之一。数据库脚本不是

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

// you somehow need to detect a Locale
ResourceBundle messages = ResourceBundle.getBundle("messages", 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));
}
Map keytottranslation=newhashmap();
for(字符串键:messages.keySet()){
//以某种方式筛选密钥,例如:
//if(键startsWith(模块名称))
keytotransation.put(key,messages.getString(key));
}
然后可以使用将映射转换为JSON。实际上,任何与JAX-RS兼容的库都会在内部使用它来执行转换

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

  • 用户可能有他们首选语言的列表,他们会在HTTP Accept Language标头中公布这些语言。希望返回基于此列表的翻译
  • 有一种叫做资源加载回退的方法。例如,您可能没有加拿大版本法语的翻译,但您可能有常规法语翻译,您可能希望将其返回给用户
    ResourceBundle
    为您处理此问题,如果您想使用其他东西,最好将其放在脑后
您可以使用来处理国际化。配置项目非常简单。可以渲染不同的输出格式文件

  • JSON
  • XML
  • 性质

查看示例。

“这些家伙有自己的翻译存储系统和机器翻译系统,猜猜看,他们不关心你的数据库,也不关心GUI。”没错。。。来自翻译服务提供商的pov!从我的(/任何)系统来看,情况恰恰相反。假设我的TSP不处理.properties文件,而只处理excel文件(lol),我不会调整我的系统使其能够处理这些文件,对吗?所以,我选择了一种存储这些翻译的方法,它们与它们的系统一起工作,我会找到一种方法将它们的格式集成到我的系统中。[…]但实际上,从我使用.properties文件的经验来看(虽然很小,但仍然很难维护),这就是为什么我认为DB应该更结构化(我正在考虑检测重复和缺少翻译)。当我想到GUI时,它是“内部”员工快速纠正打字错误的一种手段,或者是TSP能够发送他们的文件(我将导入、验证并放入我的DB中)。然而,我听到了你关于重新发明轮子的响亮而清晰的声音。老实说,我这样做也是为了学习各种技术,比如JPA/Hibernate,因为我知道如果我坚持使用DB解决方案,我会发现一些现有的、写得比我要做的好得多的东西。所以,无论如何,非常感谢你的回答,我现在来看一下你回答的技术方面^^