8.3.2 编写国际化的Web程序

优质
小牛编辑
130浏览
2023-12-01

本实例演示了如何在Web程序中根据客户端支持的本地信息显示不同语言的信息。在本例中通过改变IE的默认语言来模拟中文和英语的用户。

例子 : 编写国际化的Web程序

1. 建立中文资源文件

在WEB-INF\classes\resources目录中建立一个I18nResource_zh_CN.properties文件,该文件的内容如下:

i18n.welcome=欢迎访问国际化web程序

i18n.datetime = 今天是{0, date, long}, 现在的时间是 {0, time, long}。

i18n.message = 我买了{0, number}本英语书, 共花费 {1, number, currency}。现在是学习英语的时间。请不要打扰我!

2. 建立英文资源文件

在WEB-INF\classes\resources目录中建立一个I18nResource_en_US.properties文件,该文件的内容如下:

i18n.welcome=welcome to the internationalization web program!

i18n.datetime = Today is {0, date,long}, time is {0, time,long}.

i18n.message = I bought {0, number} English books, and spent {1, number,currency}. Now is the time to learn English. Please Don't bother me!

3. 编写I18nServlet类

I18nServlet是一个Servlet类,负责根据客户端浏览器的默认语言将相应语言的国际化信息输出的客户端。I18nServlet类的实现代码如下:

package chapter8.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Locale;
import java.util.ResourceBundle;
import java.text.MessageFormat;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class I18nServlet extends HttpServlet
{
    protected void service(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException
    {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        Locale locale = request.getLocale();
        //  装载相应语言的资源文件
        ResourceBundle rb = ResourceBundle.getBundle("resources.I18nResource", locale);
        //  读取资源文件的内容
        String webcome = rb.getString("i18n.welcome");
        String datetime = rb.getString("i18n.datetime");
        String message = rb.getString("i18n.message");
        //  输出webcome
        out.println(webcome + "<p/><hr>");
        MessageFormat mf = new MessageFormat(datetime, locale);
        //  输出datetime,并指定相应的占位符的参数值
        out.println(mf.format(new Object[]{new Date()})+ "<br>");       
        mf.applyPattern(message);
        //  输出message,并指定相应的占位符的参数值
        out.println(mf.format(new Object[]{5, 332}));
    }
}

I18nServlet类的配置代码如下:

<servlet>
    <servlet-name>I18nServlet</servlet-name>
    <servlet-class>chapter8.servlet.I18nServlet</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>I18nServlet</servlet-name>
    <url-pattern>/chapter8/I18nServlet</url-pattern>
</servlet-mapping>

4. 测试

在IE地址栏中输入如下的URL:

http://localhost:8080/demo/chapter8/I18nServlet

如果IE的默认本地信息是“中文(中国)”,则在浏览器中显示的信息如图8.14所示。

14

图8.14 中文(中国)本地环境下的显示效果

从图8.14所示的显示效果可以看出,I18nResource向客户端输出了中文信息,而且日期、时间和货币信息都符合中文习惯。由此可以断定,I18nResource类读取的是I18nResource_zh_CN.properties文件中的国际化信息。

将IE的默认本地环境改为“英语(美国)”(修改的方法见8.3.1节所讲的内容)。刷新图8.14所示的页面,输出的信息如图8.15所示。

15

图8.15 英语(英文)本地环境下的显示效果

从图8.15所示的显示效果可以看出,当IE的默认本地信息变成“英语(美国)”时,I18nResource类就会读取I18nResource_en_US.properties文件,而且日期、时间和货币的信息都变成了英语的习惯。

5. 程序总结

在Web程序中进行国际化,不仅要在获得ResourceBundle对象时指定Locale对象,而且要在创建MessageFormat对象时也指定Locale对象。否则就会出现文本信息根据指定的本地信息显示,但日期、时间和货币等信息却按着服务端的默认本地信息来显示。读者在国际化Web程序时要注意这一点。