Struts2 - Lokalisierung, Internationalisierung (i18n)

Internationalisierung (i18n) ist der Prozess der Planung und Implementierung von Produkten und Dienstleistungen, damit diese leicht an bestimmte lokale Sprachen und Kulturen angepasst werden können. Dieser Prozess wird als Lokalisierung bezeichnet. Der Internationalisierungsprozess wird als Übersetzungs- oder Lokalisierungsaktivierung bezeichnet.

Internationalisierung wird abgekürzt i18n weil das Wort mit dem Buchstaben beginnt “i” und endet mit “n”und es gibt 18 Zeichen zwischen dem ersten i und dem letzten n.

Struts2 bietet Lokalisierung, dh Unterstützung der Internationalisierung (i18n) durch Ressourcenpakete, Interceptors und Tag-Bibliotheken an folgenden Stellen:

  • Die UI-Tags

  • Meldungen und Fehler.

  • Innerhalb von Aktionsklassen.

Ressourcenpakete

Struts2 verwendet Ressourcenpakete, um den Benutzern der Webanwendung mehrere Sprach- und Gebietsschemaoptionen bereitzustellen. Sie müssen sich keine Gedanken über das Schreiben von Seiten in verschiedenen Sprachen machen. Sie müssen lediglich ein Ressourcenpaket für jede gewünschte Sprache erstellen. Die Ressourcenpakete enthalten Titel, Nachrichten und anderen Text in der Sprache Ihres Benutzers. Ressourcenpakete sind die Datei, die die Schlüssel / Wert-Paare für die Standardsprache Ihrer Anwendung enthält.

Das einfachste Namensformat für eine Ressourcendatei ist -

bundlename_language_country.properties

Hier, bundlenameDies können ActionClass-, Interface-, SuperClass-, Modell-, Paket- und globale Ressourceneigenschaften sein. Nächster Teillanguage_country stellt beispielsweise das Gebietsschema des Landes dar, das Gebietsschema Spanisch (Spanien) wird durch es_ES dargestellt, und das Gebietsschema Englisch (USA) wird durch en_US usw. dargestellt, wobei Sie den optionalen Landesteil überspringen können.

Wenn Sie ein Nachrichtenelement anhand seines Schlüssels referenzieren, sucht das Struts-Framework in der folgenden Reihenfolge nach einem entsprechenden Nachrichtenpaket:

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

Um Ihre Anwendung in mehreren Sprachen zu entwickeln, sollten Sie mehrere Eigenschaftendateien verwalten, die diesen Sprachen / Gebietsschemas entsprechen, und den gesamten Inhalt in Form von Schlüssel / Wert-Paaren definieren.

Wenn Sie beispielsweise Ihre Anwendung für US-Englisch (Standard), Spanisch und Französisch entwickeln möchten, müssen Sie drei Eigenschaftendateien erstellen. Hier werde ich verwendenglobal.properties Nur Datei, Sie können auch verschiedene Eigenschaftendateien verwenden, um verschiedene Arten von Nachrichten zu trennen.

  • global.properties - Standardmäßig wird Englisch (USA) angewendet

  • global_fr.properties - Dies wird für das Gebietsschema Franch verwendet.

  • global_es.properties - Dies wird für das spanische Gebietsschema verwendet.

Greifen Sie auf die Nachrichten zu

Es gibt verschiedene Möglichkeiten, auf die Nachrichtenressourcen zuzugreifen, darunter getText, das Text-Tag, das Schlüsselattribut der UI-Tags und das i18n-Tag. Lassen Sie uns sie kurz sehen -

Anzeigen i18n Text, verwenden Sie einen Anruf an getText im Eigenschaftstag oder einem anderen Tag, z. B. den UI-Tags, wie folgt:

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

Das text tag Ruft eine Nachricht aus dem Standardressourcenpaket ab, dh struts.properties

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

Das i18n tagschiebt ein beliebiges Ressourcenbündel auf den Wertestapel. Andere Tags im Bereich des i18n-Tags können Nachrichten aus diesem Ressourcenpaket anzeigen

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

Das key Das Attribut der meisten UI-Tags kann verwendet werden, um eine Nachricht aus einem Ressourcenpaket zu generieren.

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

Lokalisierungsbeispiel

Lassen Sie uns zielen, um zu schaffen index.jspaus dem vorherigen Kapitel in mehreren Sprachen. Dieselbe Datei würde wie folgt geschrieben werden:

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

Wir werden schaffen success.jsp Datei, die aufgerufen wird, falls eine definierte Aktion zurückgegeben wird 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>

Hier müssten wir die folgenden zwei Aktionen erstellen. (a) Erste Aktion a, um sich um das Gebietsschema zu kümmern und dieselbe index.jsp-Datei in einer anderen Sprache anzuzeigen. (b) Eine andere Aktion besteht darin, sich um das Absenden des Formulars selbst zu kümmern. Beide Aktionen geben SUCCESS zurück, aber wir werden unterschiedliche Aktionen basierend auf den Rückgabewerten ausführen, da unser Zweck für beide Aktionen unterschiedlich ist

Aktion zur Pflege des Gebietsschemas

package com.tutorialspoint.struts2;

import com.opensymphony.xwork2.ActionSupport;

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

Aktion zum Senden des Formulars

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

Lassen Sie uns nun die folgenden drei erstellen global.properties Dateien und legen Sie die in 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

Wir werden unsere schaffen struts.xml mit zwei Aktionen wie folgt -

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

Es folgt der Inhalt von web.xml Datei -

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

Klicken Sie nun mit der rechten Maustaste auf den Projektnamen und klicken Sie auf Export > WAR Fileum eine War-Datei zu erstellen. Stellen Sie diese WAR dann im Webanwendungsverzeichnis von Tomcat bereit. Starten Sie abschließend den Tomcat-Server und versuchen Sie, auf die URL zuzugreifenhttp://localhost:8080/HelloWorldStruts2/index.jsp. Daraufhin wird der folgende Bildschirm angezeigt:

Wählen Sie nun eine der Sprachen aus, sagen wir, wir wählen Spanishwürde es das folgende Ergebnis anzeigen -

Sie können es auch mit französischer Sprache versuchen. Lassen Sie uns zum Schluss versuchen, zu klickenSubmit Wenn wir uns im spanischen Gebietsschema befinden, wird der folgende Bildschirm angezeigt:

Herzlichen Glückwunsch, jetzt haben Sie eine mehrsprachige Webseite, auf der Sie Ihre Website global starten können.