2012-09-17 1 views
1

나는 마녀 언어에 따라 번역을 얻기 위해 NHibernate를 설정하려고합니다. 제공합니다. 나는 또한 내가 현재 사용하고 어떤 언어를 알고있는 것은이번역을 얻으려면 nHibernate를 설정하십시오

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

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

    public string GetSuffix() 
    { 
     return DatabaseSuffix; 
    } 
} 

:

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

는 특성은 다음과 같습니다 번역 내 :

나는 다음과 같이 보일 클래스가

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

아무튼을 페치 할 때 규칙을 사용하여 nhibernate를 설정하고 싶습니다. 그것은 (한 번에 모든 번역을 얻을 어쩌면 나) 각 속성에 대해 다음과 같이 내 번역 테이블에 대해 쿼리해야 번역 - 속성이 속성이 g :

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()); 
관련 문제