我会问是否知道一些“标准”方式如何保留消息,这些消息将在以后进行本地化。请注意,这还包括消息参数。 例如,我的代码为“msg1”的消息和资源包中的1个参数:
msg1 = Hello {0}
我希望将消息与对象关联,并将其保留。以后,不同的客户会使用不同的语言设置询问对象。
obj.setDisplayMsg(msgSource.getMessage("msg1", "World", locale))
我可以想象:
由于
更新:目前,我们做了一些中途 - 我们将消息作为序列化消息对象存储在映射表中的单列中。我仍然完全满意 - 不可能直接在数据库中查看数据。
答案 0 :(得分:5)
我不认为你的需求非常普遍,所以可能没什么可用的。很确定Spring没有开箱即用。因此,选项3将被丢弃。
1和2之间的决定主要是商业决策。想象一下,消息格式在持久化后会发生变化(例如由于某些错误)。你现在想得到什么?可能是更正后的,只能通过选项1获得。
另一方面,如果您想将其保存为用户所说的证据,则可以使用1和2(但在第一种情况下,您将使用需要保存消息格式而不是代码)。
在我看来,第一种选择是最好的。你不会那么担心它的性能,因为它可能不是你应用程序的瓶颈。也许消息和参数之间的多对多(而不是一对多)关系可以很好并且可以节省一些内存,但这不是主要目的。在参数表中,您可以存储一些额外的信息,例如参数的种。这样,您可以轻松搜索,例如, msg1 类型的所有消息或打印用户 Jakub 的消息(因为您存储了该用户类型的参数)。 / p>
最后,永远不要在数据库中保存序列化对象。它们依赖于语言,您无法搜索它们,可能会出现版本问题...最重要的是,至少在这种情况下,您不需要它,因为最后所有参数都必须转换为字符串。 / p>
答案 1 :(得分:0)
在我看到的数据库中存储i18n消息的唯一用例是,您希望在应用程序中使用UI来编辑它们。否则,我认为没有必要使事情变得复杂,而是建议使用文件。
首先,每次要解析消息时都不应该询问底层存储(数据库或文件)。它们很少变化并经常阅读,因此它是缓存的一个很好的用例。
接下来,如果您希望对消息参数进行本地化,那么只需将它们作为单独的消息保存在存储中,并首先获取参数的值,然后在检索实际消息时将其传递。
所以到现在为止,您可能想知道如何让我的应用程序看到我对邮件所做的更改?好吧,只需使用ReloadableResourceBundleMessageSource即可。它也为你缓存!但请记住将文件放在之外的应用程序存档(JAR,WAR,EAR等等)!无论如何,将配置与代码分开是一种很好的做法。所以是的,当然Spring已经解决了这个问题!
但是如果由于某种原因你仍然想使用DB存储消息,那么你必须实现自己的MessageSource。我将参数存储在同一个表中。并记住使用缓存,并在数据库中的数据发生变化时使其无效。
答案 2 :(得分:-1)
AFAIK Spring不支持在DB OOTB中存储i18n消息。但是,您可以创建自己的ResourceBundle,它将从数据库中获取它们。
关于如何实现这一点有很多例子: http://forum.springsource.org/showthread.php?15223-AbstractMessageSource-using-DB-table-instead-of-props-file