2012-12-01 41 views

回答

39

假设你已经配置如下它:

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

如果你的bean是请求范围,你可以通过它的<var>注入<resource-bundle>@ManagedProperty

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

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

或者您只需要一些特定的键:

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

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

但是如果你的bean是在更广的范围,然后在方法的局部范围评估#{text}编程:

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

或者,如果你只需要一些特定的按键:

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

你甚至可以通过标准的ResourceBundle API获得它,就像JSF本身已经在co下做的一样VERS,你只需要在代码中重复的基本名称:

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

或者,如果你被CDI,而不是JSF管理豆类,那么你可以创建一个@Producer

如下
public class BundleProducer { 

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

} 

,并注入它:

@Inject 
private PropertyResourceBundle text; 

或者,如果您使用的是JSF实用程序库OmniFacesMessages类,则只需设置其解析器一次即可让所有Message方法使用该包。

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

另见javadocshowcase page的例子。

+0

'如果你的bean是请求范围'是唯一的作用域可以访问属性文件? –

+0

@Kuriel:JSF'@ ManagedProperty'不能在更广的范围内注入更窄的作用域。只有CDI'@ Inject'是。如果你碰巧使用CDI,请访问http://stackoverflow.com/q/28045667 – BalusC

+0

@BalusC在使用资源包文件中的参数编写文本时应该使用哪种语法形式? –

1

这里是我使用的解决方案,不是那么简单,但至少工作:

第一类:

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

二等:

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

后,你需要重写BUNDLE_LIST与您的属性文件。一旦完成,就这样使用它:

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

如果您有任何问题,请不要犹豫!

编辑:

您还需要声明MessageInterpolator

META-INF /验证。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

另一种可能性:

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