Учебники

JasperReports — Интернационализация

Иногда нам нужны отчеты на разных языках. Написание одного и того же отчета для каждого языка подразумевает много лишней работы. Только фрагменты текста, отличающиеся от языка к языку, должны быть написаны отдельно и загружены в текстовые элементы во время выполнения, в зависимости от настроек локали. Это цель интернационализации отчета. Интернационализированные отчеты, однажды написанные, могут работать везде.

На следующих этапах мы перечислили, как создавать отчеты на разных языках, а также некоторые другие функции интернационализации отчетов.

  • Свяжите пакет ресурсов java.util.ResourceBundle с шаблоном отчета. Есть два способа связать объект java.util.ResourceBundle с шаблоном отчета.

    • Во время разработки путем установки атрибута resourceBundle объекта шаблона отчета в качестве базового имени целевого пакета ресурсов.

    • Динамическая / динамическая ассоциация может быть создана путем предоставления объекта java.util.ResourceBundle в качестве значения параметра REPORT_RESOURCE_BUNDLE во время заполнения отчета.

    • Если отчет необходимо создать в локали, отличной от текущей, встроенный параметр REPORT_LOCALE можно использовать для указания локали среды выполнения при заполнении отчета.

  • Чтобы упростить интернационализацию отчета, в выражениях отчета доступен специальный синтаксис $ R {} для ссылки на ресурсы java.lang.String, размещенные внутри объекта java.util.ResourceBundle, связанного с отчетом. Синтаксис символа $ R {} извлекает ресурс, зависящий от локали, из пакета ресурсов на основе ключа, который должен быть заключен в квадратные скобки —

Свяжите пакет ресурсов java.util.ResourceBundle с шаблоном отчета. Есть два способа связать объект java.util.ResourceBundle с шаблоном отчета.

Во время разработки путем установки атрибута resourceBundle объекта шаблона отчета в качестве базового имени целевого пакета ресурсов.

Динамическая / динамическая ассоциация может быть создана путем предоставления объекта java.util.ResourceBundle в качестве значения параметра REPORT_RESOURCE_BUNDLE во время заполнения отчета.

Если отчет необходимо создать в локали, отличной от текущей, встроенный параметр REPORT_LOCALE можно использовать для указания локали среды выполнения при заполнении отчета.

Чтобы упростить интернационализацию отчета, в выражениях отчета доступен специальный синтаксис $ R {} для ссылки на ресурсы java.lang.String, размещенные внутри объекта java.util.ResourceBundle, связанного с отчетом. Синтаксис символа $ R {} извлекает ресурс, зависящий от локали, из пакета ресурсов на основе ключа, который должен быть заключен в квадратные скобки —

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

В приведенном выше текстовом поле отображается заголовок отчета путем извлечения значения String из комплекта ресурсов, связанного с шаблоном отчета, на основе локали, используемой во время выполнения, и ключа report.title .

  • Форматирование сообщений на разных языках в зависимости от локали отчета, в отчетах есть встроенный метод net.sf.jasperreports.engine.fill.JRCalculator . Этот метод предлагает функциональность, аналогичную классу java.text.MessageFormat . Этот метод, msg (), имеет три удобные подписи, которые позволяют вам использовать до трех параметров сообщения в сообщениях.

  • Встроенный метод str () (эквивалент синтаксиса $ R {} внутри выражений отчета), который предоставляет доступ к содержимому пакета ресурсов на основе языкового стандарта отчета.

  • Для форматирования даты и времени встроенный параметр REPORT_TIME_ZONE можно использовать для обеспечения правильного преобразования времени.

  • В сгенерированном выводе библиотека хранит информацию о направлении выполнения текста, так что документы, сгенерированные на языках с написанием справа налево (таких как арабский и иврит), могут быть правильно отображены.

  • Если приложение использует встроенный просмотрщик Swing для отображения сгенерированных отчетов, его необходимо интернационализировать, адаптируя кнопку «Подсказки» или другие отображаемые тексты. Это очень легко сделать, поскольку средство просмотра использует предопределенный пакет ресурсов для извлечения информации о конкретной локали. Базовое имя для этого пакета ресурсов — net.sf.jasperreports.view.viewer.

Форматирование сообщений на разных языках в зависимости от локали отчета, в отчетах есть встроенный метод net.sf.jasperreports.engine.fill.JRCalculator . Этот метод предлагает функциональность, аналогичную классу java.text.MessageFormat . Этот метод, msg (), имеет три удобные подписи, которые позволяют вам использовать до трех параметров сообщения в сообщениях.

Встроенный метод 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>

В приведенном выше файле атрибут resourceBundle элемента <jasperReport> сообщает 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.java в каталоге C: \ 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 взят из главы « Настройка среды» и должен быть расположен в том же каталоге, что и 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, как показано на приведенном ниже экране —