Как интернационализировать веб-приложение Java?
Я узнал от Google, что интернационализация-это процесс, с помощью которого я могу сделать свой веб-приложение для использования всех языков. Я хочу понять Unicode для процесса интернационализации, поэтому я узнал о 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 = 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
).
если еще не сделано, установите JSTL. Если вы работаете на сервлете 2.5 контейнер или новее (Tomcat 6.0 и так далее) и ваш
web.xml
объявляется соответствует спецификации сервлета 2.5, а затем просто положить jstl-1.2.банку в веб-приложение по/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>
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, но это, к сожалению, не поддерживается базовым JSTLfmt
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!
вот и все