多语言包

时间:2008-04-17 19:29:59  来源:  作者:

多语包使用的方法看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:fswan@yah.net

 * 用来读资源文件用的接口,跟不同语言获取不同的字符串

 * 如果在获取资源的同传入的地区代码为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,是把处于commontitle下的所有的所有的资源显示出来

     * 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:fswan@yeah.net

 * XML文件获取资源的类

 * 资源的定位方式为树形层之间用逗号隔开。

 * 如资源文件内容为以下内空

 * <resource>

 * <form1><title1>Title1</title1><title2>Title2</title2>

 * </form1>

 * </resource>

 * 则获取资源form1.title1的内容为Title1

 * 获取资源form1的内容为title1title2

 *

 * 也可以使用%1来替换,比如 Title of %1

 * 在调用时使用getResource("xxxx","Book")时会变成 Title of Book

 *

 */

public class XmlResource implements Resource

{

    /**

     * 用来存放资源,HashtableKeyLocale,值是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]);