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