Как интернационализировать веб-приложение на Java? - PullRequest
80 голосов
/ 25 ноября 2010

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

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

Моя цель:

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

Ответы [ 3 ]

218 голосов
/ 25 ноября 2010

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

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


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

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

    login.label.username = Username
    login.label.password = Password
    login.button.submit = Sign in
    

    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 Alpha-2 код страны. Он является необязательным и часто используется только для различия между национальными языковыми диалектами, такими как Американский английский (_en_US) и Британский английский (_en_GB).


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


  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. Вам нужно было бы управлять всем этим самостоятельно с помощью Filter. Существуют (MVC) фреймворки, которые могут обрабатывать это более прозрачно, например, JSF, см. Также эту статью .

26 голосов
/ 25 ноября 2010

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

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

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

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

2 голосов
/ 18 июня 2014

на основе этого урока , я использую следующее в 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!

Вот и все

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...