JSF / Seam messages.properties без _xx какой это язык? - PullRequest
0 голосов
/ 14 июня 2011

Я просто хотел узнать, на каком языке читаются сообщения messages.properties по умолчанию.

я подумал, что это в сконфигурированном по умолчанию face-config.xml локали:

<locale-config>
  <default-locale>de</default-locale>
  <supported-locale>de</supported-locale>
  <supported-locale>en</supported-locale>
</locale-config>

он не содержит тега <message-bundle>, я создал messages.properties, messages_en.свойства и messages_de.properties.Для доступа к значениям я использую этот код

ResourceBundle resourceBundle = SeamResourceBundle.getBundle();
String bundleMessage = resourceBundle.getString("key.something");

В меню я использовал это, чтобы показать (и переключить) язык, который работает отлично

<h:selectOneMenu value="#{localeSelector.localeString}">
  <f:selectItems value="#{localeSelector.supportedLocales}"/>
</h:selectOneMenu>

Теперь не имеет значения, чтоЯзык, который я выбираю, je всегда использует messages.properties, а не _de или _en.Нужен ли конкретный класс для <message-bundle>, чтобы найти также пакеты ресурсов _de и _en?

РЕДАКТИРОВАТЬ:

ResourceBundle resourceBundle = SeamResourceBundle.getBundle();
java.util.Locale locale = resourceBundle.getLocale();

Содержит всегда правильную локаль de или en, но всегда использует messages.properties и, если этот файл удален, возвращает только ключ, как если быон не нашел другого файла.Сообщения * .properties находятся в папке / WEB-INF / classes.

я пытался теперь взять Map<String, String> messages = org.jboss.seam.international.Messages.instance(); Он также содержит значения из messages.properties, а не _de или _en

Использование #{messages[key.label]} в файле * .xhtml также возвращает только сообщения.значения свойств, но не из _de или _en.

Но свойства messages_de или _en непосредственно в файле xyz.war с <a4j:loadBundle var="i18n" basename="messages"/> работают.(вот как я сделал i18n во внешнем интерфейсе "не Java")

еще две попытки всегда возвращают только свойства по умолчанию, а не _de или _en

resourceBundle =  context.getApplication().getResourceBundle(context, "messages");

java.util.Locale locale = new java.util.Locale("de");
resourceBundle = ResourceBundle.getBundle("messages",locale);

, если я создаю новое messages2_de.properties и * _en * и используйте код выше, все работает отлично.

java.util.Locale locale = new java.util.Locale("de");
resourceBundle = ResourceBundle.getBundle("messages2",locale);

Ответы [ 3 ]

2 голосов
/ 15 июня 2011

РЕДАКТИРОВАТЬ (очевидно, JBoss Seam немного отличается) * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *. Вместо этого вы должны определить пакеты, которые хотите использовать, и позволить Seam прочитать вам сообщение:

@In("#{messages['Hello']}") private String helloMessage;

Как правило, getBundle() метод любой из ResourceBundle производных реализаций даст вам инвариантный пакет, если вы пропустите параметр Locale. Это по замыслу.

Если вам нужен доступ к локализованной версии, вам нужно получить Locale из UIViewRoot:

Locale locale = FacesContext.getCurrentInstance().getViewRoot().getLocale();
ResourceBundle resourceBundle = SeamResourceBundle.getBundle();
String bundleMessage = resourceBundle.getString("key.something");

Я не знаю, как кодируется ваш bean-компонент localeSelector, но он также должен установить Locale в UIViewRoot.

1 голос
/ 14 июня 2011

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

Хотя я не знаю, что именно делает SeamResourceBundle, вы должны где-то сказать ему, что такое «текущий» язык. Вы говорите, что переключение языка работает, но что именно вы делаете при переключении? В какой момент вы выполняете SeamResourceBundle.getBundle()?

Действительно ли key.something определено во всех 3 пакетах?

0 голосов
/ 15 июня 2011

Мой плохой.Вы не смогли найти ошибку.Проект имел один messages.properties в / WEB-INF / classes и второй набор (но без свойств по умолчанию) непосредственно в каталоге веб-материалов с такими же именами.

Итак, я думаю, он взял только существующие по умолчанию messages.properties из папки классов и messages_de / en.properties из папки веб-контента.

...