2012-09-17 42 views
1

我试图设置NHibernate获取翻译取决于巫婆languageId我提供。安装nHibernate获取翻译

我有一个类,它是这个样子:

public class Location 
{ 
    public virtual Guid Id { get; set; } 

    [Translate("Name")] 
    public virtual string Name { get; set; } 

    [Translate("Description")] 
    public virtual string Description { get; set; } 

    public virtual bool Popular { get; set; } 
    public virtual bool Active { get; set; } 
} 

我翻译属性看起来是这样的:

[AttributeUsage(AttributeTargets.Property)] 
public class TranslateAttribute : Attribute 
{ 
    public readonly string DatabaseSuffix; 

    public TranslateAttribute(string databaseSuffix) 
    { 
     DatabaseSuffix = databaseSuffix; 
    } 

    public string GetSuffix() 
    { 
     return DatabaseSuffix; 
    } 
} 

我也有了解我目前使用的是什么语言一件事:

public interface ILanguageProvider 
{ 
    void SetLanguage(string language); 
    string GetCurrentLanguage(); 
} 

我想设置nhibernate与约定,所以当提取anythin摹有具有转换属性应该询问对我的翻译表像这样为每个属性(或可能得到的所有翻译一次)的属性:

SELECT TOP 1 Text 
FROM Translations 
WHERE Id = '{Id_From_my_Entity}_DataBaseSuffixFromTheTranslationAttribute' AND 
     LanguageId = LanguageIdFromGetCurrentLanguageInTheImplentationOFILanguageProvider; 

,并设置它回来的结果,其它获得翻译的财产。

这可能吗?我如何实现这个?

即时通讯使用NHibernate 3.3.1.4000和功能NHibernate 1.3.0.733

回答

1

我不会做这个神奇。

使用字典和给出当前名称的属性。这具有如下优点:如果语言被改变,则所有对象将具有可用的正确翻译。

public class MyClass1 
{ 
    protected virtual IDictionary<string, string> Names { get; private set; } 

    public virtual string Name { get { return Names[GetCurrentLanguageFromSomeWhere()]; } } 
} 


public class MyClass1Map : ClassMap<MyClass1> 
{ 
    public MyClass1Map() 
    { 
     [...] 
     HasMany(mc => mc.Names) 
      .Table("Translations") 
      .Where("property == 'Name'") 
      .AsMap("language") 
      .Element("text") 
      .Not.LazyLoad(); 

     HasMany(mc => mc.Descriptions) 
      .Table("Translations") 
      .Where("property == 'Description'") 
      .AsMap("language") 
      .Element("text") 
      .Not.LazyLoad(); 
    } 
} 

,或者使用一个公式如果语言是静态

Map(mc => mc.Name).Formula("... WHERE Language=" + GetCurrentLanguage());