Struts (1) локаль по умолчанию не выбрана - PullRequest
2 голосов
/ 26 января 2012

В моем приложении пользователь может выбрать один из 2 языков: EN и IT. Если браузер использует другой язык, тогда английский должен быть выбран автоматически, верно?

НО, вот проблема в том, что когда, например, пользователь приходит с французским браузером, он пытается найти там французский, но нет французских локалей, и он не отображает контент на страницах.

Итак, вопрос в том, какая библиотека или процесс отвечает за выбор локалей по умолчанию? может быть, мои библиотеки устарели, или?

1 Ответ

0 голосов
/ 05 февраля 2012

Если браузер использует другой язык, тогда английский должен быть выбран автоматически, верно?

Это зависит! Struts пытается найти наиболее конкретный пакет сообщений, а затем возвращается к некоторым значениям по умолчанию (например, к локали JVM по умолчанию или к пакету сообщений без языкового суффикса). Обычно это что-то вроде этого :

base + "_" + localeLanguage + "_" + localeCountry + "_" + localeVariant
base + "_" + localeLanguage + "_" + localeCountry
base + "_" + localeLanguage
base + "_" + default locale
base

... нет французских локалей, и он не отображает содержание на страницах.

Это не кажется правильным; когда ключ сообщения не может быть разрешен, вы либо получаете исключение, например: "Отсутствует сообщение для ключа" ... "в комплекте" ... "для локали ..." , или вы получаете результат как "??? fr.yourKey ???" для конфигурации, подобной <message-resources ... null="false" /> в вашем struts-config.xml, поэтому вы должны увидеть что-то на странице или, по крайней мере, в журналах.

Я бы предложил активировать логи для org.apache.struts.util.PropertyMessageResources и посмотреть, что он пытается найти. Также проверьте файлы .properties, возможно, ваши ключи разрешены в файле по умолчанию и они пусты.

Что касается процесса, который выбирает Locale для использования в текущем запросе (кроме того, что PropertyMessageResources делает со своими режимами работы), в какой-то момент Обработчик запросов Struts вызывает org.apache.struts.chain.commands.servlet.SelectLocale, который отвечает за возврат локали.

Этот класс пытается найти кешированный языковой стандарт внутри сеанса. Если он не может найти его там, он использует тот, что в запросе. Если он не может найти его там, то он, наконец, по умолчанию использует локаль JVM. Ваш языковой стандарт теперь выбран и кэширован в сеансе.

Это класс Struts, так что вы найдете его в JAR-файле Struts-Core. Если у вас есть доступ к исходному коду Struts для конкретной версии, которую вы используете, вы можете посмотреть, как управляется локаль; код, использующий Globals.LOCALE_KEY - это то, чем вы будете после.

...