2015-05-07 1 views
1

У меня проблема с jsf и несколькими языками. Итак, мои строки находятся в файлах WEB_INF/classes/texte_<lang>.properties. И доступны, например, <h:outputLabel value="#{messages.err_text}"/> , который отлично работает.Загрузите строку связки (на правильном языке), когда значение зависит от состояния компонента

Проблема в том, что у меня есть элемент <h:outputLabel..., где я хочу показать сообщение об ошибке в зависимости от ошибки. Я хотел бы что-то, что работает так:

<h:outputLabel value="#{someBean.errMsg}/> 

С Бине, как этот

@ManagedBean() 
@SessionScoped 
public class SomeBean{ 
    public String getErrMsg(){ 
    if(something){ 
     return "#{messages.err_text}" 
    }else if(somethingElse){ 
     return "#{messages.err_text2}" 
    }else{ 
     return "#{messages.err_text3}" 
    } 
    } 
} 

Просто чтобы быть ясно, что не работает. Я ищу аналогичное решение (или любое решение), которое работает.
Спасибо за чтение.

ответ

1

Не делайте этого. Модель не должна знать о представлении. Локализация также не относится строго к модели. Вместо этого модель должна подготовить некоторое состояние, о котором должно знать это мнение.

Один из способов будет:

public String getErrMsg(){ 
    if (something) { 
     return "err_text"; 
    } else if (somethingElse) { 
     return "err_text2"; 
    } else { 
     return "err_text3"; 
    } 
} 
<h:outputLabel value="#{messages[someBean.errMsg]}" /> 

Другой путь будет возвращающий enum, как показано в следующих взаимосвязанных вопросов: Localizing enum values in resource bundle и How to use enum values in f:selectItem(s).

+0

спасибо, что сработало отлично. – AntJOo

+0

Добро пожаловать. – BalusC

0

Причина, по которой у вас сейчас нет работы, заключается в том, что атрибут valueoutputText оценивается как простая строка, а не как выражение EL.

Идя, что вы работаете с компанией, лучший способ продолжить, чтобы внедрить пакет ресурсов непосредственно в боб:

@ManagedProperty("#{messages}") 
ResourceBundle messages; 

И потом,

public String getErrMsg(){ 
    if(something){ 
     messages.getString("err_text"); 
    } 
} 

В случае, если вы» Традиционно сообщения об ошибках не представлены с использованием компонента h:message.


На несвязанной ноте к вашему первоначальному вопросу, вы также должны знать, что это вообще не рекомендуется иметь логику обработки утопает в вашем добытчика. Во-первых, геттер вызывается несколько раз во время рендеринга вашей страницы. Также для правильной работы вы должны быть уверены, что значение something останется неизменным на протяжении всего жизненного цикла одного запроса JSF.

 Смежные вопросы

  • Нет связанных вопросов^_^