Jasper-reports-jasper-internationalization
JasperReports-国際化
時には、異なる言語のレポートが必要になります。 異なる言語ごとに同じレポートを作成することは、多くの冗長な作業を意味します。 言語ごとに異なるテキストのみを個別に記述し、ロケール設定に応じて実行時にテキスト要素にロードする必要があります。 これがレポートの国際化の目的です。 作成された国際化レポートはどこでも実行できます。
次の手順では、さまざまな言語でレポートを生成する方法と、レポートの国際化の他の機能をリストしました。
- リソースバンドル_java.util.ResourceBundle_をレポートテンプレートに関連付けます。 java.util.ResourceBundleオブジェクトをに関連付けるには2つの方法があります レポートテンプレート。
- 設計時には、レポートテンプレートオブジェクトの_resourceBundle_属性をターゲットリソースバンドルのベース名に設定します。
- レポート入力時にREPORT_RESOURCE_BUNDLEパラメーターの値として_java.util.ResourceBundle_オブジェクトを指定することにより、動的/実行時の関連付けを作成できます。
- 現在のロケールとは異なるロケールでレポートを生成する必要がある場合、組み込みのREPORT_LOCALEパラメーターを使用して、レポートの入力時にランタイムロケールを指定できます。
- レポートの国際化を促進するために、レポートに関連付けられた_java.util.ResourceBundle_オブジェクト内に配置された_java.lang.String_リソースを参照する特別な構文 $ R \ {} がレポート式内で使用可能です。 $ 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.
別のロケールを使用するには、ファイルの名前をlocalizeddemo_ [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.java をC:\ tools \ jasperreports-5.0.1 \ test \ src \ com \ finddevguidesディレクトリに保存しましょう。 ファイルの内容は次のとおりです。
package com.finddevguides;
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は、チャプターリンク:/jasper_reports/jasper_environment_setup [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.finddevguides.JasperReportFillI18 (viewFullReportがデフォルトのターゲットです)を実行します。
C:\tools\jasperreports-5.0.1\test>ant -Dmain-class=com.finddevguides.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\finddevguides\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/faql#noconfig for more info.
[jrc] File : C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrxml ... OK.
run:
[echo] Runnin class : com.finddevguides.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ウィンドウが開きます。