【问题标题】:Struts2 internationalization using a databaseStruts2 国际化使用数据库
【发布时间】:2011-02-06 04:57:56
【问题描述】:

我们有一个相当大的应用程序,其中包含大量动态内容。是否有强制 struts 使用数据库进行 i18n 查找,而不是属性文件?

如果有人用动态内容做过 i18n,我也愿意用其他方法来解决这个问题。

【问题讨论】:

标签: java localization internationalization struts2


【解决方案1】:

我不知道有一个简单的即插即用解决方案,因此您可能必须自己实现它——计划花费相当多的时间来了解 struts 的本地化功能是如何实现的2(和 XWork)已实施。关键可能是提供您自己的com.opensymphony.xwork2.TextProvider 实现(并通过在struts.xml 中提供 标记来告诉struts 使用它)。我至少可以想到两种将其融入整体架构的方法:

  • 让您的 TextProvider 实现直接访问数据库。本着 YAGNI 的精神,这可能是最好的开始方式(如果需要,您可以随时重构)。

  • 或者,您可以将数据库代码放入 Java 的 ResourceBundle 接口的实现中,这是 XWork 内部使用的。对我来说,这听起来像是一种更加注重设计的方法,但从好的方面来说,有一些 articles around 描述了如何做到这一点。

【讨论】:

    【解决方案2】:

    不,没有内置方法可以让 Struts2 从数据库加载本地化内容。你需要自己写。

    您有什么要求?您是否需要让用户能够动态更改字段提示、错误消息等?

    【讨论】:

    • 我们的用户输入的内容本质上是调查,并且需要翻译。我希望更改翻译资源的来源,以便我们也可以动态更改翻译。
    【解决方案3】:

    您可以通过构建自定义拦截器来做类似的事情。您可以让拦截器从数据库中读取所有键值对并将它们注入到值堆栈中。我唯一不确定的事情是,我之前并没有真正将 i18n 与 struts 搞混,是 i18n 的东西是否从值堆栈中提取了该信息。如果没有,我不确定您是否可以在拦截器中执行其他操作来加载信息。

    构建自定义拦截器并不太复杂。那里有很多教程网站,包括(支持自我宣传)我的博客:http://ddubbya.blogspot.com/2011/01/creating-custom-struts2-interceptors.html

    【讨论】:

      【解决方案4】:

      仅将属性文件用于静态内容,例如标签、消息等。

      对于动态内容,从包含您要使用的每种语言的语言代码 ID 的数据库表开始。所有已翻译的动态内容条目都将其各自的语言代码 ID 添加到其主键中。如果缺少翻译,您可以对应用程序进行编程以回退到您的默认语言,以使事情变得更容易,直到出现正确的翻译。

      让您的用户以他们喜欢的语言提供他们的贡献,并将其与适当的语言 ID 一起存储。应该有人提供其他语言的翻译,以完成贡献。

      ...
      PRIMARY KEY  (`subject_id`,`language_id`),
      ...
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-03-08
        • 1970-01-01
        • 2011-11-29
        • 2011-04-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多