多语包使用的方法看Resource的注释即可,所有的功能都在Resource中定义了。 
在XMLResource类中有Main方法,可以直接运行。 
在调用之前先执行XMLResource.import方法把文件调入。 
软件使到了一个资源文件为XML文件,格式如最后所示。 
以下文件编译即可运行 
=======================Resource.java ======================= 
package org.fswan; 
  
import java.util.Locale; 
import java.util.Properties; 
  
/** 
 * @author Swan Fong(方志文) 
 * e-mail:[email protected] 
 * 用来读资源文件用的接口,跟不同语言获取不同的字符串 
 * 如果在获取资源的同传入的地区代码为NULL的话则使用缺省的地区代码 
 */ 
public interface Resource { 
    /** 
     * 获取跟名称相对应的资源的内容 
     * @param name 名称 
     * @param locale 语言 
     * @return 资源内容 
     */ 
    public String getResource(String name,Locale locale); 
    /** 
     * 获取带有参数的资源的内容 
     * @param name 资源的名称 
     * @param property 资源的参数值 
     * @param locale 语言 
     * @return 资的内容 
     */ 
    public String getResource(String name,String[] property,Locale locale); 
    /** 
     * 获取一组资源 
     * 如果目录名为common.title,是把处于common下title下的所有的所有的资源显示出来 
     * property是参数名,对应category下资源的长度,第二维为长度。如果长度小于category的长度 
     * 则把最后一个作为这之后的所有的资源的参数,如果为null则所有的资源都没参数。 
     * @param category 目录名 
     * @param property 参数 
     * @param locale 语言 
     * @return 资源数组 
     */ 
    public Properties getResource(String category,String[][] property,Locale locale); 
    /** 
     * 获取目录下所有的资源的名 
     * @param category 目录名 
     * @param locale 语言 
     * @return 所有的子项的数组 
     */ 
    public String[] getResourceNames(String category,Locale locale); 
    /** 
     * 获取目录下所有的资源或子目录 
     * @param category 目录名 
     * @param isCategory 返回的是子目录还是资源 
     * @param locale 语言 
     * @return 返回的内容 
     */ 
    public String[] getResourceNames(String category,boolean isCategory,Locale locale); 
} 
  
  
===============End ================================ 
==============XMLResource.java====================== 
package org.fswan; 
import java.io.File; 
import java.io.IOException; 
import java.util.ArrayList; 
import java.util.Hashtable; 
import java.util.Locale; 
import java.util.Properties; 
import java.util.StringTokenizer; 
import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.parsers.FactoryConfigurationError; 
import javax.xml.parsers.ParserConfigurationException; 
import org.w3c.dom.Document; 
import org.w3c.dom.Element; 
import org.w3c.dom.NodeList; 
import org.xml.sax.SAXException; 
/** 
 * @author Swan Fong(方志文) 
 * E-mail:[email protected] 
 * 从XML文件获取资源的类 
 * 资源的定位方式为树形层之间用逗号隔开。 
 * 如资源文件内容为以下内空 
 * <resource> 
 * <form1><title1>Title1</title1><title2>Title2</title2> 
 * </form1> 
 * </resource> 
 * 则获取资源form1.title1的内容为Title1 
 * 获取资源form1的内容为title1和title2 
 *  
 * 也可以使用%1来替换,比如 Title of %1 
 * 在调用时使用getResource("xxxx","Book")时会变成 Title of Book 
 *  
 */ 
public class XmlResource implements Resource 
{ 
    /** 
     * 用来存放资源,Hashtable的Key是Locale型,值是Element型的,对应不同的Locale有不同的Document 
     */ 
    private static Hashtable resources; 
    /** 
     * 缺省的语言 
     */ 
    private static Locale defaultLocale = new Locale("zh", "CN"); 
    static { 
        ArrayList list = ResourceLib.getXmlResource(); 
       for (int i = 0; i < list.size(); i++) 
       { 
           importXML(list.get(i).toString()); 
       } 
    } 
    public static void importXML(String fileName) 
    { 
       try 
       { 
           DocumentBuilderFactory builderFac = DocumentBuilderFactory.newInstance(); 
           DocumentBuilder builder = builderFac.newDocumentBuilder(); 
           Document doc = null; 
  
           if(new File(fileName).exists()) 
           doc = builder.parse(new File(fileName)); 
           else 
           doc = builder.parse(XmlResource.class.getResourceAsStream(fileName)); 
           Element root = doc.getDocumentElement(); 
           NodeList nl = root.getElementsByTagName("resource"); 
           resources = new Hashtable(); 
           for (int i = 0; i < nl.getLength(); i++) 
           { 
               Element el = (Element) nl.item(i); 
               Locale locale = new Locale(el.getAttribute("language"), el.getAttribute("country")); 
               resources.put(locale, el); 
           } 
       } catch (FactoryConfigurationError e) 
       { 
           e.printStackTrace(); 
       } catch (ParserConfigurationException e) 
       { 
           e.printStackTrace(); 
       } catch (SAXException e) 
       { 
           e.printStackTrace(); 
       } catch (IOException e) 
       { 
           e.printStackTrace(); 
       } 
    } 
    /* (non-Javadoc) 
     * @see org.fswan.db.Resource#getResource(java.lang.String, java.util.Locale) 
     */ 
    public String getResource(String name, Locale locale) 
    { 
       if (locale == null) 
           locale = defaultLocale; 
        Element el = null; 
        if(resources.get(locale)!=null) 
       el = (Element) resources.get(locale); 
       else 
       el = (Element) resources.get(defaultLocale); 
        
        StringTokenizer stk = new StringTokenizer(name, "."); 
       while (stk.hasMoreTokens()) 
       { 
           NodeList nl = el.getElementsByTagName(stk.nextToken()); 
           if (nl.getLength() < 1) 
               return null; 
           el = (Element) nl.item(0); 
       } 
        return el.getChildNodes().item(0).getNodeValue(); 
    } 
    /* (non-Javadoc) 
     * @see org.fswan.db.Resource#getResource(java.lang.String, java.lang.String[], java.util.Locale) 
     */ 
    public String getResource(String name, String[] property, Locale locale) 
    { 
       if (property == null || property.length == 0) 
           property = new String[] { "" }; 
        String tmpStr = getResource(name, locale); 
        StringBuffer sb = new StringBuffer(tmpStr); 
       int i = 1; 
       int pos = getPosition(sb, i); 
       while (pos != -1) 
       { 
           sb.replace( 
               pos, 
               pos + ("%" + i).length(), 
               property[(i - 1 > property.length) ? property.length - 1 : i - 1]); 
           i++; 
           pos = getPosition(sb, i); 
       } 
        return sb.toString(); 
    } 
    /** 
     * 获取StringBuffer中出现%i的位置,如果前面是\的话则不算,如果找不到则返回-1 
     * @param str 要查找的字符串 
     * @param i 要查找的内容 
     * @return 位置 
     */ 
    private int getPosition(StringBuffer str, int i) 
    { 
       int pos = str.indexOf("%" + i); 
       while (pos != -1 && str.charAt(pos - 1) == '\\') 
       { 
           pos = str.indexOf("%" + i, pos); 
       } 
        return pos; 
    } 
    /* (non-Javadoc) 
     * @see org.fswan.db.Resource#getResource(java.lang.String, java.lang.String[][], java.util.Locale) 
     */ 
    public Properties getResource(String category, String[][] property, Locale locale) 
    { 
       if (property == null || property.length == 0) 
       { 
           property = new String[1][1]; 
           property[0][0] = ""; 
       } 
        String[] names = getResourceNames(category, false, locale); 
        String[] values = new String[names.length]; 
        Properties p = new Properties(); 
       for (int i = 0; i < values.length; i++) 
       { 
           String[] pro = property[(i > property.length - 1) ? property.length - 1 : i]; 
          values[i] = getResource(category + "." + names[i], pro, locale); 
           p.setProperty(names[i], values[i]); 
       } 
        return p; 
    } 
    /* (non-Javadoc) 
     * @see org.fswan.db.Resource#getResourceNames(java.lang.String, boolean, java.util.Locale) 
     */ 
    public String[] getResourceNames(String category, boolean isCategory, Locale locale) 
    { 
       if (locale == null) 
           locale = defaultLocale; 
        Element el = null; 
        if(resources.get(locale)!=null) 
       el = (Element) resources.get(locale); 
       else 
       el = (Element) resources.get(defaultLocale); 
  
        StringTokenizer stk = new StringTokenizer(category, "."); 
       while (stk.hasMoreTokens()) 
       { 
           NodeList nl = el.getElementsByTagName(stk.nextToken()); 
           if (nl.getLength() < 1) 
               return null; 
           el = (Element) nl.item(0); 
       } 
        NodeList nl = el.getElementsByTagName("*"); 
       if (nl == null || nl.getLength() == 0) 
           return new String[] { 
       }; 
        String[] resources = new String[nl.getLength()]; 
       for (int i = 0; i < nl.getLength(); i++) 
       { 
           resources[i] = nl.item(i).getNodeName(); 
       } 
        return resources; 
    } 
    /* (non-Javadoc) 
     * @see org.fswan.db.Resource#getResourceNames(java.lang.String, java.util.Locale) 
     */ 
    public String[] getResourceNames(String category, Locale locale) 
    { 
       if (locale == null) 
           locale = defaultLocale; 
        Element el = null; 
        if(resources.get(locale)!=null) 
       el = (Element) resources.get(locale); 
       else 
       el = (Element) resources.get(defaultLocale); 
        StringTokenizer stk = new StringTokenizer(category, "."); 
       while (stk.hasMoreTokens()) 
       { 
           NodeList nl = el.getElementsByTagName(stk.nextToken()); 
           if (nl.getLength() < 1) 
               return null; 
           el = (Element) nl.item(0); 
       } 
        NodeList nl = el.getElementsByTagName("*"); 
       if (nl == null || nl.getLength() == 0) 
           return new String[] { 
       }; 
        String[] resources = new String[nl.getLength()]; 
       for (int i = 0; i < nl.getLength(); i++) 
       { 
           resources[i] = nl.item(i).getNodeName(); 
       } 
        return resources; 
    } 
    public static void main(String[] args) 
    { 
        XmlResource.importXML("com/fswan/application/AddressBook/resource.xml"); 
        Properties first = new XmlResource().getResource("addressbook", (String[][]) null, null); 
        Object[] s = first.keySet().toArray(); 
       for (int i = 0; i < s.length; i++) 
       { 
           System.out.println(s[i] + "  " + first.getProperty(s[i].toString())); 
       } 
    } 
} 
  
==========================END================================= 
==========================XML文件的格式=========================  
<?xml version="1.0" encoding="UTF-8"?> 
<!-- edited with XMLSPY v2004 rel. 3 U (http://www.xmlspy.com) by fswan (fswan) --> 
<root> 
   <resource language="en"> 
      <mainframe> 
          <title>Human Resource Management System</title> 
          <menu> 
             <file>File</file> 
             <new>New</new> 
             <save>Save</save> 
             <load>Load</load> 
             <saveas>Save as...</saveas> 
             <edit>Edit</edit> 
             <copy>Copy</copy> 
             <parse>Parse</parse> 
             <delete>Delete</delete> 
             <nextpage>Next Page</nextpage> 
             <tool>Tool</tool> 
             <language>Language</language> 
             <default>Default</default> 
             <english>English</english> 
             <china>Simplified</china> 
             <tchina>Tradition</tchina> 
             <employee>Employee Management</employee> 
             <detail>Detail</detail> 
             <employeelist>Employee List</employeelist> 
             <lookandfeel>Look and Feel</lookandfeel> 
             <javalook>Java Look</javalook> 
             <motiflook>Motif Look</motiflook> 
             <windowlook>Window Look</windowlook> 
             <defaultlook>Default</defaultlook> 
             <emeraldlook>Emerald</emeraldlook> 
             <sapphire>Sapphire</sapphire> 
          </menu> 
      </mainframe> 
   </resource> 
   <resource language="zh" country="CN"> 
      <mainframe> 
          <title>人力资源管理系统</title> 
          <menu> 
             <file>文档</file> 
             <new>新建</new> 
             <save>储存</save> 
             <load>存盘</load> 
             <saveas>另存为</saveas> 
             <edit>编辑</edit> 
             <copy>拷贝</copy> 
             <parse>粘贴</parse> 
             <delete>删除</delete> 
             <nextpage>下页</nextpage> 
             <tool>工具</tool> 
             <language>语言</language> 
             <default>缺省</default> 
             <china>中文</china> 
             <tchina>繁体中文</tchina> 
             <english>英文</english> 
             <employee>员工管理</employee> 
             <detail>员工资料</detail> 
             <employeelist>员工列表</employeelist> 
             <lookandfeel>外观</lookandfeel> 
             <javalook>Java 外观</javalook> 
             <motiflook>Motif 外观</motiflook> 
             <windowlook>Windows 外观</windowlook> 
             <defaultlook>默认</defaultlook> 
             <emeraldlook>祖母绿</emeraldlook> 
             <sapphire>海蓝宝石</sapphire> 
          </menu> 
      </mainframe> 
   </resource> 
</root> 
=========================END=================================== 
 
 
  |