es 类
public static String getMessage( String key )
{
ViewerResourceHandle resourceHandle = getResourceHandle( );
if ( resourceHandle != null )
return resourceHandle.getMessage( key );
return key;
}
类 ViewerResourceHandle 继承自 ResourceHandle 类。
清单 2. ViewerResourceHandle 类
public class ViewerResourceHandle extends ResourceHandle
我们再看 ResourceHandle 类,这个类是组织资源文件的关键类:
清单 3. ResourceHandle 类
public ResourceHandle( ULocale locale )
{
String className = this.getClass( ).getName( );
String bundleName = ""; //$NON-NLS-1$
// Create the base message file name formatted like a Java class.
// The Java class loader will search for the file using the same
// algorithm used to find classes.
int index = className.lastIndexOf( ''.'' );
if ( index > -1 )
{
// e.g: "org.eclipse.birt.report.model.util.Test"
bundleName = className.substring( 0, index ) + ".";
//$NON-NLS-1$
}
bundleName = bundleName + BUNDLE_NAME;
if ( locale == null )
locale = ULocale.getDefault( );
resources = UResourceBundle.getBundleInstance(
bundleName, locale.toString(), this.getClass().getClassLoader() );
assert resources !=
null : "ResourceBundle : " + BUNDLE_NAME + " for " + locale + " not found";
//$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
}
基于Eclipse的Birt国际化的分析与改进(5)
时间:2011-07-03 IBM 苏春波
从 this.getClass().getClassLoader()可以看出来 console 的国际化文件是放在类路径下面的,文件的组织形式是文件名称 +locale,再有资源文件放到 jar 包里面类路径下可不是什么好的方法,那么我们是否能提供一个外部变量来配置这个资源文件的路径呢?后面我们会讲到。先来看看为什么中文资源文件放到 jar 包里面的类路径下不起作用,明明是有 locale 的,是不是感觉有点奇怪?我们接下来继续跟踪,进入类 ReportEngineService 中的方法 createGetParameterDefinitionTask, 看它的方法体:
清单 4. 原 createGetParameterDefinitionTask 方法
public IGetParameterDefinitionTask createGetParameterDefinitionTask(
IReportRunnable runnable, InputOptions options )
{
IGetParameterDefinitionTask task = null;
try
{
HttpServletRequest request =
(HttpServletRequest) options.getOption( InputOptions.OPT_REQUEST );
task = engine.createGetParameterDefinitionTask( runnable );
// set app context
Map context = BirtUtility.getAppContext( request,
ReportEngineService.class.getClassLoader( ) );
task.setAppContext( context );
}
catch ( Exception e )
{
}
return task;
}
我们会注意到服务层的这个入口方法中没有设置任何与 locale 相关的变量,添加设置 locale 变量的代码,修改后的 createGetParameterDefinitionTask 如下所示:
清单 5. 修改后的 creat |