读取托pipebean中的资源包属性

使用<resource-bundle>文件我可以在我的JSF页面中使用i18n文本。

但是,是否有可能在我的托pipebean中访问这些相同的属性,所以我可以用i18n值来设置消息的面孔?

假设你已经configuration它如下:

 <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在更广的范围内,那么在方法local scope中以编程方式评估#{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本身已经在做的那样,你只需要在代码中重复基本名称:

 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来pipe理bean,那么您可以为此创build一个@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实用程序库OmniFaces的Messages类,则只需设置一次parsing器即可让所有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); } }); 

另请参阅javadoc和showcase页面中的示例。

另一种可能性

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

这是我正在使用的一个解决scheme,不是那么简单,但至less是工作:

头等舱:

 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 / validation.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>