Struts2 - Bản địa hóa, quốc tế hóa (i18n)

Quốc tế hóa (i18n) là quá trình lập kế hoạch và thực hiện các sản phẩm và dịch vụ để chúng có thể dễ dàng thích ứng với các ngôn ngữ và văn hóa địa phương cụ thể, một quá trình được gọi là bản địa hóa. Quá trình quốc tế hóa được gọi là hỗ trợ dịch thuật hoặc bản địa hóa.

Internationalization được viết tắt i18n bởi vì từ bắt đầu bằng chữ cái “i” và kết thúc bằng “n”, và có 18 ký tự giữa i đầu tiên và n cuối cùng.

Struts2 cung cấp hỗ trợ bản địa hóa, tức là quốc tế hóa (i18n) thông qua các gói tài nguyên, bộ chặn và thư viện thẻ ở những nơi sau:

  • Thẻ giao diện người dùng

  • Tin nhắn và lỗi.

  • Trong các lớp hành động.

Gói tài nguyên

Struts2 sử dụng các gói tài nguyên để cung cấp nhiều tùy chọn ngôn ngữ và địa phương cho người dùng ứng dụng web. Bạn không cần phải lo lắng về việc viết các trang bằng các ngôn ngữ khác nhau. Tất cả những gì bạn phải làm là tạo một gói tài nguyên cho từng ngôn ngữ mà bạn muốn. Các gói tài nguyên sẽ chứa tiêu đề, tin nhắn và văn bản khác bằng ngôn ngữ của người dùng của bạn. Gói tài nguyên là tệp chứa các cặp khóa / giá trị cho ngôn ngữ mặc định của ứng dụng của bạn.

Định dạng đặt tên đơn giản nhất cho tệp tài nguyên là:

bundlename_language_country.properties

Đây, bundlenamecó thể là ActionClass, Interface, SuperClass, Model, Package, Global resource. Phần tiếp theolanguage_country đại diện cho ngôn ngữ quốc gia, ví dụ: ngôn ngữ Tây Ban Nha (Tây Ban Nha) được biểu thị bằng es_ES và ngôn ngữ tiếng Anh (Hoa Kỳ) được biểu thị bằng en_US, v.v. nơi bạn có thể bỏ qua phần quốc gia là tùy chọn.

Khi bạn tham chiếu đến một phần tử thông báo bằng khóa của nó, khung Struts sẽ tìm kiếm một gói thông báo tương ứng theo thứ tự sau:

  • ActionClass.properties
  • Interface.properties
  • SuperClass.properties
  • model.properties
  • package.properties
  • struts.properties
  • global.properties

Để phát triển ứng dụng của bạn bằng nhiều ngôn ngữ, bạn nên duy trì nhiều tệp thuộc tính tương ứng với các ngôn ngữ / miền địa phương đó và xác định tất cả nội dung theo các cặp khóa / giá trị.

Ví dụ: nếu bạn định phát triển ứng dụng của mình cho tiếng Anh Mỹ (Mặc định), tiếng Tây Ban Nha và tiếng Pháp, thì bạn sẽ phải tạo ba tệp thuộc tính. Ở đây tôi sẽ sử dụngglobal.properties chỉ tệp, bạn cũng có thể sử dụng các tệp thuộc tính khác nhau để tách các loại thông báo khác nhau.

  • global.properties - Theo mặc định tiếng Anh (Hoa Kỳ) sẽ được áp dụng

  • global_fr.properties - Điều này sẽ được sử dụng cho ngôn ngữ Franch.

  • global_es.properties - Điều này sẽ được sử dụng cho ngôn ngữ Tây Ban Nha.

Truy cập tin nhắn

Có một số cách để truy cập các tài nguyên thông báo, bao gồm getText, thẻ văn bản, thuộc tính khóa của thẻ giao diện người dùng và thẻ i18n. Hãy để chúng tôi xem chúng một cách ngắn gọn -

Để hiển thị i18n nhắn tin, sử dụng cuộc gọi tới getText trong thẻ thuộc tính hoặc bất kỳ thẻ nào khác, chẳng hạn như các thẻ giao diện người dùng như sau:

<s:property value = "getText('some.key')" />

Các text tag lấy một thông báo từ gói tài nguyên mặc định, tức là, struts.properties

<s:text name = "some.key" />

Các i18n tagđẩy một gói tài nguyên tùy ý vào ngăn xếp giá trị. Các thẻ khác trong phạm vi của thẻ i18n có thể hiển thị thông báo từ gói tài nguyên đó−

<s:i18n name = "some.package.bundle">
   <s:text name = "some.key" />
</s:i18n>

Các key thuộc tính của hầu hết các thẻ giao diện người dùng có thể được sử dụng để tạo thông báo từ một gói tài nguyên -

<s:textfield key = "some.key" name = "textfieldName"/>

Ví dụ về bản địa hóa

Hãy để chúng tôi nhắm mục tiêu để tạo index.jsptừ chương trước bằng nhiều ngôn ngữ. Tệp tương tự sẽ được viết như sau:

<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
   pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
"http://www.w3.org/TR/html4/loose.dtd">

<html>
   <head>
      <title>Employee Form with Multilingual Support</title>
   </head>

   <body>
      <h1><s:text name = "global.heading"/></h1>

      <s:url id = "indexEN" namespace="/" action = "locale" >
         <s:param name = "request_locale" >en</s:param>
      </s:url>
      
      <s:url id = "indexES" namespace="/" action = "locale" >
         <s:param name = "request_locale" >es</s:param>
      </s:url>
      
      <s:url id = "indexFR" namespace="/" action = "locale" >
         <s:param name = "request_locale" >fr</s:param>
      </s:url>

      <s:a href="%{indexEN}" >English</s:a>
      <s:a href="%{indexES}" >Spanish</s:a>
      <s:a href="%{indexFR}" >France</s:a>

      <s:form action = "empinfo" method = "post" namespace = "/">
         <s:textfield name = "name" key = "global.name" size = "20" />
         <s:textfield name = "age" key = "global.age" size = "20" />
         <s:submit name = "submit" key = "global.submit" />
      </s:form>

   </body>
</html>

Chúng tôi sẽ tạo success.jsp tệp sẽ được gọi trong trường hợp trả về hành động đã xác định SUCCESS.

<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
	pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
   "http://www.w3.org/TR/html4/loose.dtd">

<html>
   <head>
      <title>Success</title>
   </head>
   
   <body>
      <s:property value = "getText('global.success')" />
   </body>
</html>

Ở đây chúng ta sẽ cần tạo hai hành động sau. (a) Hành động đầu tiên a để quản lý Ngôn ngữ và hiển thị cùng một tệp index.jsp với ngôn ngữ khác (b) Một hành động khác là chăm sóc chính biểu mẫu gửi. Cả hai hành động sẽ trả về THÀNH CÔNG, nhưng chúng tôi sẽ thực hiện các hành động khác nhau dựa trên các giá trị trả về vì mục đích của chúng tôi khác nhau đối với cả hai hành động

Hành động chăm sóc Locale

package com.tutorialspoint.struts2;

import com.opensymphony.xwork2.ActionSupport;

public class Locale extends ActionSupport {
   public String execute() {
       return SUCCESS;
   }
}

Hành động để gửi biểu mẫu

package com.tutorialspoint.struts2;

import com.opensymphony.xwork2.ActionSupport;

public class Employee extends ActionSupport{
   private String name;
   private int age;
   
   public String execute() {
      return SUCCESS;
   }
   
   public String getName() {
      return name;
   }
   
   public void setName(String name) {
      this.name = name;
   }
   
   public int getAge() {
      return age;
   }
   
   public void setAge(int age) {
      this.age = age;
   }
}

Bây giờ chúng ta hãy tạo ba global.properties các tập tin và đưa vào CLASSPATH -

global.properties

global.name = Name
global.age = Age
global.submit = Submit
global.heading = Select Locale
global.success = Successfully authenticated

global_fr.properties

global.name = Nom d'utilisateur 
global.age = l'âge
global.submit = Soumettre des
global.heading = Sé lectionnez Local
global.success = Authentifi	é  avec succès

global_es.properties

global.name = Nombre de usuario
global.age = Edad
global.submit = Presentar
global.heading = seleccionar la configuracion regional
global.success = Autenticado correctamente

Chúng tôi sẽ tạo ra struts.xml với hai hành động như sau:

<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
   "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
   "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
   <constant name = "struts.devMode" value = "true" />
   <constant name = "struts.custom.i18n.resources" value = "global" />
   <package name = "helloworld" extends = "struts-default" namespace="/">
      <action name = "empinfo" 
         class = "com.tutorialspoint.struts2.Employee"
         method = "execute">
         <result name = "input">/index.jsp</result>
         <result name = "success">/success.jsp</result>
      </action>
      
      <action name = "locale" 
         class = "com.tutorialspoint.struts2.Locale"
         method = "execute">
         <result name = "success">/index.jsp</result>
      </action>
   </package>

</struts>

Sau đây là nội dung của web.xml tập tin -

<?xml version = "1.0" Encoding = "UTF-8"?>
<web-app xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xmlns = "http://java.sun.com/xml/ns/javaee"
   xmlns:web = "http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
   xsi:schemaLocation = "http://java.sun.com/xml/ns/javaee
   http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
   id = "WebApp_ID" version = "3.0">

   <display-name>Struts 2</display-name>
   <welcome-file-list>
      <welcome-file>index.jsp</welcome-file>
   </welcome-file-list>

   <filter>
      <filter-name>struts2</filter-name>
      <filter-class>
         org.apache.struts2.dispatcher.FilterDispatcher
      </filter-class>
   </filter>

   <filter-mapping>
      <filter-name>struts2</filter-name>
      <url-pattern>/*</url-pattern>
   </filter-mapping>
</web-app>

Bây giờ, nhấp chuột phải vào tên dự án và nhấp vào Export > WAR Fileđể tạo tệp Chiến tranh. Sau đó, triển khai WAR này trong thư mục ứng dụng web của Tomcat. Cuối cùng, khởi động máy chủ Tomcat và cố gắng truy cập URLhttp://localhost:8080/HelloWorldStruts2/index.jsp. Điều này sẽ tạo ra màn hình sau:

Bây giờ hãy chọn bất kỳ ngôn ngữ nào, giả sử chúng tôi chọn Spanish, nó sẽ hiển thị kết quả sau:

Bạn cũng có thể thử với ngôn ngữ Pháp. Cuối cùng, chúng ta hãy thử nhấp vàoSubmit khi chúng ta đang ở Ngôn ngữ Tây Ban Nha, nó sẽ hiển thị màn hình sau:

Xin chúc mừng, bây giờ bạn có một trang web đa ngôn ngữ, bạn có thể khởi chạy trang web của mình trên toàn cầu.