2010-02-02 25 views

Respuesta

-1

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.

+0

'ServletRequest.getLocale()' existe por una razón! –

10

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.

-1

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}, ...).

+0

esto es ** no ** la forma en que usa las clases 'ResourceBundle' y' Locale'! Muestra una falta fundamental de comprensión del tema. –