Если браузер использует другой язык, тогда английский должен быть выбран автоматически, верно?
Это зависит! 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 - это то, чем вы будете после.