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


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

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

Моя Цель:

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

3 78

3 ответа:

в случае базового веб-приложения JSP/Servlet основной подход будет использовать JSTLfmt 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. Если вы работаете на сервлете 2.5 контейнер или новее (Tomcat 6.0 и так далее) и ваш web.xml объявляется соответствует спецификации сервлета 2.5, а затем просто положить jstl-1.2.банку в веб-приложение по /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>
    

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

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

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

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

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

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


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

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

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

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

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

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

на основе в этом уроке, Я использую следующее на движке приложений GAE-Google:

файл 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!

вот и все