JSP/Servlet中的多语言支持

bha*_*waj 7 java jsp servlets java-ee

如何通过JSP/Servlet提供多语言支持?如何根据所选语言在运行时包含不同语言的静态数据?

Bal*_*usC 10

在"普通的vanilla"JSP/Servlet应用程序中,最好的解决方案是JSTL fmt taglib.(刚落jstl-1.2.jar/WEB-INF/lib)如何使用它覆盖在甲骨文的Java EE 5教程第二部分第七章,并在这个答案:如何国际化一个Java Web应用程序?.

如果您正在使用诸如Oracle JSF或Apache Struts之类的MVC框架,那么您需要使用关键字"国际化"(i18n)或"本地化"(l10n)来查阅其特定文档.在大多数情况下,它们还为此提供了特定的标记,例如<f:loadBundle>JSF,后者在Oracle Java EE 5教程第二部分第15章中有所介绍.

那些i18n标签已经检查了默认语言/语言环境ServletRequest#getLocale()(你不需要通过检查标题之前的"低级别"来做 - 这将涉及根据HTTP规范解析标题的更多工作).您可以让用户选择语言本身(下拉列表?)并将其存储在会话范围中,并指示这些标记库使用它.以下是JSTL fmt taglib的示例:

<fmt:setLocale value="${someSessionBean.locale}" />
Run Code Online (Sandbox Code Playgroud)

..where ${someSessionBean.locale}可以返回en,en_US,en_UK等这些都是反过来由所使用的java.util.ResourceBundleAPI来加载本地化的文本(你不需要创建/加载ResourceBundle自身,标签库已经这样做,只是阅读链接的javadoc学习更多关于它是如何工作的).

如果您希望语言可用作URL的第一个pathinfo部分(例如http://example.com/en/,最适合搜索引擎优化),那么您最好使用一个Filter用于侦听的内容/*,检查pathinfo,从中分割语言部分,存储/比较它as/with session value,并将pathinfo中没有语言部分的请求转发到所需的前端控制器.


Dil*_*nga -1

这个问题有几个重要的方面。第一部分是确定每个请求的区域设置。你可以使用这样的东西:

HttpServletRequest req ...;
String browserLocale = req.getHeader("Accept-Language"); // typically something like 'en'
Run Code Online (Sandbox Code Playgroud)

接下来,您需要决定如何管理网站的本地化内容。最像 Java 的(不一定是最好的)方法是使用 ResourceBundle 外部化所有消息。您可以在Isolating Locale Specific Data 教程中了解 I18N、G13N 的核心 Java 工具。

在我看来,仅使用这种方法是很糟糕的。不同语言的内容大小不同,与不同布局更好地匹配等。因此,您可以完全消除资源包(如果您没有大量多语言环境数据)或通过使用 XSLT 或其他语言环境模板来增强该方法具体的。

一种非常高效但开发开销较高的方法是使用 servlet 过滤器将流量重定向到特定于语言(或区域设置)的子站点。在这种情况下,任何点击的人http://my.domain.fake/xyz都会被重定向到http://my.domain.fake/en/xyz

最后,值得注意的是,大多数重要的 Web 框架都有自己的 I18N 支持。他们的方法因框架理念而异。