2012-12-01 17 views

risposta

39

Supponendo che è stato configurato come segue:

<resource-bundle> 
    <base-name>com.example.i18n.text</base-name> 
    <var>text</var> 
</resource-bundle> 

Se il chicco è richiesta ambito, si può solo iniettare il <resource-bundle> come @ManagedProperty dal suo <var>:

@ManagedProperty("#{text}") 
private ResourceBundle text; 

public void someAction() { 
    String someKey = text.getString("some.key"); 
    // ... 
} 

Oppure se hai bisogno di una chiave specifica:

@ManagedProperty("#{text['some.key']}") 
private String someKey; 

public void someAction() { 
    // ... 
} 

Se il chicco è comunque in un ambito più ampio, quindi valutare #{text} livello di codice in modalità ambito locale:

public void someAction() { 
    FacesContext context = FacesContext.getCurrentInstance(); 
    ResourceBundle text = context.getApplication().evaluateExpressionGet(context, "#{text}", ResourceBundle.class); 
    String someKey = text.getString("some.key"); 
    // ... 
} 

Oppure, se avete solo bisogno di un po 'di chiave specifica:

public void someAction() { 
    FacesContext context = FacesContext.getCurrentInstance(); 
    String someKey = context.getApplication().evaluateExpressionGet(context, "#{text['some.key']}", String.class); 
    // ... 
} 

Si può anche solo ottenere tramite l'API standard ResourceBundle allo stesso modo che JSF stesso sta già facendo sotto il vers, si avrebbero solo bisogno di ripetere il nome di base in codice:

public void someAction() { 
    FacesContext context = FacesContext.getCurrentInstance(); 
    ResourceBundle text = ResourceBundle.getBundle("com.example.i18n.text", context.getViewRoot().getLocale()); 
    String someKey = text.getString("some.key"); 
    // ... 
} 

Oppure, se si sta gestendo i fagioli dal CDI invece di JSF, allora è possibile creare un @Producer per questo:

public class BundleProducer { 

    @Produces 
    public PropertyResourceBundle getBundle() { 
     FacesContext context = FacesContext.getCurrentInstance(); 
     return context.getApplication().evaluateExpressionGet(context, "#{text}", PropertyResourceBundle.class); 
    } 

} 

e iniettare come qui sotto:

@Inject 
private PropertyResourceBundle text; 

In alternativa, se si utilizza la classe Messages della libreria di utilità JSF OmniFaces, è possibile impostare il risolutore una sola volta in modo che tutti i metodi Message utilizzino il pacchetto.

Messages.setResolver(new Messages.Resolver() { 
    public String getMessage(String message, Object... params) { 
     ResourceBundle bundle = ResourceBundle.getBundle("com.example.i18n.text", Faces.getLocale()); 
     if (bundle.containsKey(message)) { 
      message = bundle.getString(message); 
     } 
     return MessageFormat.format(message, params); 
    } 
}); 

Vedi anche l'esempio nella javadoc e showcase page.

+0

'Se il chicco è richiesta ambito' è che l'unico scopo che può accedere al file propperties? –

+0

@Kuriel: JSF '@ ManagedProperty' non è in grado di iniettare un ambito più ristretto in un ambito più ampio. Solo CDI '@ Inject'. Se ti capita di utilizzare CDI, vai su http://stackoverflow.com/q/28045667 – BalusC

+0

@BalusC quale modulo di sintassi dovrebbe essere usato durante la scrittura di testo con i parametri nel file del pacchetto di risorse? –

1

Ecco una soluzione che sto utilizzando, non è così semplice, ma almeno di lavoro:

Prima classe:

package com.spectotechnologies.website.util; 

import java.util.Locale; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 
import org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator; 

/** 
* 
* @author Alexandre Lavoie 
*/ 
public class MessageInterpolator extends ResourceBundleMessageInterpolator 
{ 
    public static final String LANGUAGE_TAG_PATTERN = "\\{[^}]*\\}"; 

    @Override 
    public String interpolate(String p_sMessage, Context p_oContext) 
    { 
     return super.interpolate(replaceMessages(p_sMessage),p_oContext); 
    } 

    @Override 
    public String interpolate(String p_sMessage, Context p_oContext, Locale p_oLocale) 
    { 
     StringManager.setLocale(p_oLocale); 

     return super.interpolate(replaceMessages(p_sMessage),p_oContext,p_oLocale); 
    } 

    private String replaceMessages(String p_sMessage) 
    { 
     Matcher oMatcher; 
     String sKey; 
     String sReplacement; 
     StringBuffer sbTemp = new StringBuffer(); 

     oMatcher = Pattern.compile(LANGUAGE_TAG_PATTERN).matcher(p_sMessage); 
     while(oMatcher.find()) 
     { 
      sKey = oMatcher.group().substring(1,oMatcher.group().length() - 1); 

      sReplacement = StringManager.getString(sKey); 

      if(!sReplacement.startsWith("???")) 
      { 
       oMatcher.appendReplacement(sbTemp,sReplacement); 
      } 
     } 

     oMatcher.appendTail(sbTemp); 

     return sbTemp.toString(); 
    } 
} 

Seconda classe:

package com.spectotechnologies.website.util; 

import com.spectotechnologies.util.BundleManager; 
import com.spectotechnologies.util.FacesSessionManager; 
import java.util.Locale; 

/** 
* set-up and interface a BundleManager 
* save the bundleManager into the session 
* @author Charles Montigny 
*/ 
public final class StringManager 
{ 
    /** the session name of this class bundle manager */ 
    public static final String BUNDLE_MANAGER_SESSION_NAME = "StringManager_BundleManager"; 

    /** List of ResourceBundle names to load. 
    * Will be load in order. 
    * The last ones values may overrite the first ones values. */ 
    private final static String[] BUNDLE_LIST = { 
     "com.spectotechnologies.hibernate.validation.resources.ValidationMessages", 
     "com.spectotechnologies.website.general.resources.ValidationMessages", 
     "com.spectotechnologies.website.general.resources.General"}; 

    /** bundle manager */ 
    private static BundleManager m_oBundleManager = null; 

    private static BundleManager getBundleManager() 
    { 
     if(m_oBundleManager == null) 
     { 
      // get the bundle into the session 
      m_oBundleManager = (BundleManager)FacesSessionManager.getObject(BUNDLE_MANAGER_SESSION_NAME); 
      if(m_oBundleManager == null) 
      { 
       // session was empty, load a new one 
       m_oBundleManager = new BundleManager(); 
       for(int iIndex = 0; iIndex < BUNDLE_LIST.length; iIndex++) 
       { 
        m_oBundleManager.addBundle(BUNDLE_LIST[iIndex]); 
       } 
       // add the bundle to the session 
       FacesSessionManager.setObject(BUNDLE_MANAGER_SESSION_NAME, m_oBundleManager); 
      } 
     } 
     return m_oBundleManager; 
    } 

    /** 
    * get a string value in the bundle manager by a string key 
    * @param p_sKey the string key 
    * @return the value of the string key 
    */ 
    public static String getString(String p_sKey) 
    { 
     return getBundleManager().getStringValue(p_sKey); 
    } 

    /** 
    * set the locale 
    * @param p_oLocale the locale to set 
    */ 
    public static void setLocale(Locale p_oLocale) 
    { 
     getBundleManager().setLocale(p_oLocale); 

     // update the session 
     FacesSessionManager.setObject(BUNDLE_MANAGER_SESSION_NAME, 
       getBundleManager()); 
    } 
} 

Dopo è necessario eseguire l'override BUNDLE_LIST con i tuoi file di proprietà. Una volta fatto, usalo in questo modo:

sMessage = StringManager.getString("website.validation.modifySystem.modified"); 

Se avete domande, non esitate!

EDIT:

È inoltre necessario dichiarare la MessageInterpolator

META-INF/validazione.xml

<validation-config 
    xmlns="http://jboss.org/xml/ns/javax/validation/configuration" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://jboss.org/xml/ns/javax/validation/configuration"> 
    <message-interpolator>com.spectotechnologies.website.util.MessageInterpolator</message-interpolator> 
</validation-config> 
2

Altra possibilità:

faces-config.xml

<?xml version='1.0' encoding='UTF-8'?> 
<faces-config ...> 
    <application> 
    <locale-config> 
     <default-locale>de</default-locale> 
    </locale-config> 
    <resource-bundle> 
     <base-name>de.fhb.resources.text.backend</base-name> 
     <var>backendText</var> 
    </resource-bundle> 
    </application> 
</faces-config> 

YourBean.java

FacesContext context = FacesContext.getCurrentInstance(); 
Application app = context.getApplication(); 
ResourceBundle backendText = app.getResourceBundle(context, "backendText"); 
backendText.getString("your.property.key"); 
Problemi correlati