ITEEDU

Struts Gossip: 国际化讯息

讯息管理 中,您已经知道如何使用讯息资源文件来统一管理讯息,接下来的问题是,如何使用中文讯息?

使用中文讯息文件的方式是使用预设的ISO-8859-1编码(简单的说,操作系统预设的文本文件编码就可以了),然后使用JDK中所附的工具程序native2ascii,将中文转换为Unicode,执行以下指令即可:
 native2ascii messages_zh_TW.txt application_zh_TW.properties

举个例子,如果我们的messages_zh_TW.txt内容是:
welcome.helloWord=哈啰!
welcome.message=这是您的神秘礼物!
则经过native2ascii编码过后的messages_zh_TW.properties,内容会如下:
welcome.helloWord=\u54c8\u56c9\uff01
welcome.message=\u9019\u662f\u60a8\u7684\u795e\u79d8\u79ae\u7269\uff01
Struts预设以服务器上的Locale设定来决定要传回哪一个讯息资源文件的内容给客户端,在文件名称命名上您可以用语言与区域讯息来表明国际化时要使 用的档案,例如application_zh_TW.properties、 application_zh_CN.properties、application_zh_HK.properties,如果Struts找不到对应 Locale的讯息档案,则会使用预设的messages.properties。

将这个讯息资源文件与messages.properties放在同一个目录,如果您的操作系统是繁体中文,则服务器预设就会使用 messages_zh_TW.properties讯息档案,而客户端使用Big5编码或UTF-8编码来浏览就可以得到繁体中文讯息。

当然,如果您的程序服务于许多语系的使用者,您不能依赖于服务器的预设语系,您可以在 Action 中使用MessageResources的getMessage()方法指定Locale,来取回对应的区域讯息,例如:
....
 public ActionForward execute(....) throws Exception {
        ....
        MessageResources messageResources = 
                            
getResources(request);
        
        Locale locale = new Locale("zh", "CN");
        String helloWord = 
            messageResources.getMessage(locale, 
                                       
"welcome.helloWord");
        String message = 
            messageResources.getMessage(locale, 
                                       
"welcome.message");
        ....
  }
....
这可以指定取得messages_zh_CN.properties中的讯息,在实际的应用中,您可以在窗体中放一个隐藏参数,表示使用者所选择的语系,然后在Action中取得这个参数,以决定该显示什么语系给使用者。

如果您有这个需求的话,您也可以运用getMessage()并配合Locale的切换,在同一个页面显示各种语言,这只要讯息档案配合使用UTF-8储存,并指定客户端显示时使用UTF-8即可达到这个目的,例如:
Sting helloWord = messageResources.getMessage(
           new Locale("zh", "CN"), "welcome.helloWord");

String message = messageResources.getMessage(
           new Locale("zh", "TW"), "welcome.message"); 

配合UTF-8编码,这将可以在同一个页面显示简体中文与繁体中文,当然,别忘了准备messages_zh_CN.properties与 messages_zh_TW.properties两个不同语言的讯息档案。