我们有一个Java应用程序,可根据浏览器语言设置在用户的浏览器会话中呈现本地化文本。该应用程序读取浏览器语言设置[在请求应用程序中的标题内设置]并准备本地化文本。
但最近我们遇到了Mozilla 5.0版浏览器的问题。注意我们的代码在IE中工作正常。举一个'ja'语言的例子,我们期待浏览器将接受的语言发送为'ja-JP'[IE所做的] - 但不幸的是Mozilla(FF)没有 - 它只发送浏览器接受的语言为'ja'。因此,我们使用默认语言生成内容。
因为我们提供相同的修复 - 基本上类似于地图[语言代码到语言 - 国家代码],如''ja'到'ja-JP',然后创建一个新的语言环境[仅当有2位数字语言代码后才出现请求] - 我的问题是其他浏览器,如
Chrome
野生动物
等。
标题中发送的语言格式是什么?
所以有一个阵列说这样的
ja-JP = ja-JP
ja = ja-JP
并将浏览器语言映射到语言国家/地区代码将有助于解决问题。但是,我们需要解决的是否存在任何特定的约束 - 例如,是否存在多个地点使用的语言 - 如果是,那么我们将如何处理它?
还有其他我们需要注意的事情吗?
提前谢谢。
答案 0 :(得分:2)
查看java.util.ResourceBundle
类,主要是getBundle()
方法。 (您可以使用它,或者自己实现类似的机制。)
原则上,您具有区域设置层次结构,并且只要不特别支持区域设置,您就会回退到父区域设置。在您的情况下,"ja_JP"
(使用Java表示法)具有父语言环境"ja"
,而父语言环境又具有父语言环境""
。
由于大多数日语页面并非特定于日本,因此您通常会为ja
完成所有日语翻译,并且只有当特殊情况仅对日本的日本用户有效时,才会有{{1 }}。如果某个用户发送ja_JP
因为他在美国使用日语,那么你也没有问题。
如果您只想使用Java ResourceBundle机制来指示我们拥有数据的区域设置,您可以创建(例如)这些(空)文件:
然后在你的程序中你会写
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--