¿Cómo se brinda soporte multilingüe a través de JSP/Servlet? ¿Cómo incluir datos estáticos de diferentes idiomas en tiempo de ejecución en función del idioma seleccionado?Soporte de idioma MUlti en JSP/Servlet
Respuesta
Existen varios aspectos importantes a este respecto. La primera parte es determinar la configuración regional de cada solicitud. Puede usar algo como esto:
HttpServletRequest req ...;
String browserLocale = req.getHeader("Accept-Language"); // typically something like 'en'
A continuación, debe decidir cómo administrar el contenido localizado del sitio. El enfoque más similar a Java (no necesariamente el mejor) es externalizar todos los mensajes utilizando un paquete de recursos. Puede obtener información sobre las principales instalaciones de Java para I18N, G13N en su Isolating Locale Specific Data tutorial.
El uso de este enfoque es bastante pobre en mi opinión. El tamaño del contenido de diferentes idiomas es diferente, se combina mejor con diferentes diseños, etc. Por lo tanto, puede eliminar completamente los paquetes de recursos (si no tiene muchos datos multi-locale) o aumentar el enfoque usando XSLT u otras plantillas que son locales específico.
Un enfoque general de alto rendimiento pero de alto desarrollo es utilizar un filtro de servlet para redirigir el tráfico a subsitios específicos de idioma (o localidad). En este caso, cualquiera que golpee http://my.domain.fake/xyz
sería redirigido a http://my.domain.fake/en/xyz
Finalmente, vale la pena señalar que la mayoría de los frameworks web serios tienen su propio soporte I18N. Sus enfoques difieren según la filosofía del marco.
En una aplicación "simple vainilla" JSP/Servlet, la mejor solución es la JSTLfmt taglib. (simplemente suelte jstl-1.2.jar
en /WEB-INF/lib
) Cómo se usa está cubierto en Oracle Java EE 5 tutorial part II chapter 7 y en esta respuesta: How to internationalize a Java web application?.
Si está utilizando un marco MVC como Oracle JSF o Apache Struts, entonces necesita consultar su documentación específica usando las palabras clave "internacionalización" (i18n) o "localización" (l10n). En la mayoría de los casos, también proporcionan etiquetas específicas para eso, como <f:loadBundle>
en el caso de JSF, que a su vez está cubierto en Oracle Java EE 5 tutorial part II chapter 15.
Esas etiquetas i18n ya verifican el idioma/configuración regional predeterminada por ServletRequest#getLocale()
(no es necesario que lo haga "bajo nivel" marcando el encabezado como se sugirió antes --que implicaría más trabajo analizar el encabezado según el HTTP spec). Puede dejar que el usuario elija el idioma en sí (¿desplegable?) Y almacenarlo en el ámbito de la sesión e indicarle a los taglibs que lo utilicen. He aquí un ejemplo con taglib JSTL fmt:
<fmt:setLocale value="${someSessionBean.locale}" />
..where ${someSessionBean.locale}
puede volver en
, en_US
, en_UK
, etc. Esos son a su vez utilizados por la API java.util.ResourceBundle
para cargar el texto localizado (que no es necesario crear/cargar el ResourceBundle
en sí mismo, los taglibs ya lo hacen, solo lea el javadoc vinculado para aprender un poco más sobre cómo funciona).
Si desea que el idioma disponible como primera parte pathinfo de URL (como http://example.com/en/
, lo que es mejor para SEO), entonces usted puede utilizar mejor un Filter
para este que escucha en /*
, comprueba la pathinfo, divide la parte idioma desde allí, lo almacena/compara como/con valor de sesión y reenvía la solicitud sin parte de idioma en pathinfo más allá del controlador frontal deseado.
Podemos crear messages.properties, messages_ ?? ??.propiedades y colocar estos archivos en el directorio/scr/java. (Donde ?? ?? - en_US, es_ES y otros)
líneas de ejemplo en messages.properties:
About = About
Buy = Buy
Company = Company
ContactUs = Contact Us
Entonces para pegar en archivo JSP por ejemplo líneas:
Locale locale = Locale.getDefault();
String lng = locale.getCountry();
session.setAttribute("language", lng);
if (lng.equals("UA"))
locale = new Locale("uk", "UA");
else if (lng.equals("RU"))
locale = new Locale("ru", "RU");
else
locale = Locale.US;
ResourceBundle boundle = ResourceBundle.getBundle("messages", locale);
for (Enumeration e = boundle.getKeys(); e.hasMoreElements();) {
String key = (String) e.nextElement();
String s = boundle.getString(key);
session.setAttribute(key, s);
}
Ahora puede pegar $ {name} en el siguiente código jsp ($ {About}, $ {Buy}, ...).
esto es ** no ** la forma en que usa las clases 'ResourceBundle' y' Locale'! Muestra una falta fundamental de comprensión del tema. –
- 1. Soporte de idioma azerbaiyano por Android 2.2?
- 2. asp.net entrada de mvc/validación de modelo multi idioma
- 3. Multi idioma para un sitio web (php y javascript)
- 4. ¿Puede un idioma ser completo sin ningún soporte para matrices?
- 5. Multi-colección, 'transacciones' multi-documentos en MongoDB
- 6. Programación multi core
- 7. Usuarios de Multi Tenant, Multi Admin en ActiveAdmin
- 8. Soporte multilingüe personalizado
- 9. soporte de idioma para los operadores de comparación encadenados (x <y <z)
- 10. multi almacén y multi stock con magento
- 11. multi-CPU, multi-core e hiper-thread
- 12. Multi Threading
- 13. ¿Qué idioma en DrScheme para SICP?
- 14. Acerca de multi threading
- 15. Idioma para el compilador basado en LLVM
- 16. Validación multi estado en Rails
- 17. Multi inquilino en ASP MVC
- 18. Haskell multi-núcleo en Windows
- 19. Bootstrapping aún requiere soporte externo
- 20. Cambiar idioma en C#
- 21. Soporte de Rijndael en Java
- 22. Soporte de joystick en Java
- 23. Soporte de SVG en Android
- 24. Soporte de multidifusión en .Net
- 25. Soporte de Cmake en Eclipse
- 26. Soporte de prefijo en Sequelize.js
- 27. log4j soporte en Android
- 28. de SQL Server en aplicaciones multi-arrendatario
- 29. multi-especie de matriz asociativa en PHP
- 30. soporte macro en F #
'ServletRequest.getLocale()' existe por una razón! –