JasperReports - Internacionalización

A veces, necesitamos informes en diferentes idiomas. Escribir el mismo informe para cada idioma diferente implica mucho trabajo redundante. Solo los fragmentos de texto que difieren de un idioma a otro deben escribirse por separado y cargarse en elementos de texto en tiempo de ejecución, según la configuración regional. Este es el propósito de la internacionalización del informe. Los informes internacionalizados, una vez escritos, pueden ejecutarse en todas partes.

En los siguientes pasos, hemos enumerado cómo generar un informe en diferentes idiomas y también algunas otras características de la internacionalización de informes:

  • Asocie un paquete de recursos java.util.ResourceBundle con la plantilla de informe. Hay dos formas de asociar el objeto java.util.ResourceBundle con la plantilla de informe.

    • En tiempo de diseño, estableciendo el atributo resourceBundle del objeto de plantilla de informe en el nombre base del paquete de recursos de destino.

    • Se puede realizar una asociación dinámica / tiempo de ejecución proporcionando un objeto java.util.ResourceBundle como el valor del parámetro REPORT_RESOURCE_BUNDLE en el momento de completar el informe.

    • Si el informe debe generarse en una configuración regional diferente a la actual, el parámetro incorporado REPORT_LOCALE se puede utilizar para especificar la configuración regional del tiempo de ejecución al completar el informe.

  • Para facilitar la internacionalización de informes, una sintaxis especial $R{}está disponible dentro de las expresiones del informe para hacer referencia a los recursos java.lang.String colocados dentro de un objeto java.util.ResourceBundle asociado con el informe. los$R{} la sintaxis de caracteres extrae el recurso específico de la configuración regional del paquete de recursos en función de la clave que debe colocarse entre corchetes:

<textFieldExpression>
   $R{report.title}
</textFieldExpression>

El campo de texto anterior muestra el título del informe extrayendo el valor de la cadena del paquete de recursos asociado con la plantilla del informe según la configuración regional suministrada por el tiempo de ejecución y la clave report.title .

  • Al formatear mensajes en diferentes idiomas según la configuración regional del informe, hay un método integrado dentro de los informes net.sf.jasperreports.engine.fill.JRCalculator . Este método ofrece una funcionalidad similar a la clase java.text.MessageFormat . Este método, msg (), tiene tres firmas convenientes que le permiten usar hasta tres parámetros de mensaje en los mensajes.

  • Un método str () integrado (el equivalente a la sintaxis $ R {} dentro de las expresiones del informe), que da acceso al contenido del paquete de recursos según la configuración regional del informe.

  • Para formatear la fecha y la hora, el parámetro incorporado REPORT_TIME_ZONE se puede utilizar para garantizar las transformaciones de hora adecuadas.

  • En la salida generada, la biblioteca mantiene información sobre la dirección de ejecución del texto para que los documentos generados en idiomas que tienen escritura de derecha a izquierda (como árabe y hebreo) se puedan procesar correctamente.

  • Si una aplicación se basa en el visor Swing integrado para mostrar los informes generados, entonces debe internacionalizarse adaptando el botón ToolTips u otros textos mostrados. Esto es muy fácil de hacer, ya que el espectador depende de un paquete de recursos predefinido para extraer información específica de la configuración regional. El nombre base de este paquete de recursos es net.sf.jasperreports.view.viewer.

Ejemplo

Para demostrar la internacionalización, escribamos una nueva plantilla de informe (jasper_report_template.jrxml). El contenido del JRXML se muestra a continuación. Guárdelo en el directorio C: \ tools \ jasperreports-5.0.1 \ test.

<?xml version = "1.0" encoding = "UTF-8"?>

<!DOCTYPE jasperReport PUBLIC "//JasperReports//DTD Report Design//EN"
   "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">

<jasperReport xmlns = "http://jasperreports.sourceforge.net/jasperreports"
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://jasperreports.sourceforge.net/jasperreports
   http://jasperreports.sourceforge.net/xsd/jasperreport.xsd"
   name = "jasper_report_template" language = "groovy" pageWidth = "595"
   pageHeight = "842" columnWidth = "555" leftMargin = "20" rightMargin = "20"
   topMargin = "20" bottomMargin = "20" resourceBundle = "localizationdemo">
   
   <title>
      <band height = "552">
         
         <textField>
            <reportElement positionType = "Float" x = "150" y = "20" 
               width = "400" height = "50"/>
            
            <textElement>
               <font size = "24"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$P{REPORT_LOCALE}.getDisplayName ($P{REPORT_LOCALE})]]>
            </textFieldExpression>
         </textField>

         <textField isStretchWithOverflow = "true" isBlankWhenNull = "true">
            <reportElement positionType = "Float" x = "20" y = "125" 
               width = "530" height = "20"/>
            
            <textElement textAlignment = "Justified">
               <font size = "14"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$R{localization.text1}]]>
            </textFieldExpression>
         
         </textField>
      
      </band>
   </title>

</jasperReport>

En el archivo anterior, el atributo resourceBundle del elemento <jasperReport> le dice a JasperReports dónde obtener las cadenas localizadas para usar en el informe. Necesitamos crear un archivo de propiedades con un nombre raíz que coincida con el valor del atributo. Este archivo debe existir en cualquier lugar de CLASSPATH al completar el informe. En este ejemplo, el archivo de propiedadeslocalizationdemo.properties se guarda en el directorio C:\tools\jasperreports-5.0.1\test. El contenido de este archivo es el siguiente:

localization.text1 = This is English text.

Para utilizar una configuración regional diferente, el nombre del archivo debe ser localizationdemo [locale] .properties. Aquí, escribiremos un archivo para la configuración regional en español. Guarde este archivo como -C:\tools\jasperreports-5.0.1\test\localizationdemo_es.properties. El contenido de este archivo es el siguiente:

localization.text1 = Este texto es en Español.

La sintaxis para obtener el valor de las propiedades resourceBundle es $ R {clave}.

Para que JasperReports sepa qué configuración regional deseamos usar, debemos asignar un valor a un parámetro incorporado. El nombre de este parámetro se define como una constante llamada REPORT_LOCALE, y esta constante se define en la clase net.sf.jasperreports.engine.JRParameter . El valor de la constante debe ser una instancia de java.util.Locale . Esta lógica está incorporada en el código java para completar y generar el informe. Guardemos este archivoJasperReportFillI18.javaal directorio C: \ tools \ jasperreports-5.0.1 \ test \ src \ com \ tutorialspoint. El contenido del archivo es el siguiente:

package com.tutorialspoint;

import java.util.HashMap;
import java.util.Locale;

import net.sf.jasperreports.engine.JREmptyDataSource;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRParameter;
import net.sf.jasperreports.engine.JasperFillManager;

public class JasperReportFillI18 {

   public static void main(String[] args) {
      String sourceFileName = "C://tools/jasperreports-5.0.1/test/"
         + "jasper_report_template.jasper";
      HashMap parameterMap = new HashMap();
      if (args.length > 0) {
         parameterMap.put(JRParameter.REPORT_LOCALE, new Locale(args[0]));
      }
      try {
         JasperFillManager.fillReportToFile(sourceFileName, null, 
            new JREmptyDataSource());
      } catch (JRException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
      }

   }
}

La generación del informe

Compilaremos y ejecutaremos el archivo anterior utilizando nuestro proceso de compilación ANT habitual. El contenido del archivo build.xml (guardado en el directorio C: \ tools \ jasperreports-5.0.1 \ test) es como se indica a continuación.

El archivo de importación, baseBuild.xml, se obtiene del capítulo Configuración del entorno y debe colocarse en el mismo directorio que build.xml.

<?xml version = "1.0" encoding = "UTF-8"?>

<project name = "JasperReportTest" default = "viewFillReport" basedir = ".">
   <import file = "baseBuild.xml" />
   
   <target name = "viewFillReport" depends = "compile,compilereportdesing,run"
      description = "Launches the report viewer to preview the report stored 
      in the .JRprint file.">
      
      <java classname = "net.sf.jasperreports.view.JasperViewer" fork = "true">
         <arg value = "-F${file.name}.JRprint" />
         <classpath refid = "classpath" />
      </java>
   </target>
   
   <target name = "compilereportdesing" description = "Compiles the JXML file and
      produces the .jasper file.">
      
      <taskdef name = "jrc" classname = "net.sf.jasperreports.ant.JRAntCompileTask">
         <classpath refid="classpath" />
      </taskdef>
      
      <jrc destdir = ".">
         <src>
            <fileset dir = ".">
               <include name = "*.jrxml" />
            </fileset>
         </src>
         <classpath refid = "classpath" />
      </jrc>
   
   </target>
	
</project>

A continuación, abramos la ventana de la línea de comandos y vayamos al directorio donde se coloca build.xml. Finalmente, ejecute el comandoant -Dmain-class=com.tutorialspoint.JasperReportFillI18 (viewFullReport es el destino predeterminado) de la siguiente manera:

C:\tools\jasperreports-5.0.1\test>ant  -Dmain-class=com.tutorialspoint.JasperReportFillI18
Buildfile: C:\tools\jasperreports-5.0.1\test\build.xml

clean-sample:
   [delete] Deleting directory C:\tools\jasperreports-5.0.1\test\classes
   [delete] Deleting: C:\tools\jasperreports-5.0.1\test\jasper_report_template.jasper
   [delete] Deleting: C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrprint

compile:
   [mkdir] Created dir: C:\tools\jasperreports-5.0.1\test\classes
   [javac] C:\tools\jasperreports-5.0.1\test\baseBuild.xml:28:
   warning: 'includeantruntime' was not set, defaulting to
   [javac] Compiling 1 source file to C:\tools\jasperreports-5.0.1\test\classes
   [javac] Note: C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\
      JasperReportFillI18.java
   uses unchecked or u
   [javac] Note: Recompile with -Xlint:unchecked for details.

compilereportdesing:
   [jrc] Compiling 1 report design files.
   [jrc] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.engine.xml.JRXmlDigesterFactory).
   [jrc] log4j:WARN Please initialize the log4j system properly.
   [jrc] log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig 
      for more info.
   [jrc] File : C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrxml ... OK.

run:
   [echo] Runnin class : com.tutorialspoint.JasperReportFillI18
   [java] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.extensions.ExtensionsEnvironment).
   [java] log4j:WARN Please initialize the log4j system properly.

viewFillReport:
   [java] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.extensions.ExtensionsEnvironment).
   [java] log4j:WARN Please initialize the log4j system properly.

BUILD SUCCESSFUL
Total time: 3 minutes 28 seconds

Como resultado de la compilación anterior, se abre una ventana de JasperViewer como se muestra en la pantalla que se muestra a continuación: