Skip to content

5. Приклад 04 — Інтернаціоналізація

Цей приклад повертається до теми інтернаціоналізації, розглянутої в першому прикладі.

5.1. Проєкт NetBeans

У ньому міститься:

  • представлення [Page1.JSP]
  • два файли повідомлень [messages*.properties]
  • відсутні дії

5.2. Конфігурація проєкту

Файл [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.custom.i18n.resources" value="messages" />
  <!-- пакет за замовчуванням -->
  <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>
  <!-- пакет дій -->
  <package name="actions" namespace="/actions" extends="struts-default">
    <action name="Action1">
      <result name="success">/vues/Page1.JSP</result>
    </action>
  </package>
</struts>
  • у рядку 8 визначено константу Struts, яка встановлює ім’я файлу інтернаціоналізованих повідомлень, у даному випадку messages. Файли [messages_xx.properties] будуть шукатися у ClassPath цього проєкту. З цієї причини їх розміщено тут, у кореневому каталозі [Source Packages] [1].
  • рядки 21–23: визначають дію [Action1] без пов’язаного класу. У цьому випадку буде використано клас Struts за замовчуванням, метод якого execute повертає ключ success. Після цього клієнту буде повернуто представлення [/vues/Page1.JSP]. Важливо розуміти, що це не те саме, що прямий виклик представлення [/vues/Page1.JSP]. Адже виклик дії запускає виконання перехоплювачів, чого не відбувається при прямому виклику подання. Один із перехоплювачів відповідає за інтернаціоналізацію.

5.3. Файли повідомлень

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

Вони визначають три ключі: page.texte, page.titre1, page.titre2. Файл [messages_en.properties] буде використовуватися, якщо мовою сторінки є англійська (en). Файл [messages.properties] використовуватиметься для всіх інших мов. Це файл повідомлень за замовчуванням. Використовується мова:

  • мова браузера клієнта, вказана в налаштуваннях, надісланих на сервер,
  • та, що запитується у запиті клієнта з параметром request_locale=xx.

5.4. Вигляд [Page1.JSP]

Вигляд такий:


<%@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>
  • рядок 7: відображає повідомлення про ключ page.titre1
  • рядок 10: відображає повідомлення з ключем page.titre2
  • рядок 11: відображає повідомлення про ключ page.texte

5.5. Тестування

Запустимо проект:

  • у [1] сторінка відобразилася французькою мовою. Був використаний файл [messages.properties], оскільки у налаштуваннях браузера французька мова була вказана як пріоритетна.
  • у [3] сторінка відобразилася англійською мовою. Був використаний файл [messages_en.properties], оскільки URL [2] використовував параметр request_locale=en.

У файлі [4] запитується сторінка німецькою мовою (de). Оскільки файлу [messages_de.properties] не існує, використовується файл за замовчуванням [messages.properties] [5].

У файлі [6] англійська мова вказана як пріоритетна для браузера.

У [7] запит на дію [Action1] надходить без мовних параметрів. Запит надходить із браузера, для якого англійська (en) є мовою за замовчуванням. Тому використовується файл [messages_en.properties] замість [8].

Відтепер усі проєкти матимуть єдиний файл [messages.properties], який використовуватиметься для всіх мов. Це змусить нас писати подання, що використовують ключі з цього файлу. Інтернаціоналізація англійською мовою зводитиметься до створення файлу [messages_en.properties] з англійськими повідомленнями. Інших змін робити не потрібно.