Как интернационализировать веб-приложение на Java?

Я узнал от Google, что интернационализация - это процесс, с помощью которого я могу настроить свое веб-приложение на использование всех языков. Я хочу понять Unicode для процесса интернационализации, поэтому я узнал о Unicode здесь и там.

Я могу понять, что такое Юникод, как набор символов, закодированный в байтах, и снова байты, декодированные в кодировку. Но я не знаю, как двигаться дальше. Я хочу научиться сравнивать строки и мне нужно знать, как реализовать интернационализацию в моем веб-приложении. Любые предложения, пожалуйста? Пожалуйста, ведите меня.

Моя цель:

Моя главная цель - разработать веб-приложение для перевода (с английского на арабский и наоборот). Я хочу следить за интернационализацией. Я хочу запустить свое веб-приложение для перевода во всех трех браузерах, а именно: FF, Chrome, IE. Как мне этого добиться?

3 ответа

Решение

В случае базового веб-приложения JSP/Servlet основным подходом будет использование JSTL fmt taglib в сочетании с пакетами ресурсов. Пакеты ресурсов содержат пары ключ-значение, где ключ является константой, которая одинакова для всех языков, и значение отличается для каждого языка. Пакеты ресурсов обычно представляют собой файлы свойств, которые загружаются ResourceBundle API. Однако это можно настроить так, чтобы вы могли загружать пары ключ-значение, например, из базы данных.

Вот пример того, как интернационализировать форму входа вашего веб-приложения с помощью пакетов ресурсов на основе файла свойств.


  1. Создайте следующие файлы и поместите их в какой-нибудь пакет, например com.example.i18n (в случае Maven, поместите их в структуру пакета внутри src/main/resources).

    text.properties (содержит пары ключ-значение на языке по умолчанию, обычно на английском)

    login.label.username = Имя пользователя
    login.label.password = пароль
    login.button.submit = Войти
    

    text_nl.properties (содержит голландский (nl) пары ключ-значение)

    login.label.username = Gebruikersnaam
    login.label.password = Wachtwoord
    login.button.submit = Inloggen
    

    text_es.properties (содержит испанский (es) пары ключ-значение)

    login.label.username = Nombre de usuario
    login.label.password = Contraseña
    login.button.submit = Acceder
    

    Имя файла пакета ресурсов должно соответствовать следующему шаблону name_ll_CC.properties, _ll часть должна быть в нижнем регистре языкового кода ISO 693-1. Это необязательно и требуется только тогда, когда _CC часть присутствует. _CC часть должна быть в верхнем регистре ISO 3166-1 Альфа-2 код страны. Это не обязательно и часто используется только для разграничения языковых диалектов, специфичных для страны, например, американский английский (_en_US) и британский английский (_en_GB).


  2. Если это еще не сделано, установите JSTL. Если вы работаете в контейнере Servlet 2.5 или новее (Tomcat 6.0 и т. Д.) И ваш web.xml объявляется в соответствии со спецификацией Servlet 2.5, затем просто поместите jstl-1.2.jar в веб-приложение /WEB-INF/lib папка.


  3. Создайте следующий пример JSP-файла и поместите его в папку веб-материалов.

    login.jsp

    <%@ page pageEncoding="UTF-8" %>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
    <c:set var="language" value="${not empty param.language ? param.language : not empty language ? language : pageContext.request.locale}" scope="session" />
    <fmt:setLocale value="${language}" />
    <fmt:setBundle basename="com.example.i18n.text" />
    <!DOCTYPE html>
    <html lang="${language}">
        <head>
            <title>JSP/JSTL i18n demo</title>
        </head>
        <body>
            <form>
                <select id="language" name="language" onchange="submit()">
                    <option value="en" ${language == 'en' ? 'selected' : ''}>English</option>
                    <option value="nl" ${language == 'nl' ? 'selected' : ''}>Nederlands</option>
                    <option value="es" ${language == 'es' ? 'selected' : ''}>Español</option>
                </select>
            </form>
            <form method="post">
                <label for="username"><fmt:message key="login.label.username" />:</label>
                <input type="text" id="username" name="username">
                <br>
                <label for="password"><fmt:message key="login.label.password" />:</label>
                <input type="password" id="password" name="password">
                <br>
                <fmt:message key="login.button.submit" var="buttonValue" />
                <input type="submit" name="submit" value="${buttonValue}">
            </form>
        </body>
    </html>
    

    <c:set var="language"> управляет текущим языком. Если язык был задан в качестве параметра запроса (по раскрывающемуся языку), он будет установлен. Иначе, если язык уже был ранее установлен в сеансе, вместо этого придерживайтесь его. Иначе используйте предоставленную пользователем локаль в заголовке запроса.

    <fmt:setLocale> устанавливает локаль для пакета ресурсов. Важно, чтобы эта строка была до <fmt:setBundle>,

    <fmt:setBundle> инициализирует пакет ресурсов своим базовым именем (то есть полным именем пакета до единственного имени без _ll_CC спецификатор).

    <fmt:message> извлекает значение сообщения по указанному ключу пакета.

    <html lang="${language}"> сообщает поисковым роботам, на каком языке страница, чтобы она не была помечена как дублированный контент (таким образом, это хорошо для SEO).

    Раскрывающийся список языков будет немедленно отправлен с помощью JavaScript, когда будет выбран другой язык, и страница будет обновлена ​​новым выбранным языком.


Однако необходимо помнить, что файлы свойств по умолчанию считываются с использованием кодировки символов ISO-8859-1. Вы должны были бы избежать их через побеги Юникода. Это может быть сделано с использованием JDK native2ascii.exe инструмент. Смотрите также этот раздел статьи для более подробной информации.

Теоретической альтернативой будет поставка комплекта с Control загрузить эти файлы как UTF-8, но это, к сожалению, не поддерживается базовой JSTL fmt TagLib. Вы должны были бы управлять всем этим самостоятельно с помощью Filter, Существуют (MVC) фреймворки, которые могут обрабатывать это более прозрачно, например, JSF, см. Также эту статью.

В дополнение к тому, что сказал BalusC, вы должны позаботиться о направленности (поскольку английский написан слева направо, а арабский наоборот). Самый простой способ будет добавить dir приписывать html элемент вашей веб-страницы JSP и его внешний вид, поэтому значение берется из файла свойств (как и для других элементов или атрибутов):

<html dir="${direction}">
...
</html>

Кроме того, есть немного проблем со стилизацией такого приложения - вы должны, мягко говоря, избегать абсолютного позиционирования. Если вы по какой-то причине не можете избежать этого, вы можете либо использовать разные таблицы стилей для (каждого?) Языка, либо сделать что-то верботное, то есть использовать таблицы для управления макетом. Если вы хотите использовать элементы div, я бы предложил использовать относительное позиционирование с "симметричными" левыми и правыми атрибутами стиля (оба имеют одинаковое значение), поскольку именно это заставляет переключение направленности работать.

Вы можете найти больше информации о двунаправленных сайтах здесь.

Основываясь на этом руководстве, я использую следующее в GAE - Google App Engine:

Файл JSP следующим образом:

<%@ page import="java.io.* %>
<% 
  String lang = "fr"; //Assign the correct language either by page or user-selected or browser language etc.
  ResourceBundle RB = ResourceBundle.getBundle("app", new Locale(lang));
%>                 

<!DOCTYPE html>
<%@ page contentType="text/html;charset=UTF-8" language="java"%>
<head>
</head>
<body>
  <p>      
    <%= RB.getString("greeting") %>
  </p>
</body>

И добавив файлы с именем: app.properties (по умолчанию) и app_fr.properties (и так далее для каждого языка). Каждый из этих файлов должен содержать нужные вам строки: key:value_in_language, например app_fr.properties содержит:

greeting=Bonjour!

app.properties содержит:

greeting=Hello!

Это все

Другие вопросы по тегам