JasperReports-国際化

場合によっては、さまざまな言語のレポートが必要になります。異なる言語ごとに同じレポートを作成することは、多くの冗長な作業を意味します。言語ごとに異なるテキストのみを個別に記述し、ロケール設定に応じて実行時にテキスト要素にロードする必要があります。これがレポートの国際化の目的です。国際化されたレポートは、一度作成されると、どこでも実行できます。

次の手順では、さまざまな言語でレポートを生成する方法と、レポートの国際化のその他の機能をいくつかリストしました。

  • リソースバンドルjava.util.ResourceBundleをレポートテンプレートに関連付けます。java.util.ResourceBundleオブジェクトをレポートテンプレートに関連付けるには、2つの方法があります。

    • 設計時に、レポートテンプレートオブジェクトのresourceBundle属性をターゲットリソースバンドルのベース名に設定します。

    • 動的/ランタイムの関連付けは、レポート入力時にREPORT_RESOURCE_BUNDLEパラメーターの値としてjava.util.ResourceBundleオブジェクトを指定することで作成できます。

    • 現在のロケールとは異なるロケールでレポートを生成する必要がある場合は、組み込みのREPORT_LOCALEパラメーターを使用して、レポートに入力するときにランタイムロケールを指定できます。

  • レポートの国際化を促進するために、特別な構文 $R{}レポートに関連付けられたjava.util.ResourceBundleオブジェクト内に配置されたjava.lang.Stringリソースを参照するために、レポート式内で使用できます。ザ・$R{} 文字構文は、角かっこで囲む必要があるキーに基づいて、リソースバンドルからロケール固有のリソースを抽出します-

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

上記のテキストフィールドには、runtimesuppliedロケールとreport.titleキーに基づいて、レポートテンプレートに関連付けられたリソースバンドルから文字列値を抽出することにより、レポートのタイトルが表示されます。

  • レポートのロケールに基づいてさまざまな言語でメッセージをフォーマットするために、レポートnet.sf.jasperreports.engine.fill.JRCalculator内に組み込みのメソッドがあります。このメソッドは、java.text.MessageFormatクラスと同様の機能を提供します。このメソッドmsg()には、メッセージで最大3つのメッセージパラメータを使用できる3つの便利な署名があります。

  • 組み込みのstr()メソッド(レポート式内の$ R {}構文に相当)。レポートのロケールに基づいてリソースバンドルのコンテンツにアクセスできます。

  • 日付と時刻のフォーマットについては、組み込みのREPORT_TIME_ZONEパラメーターを使用して、適切な時刻変換を保証できます。

  • 生成された出力では、ライブラリはテキストの実行方向に関する情報を保持するため、右から左に書く言語(アラビア語やヘブライ語など)で生成されたドキュメントを適切にレンダリングできます。

  • 生成されたレポートを表示するためにアプリケーションが組み込みのSwingビューアに依存している場合は、ボタンのツールチップまたは表示されるその他のテキストを調整して、アプリケーションを国際化する必要があります。ビューアは事前定義されたリソースバンドルに依存してロケール固有の情報を抽出するため、これは非常に簡単です。このリソースバンドルのベース名はnet.sf.jasperreports.view.viewerです。

国際化を実証するために、新しいレポートテンプレート(jasper_report_template.jrxml)を作成しましょう。JRXMLの内容は以下のとおりです。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>

上記のファイルでは、<jasperReport>要素のresourceBundle属性は、レポートに使用するローカライズされた文字列を取得する場所をJasperReportsに指示します。属性の値と一致するルート名を持つプロパティファイルを作成する必要があります。このファイルは、レポートに入力するときにCLASSPATHのどこかに存在する必要があります。この例では、プロパティファイルlocalizationdemo.properties ディレクトリの下に保存されます C:\tools\jasperreports-5.0.1\test。このファイルの内容は次のとおりです-

localization.text1 = This is English text.

別のロケールを使用するには、ファイルの名前をlocalizationdemo [locale] .propertiesにする必要があります。ここでは、スペイン語ロケールのファイルを作成します。このファイルを-として保存しますC:\tools\jasperreports-5.0.1\test\localizationdemo_es.properties。このファイルの内容は次のとおりです-

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

resourceBundleプロパティの値を取得するための構文は$ R {key}です。

JasperReportsに使用するロケールを知らせるには、組み込みパラメーターに値を割り当てる必要があります。このパラメーターの名前はREPORT_LOCALEと呼ばれる定数として定義され、この定数はnet.sf.jasperreports.engine.JRParameterクラスで定義されます。定数の値は、java.util.Localeのインスタンスである必要があります。このロジックは、レポートに入力して生成するためにJavaコードに組み込まれています。このファイルを保存しましょうJasperReportFillI18.javaC:\ tools \ jasperreports-5.0.1 \ test \ src \ com \ tutorialspointディレクトリに移動します。ファイルの内容は次のとおりです-

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

   }
}

レポートの生成

通常のANTビルドプロセスを使用して、上記のファイルをコンパイルして実行します。ファイルbuild.xml(ディレクトリC:\ tools \ jasperreports-5.0.1 \ testの下に保存)の内容は次のとおりです。

インポートファイル--baseBuild.xmlは、Environment Setupの章から取得され、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>

次に、コマンドラインウィンドウを開いて、build.xmlが配置されているディレクトリに移動しましょう。最後に、コマンドを実行しますant -Dmain-class=com.tutorialspoint.JasperReportFillI18 (viewFullReportがデフォルトのターゲットです)次のように-

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

上記のコンパイルの結果、以下の画面に示すようにJasperViewerウィンドウが開きます-