我正在尝试翻译“RoomType”表。
我创建了一个“文本”表,其中包含:
Id, LangID, TranslatedText
001, EN, Single
001, IT, Singola
002, EN, Double
002, IT, Doppia
这是DB Schema
表RoomType包含: ID,TextID,MaxBed 01,001,1 02,002,2
我需要创建一个连接RoomType和Text的nHibernate映射,并允许在LandID = CurrentLanguage上加载带有WHERE子句的RoomType排队文本。
这是一个小小的映射,但我不知道接下来会怎么做:
public class RoomTypeaMap : ClassMapping<RoomType>
{
public RoomTypeaMap()
{
Join("Texts", el =>
{
el.Key(k => k.Column("TextID"));
});
}
}
作为替代方案,我可以为每种语言添加一列
在这种情况下,我需要映射获取从和(偏好)到不同列的房型的本地化名称。
这样的事情:
public class RoomTypeaMap : ClassMapping<RoomType>
{
public RoomTypeaMap()
{
Property(el => el.Name, m =>
{
m.Formula("Name_" + currentLanguage);
});
}
}
我找到了这篇有趣的帖子,但它对我没有帮助: http://nhforge.org/wikis/howtonh/localization-techniques.aspx
感谢您的帮助!!
答案 0 :(得分:2)
我将摆脱语言表并将文本表作为地图的元素表
public class RoomType
{
public virtual int Id { get; set; }
public virtual IDictionary<string, string> Names { get; private set; }
public virtual string Name
{
get { return Names[Thread.CurrentThread.CurrentUICulture.Name]; } // FIXME: fall back to default language if language not available
set { Names[Thread.CurrentThread.CurrentUICulture.Name] = value; }
}
}
并使用folling Mapping
public RoomTypeMap()
{
[...]
HasMany(mc => mc.Names)
.Table("Texts")
.KeyColumn("RoomType_id")
.AsMap("language_id")
.Element("value")
更新
实施回退
string name;
var currentlanguage = Thread.CurrentThread.CurrentUICulture; // eg en-US
if (!map.TryGetValue(currentlanguage.Name, out result) && // en-US
!map.TryGetValue(currentlanguage.Parent.Name, out result)) // en
{
result = "fallback name";
}
return name;