A resolução do ResourceBundle Fallback está quebrada em Resin3x?
-
24-09-2019 - |
Pergunta
Dados os seguintes arquivos da ResourceBundle Properties:
- mensagens.properties
- Mensagens_en.properties
- mensagens_es.properties
- mensagens_ {alguns locais} .Properties
NOTA: Mensagens.Properties contém todas as mensagens para o local padrão. Mensagens_en.properties está realmente vazio - está lá apenas para correção. Mensagens_en.Properties voltarão ao Message.Properties!
E dados os seguintes parâmetros de configuração em 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>
Eu esperaria que, se o local escolhido for 'es', e um recurso não seja traduzido em 'es', então ele voltaria para 'en' e, finalmente, 'mensagens.properties' (já que as mensagens_en.properties estão vazias) .
É assim que as coisas funcionam no cais. Eu também testei isso no WebSphere.
Resina é o problema
O problema é quando chego a resina (3.0.23). A resolução de fallback não funciona! Para obter mensagens para exibir, devo fazer o seguinte:
- Renomear mensagens.properties para mensagens_en.properties (essencialmente, troca o conteúdo de mensagens.properties and Message_en.properties)
- Certifique -se de sempre que a chave em mensagens_en.properties seja definida em mensagens_ {todos os outros locais} .Properties (mesmo se exatamente o mesmo).
Se eu não fizer isso, eu entendo "? nos JSPs.
Por favor ajude! Isso é desconcertante.
- Les
SOLUÇÃO
Adicione o seguinte ao pom.xml (se você estiver usando o 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>
Solução
Eu não faço resina, então não me prenda, mas os sintomas fazem parecer assim que ele é enviado com uma implementação JSTL mal assada. Tente, por exemplo, substituí -lo por um mais decente no webapp's /WEB-INF/lib
. Se o servlet 2.5, obtenha jstl-1.2.jar, ou se servlet 2.4, obtenha jstl.jar e padrão.jar.
Outras dicas
Apenas uma ideia, mas você pode tentar adicionar esta param de contexto também:
<context-param>
<param-name>javax.servlet.jsp.jstl.fmt.locale</param-name>
<param-value>en</param-value>
</context-param>
É possível que a resina esteja usando algo assim como o local de 'fallback'.