多语言包
多语包使用的方法看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,是把处于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:fswan@yeah.net
* 从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]);