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

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

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

  • Свяжите пакет ресурсов 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.

пример

Чтобы продемонстрировать интернационализацию, напишем новый шаблон отчета (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, как показано на экране, приведенном ниже -