2014-03-12 5 views
0

У меня есть простой компонент, предлагающий «метод перевода» в рамках сессииJSF/CDI: Использование боба для запроса строки из ресурсов

String getText(String key, Object args ...) { 

    ...// lookup in property resource 
    return value; 
} 

Я пытаюсь вызвать этот компонент, чтобы получить мои компоненты пользовательского интерфейса локализованных текстовые строки , При попытке вызвать вышеупомянутую функцию, например, по

 <p:outputLabel for="name" value="#{lang.getText(xyz,arg1)}" /> 
     <p:inputText id="name" value="#{formProject.entity.name}"/> 
     <p:message for="name" id="msgName" /> 

Я получаю java.lang.IllegalArgumentException: неверное число аргументов

Теперь мой вопрос

1) Is this generally a good alternative to <f:loadBundle> to localize my components? 
2) Since I am able to address my nested bean fields via bean1.bean2.myfield 
    how to avoid conflicts when adressing the properties dot-sepatated, 
    i.e. x.y.z instead of xyz? 

Я не думаю, что я по праву трек в настоящее время ...

ответ

3

обычно следует использовать

<?xml version='1.0' encoding='UTF-8'?> 
<faces-config version="2.2" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd"> 

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

     <resource-bundle> 
      <base-name>/bundle</base-name> 
      <var>bundle</var> 
     </resource-bundle> 
    </application> 

</faces-config> 

и получить этикетки с помощью

<p:outputLabel for="name" value="#{bundle.foo}" /> 
<p:inputText id="name" value="#{formProject.entity.name}"/> 
<p:message for="name" id="msgName" /> 

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

<p:outputLabel for="name" value="#{bundle['foo.bar']}" /> 

вы не можете передать аргументы (я не знаю, как это сделать без интерполятора, или если это вообще возможно)

гибрид раствор может быть

@ManagedBean 
public class LabelBean 
{ 
    private String getText(String key, String... args) 
    { 
     String message = Faces.evaluateExpressionGet("#{bundle['" + key + "']}"); 
     return MessageFormat.format(message, args); 
    } 

    public String getText1(String key, String arg) 
    { 
     return getText(key, arg); 
    } 

    public String getText2(String key, String arg1, String arg2) 
    { 
     return getText(key, arg1, arg2); 
    } 
} 

аналогичным образом @hwellmann предложил (+1)

+0

спасибо за ваш ответ, приятно обходное решение ... –

2

Язык выражений не поддерживает выражения метода с varargs. В качестве временного решения можно ввести методы

String getText2(String key, Object arg1, Object arg2); 
String getText3(String key, Object arg1, Object arg2, Object arg3); 

т.д.

Что касается 2), просто используйте #{lang.getText('x.y.z',arg1)}.

+0

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

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