2011-02-18 95 views
4

我们有一个Java应用程序,可根据浏览器语言设置在用户的浏览器会话上呈现本地化文本。该应用程序读取浏览器语言设置[在应用程序请求中设置的标题内设置]并准备本地化文本。 但最近我们遇到了Mozilla 5.0版本浏览器的问题。注意我们的代码在IE中正常工作。以'ja'语言为例,我们期待浏览器将接受的语言作为'ja-JP'[IE所做的] - 但不幸的是Mozilla(FF)不会 - 它只将浏览器接受的语言发送为'ja'。所以我们着手使用默认语言生成内容。

因为我们正在提供一个相同的修复 - 基本上像地图[语言代码到语言国家代码]像''ja'到'ja-JP',然后创建一个新的语言环境[只有2位数的语言代码在请求后存在 - 我的问题是其他浏览器,如

野生动物园

什么是语言格式的报头内发送?
有这么一个数组这样说
JA-JP = JA-JP
JA = JA-JP
和映射浏览器语言的语言,国家或地区代码将有助于解决这一问题。但是,我们是否需要解决一些具体的限制因素 - 比如是否有语言在多个地方发言 - 如果是的话,我们将如何处理?
其他我们需要注意的事情?
在此先感谢。关于请求检测浏览器语言环境/语言并生成输出

+0

变化Lcoales到区域设置 – jrey 2011-02-18 22:43:08

回答

0

http://www.tutorialspoint.com/jsp/jsp_internationalization.htm

多的信息: http://www.apl.jhu.edu/~hall/java/Servlet-Tutorial/Servlet-Tutorial-Request-Headers.html

  package hall; 

      import java.io.*; 
      import javax.servlet.*; 
      import javax.servlet.http.*; 
      import java.util.*; 

      /** Shows all the request headers sent on this 
      * particular request. 
      * <P> 
      * Part of tutorial on servlets and JSP that appears at 
      * http://www.apl.jhu.edu/~hall/java/Servlet-Tutorial/ 
      * 1999 Marty Hall; may be freely used or adapted. 
      */ 

      public class ShowRequestHeaders extends HttpServlet { 
       public void doGet(HttpServletRequest request, 
         HttpServletResponse response) 
        throws ServletException, IOException { 
       response.setContentType("text/html"); 
       PrintWriter out = response.getWriter(); 
       String title = "Servlet Example: Showing Request Headers"; 
       out.println(ServletUtilities.headWithTitle(title) + 
        "<BODY BGCOLOR=\"#FDF5E6\">\n" + 
        "<H1 ALIGN=CENTER>" + title + "</H1>\n" + 
        "<B>Request Method: </B>" + 
        request.getMethod() + "<BR>\n" + 
        "<B>Request URI: </B>" + 
        request.getRequestURI() + "<BR>\n" + 
        "<B>Request Protocol: </B>" + 
        request.getProtocol() + "<BR><BR>\n" + 
        "<TABLE BORDER=1 ALIGN=CENTER>\n" + 
        "<TR BGCOLOR=\"#FFAD00\">\n" + 
        "<TH>Header Name<TH>Header Value"); 
       Enumeration headerNames = request.getHeaderNames(); 
       while(headerNames.hasMoreElements()) { 
        String headerName = (String)headerNames.nextElement(); 
        out.println("<TR><TD>" + headerName); 
        out.println(" <TD>" + request.getHeader(headerName)); 
       } 
       out.println("</TABLE>\n</BODY></HTML>"); 
       } 

       public void doPost(HttpServletRequest request, 
         HttpServletResponse response) 
        throws ServletException, IOException { 
       doGet(request, response); 
       } 
      } 
+2

基本上 区域设置区域设置= request.getLocale(); 仅返回'ja',所以这不会解决我们的问题 – Manoj 2011-02-18 22:45:32

+0

我的要求是,我们是否具有所有浏览器至少使用chrome,moziall,IE,Safari等接受的语言来比较和映射值的详细信息。解决这个问题的正确方法是什么? – Manoj 2011-02-18 22:54:12

2

看那java.util.ResourceBundle类,主要是getBundle()方法。 (您可以使用它,或者自己实现类似的机制。)

原则上,您拥有语言环境的层次结构,并且每当语言环境没有特别支持时,就会回退到父语言环境。在你的情况下,"ja_JP"(用Java表示法)具有父区域"ja",而该区域又具有父区域""

由于大多数日本网页并非特定于日本,因此您通常会为ja完成所有日语翻译,并且只有当某些特殊功能仅适用于日本的日本用户时,才会有另外的ja_JP。然后,如果某位用户在美国使用日语,则发送jp_US也没有问题。


如果你想使用Java的ResourceBundle机制仅用于指示哪些区域设置,我们有数据,您可以创建(例如)这些(空)文件:

  • MyLocale.properties - 对应以 “” 语言环境
  • MyLocale_de.properties - 对应于 “德” 语言环境(德语)
  • MyLocale_en.properties - 相当于为 “en” 语言环境(英语)
  • MyLocale_ja。性能 - 对应于 “JA” 区域设置(日本)

然后在你的程序,你会写

Locale rLocale = request.getLocale(); 
ResourceBundle bundle = ResourceBundle.getBundle("MyLocale", rLocale); 
Locale selectedLocale = bundle.getLocale(); 

现在selectedLocale肯定是 “”, “德”, “恩”,“JP之一“,无论rLocale是什么地方。例如,对于“en”,“en_GB”,“en_US”在所有情况下都将被选择为“en”,“ja”和“ja_JP”都会导致“ja”,而“de_DE”和“de_AT”导致“de”和“it_IT”,“eo”以及大多数其他Locale会导致“”。


“正确的Java的方式”来做到这一点: 你不会问你的包有关其语言环境,但简单地用束作为一个资源包,从它采取的本地化资源。所以,当你需要一些文字时,你可以做

String text = bundle.getText("greeting.hello"); 

然后输出文字。有时候您会使用MessageFormat格式化插入了值的文本(或Formatter)。 (那么你的属性文件不会是空的,当然,但包含这样的诗句:

greeting.hello = Hello World! 

(中英文文件)

greeting.hello = Hallo Welt! 

(德国文件)


请注意,浏览器通常不仅发送一个Locale代码,而且还发送一个首选的代码列表。因此,您实际上应该对这些代码中的每个代码执行“捆绑搜索”,并将第一个返回的内容替换为“ “,并且跌倒b只有在没有请求的语言匹配时才会回答“”。 (例如,我的浏览器发送“eo”,“de_DE”,“de”,“en”。由于大多数网站不支持世界语,他们会回到德语(如果可用并且选择正确实施)默认语言(如果他们只看第一个条目))。