所谓的国际就是说一个软件界面可以根据不同的语言要求加载不同的资源文件,这些资源文件的内容就是用不同的语言来描述的。还有就是资源文件的命名也是有讲究的,一般常用的命名方式是:baseName_language_country.properties;也即baseName可以根据需要随便命名language和country分别指java中支持的语言和国家,如message_en_US.properties或message_zh_CN.properties这个文件应该放在类路径中。说到这个,我就要从java中的几个关于国际化类及方法说起。
这几包括以下几个:
java.util.ResourceBundle,java.util.Locale,java.text.MessageFormat
java.util.ResourceBundle这个类就是用来加载不同的语言资源文件的,它里面有个静态方法getBundle(“message”,new Locale(“zh”,”CN”);这个方法接收一个资源文件的baseName以及一个Local的类型对象,该对象指定了java中支持的语言类型,调用方式如MessageFormat.format(res, new Object[]{“kit”,”fds”});res是通过资源文件的键所得到的一个值,第二个参数是对象数组指定了资源文件中的参数。所有的调用步骤如下:
ResourceBundle rb = ResourceBundle.getBundle("message",new Locale("zh","CN"));
String res = rb.getString("greet");
System.out.println(MessageFormat.format(res, new Object[]{"kit","fds"}));
同时资源文件中对应的内容为:greet=hello{0}
{0}代表第一个参数{1}代表第二个参数,依此类推…..
其实struts框架中的国际化,其底层也是通过使用这些工具类工具方法来实现的,只不过对这些东西做了进一步封装。下面就其国际化内容的配置过程作一下简单的小结。
首先我们要在struts-config.xml中引入<message-resources parameter="message"></message-resources>
其中parameter的属性值就是资源文件的baseName。资源文件的内容和上面提到的一样,然后我们还要配置action控制器
<action path="/login" type="com.ev.myaction.MyAction">
<forward name="forward" path="/index.jsp"></forward>
</action>
这个控制器可以跳转到index.jsp页面,它的访问路径为/login.do,处理类为com.ev.myaction.MyAction。我们还要在index.jsp中调用一下这个action,具体为:
<a href="/testi18n/login.do?l=zh&c=CN">中文</a>||<a href="/testi18n/login.do?l=en&c=US">英文</a>
这边传递两个参数l和c分别代表java支持的语言和国家。然后在action控制器中我们就可以通过这两个参数来创建不同的Locale对象,从而加载不同的资源了具体内容如下:
package com.ev.myaction;
import java.util.Locale;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.struts.Globals;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
public class MyAction extends Action {
@Override
public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) throws Exception {
String l = request.getParameter("l");
String c = request.getParameter("c");
HttpSession session = request.getSession();
session.setAttribute(Globals.LOCALE_KEY,new Locale(l,c));
return mapping.findForward("forward");
}
}
需要注意的是在action中创建一个Locale后我们要通过Globals.LOCALE_KEY属性把它共享到作用域中去,然后在struts的底层才能够去别识该Locale,从而加载不同的语言资源文件。mapping.findForward("forward")
就跳转到相应的页面,在这里以index.jsp为例。跳转到页面后,我们要在页面中通过<bean:message key="greet"/>
标签接收传递过来的信息;key和资源文件中的相关key相关联。以上就是这些内容的简单小结。