对于国际化的基本知识和概念倒也有了,如Resourcebundle,MessageFormat,DateFormat,Unicode等。我碰到的情况是这样,系统已经开发基本完成了,是中文版本,现在需要提供英文版本,后续可能还要其他语言。我们就计划将系统一次国际化修改,后续会舒服一点。
系统的结构大概是这样的,3层结构,client是Java Swing的application,没有什么框架,自己写的。服务器用EJB,JMS,DB是oracle。我们国际化的重点还是在界面、异常提示、实时消息显示。目前想到的方案就是提供一个公共类,如I18N,这个类负责提供合适的文本串,其他地方的编码只需要调用这个公共方法即可,如I18N.getMessage(key).对于需要进行参数替换的,就类似于I18N.getMessage(key,obj1,obj2...)。这样对于整个系统的修改我们认为尚可接受。
现在的困难在于,每层都划分了不少模块,大家抽取属性文件为了维护方便,就按照模块各抽取一个。这样properties文件比较多,公共类通过Resourcebundle如何加载?一次好像只能一个,而且必须显式的告诉属性文件名。
另外一个困难在于,我们客户端和服务器还有一个公共类,比如jms的消息体,exception等,这些对象也有国际化的问题,这些properties文件相当于要在两边都用,如何规划和被加载。
还有就是一般而言,属性文件最后一般怎样发布,看有人说把属性文件独立打包为jar这样后续增加其他语言,不需要对于class的包进行修改。我个人对这种思路比较喜欢,但是jar包中的属性文件如何被我们的公共类找到并加载。
不知道这样描述是否清晰,希望能得到您的指导。不甚感激。我们系统的package划分大概如此
com
  |___client
  |___server
  |___db
  |___common
其中common下的类是各层公用的。想在common下增加一个新类I18N,接口大概就是
Class I18N{
  public I18N(){
    //将所有需要的properties文件都正确加载和解析,并缓存。
  }
  String getMessage(String key)
  String getMessage(String key,Object...vars)
}

解决方案 »

  1.   

    spring里提供一个东西,可以加载多个properties,
    做网页,我都是用jstl里的fmt,不过这个东西也只支持一个properties。
      

  2.   

    一般方法:
     1.在页面部分,一定要把页面的编码设成UTF-8,就是在开头加上这一句:<%@ page contentType="text/html; charset=UTF-8" %>。并且把所有的文字信息都放到resource文件中。
          以前我在写网页的时候,没有指定页面的编码,总是在获取表单的内容后,要人工的用new String(s.getBytes("ISO8859-1"))转换一下,这样是很繁琐的,而且很容易出错。网页中如果没有指定编码,那么默认的就是用ISO8859-1编码的。
     2.相应的资源文件需要用native2ascii转换一下。
          对于简体中文的资源文件:native2ascii -encoding gbk ApplicationResources_zh.properties convert\ApplicationResources_zh.properties
          对于繁体中文的资源文件:native2ascii -encoding big5 ApplicationResources_zh_tw.properties convert\ApplicationResources_zh_tw.properties 
     3.需要用一个filter设置一下request的编码!
      

  3.   

    Swing做的东西的话,也许你还需要考虑字库的问题-_-#
      

  4.   

    jar包可以在Manifest文件里面加载
    你可以仿照spring的方式,首先定义一个xml文件,里面存储你的属性文件的头(该文件可以打在jar中)
    例如<properties>
    message-模块名
         .
         .
         .
    </properties>然后在你的I18N中读取该文件
    使用ResourceBundle bundle = getResourceBundle(this.basenames[i], locale);
    bundle.getString(key)