2015-03-02 50 views
5

在一把umbraco V6很可能得到一个dictionaryitem使用下面的命令:Umbraco通过语言获得词典项目,怎么样?

umbraco.library.GetDictionaryItem("EmailSubject"); 

这检索,这取决于文化的用户访问该网站的一把umbraco“Emailsubject的”的正确价值。

现在我正在写一个简单的电子邮件类库,我不关心System.Threading.Thread.CurrentThread.CurrentCulture,我不想在获取值之前始终设置CurrentCulture。它有效,但我不喜欢这种方法。我在写一个简单的邮件库。对于每个邮件收件人,我认为设置这样的文化并不是很有效。

我找到了解决方案(网上搜索,我失去了源抱歉)是下面的例子:

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

例获得德国的“EmailSubject”,使用我的帮助者:

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

This works(使用umbraco 6.2.x进行了测试),但正如您可以注意到的,每当您想要这样的文本时,都必须创建一个umbraco.cms.businesslogic.Dictionary.DictionaryItem类的新实例...这是不必要的不好,但我想知道是否有一个静态方法可用于此,也许允许指定语言或文化(作为字符串),而不是语言或文化身份证,这可能会在不同的环境中有所不同...

由于umbraco API是巨大的(有时一些很酷的功能没有记录),我找不到更好的解决方案,我想知道是否有更好的umbraco“本地”方式来实现这一点,而不需要像上面列出的那样的辅助方法。

在你的回答中,请列出你正在使用的umbraco版本。

回答

1

据我所知,Umbraco没有静态方法来获取当前的特定语言的字典项目。我必须和你一样按照语言来获取字典项目(我使用的是Umbraco 7.2.8版本)。但是,我通过由Umbraco提供的功能获得语言列表。

我希望Umbraco会在未来的版本中加入这个功能。正如你所说,我认为这是必要的。

+0

那么你得到整个列表并将其加载到缓存中?对于每种语言?什么umbraco功能指的是? – 2016-01-13 16:46:43

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 2017-01-26 09:39:08