Java Struts2使用数据库进行国际化

Java Struts2使用数据库进行国际化,java,localization,internationalization,struts2,Java,Localization,Internationalization,Struts2,我们有一个相当大的应用程序,有大量的动态内容。是否有必要强制struts使用数据库来进行i18n查找,而不是使用属性文件 如果有人用过i18n处理动态内容,我也愿意用其他方法来解决这个问题。不,没有内置的方法让Struts2从数据库加载本地化内容。你需要自己写 你的要求是什么?您是否需要用户能够动态更改字段提示、错误消息等?您可以通过构建自定义拦截器来执行类似操作。您可以让拦截器从数据库中读取所有键值对,并将它们注入到值堆栈中。我唯一不确定的是,以前没有用struts处理过i18n,就是i18n

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


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

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


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

您可以通过构建自定义拦截器来执行类似操作。您可以让拦截器从数据库中读取所有键值对,并将它们注入到值堆栈中。我唯一不确定的是,以前没有用struts处理过i18n,就是i18n是否从值堆栈中提取信息。如果没有,我不确定你是否可以在拦截器中做些别的事情来加载信息


构建自定义拦截器并不太复杂。有很多教程网站,包括(此处为自我推广做好准备)我的博客:。

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

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

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

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

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

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

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


我们的用户输入基本上是调查的内容,这些内容需要翻译。我希望更改翻译资源的来源,以便我们也可以动态更改翻译。不幸的是,关于如何在Struts2中做同样的事情,似乎没有太多的信息。