Мы храним один документ для всех языков.Примером являются продукты, которые имеют названия и описания.В этом документе любое свойство, которое должно быть переводимым, то есть обращенное к клиенту, настроено на использование разработанного нами пользовательского класса под названием LocalizeString
.
В наших операциях CRUD нет ничего особенного.Использовал этот подход в течение нескольких лет, и он работал довольно хорошо.HTH.
Вот пользовательский класс:
public class LocalizedString
{
public const string DefaultLanugage = "en";
public const string French = "fr";
public const string German = "de";
public const string Italian = "it";
public const string Portuguese = "pt";
public const string Spanish = "es";
public LocalizedString()
{
Translations = new Dictionary<string, string>();
}
public static Dictionary<string, string> AvailableLanguages = new Dictionary<string, string>
{
{ DefaultLanugage, "English" },
{ Spanish, "Spanish" },
{ French, "French" },
{ Italian, "Italian" },
{ Portuguese, "Portuguese" },
{ German, "German" }
};
public LocalizedString(string value, string lanuage = DefaultLanugage)
{
Translations = new Dictionary<string, string>
{
{ lanuage, value }
};
}
public Dictionary<string, string> Translations { get; set; }
public string GetValue(string language = DefaultLanugage)
{
if (Translations.ContainsKey(language))
{
return Translations[language];
}
if (Translations.ContainsKey(DefaultLanugage))
{
return Translations[DefaultLanugage];
}
return string.Empty;
}
public static LocalizedString SetValue(LocalizedString item, string value, string lanuage = DefaultLanugage)
{
if (item == null)
{
item = new LocalizedString();
}
if (item.Translations.ContainsKey(lanuage))
{
item.Translations[lanuage] = value;
}
else
{
item.Translations.Add(lanuage, value);
}
return item;
}
public static List<CultureInfo> SupportedCultures => AvailableLanguages.Select(x => new CultureInfo(x.Key)).ToList();
}
Использование выглядит следующим образом:
public class Product
{
public LocalizedString Description { get; set; }
...
}
// Setting the value
item.Description = LocalizedString.SetValue(item.Description, model.TranslatedVersion.Description, model.SelectedLanugage);
// Getting the value
item.Description.GetValue(request.SelectedLanguage)
Вот как выглядит json:
"Description": {
"Translations": {
"en": "Standard",
"es": "Estándar"
}
}