【问题标题】:Localized entities in database数据库中的本地化实体
【发布时间】:2020-05-03 21:02:21
【问题描述】:

我正在开发一个 ASP.NET Core MVC 应用程序,需要为实体设计多语言值。有很多关于如何使用 .resx 在 UI 页面中支持本地化的信息。我正在寻找一些常见的模式来支持实体的本地化(而不是网页上的静态内容),它可以由用户编辑。

假设数据库表中有一个带有状态的简单字典

Id     Name
----------------------------------------------
1      Not processed
2      To be cancelled
3      To be corrected
4      Processed
5      Rejected

用户可以创建新状态或添加其他语言的翻译。问题是如何设计表格以及如何存储其他语言的翻译?

目前我有几种方法

1) 使用所有支持的语言创建表 Languages。创建表Translations

  Id   LanguageId  Key              Value
  ------------------------------------------------
  1    en          NotProcessed     Not processed
  2    pl          NotProcessed     Nie przetworzony
  3    de          NotProcessed     Nicht verarbeitet
  4    en          ToBeCancelled    To be cancelled
  5    de          ToBeCancelled    Zu stornieren

状态表将是

    Id     Name                   TranslationKey
    ----------------------------------------------
    1      Not processed          NotProcessed        
    2      To be cancelled        ToBeCancelled    

然后根据语言选择将显示给用户的适当翻译。

2) 不要创建 Translations 表,而是添加列

  Id     Name                   Translations
    ----------------------------------------------
    1      Not processed          en:Not processed;pl:Nie przetworzony;de:Nicht verarbeitet      
    2      To be cancelled        en:To be cancelled;de:Zu stornieren

你怎么看?我不知道如何为我的实体保留翻译,可能有一些可靠的方法。请建议。

【问题讨论】:

  • 我不喜欢使用基于数据库的本地化。但如果必须,我会选择第一个,因为它使用的是标准化且更高效的表。
  • 另见an open source implementation,他们也几乎使用第一种方法。

标签: asp.net-core design-patterns database-design localization translation


【解决方案1】:

我通过创建语言表和翻译表来执行类似于方法 1 的操作。但是翻译表是基于实体的,这意味着每个实体类型也有自己的实体翻译类型。

实体翻译包含所有可本地化的字段(例如标题、正文),主实体包含非本地化字段(例如发布日期等)

public class Language
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public class Article
{
    public int Id { get; set; }
    public DateTime PublishDate { get; set; }
    public ICollection<ArticleTranslation> Translations { get; set; }
}

public class ArticleTranslation
{
    public int Id { get; set; }

    public string Title { get; set; }
    public string Body { get; set; }

    public int ArticleId { get; set; }
    public Article Article { get; set; }

    public int LanguageId { get; set; }
    public Language Language { get; set; }

}

您也可以使用virtual关键字来支持延迟加载相关翻译或主要实体。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-22
    • 2017-09-27
    • 2017-06-09
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    • 2017-04-05
    • 1970-01-01
    相关资源
    最近更新 更多