Прежде всего, используя класс с свойством для каждого языка, вы ограничиваете себя. Вам всегда придется добавлять новые свойства, если вы добавляете новые языки, которые, конечно, были бы выполнимы, но излишне сложны. Кроме того, вы обычно имеете язык в виде объекта string-i sh (или сможете конвертировать), следовательно, это приведет к такому коду
Localized<string> name = ...;
switch(language)
{
case "en":
return name.en;
case "ar":
return name.ar;
case "fr":
return name.fr;
default:
throw new LocalizationException();
}
, который подвержен ошибкам и слишком сложен , Для вашей проблемы, я думаю, я бы решил использовать какой-то словарь
IDictionary<string, string> names = ...;
if(names.ContainsKey(language))
{
return names[language];
}
else
{
throw new LocalizationException();
}
, который легко расширяется, просто добавляя дополнительные переводы в словарь.
Для преобразования вашего JSON string
до IDcitionary<string, string>
, вы можете использовать следующий код
localizedNames = JObject.Parse(Name)
.Children()
.OfType<JProperty>()
.ToDictionary(property => property.Name,
property => property.Value.ToString());
В вашем классе это будет эффективно
public class Place
{
[Key, Column("id")]
public int Id { get; set; }
[Column("name")]
public string Name { get; set; }
public Dictionary<string, string> LocalizedNames
{
get
{
return JObject.Parse(Name)
.Children()
.OfType<JProperty>()
.ToDictionary(property => property.Name,
property => property.Value.ToString());
}
}
}
Доступ к локализованным значениям можно получить, например,
var localizedPlaceName = place.LocalizedNames[language];
Обратите внимание : В зависимости от ваших потребностей и вариантов использования вы должны рассмотреть следующие вопросы:
Кэширование
В моем фрагменте JSON string
анализируется каждый раз доступ к локализованным именам. В зависимости от того, как часто вы обращаетесь к нему, это может отрицательно сказаться на производительности, которая может быть уменьшена путем кэширования результата (не забудьте удалить кэш, если установлено значение Name
).
Разделение интересов
Предполагается, что класс как таковой является классом чистой модели. Возможно, вы захотите ввести классы домена, которые инкапсулируют представленные logi c, вместо добавления logi c к классу модели. Наличие фабрики, которая создает легко локализованные объекты на основе локализуемого объекта и языка, также может быть вариантом.
Обработка ошибок
В моем коде нет обработки ошибок. В зависимости от надежности ввода следует учитывать дополнительную обработку ошибок.