【问题标题】:spring localized message persistencespring本地化消息持久化
【发布时间】:2012-09-26 07:56:10
【问题描述】:

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

msg1 = Hello {0}

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

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

我可以想象:

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

谢谢

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

【问题讨论】:

    标签: spring internationalization persistence


    【解决方案1】:

    我认为您的需求不是很普遍,因此可能没有可用的东西。可以肯定的是,Spring 开箱即用。因此,选项 3 被丢弃。

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      【讨论】:

        【解决方案3】:

        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

        【讨论】:

        • nono,我不想将消息包存储在数据库中。我需要将带有参数的单个消息存储在数据库中。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-14
        • 2015-12-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多