Нарушено ли резервное разрешение ResourceBundle в Resin3x?
-
24-09-2019 - |
Вопрос
Учитывая следующие файлы свойств ResourceBundle:
- сообщения.свойства
- messages_en.свойства
- messages_es.свойства
- messages_{некоторая локаль}.properties
Примечание:messages.properties содержит все сообщения для языка по умолчанию.messages_en.properties действительно пуст - он нужен только для корректности.messages_en.properties вернется к messages.properties!
И учитывая следующие параметры конфигурации в 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>
Я бы ожидал, что если выбранная локаль 'es', а ресурс не переведен в 'es', то он вернется к 'en' и, наконец, к 'messages.properties' (поскольку messages_en.properties пуст).
Вот как все устроено в Jetty.Я также тестировал это на WebSphere.
Проблема в Смоле
Проблема возникает, когда я добираюсь до Resin (3.0.23).Резервное разрешение вообще не работает!Чтобы отобразить сообщение, я должен сделать следующее:
- Переименуйте messages.properties в messages_en.properties (по сути, поменять местами содержимое messages.properties и messages_en.properties)
- Убедитесь, что любой ключ в messages_en.properties также определен в messages_{любой другой локали}.properties (даже если он точно такой же).
Если я этого не сделаю, я получу "???some.key???" в JSP.
Пожалуйста, помогите!Это вызывает недоумение.
-- LES
РЕШЕНИЕ
Добавьте следующее в pom.xml (если вы используете 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>
Решение
Я не занимаюсь Resin, так что не обвиняйте меня в этом, но судя по симптомам, он поставляется с плохо обработанной реализацией JSTL.Попробуйте, например, заменить его более приличным в веб-приложении /WEB-INF/lib
.Если Servlet 2.5, получим jstl-1.2.jar, или, если Servlet 2.4, получить jstl.jar и standard.jar.
Другие советы
Просто идея, но вы могли бы попробовать добавить и этот контекстный параметр:
<context-param>
<param-name>javax.servlet.jsp.jstl.fmt.locale</param-name>
<param-value>en</param-value>
</context-param>
Вполне возможно, что Resin использует что-то подобное в качестве "резервной" локали.