spring本地化消息持久性

时间:2012-10-05 07:23:54

标签: spring internationalization persistence

我会问是否知道一些“标准”方式如何保留消息,这些消息将在以后进行本地化。请注意,这还包括消息参数。 例如,我的代码为“msg1”的消息和资源包中的1个参数:

msg1 = Hello {0}

我希望将消息与对象关联,并将其保留。以后,不同的客户会使用不同的语言设置询问对象。

obj.setDisplayMsg(msgSource.getMessage("msg1", "World", locale))

我可以想象:

  1. 将消息存储为具有消息代码和参数的顶级对象。我害怕性能 - 在没有翻译的简单错误消息的情况下,在单独的表中单独的对象比单个varchar列更糟糕。
  2. 以字符串表示形式编码消息代码及其参数,并使用一些hibernate自定义类型映射
  3. 但是,它是不是已经解决了(最好是在春天),所以我不必再这样做了?
  4. 由于

    更新:目前,我们做了一些中途 - 我们将消息作为序列化消息对象存储在映射表中的单列中。我仍然完全满意 - 不可能直接在数据库中查看数据。

3 个答案:

答案 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

Database backed i18n for java web-app