2012-12-01 2 views

Antwort

39

Unter der Annahme, dass Sie es so konfiguriert haben, wie folgt:

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

Wenn Ihr Bean Anfrage ist scoped, kann man einfach die <resource-bundle> als @ManagedProperty durch seine <var> injizieren:

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

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

Oder wenn Sie nur einen bestimmten Schlüssel benötigen:

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

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

Wenn Ihr Bean jedoch in einem breiteren Rahmen, dann auswerten #{text} programmatisch in Verfahren lokalen Bereich:

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

Oder wenn Sie nur einige spezifische Schlüssel brauchen:

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

Sie können es sogar einfach durch die Standard-API ResourceBundle auf die gleiche Weise bekommen, wie JSF selbst bereits unter der Co tut vers, dann würden Sie brauchen nur die Basisnamen im Code zu wiederholen:

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

Oder wenn Sie Bohnen von CDI statt JSF Sie bei der Verwaltung, dann können Sie ein @Producer dafür schaffen:

public class BundleProducer { 

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

} 

Und es injizieren, wie unten:

@Inject 
private PropertyResourceBundle text; 

Wenn Sie alternativ die Messages Klasse der JSF-Dienstprogrammbibliothek OmniFaces verwenden, können Sie den Resolver einfach so festlegen, dass alle Message-Methoden das Bundle verwenden.

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); 
    } 
}); 

Siehe auch das Beispiel in den javadoc und die showcase page.

+0

'Wenn Ihr Bean Anfrage' ist scoped ist, dass der einzige Bereich, der Kann ich auf die Property-Datei zugreifen? –

+0

@Kuriel: JSF '@ ManagedProperty' ist nicht in der Lage, einen engeren Bereich in einem breiteren Umfang zu injizieren. Nur CDI '@ Inject' ist. Wenn Sie CDI verwenden, gehen Sie zu http://stackoverflow.com/q/28045667 – BalusC

+0

@BalusC welche Syntaxform sollte beim Schreiben von Text mit Parametern in der Ressourcenbündel-Datei verwendet werden? –

1

Hier ist eine Lösung, die ich bin, nicht so einfach, aber zumindest Arbeits mit:

Erste Klasse:

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(); 
    } 
} 

Zweite Klasse:

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()); 
    } 
} 

Nachdem Sie außer Kraft setzen müssen BUNDLE_LIST mit Ihren Eigenschaftendateien. Sobald Sie fertig sind, verwenden Sie es wie folgt:

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

Wenn Sie Fragen haben, zögern Sie nicht!

EDIT:

Sie müssen auch die MessageInterpolator

META-INF/Validierung zu erklären.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

Eine andere Möglichkeit:

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"); 
Verwandte Themen