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

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

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

Моя Цель:

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

3 ответов


в случае базового веб-приложения 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. The _ll часть должна быть строчной ISO 693-1 код языка. Это необязательно и требуется только тогда, когда _CC часть присутствует. The _CC часть должна быть прописные ISO 3166-1 Alpha-2 код страны. Он является необязательным и часто используется только для различения диалектов языка конкретной страны, таких как Английский (_en_US) и Английский (_en_GB).


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


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

    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> задает локаль для пакета ресурсов. Важно, что эта строка до the <fmt:setBundle>.

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

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

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

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


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

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


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

<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!

вот и все