专注于java技术

 

struts用资源文件国际化

import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.ResourceBundle;

import sun.util.ResourceBundleEnumeration;

public class ReadBundle {

 /**
  * @param selectName,bundleName
  * @return
  */
 
 public List getKeys(String selectName,String bundleName){
  //切忌不要忘记ArrayList的初始化.否则问题严重大了..这是一个惨痛的教训.
  ArrayList  keys = new ArrayList();
  //根据提供的bundleName创建一个ResourceBundle
  System.out.println(bundleName);
  ResourceBundle bundle = ResourceBundle.getBundle("com.bookshop.struts." + bundleName);
  //将bundle中的keys通过方法getKeys()给取出来,放到一个枚举类型的表里.
  ResourceBundleEnumeration keyList = (ResourceBundleEnumeration)bundle.getKeys();//获取bundle中所有的键值.
  //创建一个局部变量key,用于暂存bundle中的一个key.
  String key = null;
  /*
   * 遍历键值表,找出键值对应value与selectName相同,或selectName是value子串的key.添加到keys里
   */
  
  while(keyList.hasMoreElements()){
   //逐个取出枚举表中的key值.
   key = (String)keyList.nextElement() ;
   //用bundle的getString()方法得到key对应的value./
   /*
    * 因为在资源文件里,存储方式是  key<-->value  即 键<-->值 对.
    */
//   System.out.println(key);
   String value = bundle.getString(key);
 
   //判断,如果根据key得出来的value 中包含给出的待选名字,或者正好等于给定的待选名字.那么,就把此key添加到keys表里,备返回.
   if( (value.contains(selectName)) || (value.equalsIgnoreCase(selectName)) ){
    System.out.println(key);
    keys.add(key);

   }
   
  }
  
  return keys;//返回所需的键值表.
 }

 /*
  * 判断该执行哪一个bundle来获取keys表.
  *
  */
 /**
  * @return keys
  */
 public List judgeBundle(Locale locale , String selectName){
  List keys = null;

  String language = locale.getCountry();
//  System.out.println(language);
//  switch(language){
//  case "zh-cn" : keys = getKeys(selectName,"");break;
//  default: keys = getKeys(selectName,"");
//  }
  if(language.equals("") || language == null){
   keys = getKeys(selectName,"ApplicationResources_en");
  }
  else if(language.equalsIgnoreCase("cn") || language.equalsIgnoreCase("zh")){
   keys = getKeys(selectName,"ApplicationResources_zh_CN");
  }
  else if(language.equalsIgnoreCase("en")){
   keys = getKeys(selectName,"ApplicationResources_en");
  }
  else{
   keys = getKeys(selectName,"ApplicationResources_en");
   
  }
  return keys;
 }

}
因为这个国际化,是通过资源文件实现,即数据库只存储  一串英文符号代码,具体的内容在资源文件里实现。比如,数据库里有一个bookName字段,那么在数据库表里,可能存储的是bookName,而在资源文件里得如下配置:bookName=Thingking in java(英文资源文件)bookName=java编程思想(中文资源文件)。。。等等。在页面上写<bean:message name="book" property="bookName" />(假如bookName是一个名为book的javabean的一个字段)。这样,在按名字查询的时候,就得到资源文件里匹配,而不是到数据库里。上面写的那个类就是读取资源文件的,然后根据value寻找key。
找到key以后,就找到要查询的东东了。
但是,有个地方没想好。就是,分页查询的时候,这个不能一次查询n条记录,而是一次性全部查询,当数据量大的时候,可能第一次查询会很慢。  我想了一个办法,还没有试行。就是,自己写一个读取文件的类,在读取了n条符合条件的记录后,将第n条记录的下一行行号记录下来,下一页查询的时候,从记录的行号继续往下查询。不过,我在文件这方面学的不精,是以没写出来。
请大家指正。

posted on 2007-12-06 17:04 jackey 阅读(389) 评论(0)  编辑  收藏


只有注册用户登录后才能发表评论。


网站导航:
 

导航

统计

常用链接

留言簿(1)

随笔档案

搜索

最新评论