java的国际化完整方案
对于国际化的基本知识和概念倒也有了,如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)
}