【问题标题】:MUlti Language support in JSP/ServletJSP/Servlet 中的多语言支持
【发布时间】:2011-01-12 01:08:15
【问题描述】:

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

【问题讨论】:

    标签: java jsp servlets jakarta-ee


    【解决方案1】:

    在“普通的”JSP/Servlet 应用程序中,最好的解决方案是JSTLfmt taglib。 (只需将jstl-1.2.jar 放入/WEB-INF/lib)如何使用它在Oracle Java EE 5 tutorial part II chapter 7 和这个答案中有所介绍:How to internationalize a Java web application?

    如果您使用的是 MVC 框架,例如 Oracle JSF 或 Apache Struts,那么您需要使用关键字“国际化”(i18n) 或“本地化”(l10n) 查阅其特定文档。在大多数情况下,它们还为此提供了特定的标签,例如在 JSF 的情况下为 <f:loadBundle>,而 Oracle Java EE 5 tutorial part II chapter 15 又涵盖了这些标签。

    那些 i18n 标记已经通过 ServletRequest#getLocale() 检查了默认语言/区域设置(您不需要像之前建议的那样通过检查标头来“低级”执行它——这将涉及更多工作来将标头解析为根据HTTP spec)。您可以让用户选择语言本身(下拉菜单?)并将其存储在会话范围内并指示这些标记库使用它。这是 JSTL fmt taglib 的示例:

    <fmt:setLocale value="${someSessionBean.locale}" />
    

    ..其中${someSessionBean.locale} 可以返回enen_USen_UK 等。这些又被java.util.ResourceBundle API 用来加载本地化文本(您不需要创建/加载 ResourceBundle 本身,taglibs 已经这样做了,只需阅读链接的 javadoc 以了解更多关于它是如何工作的)。

    如果您希望该语言可用作 URL 的第一个路径信息部分(例如 http://example.com/en/,这对 SEO 来说是最好的),那么您最好使用 Filter 来监听 /*,检查路径信息,从中拆分语言部分,将其存储/与会话值进行比较,并将 pathinfo 中没有语言部分的请求进一步转发到所需的前端控制器。

    【讨论】:

      【解决方案2】:

      这个问题有几个重要方面。第一部分是确定每个请求的语言环境。你可以使用这样的东西:

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

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

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

      一种非常高效但开发开销很大的方法是使用 servlet 过滤器将流量重定向到特定语言(或区域设置)的子站点。在这种情况下,任何点击@987654322@ 的人都会被重定向到@987654323@<strong>en</strong>/xyz

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

      【讨论】:

      • ServletRequest.getLocale() 存在是有原因的!
      【解决方案3】:

      我们可以创建messages.properties、messages_????.properties 并将这些文件放到/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}、...)。

      【讨论】:

      • 不是您使用ResourceBundleLocale 类的方式!这表明对这个主题缺乏基本的理解。
      猜你喜欢
      • 2011-11-08
      • 2011-02-25
      • 1970-01-01
      • 2011-02-27
      • 1970-01-01
      • 1970-01-01
      • 2018-08-23
      相关资源
      最近更新 更多