要考虑一个真正意义的全球资源,Web浏览器的内容对每个接收到的用户来说都是易读的,现在大多数的全球资源的网站都是英文的.当然,现在也在发生变化,有的网站为一些特定的国家定制一些非英文版本,比如,说英文的通过http://www.ibm.com/en/index.html来访问,说中文的通过http://www.imb.com/cn/index.html来访问,这些很多都是静态的文本.怎么构件一个动态生成的国际化内容的网站就不是一个简单的问题了.
国际化又称Il8N,因为英文国家的国家化是Internationalization,它以I开始,以N结束,共18个字母.本地化又称L18N,即是Localization.国际化的问题主要包含以下的一些内容:
.日期,时间
.数字
.货币
.其它的一些特殊字符
也就是说不同的Locale,显示日期,时间格式是不一样的.当然,不同的语言有自己不同的字符集.
HTML中的字符实体
HTML中的字符实体和XML的语言保持一致.它定义了用特定的字符序列显示单字符的功能,这种字符序列称为字符实体,它以" &"开头,以";"结束.例如: © 表示字符"©";
看一例子显示西班牙语的" Hello World":
<%@page contentType="text/html;charset=ISO-8859-1" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<%
response.setHeader("Content-Language","es");
out.println("<html><head><title>En Español</title></head>");
out.println("<body>");
out.println("<h3>En espa%ntilde;ol</h3>");
out.println("¡Hola Mundo!");
out.println("</body></html>");
%>
运行结果:
En espa%ntilde;ol
¡Hola Mundo!
在HTML字符实体表示中,ñ代表了" ñ "字符,使用response.setHeader("Content-Language","es");来设置HTML显示时要使用的语言.
Unicode
Unicode字符标准是一个字符编码系统,它支持互相转换,处理和显示现在世界上不同语言的文本.在Java语言中,字符,字符串和标始符在内部使用16位的Unicode 2.0字符集表示.Unicode使用 " \uxxxx" 来表示一个字符,前256个Unicode字符和ISO-8859-1标准(Latin-1)的前256个字符一致.在Unicode世界中, " ñ " 用 " \u00f1 " 表示.看怎么用Unicode来编写西班牙语的Hello World:
<%@page contentType="text/html;charset=ISO-8859-1" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<%
response.setHeader("Content-Language","es");
out.println("<html><head><title>En Espa\u00f1ol</title></head>");
out.println("<body>");
out.println("<h3>En espa\u00f1ol</h3>");
out.println("\u00f1Hola Mundo!");
out.println("</body></html>");
%>
支持多国语言的Hello World
用语选择语言的页面:
语言处理页面代码:
<%@page contentType="text/plain;charset=UTF-8"
import="java.io.*,java.text.*,java.util.*,javax.servlet.jsp.*" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
</head>
<body>
<%!
Locale locale;
DateFormat format;
JspWriter writer;
%>
<%!
//英语
void processEnglish()throws Exception
{
locale=new Locale("en","US");
format=DateFormat.getDateTimeInstance(DateFormat.LONG,DateFormat.LONG,locale);
writer.println("in english");
writer.println("<br>");
writer.println("HelloWorld");
writer.println(format.format(new Date()));
writer.flush();
}
//中文
void processChinese()throws Exception
{
locale=new Locale("zh","");
format=DateFormat.getDateTimeInstance(DateFormat.LONG,DateFormat.LONG,locale);
writer.println("in Chinese");
writer.println("<br>");
writer.println("\u4f60\u597d\u4e16\u754c");
writer.println(format.format(new Date()));
writer.flush();
}
//韩国语
void processKorean()throws Exception
{
locale=new Locale("ko","");
format=DateFormat.getDateTimeInstance(DateFormat.LONG,DateFormat.LONG,locale);
writer.println("in Korean");
writer.println("<br>");
writer.println("\uc548\ud558\uc138\uacc4");
writer.println(format.format(new Date()));
writer.flush();
}
//.........................其他的语言省略
%>
<%
//获得请求的语种
String language=(String)request.getParameter("language");
int lan=Integer.parseInt(language);
%>
<%
writer=out;
switch(lan)
{
case 1:processEnglish();break;
case 2:processChinese();break;
case 3:processKorean();break;
//case 4:processRussian();break;
//case 5:processSpanish();break;
// case 6:processJapanese();break;
}
%>
</body>
</html>
处理的思路很简单,首先获得请求的语种,然后根据不同的语言来做不同的处理.