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

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

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

Моя цель:

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

Ответы

Ответ 1

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

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


  • Создайте следующие файлы и поместите их в некоторый пакет, например. 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. Это необязательно и часто используется для различения языковых диалектов, специфичных для страны, таких как American English (_en_US) и Британский английский (_en_GB).


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


  • Создайте следующий пример 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"> управляет текущим языком. Если язык был предоставлен как параметр запроса (по выпадающему языку), он будет установлен. Иначе, если язык уже был предварительно установлен в сеансе, тогда придерживайтесь его. Else использует локализованный пользователем язык в заголовке запроса.

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

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

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

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

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


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

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

Ответ 2

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

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

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

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

Ответ 3

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

Что все