2014-06-19 3 views
5

की मैं कक्षा पथ में तीन संसाधन फ़ाइलों है:कैसे परवाह किए बिना डिफ़ॉल्ट ResourceBundle प्राप्त करने के लिए वर्तमान डिफ़ॉल्ट लोकेल

labels.properties:

language = Default 

labels_en.properties:

language = English 

labels_fr .properties:

language = French 

क्या ResourceBundle ऑब्जेक्ट प्राप्त करने का कोई तरीका है जो हमेशा labels.properties लोड करता है कोई बात नहीं कि मेरा डिफ़ॉल्ट Locale क्या है?

ResourceBundle.getBundle("labels") वर्तमान डिफ़ॉल्ट लोकेल (अपेक्षित के रूप में) के अनुरूप एक देता है।

एकमात्र तरीका जो मैं पा सकता हूं वह डिफ़ॉल्ट लोकेल को एक गैर-मौजूदा लोकेल में सेट करना है, लेकिन यह अन्य मॉड्यूल तोड़ सकता है।

धन्यवाद!

Locale.setDefault(Locale.ENGLISH); 
Assert.assertEquals("English", ResourceBundle.getBundle("labels").getString("language")); 
Locale.setDefault(Locale.FRENCH); 
Assert.assertEquals("French", ResourceBundle.getBundle("labels").getString("language")); 
Assert.assertEquals("French", ResourceBundle.getBundle("labels", new Locale("do-not-exist")).getString("language")); 
Locale.setDefault(new Locale("do-not-exist")); 
Assert.assertEquals("Default", ResourceBundle.getBundle("labels").getString("language")); 
+0

आप प्रयास करने से पहले 'ResourceBundle.clearCache()' कॉल करने के लिए आवश्यकता हो सकती है: 'ResourceBundle .getBundle ("लेबल", नया लोकेल ("अस्तित्व में नहीं है")। getString ("भाषा")); '। ([इस सवाल से] (http://stackoverflow.com/questions/10981521/ गतिशील रूप से-change-resourcebundle-locale-in-java?rq=1))। –

+1

@ डंकन आपकी टिप्पणी के लिए धन्यवाद। हालांकि, यह काम नहीं किया। यदि 'नया लोकेल (" अस्तित्व में नहीं है ") (मुझे इसका नाम होना चाहिए था" अस्तित्व में नहीं है "...) नहीं मिला है, 'संसाधन बंडल'' Locale.getDefault() 'के साथ एक को लोड करने का प्रयास करता है। इसके बजाय, बंडल का डिफ़ॉल्ट संस्करण नहीं है। –

उत्तर

8

आप एक ResourceBundle.Control में पारित कर सकते हैं, जो अनुरोध किया लोकेल की परवाह किए बिना, हमेशा ही जड़ ResourceBundle खोज:

ResourceBundle rootOnly = ResourceBundle.getBundle("labels", 
    new ResourceBundle.Control() { 
     @Override 
     public List<Locale> getCandidateLocales(String name, 
               Locale locale) { 
      return Collections.singletonList(Locale.ROOT); 
     } 
    }); 
+1

धन्यवाद! यह काम करता हैं! मुझे 'Locale.ROOT' के अस्तित्व को नहीं पता था, मैंने सोचा था कि 'नया लोकेल (" ")' की अनुमति नहीं थी ... वैसे, आपका कोड' संसाधन Bundle.getBundle ("लेबल" के बराबर नहीं है, Locale.ROOT) '? क्या 'नियंत्रण' (इस विशिष्ट समस्या के लिए) को विस्तारित करने के अन्य कारण हैं? निम्नलिखित परीक्षण केस पास हो जाता है: 'Locale.setDefault (Locale.ENGLISH); Assert.assertEquals ("डिफ़ॉल्ट", संसाधन Bundle.getBundle ("लेबल", Locale.ROOT) .getString ("भाषा")); ' –

+0

1. हां, ResaleBundle.getBundle को प्रत्येक कॉल में Locale.ROOT को गुजरना वही होगा चीज़। 2. ResourceBundle.Control का उपयोग करने के कई अन्य कारण हैं, जैसे कि बंडलों के कैशिंग को नियंत्रित करना और यह नियंत्रित करना कि संसाधनों के संसाधनों और/या संसाधन बंडल के उप-वर्गों को केवल खोजना है या नहीं। जावाडोक (जिसे मैंने लिंक किया है) उन सभी व्यवहारों को सूचीबद्ध करता है जिन्हें आप ओवरराइड कर सकते हैं। – VGR

संबंधित मुद्दे