Spring本地化消息持久化

标签 spring internationalization persistence

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

msg1 = Hello {0}

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

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

我可以想象:

  1. 将消息存储为带有消息代码和参数的顶级对象。我担心性能 - 在我看来,在单独的表中拥有单独的对象比单个 varchar 列更糟糕,以防出现简单的错误消息而没有翻译。
  2. 以字符串表示形式对消息代码及其参数进行编码,并使用一些 Hibernate 自定义类型映射
  3. 但是,这个问题不是已经解决了吗(最好是在 Spring ),这样我就不必再这样做了?

谢谢

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

最佳答案

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

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

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

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

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

关于Spring本地化消息持久化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12741522/

相关文章:

python - .py 文件中具有不同域的 i18n 翻译

django 模糊字符串翻译不显示

pandas - Python Pandas 持久缓存

c++ - 如何使数据结构在 C++ 中持久化?

java - Spring Restfull Jax-RS 注释支持

java - 在创建应用程序 bean 之前初始化 Spring Batch DB

java - 格式化数字时如何确定放置货币符号的位置?

java - Angular 与 Spring Boot 后端在获取 JWT 后在现有路线上返回 404

java - 属性转换器日期字符串

java - Tapestry - 当用户打开新选项卡时,持久数据被覆盖