从官方下载的Kettle3.2版本,大部分的界面已经可以显示为中文。基于Java对多国语言的支持,Kettle的汉化变得比较简单,只需修改相应的资源文件就可以了。
Kettle的多国语言资源文件非常多,总共有一百多个,分别放在不同的包的messages目录下面,而在messages目录的同一级,会有一个叫Messages的类。资源文件放到不同的目录下,有利于个模块单独开发,但建那么多一样的Messages类,似乎没有必要。
这些不是要说的重点,在完成所有资源文件的翻译之后,你会发现还是会有个别的地方,出现的是英文提示。一部分,通过搜索发现是因为源码里写死了,而另一部分却在源码里搜索不到。
例如,新建DB连接的时候,如果参数有误,点“测试”时,发现的提示窗的标题就是英文的。这个该死的英文到底写在哪里呢?
通过研究源码,找到负责"DB连接"配置对话框的类XulDatabaseDialog
。对话框打开时,下面的方法被调用
public String open() {
XulDomContainer container = null;
try {
DatabaseConnectionDialog dcDialog = new DatabaseConnectionDialog();
dcDialog.registerClass(EXTENDED_WIDGET_ID, EXTENDED_WIDGET_CLASSNAME);
container = dcDialog.getSwtInstance(shell); //Attention: onload: loadConnectionData() is called here the first time, see below for second time
container.addEventHandler(EVENT_ID, DataOverrideHandler.class.getName());
dataHandler = (DataOverrideHandler)container.getEventHandler(EVENT_ID);
if (databaseMeta != null) {
dataHandler.setData(databaseMeta);
}
dataHandler.setDatabases(databases);
dataHandler.getControls();
} catch (XulException e) {
new ErrorDialog(parentShell, Messages.getString("XulDatabaseDialog.Error.Titel"), Messages //$NON-NLS-1$
.getString("XulDatabaseDialog.Error.HandleXul"), e); //$NON-NLS-1$
return null;
}
......
org.pentaho.ui.xul.XulDomContainer这个类在kettle目录的\libext\pentaho\pentaho-xul-core-2.5.4.jar中,主要用来加载解决xul文件以及组件。其registerClass(..)方法用于注册组件。发编译其子类AbstractXulDomContainer,可以看到:
@Deprecated
public void addEventHandler(String id, String eventClassName)
throws XulException
{
if (eventClassName.indexOf("groovy") > -1) {
addGroovyHandler(id, eventClassName);
return;
}
try
{
Class cls = Class.forName(eventClassName);
AbstractXulEventHandler eventHandler = (AbstractXulEventHandler)cls.newInstance();
eventHandler.setXulDomContainer(this);
this.eventHandlers.put(id, eventHandler);
}
catch (ClassNotFoundException e) {
logger.error("Event Handler Class Not Found", e);
throw new XulException(e);
} catch (Exception e) {
logger.error("Error with Backing class creation", e);
throw new XulException(e);
}
}
DatabaseConnectionDialog没有继承自其他类,主要用于指定"DB连接"配置对话框的xul文件。
container = dcDialog.getSwtInstance(shell);
里面的实现,如下:
public XulDomContainer getSwtInstance(Shell shell) throws XulException
{
XulDomContainer container = null;
SwtXulLoader loader = new SwtXulLoader();
Iterable keyIterable = this.extendedClasses.keySet();
for (Object key : keyIterable) {
loader.register((String)key, (String)this.extendedClasses.get(key));
}
loader.setOuterContext(shell);
container = loader.loadXul("org/pentaho/ui/database/databasedialog.xul", Messages.getBundle());
return container;
}
SwtXulLoader类在\libext\pentaho\pentaho-xul-swt-2.5.4.jar中,在SwtXulLoader实例化的时候,注册了许多默认的组件。
public SwtXulLoader()
throws XulException
{
this.parser.registerHandler("WINDOW", "org.pentaho.ui.xul.swt.tags.SwtWindow");
this.parser.registerHandler("DIALOG", "org.pentaho.ui.xul.swt.tags.SwtDialog");
....
this.parser.registerHandler("MESSAGEBOX", "org.pentaho.ui.xul.swt.tags.SwtMessageBox");
....
我所举例的问题症结就在这个注册为"MESSAGEBOX"的组件上。
XulDatabaseDialog的open()方法中,后面的代码将使用其同级目录下的feature_override.xul替换databasedialog.xul的部分内容。
在feature_override.xul可以看到,显示“测试”按钮的代码。
<hbox id="test-button-box">
<label id="spacer-label" flex="5" />
<button id="test-button" label="${DatabaseDialog.button.Test}
" flex="1" onclick="dataHandler.testDatabaseConnection()
" />
<button id="feature-button" label="${DatabaseDialog.button.FeatureList}" flex="1" onclick="dataHandler.showFeatureList()" />
<button id="explore-button" label="${DatabaseDialog.button.Explore}" flex="1" onclick="dataHandler.explore()" />
<label id="spacer-label" flex="5" />
</hbox>
可以看到,按钮被点击时,将执行dataHander的testDatabaseConnection()方法。
在XulDatabaseDialog的open()方法中
,下面的代码已经将DataOverridHandler类注册为"dataHander"。
container.addEventHandler(EVENT_ID, DataOverrideHandler.class.getName());
org.pentaho.ui.database.event.DataHandler中,
public void testDatabaseConnection()
{
DatabaseMeta database = new DatabaseMeta();
getInfo(database);
String[] remarks = database.checkParameters();
String message = "";
if (remarks.length != 0) {
for (int i = 0; i < remarks.length; i++)
message = message.concat("* ").concat(remarks[i]).concat(System.getProperty("line.separator"));
}
else {
message = database.testConnection();
}
showMessage(message, message.length() > 300);
}
showMessage()方法,将打开提示对话框
private void showMessage(String message, boolean scroll) {
try {
XulMessageBox box = (XulMessageBox)this.document.createElement("messagebox"
);
box.setMessage(message);
box.setModalParent(((XulRoot)this.document.getElementById("general-datasource-window")).getRootObject());
if (scroll) {
box.setScrollable(true);
box.setWidth(500);
box.setHeight(400);
}
box.open();
} catch (XulException e) {
System.out.println("Error creating messagebox " + e.getMessage());
}
}
上面代码中的"messagebox"生成的组件,就是SwtMessageBox的实例。从上面看到没有指定SwtMessageBox的title, 所以SwtMessageBox就使用了默认标题。
public String getTitle() {
if (this.title == null) {
return "Message:";
}
return this.title;
}
如果没有指定Button,就显示ok按钮。
private DialogButton[] defaultButtons = { DialogButton.ACCEPT };
private Object[] buttons = this.defaultButtons;
分享到:
相关推荐
本文主要探讨如何在Kettle 7.0环境下实现数据库迁移,特别是从Oracle到MySQL的迁移,同时也涵盖了对其他数据库类型的迁移支持。 Kettle,又称Pentaho Data Integration (PDI),是一款强大的ETL(提取、转换、加载)...
kettle的使用手册,及个人实现的数据增量同步,亲测可行!
本文将深入探讨如何在Kettle中实现步骤的循环执行,以满足重复处理数据的需求。 标题"Kettle实现步骤循环执行"所指的就是在Kettle的工作流设计中,如何设置和配置步骤以便于它们能够按预定条件或次数循环执行。这在...
【标题】"Kettle实现多表数据全量抽取"涉及的主要知识点是Kettle(Pentaho Data Integration,简称PDI)工具在数据处理中的应用,尤其是如何进行多表数据的同步与更新。Kettle是一款开源的数据集成工具,以其强大的...
kettle利用JavaScript实现对字符串进行MD5加密
Java调用Kettle API实现数据抽取DEMO是一个典型的ETL(提取、转换、加载)过程,其中Kettle(又称Pentaho Data Integration或KDI)是一个强大的数据集成工具,允许开发者通过图形化界面或者编程方式处理数据迁移和...
Kettle,也称为Pentaho Data Integration(PDI),是一款强大的ETL(Extract, Transform, Load)工具,用于数据整合和清洗。它以其图形化的界面和灵活的数据处理能力而受到广泛欢迎。在Kettle中,Step是数据流中的...
【Kettle实现时间戳增量同步案例】 在大数据处理与ETL(Extract, Transform, Load)工作中,Kettle(又称Pentaho Data Integration,简称PDI)是一个强大的工具,它允许用户设计、执行和调度复杂的数据转换任务。在...
本资源"KETTLE实现嵌套循环.rar+代码"提供了一个关于如何在Kettle中实现嵌套循环的具体实例。嵌套循环在数据处理中是非常常见的一种需求,特别是在处理复杂的数据逻辑时,例如当需要对一个表中的每一条记录进行多次...
本资料"Kettle分页抽取、插入实现.zip"聚焦于如何在Kettle中实现分页数据抽取和插入操作,这对于处理大量数据时尤为重要,可以避免一次性加载过多数据导致的性能问题。 首先,我们来理解什么是分页。在数据库中,...
在本场景中,我们将探讨如何使用Kettle从Oracle数据库中的两个表之间实现增量数据抽取,且这个过程并不依赖于时间戳。 首先,理解增量抽取的概念至关重要。增量抽取是从源系统中提取自上次抽取以来发生改变的新数据...
在本实例中,我们将深入探讨如何利用Kettle实现字典转换,以便将原始数据转化为标准格式。 字典映射是数据标准化的一种常见方法,其核心思想是创建一个映射关系,将源数据中的特定值与预定义的标准值进行对应。这...
在"Kettle递归循环(脚本判断)"这个主题中,我们将深入探讨如何在Kettle中实现递归循环,以及如何利用脚本判断来控制这些循环。 首先,递归循环在Kettle中通常通过工作流(Job)和转换(Transformation)的相互调用...
本篇将详细解释如何利用Kettle中的Job变量来实现循环处理,以“kettle使用job变量实现循环例子”为例进行深入探讨。 在Kettle中,Job是用于组织转换(Transformation)和控制流程的高级结构。在这个例子中,我们...
本项目"Kettle实现多参数传递并且循环加载数据.zip"显然是一个利用Kettle解决复杂业务逻辑的示例,特别关注了参数传递和数据的循环处理。以下将详细解释相关知识点。 1. **Kettle参数传递**: 在Kettle中,参数...
2. 使用 Trans 脚本实现遍历查询出的表名:由于 Kettle 变量一次只能接收一个值,因此若是要执行查询操作的表为两个或者两个以上,就无法直接使用变量来替换 ${TABLENAME}。需要一个能够存储多个表名的步骤或脚本...
本教程将详细介绍如何使用Kettle实现多表数据的全量抽取。 首先,我们要理解"全量抽取"的概念。全量抽取是指从源系统中提取所有数据,不考虑数据是否已经存在于目标系统中。这种策略适用于首次构建数据仓库或者在源...
本示例代码着重于在Kettle中实现数据验证和检查,这对于确保数据质量和准确性至关重要。 数据验证是数据管理过程中的关键步骤,其目的是确保输入的数据符合预定义的规则和标准,例如,检查数据完整性、一致性、合法...
实现一个通用的kettle消息推送,于是想到通过钉钉机器人推送消息到钉钉群组,这样就可以方便配置封装成通用的消息推送的映射子转换,实现后面作业或转换的消息提醒或者异常告警通知。已完成测试源代码分析