2012-12-01 22 views
11

<resource-bundle>ファイルを使用して、JSFページでi18nテキストを使用できます。マネージドBeanのリソースバンドルプロパティを読み取る

しかし、マネージドBeanでこれらの同じプロパティにアクセスして、facesメッセージにi18n値を設定することは可能ですか?あなたがオーバーライドする必要が後

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

ファーストクラス:

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

セカンドクラスここで

答えて

39

次のようにあなたがそれを設定したと仮定すると

@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

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

をそれとも、代わりに、JSFのCDIで豆を管理している場合は、そのための@Producerを作成することができます:VERSは、あなただけのコードでベース名を繰り返す必要があると思い

public class BundleProducer { 

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

} 

し、以下のようにそれを注入:

@Inject 
private PropertyResourceBundle text; 

また、MessagesクラスのJSFユーティリティライブラリOmniFacesを使用している場合は、すべてのMessageメソッドでバンドルを利用できるようにリゾルバを1回設定することができます。

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

''でのみスコープということproppertiesファイルにアクセスできますか? –

+0

@Kuriel:JSF '@ ManagedProperty'は、より広い範囲に狭いスコープを注入することができません。 CDIの '@Iject'のみです。 CDIを使用する場合は、リソースバンドルファイルにパラメータを指定してテキストを書き込む際に、構文形式を使用する必要があります@stackoverflow.com/q/28045667 – BalusC

+0

@ BalusCにお進みください。 –

1

は、私はのように簡単ではあるが、少なくとも作業ではなく、使用しているソリューションです。 BUNDLE_LISTにプロパティファイルを追加します。完了したら、次のように使用してください:

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

ご質問がある場合は、お気軽にお問い合わせください。

EDIT:

またMessageInterpolator

META-INF /検証を宣言する必要があります。あなたのBeanがリクエストスコープです

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

場合は、あなただけの<var>によって@ManagedPropertyとして<resource-bundle>を注入することができます: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あなたのBeanがリクエストスコープです場合

FacesContext context = FacesContext.getCurrentInstance(); 
Application app = context.getApplication(); 
ResourceBundle backendText = app.getResourceBundle(context, "backendText"); 
backendText.getString("your.property.key"); 
関連する問題