JasperReports - Quốc tế hóa

Đôi khi, chúng tôi cần báo cáo bằng các ngôn ngữ khác nhau. Viết cùng một báo cáo cho mỗi ngôn ngữ khác nhau ngụ ý rất nhiều công việc thừa. Chỉ các phần văn bản khác nhau giữa các ngôn ngữ mới nên được viết riêng và được tải vào các phần tử văn bản trong thời gian chạy, tùy thuộc vào cài đặt ngôn ngữ. Đây là mục đích của việc quốc tế hóa báo cáo. Các báo cáo quốc tế hóa, một khi được viết ra có thể chạy ở mọi nơi

Trong các bước sau, chúng tôi đã liệt kê cách tạo báo cáo bằng các ngôn ngữ khác nhau và một số tính năng khác của quốc tế hóa báo cáo -

  • Liên kết gói tài nguyên java.util.ResourceBundle với mẫu báo cáo. Có hai cách để liên kết đối tượng java.util.ResourceBundle với mẫu báo cáo.

    • Tại thời điểm thiết kế, bằng cách đặt thuộc tính resourceBundle của đối tượng mẫu báo cáo thành tên cơ sở của gói tài nguyên đích.

    • Có thể tạo liên kết động / thời gian chạy bằng cách cung cấp đối tượng java.util.ResourceBundle làm giá trị cho thông số REPORT_RESOURCE_BUNDLE tại thời điểm điền báo cáo.

    • Nếu báo cáo cần được tạo bằng ngôn ngữ khác với ngôn ngữ hiện tại, tham số REPORT_LOCALE tích hợp có thể được sử dụng để chỉ định ngôn ngữ thời gian chạy khi điền báo cáo.

  • Để hỗ trợ quốc tế hóa báo cáo, một cú pháp đặc biệt $R{}có sẵn bên trong các biểu thức báo cáo để tham chiếu tài nguyên java.lang.String được đặt bên trong đối tượng java.util.ResourceBundle được liên kết với báo cáo. Các$R{} cú pháp ký tự trích xuất tài nguyên theo ngôn ngữ cụ thể từ gói tài nguyên dựa trên khóa phải được đặt giữa dấu ngoặc -

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

Trường văn bản ở trên hiển thị tiêu đề của báo cáo bằng cách trích xuất giá trị Chuỗi từ gói tài nguyên được liên kết với mẫu báo cáo dựa trên ngôn ngữ thời gian được áp dụng và khóa report.title .

  • Định dạng thông báo bằng các ngôn ngữ khác nhau dựa trên ngôn ngữ báo cáo, có một phương pháp tích hợp bên trong net.sf.jasperreports.engine.fill.JRCalculator báo cáo . Phương thức này cung cấp chức năng tương tự như lớp java.text.MessageFormat . Phương thức này, msg (), có ba chữ ký thuận tiện cho phép bạn sử dụng tối đa ba tham số thông báo trong thông báo.

  • Một built-in str () phương pháp (tương đương với $ R {} cú pháp bên trong biểu báo cáo), mà cho phép truy cập đến nội dung bó tài nguyên dựa trên ngôn ngữ báo cáo.

  • Đối với định dạng ngày và giờ, thông số REPORT_TIME_ZONE tích hợp có thể được sử dụng để đảm bảo biến đổi thời gian thích hợp.

  • Trong đầu ra được tạo, thư viện lưu giữ thông tin về hướng chạy văn bản để các tài liệu được tạo bằng các ngôn ngữ có cách viết từ phải sang trái (như tiếng Ả Rập và tiếng Do Thái) có thể được hiển thị đúng cách.

  • Nếu một ứng dụng dựa vào trình xem Swing tích hợp để hiển thị các báo cáo đã tạo, thì ứng dụng đó cần được quốc tế hóa bằng cách điều chỉnh nút ToolTips hoặc các văn bản khác được hiển thị. Điều này rất dễ thực hiện vì người xem dựa vào gói tài nguyên được xác định trước để trích xuất thông tin theo ngôn ngữ cụ thể. Tên cơ sở cho gói tài nguyên này là net.sf.jasperreports.view.viewer.

Thí dụ

Để thể hiện tính quốc tế hóa, hãy viết mẫu báo cáo mới (jasper_report_template.jrxml). Nội dung của JRXML như dưới đây. Lưu nó vào thư mục 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>

Trong tệp ở trên, thuộc tính resourceBundle của phần tử <jasperReport> cho JasperReports biết nơi lấy các chuỗi được bản địa hóa để sử dụng cho báo cáo. Chúng ta cần tạo một tệp thuộc tính có tên gốc phù hợp với giá trị của thuộc tính. Tệp này phải tồn tại ở bất kỳ đâu trong CLASSPATH khi điền vào báo cáo. Trong ví dụ này, tệp thuộc tínhlocalizationdemo.properties được lưu trong thư mục C:\tools\jasperreports-5.0.1\test. Nội dung của tệp này như sau:

localization.text1 = This is English text.

Để sử dụng một ngôn ngữ khác, tên của tệp phải là localizationdemo [locale] .properties. Ở đây, chúng tôi sẽ viết một tệp cho ngôn ngữ Tây Ban Nha. Lưu tệp này dưới dạng -C:\tools\jasperreports-5.0.1\test\localizationdemo_es.properties. Nội dung của tệp này như sau:

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

Cú pháp để lấy giá trị cho các thuộc tính resourceBundle là $ R {key}.

Để cho JasperReports biết ngôn ngữ chúng ta muốn sử dụng, chúng ta cần gán một giá trị cho một tham số tích hợp sẵn. Tên của tham số này được định nghĩa là một hằng số được gọi là REPORT_LOCALE và hằng số này được định nghĩa trong lớp net.sf.jasperreports.engine.JRParameter . Giá trị của hằng số phải là một phiên bản của java.util.Locale . Logic này được kết hợp trong mã java để điền và tạo báo cáo. Hãy lưu tệp nàyJasperReportFillI18.javavào thư mục C: \ tools \ jasperreports-5.0.1 \ test \ src \ com \ tutorialspoint. Nội dung của tệp như sau:

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

   }
}

Tạo báo cáo

Chúng tôi sẽ biên dịch và thực thi tệp trên bằng quy trình xây dựng ANT thông thường của chúng tôi. Nội dung của tệp build.xml (được lưu trong thư mục C: \ tools \ jasperreports-5.0.1 \ test) như dưới đây.

Tệp nhập - baseBuild.xml được chọn từ chương Thiết lập môi trường và phải được đặt trong cùng thư mục với 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>

Tiếp theo, hãy mở cửa sổ dòng lệnh và đi đến thư mục nơi build.xml được đặt. Cuối cùng, thực hiện lệnhant -Dmain-class=com.tutorialspoint.JasperReportFillI18 (viewFullReport là mục tiêu mặc định) như sau:

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

Kết quả của quá trình biên dịch ở trên, một cửa sổ JasperViewer mở ra như được hiển thị trong màn hình dưới đây: