如何通过JSP / Servlet提供多语言支持?如何根据所选语言在运行时包含不同语言的静态数据?
答案 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_US
,en_UK
,ResourceBundle
等。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},...)。