Локализованные объекты в базе данных - PullRequest
0 голосов
/ 17 января 2020

Я занимаюсь разработкой ASP. NET Core MVC приложения и мне нужно разработать многоязычные значения для сущностей. Существует много информации о том, как поддерживать локализацию на страницах пользовательского интерфейса с помощью .resx. Я ищу какой-то общий шаблон поддержки локализации для объектов (не для содержимого stati c на веб-странице), который может редактировать пользователь.

Допустим, в таблице базы данных есть простой словарь со статусами

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) не создавайте таблицу переводов, но добавьте столбец

  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

Что вы думаете об этом? Я не знаю, как сохранить переводы для моих сущностей, может быть, есть несколько надежных способов. Пожалуйста, предложите.

1 Ответ

1 голос
/ 17 января 2020

Я делаю нечто похожее на подход № 1, создавая таблицы языков и таблицы переводов. Но таблицы трансляций основаны на сущностях, то есть каждый тип сущности также имеет свой собственный тип трансляции сущностей.

Трансляция сущности содержит все локализуемые поля (например, Название, Тело), ​​а основная сущность содержит нелокализованные поля (например, publi sh date, et c.)

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 для поддержки отложенной загрузки связанных переводов или основного объекта.

...