2015-03-02 7 views
5

Umbraco में V6 यह निम्न आदेश के साथ एक dictionaryitem प्राप्त करना संभव है:उम्ब्राको भाषा द्वारा शब्दकोश वस्तु को मिलता है, कैसे?

umbraco.library.GetDictionaryItem("EmailSubject"); 

यह निर्भर करता है जो संस्कृति पर उपयोगकर्ता Umbraco वेबसाइट पर जाकर है "EmailSubject" के समुचित मान प्राप्त करता है।

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

समाधान मैंने पाया (ऑनलाइन खोज, मैं स्रोत खो खेद) निम्नलिखित उदाहरण है:

//2 = the 2nd language installed under Settings > Languages, which is German in my case 
var sometext = new umbraco.cms.businesslogic.Dictionary.DictionaryItem("SomeText").Value(2); 

मेरे द्वारा बनाए गए कुछ सहायक विधि यह आसान बनाने के लिए: प्राप्त करने के लिए

private string GetDictionaryText(string dictionaryItem, string language) 
{ 
    //try to retrieve from the cache 
    string dictionaryText = (string)HttpContext.Current.Cache.Get(dictionaryItem + language); 

    if (dictionaryText == null) 
    { 
     dictionaryText = new umbraco.cms.businesslogic.Dictionary.DictionaryItem(dictionaryItem).Value(GetLanguageId(language)); 
     //add to cache 
     HttpContext.Current.Cache.Insert(dictionaryItem + language, dictionaryText, null, DateTime.Now.AddMinutes(10), TimeSpan.Zero); 
    } 

    return dictionaryText; 
} 

private int GetLanguageId(string language) 
{ 
    int languageId = 1; //1 = english, 2 = german, 3 = french, 4 = italian 

    switch (language) 
    { 
     case "de": 
      languageId = 2; 
      break; 
     case "fr": 
      languageId = 3; 
      break; 
     case "it": 
      languageId = 4; 
      break; 
    } 

    return languageId; 
} 

उदाहरण जर्मन में "ईमेलसब्जेक्ट", मेरे हेल्पर्स का उपयोग करके:

string emailSubject = GetDictionaryText("EmailSubject", "de"); 

यह काम करता है (ने umbraco 6.2.x के साथ परीक्षण किया) लेकिन जैसा कि आप देख सकते थे, हर बार जब आप इस तरह के एक पाठ चाहते हैं, तो umbraco.cms.businesslogic.Dictionary.DictionaryItem क्लास का एक नया उदाहरण बनाया जाना चाहिए ... जो आवश्यक नहीं है बुरा लेकिन मैं सोच रहा था कि इसके लिए एक स्थिर विधि उपलब्ध है, हो सकता है कि भाषा या संस्कृति आईडी के बजाय भाषा या संस्कृति (स्ट्रिंग के रूप में) निर्दिष्ट करने की अनुमति दे जो अलग-अलग वातावरण में भिन्न हो सकती है ...

चूंकि umbraco API बहुत बड़ा है (और कभी-कभी कुछ ठंडा विशेषताएं अनियंत्रित होती हैं) और मुझे इसके लिए एक बेहतर समाधान नहीं मिल सका, मैं सोच रहा था कि ऊपर सूचीबद्ध किए गए अतिरिक्त सहायक तरीकों के बिना, इसे प्राप्त करने के लिए बेहतर umbraco "मूल" तरीका है या नहीं।

अपने उत्तर में कृपया आप जिस umbraco संस्करण का उपयोग कर रहे हैं उसे सूचीबद्ध करें।

उत्तर

1

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

मुझे उम्मीद है कि उम्ब्राको भविष्य में संस्करणों में इस समारोह को जोड़ देगा। मुझे लगता है कि यह जरूरी है जैसा आपने कहा था।

+0

तो क्या आपको पूरी सूची मिलती है और इसे कैश में लोड किया जाता है? प्रत्येक भाषा के लिए? क्या umbraco समारोह का जिक्र कर रहे हैं? –

7

भाषा द्वारा शब्दकोश आइटम प्राप्त करने के लिए LocalizationService का उपयोग करें। मैंने एक स्थिर विधि बनाई है जो यह करता है:

public static string GetDictionaryValue(string key, CultureInfo culture, UmbracoContext context) 
{ 
    var dictionaryItem = context.Application.Services.LocalizationService.GetDictionaryItemByKey(key); 
    if (dictionaryItem != null) 
    { 
     var translation = dictionaryItem.Translations.SingleOrDefault(x => x.Language.CultureInfo.Equals(culture)); 
     if (translation != null) 
      return translation.Value; 
    } 
    return key; // if not found, return key 
} 
+1

मैंने UmbracoHelper क्लास के विस्तार विधि के समान जोड़ा ... – Yoeri

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