一、i18n简介

              就是internationalization的缩写,即国际化;

              这要从你的浏览器支持的语言说起,你可以在你的浏览器中查看你的浏览器所支持的语言;struts2笔记(11)-----Struts2的i18n的介绍_strust

一般情况系都是支持中文,你可以添加;国际化的实现就是依赖这些语言的设置;

假如,你的设置是英文,在你的项目中使用到了国际化资源,并且没有指定使用哪种资源文件(假设有两个一个英文和一个中文的资源文件);你会发现你的项目会自动去寻找与这里配置相同的资源文件也就是英文语言去显示;

请看下面的一个例子:

前提:是一个java程序,在src下有

Message_zh_CN.properties和Message_en_US.properties两个资源文件;

其内容是:

struts2笔记(11)-----Struts2的i18n的介绍_strust_02

struts2笔记(11)-----Struts2的i18n的介绍_strust_03


然后,在看项目的代码:


package struts.i18n;
import java.text.MessageFormat;
import java.util.Locale;
import java.util.ResourceBundle;
public class Main {
/**
 * @param args
 */
public static void main(String[] args) {
Locale locale=Locale.getDefault();
System.out.println(locale);
//ResourceBundle sources=ResourceBundle.getBundle("struts.i18n.Message", locale);
ResourceBundle sources=ResourceBundle.getBundle("struts.i18n.Message", new Locale("en_US"));
String tip=sources.getString("tip");
String welcome=sources.getString("welcome");
System.out.println(tip);
System.out.println(MessageFormat.format(welcome, "x","z","b"));
}
}


     首先你在项目中指定了所使用的资源文件,自然显示英文;然后,你不指定资源文件运行,看看结果,是否是与你系统的语言相同;Locale.getDefault()便是获取你系统默认的设置信息;

     注意资源文件的命名方式一定要规范;  

     在WEB项目中资源文件的命名要更加严格;命名的不同,你的显示效果就会不同;

     上面的程序不是web应用程序,仅仅是一个资源文件的调用显示;

     你可以推测,在web项目中国际化的实现就是根据指定不同语言文件去显示;这便是国际换的实现原理;

      下面在给出一个工具类,你可以查看,你系统当前所支持所有的语言:

package struts.i18n;
import java.util.*;
public class LocaleList
{
    public static void main(String[] args)
    {
                                                                                                                                                                                                                                                                                                                                                          
        Locale[] localeList = Locale.getAvailableLocales();
                                                                                                                                                                                                                                                                                                                                                          
        for (int i = 0; i < localeList.length ; i++ )
        {
                                                                                                                                                                                                                                                                                                                                                              
            System.out.println(localeList[i].getDisplayCountry()
                + "=" + localeList[i].getCountry()  + " "
                + localeList[i].getDisplayLanguage() + "="
                + localeList[i].getLanguage());
        }
    }
}



          二、在web中引用不同资源文件中的值


           1、在web中资源文件的命名规范,三个级别的:

                第一;action级别:优先级别依次降低

                          (1)、Action名_en_US.properties

                (2)、Action名_en.properties

                (3)、Action名.properties

                第二;包级别:package.properties;

                           这个命名是不变的,优先级低于Action级别;

                           如果不同包中都含有这个文件,本包中的文件优先于其他包中的文件;

                第三;全局级别:xxxx-xxx_en_US.properties

                          这个级别最低;最后才会引用这个资源文件;


         2、下面的列子,假设我们的资源文件都已经存在;

                我们使用Strust2的标签,来引用位于不同资源文件中的值;

           

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <head>
        <title><s:text name="login.pageTitle" /></title>
    </head>
    <body>
        <font color=red>1.使用ui标签的key属性</font>
        <s:form action="">
            <s:textfield name="username" key="user.name" /><br>
            <s:textfield name="passwd" key="user.passwd" /><br>
            <s:submit key="submitButton" />
        </s:form><hr/>
                                                                  
        <font color=red>2.使用i18n标签</font>
        <s:i18n name="struts/i18n/Message">
            <s:text name="tip" />
        </s:i18n><br/>
        <s:i18n name="struts.i18n.Message">
            <s:text name="welcome">
                <s:param>x</s:param>
                <s:param>z</s:param>
                <s:param>b</s:param>
            </s:text>
        </s:i18n><br/><hr/>
        <font color=red>3.使用text标签</font>
        <s:text name="errors.required">
            <s:param><s:text name="user.name"></s:text></s:param>
            <s:param><s:text name="user.passwd"></s:text></s:param>
        </s:text><br/><hr/>
                                                                  
                                                                  
        <font color=red>4.使用property标签</font>
        <s:property value="getText('user.name')"/><hr/>
                                                                          
    </body>
</html>


             这个例子,演示了在JSP中如何使用不同的标签使用资源文件中的值;

             你可以在Action中引用资源文件中的值;使用getText(),具体如下:

             String name=this.getText("user.name");

     

        到这里我们已经明白,资源文件只要设置正确,我们可以在JSP和Action中随意引用,这样离我们实现国际化就不远了,只要动态的更改资源文件的调用即可;下一篇我们就实现这一功能;