Настройте 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());