检测浏览器区域设置/语言并生成输出

时间:2011-02-18 22:35:20

标签: java locale

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

因为我们提供相同的修复 - 基本上类似于地图[语言代码到语言 - 国家代码],如''ja'到'ja-JP',然后创建一个新的语言环境[仅当有2位数字语言代码后才出现请求] - 我的问题是其他浏览器,如
Chrome
野生动物 等。
标题中发送的语言格式是什么?
所以有一个阵列说这样的 ja-JP = ja-JP
ja = ja-JP
并将浏览器语言映射到语言国家/地区代码将有助于解决问题。但是,我们需要解决的是否存在任何特定的约束 - 例如,是否存在多个地点使用的语言 - 如果是,那么我们将如何处理它? 还有其他我们需要注意的事情吗? 提前谢谢。

3 个答案:

答案 0 :(得分:2)

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

原则上,您具有区域设置层次结构,并且只要不特别支持区域设置,您就会回退到父区域设置。在您的情况下,"ja_JP"(使用Java表示法)具有父语言环境"ja",而父语言环境又具有父语言环境""

由于大多数日语页面并非特定于日本,因此您通常会为ja完成所有日语翻译,并且只有当特殊情况仅对日本的日本用户有效时,才会有{{1 }}。如果某个用户发送ja_JP因为他在美国使用日语,那么你也没有问题。


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

  • MyLocale.properties - 对应于“”Locale
  • MyLocale_de.properties - 对应“de”Locale(德语)
  • MyLocale_en.properties - 对应“en”Locale(英文)
  • MyLocale_ja.properties - 对应于“ja”Locale(日语)

然后在你的程序中你会写

jp_US

现在selectedLocale肯定是“”,“de”,“en”,“jp”之一,无论rLocale是什么语言环境。例如,对于“en”,“en_GB”,“en_US”在所有情况下都会选择“en”,“ja”和“ja_JP”都会产生“ja”,而“de_DE”和“de_AT”都会产生导致“de”,“it_IT”,“eo”和大多数其他语言环境将导致“”。


执行此操作的“正确的Java方式”: 您不会向您的捆绑包询问其Locale,而只是将捆绑包用作ResourceBundle,从中获取本地化资源。所以,当你需要一些文字时,你可以

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

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

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

(在英文文件中)

 greeting.hello = Hello World!

(在德国文件中)


请注意,浏览器通常不仅会发送一个Locale代码,还会发送一个首选代码列表。所以你实际上应该对这些代码执行“捆绑搜索”,然后选择第一个返回除“”之外的东西,并且只有在没有请求的语言匹配时才回退到“”。 (例如,我的浏览器发送“eo”,“de_DE”,“de”,“en”。由于大多数网站不支持世界语,因此它们会回归德语(如果可用且选择正确实施),或者默认语言(如果它们只查看第一个条目))。

答案 1 :(得分: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 :(得分:0)

您可以从java类 - Locale获取语言环境列表。通过调用方法getAvailableLocale()。

http://docs.oracle.com/javase/8/docs/api/java/util/Locale.html#getAvailableLocales--