JasperReports - Internationalisation

Parfois, nous avons besoin de rapports dans différentes langues. Ecrire le même rapport pour chaque langue différente implique beaucoup de travail redondant. Seuls les morceaux de texte différant d'une langue à l'autre doivent être écrits séparément et chargés dans des éléments de texte lors de l'exécution, en fonction des paramètres régionaux. C'est le but de l'internationalisation du rapport. Les rapports internationalisés, une fois rédigés, peuvent être exécutés partout.

Dans les étapes suivantes, nous avons répertorié comment générer un rapport dans différentes langues ainsi que certaines autres fonctionnalités de l'internationalisation des rapports -

  • Associez un ensemble de ressources java.util.ResourceBundle au modèle de rapport. Il existe deux façons d'associer l'objet java.util.ResourceBundle au modèle de rapport.

    • Au moment de la conception, en définissant l' attribut resourceBundle de l'objet de modèle de rapport sur le nom de base du groupe de ressources cible.

    • Une association dynamique / d'exécution peut être effectuée en fournissant un objet java.util.ResourceBundle comme valeur du paramètre REPORT_RESOURCE_BUNDLE au moment du remplissage du rapport.

    • Si le rapport doit être généré dans un environnement local différent de celui en cours, le paramètre intégré REPORT_LOCALE peut être utilisé pour spécifier les paramètres régionaux d'exécution lors du remplissage du rapport.

  • Pour faciliter l'internationalisation des rapports, une syntaxe spéciale $R{}est disponible dans les expressions de rapport pour référencer les ressources java.lang.String placées dans un objet java.util.ResourceBundle associé au rapport. le$R{} la syntaxe de caractères extrait la ressource spécifique à la langue du groupe de ressources en fonction de la clé qui doit être placée entre les crochets -

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

Le champ de texte ci-dessus affiche le titre du rapport en extrayant la valeur String du groupe de ressources associé au modèle de rapport en fonction des paramètres régionaux d'exécution fournis et de la clé report.title .

  • Formater les messages dans différentes langues en fonction des paramètres régionaux du rapport, il existe une méthode intégrée à l'intérieur des rapports net.sf.jasperreports.engine.fill.JRCalculator . Cette méthode offre des fonctionnalités similaires à la classe java.text.MessageFormat . Cette méthode, msg (), a trois signatures pratiques qui vous permettent d'utiliser jusqu'à trois paramètres de message dans les messages.

  • Une méthode str () intégrée (l'équivalent de la syntaxe $ R {} dans les expressions du rapport), qui donne accès au contenu du groupe de ressources en fonction des paramètres régionaux du rapport.

  • Pour le formatage de la date et de l'heure, le paramètre intégré REPORT_TIME_ZONE peut être utilisé pour garantir des transformations d'heure appropriées.

  • Dans la sortie générée, la bibliothèque conserve des informations sur la direction d'exécution du texte afin que les documents générés dans des langues qui ont une écriture de droite à gauche (comme l'arabe et l'hébreu) ​​puissent être rendus correctement.

  • Si une application s'appuie sur le visualiseur Swing intégré pour afficher les rapports générés, elle doit alors être internationalisée en adaptant le bouton Info-bulles ou d'autres textes affichés. C'est très facile à faire car le visualiseur s'appuie sur un ensemble de ressources prédéfini pour extraire des informations spécifiques aux paramètres régionaux. Le nom de base de cet ensemble de ressources est net.sf.jasperreports.view.viewer.

Exemple

Pour démontrer l'internationalisation, écrivons un nouveau modèle de rapport (jasper_report_template.jrxml). Le contenu du JRXML est indiqué ci-dessous. Enregistrez-le dans le répertoire 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>

Dans le fichier ci-dessus, l' attribut resourceBundle de l'élément <jasperReport> indique à JasperReports où obtenir les chaînes localisées à utiliser pour le rapport. Nous devons créer un fichier de propriétés avec un nom racine correspondant à la valeur de l'attribut. Ce fichier doit exister n'importe où dans le CLASSPATH lors du remplissage du rapport. Dans cet exemple, le fichier de propriétéslocalizationdemo.properties est enregistré sous le répertoire C:\tools\jasperreports-5.0.1\test. Le contenu de ce fichier est le suivant -

localization.text1 = This is English text.

Pour utiliser une langue différente, le nom du fichier doit être localizationdemo [locale] .properties. Ici, nous allons écrire un fichier pour les paramètres régionaux espagnols. Enregistrez ce fichier sous -C:\tools\jasperreports-5.0.1\test\localizationdemo_es.properties. Le contenu de ce fichier est le suivant -

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

La syntaxe pour obtenir la valeur des propriétés resourceBundle est $ R {key}.

Pour permettre à JasperReports de savoir quelle locale nous souhaitons utiliser, nous devons attribuer une valeur à un paramètre intégré. Le nom de ce paramètre est défini comme une constante appelée REPORT_LOCALE, et cette constante est définie dans la classe net.sf.jasperreports.engine.JRParameter . La valeur de la constante doit être une instance de java.util.Locale . Cette logique est incorporée au code java pour remplir et générer le rapport. Sauvegardons ce fichierJasperReportFillI18.javadans le répertoire C: \ tools \ jasperreports-5.0.1 \ test \ src \ com \ tutorialspoint. Le contenu du fichier est le suivant -

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();
      }

   }
}

Génération de rapports

Nous compilerons et exécuterons le fichier ci-dessus en utilisant notre processus de construction ANT normal. Le contenu du fichier build.xml (enregistré sous le répertoire C: \ tools \ jasperreports-5.0.1 \ test) est indiqué ci-dessous.

Le fichier d'importation - baseBuild.xml est extrait du chapitre Configuration de l'environnement et doit être placé dans le même répertoire que le 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>

Ensuite, ouvrons la fenêtre de ligne de commande et allons dans le répertoire où build.xml est placé. Enfin, exécutez la commandeant -Dmain-class=com.tutorialspoint.JasperReportFillI18 (viewFullReport est la cible par défaut) comme suit -

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

À la suite de la compilation ci-dessus, une fenêtre JasperViewer s'ouvre comme indiqué dans l'écran ci-dessous -