成长中的记忆
这是我的成长,这是我的天地,学习JAVA,只因快乐。
posts - 4,comments - 16,trackbacks - 0

    在用Java解决国际化问题的过程中,可能利用到的主要的类都是由java.util包提供的。该类包中相关的类有Locale、ResourceBundle、ListResourceBundle、PropertyResourceBundle等。
    Locale:该类包含对主要地理区域的地域化特征的封装。其特定对象表示某一特定的地理、政治或文化区域。通过设定Locale,我们可以为特定的国家或地区提供符合当地文化习惯的字体、符号、图标和表达格式。例如,我们可以通过获得特定Locale下的Calendar类的实例,显示符合特定表达格式的日期。
    ResourceBundle:该类是一个抽象类,需要通过静态方法ResourceBundle.getBundle()指定具体实现类或属性文件的基本名称。基本名称会协同指定的或默认的Locale类,决定具体调用的类或属性文件的唯一名称。例如:指定基本类或属性文件名称为TestBundle,而指定的Locale是CHINESE,那么最适合匹配的类名称为TestBundle_zh_CN.class,而最佳匹配属性文件名称为TestBundle_zh_CN.properties。按照Java Doc和相关文档的要求,如果该类或属性文件没有找到,系统会查找近似匹配(主文件名依次为TestBundle_zh和TestBundle的类或属性文件)。该类提供的getKeys()方法用于获得所有成员的键名,并提供handleGetObject方法获得指定键的对应元素。
    ListResourceBundle:该类继承ResourceBundle类,主要是增加了一些便于操作的成分,但还是抽象类。如果希望使用类的方式实现具体的ResourceBundle,一般情况下最好继承这个类。
    PropertyResourceBundle:该类也继承ResourceBundle类,可以实例化。该类的行为特征如同java.util.properties类,可以从输入流中获得具体属性对。
    使用PropertyResourceBundle类获得当地版本的国际化信息,部分代码如下……
    public static final String BASE_PROP_FILE = “DISP”;
  public static final String SUFFIX = “.properties”;
  locale = Locale.getDefault();
  String propFile = BASE_PROP_FILE + “_” + locale.toString()+ SUFFIX;
  ResourceBundle rb;
  try {
   File file = new File(propFile);
   if (file.exists()) {
     is = new FileInputStream(file);
      rb = new PropertyResourceBundle(is);
      if (rb == null) System.out.println(“No Resource”);
   }
  } catch (IOException ioe) {
   System.out.println(“Error open file named ” + propFile);
  }
  Enumeration e = rb.getKeys();
  while (e.hasMoreElements()){
   key = (String)e.nextElement();
   value = (String)rb.handleGetObject(key);
   System.out.println(“KEY: ” + key +“ Value: ” + value);
  }
  ……
  DISP_zh_TW.properties文件的具体内容如下:
  Key1=可以
  Key2=撤销
    等号后面是利用native2ascii程序转化后的繁体汉字,如果不进行转化,系统可能显示乱码。
    
    处理提示和帮助
    对于提示语言和帮助文件部分,可以把语言映射放在属性文件或者ListResourceBundle类的子类中。下面程序是一个Servlet,它通过接受客户端的选择,把特定语言和字符版本的信息返回到客户端。  public class ProcessServlet extends HttpServlet
  { //默认语言为中文
   public static final String DEFAULT_LANGUAGE = “zh”;
   //默认字符集为简体中文
   public static final String DEFAULT_COUNTRY = “CN”;
   public void service(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException {
   HttpSession session = req.getSession(true);
   // 从客户端收到的指定语言和字符的参数应当与Sun公司相关规定一致
   String lang = req.getParameter(“language”);
   String country = req.getParameter(“country”);
   if (lang == null) {
       //如果没有收到参数,就试图从Session里获得
     lang = (String) session.getAttribute(“language”);
     country = (String) session.getAttribute(“country”);
   } else {
     session.setAttribute(“language”, lang);
     session.setAttribute(“country”, country);
   }
   if (lang == null){
       //如果无法从上述手段得到语言和字符信息,就使用默认值
     lang = DEFAULT_LANGUAGE;
     country = DEFAULT_COUNTRY
     session.setAttribute(“language”, lang);
    session.setAttribute(“country”, country);
   }
   Locale locale = null;
   ResourceBundle bundle = null;
   try {
     locale = new Locale(lang, country);
    } catch (Exception e) {
      System.out.println(“No locale with” + country + “_” + lang);
     locale = Locale.getDefault();
    }
    try {
       bundle = ResourceBundle.getBundle(“DisplayList”, locale);
   } catch( MissingResourceException e) {
     System.out.println( “No resources available for locale ” + locale);
     bundle = ResourceBundle.getBundle(“DisplayList”, Locale.US);
   }
   res.setContentType(“text/html”);
   PrintWriter out = res.getWriter();
   out.println(“<html>”);
   out.println(“<head>”);
   String title = bundle.getString(“title”);
    String welcome =bundle.getString(“welcome”);
   String notice = bundle.getString(“notice”);
   out.println(“<title>”+ title +“</title>”);
   out.println(“</head>”);
   out.println(“<body bgcolor=”white“>”);
   out.println(“<h3>” + welcome + “</h3>”);
   out.println(“<br>”);
   out.println(“<b>” + notice +“</b>”);
   out.println(“</body>”);
   out.println(“</html>”);
  }
  }
上述Servlet使用的属性文件(DisplayList_zh_CN.properties)内容如下:
title=中文版
welcome=这是简体中文版面
notice=简体中文测试成功
注意:该文件直接采用了中文,而不是经过转化的Unicode编码,这是由于大多数Web服务器不需要上述转化。
    在实际使用中,如果Web服务器支持Servlet 2.3规范(如jakarta-tomcate 4.0),那么上面提到的Servlet应当稍加改变,以作为其他Servlet的处理器使用。另外,如果把ResourceBundle的特定版本存放在无状态会话Bean中,就可以在一定程度上提高程序效率。
    对于显示字符出现乱码的问题,如果是通过属性文件实现国际化解决方案,那么可能是直接在属性文件中写入了非标准ASCII文字。解决方法是利用JDK提供的工具native2ascii.exe扫描所有属性文件,用扫描结果覆盖原有文件内容。如果我们是利用类文件实现转换方案,那么需要重新编译相关类文件,并在编译时指定编码集。例如,编译使用国标码的类文件,采用的编译命令如下:
javac -encoding GB2312 your_java_file

posted on 2006-02-17 16:12 aiyoyoyo 阅读(3515) 评论(0)  编辑  收藏 所属分类: JSP

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


网站导航: