¿Cómo internacionalizar/localizar una aplicación web JSP/Servlet?
Aprendí de Google que la internacionalización es el proceso mediante el cual puedo hacer que mi aplicación web utilice todos los idiomas. Quiero entender Unicode para el proceso de internacionalización, así que aprendí sobre Unicode de aquí y de allá .
Puedo entender acerca de Unicode cómo un conjunto de caracteres se codifica en bytes y nuevamente los bytes se decodifican en un conjunto de caracteres. Pero no sé cómo seguir adelante. Quiero aprender a comparar cadenas y necesito saber cómo implementar la internacionalización en mi aplicación web. ¿Alguna sugerencia por favor? Por favor guíame.
Mi objetivo:
Mi principal objetivo es desarrollar una aplicación web para traducción (inglés a árabe y viceversa). Quiero seguir la Internacionalización. Deseo ejecutar mi aplicación web para traducción en los tres navegadores, a saber, FF, Chrome e IE. ¿Cómo logro esto?
En el caso de una aplicación web JSP/Servlet básica, el enfoque básico sería utilizar JSTL fmt
taglib en combinación con paquetes de recursos . Los paquetes de recursos contienen pares clave-valor donde la clave es una constante que es la misma para todos los idiomas y el valor difiere según el idioma. Los paquetes de recursos suelen ser archivos de propiedades que se cargan mediante ResourceBundle
API. Sin embargo, esto se puede personalizar para que pueda cargar los pares clave-valor desde, por ejemplo, una base de datos.
A continuación se muestra un ejemplo de cómo internacionalizar el formulario de inicio de sesión de su aplicación web con paquetes de recursos basados en archivos de propiedades.
Cree los siguientes archivos y colóquelos en algún paquete, por ejemplo
com.example.i18n
(en el caso de Maven, colóquelos en la estructura del paquete dentrosrc/main/resources
).text.properties
(contiene pares clave-valor en el idioma predeterminado, generalmente inglés)login.label.username = Nombre de usuario login.label.password = Contraseña login.button.submit = Iniciar sesión
text_nl.properties
(contienenl
pares clave-valor en holandés ( ))login.label.username = Nombre de usuario login.label.contraseña = Wachtwoord login.button.submit = Iniciar sesión
text_es.properties
(contienees
pares clave-valor en español ( ))login.label.username = Nombre de usuario login.label.password = Contraseña login.button.submit = Acceder
El nombre del archivo del paquete de recursos debe seguir el siguiente patrón
name_ll_CC.properties
. La_ll
parte debe ser el código de idioma ISO 693-1 en minúsculas . Es opcional y solo se requiere cuando la_CC
pieza está presente. La_CC
parte debe ser el código de país ISO 3166-1 Alpha-2 en mayúsculas . Es opcional y, a menudo, solo se usa para distinguir entre dialectos de idiomas específicos de un país, como el inglés americano (_en_US
) y el inglés británico (_en_GB
).
Si aún no lo ha hecho, instale JSTL según las instrucciones de esta respuesta: ¿ Cómo instalar JSTL? El uri absoluto: http://java.sun.com/jstl/core no se puede resolver .
Cree el siguiente archivo JSP de ejemplo y colóquelo en la carpeta de contenido web.
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>
Gestiona
<c:set var="language">
el idioma actual. Si el idioma se proporcionó como parámetro de solicitud (mediante el menú desplegable de idiomas), se configurará. De lo contrario, si el idioma ya se configuró previamente en la sesión, manténgalo. De lo contrario, utilice la configuración regional proporcionada por el usuario en el encabezado de la solicitud.Establece
<fmt:setLocale>
la configuración regional para el paquete de recursos. Es importante que esta línea esté antes del<fmt:setBundle>
.Inicializa
<fmt:setBundle>
el paquete de recursos por su nombre base (es decir, el nombre completo del paquete hasta el único nombre sin el_ll_CC
especificador).Recupera
<fmt:message>
el valor del mensaje mediante la clave del paquete especificada.Informa
<html lang="${language}">
a los robots de búsqueda en qué idioma está la página para que no se marque como contenido duplicado (por lo tanto, es bueno para SEO).El menú desplegable de idiomas se enviará inmediatamente mediante JavaScript cuando se elija otro idioma y la página se actualizará con el idioma recién elegido.
Sin embargo, debe tener en cuenta que los archivos de propiedades se leen de forma predeterminada utilizando la codificación de caracteres ISO-8859-1. Necesitaría escapar de ellos mediante escapes Unicode. Esto se puede hacer utilizando la native2ascii.exe
herramienta proporcionada por JDK. Consulte también la sección de este artículo para obtener más detalles.
Una alternativa teórica sería proporcionar un paquete con una costumbre Control
para cargar esos archivos como UTF-8, pero desafortunadamente eso no es compatible con la fmt
biblioteca de etiquetas JSTL básica. Debería gestionarlo todo usted mismo con la ayuda de un archivo Filter
. Existen marcos (MVC) que pueden manejar esto de una manera más transparente, como JSF, consulte también este artículo .
Además de lo que dijo BalusC, hay que tener cuidado con la direccionalidad (ya que el inglés se escribe de izquierda a derecha y el árabe al revés). La forma más sencilla sería agregar dir
un atributo al html
elemento de su página web JSP y externalizarlo, de modo que el valor provenga del archivo de propiedades (al igual que con otros elementos o atributos):
<html dir="${direction}">
...
</html>
Además, existen pocos problemas con el estilo de dicha aplicación; por lo menos, debes evitar el posicionamiento absoluto. Si no puede evitarlo por alguna razón, puede usar diferentes hojas de estilo por (¿cada?) idioma o hacer algo que esté prohibido , es decir, usar tablas para administrar el diseño. Si desea utilizar elementos div, le sugiero que utilice el posicionamiento relativo con atributos de estilo "simétricos" izquierdo y derecho (ambos con el mismo valor), ya que esto es lo que hace que el cambio de direccionalidad funcione.
You could find more about Bi-Directional websites here.