using System.Collections; using Newtonsoft.Json.Linq; namespace Pf2eModel.Model.Common.I18n; /// /// Локализованная строка. /// public class LocaleString : ICollection { /// /// Список локализаций строк. /// private readonly List _items = []; /// /// Проверяет наличие хотя бы одной локализации. /// private void AssureDefault() { if (_items.Count == 0) { _items.Add(new(LocaleType.English, string.Empty)); } } /// /// Количество локализаций. /// public int Count => _items.Count; /// /// Коллекция реализованных типов локализаций. /// public ICollection Types => _items.Select(c => c.Locale).ToList(); /// public bool IsReadOnly => false; /// /// Конструктор класса . /// public LocaleString() { AssureDefault(); } /// /// Получение типа локализации по строковому представлению. /// /// Строковое представление. /// Тип локализации. private LocaleType _E(string localeString) => localeString.GetTypeByString(); /// /// Получение типа локализации с учётом её наличия в коллекции. /// /// Искомый тип локализации. /// Реальный тип локализации. private LocaleType RealLocale(LocaleType locale) => Contains(locale) ? locale : LocaleType.English; /// /// Получение типа локализации по строковому представлению с учётом её наличия в коллекции. /// /// Строковое представление искомого типа локализации. /// Реальный тип локализации. private LocaleType RealLocale(string localeString) => RealLocale(_E(localeString)); /// /// Получение объекта локализованной строки по типу локализации. /// /// Искомый тип локализации. /// Объект локализованной строки. public LocaleItem GetItem(LocaleType locale) => this.First(c => c.Locale == RealLocale(locale)); /// /// Получение объекта локализованной строки по строковому представлению типа локализации. /// /// Строковое представление искомого типа локализации. /// Объект локализованной строки. public LocaleItem GetItem(string localeString) => this.First(c => c.Locale == RealLocale(localeString)); /// /// Получение локализованной строки по типу локализации. /// /// Искомый тип локализации. /// Локализованная строка. public string this[LocaleType locale] { get => GetItem(locale).Value; set { if (Types.Contains(locale)) { GetItem(locale).Value = value; } else { _items.Add(new(locale, value)); } } } /// /// Получение локализованной строки по типу локализации. /// /// Строковое представление искомого типа локализации. /// Локализованная строка. public string this[string localeString] { get => this[_E(localeString)]; set => this[_E(localeString)] = value; } /// /// Добавление объекта локализованной строки в коллекцию. /// /// Объект локализированной строки. public void Add(LocaleItem item) { this[item.Locale] = item.Value; } /// /// Добавление локализованной строки в коллекцию. /// /// Тип локализации. /// Строка локазации. public void Add(LocaleType locale, string value) { this[locale] = value; } /// /// Отчистка коллекции локализованных строк. /// public void Clear() { _items.Clear(); AssureDefault(); } /// /// Проверка наличия объекта локализованной строки в коллекции. /// /// Объект локализированной строки. /// `true`, если объект есть; `false`, если нет. public bool Contains(LocaleItem item) { return _items.Contains(item); } /// /// Проверка наличия локализованной строки в коллекции по типу локализации. /// /// Тип локализации. /// `true`, если искомый тип локализации есть; `false`, если нет. public bool Contains(LocaleType locale) { return Types.Contains(locale); } /// /// Проверка наличия локализованной строки в коллекции по строковому представлению типа локализации. /// /// Строковое представление искомого типа локализации. /// `true`, если искомый тип локализации есть; `false`, если нет. public bool Contains(string localeString) { return this.Any(item => item.Value == localeString); } /// public void CopyTo(LocaleItem[] array, int arrayIndex) { throw new NotImplementedException(); } /// public bool Remove(LocaleItem item) { bool result = _items.Remove(item); if (Count == 0) { AssureDefault(); return false; } return result; } /// public IEnumerator GetEnumerator() { return _items.GetEnumerator(); } /// IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } /// public override string ToString() { return this[LocaleType.English]; } /// /// Сериализация локализованной строки в JSON-формат. /// /// Строковое представление JSON-представления. public string Serialize() { JObject json = []; foreach (LocaleItem item in _items) { json.Add(item.Locale.GetTypeString(), item.Value); } return json.ToString(); } /// /// Десериализация локализованной строки из JSON-формата. /// /// Строковое представление JSON-представления. /// Объект локализованной строки. public static LocaleString Deserialize(string input) { JObject json = JObject.Parse(input); LocaleString result = []; foreach (KeyValuePair item in json) { result[item.Key] = item.Value?.ToString() ?? ""; } return result; } }