JasperReports - Internationalisierung

Manchmal brauchen wir Berichte in verschiedenen Sprachen. Das Schreiben des gleichen Berichts für jede Sprache erfordert viel redundante Arbeit. Nur von Sprache zu Sprache unterschiedliche Textteile sollten separat geschrieben und je nach Gebietsschemaeinstellungen zur Laufzeit in Textelemente geladen werden. Dies ist der Zweck des Berichts Internationalisierung. Einmal verfasste internationalisierte Berichte können überall ausgeführt werden.

In den folgenden Schritten haben wir aufgelistet, wie ein Bericht in verschiedenen Sprachen erstellt wird, sowie einige andere Funktionen der Internationalisierung von Berichten:

  • Verknüpfen Sie der Berichtsvorlage ein Ressourcenpaket java.util.ResourceBundle . Es gibt zwei Möglichkeiten, das Objekt java.util.ResourceBundle der Berichtsvorlage zuzuordnen.

    • Zur Entwurfszeit können Sie das resourceBundle- Attribut des Berichtsvorlagenobjekts auf den Basisnamen des Zielressourcenpakets setzen.

    • Eine dynamische / Laufzeitzuordnung kann hergestellt werden, indem ein java.util.ResourceBundle- Objekt als Wert für den Parameter REPORT_RESOURCE_BUNDLE zum Zeitpunkt des Berichtsfüllens angegeben wird.

    • Wenn der Bericht in einem anderen Gebietsschema als dem aktuellen erstellt werden muss, kann der integrierte Gebietsschema REPORT_LOCALE verwendet werden, um das Laufzeitgebietsschema beim Ausfüllen des Berichts anzugeben.

  • Zur Erleichterung der Internationalisierung von Berichten eine spezielle Syntax $R{}ist in Berichtsausdrücken verfügbar, um auf java.lang.String- Ressourcen zu verweisen , die in einem dem Bericht zugeordneten java.util.ResourceBundle- Objekt platziert sind . Das$R{} Die Zeichensyntax extrahiert die länderspezifische Ressource aus dem Ressourcenpaket basierend auf dem Schlüssel, der in Klammern gesetzt werden muss.

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

Das obige Textfeld zeigt den Titel des Berichts an, indem der String-Wert aus dem Ressourcenpaket extrahiert wird, das der Berichtsvorlage zugeordnet ist, basierend auf dem angegebenen Gebietsschema zur Laufzeit und dem Schlüssel report.title .

  • Beim Formatieren von Nachrichten in verschiedenen Sprachen basierend auf dem Gebietsschema des Berichts ist in den Berichten net.sf.jasperreports.engine.fill.JRCalculator eine integrierte Methode integriert . Diese Methode bietet ähnliche Funktionen wie die Klasse java.text.MessageFormat . Diese Methode, msg (), verfügt über drei praktische Signaturen, mit denen Sie bis zu drei Nachrichtenparameter in den Nachrichten verwenden können.

  • Eine integrierte str () -Methode (entspricht der Syntax $ R {} in den Berichtsausdrücken), die den Zugriff auf den Inhalt des Ressourcenpakets basierend auf dem Gebietsschema des Berichts ermöglicht.

  • Für die Formatierung von Datum und Uhrzeit kann der integrierte Parameter REPORT_TIME_ZONE verwendet werden, um ordnungsgemäße Zeittransformationen sicherzustellen.

  • In der generierten Ausgabe speichert die Bibliothek Informationen über die Textlaufrichtung, sodass Dokumente, die in Sprachen von rechts nach links (wie Arabisch und Hebräisch) generiert wurden, ordnungsgemäß gerendert werden können.

  • Wenn eine Anwendung zum Anzeigen generierter Berichte auf den integrierten Swing-Viewer angewiesen ist, muss sie durch Anpassen der Schaltfläche QuickInfos oder anderer angezeigter Texte internationalisiert werden. Dies ist sehr einfach, da der Viewer auf ein vordefiniertes Ressourcenpaket angewiesen ist, um länderspezifische Informationen zu extrahieren. Der Basisname für dieses Ressourcenpaket lautet net.sf.jasperreports.view.viewer.

Beispiel

Um die Internationalisierung zu demonstrieren, schreiben wir eine neue Berichtsvorlage (jasper_report_template.jrxml). Der Inhalt der JRXML ist wie folgt. Speichern Sie es im Verzeichnis 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>

In der obigen Datei teilt das resourceBundle- Attribut des <jasperReport> -Elements JasperReports mit, wo die lokalisierten Zeichenfolgen für den Bericht verwendet werden sollen. Wir müssen eine Eigenschaftendatei mit einem Stammnamen erstellen, der dem Wert des Attributs entspricht. Diese Datei muss beim Ausfüllen des Berichts an einer beliebigen Stelle im KLASSENPFAD vorhanden sein. In diesem Beispiel die Eigenschaftendateilocalizationdemo.properties wird unter dem Verzeichnis gespeichert C:\tools\jasperreports-5.0.1\test. Der Inhalt dieser Datei lautet wie folgt:

localization.text1 = This is English text.

Um ein anderes Gebietsschema zu verwenden, muss der Name der Datei localizationdemo [locale] .properties lauten. Hier schreiben wir eine Datei für das spanische Gebietsschema. Speichern Sie diese Datei als -C:\tools\jasperreports-5.0.1\test\localizationdemo_es.properties. Der Inhalt dieser Datei lautet wie folgt:

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

Die Syntax zum Abrufen des Werts für resourceBundle-Eigenschaften lautet $ R {key}.

Damit JasperReports weiß, welches Gebietsschema wir verwenden möchten, müssen wir einem integrierten Parameter einen Wert zuweisen. Der Name dieses Parameters ist als Konstante mit dem Namen REPORT_LOCALE definiert. Diese Konstante ist in der Klasse net.sf.jasperreports.engine.JRParameter definiert . Der Wert der Konstante muss eine Instanz von java.util.Locale sein . Diese Logik ist in Java-Code integriert, um den Bericht zu füllen und zu generieren. Speichern wir diese DateiJasperReportFillI18.javain das Verzeichnis C: \ tools \ jasperreports-5.0.1 \ test \ src \ com \ tutorialspoint. Der Inhalt der Datei ist wie folgt:

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

   }
}

Berichterstellung

Wir werden die obige Datei mit unserem regulären ANT-Erstellungsprozess kompilieren und ausführen. Der Inhalt der Datei build.xml (gespeichert im Verzeichnis C: \ tools \ jasperreports-5.0.1 \ test) ist wie folgt.

Die Importdatei - baseBuild.xml wird aus dem Kapitel Umgebungs-Setup übernommen und sollte im selben Verzeichnis wie die build.xml abgelegt werden.

<?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>

Öffnen Sie als Nächstes das Befehlszeilenfenster und wechseln Sie in das Verzeichnis, in dem build.xml abgelegt ist. Führen Sie abschließend den Befehl ausant -Dmain-class=com.tutorialspoint.JasperReportFillI18 (viewFullReport ist das Standardziel) wie folgt:

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

Als Ergebnis der obigen Kompilierung wird ein JasperViewer-Fenster geöffnet, wie im folgenden Bildschirm gezeigt -