asp.net核心中的可本地化实体

时间:2018-03-13 13:21:27

标签: asp.net-core-localization

我在控制器中使用' IStringLocalizer' 来本地化我网站上的静态数据! (Link

但是,本地化像NewsEntity或PostEntity这样的实体的最佳方法是什么? 或如何编码可本地化的实体?

public class News : BaseEntity
{
     public string Title { get; set; }
     public string Body { get; set; }
}

{Joking}
public class News : BaseEntity
{
     public string TitleEn { get; set; }
     public string BodyEn { get; set; }

     public string TitleDe { get; set; }
     public string BodyDe { get; set; }
     ...
}

1 个答案:

答案 0 :(得分:0)

对于此类:

public class News : BaseEntity
{
   public string TitleEn { get; set; }
   public string BodyEn { get; set; }
   public string TitleDe { get; set; }
   public string BodyDe { get; set; }
}

您可以执行以下操作:

public class BaseEntity
{
   protected bool IsGerman => Thread.CurrentThread.CurrentUICulture.TwoLetterISOLanguageName == "de"
}

public class News : BaseEntity
{
   public string Title => IsGerman ? TitleDe : TitleEn

   public string Body => IsGerman ? BodyDe : BodyEn

   public string TitleEn { get; set; }
   public string BodyEn { get; set; }
   public string TitleDe { get; set; }
   public string BodyDe { get; set; }
}

要获得更大的扩展性,您可以更改数据库结构。而不是新闻表具有每种语言的字符串。您可以有一个这样的表:

dbo.News
TitleResource: ResourceId
BodyResource: ResourceId

dbo.Resource
ResourceId: int

dbo.Language
LanguageId: int
LanguageName: string

dbo.ResourceValue
ResourceValueId
ResourceId
Value: string
LanguageId 

这样,任何一种表在每种语言中具有不同的字符串,而不是存储语言本身,而是将一个ID存储到该字符串的资源中。然后将有多个ResourceValues,其中包含针对不同语言的字符串,指向相同的Resource。 所有可能的语言选择将在“语言”表中。这样,如果您添加一种新的语言,则无需更改代码中的任何一行,只需在“语言”表中添加新行,代码就可以选择它并知道如何将字符串解析为该语言,并建议用户填写该语言。