4

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

msg1 = Hello {0}

我想将消息与一个对象相关联,将其持久化。之后,不同的客户端会询问具有不同语言设置的对象。

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

我能想象:

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

谢谢

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

4

3 回答 3

5

我不认为你的需求是一个非常普遍的需求,所以那里可能没有可用的东西。可以肯定的是,Spring 开箱即用没有任何东西。因此,选项 3 被丢弃。

1和2之间的决定主要是商业决定。想象一下消息格式在持久化后发生了变化(例如由于某些错误)。你现在想得到什么?可能是修正后的,只能通过选项 1 获得。

另一方面,如果您想将其保存为应用程序对用户所说内容的证明,则可以使用 1 和 2(但在第一种情况下,您需要保存消息格式而不是其代码) .

在我看来,第一个选项是最好的。您不会那么担心它的性能,因为它可能不是您的应用程序的瓶颈。也许消息和参数之间的多对多(而不是一对多)关系可能很好,并且可以节省一些内存,但这不是主要目的。在参数表中,您可以存储一些额外的信息,例如参数的种类。这样您就可以轻松搜索,例如,所有msg1类型的消息或打印用户Jakub的消息(因为您将该参数存储为用户类型)。

最后,永远不要在数据库中保存序列化的对象。它们与语言有关,您无法搜索它们,可能会出现版本控制问题……最重要的是,至少在这种情况下,您不需要它,因为最终所有参数都必须转换为字符串。

于 2013-10-15T08:14:00.667 回答
0

我看到的在数据库中存储 i18n 消息的唯一用例是当您希望在应用程序中使用 UI 来编辑它们时。否则,我认为没有必要使事情复杂化,而是建议使用文件。

首先,您不应该在每次要解析消息时询问底层存储(数据库或文件)。它们很少更改并且经常被读取,因此它是缓存的一个很好的用例。

接下来,如果您希望消息参数被本地化,而不是简单地将它们作为单独的消息保存在您的存储中并首先获取参数的值,然后在检索实际消息时将其传递。

所以现在您可能想知道如何让我的应用程序看到我对消息所做的更改?好吧,只需使用一个ReloadableResourceBundleMessageSource。它也为您缓存!但请记住将文件放在应用程序存档之外(JAR、WAR、EAR 等等)!无论如何,将配置与代码分开是一种很好的做法。所以,是的,当然春天已经解决了这个问题!

但是如果由于某种原因你仍然想使用 DB 来存储消息,你将不得不实现你自己的MessageSource。我会将参数存储在同一个表中。并记住使用缓存,并在数据库中的数据发生变化时使其失效。

于 2013-10-19T21:03:05.140 回答
-1

AFAIK Spring 不支持在 DB OOTB 中存储 i18n 消息。但是,您可以创建自己的 ResourceBundle 来从数据库中获取它们。

关于如何实现这一点有很多例子:http: //forum.springsource.org/showthread.php?15223 -AbstractMessageSource-using-DB-table-instead-of-props-file

用于 java web-app 的数据库支持 i18n

于 2012-10-05T07:32:44.653 回答