2011-07-22 11 views
6

में एकाधिक संसाधन बंडलों का उपयोग करके मैं एक जेएसएफ पृष्ठ से एकाधिक संसाधन बंडलों तक पहुंचने का प्रयास कर रहा हूं। मैं एक JSF फ़ाइल में इन दोनों संसाधन बंडलों उपयोग करना चाहतेजेएसएफ

  • general_messages.properties
  • module_message.properties

: मैं दो संसाधन बंडलों की है। एक तरह से मैं यह कर सकता इन बंडलों से प्रत्येक के लिए विशिष्ट गुण को परिभाषित करने के लिए है:

<f:loadBundle basename="com.sample.general_messages" var="general"/> 
<f:loadBundle basename="com.sample.module_message" var="module"/> 

है वहाँ एक रास्ता मैं इन दोनों संसाधन में एक ही चर नाम का उपयोग कर बंडलों पहुँच सकते हैं। कुछ की तरह:

<f:loadBundle basename="com.sample.general_messages, com.sample.module_message" var="general"/> 

या एक से अधिक संसाधन बंडलों का उपयोग करने की किसी भी अन्य सबसे अच्छा तरीका है?

+0

मैं सोच रहा था कि क्या स्प्रिंग फ्रेमवर्क के लिए इसका समाधान है? – Abdul

उत्तर

5

आपने वसंत के साथ अपना प्रश्न टैग किया है, इसलिए मैं आपको स्प्रिंग मेसेजसोर्स का उपयोग करने की सलाह देता हूं। स्प्रिंग मेसेजसोर्स कई संपत्ति फ़ाइलों को भी पदानुक्रमित कर सकता है। यह आपको पुराने जावा ResourceBundle पर कई फायदे देता है।

आप इस तरह आप spring-config.xml में वसंत MessageSource परिभाषित कर सकते हैं:

<!-- 
Application messages configuration. 
--> 
<bean id="messageSource" name="resourceBundle" 
    class="org.springframework.context.support.ReloadableResourceBundleMessageSource" 
    p:fallbackToSystemLocale="false" 
    p:cacheSeconds="0"> 
    <property name="basenames"> 
     <list> 
      <value>/messages/Messages</value> 
<!--  <value>${application.messages}</value>--> 
     </list> 
    </property> 
</bean> 

से आप परिभाषित कर सकते हैं अपने Class जो इस तरह ResourceBundle फैली (कुछ सफाई और पुनर्रचना की जरूरत है):

public class SpringResourceBundle extends ResourceBundle 
{ 

    private MessageSource messages; 
    private FacesContext fc; 
    private Locale locale = null; 

    public SpringResourceBundle() 
    { 
     fc = FacesContext.getCurrentInstance(); 
     WebApplicationContext webAppCtx = (WebApplicationContext) fc.getExternalContext().getApplicationMap().get(
       WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE); 
     messages = (MessageSource) webAppCtx.getBean("messageSource"); 
    } 

    @Override 
    public Locale getLocale() 
    { 
     Locale loc = fc.getELContext().getLocale(); 
     if (fc.getExternalContext() != null) { 
      loc = fc.getExternalContext().getRequestLocale(); 
     } 
     try { 
      UIViewRoot viewRoot = fc.getViewRoot(); 
      if (viewRoot != null) { 
       loc = viewRoot.getLocale(); 
      } 
      if (loc == null) { 
       loc = fc.getApplication().getDefaultLocale(); 
      } 

     } catch (Throwable th) { 
      System.out.println(th.getMessage()); 
      loc = locale; 
     } 
     locale = loc; 
     return loc; 
    } 

    @Override 
    protected Object handleGetObject(String key) 
    { 
     try { 
      return messages.getMessage(key, null, getLocale()); 
     } catch (NoSuchMessageException e) { 
      return "???" + key + "???"; 
     } 
    } 

    @Override 
    public Enumeration<String> getKeys() 
    { 
     return Collections.enumeration(Collections.EMPTY_LIST); 
    } 
} 

Finnaly में faces-config.xml उपरोक्त वर्ग के साथ अपना संसाधन बंडल घोषित करें। कुछ ऐसा:

<application> 
    <locale-config> 
     <default-locale>en</default-locale> 
     <supported-locale>cs</supported-locale> 
     <supported-locale>de</supported-locale> 
     <supported-locale>en</supported-locale> 
    </locale-config> 
    <message-bundle>your.package.SpringResourceBundle</message-bundle> 
</application> 

यहां आप जेएसएफ में स्प्रिंग मेसेजसोर्स जाते हैं।उम्मीद है कि यह समझ में आता है।

0

यदि दो संसाधन बंडलों में एक ही कुंजी होती है, तो इस कुंजी को हल करने के लिए कौन से संसाधन बंडलों का उपयोग किया जाना चाहिए? तो, आईएमओ, मुझे नहीं लगता कि एक ही वैरिएबल नाम एकाधिक संसाधन बंडलों को सौंपा जा सकता है।

शायद, आप अपने बिल्ड प्रक्रिया में एक भी .properties में सभी .properties विलय कर सकते हैं (यकीन है कि मर्ज किए गए गुण फ़ाइल में सभी चाबियाँ, अद्वितीय है उदाहरण के लिए, प्रत्येक कुंजी में कुछ उपसर्ग जोड़कर बनाते हैं।)। फिर आप पूरे एप्लिकेशन में इस एकल विलय .properties का उपयोग करते हैं।

+0

यह समाधान में से एक है, लेकिन अगर किसी को एप्लिकेशन को मॉड्यूलर करना है, और जब बहुत सारे फ़ील्ड हैं, तो एक प्रॉपर्टी फ़ाइल में सबकुछ होने से बेकार और अप्रबंधनीय बन जाएगा। इस समस्या को हल करने के लिए वास्तव में एक समाधान होना चाहिए। मैं इसे कैसे काम करता हूं इस पर और अधिक जानने की कोशिश कर रहा हूं। विचार के लिए एक त्वरित भोजन: क्या स्प्रिंग फ्रेमवर्क हमें समाधान प्रदान करता है ?? – Abdul

0

एकमात्र स्थिति (जिसे मैं जानता हूं) जिसमें जेएसएफ एक ही बंडल के लिए एकाधिक फाइलों की जांच करता है, यदि आप एकाधिक लोकेशंस के लिए बंडल प्रदान कर रहे हैं (Providing Localized Messages and Labels देखें)।

आप f:loadBundle टैग को उस वर्ग में इंगित करने में सक्षम हो सकते हैं जो गुण फ़ाइल के बजाय ResourceBundle बढ़ाता है और उस गुण का उपयोग एकाधिक गुण फ़ाइलों को संदर्भित करने के लिए करता है। हालांकि मैंने पहले कोशिश नहीं की है।

इसके अलावा, यदि आप सीम का उपयोग कर रहे हैं, तो यह कई 'ग्लोबल' बंडलों के साथ-साथ बंडलों को पंजीकृत करने की क्षमता प्रदान करता है जो अधिक विचारों (फेसलेट) से जुड़े हो सकते हैं, जिनमें से सभी को messages का उपयोग करके संदर्भित किया जा सकता है। #{messages.my_message} जैसा कि here वर्णित है (यह सीम 2 के लिए है, यह सीम 3 में थोड़ा अलग हो सकता है)। मुझे लगता है कि आप इसके बाद क्या कर रहे हैं।