Es la resolución de repliegue ResourceBundle roto en Resin3x?
-
24-09-2019 - |
Pregunta
Teniendo en cuenta los siguientes archivos de propiedades ResourceBundle:
- messages.properties
- messages_en.properties
- messages_es.properties
- messages_ {locale} algunos .properties
Nota: messages.properties contiene todos los mensajes de la configuración regional predeterminada. messages_en.properties es realmente vacío - es sólo allí para la corrección. messages_en.properties caerán de nuevo a messages.properties!
Y teniendo en cuenta los siguientes parametros de configuración en web.xml:
<context-param>
<param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>
<param-value>messages</param-value>
</context-param>
<context-param>
<param-name>javax.servlet.jsp.jstl.fmt.fallbackLocale</param-name>
<param-value>en</param-value>
</context-param>
Yo esperaría que si la configuración regional es elegido 'es', y un recurso no se traduce en 'es', entonces sería caer de nuevo a 'es', y finalmente a '' messages.properties (ya messages_en.properties está vacío).
Así es como funcionan las cosas en el embarcadero. También he probado esto en WebSphere.
Resina es el problema
El problema es cuando llego a resina (3.0.23). Resolución de reserva no funciona en absoluto! Con el fin de conseguir un mensajes a la pantalla, hay que hacer lo siguiente:
- Cambiar nombre messages.properties a messages_en.properties (esencialmente, intercambio el contenido de messages.properties y messages_en.properties)
- Asegúrese siempre clave en messages_en.properties también se define en messages_ {locale} cada dos .properties (incluso si exactamente el mismo).
Si no hago esto, me sale "??? some.key ???" en las páginas JSP.
Por favor, ayuda! Esto es desconcertante.
- LES
SOLUCIÓN
Añadir a pom.xml siguiente (si está utilizando Maven)
...
<properties>
<taglibs.version>1.1.2</taglibs.version>
</properties>
...
<!--
Resin ships with a crappy JSTL implementation that doesn't work with
fallback locales for resource bundles correctly; we therefore include
our own JSTL implementation in the WAR, and avoid this problem. This
can be removed if the target container is not resin.
-->
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>${taglibs.version}</version>
<scope>compile</scope>
</dependency>
Solución
No hago resina, así que no me fijar en él, pero los síntomas que suene como que se distribuye con una implementación JSTL mal cocida. Pruebe por ejemplo, para sustituirlo por uno más decente en /WEB-INF/lib
de la aplicación web. Si Servlet 2.5, obtener jstl-1.2.jar o si Servlet 2.4, get jstl.jar y standard.jar .
Otros consejos
Es sólo una idea, pero se puede intentar añadir este contexto-param así:
<context-param>
<param-name>javax.servlet.jsp.jstl.fmt.locale</param-name>
<param-value>en</param-value>
</context-param>
Es posible que la resina está usando algo así como el 'retroceso' configuración regional.