Настройте nHibernate для получения переводов

Я пытаюсь настроить 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 с соглашениями, чтобы при извлечении чего-либо, имеющего свойство, имеющее атрибут Translate, оно должно запрашивать мою таблицу переводов, например, для каждого свойства (или, возможно, получать все переводы одновременно):

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

И установите результат, который он возвращает обратно в свойство, для которого он получает перевод.

Это возможно? и как мне это реализовать?

Я использую nHibernate 3.3.1.4000 и Fluent 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());
Другие вопросы по тегам