Struts2 本地化/國(guó)際化(i18n)

2022-07-08 11:35 更新

國(guó)際化(i18n)是規(guī)劃和實(shí)施產(chǎn)品和服務(wù)以便更好地適應(yīng)特定的當(dāng)?shù)卣Z(yǔ)言和文化的過(guò)程,也就是本地化過(guò)程,而國(guó)際化過(guò)程有時(shí)也被稱為翻譯或本地化實(shí)現(xiàn)。國(guó)際化縮寫為i18n,單詞以i開(kāi)頭,以n結(jié)尾,是因?yàn)樵诘谝粋€(gè)i和最后一個(gè)n之間有18個(gè)字符。
Struts2使用bundle資源束、攔截器和標(biāo)簽庫(kù)提供本地化,即國(guó)際化(i18n)支持,主要用在以下幾個(gè)地方:

  • UI標(biāo)簽

  • 信息和錯(cuò)誤。

  • Action類。

資源束

Struts2使用資源束為Web應(yīng)用程序的用戶提供多種語(yǔ)言和區(qū)域的設(shè)置選項(xiàng)。你不必?fù)?dān)心需要用不同的語(yǔ)言編寫頁(yè)面,你需要做的只是為每種你想要的語(yǔ)言創(chuàng)建一個(gè)資源束。資源束將包含用戶語(yǔ)言中的標(biāo)題,消息和其他文本,是包含應(yīng)用程序默認(rèn)語(yǔ)言的一對(duì)key/value的文件。
資源文件最簡(jiǎn)單的命名格式是:

bundlename_language_country.properties

這里的bundlename可以是ActionClass,Interface,SuperClass,Model,Package,Global資源屬性。下一部分language_country表示國(guó)家區(qū)域設(shè)置,例如西班牙語(yǔ)(西班牙)區(qū)域設(shè)置由es_ES表示,英語(yǔ)(美國(guó))區(qū)域設(shè)置由en_US表示等。這里先跳過(guò)可選國(guó)家的部分。
當(dāng)你通過(guò)key引用消息元素時(shí),Struts框架按以下順序搜索相應(yīng)的信息束:

  • ActionClass.properties

  • Interface.properties

  • SuperClass.properties

  • model.properties

  • package.properties

  • struts.properties

  • global.properties

要以多種語(yǔ)言開(kāi)發(fā)應(yīng)用程序,你必須維護(hù)與這些語(yǔ)言/區(qū)域設(shè)置對(duì)應(yīng)的多個(gè)屬性文件,并根據(jù)每對(duì)key/value定義所有內(nèi)容。例如,如果你要開(kāi)發(fā)美國(guó)英語(yǔ)(默認(rèn)),西班牙語(yǔ)和法語(yǔ)的應(yīng)用程序,必須創(chuàng)建三個(gè)屬性文件。這里我們將使用global.properties文件,你也可以使用不同的屬性文件來(lái)分離不同類型的信息。

  • global.properties:默認(rèn)情況下使用英語(yǔ)(美國(guó))

  • global_fr.properties:這將用于法語(yǔ)環(huán)境。

  • global_es.properties:這將用于西班牙語(yǔ)環(huán)境。

訪問(wèn)信息

有幾種方法來(lái)訪問(wèn)信息資源,包括getText,text標(biāo)簽,UI標(biāo)簽的key屬性和i18n標(biāo)簽。接下來(lái)讓我們簡(jiǎn)要了解一下:

顯示i18n文本,需在property標(biāo)簽或其他任何標(biāo)簽(如UI標(biāo)簽)中調(diào)用getText,如下所示:

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

text標(biāo)簽從默認(rèn)資源束(即struts.properties)中檢索信息:

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

i18n標(biāo)簽會(huì)將任意資源束推送到值棧,而i18n標(biāo)簽內(nèi)的其他標(biāo)簽可以顯示來(lái)自該資源束的信息:

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

大多數(shù)UI標(biāo)簽的key屬性可用于從資源束檢索信息:

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

本地化示例

現(xiàn)在,讓我們用多種語(yǔ)言創(chuàng)建前一章中的index.jsp文件,如下所示:

<%@ 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>

現(xiàn)在創(chuàng)建success.jsp文件,這個(gè)文件在action返回SUCCESS結(jié)果的情況下會(huì)被調(diào)用。

<%@ 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>

這里我們需要?jiǎng)?chuàng)建以下兩個(gè)action。(a)第一個(gè)action處理區(qū)域設(shè)置并顯示使用不同語(yǔ)言的同一個(gè)index.jsp文件;(b)另一個(gè)action是負(fù)責(zé)提交表單本身。這兩個(gè)action都將返回SUCCESS,但我們將根據(jù)返回值采取不同的action,因?yàn)檫@兩個(gè)action的目的是不同的:

區(qū)域設(shè)置Action

package cn.w3cschool.struts2;

import com.opensymphony.xwork2.ActionSupport;

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

提交表單Action

package cn.w3cschool.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;
   }
}

現(xiàn)在,讓我們創(chuàng)建以下三個(gè)global.properties文件并放入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'age
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

我們接著創(chuàng)建包含兩個(gè)action的struts.xml文件,如下所示:

<?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="cn.w3cschool.struts2.Employee"
         method="execute">
         <result name="input">/index.jsp</result>
         <result name="success">/success.jsp</result>
      </action>
      
      <action name="locale" 
         class="cn.w3cschool.struts2.Locale"
         method="execute">
         <result name="success">/index.jsp</result>
      </action>
   </package>

</struts>

以下是web.xml文件的內(nèi)容:

<?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>

現(xiàn)在,右鍵單擊項(xiàng)目名稱,然后單擊“Export”> “WAR File”以創(chuàng)建WAR文件。然后在Tomcat的webapps目錄中部署WAR文件。最后,啟動(dòng)Tomcat服務(wù)器并嘗試訪問(wèn)URL http://localhost:8080/HelloWorldStruts2/index.jsp,將顯示以下界面:

英語(yǔ)輸出

現(xiàn)在可選擇任意語(yǔ)言,如果選擇西班牙語(yǔ),會(huì)顯示以下結(jié)果:

西班牙輸出

你也可以嘗試用法語(yǔ)。最后,點(diǎn)擊Submit按鈕,當(dāng)在西班牙語(yǔ)環(huán)境時(shí),會(huì)顯示以下界面:

成功

恭喜,你現(xiàn)在有了多語(yǔ)言的網(wǎng)頁(yè),可以在嘗試在全球推送你的網(wǎng)站。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)