Your’re hot, Thermometer chart!

PRD-5337-ChartsA couple of days ago, prijip contributed a thermometer chart to Pentaho Reporting. Thank you, it’s good to see that our product is useful!

Thermometer charts are one of the many variations of a typical “Traffic light” indicator and great if you have to monitor a single KPI for critical levels. The typical chart shows you three levels of ‘hotness’ – normal levels show you everything is fine, critical levels require your attention, and above that, lets just panic.

As it is implemented, the thermometer chart is great when you need to make the indicator big and bold and hard to miss. The thermometer’s color will change according to the value level reached. And unlike the traffic-light function that changes background colors on text, this chart is an easy to interpret symbol that is intuitively understood by everyone.

The chart requires only a single value to work, but be aware that due to the nature of the charting framework in our reporting engine, it needs at least a single row of data to receive at least one “items-advanced” processing event. Even if the value comes from parameter or calculation, you have to have at least one row of data.

If you have more than one row of data per grouping, the chart collector will aggregate all values together as one big sum.

The chart itself almost self-explaining, and is quite easy to configure: provide the ranges, provide proper colours (in case you don’t like the off-the-shelf green, yellow and red range) and some labels, and voilà, a thermometer.

PRD-5337-ChartEditor

Personally, I don’t find the limited selection of units of just Kelvin, Celsius and Fahrenheit thrilling. So unless you are monitoring temperature, disable them and the thermometer is rather suitable for all sorts of monitoring of value levels.

Needless to say: If we have not covered your favourite property – like all charts, this chart type has the option to customize it via scripts.

The thermometer chart and many more goodies will be part of the upcoming Pentaho 5.3 release.

Use code to replace a datasource in a report

I’m not exactly a social media user, so I am rather surprised that every now and then I get a question via these channels.

There are two ways to change a PRPT file. One, the ugly way, is to crack open the ZIP structure and to mess with the XML files contained in there. I won’t support this atrocity with documentation. The second way, the good way, is to use the reporting API to do your changes. It is clean, and it will ensure that your report will be valid. And best of all – its unit testable.

This will be a code-heavy post, so lets talk about the setup first, to keep the main body simple.

I assume you have a project set up that has all the reporting libraries ready and that contains all jars for every data-source you are using in your report. Normally that means you are bootstrapping from the SDK’s “sample-use-full” module.

Now lets create a base harness for our task. A simple Java-class with a “public static void main” method will do.


public static void main(String[] args) throws ResourceException, ContentIOException, BundleWriterException, IOException {
  processReport(args[0], args[1]);
}

The processReport method will take two parameter. First, the source file, which should be a valid file name pointing to a PRPT file, and second a target file name, where the processed report will be written to. I personally do not like overwriting the source, it makes it rather hard from recovering from errors.

Lets add the “processReport” method next. I still consider this boiler plate code, as all it does is to parse the report, hand of the MasterReport object to the actual method that does all the work, and then write the modified MasterReport into a PRPT file.


private static void processReport(String sourceText, String targetText)
  throws ResourceException, IOException, BundleWriterException, ContentIOException {

  File sourceFile = new File(sourceText);
  MasterReport report = (MasterReport) new ResourceManager().createDirectly(sourceFile, MasterReport.class).getResource();

  MasterReport processedReport = manipulateReport(report);

  BundleWriter.writeReportToZipFile(processedReport, new File(targetText));
}

Again, the code should be rather self-explaining. The first two lines parse the report, next we hand it off to some other method to manipulate the report, and whatever we get back will be written out into a new PRPT file. I omitted the proper exception handling to make the code more readable – if it crashes, it will burn, wild but beautiful.

Now finally, the meat. Manipulating reports. First, something simple: Lets not do anything at all, lets just return the report. This effectively copies the report from the source to the target file.


private static MasterReport manipulateReport(MasterReport report) {
  return report;
}

Now, lets modify some data-sources.
First, we need more boiler-plate code.

Data-Factories are stored on a report. A master-report can have sub-reports, which itself can have data-factories defined. Of course, sub-reports can have other sub-reports, which have their own data-factories and so on.

A report can contain multiple data-factories by using a “CompoundDataFactory”. Reports created with PRD always use a compound-factory – it makes the code a lot easier and adds almost no overhead.

Lets expand our “manipulateReport” method a bit.


  private static MasterReport manipulateReport(MasterReport report) {
    new DataSourceStructureVisitor().inspect(report);
    return report;
  }

  private static class DataSourceStructureVisitor extends AbstractStructureVisitor {
    @Override
    protected void inspect(AbstractReportDefinition reportDefinition) {

      processAllDataSources(reportDefinition);
      processSingleDataSource(reportDefinition, "query");
      super.inspect(reportDefinition);
    }

    private void processSingleDataSource(AbstractReportDefinition reportDefinition, String query) {
      CompoundDataFactory dataFactory = CompoundDataFactory.normalize(reportDefinition.getDataFactory());
      DataFactory dataFactoryForQuery = dataFactory.getDataFactoryForQuery(query);
      if (dataFactoryForQuery != null) {
        int idx = dataFactory.indexOfByReference(dataFactory);
        dataFactory.set(idx, handleDataSource(reportDefinition, dataFactory));
      }
      reportDefinition.setDataFactory(dataFactory);
    }


    private void processAllDataSources(AbstractReportDefinition reportDefinition) {
      CompoundDataFactory dataFactory = CompoundDataFactory.normalize(reportDefinition.getDataFactory());
      final int size = dataFactory.size();
      for (int i = 0; i < size; i++)
      {
        dataFactory.set(i, handleDataSource(reportDefinition, dataFactory.getReference(i)));
      }
      reportDefinition.setDataFactory(dataFactory);
    }
    
    private DataFactory handleDataSource(AbstractReportDefinition reportDefinition, DataFactory dataFactory) {
      return dataFactory;
    }
  }

To deal with the complexities of nested subreports, we use a "StructureVisitor" to traverse the report definition for us. On each report we encounter (the master-report and all sub-reports) we now check for data-factories we are interested in.

There are two ways to retrieve a data-factory shown here:
(1) processAllDataSources - if you want to modify them all or don't know which data-factory is your target. This will iterate over all data-factories stored on that particular report and let you modify it in the "handleDataSource" method.
(2) processSingleDataSource - this method expects the name of a query and will try to locate the first data-factory that claims to be able to handle that query. If your report has many data-factories but you want to modify only a particular one, this method is yours.

Now, enough of standard code - lets solve a real problem.

I want to replace the JNDI definition for reports that have a local file-based HSQL data-source with the proper JNDI data-source. We all know, if you have SQL data-sources and don't want to change your reports whenever your database server changes, you have to use JNDI connections. But what we know is not always what we do, right? :)

So lets replace the "handleDataSource" method with one that finds all SQL data-factories. If the data-factory uses the local sample-data, then replaces them with the JNDI reference.


  private DataFactory handleDataSource(AbstractReportDefinition reportDefinition, DataFactory dataFactory) {
    // do whatever you want here.
    if (dataFactory instanceof SimpleSQLReportDataFactory) {
      SimpleSQLReportDataFactory sdf = (SimpleSQLReportDataFactory) dataFactory;
      if (isLocalSampleData(sdf)) {
        JndiConnectionProvider connectionProvider = new JndiConnectionProvider();
        connectionProvider.setConnectionPath("SampleData");
        sdf.setConnectionProvider(connectionProvider);
      }
    }
    return dataFactory;
  }

  private boolean isLocalSampleData(SimpleSQLReportDataFactory sdf) {
    ConnectionProvider cp = sdf.getConnectionProvider();
    if (cp instanceof DriverConnectionProvider) {
      DriverConnectionProvider jcp = (DriverConnectionProvider) cp;
      if ("org.hsqldb.jdbcDriver".equals(jcp.getDriver()) &&
              "jdbc:hsqldb:file:./sql/sampledata".equalsIgnoreCase(jcp.getUrl())) {
        return true;
      }
    }

    return false;
  }
 

Run this for all your reports in a directory, and the reports will be patches to never ever use local data-sources again.

By overriding some of the other methods of the AbstractStructureVisitor, a report visitor can easily change report-elements, add expressions or simply report on used features.

To see how a report can edit elements, have a look at the code for the report-pre-processor from the SDK. A report-pre-processor uses a similar approach to inspect and modify to tune reports at runtime.

A good set of samples on how to just inspect and report on the use of certain features, including the use of fields, have a look at the report-designer's inspections. These little helpers also use the AbstractStructureVisitor system to check each element and collect data which they then report to the user.

Translating Pentaho Reporting in 5 not so easy steps

I recently was asked on Twitter how Pentaho Reporting can be translated. Translating our software is sadly not as easy as I’d wish it to be. Prepare for a larger project.

On the positive side of it: We use standard Java methods to provide the translations, so it’s not overly arcane and tools exist to assist with the translation process.

On the negative side: The translations are stored using the standard Java methods. That means they are held in various properties files within the source code and are tedious to locate. And if you are not a developer, wrapping them up into a ZIP file can be an equally tedious task.

So lets cut through it.

The Guide to translating Pentaho Reporting and the Report Designer

Translation basics

To translate Pentaho Reporting, first you have to download the latest source code from GitHub.

Translatable resources are stored in a set of text-files that follow a similar naming pattern. Each file begins with a common name (“messages”), an optional suffix specifying language and location, and finally a file type (always “.properties”).

In the Pentaho Reporting project, we use the common name “messages” for all bundles. A message bundle file that has no language or location suffix is called the base resource. In Pentaho Reporting, this resource contains the US-English texts.

All files contain the text as key-value pairs in the format:

translation.key=My User Interface Text

To provide translations for a new language, all you need to do is to copy the base file (messages.properties) to the name that matches your target language and start translating the values (everything after the “=”). The language and optional locale are specified as two letter codes. For instance for Portugese,  the country code is be “pt”, thus the suffix is “_pt”, and the full filename would be “messages_pt.properties”. For the Brasilian dialect of Portugese the suffix would be pt_BR, and thus the full name would be “messages_pt_BR.properties”.

If there is already a translation file for your language, all you need to do is to add the missing keys to the file.

The file must be saved with an ISO-8859-1 encoding. Any character that cannot be expressed in that encoding must be written as unicode-escape sequence. See this Wikipedia article on properties files for an easy explanation.

Tip: When translating these files, it can be helpful to use a Java development environment for the task. These tools have plugins that I recommend “IntelliJ IDEA” for this task. If a properties file has more than one translation (using the naming rules lined out above), it presents the contents of all languages next to each other, making it easy to cross-reference the translation with the English original.

The reporting project contains quite a few bundles, to put it mildly.

Translating user interface elements


./designer/datasource-editor-cda/source/org/pentaho/reporting/ui/datasources/cda/messages.properties
./designer/datasource-editor-jdbc/source/org/pentaho/reporting/ui/datasources/jdbc/messages.properties
./designer/datasource-editor-jdbc/source/org/pentaho/reporting/ui/datasources/jdbc/messages_ja.properties
./designer/datasource-editor-kettle/source/org/pentaho/reporting/ui/datasources/kettle/messages.properties
./designer/datasource-editor-kettle/source/org/pentaho/reporting/ui/datasources/kettle/messages_ja.properties
./designer/datasource-editor-kettle/source/org/pentaho/reporting/ui/datasources/kettle/parameter/messages.properties
./designer/datasource-editor-mondrian/source/org/pentaho/reporting/ui/datasources/mondrian/messages.properties
./designer/datasource-editor-mondrian/source/org/pentaho/reporting/ui/datasources/mondrian/messages_ja.properties
./designer/datasource-editor-olap4j/source/org/pentaho/reporting/ui/datasources/olap4j/messages.properties
./designer/datasource-editor-pmd/source/org/pentaho/reporting/ui/datasources/pmd/messages.properties
./designer/datasource-editor-pmd/source/org/pentaho/reporting/ui/datasources/pmd/messages_ja.properties
./designer/datasource-editor-reflection/source/org/pentaho/reporting/ui/datasources/reflection/messages.properties
./designer/datasource-editor-reflection/source/org/pentaho/reporting/ui/datasources/reflection/messages_ja.properties
./designer/datasource-editor-scriptable/source/org/pentaho/reporting/ui/datasources/scriptable/messages.properties
./designer/datasource-editor-scriptable/source/org/pentaho/reporting/ui/datasources/scriptable/messages_ja.properties
./designer/datasource-editor-table/source/org/pentaho/reporting/ui/datasources/sequence/messages.properties
./designer/datasource-editor-table/source/org/pentaho/reporting/ui/datasources/table/messages.properties
./designer/datasource-editor-table/source/org/pentaho/reporting/ui/datasources/table/messages_ja.properties
./designer/datasource-editor-xpath/source/org/pentaho/reporting/ui/datasources/xpath/messages.properties
./designer/datasource-editor-xpath/source/org/pentaho/reporting/ui/datasources/xpath/messages_ja.properties
./designer/report-designer/src/org/pentaho/reporting/designer/core/actions/messages/messages.properties
./designer/report-designer/src/org/pentaho/reporting/designer/core/actions/messages/messages_ja.properties
./designer/report-designer/src/org/pentaho/reporting/designer/core/editor/expressions/messages.properties
./designer/report-designer/src/org/pentaho/reporting/designer/core/editor/migration/messages.properties
./designer/report-designer/src/org/pentaho/reporting/designer/core/editor/parameters/messages/messages.properties
./designer/report-designer/src/org/pentaho/reporting/designer/core/editor/parameters/messages/messages_ja.properties
./designer/report-designer/src/org/pentaho/reporting/designer/core/editor/styles/messages.properties
./designer/report-designer/src/org/pentaho/reporting/designer/core/editor/styles/messages_ja.properties
./designer/report-designer/src/org/pentaho/reporting/designer/core/messages/messages.properties
./designer/report-designer/src/org/pentaho/reporting/designer/core/messages/messages_ja.properties
./designer/report-designer/src/org/pentaho/reporting/designer/core/settings/messages/messages.properties
./designer/report-designer/src/org/pentaho/reporting/designer/core/settings/messages/messages_ja.properties
./designer/report-designer/src/org/pentaho/reporting/designer/core/util/messages.properties
./designer/report-designer/src/org/pentaho/reporting/designer/core/versionchecker/messages.properties
./designer/report-designer/src/org/pentaho/reporting/designer/core/versionchecker/messages_ja.properties
./designer/report-designer-extension-connectioneditor/src/org/pentaho/reporting/designer/extensions/connectioneditor/messages.properties
./designer/report-designer-extension-legacy-charts/src/org/pentaho/reporting/designer/extensions/legacycharts/messages/messages.properties
./designer/report-designer-extension-legacy-charts/src/org/pentaho/reporting/designer/extensions/legacycharts/messages/messages_ja.properties
./designer/report-designer-extension-pentaho/source/org/pentaho/reporting/designer/extensions/pentaho/repository/messages.properties
./designer/report-designer-extension-pentaho/source/org/pentaho/reporting/designer/extensions/pentaho/repository/messages_ja.properties
./designer/report-designer-extension-toc/source/org/pentaho/reporting/designer/extensions/toc/messages.properties
./designer/report-designer-extension-toc/source/org/pentaho/reporting/designer/extensions/toc/messages_ja.properties
./designer/report-designer-extension-wizard/source/org/pentaho/reporting/designer/extensions/wizard/messages.properties
./designer/report-designer-extension-wizard/source/org/pentaho/reporting/designer/extensions/wizard/messages_ja.properties
./designer/wizard-xul/source/org/pentaho/reporting/engine/classic/wizard/ui/xul/messages.properties
./designer/wizard-xul/source/org/pentaho/reporting/engine/classic/wizard/ui/xul/messages_ja.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/designtime/datafactory/editor/ui/messages.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/designtime/datafactory/messages.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/base/messages/messages.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/base/messages/messages_cn.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/base/messages/messages_de.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/base/messages/messages_es.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/base/messages/messages_fi.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/base/messages/messages_fr.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/base/messages/messages_it.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/base/messages/messages_ja.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/base/messages/messages_nl.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/base/messages/messages_pl.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/base/messages/messages_pt.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/base/messages/messages_zh_CN.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/common/messages/messages.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/common/messages/messages_fi.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/common/messages/messages_ja.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/commonswing/messages/messages.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/commonswing/messages/messages_de.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/commonswing/messages/messages_fi.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/commonswing/messages/messages_fr.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/commonswing/messages/messages_ja.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/csv/messages/messages.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/csv/messages/messages_ca.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/csv/messages/messages_cs_CZ.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/csv/messages/messages_de.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/csv/messages/messages_el.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/csv/messages/messages_fi.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/csv/messages/messages_fr.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/csv/messages/messages_hu.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/csv/messages/messages_ja.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/csv/messages/messages_nl.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/csv/messages/messages_pl.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/csv/messages/messages_pt_BR.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/csv/messages/messages_ru.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/csv/messages/messages_si.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/csv/messages/messages_sv.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/html/messages/messages.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/html/messages/messages_ca.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/html/messages/messages_cs_CZ.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/html/messages/messages_de.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/html/messages/messages_el.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/html/messages/messages_fi.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/html/messages/messages_fr.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/html/messages/messages_hu.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/html/messages/messages_ja.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/html/messages/messages_nl.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/html/messages/messages_pl.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/html/messages/messages_pt_BR.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/html/messages/messages_ru.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/html/messages/messages_si.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/html/messages/messages_sv.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/pdf/messages/messages.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/pdf/messages/messages_ca.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/pdf/messages/messages_cs_CZ.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/pdf/messages/messages_de.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/pdf/messages/messages_el.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/pdf/messages/messages_es.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/pdf/messages/messages_fi.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/pdf/messages/messages_fr.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/pdf/messages/messages_hu.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/pdf/messages/messages_ja.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/pdf/messages/messages_nl.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/pdf/messages/messages_pl.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/pdf/messages/messages_pt_BR.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/pdf/messages/messages_ru.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/pdf/messages/messages_si.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/pdf/messages/messages_sv.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/plaintext/messages/messages.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/plaintext/messages/messages_ca.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/plaintext/messages/messages_cs_CZ.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/plaintext/messages/messages_de.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/plaintext/messages/messages_el.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/plaintext/messages/messages_fi.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/plaintext/messages/messages_fr.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/plaintext/messages/messages_hu.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/plaintext/messages/messages_ja.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/plaintext/messages/messages_nl.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/plaintext/messages/messages_pl.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/plaintext/messages/messages_pt_BR.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/plaintext/messages/messages_ru.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/plaintext/messages/messages_si.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/plaintext/messages/messages_sv.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/print/messages/messages.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/print/messages/messages_ca.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/print/messages/messages_cs_CZ.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/print/messages/messages_de.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/print/messages/messages_el.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/print/messages/messages_es.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/print/messages/messages_fi.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/print/messages/messages_fr.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/print/messages/messages_hu.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/print/messages/messages_ja.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/print/messages/messages_nl.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/print/messages/messages_pl.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/print/messages/messages_pt_BR.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/print/messages/messages_ru.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/print/messages/messages_si.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/print/messages/messages_sv.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/rtf/messages/messages.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/rtf/messages/messages_cs_CZ.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/rtf/messages/messages_de.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/rtf/messages/messages_el.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/rtf/messages/messages_fi.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/rtf/messages/messages_fr.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/rtf/messages/messages_ja.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/xls/messages/messages.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/xls/messages/messages_ca.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/xls/messages/messages_cs_CZ.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/xls/messages/messages_de.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/xls/messages/messages_el.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/xls/messages/messages_fi.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/xls/messages/messages_fr.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/xls/messages/messages_hu.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/xls/messages/messages_ja.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/xls/messages/messages_nl.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/xls/messages/messages_pl.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/xls/messages/messages_pt_BR.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/xls/messages/messages_ru.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/xls/messages/messages_si.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/gui/xls/messages/messages_sv.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/parameters/messages.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/parameters/messages_ja.properties
./engine/extensions/source/org/pentaho/reporting/engine/classic/extensions/modules/connections/messages.properties
./engine/extensions-charting/source/org/pentaho/reporting/engine/classic/extensions/charting/messages.properties
./engine/extensions-drilldown/source/org/pentaho/reporting/engine/classic/extensions/drilldown/messages.properties
./libraries/configuration-editor/source/org/pentaho/reporting/tools/configeditor/messages.properties
./libraries/configuration-editor/source/org/pentaho/reporting/tools/configeditor/messages_ca.properties
./libraries/configuration-editor/source/org/pentaho/reporting/tools/configeditor/messages_de.properties
./libraries/configuration-editor/source/org/pentaho/reporting/tools/configeditor/messages_fi.properties
./libraries/configuration-editor/source/org/pentaho/reporting/tools/configeditor/messages_fr.properties
./libraries/configuration-editor/source/org/pentaho/reporting/tools/configeditor/messages_ja.properties
./libraries/configuration-editor/source/org/pentaho/reporting/tools/configeditor/messages_nl.properties
./libraries/configuration-editor/source/org/pentaho/reporting/tools/configeditor/messages_pt_BR.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/messages.properties
./libraries/libformula-ui/source/org/pentaho/openformula/ui/messages.properties
./libraries/libformula-ui/source/org/pentaho/openformula/ui/table/messages.properties
./libraries/libswing/source/org/pentaho/reporting/libraries/designtime/swing/colorchooser/messages.properties
./libraries/libswing/source/org/pentaho/reporting/libraries/designtime/swing/messages.properties

Translating element attributes and styles

Like the user interface elements, attribute and style names and groupings that are shown to the user can be translated as well.


./engine/core/source/org/pentaho/reporting/engine/classic/core/metadata/messages.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/misc/survey/metadata.properties
./engine/extensions/source/org/pentaho/reporting/engine/classic/extensions/modules/sbarcodes/metadata.properties
./engine/extensions/source/org/pentaho/reporting/engine/classic/extensions/modules/sparklines/metadata.properties
./engine/extensions-reportdesigner-parser/source/org/pentaho/reporting/engine/classic/extensions/parsers/reportdesigner/metadata.properties
./engine/extensions-toc/source/org/pentaho/reporting/engine/classic/extensions/toc/metadata.properties
./engine/legacy-charts/source/org/pentaho/reporting/engine/classic/extensions/legacy/charts/metadata.properties
./engine/wizard-core/source/org/pentaho/reporting/engine/classic/wizard/metadata.properties

For metadata, only keys ending with “display-name”, “text”, “deprecated” and “description” need to be translated.

Translating Data Sources, Expressions and Functions

The translations for properties and menu entries related to expressions and data-sources is held in bundles as well. Each function, expression and data-source type has their own bundle file.


./engine/core/source/org/pentaho/reporting/engine/classic/core/cache/CachingDataFactoryBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/CompoundDataFactoryBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/DefaultReportPreProcessorBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/ExternalDataFactoryBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/AverageExpressionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/bool/AndExpressionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/bool/IsEmptyDataExpressionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/bool/OrExpressionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/ColumnAverageExpressionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/ColumnDifferenceExpressionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/ColumnDivisionExpressionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/ColumnMaximumExpressionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/ColumnMinimumExpressionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/ColumnMultiplyExpressionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/ColumnSumExpressionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/CompareFieldsExpressionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/ConditionalItemSumFunctionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/ConvertToDateExpressionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/ConvertToNumberExpressionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/CountDistinctFunctionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/CreateGroupAnchorsFunctionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/CreateHyperLinksFunctionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/date/CompareDateExpressionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/date/DateExpressionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/date/DateSpanExpressionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/date/VariableDateExpressionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/DateCutExpressionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/ElementColorFunctionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/ElementTrafficLightFunctionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/ElementVisibilityFunctionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/ElementVisibilitySwitchFunctionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/EventMonitorFunctionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/FormulaExpressionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/FormulaFunctionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/GroupCountFunctionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/HideElementByNameFunctionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/HideElementIfDataAvailableExpressionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/HideNullValuesFunctionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/HidePageBandForTableExportFunctionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/IsEmptyExpressionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/IsNullExpressionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/ItemAvgFunctionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/ItemColumnQuotientExpressionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/ItemCountFunctionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/ItemHideFunctionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/ItemMaxFunctionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/ItemMinFunctionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/ItemPercentageFunctionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/ItemSumFunctionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/NegativeNumberPaintChangeFunctionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/numeric/CompareNumberExpressionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/numeric/IsNegativeExpressionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/numeric/IsPositiveExpressionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/PageFunctionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/PageItemCountFunctionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/PageItemSumFunctionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/PageOfPagesFunctionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/PageTotalFunctionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/PaintComponentFunctionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/PaintDynamicComponentFunctionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/PercentageExpressionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/RowBandingFunctionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/ShowElementByNameFunctionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/ShowElementIfDataAvailableExpressionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/strings/CapitalizeStringExpressionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/strings/CompareStringExpressionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/strings/MapIndirectExpressionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/strings/MapStringExpressionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/strings/MessageFormatExpressionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/strings/ResourceBundleLookupExpressionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/strings/ResourceMesssageFormatExpressionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/strings/SubStringExpressionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/strings/TokenizeStringExpressionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/strings/ToLowerCaseStringExpressionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/strings/ToUpperCaseStringExpressionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/strings/URLEncodeExpressionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/sys/AttributeExpressionsEvaluatorBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/sys/CellFormatFunctionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/sys/CrosstabColumnSequenceFunctionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/sys/GetDataRowValueExpressionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/sys/IsExportTypeExpressionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/sys/MetaDataStyleEvaluatorBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/sys/SheetNameFunctionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/sys/SingleValueQueryFunctionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/sys/StyleExpressionsEvaluatorBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/sys/StyleResolvingEvaluatorBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/sys/WizardItemHideFunctionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/TextFormatExpressionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/TotalCalculationFunctionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/TotalGroupCountFunctionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/TotalGroupSumFunctionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/TotalGroupSumQuotientFunctionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/TotalGroupSumQuotientPercentFunctionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/TotalItemCountFunctionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/TotalItemMaxFunctionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/TotalItemMinFunctionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/TotalPageItemCountFunctionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/TotalPageSumFunctionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/TriggerPageFooterFunctionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/misc/beanshell/BSHExpressionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/misc/bsf/BSFExpressionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/misc/bsf/BSFReportPreProcessorBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/misc/datafactory/NamedStaticDataFactoryBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/misc/datafactory/sequence/ArraySequenceBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/misc/datafactory/sequence/BooleanSequenceBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/misc/datafactory/sequence/CrosstabTestSequenceBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/misc/datafactory/sequence/NumberSequenceBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/misc/datafactory/sequence/PerformanceTestSequenceBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/misc/datafactory/sequence/PrinterNamesSequenceBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/misc/datafactory/sequence/SequenceDataFactoryBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/misc/datafactory/sql/SimpleSQLReportDataFactoryBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/misc/datafactory/sql/SQLReportDataFactoryBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/misc/datafactory/StaticDataFactoryBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/misc/survey/SurveyScaleExpressionBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/output/fast/validator/ReportDynamicStyleAnalyzerPreProcessorBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/output/pageable/graphics/Graphics2DReportProcessTaskBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/output/pageable/graphics/PngReportProcessTaskBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/output/pageable/pdf/PdfReportProcessTaskBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/output/pageable/plaintext/PlainTextReportProcessTaskBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/output/pageable/xml/PageableXmlReportProcessTaskBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/output/table/csv/FlowCSVReportProcessTaskBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/output/table/csv/StreamCSVReportProcessTaskBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/output/table/html/FlowHtmlReportProcessTaskBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/output/table/html/PageableHtmlReportProcessTaskBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/output/table/html/StreamHtmlReportProcessTaskBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/output/table/html/ZipHtmlReportProcessTaskBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/output/table/rtf/FlowRTFReportProcessTaskBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/output/table/rtf/StreamRTFReportProcessTaskBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/output/table/xls/FlowExcelReportProcessTaskBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/output/table/xls/FlowXExcelReportProcessTaskBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/output/table/xls/PageableExcelReportProcessTaskBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/output/table/xls/PageableXExcelReportProcessTaskBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/output/table/xls/StreamExcelReportProcessTaskBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/output/table/xls/StreamXExcelReportProcessTaskBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/modules/output/table/xml/TableXmlReportProcessTaskBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/sorting/SortingDataFactoryBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/sorting/SortOrderReportPreProcessorBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/states/CascadingDataFactoryBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/states/DesignTimeDataFactoryBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/states/EmptyDataFactoryBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/TableDataFactoryBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/wizard/AggregateFieldPreProcessorBundle.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/wizard/RelationalAutoGeneratorPreProcessorBundle.properties
./engine/demo/source/org/pentaho/reporting/engine/classic/demo/ancient/demo/cards/SelectCardFunctionBundle.properties
./engine/demo/source/org/pentaho/reporting/engine/classic/demo/ancient/demo/conditionalgroup/NettoProfitFunctionBundle.properties
./engine/demo/source/org/pentaho/reporting/engine/classic/demo/ancient/demo/conditionalgroup/TriggerNestedGroupFunctionBundle.properties
./engine/demo/source/org/pentaho/reporting/engine/classic/demo/ancient/demo/conditionalgroup/TriggerTypeFunctionBundle.properties
./engine/demo/source/org/pentaho/reporting/engine/classic/demo/ancient/demo/functions/ImageRenderFunctionBundle.properties
./engine/demo/source/org/pentaho/reporting/engine/classic/demo/ancient/demo/reportfooter/TriggerComplexPageFooterFunctionBundle.properties
./engine/extensions/source/org/pentaho/reporting/engine/classic/extensions/modules/sbarcodes/SimpleBarcodesExpressionBundle.properties
./engine/extensions/source/org/pentaho/reporting/engine/classic/extensions/modules/sparklines/SparklineExpressionBundle.properties
./engine/extensions-cda/source/org/pentaho/reporting/engine/classic/extensions/datasources/cda/CdaDataFactoryBundle.properties
./engine/extensions-kettle/source/org/pentaho/reporting/engine/classic/extensions/datasources/kettle/KettleDataFactoryBundle.properties
./engine/extensions-mondrian/source/org/pentaho/reporting/engine/classic/extensions/datasources/mondrian/BandedMDXDataFactoryBundle.properties
./engine/extensions-mondrian/source/org/pentaho/reporting/engine/classic/extensions/datasources/mondrian/DenormalizedMDXDataFactoryBundle.properties
./engine/extensions-mondrian/source/org/pentaho/reporting/engine/classic/extensions/datasources/mondrian/LegacyBandedMDXDataFactoryBundle.properties
./engine/extensions-mondrian/source/org/pentaho/reporting/engine/classic/extensions/datasources/mondrian/SimpleBandedMDXDataFactoryBundle.properties
./engine/extensions-mondrian/source/org/pentaho/reporting/engine/classic/extensions/datasources/mondrian/SimpleDenormalizedMDXDataFactoryBundle.properties
./engine/extensions-mondrian/source/org/pentaho/reporting/engine/classic/extensions/datasources/mondrian/SimpleLegacyBandedMDXDataFactoryBundle.properties
./engine/extensions-olap4j/source/org/pentaho/reporting/engine/classic/extensions/datasources/olap4j/BandedMDXDataFactoryBundle.properties
./engine/extensions-olap4j/source/org/pentaho/reporting/engine/classic/extensions/datasources/olap4j/DenormalizedMDXDataFactoryBundle.properties
./engine/extensions-olap4j/source/org/pentaho/reporting/engine/classic/extensions/datasources/olap4j/LegacyBandedMDXDataFactoryBundle.properties
./engine/extensions-olap4j/source/org/pentaho/reporting/engine/classic/extensions/datasources/olap4j/SimpleBandedMDXDataFactoryBundle.properties
./engine/extensions-olap4j/source/org/pentaho/reporting/engine/classic/extensions/datasources/olap4j/SimpleDenormalizedMDXDataFactoryBundle.properties
./engine/extensions-olap4j/source/org/pentaho/reporting/engine/classic/extensions/datasources/olap4j/SimpleLegacyBandedMDXDataFactoryBundle.properties
./engine/extensions-openerp/src/org/pentaho/reporting/engine/classic/extensions/datasources/openerp/OpenERPDataFactoryBundle.properties
./engine/extensions-pentaho-metadata/source/org/pentaho/reporting/engine/classic/extensions/datasources/pmd/PmdDataFactoryBundle.properties
./engine/extensions-pentaho-metadata/source/org/pentaho/reporting/engine/classic/extensions/datasources/pmd/SimplePmdDataFactoryBundle.properties
./engine/extensions-sampledata/source/org/pentaho/reporting/engine/classic/extensions/datasources/sampledata/SampleDataFactoryBundle.properties
./engine/extensions-scripting/source/org/pentaho/reporting/engine/classic/extensions/datasources/scriptable/ScriptableDataFactoryBundle.properties
./engine/extensions-scripting/source/org/pentaho/reporting/engine/classic/extensions/modules/rhino/RhinoExpressionBundle.properties
./engine/extensions-toc/source/org/pentaho/reporting/engine/classic/extensions/toc/DataPassingDataFactoryBundle.properties
./engine/extensions-toc/source/org/pentaho/reporting/engine/classic/extensions/toc/IndexDataGeneratorFunctionBundle.properties
./engine/extensions-toc/source/org/pentaho/reporting/engine/classic/extensions/toc/IndexNumberGeneratorFunctionBundle.properties
./engine/extensions-toc/source/org/pentaho/reporting/engine/classic/extensions/toc/IndexTextGeneratorFunctionBundle.properties
./engine/extensions-toc/source/org/pentaho/reporting/engine/classic/extensions/toc/TocDataGeneratorFunctionBundle.properties
./engine/extensions-toc/source/org/pentaho/reporting/engine/classic/extensions/toc/TocReportPreProcessorBundle.properties
./engine/extensions-xpath/source/org/pentaho/reporting/engine/classic/extensions/datasources/xpath/XPathDataFactoryBundle.properties
./engine/legacy-charts/source/org/pentaho/plugin/jfreereport/reportcharts/AreaChartExpressionBundle.properties
./engine/legacy-charts/source/org/pentaho/plugin/jfreereport/reportcharts/BarChartExpressionBundle.properties
./engine/legacy-charts/source/org/pentaho/plugin/jfreereport/reportcharts/BarLineChartExpressionBundle.properties
./engine/legacy-charts/source/org/pentaho/plugin/jfreereport/reportcharts/BubbleChartExpressionBundle.properties
./engine/legacy-charts/source/org/pentaho/plugin/jfreereport/reportcharts/CategorySetCollectorFunctionBundle.properties
./engine/legacy-charts/source/org/pentaho/plugin/jfreereport/reportcharts/collectors/CategorySetDataCollectorBundle.properties
./engine/legacy-charts/source/org/pentaho/plugin/jfreereport/reportcharts/collectors/IntervalXYSeriesCollectorBundle.properties
./engine/legacy-charts/source/org/pentaho/plugin/jfreereport/reportcharts/collectors/PieDataSetCollectorBundle.properties
./engine/legacy-charts/source/org/pentaho/plugin/jfreereport/reportcharts/collectors/PivotCategorySetCollectorBundle.properties
./engine/legacy-charts/source/org/pentaho/plugin/jfreereport/reportcharts/collectors/TimeSeriesCollectorBundle.properties
./engine/legacy-charts/source/org/pentaho/plugin/jfreereport/reportcharts/collectors/XYSeriesCollectorBundle.properties
./engine/legacy-charts/source/org/pentaho/plugin/jfreereport/reportcharts/collectors/XYZSeriesCollectorBundle.properties
./engine/legacy-charts/source/org/pentaho/plugin/jfreereport/reportcharts/ExtendedXYLineChartExpressionBundle.properties
./engine/legacy-charts/source/org/pentaho/plugin/jfreereport/reportcharts/LineChartExpressionBundle.properties
./engine/legacy-charts/source/org/pentaho/plugin/jfreereport/reportcharts/MultiPieChartExpressionBundle.properties
./engine/legacy-charts/source/org/pentaho/plugin/jfreereport/reportcharts/PieChartExpressionBundle.properties
./engine/legacy-charts/source/org/pentaho/plugin/jfreereport/reportcharts/PieSetCollectorFunctionBundle.properties
./engine/legacy-charts/source/org/pentaho/plugin/jfreereport/reportcharts/PivotCategorySetCollectorFunctionBundle.properties
./engine/legacy-charts/source/org/pentaho/plugin/jfreereport/reportcharts/RadarChartExpressionBundle.properties
./engine/legacy-charts/source/org/pentaho/plugin/jfreereport/reportcharts/RingChartExpressionBundle.properties
./engine/legacy-charts/source/org/pentaho/plugin/jfreereport/reportcharts/ScatterPlotChartExpressionBundle.properties
./engine/legacy-charts/source/org/pentaho/plugin/jfreereport/reportcharts/TimeSeriesCollectorFunctionBundle.properties
./engine/legacy-charts/source/org/pentaho/plugin/jfreereport/reportcharts/WaterfallChartExpressionsBundle.properties
./engine/legacy-charts/source/org/pentaho/plugin/jfreereport/reportcharts/XYAreaChartExpressionBundle.properties
./engine/legacy-charts/source/org/pentaho/plugin/jfreereport/reportcharts/XYAreaLineChartExpressionBundle.properties
./engine/legacy-charts/source/org/pentaho/plugin/jfreereport/reportcharts/XYBarChartExpressionBundle.properties
./engine/legacy-charts/source/org/pentaho/plugin/jfreereport/reportcharts/XYLineChartExpressionBundle.properties
./engine/legacy-charts/source/org/pentaho/plugin/jfreereport/reportcharts/XYSeriesCollectorFunctionBundle.properties
./engine/legacy-charts/source/org/pentaho/plugin/jfreereport/reportcharts/XYZSeriesCollectorFunctionBundle.properties
./engine/legacy-charts/source/org/pentaho/reporting/engine/classic/extensions/legacy/charts/LegacyChartPreProcessorBundle.properties
./engine/legacy-functions/source/org/pentaho/jfreereport/legacy/ColumnAverageExpressionBundle.properties
./engine/legacy-functions/source/org/pentaho/jfreereport/legacy/ColumnDifferenceExpressionBundle.properties
./engine/legacy-functions/source/org/pentaho/jfreereport/legacy/ColumnDivisionExpressionBundle.properties
./engine/legacy-functions/source/org/pentaho/jfreereport/legacy/ColumnMultiplyExpressionBundle.properties
./engine/legacy-functions/source/org/pentaho/jfreereport/legacy/ColumnSumExpressionBundle.properties
./engine/legacy-functions/source/org/pentaho/jfreereport/legacy/GetCurrentDateFunctionBundle.properties
./engine/legacy-functions/source/org/pentaho/jfreereport/legacy/TimeDiffAndFormatFunctionBundle.properties
./engine/legacy-functions/source/org/pentaho/jfreereport/legacy/TimeDiffFormatFunctionBundle.properties
./engine/legacy-functions/source/org/pentaho/jfreereport/legacy/TimeDiffFunctionBundle.properties
./engine/legacy-functions/source/org/pentaho/jfreereport/legacy/XYDataSetCollectorFunctionBundle.properties
./engine/wizard-core/source/org/pentaho/reporting/engine/classic/wizard/WizardOverrideFormattingFunctionBundle.properties
./engine/wizard-core/source/org/pentaho/reporting/engine/classic/wizard/WizardProcessorBundle.properties

Translating Formula Functions

And last but not least, the text shown for functions in the formula editor can be translated as well. Each bundle contains the translation for a single formula function.


./engine/core/source/org/pentaho/reporting/engine/classic/core/function/formula/DashboardMode-Function.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/formula/DocumentMetaData-Function.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/formula/EngineeringNotation-Function.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/formula/Env-Function.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/formula/ExportType-Function.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/formula/IsEmptyData-Function.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/formula/IsExportType-Function.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/formula/MetaData-Function.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/formula/MParameterText-Function.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/formula/MultiValueQuery-Function.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/formula/ParameterText-Function.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/formula/QuoteText-Function.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/formula/RowCount-Function.properties
./engine/core/source/org/pentaho/reporting/engine/classic/core/function/formula/SingleValueQuery-Function.properties
./engine/extensions-drilldown/source/org/pentaho/reporting/engine/classic/extensions/drilldown/DrillDown-Function.properties
./engine/extensions-drilldown/source/org/pentaho/reporting/engine/classic/extensions/drilldown/OpenInMantleTab-Function.properties
./engine/extensions-drilldown/source/org/pentaho/reporting/engine/classic/extensions/drilldown/UrlParameterSeparator-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/database/BeginsWith-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/database/Contains-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/database/EndsWith-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/database/Equals-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/database/In-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/database/Like-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/datetime/Date-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/datetime/DateDif-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/datetime/DateTimeValue-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/datetime/DateValue-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/datetime/Day-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/datetime/Days-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/datetime/Hour-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/datetime/Minute-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/datetime/Month-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/datetime/MonthEnd-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/datetime/Now-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/datetime/PrevWeekday-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/datetime/Second-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/datetime/Time-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/datetime/TimeValue-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/datetime/Today-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/datetime/WeekDay-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/datetime/Year-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/datetime/Yesterday-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/information/Choose-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/information/Count-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/information/CountA-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/information/CountBlank-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/information/Error-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/information/HasChanged-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/information/Index-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/information/IsBlank-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/information/IsErr-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/information/IsError-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/information/IsEven-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/information/IsLogical-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/information/IsNa-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/information/IsNonText-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/information/IsNumber-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/information/IsOdd-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/information/IsRef-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/information/IsText-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/information/Lookup-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/information/Na-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/information/Value-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/logical/And-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/logical/False-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/logical/If-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/logical/IfNa-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/logical/Not-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/logical/Or-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/logical/True-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/logical/Xor-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/math/Abs-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/math/Acos-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/math/Acosh-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/math/Asin-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/math/Atan-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/math/Atan2-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/math/Average-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/math/AverageA-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/math/Cos-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/math/Even-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/math/Exp-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/math/Ln-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/math/Log-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/math/Log10-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/math/Max-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/math/MaxA-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/math/Min-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/math/MinA-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/math/Mod-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/math/N-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/math/Odd-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/math/Pi-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/math/Power-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/math/Sin-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/math/Sqrt-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/math/Sum-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/math/SumA-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/math/Var-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/rounding/Int-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/text/Asc-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/text/Char-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/text/Clean-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/text/Code-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/text/Concatenate-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/text/Dollar-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/text/Exact-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/text/Find-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/text/Fixed-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/text/Left-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/text/Len-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/text/Lower-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/text/Message-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/text/Mid-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/text/Proper-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/text/Replace-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/text/Rept-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/text/Right-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/text/Search-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/text/StringCount-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/text/Substitute-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/text/T-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/text/Text-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/text/Trim-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/text/Unichar-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/text/Unicode-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/text/Upper-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/text/URLEncode-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/userdefined/ArrayConcatenate-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/userdefined/ArrayContains-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/userdefined/ArrayLeft-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/userdefined/ArrayMid-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/userdefined/ArrayRight-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/userdefined/CsvArray-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/userdefined/CsvText-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/userdefined/NormalizeArray-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/userdefined/Null-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/userdefined/ParseDate-Function.properties
./libraries/libformula/source/org/pentaho/reporting/libraries/formula/function/userdefined/SequenceQuoter-Function.properties

Translating Pentaho Reporting is not small task, the project is big and has a lot of parts. I am happy to integrate any translation, no matter whether it encompasses every translatable text or a single element. Over time, we may be able to build a full set of translations, but I’m sure it won’t happen overnight. We have a lot of text, and a lot of catching up to do.

Bonus Build – Setting up Jenkins to build and validate pull requests

In my last post about creating a local build environment, I showed how you can set up a local CI server to validate your local commits.

When working with Open-Source on GitHub, contributions usually come in the form of pull-requests. When such a request comes in, it is usually wise to validate the code. But hey, validating commits is hard work when you have to do it manually. You have to pull in the change, merge it locally, build it, run the tests, maybe even sniff test the final application to catch errors the unit-tests can’t catch (for example GUI errors). It’s hard and complex and so every now and then we skip these tests and accept the pull request blindly and deal with the fall out afterwards.

Why not automate those steps?

Continue reading

Better Builds (2/3): Set up a private CI server to automatically test your work.

When you finished writing a feature or bug-fix, the big moment of truth arrives: Did I break something?

Of course, the obvious errors should be validated in the local unit-tests. And all programmers run unit and integration tests every time they make a change. Yeah!

I know I don’t. I should, but its a quick fix and what bad could ever happen? So I need a system to help me stay clean – I need a CI server that automatically picks up my changes so that I don’t have to worry about skipping tests any more. I want it automated, I want it to work in the background, and I want it fast.

Pentaho Reporting is a library that is embedded in many places, most importantly for readers of this blog, in the Pentaho Report Designer and the Pentaho BI-Server. Sometimes changes have far fetching results – and not good ones! Checking method parameter more strictly can cause errors pop up everywhere. Removing a seemingly unused library or renaming a internal method can break the downstream compile process in rather surprising ways.

This is the second part of a 3 part series on how to manage your local builds better. Today, we will setup a CI server to continuously validate your local commits. To work best, this server will require you to have an Artifactory repository running, so that you get results faster.

Contents of this series

In the first part of this series, we did create a faster build by setting up an Artifactory server as a strong cache. This did cut the build time from over 60 minutes to roughly 15 minutes. Although this is not exactly lightning fast, it is fast enough to give you feedback on your work before you have moved on to the next task.

This post will automate the testing, so that every commit you do is validated. I will also introduce you to a advanced set of override properties for subfloor that will speed up your build process even more.

And in the third part, we will look at how to set up a proper end-to-end intergration test for the Pentaho-BI-Server assembly, so that any change you do can be validated against the full stack. Continue reading

Better Builds (1/3): Speed up the Pentaho Reporting Build

When developing bug-fixes or new features for software I write (in the context of this blog: Pentaho Reporting), I tend to follow a test-supported development model. Its not the pure “write tests first” approach of the Test-Driven crowd, but a workable approximation of the main idea behind it: Any code written should have some automatic validation in place to make sure it works as intended today and in the future.

The number one prerequisite to make that work is a fast feedback loop between me writing the code and an automated system to tell me I messed up again.

In this series of three posts I am going to demonstrate how to set up a local build environment that greatly speeds up the build process and that automatically validates all builds for you.

Contents of this series

In this first post I will introduce some necessary changes to the build scripts that allow us to manage the build configuration from a central location and then to use this to speed up the process.

In the second post I will show you how to set up a CI server and how to feed it with your changes, so that it builds your work for you the moment you push the changes to a shared (possibly private) git repository.

And finally, in the third post, I will show you how to create a build chain to assemble a BI-Server and how you can create and run integration tests against this assembly. This then provides you the means to run both Java JUnit-tests and JavaScript Jasmine tests against a fully deployed BI-server to make sure that everything still works. Continue reading

Beware of file encodings – or the curious case of the broken JDBC passwords

When we work with text on a computer, we usually seem to take it for granted that whatever we write is stored by the system exactly as we write it. If you are old enough to remember DOS and code-pages, then you also remember the fun one can have when trying to exchange documents across regional borders.

Each region has its own set of characters they consider important. Everyone can agree on the first 7-bit of the character set encodings, but move beyond that any you are in no-mans land.

Now it is 2014 and it this was relevant 20 years ago. So why bother?

It matters, because old standards never die. In Java, some files used by standard functions have prescribed encodings. For instance, property files used by Java-code must always be encoded as ISO-8859-1. Property files used by GWT code must be encoded as UTF-8. Source files can have any encoding and the compiler will select the encoding based on your system default.

So for property files, you have to keep two separate copies in case you share code and you have to tell your editor that this file types may be different based on how you human operator want to use them. So there is a default – but the default sucks.

But worst: The compiler accepts everything and uses a system dependent default. So unless you specify the encoding manually, your local compile result can differ greatly from the result produced by a different machine. Now try to debug that!

Recently I had a rather strange case to work on where this chaos mattered.

As part of the Pentaho Reporting 5.0 release I normalized all the source code of Pentaho Reporting to the safe US-ASCII character set. Remember, all character sets in use agree on the lower 7-bits of their character range. This corresponds to the US-ASCII set of characters. Therefore, no matter where you are in the world and no matter what machine you use – the source code will look and behave the same everywhere.

As a result, I ‘fixed’ the salt-string for our password obscuration, which contained the Unicode character ‘SECTION SIGN’ (U+00A7). Apparently, when you use ISO-8859-1 as encoding for source code, this character works just fine. But our CI and release build machine actually uses UTF-8 as its default encoding for source code, and there this character is invalid, and must be encoded as a 2-byte sequence.

Therefore, the release of Pentaho Reporting 5.0 decodes and encodes passwords differently than the previous 4.8 release. Now, if you were always good and enterprise ready, you would use JNDI datasources and none of that would matter to you. But some users want or need to access databases that are not defined via JNDI – and thus store passwords in the PRPT file.

All these reports broke when running on 5.0 with a “Invalid password” error reported by the database.

Testing with a local build, however, showed no error. The reports ran fine.

Only thanks to the detailed bug-report with a great sample on what causes the breakage I was able to make the connection to ultimately narrow it down to a variation in the binary files produced by the build machine. Thank god that Pentaho Reporting is part of our open source offering and that there was no code obscuration used in that build. Therefore I was able to decompile the class file and see where that restored source code differed from the sources we have in GIT.

Lessons learned: (1) Don’t assume your sources reflect your binary files.  (2) Machine dependent defaults suck as much today as they did 20 years ago. And (3) Never assume that the user provides  sensible settings and thus use the safest option possible. In our case encode all files as US-ASCII with plenty of use of escape-sequences for characters outside of that range. It may be ugly, but it is guaranteed to work on every machine regardless of the developer’s defaults.

Pentaho Reporting now with Arabic text support

In the upcoming version 5.1, Pentaho Reporting will now ship with (for this version) experimental support for printing bidirectional text. Bi-Directional text processing enables us to print both Arabic, Hebrew and other non-Latin languages.

Support for Arabic text was on our backlog for a decade now. Thanks to the work done by Nortal and Marian Androne in particular, we now have a new text processing sub-system that relies on the JDK’s TextLayout class to process complex text. The text-layout class handles all the line-breaking calculations, while some additional helper code around it adds stronger rich-text features, including embedded images, to the mix.

Why experimental?

The new text layouting system is a large chunk of code and came comparatively late in the development process for version 5.1. We have maybe a month of development time left until we are supposed to finalize the next release. The AWT itself is platform dependent and next to impossible to unit-test properly. The results of any font and text processing are heavily dependent on your JDK version and vendor and the operating system and its configuration and available fonts.

To properly test the new code, we will need a considerable amount of time, as that testing will be either manual or will require a whole new approach to testing to insulate ourselves from the platform specifics.

Oh, and no one at Pentaho seems to speak Arabic or Hebrew to validate the somewhat critical correctness of the BiDi-Text processing. As glyphs flow together and – for the untrained eye – insignificant dots and lines can alter the meaning of the text that is printed, I personally do not feel confident to vouch for the correctness of the print without more tests.

The text might be fine, or a misspelling might start a (national/corporate/marital) war. So let’s play it safe for now.

How to enable Arabic Text support.

You can enable Arabic text processing on a per-report basis by setting the attribute “common::complex-text” to “true”.  If you want to enable this globally, add the configuration setting “org.pentaho.reporting.engine.classic.core.layout.fontrenderer.ComplexTextLayout=true” to the “classic-engine.properties” file in the root of your classpath.

Once the complex text processing is enabled, you can use a couple of new styles in your reports. (These styles can be set regardless of the complex-text processing setting – but they will have no effect if the old text processor is used.)

When using Arabic or any other non-Latin text, it is critical to NEVER EVER EVER! use any of the built-in fonts (“Serif”, “SansSerif”, “Monospaced”, “Dialog”) or your export to PDF will produce invalid output. The PDF specification does not support non-Latin text for these fonts and will fail silently.

Apparently, in 1985, when the PDF specifications were made, no one could have foreseen that Arabic people would want to use computers for printing texts in their native language.  ;-)

Once complex text processing is enabled, you can control the default flow of the text via a new style property named “text-direction”. This style is inherited, so to define a preference for Right-To-Left text processing for the whole report, it is sufficient to define this style only once on the master-report object.

By using the text-layout class, we now also gained the ability to break text within words. The new inheritable style property “word-break” allows you to control this feature. If not defined, this defaults to “true” (breaks only at word-boundaries), just like in the previous versions.

Reporting Bugs

Please help us to squash all remaining bugs in this new feature by giving it a try. And if you happen to be a native or fluent speaker of a Right-to-Left language, we would love to hear whether we print everything correctly.

Please use our JIRA system to report bugs, or our forum for general questions and feedback. Thank you!

Understanding and tuning the Java garbage collector

While working on one of my many side-projects, I stumbled across a very complete and understandable explanation of the various garbage collector algorithms used inside the JDK and their performance impacts.

If you want to tickle the most out of your BI-server or Carte server installations, the article “Java Garbage Collectors distilled” at the Mechanical Sympathy blog may be worth a read.

Blazing fast data exports with Pentaho Reporting 5.1

Ever felt that getting the Pentaho BI-server to spit out CSV or Excel files should be faster? As unbelievable as it sounds, with case PRD-4921 closed, we have up to 5 (in words: five!) times faster exports now.

Its one of those occasions where talking about customer problems creates a wacky idea that falls on fruitful ground.

Many customers use the Interactive Reporting tools (Pentaho Interactive Reporting, Saiku Reporting or the ugly Adhoc Reporting (WAQR)) to get data out of the data-warehouse into Excel or CSV files. Such reports are usually rather simple list reports, with no fancy charting or complex layout structures. However, the reporting engine does not know that, it’s pessimistic nature always assumes the worst.

The Pentaho Reporting engine allows an insane degree of freedom, and via custom report functions, it allows to reconfigure the report on the fly while the report is running. But with that freedom, we no longer can make any assumptions about how a report will look like in the next row. Thus the engine, and the layout subsystem, assume nothing and (apart from a bit of caching of reusable bits) recalculate everything from scratch.

Which takes time.

With PRD-4921, I added a fast-mode to some of the export types (Stream CSV, Stream HTML and XLS/XLSX). The new exporters check whether the report uses only ‘safe’ features, and if so, switches to a template based output instead of using the full layouting.

A report is safe if it does not contain any of the following items:

  • inline subreports. They are evil, as they can appear anywhere and can be of any complexity.
  • crosstabs. They are a complex layout and can’t be easily condensed into templated sections.
  • functions that listen for page-events, other than the standard page-function and page-of-pages functions. During fast-mode, we don’t generate page events and thus these wont output correct values. I am willing to ignore page functions, as data exports are less concerned about page numbers.
  • any layout-processor-function other than the Row-Banding function. They exist to rewrite the report, which stops us from making assumptions about the report’s structure.

If a report is not safe, the engine falls back to the normal, slow mode. You now just have to wait a bit longer to get your data, but you wont get sudden service interruptions.

For fast reports, the engine produce a template of each root-level band. If the style of a band changes over time (as a result of having Style-expressions), we produce a template for each unique combinations of styles the reporting engine encounters.

Once the engine has a valid template, it can skip all layouting on all subsequent rows of data and can just fill in the data into the template’s place holders. The resulting output is exactly the same as the slow output – minus the waiting time.

So how does this system perform? Here is what my system produces using a 65k rows report (to stay within the limits imposed by Excel97) with 35 columns of data exported. The report has no groups, it is just one big fat stream of data. All times are given in seconds.

Export 5.1 with fix 5.0 with fix 5.0 GA
Fast-CSV 4.5 5.4 -
CSV 25.8 24.5 24.8
Fast-XLS 11.7 11.3 -
XLS 53.2 51.3 213.4
Fast-XLSX 31.3 37.7 -
XLSX 86.0 82.8 232.4
Fast-HTML 10.0 11.1 -
HTML 42.9 43.5 44.9
PDF 66.7 69.2 66.4

As you can see from the data, the fix gave a 4 to 5 times speed up for HTML and CSV exports. The Excel exports were extra slow in 5.0 (and 4.x), and a few fixes in the layout handling and Excel specific exports gave the ‘normal’ mode a speed-up of 3 to 4 times. On top of that, we now have the fast mode, that gives another 2-3 times more raw speed.

Not bad for one week of frantic coding, I guess.

Go grab the 5.1 CI builds to give it a go. You will need an updated BI-Server reporting plugin to make the BI-server (and thus the Adhoc reporting tools) pick up that change.

The 5.0 branch does not have those changes in, so don’t even try the CI builds for it. As the 5.0 codeline is in lock-down for bug-fixes only, these performance improvements will take a while to go in, as we don’t want to introduce regressions that break systems in production.