JSP / Servlet中的多语言支持

时间:2010-02-02 07:06:23

标签: java jsp servlets java-ee

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

3 个答案:

答案 0 :(得分:10)

在“普通的”JSP / Servlet应用程序中,最佳解决方案是JSTL fmt taglib。 (只需在/WEB-INF/lib中删除jstl-1.2.jar)如何使用Oracle Java EE 5 tutorial part II chapter 7以及此答案:How to internationalize a Java web application?

如果您正在使用诸如Oracle JSF或Apache Struts之类的MVC框架,那么您需要使用关键字“国际化”(i18n)或“本地化”(l10n)来查阅其特定文档。在大多数情况下,它们还为此提供了特定的标记,例如{JS}的<f:loadBundle>,而Oracle Java EE 5 tutorial part II chapter 15则涵盖了<fmt:setLocale value="${someSessionBean.locale}" />

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

${someSessionBean.locale}

..其中en可以返回en_USen_UKResourceBundle等。java.util.ResourceBundle API又会使用这些来加载本地化文本(你不需要创建/加载http://example.com/en/本身,taglibs已经这样做了,只需阅读链接的javadoc以了解它的工作原理。)

如果您希望语言可用作URL的第一个pathinfo部分(例如最适合SEO的Filter),那么您最好使用/*来监听{{1检查pathinfo,从中分离语言部分,将其作为/存储/与会话值进行比较,并将请求中没有语言部分的请求转发到所需的前端控制器。

答案 1 :(得分:-1)

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

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

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

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

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

最后,值得注意的是,大多数严肃的Web框架都有自己的I18N支持。他们的方法因框架哲学而异。

答案 2 :(得分:-1)

我们可以创建messages.properties,messages _ ?? ??。属性并将这些文件放入/ scr / java目录。 (其中?? ?? - en_US,ru_RU等)

示例行到messages.properties:

About = About
Buy = Buy
Company = Company
ContactUs = Contact Us 

然后粘贴到jsp文件中,例如行:

   Locale locale = Locale.getDefault(); 
   String lng = locale.getCountry(); 

   session.setAttribute( "language", lng);

   if (lng.equals( "UA"))
       locale = new Locale( "uk", "UA");
   else if (lng.equals( "RU"))
       locale = new Locale( "ru", "RU");
   else
       locale = Locale.US;

   ResourceBundle boundle = ResourceBundle.getBundle( "messages", locale);

   for (Enumeration e = boundle.getKeys(); e.hasMoreElements(); ) {
       String key = (String) e.nextElement();
       String s = boundle.getString(key);
       session.setAttribute( key, s);
   }

现在您可以将$ {name}粘贴到下一个jsp代码中($ {About},$ {Buy},...)。