JasperReports - Internacjonalizacja

Czasami potrzebujemy raportów w różnych językach. Pisanie tego samego raportu dla każdego języka wiąże się z dużą ilością zbędnej pracy. Tylko fragmenty tekstu różniące się w zależności od języka powinny być napisane osobno i załadowane do elementów tekstowych w czasie wykonywania, w zależności od ustawień regionalnych. Taki jest cel internacjonalizacji raportu. Międzynarodowe raporty, raz napisane, mogą działać wszędzie.

W kolejnych krokach wymieniliśmy, jak wygenerować raport w różnych językach, a także kilka innych funkcji internacjonalizacji raportów -

  • Skojarz pakiet zasobów java.util.ResourceBundle z szablonem raportu. Istnieją dwa sposoby powiązania obiektu java.util.ResourceBundle z szablonem raportu.

    • W czasie projektowania przez ustawienie atrybutu resourceBundle obiektu szablonu raportu na nazwę podstawową docelowego pakunku zasobów.

    • Skojarzenie dynamiczne / wykonawcze można utworzyć, podając obiekt java.util.ResourceBundle jako wartość parametru REPORT_RESOURCE_BUNDLE w czasie wypełniania raportu.

    • Jeśli raport ma być wygenerowany w ustawieniach regionalnych innych niż bieżące, wbudowany parametr REPORT_LOCALE może zostać użyty do określenia ustawień narodowych środowiska wykonawczego podczas wypełniania raportu.

  • Aby ułatwić umiędzynarodowienie raportów, specjalna składnia $R{}jest dostępny w wyrażeniach raportu i służy do odwoływania się do zasobów java.lang.String umieszczonych w obiekcie java.util.ResourceBundle powiązanym z raportem. Plik$R{} składnia znaków wyodrębnia zasób specyficzny dla lokalizacji z pakietu zasobów na podstawie klucza, który należy umieścić w nawiasach -

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

Powyższe pole tekstowe wyświetla tytuł raportu poprzez wyodrębnienie wartości String z pakietu zasobów powiązanego z szablonem raportu na podstawie ustawień regionalnych dostarczonych w czasie wykonywania i klucza report.title .

  • Formatując wiadomości w różnych językach w oparciu o ustawienia regionalne raportu, w raportach net.sf.jasperreports.engine.fill.JRCalculator jest wbudowana metoda . Ta metoda oferuje funkcjonalność podobną do klasy java.text.MessageFormat . Ta metoda, msg (), ma trzy wygodne sygnatury, które pozwalają na użycie do trzech parametrów wiadomości w wiadomościach.

  • Wbudowana metoda str () (odpowiednik składni $ R {} wewnątrz wyrażeń raportu), która zapewnia dostęp do zawartości pakietu zasobów w oparciu o ustawienia regionalne raportu.

  • W przypadku formatowania daty i czasu można użyć wbudowanego parametru REPORT_TIME_ZONE, aby zapewnić prawidłowe przekształcenia czasu.

  • W wygenerowanych wynikach biblioteka przechowuje informacje o kierunku wykonywania tekstu, dzięki czemu dokumenty wygenerowane w językach z zapisem od prawej do lewej (jak arabski i hebrajski) mogą być poprawnie renderowane.

  • Jeśli aplikacja korzysta z wbudowanej przeglądarki Swing do wyświetlania generowanych raportów, należy ją umiędzynarodowić, dostosowując przycisk Etykietki narzędzi lub inne wyświetlane teksty. Jest to bardzo łatwe do zrobienia, ponieważ przeglądarka polega na predefiniowanym pakiecie zasobów w celu wyodrębnienia informacji specyficznych dla lokalizacji. Podstawowa nazwa tego pakietu zasobów to net.sf.jasperreports.view.viewer.

Przykład

Aby zademonstrować internacjonalizację, napiszmy nowy szablon raportu (jasper_report_template.jrxml). Zawartość JRXML jest podana poniżej. Zapisz go w katalogu 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>

W powyższym pliku, ResourceBundle atrybutem <jasperReport> element opowiada JasperReports gdzie uzyskać zlokalizowane ciągi do stosowania do raportu. Musimy utworzyć plik właściwości z nazwą główną odpowiadającą wartości atrybutu. Ten plik musi istnieć w dowolnym miejscu w CLASSPATH podczas wypełniania raportu. W tym przykładzie plik właściwościlocalizationdemo.properties jest zapisywany w katalogu C:\tools\jasperreports-5.0.1\test. Zawartość tego pliku jest następująca -

localization.text1 = This is English text.

Aby użyć innego ustawienia narodowego, plik musi mieć nazwę localizationdemo [locale] .properties. Tutaj napiszemy plik dla hiszpańskich ustawień regionalnych. Zapisz ten plik jako -C:\tools\jasperreports-5.0.1\test\localizationdemo_es.properties. Zawartość tego pliku jest następująca -

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

Składnia służąca do uzyskiwania wartości właściwości resourceBundle to $ R {klucz}.

Aby JasperReports wiedział, jakiego locale chcemy użyć, musimy przypisać wartość do wbudowanego parametru. Nazwa tego parametru jest zdefiniowana jako stała o nazwie REPORT_LOCALE, a ta stała jest zdefiniowana w klasie net.sf.jasperreports.engine.JRParameter . Wartość stałej musi być instancją java.util.Locale . Ta logika jest włączona do kodu java w celu wypełnienia i wygenerowania raportu. Zapiszmy ten plikJasperReportFillI18.javado katalogu C: \ tools \ jasperreports-5.0.1 \ test \ src \ com \ tutorialspoint. Zawartość pliku jest następująca -

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

   }
}

Generowanie raportów

Skompilujemy i uruchomimy powyższy plik przy użyciu naszego zwykłego procesu budowania ANT. Zawartość pliku build.xml (zapisanego w katalogu C: \ tools \ jasperreports-5.0.1 \ test) jest taka, jak podano poniżej.

Plik importu - baseBuild.xml jest pobierany z rozdziału Konfiguracja środowiska i powinien być umieszczony w tym samym katalogu, co plik 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>

Następnie otwórzmy okno wiersza poleceń i przejdźmy do katalogu, w którym znajduje się plik build.xml. Na koniec wykonaj polecenieant -Dmain-class=com.tutorialspoint.JasperReportFillI18 (viewFullReport jest domyślnym celem) w następujący sposób -

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

W wyniku powyższej kompilacji otworzy się okno JasperViewer, jak pokazano na poniższym ekranie -