2011-02-18 92 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」。由於大多數網站不支持世界語,他們會回到德語(如果可用並且選擇正確實施)默認語言(如果他們只看第一個條目))。