JasperReports - Internacionalização

Às vezes, precisamos de relatórios em diferentes idiomas. Escrever o mesmo relatório para cada idioma diferente implica em muito trabalho redundante. Apenas pedaços de texto que diferem de idioma para idioma devem ser escritos separadamente e carregados em elementos de texto em tempo de execução, dependendo das configurações de localidade. Este é o objetivo da internacionalização do relatório. Os relatórios internacionalizados, uma vez escritos, podem ser executados em qualquer lugar.

Nas etapas a seguir, listamos como gerar um relatório em diferentes idiomas e também alguns outros recursos de internacionalização de relatórios -

  • Associe um pacote de recursos java.util.ResourceBundle ao modelo de relatório. Existem duas maneiras de associar o objeto java.util.ResourceBundle ao modelo de relatório.

    • Em tempo de design, definindo o atributo resourceBundle do objeto de modelo de relatório para o nome base do pacote de recursos de destino.

    • Uma associação dinâmica / tempo de execução pode ser feita fornecendo um objeto java.util.ResourceBundle como o valor para o parâmetro REPORT_RESOURCE_BUNDLE no momento do preenchimento do relatório.

    • Se o relatório precisar ser gerado em um local diferente do atual, o parâmetro integrado REPORT_LOCALE pode ser usado para especificar o local do tempo de execução ao preencher o relatório.

  • Para facilitar a internacionalização do relatório, uma sintaxe especial $R{}está disponível em expressões de relatório para fazer referência a recursos java.lang.String colocados em um objeto java.util.ResourceBundle associado ao relatório. o$R{} a sintaxe do caractere extrai o recurso específico do local do pacote de recursos com base na chave que deve ser colocada entre colchetes -

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

O campo de texto acima exibe o título do relatório, extraindo o valor String do pacote de recursos associado ao modelo de relatório com base no código do idioma fornecido pelo tempo de execução e na chave report.title .

  • Formatando mensagens em diferentes idiomas com base na localidade do relatório, há um método integrado nos relatórios net.sf.jasperreports.engine.fill.JRCalculator . Este método oferece funcionalidade semelhante à classe java.text.MessageFormat . Este método, msg (), possui três assinaturas convenientes que permitem que você use até três parâmetros de mensagem nas mensagens.

  • Um método str () integrado (o equivalente à sintaxe $ R {} dentro das expressões de relatório), que dá acesso ao conteúdo do pacote de recursos com base na localidade do relatório.

  • Para formatação de data e hora, o parâmetro interno REPORT_TIME_ZONE pode ser usado para garantir transformações de tempo adequadas.

  • Na saída gerada, a biblioteca mantém informações sobre a direção de execução do texto para que os documentos gerados em idiomas com escrita da direita para a esquerda (como árabe e hebraico) possam ser renderizados corretamente.

  • Se um aplicativo depende do visualizador Swing embutido para exibir os relatórios gerados, então ele precisa ser internacionalizado adaptando o botão Dicas de ferramentas ou outros textos exibidos. Isso é muito fácil de fazer, pois o visualizador depende de um pacote de recursos predefinido para extrair informações específicas do local. O nome de base para este pacote de recursos é net.sf.jasperreports.view.viewer.

Exemplo

Para demonstrar a internacionalização, vamos escrever um novo modelo de relatório (jasper_report_template.jrxml). O conteúdo do JRXML é fornecido a seguir. Salve-o no diretório 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>

No arquivo acima, o atributo resourceBundle do elemento <jasperReport> informa ao JasperReports onde obter as strings localizadas para usar no relatório. Precisamos criar um arquivo de propriedades com um nome raiz que corresponda ao valor do atributo. Este arquivo deve existir em qualquer lugar do CLASSPATH ao preencher o relatório. Neste exemplo, o arquivo de propriedadelocalizationdemo.properties é salvo no diretório C:\tools\jasperreports-5.0.1\test. O conteúdo deste arquivo é o seguinte -

localization.text1 = This is English text.

Para usar uma localidade diferente, o nome do arquivo deve ser localizationdemo [locale] .properties. Aqui, escreveremos um arquivo para o idioma espanhol. Salve este arquivo como -C:\tools\jasperreports-5.0.1\test\localizationdemo_es.properties. O conteúdo deste arquivo é o seguinte -

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

A sintaxe para obter o valor das propriedades resourceBundle é $ R {chave}.

Para permitir que JasperReports saiba qual localidade desejamos usar, precisamos atribuir um valor a um parâmetro interno. O nome desse parâmetro é definido como uma constante chamada REPORT_LOCALE, e essa constante é definida na classe net.sf.jasperreports.engine.JRParameter . O valor da constante deve ser uma instância de java.util.Locale . Essa lógica é incorporada ao código java para preencher e gerar o relatório. Vamos salvar este arquivoJasperReportFillI18.javapara o diretório C: \ tools \ jasperreports-5.0.1 \ test \ src \ com \ tutorialspoint. O conteúdo do arquivo é o seguinte -

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

   }
}

Geração de relatório

Vamos compilar e executar o arquivo acima usando nosso processo normal de construção ANT. O conteúdo do arquivo build.xml (salvo no diretório C: \ tools \ jasperreports-5.0.1 \ test) é fornecido a seguir.

O arquivo de importação - baseBuild.xml é obtido no capítulo Configuração do ambiente e deve ser colocado no mesmo diretório do 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>

A seguir, vamos abrir a janela da linha de comando e ir para o diretório onde build.xml está colocado. Finalmente, execute o comandoant -Dmain-class=com.tutorialspoint.JasperReportFillI18 (viewFullReport é o destino padrão) da seguinte forma -

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

Como resultado da compilação acima, uma janela JasperViewer é aberta conforme mostrado na tela abaixo -