Skip to content

5. Przykład 04 – Internacjonalizacja

Ten przykład nawiązuje do kwestii internacjonalizacji omówionej w pierwszym przykładzie.

5.1. Projekt NetBeans

Znajduje się w nim:

  • widok [Page1.JSP]
  • dwa pliki komunikatów [messages*.properties]
  • brak działań

5.2. Konfiguracja projektu

Plik [struts.xml] ma następującą treść:


<?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>
  <!-- internacjonalizacja -->
  <constant name="struts.custom.i18n.resources" value="messages" />
  <!-- pakiet domyślny -->
  <package name="default" namespace="/" extends="struts-default">
    <default-action-ref name="index" />
    <action name="index">
      <result type="redirectAction">
        <param name="actionName">Action1</param>
        <param name="namespace">/actions</param>
      </result>
    </action>
  </package>
  <!-- pakiet akcji -->
  <package name="actions" namespace="/actions" extends="struts-default">
    <action name="Action1">
      <result name="success">/vues/Page1.JSP</result>
    </action>
  </package>
</struts>
  • w wierszu 8 zdefiniowano stałą Struts, która określa nazwę pliku z komunikatami w wersji międzynarodowej, w tym przypadku messages. Pliki [messages_xx.properties] będą wyszukiwane w pliku ClassPath projektu. Z tego powodu zostały one umieszczone tutaj, w katalogu głównym [Source Packages] [1].
  • wiersze 21–23: definiują akcję [Action1] bez powiązanej klasy. Zostanie wówczas użyta domyślna klasa Struts, której metoda execute zwraca klucz success. Widok [/vues/Page1.JSP] zostanie następnie zwrócony do klienta. Należy pamiętać, że nie jest to to samo, co bezpośrednie wywołanie widoku [/vues/Page1.JSP]. Wywołanie akcji uruchamia bowiem interceptory, czego nie powoduje bezpośrednie wywołanie widoku. Jeden z interceptorów obsługuje internacjonalizację.

5.3. Pliki komunikatów

messages.properties


page.texte=Ici, on met un texte fran\u00e7ais...
page.titre1=Fran\u00e7ais
page.titre2=Fran\u00e7ais

messages_en.properties


page.texte=Here, we put some english text...
page.titre1=English
page.titre2=English

Określają one trzy klucze: page.texte, page.titre1, page.titre2. Plik [messages_en.properties] zostanie użyty, jeśli językiem strony jest angielski (en). Plik [messages.properties] będzie używany dla wszystkich pozostałych języków. Jest to domyślny plik komunikatów. Używany język to:

  • język przeglądarki klienta określony w jej ustawieniach przesłanych do serwera
  • język żądany w zapytaniu klienta z parametrem request_locale=xx.

5.4. Widok [Page1.JSP]

Widok wygląda następująco:


<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title><s:text name="page.titre1"/></title>
  </head>
  <body>
    <h1><s:text name="page.titre2"/></h1>
    <s:text name="page.texte"/>
  </body>
</html>
  • wiersz 7: wyświetla komunikat klucza page.titre1
  • wiersz 10: wyświetla komunikat o kluczu page.titre2
  • wiersz 11: wyświetla komunikat o kluczu page.texte

5.5. Testy

Uruchommy projekt:

  • w pliku [1] strona wyświetliła się w języku francuskim. Zastosowano plik [messages.properties], ponieważ w używanej przeglądarce jako język preferowany ustawiono francuski.
  • w pliku [3] strona wyświetliła się w języku angielskim. Zastosowano plik [messages_en.properties], ponieważ w pliku URL i [2] zastosowano parametr request_locale=en.

W przypadku pliku [4] żądana jest strona w języku niemieckim (de). Ponieważ nie istnieje plik [messages_de.properties], używany jest plik domyślny [messages.properties] [5].

W pliku [6] jako preferowany język przeglądarki ustawiono angielski.

W pliku [7] akcja [Action1] jest wywoływana bez parametrów językowych. Żądanie pochodzi z przeglądarki, której preferowanym językiem jest angielski (en). W związku z tym wykorzystywany jest plik [messages_en.properties] zamiast [8].

Od tej pory wszystkie projekty będą miały jeden plik [messages.properties], który będzie używany dla wszystkich języków. Będzie to wymagało od nas napisania widoków wykorzystujących klucze z tego pliku. Internacjonalizacja na język angielski będzie polegała na utworzeniu pliku [messages_en.properties] zawierającego komunikaty w języku angielskim. Nie ma potrzeby wprowadzania żadnych innych zmian.