Вопрос

Учитывая следующие файлы свойств ResourceBundle:

  1. сообщения.свойства
  2. messages_en.свойства
  3. messages_es.свойства
  4. 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).Резервное разрешение вообще не работает!Чтобы отобразить сообщение, я должен сделать следующее:

  1. Переименуйте messages.properties в messages_en.properties (по сути, поменять местами содержимое messages.properties и messages_en.properties)
  2. Убедитесь, что любой ключ в 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 использует что-то подобное в качестве "резервной" локали.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top