Struts2使用数据库进行国际化

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

如果有人曾经用动态内容做过i18n,我会开放其他方式来解决这个问题。

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

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

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

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

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

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

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

仅对静态内容使用属性文件,如标签,消息等。

对于动态内容,请从数据库表开始,该表包含您要使用的每种语言的语言代码ID。 已翻译的所有动态内容条目都将其各自的语言代码ID添加到其主键中。 如果缺少翻译,您可以将应用程序编程为回退到默认语言,以便在出现正确的翻译之前简化操作。

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

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