Как интернационализировать веб-приложение на Java?
Я узнал от Google, что интернационализация - это процесс, с помощью которого я могу настроить свое веб-приложение на использование всех языков. Я хочу понять Unicode для процесса интернационализации, поэтому я узнал о Unicode здесь и там.
Я могу понять, что такое Юникод, как набор символов, закодированный в байтах, и снова байты, декодированные в кодировку. Но я не знаю, как двигаться дальше. Я хочу научиться сравнивать строки и мне нужно знать, как реализовать интернационализацию в моем веб-приложении. Любые предложения, пожалуйста? Пожалуйста, ведите меня.
Моя цель:
Моя главная цель - разработать веб-приложение для перевода (с английского на арабский и наоборот). Я хочу следить за интернационализацией. Я хочу запустить свое веб-приложение для перевода во всех трех браузерах, а именно: FF, Chrome, IE. Как мне этого добиться?
3 ответа
В случае базового веб-приложения JSP/Servlet основным подходом будет использование JSTL fmt
taglib в сочетании с пакетами ресурсов. Пакеты ресурсов содержат пары ключ-значение, где ключ является константой, которая одинакова для всех языков, и значение отличается для каждого языка. Пакеты ресурсов обычно представляют собой файлы свойств, которые загружаются ResourceBundle
API. Однако это можно настроить так, чтобы вы могли загружать пары ключ-значение, например, из базы данных.
Вот пример того, как интернационализировать форму входа вашего веб-приложения с помощью пакетов ресурсов на основе файла свойств.
Создайте следующие файлы и поместите их в какой-нибудь пакет, например
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
).Если это еще не сделано, установите JSTL. Если вы работаете в контейнере Servlet 2.5 или новее (Tomcat 6.0 и т. Д.) И ваш
web.xml
объявляется в соответствии со спецификацией Servlet 2.5, затем просто поместите jstl-1.2.jar в веб-приложение/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">
управляет текущим языком. Если язык был задан в качестве параметра запроса (по раскрывающемуся языку), он будет установлен. Иначе, если язык уже был ранее установлен в сеансе, вместо этого придерживайтесь его. Иначе используйте предоставленную пользователем локаль в заголовке запроса.<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!
Это все