2015-03-02 21 views
5

In Umbraco V6 è possibile ottenere un dictionaryitem con il seguente comando:Umbraco ottiene voce del dizionario per lingua, come?

umbraco.library.GetDictionaryItem("EmailSubject"); 

Questo recupera il valore corretto di "EmailSubject" a seconda di quale cultura l'utente sta visitando il sito Umbraco.

Ora sto scrivendo una semplice libreria di classi di posta elettronica in cui non mi interessa System.Threading.Thread.CurrentThread.CurrentCulture e non voglio impostare il CurrentCulture tutto il tempo, prima di ottenere il valore. Funziona, ma non mi piace l'approccio. Sto scrivendo una semplice libreria di mailing. Per ogni destinatario della posta penso che non sia davvero efficace impostare la cultura in questo modo.

La soluzione che ho trovato (ricerca online, ho perso la fonte sorry) è il seguente esempio:

//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); 

ho creato un po 'di metodo di supporto per rendere più facile:

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

Esempio per ottenere il "EmailSubject" in tedesco, usando i miei aiutanti:

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

questo funziona (testato con umbraco 6.2.x) ma come si può notare, ogni volta che si desidera un testo come questo, deve essere creata una nuova istanza della classe umbraco.cms.businesslogic.Dictionary.DictionaryItem ... che non è necessaria male ma mi stavo chiedendo se fosse disponibile un metodo statico per questo, forse permettendomi di specificare la lingua o cultura (come stringa) invece della lingua o id cultura che può differire in ambienti diversi ...

Dal momento che il L'API di umbraco è enorme (ea volte alcune funzionalità interessanti sono prive di documenti) e non sono riuscito a trovare una soluzione migliore per questo, mi chiedevo se esiste un modo migliore "nativo" di umbraco per ottenere questo, senza metodi di supporto extra come ho elencato sopra.

Nella risposta, indicare la versione di umbraco che si sta utilizzando.

risposta

1

Per quanto ne so, Umbraco non ha il metodo statico per ottenere l'elemento dizionario da una lingua specifica al momento. Devo fare lo stesso per ottenere l'elemento del dizionario per lingua (ho usato Umbraco versione 7.2.8). Tuttavia, ottengo la lista delle lingue per funzione fornita da Umbraco.

Spero che Umbraco aggiungerà questa funzione nelle versioni future. Penso che sia necessario come hai detto tu.

+0

Quindi si ottiene l'intero elenco e lo si carica nella cache? Per ogni lingua? A quale funzione di umbraco ci si riferisce? –

7

Utilizzare lo LocalizationService per ottenere l'elemento del dizionario per lingua. Ho creato un metodo statico che esegue questa operazione:

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

Ho aggiunto lo stesso metodo di estensione alla classe UmbracoHelper ... – Yoeri