JasperReports - Internazionalizzazione

A volte, abbiamo bisogno di rapporti in diverse lingue. Scrivere lo stesso rapporto per ogni lingua diversa implica molto lavoro ridondante. Solo le parti di testo che differiscono da lingua a lingua devono essere scritte separatamente e caricate negli elementi di testo in fase di esecuzione, a seconda delle impostazioni locali. Questo è lo scopo del rapporto internazionalizzazione. I report internazionalizzati, una volta scritti, possono essere eseguiti ovunque.

Nei passaggi seguenti, abbiamo elencato come generare un rapporto in diverse lingue e anche alcune altre caratteristiche dell'internazionalizzazione del rapporto:

  • Associare un bundle di risorse java.util.ResourceBundle al modello di report. Esistono due modi per associare l'oggetto java.util.ResourceBundle al modello di report.

    • In fase di progettazione, impostando l' attributo resourceBundle dell'oggetto modello di report sul nome di base del bundle di risorse di destinazione.

    • È possibile creare un'associazione dinamica / runtime fornendo un oggetto java.util.ResourceBundle come valore per il parametro REPORT_RESOURCE_BUNDLE al momento della compilazione del report.

    • Se il report deve essere generato in una locale diversa da quella corrente, è possibile utilizzare il parametro REPORT_LOCALE incorporato per specificare la locale di runtime durante la compilazione del report.

  • Per facilitare l'internazionalizzazione dei report, una sintassi speciale $R{}è disponibile all'interno delle espressioni del report per fare riferimento alle risorse java.lang.String inserite in un oggetto java.util.ResourceBundle associato al report. Il$R{} la sintassi dei caratteri estrae la risorsa specifica della locale dal bundle di risorse in base alla chiave che deve essere inserita tra le parentesi -

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

Il campo di testo sopra mostra il titolo del report estraendo il valore String dal resource bundle associato al modello di report in base alle impostazioni internazionali fornite da runtime e alla chiave report.title .

  • Formattando i messaggi in lingue diverse in base alle impostazioni internazionali del report, esiste un metodo integrato all'interno dei report net.sf.jasperreports.engine.fill.JRCalculator . Questo metodo offre funzionalità simili alla classe java.text.MessageFormat . Questo metodo, msg (), ha tre utili firme che consentono di utilizzare fino a tre parametri di messaggio nei messaggi.

  • Un metodo str () integrato (l'equivalente della sintassi $ R {} all'interno delle espressioni del report), che dà accesso al contenuto del bundle di risorse in base alle impostazioni internazionali del report.

  • Per la formattazione di data e ora, è possibile utilizzare il parametro REPORT_TIME_ZONE incorporato per garantire trasformazioni dell'ora corrette.

  • Nell'output generato, la libreria conserva le informazioni sulla direzione di scorrimento del testo in modo che i documenti generati in lingue con scrittura da destra a sinistra (come l'arabo e l'ebraico) possano essere visualizzati correttamente.

  • Se un'applicazione fa affidamento sul visualizzatore Swing integrato per visualizzare i report generati, deve essere internazionalizzata adattando il pulsante ToolTips o altri testi visualizzati. Questo è molto facile da fare poiché il visualizzatore fa affidamento su un bundle di risorse predefinito per estrarre informazioni specifiche della locale. Il nome di base per questo bundle di risorse è net.sf.jasperreports.view.viewer.

Esempio

Per dimostrare l'internazionalizzazione, scriviamo un nuovo modello di report (jasper_report_template.jrxml). I contenuti di JRXML sono i seguenti. Salvalo nella directory 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>

Nel file di cui sopra, la ResourceBundle attributo del <JasperReport> elemento dice JasperReports dove trovare le stringhe localizzate per l'uso per il report. Dobbiamo creare un file delle proprietà con un nome radice che corrisponda al valore dell'attributo. Questo file deve esistere ovunque in CLASSPATH durante la compilazione del report. In questo esempio, il file delle proprietàlocalizationdemo.properties viene salvato nella directory C:\tools\jasperreports-5.0.1\test. I contenuti di questo file sono i seguenti:

localization.text1 = This is English text.

Per utilizzare una lingua diversa, il nome del file deve essere localizationdemo [locale] .properties. Qui scriveremo un file per la lingua spagnola. Salva questo file come -C:\tools\jasperreports-5.0.1\test\localizationdemo_es.properties. I contenuti di questo file sono i seguenti:

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

La sintassi per ottenere il valore per le proprietà resourceBundle è $ R {key}.

Per far sapere a JasperReports quale locale desideriamo usare, dobbiamo assegnare un valore a un parametro integrato. Il nome di questo parametro è definito come una costante chiamata REPORT_LOCALE e questa costante è definita nella classe net.sf.jasperreports.engine.JRParameter . Il valore della costante deve essere un'istanza di java.util.Locale . Questa logica è incorporata nel codice java per compilare e generare il report. Salviamo questo fileJasperReportFillI18.javanella directory C: \ tools \ jasperreports-5.0.1 \ test \ src \ com \ tutorialspoint. I contenuti del file sono i seguenti:

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

   }
}

Generazione di report

Compileremo ed eseguiremo il file sopra utilizzando il nostro normale processo di compilazione ANT. I contenuti del file build.xml (salvato nella directory C: \ tools \ jasperreports-5.0.1 \ test) sono i seguenti.

Il file di importazione - baseBuild.xml viene prelevato dal capitolo Configurazione dell'ambiente e dovrebbe essere posizionato nella stessa directory di 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>

Quindi, apriamo la finestra della riga di comando e andiamo alla directory in cui si trova build.xml. Infine, esegui il comandoant -Dmain-class=com.tutorialspoint.JasperReportFillI18 (viewFullReport è la destinazione predefinita) come segue:

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

Come risultato della compilazione di cui sopra, si apre una finestra di JasperViewer come mostrato nella schermata sotto riportata -