2009-03-23 9 views
7

मेरी प्रोजेक्ट में कई प्लगइन्स शामिल हैं और प्रत्येक प्लगइन में 20 अनुवादों के साथ plugin.properties फ़ाइल शामिल है। MANIFEST.MF फ़ाइल उन गुण फ़ाइलों के नाम को परिभाषित करती है जहां बाहरी प्लगइन स्ट्रिंग संग्रहीत की जाती हैं।eclipse में प्लगइन.प्रोपर्टीज तंत्र आरसीपी

Bundle-Localization: plugin 

मैं ग्रहण रनटाइम पर "% plugin.name" plugin.properties फ़ाइल में खोज करेंगे

%plugin.name 

तरह परिभाषित प्लगइन का नाम।

कौन सी कक्षा MANIFEST.MF बंडल-स्थानीयकरण प्रविष्टि को पढ़ती है और किस बिंदु पर "plugin.properties" फ़ाइल में प्रारंभिक '%' प्रत्यय की खोज की जाती है?

मैं इस वर्ग को इस तरह से ढूंढना और पैच करना चाहता हूं, कि मैं पहले "% plugin.name" पहचानकर्ता के लिए कुछ अन्य निर्देशिका/फ़ाइलों को देख सकता हूं। इन नए तंत्र के साथ मैं अपने उत्पाद में टुकड़े जोड़ सकता हूं और मूल प्लगइन को बदले बिना "प्लगइन.प्रोपर्टीज" फ़ाइल में एकल लाइनों को ओवरराइट कर सकता हूं। इन तंत्रों के साथ मैं अलग-अलग टुकड़ों को जोड़कर कई ग्राहकों के लिए एक बिल्ड प्रक्रिया बना सकता हूं। ग्राहक नाम और विशेष स्ट्रिंग समेत टुकड़े वे बदलना चाहते हैं।

मैं इसे इस तरह से करना चाहता हूं, क्योंकि खंड तंत्र केवल मूल प्लगइन में फ़ाइलें जोड़ता है। जब प्लगइन में "plugin.properties" फ़ाइल मौजूद है, तो खंड "plugin.properties" फ़ाइलों को अनदेखा कर दिया जाता है।

अद्यतन 1:

विधि

class ManifestLocalization{ 
... 
protected ResourceBundle getResourceBundle(String localeString) { 
} 
... 
} 

रिटर्न संपत्तियों की ResourceBundle दी स्थानीय स्ट्रिंग के लिए फ़ाइल। जब कोई कहता है कि संसाधन संसाधन प्राप्त करने के लिए अब मैं खंड को कैसे देख सकता हूं, कृपया इसे पोस्ट करें।

अद्यतन 2:

वर्ग ManifestLocalization

private URL findInResolved(String filePath, AbstractBundle bundleHost) { 

     URL result = findInBundle(filePath, bundleHost); 
     if (result != null) 
      return result; 
     return findInFragments(filePath, bundleHost); 
    } 

गुण की खोज पर फाइल और यह कैश में विधि। अनुवाद कैश्ड फ़ाइल से प्राप्त करने के लिए कर सकते हैं। समस्या यह है कि पूरी फ़ाइल कैश की गई है और एकल अनुवाद नहीं है।

एक समाधान बंडल फ़ाइल को पढ़ने से पहले खंड फ़ाइल को पढ़ने के लिए होगा। जब दोनों फाइलें मौजूद हैं तो उन्हें एक फ़ाइल में विलय करें और डिस्क पर नई गुण फ़ाइल लिखें। नई प्रॉपर्टी फ़ाइल का यूआरएल रिटर्न देता है, ताकि नई प्रोपेट्री फाइल कैश हो सके।

उत्तर

3

हालांकि मुझे जानकारी गलत मिली ... मुझे बिल्कुल वही समस्या थी। प्लगइन दो बार सक्रिय नहीं है और मैं टुकड़े नहीं कर सकता बंडल-स्थानीयकरण कुंजी।

मैं प्लगइन.प्रोपर्टीज़ में अपनी सभी भाषा अनुवाद चाहता हूं (मुझे पता है कि यह फहरा हुआ है लेकिन एक फ़ाइल को प्रबंधित करना बहुत आसान है)।

मैं (आधा)

public void populate(Bundle bundle) { 
    String localisation = (String) bundle.getHeaders().get("Bundle-Localization"); 
    Locale locale = Locale.getDefault(); 

    populate(bundle.getEntry(getFileName(localisation))); 
    populate(bundle.getEntry(getFileName(localisation, locale.getLanguage()))); 
    populate(bundle.getEntry(getFileName(localisation, locale.getLanguage(), locale.getCountry()))); 
    populate(bundle.getResource(getFileName("fragment"))); 
    populate(bundle.getResource(getFileName("fragment", locale.getLanguage()))); 
    populate(bundle.getResource(getFileName("fragment", locale.getLanguage(), locale.getCountry()))); 
} 

का उपयोग करके समस्या हल हो और बस मेरी टुकड़ा स्थानीयकरण फ़ाइल नाम 'fragment.properties' कहते हैं।

यह विशेष रूप से सुरुचिपूर्ण नहीं है, लेकिन यह काम करता है।

वैसे, टुकड़े से फाइलें प्राप्त करने के लिए आपको getResource की आवश्यकता है, ऐसा लगता है कि खंड फ़ाइल क्लासपाथ पर हैं, या केवल getResource का उपयोग करते समय खोज की जाती है।

अगर किसी के पास बेहतर दृष्टिकोण है, तो कृपया मुझे सही करें।

सभी बेहतरीन,

मार्क। वांछित संपत्ति फाइलों के साथ एक टुकड़ा - और स्थापित -

+0

जहां मैं जनसंख्या विधि पा सकता हूं? या मुझे इसे लिखना है? –

+0

क्या आप कृपया अपने उत्तर में अधिक जानकारी दे सकते हैं। धन्यवाद! –

0

अपने टुकड़े प्लगइन.प्रोपर्टीज का नाम कुछ और उदाहरण के लिए बदलें। का उपयोग कर टुकड़ा

आपका प्लग-इन plugin.properties का उपयोग कर, दो बार सक्रिय हो जाएगा पहली बार, दूसरी: बंडल-स्थानीयकरण करने के लिए प्लगइन : fragment.properties

अपने टुकड़ा में बंडल-स्थानीयकरण बदल प्रकट खंड .properties।

+0

लेकिन मैं एक अलग कुंजी के लिए एक ही कुंजी का उपयोग नहीं कर सकता। केवल प्लगइन कुंजी मिलती है और लौटा दी जाती है। जब प्लगइन में खोजी गई कुंजी मिलती है तो fragmet कभी नहीं खुलता है –

0

प्लगइन सक्रियण ओएसजीआई रनटाइम विषुव द्वारा संभाला जाता है। हालांकि मैं विशिष्ट व्यवहार बनाने के लिए वहां किसी भी फाइल को पैच करने की कोशिश कर रहा हूं। मार्क से सुझाए गए तरीके से आपकी समस्या के लिए बहुत अधिक दृष्टिकोण दिखता है।

+0

क्या आपका मतलब मार्क मिलर या मार्क क्या है? :) – Peteter

1
/** 
* The Hacked NLS (National Language Support) system. 
* <p> 
* Singleton. 
* 
* @author mima 
*/ 
public final class HackedNLS { 
    private static final HackedNLS instance = new HackedNLS(); 

    private final Map<String, String> translations; 

    private final Set<String> knownMissing; 

    /** 
    * Create the NLS singleton. 
    */ 
    private HackedNLS() { 
     translations = new HashMap<String, String>(); 
     knownMissing = new HashSet<String>(); 
    } 

    /** 
    * Populates the NLS key/value pairs for the current locale. 
    * <p> 
    * Plugin localization files may have any name as long as it is declared in the Manifest under 
    * the Bundle-Localization key. 
    * <p> 
    * Fragments <b>MUST</b> define their localization using the base name 'fragment'. 
    * This is due to the fact that I have no access to the Bundle-Localization key for the 
    * fragment. 
    * This may change. 
    * 
    * @param bundle The bundle to use for population. 
    */ 
    public void populate(Bundle bundle) { 
     String baseName = (String) bundle.getHeaders().get("Bundle-Localization"); 

     populate(getLocalizedEntry(baseName, bundle)); 
     populate(getLocalizedEntry("fragment", bundle)); 
    } 

    private URL getLocalizedEntry(String baseName, Bundle bundle) { 
     Locale locale = Locale.getDefault(); 
     URL entry = bundle.getEntry(getFileName(baseName, locale.getLanguage(), locale.getCountry())); 
     if (entry == null) { 
      entry = bundle.getResource(getFileName(baseName, locale.getLanguage(), locale.getCountry())); 
     } 
     if (entry == null) { 
      entry = bundle.getEntry(getFileName(baseName, locale.getLanguage())); 
     } 
     if (entry == null) { 
      entry = bundle.getResource(getFileName(baseName, locale.getLanguage())); 
     } 
     if (entry == null) { 
      entry = bundle.getEntry(getFileName(baseName)); 
     } 
     if (entry == null) { 
      entry = bundle.getResource(getFileName(baseName)); 
     } 
     return entry; 
    } 

    private String getFileName(String baseName, String...arguments) { 
     String name = baseName; 
     for (int index = 0; index < arguments.length; index++) { 
      name += "_" + arguments[index]; 
     } 
     return name + ".properties"; 
    } 

    private void populate(URL resourceUrl) { 
     if (resourceUrl != null) { 
      Properties props = new Properties(); 
      InputStream stream = null; 
      try { 
       stream = resourceUrl.openStream(); 
       props.load(stream); 
      } catch (IOException e) { 
       warn("Could not open the resource file " + resourceUrl, e); 
      } finally { 
       try { 
        stream.close(); 
       } catch (IOException e) { 
        warn("Could not close stream for resource file " + resourceUrl, e); 
       } 
      } 
      for (Object key : props.keySet()) { 
       translations.put((String) key, (String) props.get(key)); 
      } 
     } 
    } 

    /** 
    * @param key The key to translate. 
    * @param arguments Array of arguments to format into the translated text. May be empty. 
    * @return The formatted translated string. 
    */ 
    public String getTranslated(String key, Object...arguments) { 
     String translation = translations.get(key); 
     if (translation != null) { 
      if (arguments != null) { 
       translation = MessageFormat.format(translation, arguments); 
      } 
     } else { 
      translation = "!! " + key; 
      if (!knownMissing.contains(key)) { 
       warn("Could not find any translation text for " + key, null); 
       knownMissing.add(key); 
      } 
     } 
     return translation; 
    } 

    private void warn(String string, Throwable cause) { 
     Status status; 
     if (cause == null) { 
      status = new Status(
        IStatus.ERROR, 
        MiddlewareActivator.PLUGIN_ID, 
        string); 
     } else { 
      status = new Status(
       IStatus.ERROR, 
       MiddlewareActivator.PLUGIN_ID, 
       string, 
       cause); 
     } 
     MiddlewareActivator.getDefault().getLog().log(status); 

    } 

    /** 
    * @return The NLS instance. 
    */ 
    public static HackedNLS getInstance() { 
     return instance; 
    } 

    /** 
    * @param key The key to translate. 
    * @param arguments Array of arguments to format into the translated text. May be empty. 
    * @return The formatted translated string. 
    */ 
    public static String getText(String key, Object...arguments) { 
     return getInstance().getTranslated(key, arguments); 
    } 
} 
+0

GetLocalizedEntry bundle.getResource और bundle.getEntry को क्लासपाथ (जो टुकड़े में पाए जाते हैं) पर फ़ाइलों के रूप में आवश्यक है, संसाधन के लिए आवश्यक है जबकि प्लगइन रूट (प्लगइन स्थानीयकरण) में उन लोगों को getEntry की आवश्यकता होती है। फिर, अगर किसी के पास कोई बेहतर उत्तर है तो कृपया हमें बताएं क्योंकि मुझे भी रूचि होगी। –

+0

मैं अस्पष्ट हूं कि आपके द्वारा प्रदान की गई कक्षा का उपयोग कैसे करें। उदाहरण के लिए bundle.properties फ़ाइल को देखने से अलग तरीके से प्लगइन.एक्सएमएल फ़ाइल में घोषित एक परिप्रेक्ष्य नाम का अनुवाद करने के लिए इसका उपयोग किया जा सकता है? – Peteter

0

एक तरह से एक बंडल श्रोता संलग्न करने के लिए, और (और शायद यह भी पहले से ही स्थापित बंडलों को देखो) बंडलों के प्रतिष्ठानों के लिए सुनने और हर बंडल उत्पन्न/प्रदान करना है । यदि आवेदन शुरू होने से पहले यह किया जाता है, तो इसका प्रभाव होना चाहिए।