Глобальный рефакторинг пространств имён
This commit is contained in:
@@ -0,0 +1,41 @@
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
|
||||
namespace Pf2e.Database.Model.Common;
|
||||
|
||||
/// <summary>
|
||||
/// Частота использования.
|
||||
/// </summary>
|
||||
public class Frequency
|
||||
{
|
||||
/// <summary>
|
||||
/// Идентификатор.
|
||||
/// </summary>
|
||||
[Key]
|
||||
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
|
||||
[Column(Order = 1)]
|
||||
[Comment("Идентификатор")]
|
||||
public int Id { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Максимальная продолжительсность.
|
||||
/// </summary>
|
||||
[Column(Order = 2)]
|
||||
[Comment("Максимальная продолжительсность")]
|
||||
public int Max { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Частота использования.
|
||||
/// </summary>
|
||||
[Column(Order = 3)]
|
||||
[Comment("Частота использования")]
|
||||
public int Per { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Значение использования.
|
||||
/// </summary>
|
||||
[Column(Order = 4)]
|
||||
[Comment("Значение использования")]
|
||||
public int? Value { get; set; }
|
||||
}
|
||||
@@ -0,0 +1,66 @@
|
||||
using System.ComponentModel;
|
||||
using System.Reflection;
|
||||
|
||||
namespace Pf2e.Database.Model.Common.I18n;
|
||||
|
||||
/// <summary>
|
||||
/// Расширения для работы с локализацией.
|
||||
/// </summary>
|
||||
public static class LocaleExtension
|
||||
{
|
||||
/// <summary>
|
||||
/// Получение строкового представления типа локализации.
|
||||
/// </summary>
|
||||
/// <param name="localeType">Тип локализации.</param>
|
||||
/// <returns>Строковое представление типа локализации.</returns>
|
||||
public static string GetTypeString(this LocaleType localeType)
|
||||
{
|
||||
FieldInfo fi = localeType.GetType().GetField(localeType.ToString())!;
|
||||
|
||||
DescriptionAttribute[] attributes = (DescriptionAttribute[])
|
||||
fi.GetCustomAttributes(typeof(DescriptionAttribute), false);
|
||||
|
||||
return (attributes.Length != 0 ? attributes.FirstOrDefault()?.Description : null)
|
||||
?? localeType.ToString();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Получение типа локализации по строковому представлению типа локализации.
|
||||
/// </summary>
|
||||
/// <param name="localeTypeString">Строковое представление типа локализации.</param>
|
||||
/// <returns>Тип локализации.</returns>
|
||||
/// <exception cref="InvalidEnumArgumentException">Исключение, если строковое представление не соответсвует ни одному типу локализации.</exception>
|
||||
public static LocaleType GetTypeByString(this string localeTypeString)
|
||||
{
|
||||
foreach (FieldInfo field in typeof(LocaleType).GetFields())
|
||||
{
|
||||
if (
|
||||
Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute))
|
||||
is not DescriptionAttribute descriptionAttribute
|
||||
)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (descriptionAttribute.Description == localeTypeString)
|
||||
{
|
||||
return (LocaleType)field.GetValue(null)!;
|
||||
}
|
||||
}
|
||||
|
||||
throw new InvalidEnumArgumentException();
|
||||
}
|
||||
|
||||
/*
|
||||
public static IQueryable<T> WhereLocale(
|
||||
this IQueryable<T> query, Expression<Func<T, LocaleString>> expression, string searchTerm) where T : class
|
||||
{
|
||||
return query.Where(e => DbContext.LocaleSearch(e.Name.ToJson(), searchTerm));
|
||||
}
|
||||
|
||||
public static IQueryable<Entity> WhereLocale(
|
||||
this IQueryable<Entity> query, ICollection<string> searchTerms)
|
||||
{
|
||||
return query.Where(e => EF.Functions.LocaleSearchArray(e.Name.ToJson(), searchTerms));
|
||||
}*/
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
namespace Pf2e.Database.Model.Common.I18n;
|
||||
|
||||
/// <summary>
|
||||
/// Элемент локализации.
|
||||
/// </summary>
|
||||
/// <param name="type">Тип локализации.</param>
|
||||
/// <param name="value">Значение локализации.</param>
|
||||
public class LocaleItem(LocaleType type, string value)
|
||||
{
|
||||
/// <summary>
|
||||
/// Тип локализации.
|
||||
/// </summary>
|
||||
public LocaleType Locale { get; set; } = type;
|
||||
|
||||
/// <summary>
|
||||
/// Значение локализации.
|
||||
/// </summary>
|
||||
public string Value { get; set; } = value;
|
||||
|
||||
/// <summary>
|
||||
/// Конструктор класса <see cref="LocaleItem"/> по паре ключ-значение.
|
||||
/// </summary>
|
||||
/// <param name="item">Пара ключ-значение по строковому представлению типа.</param>
|
||||
public LocaleItem(KeyValuePair<string, string> item)
|
||||
: this(item.Key.GetTypeByString(), item.Value) { }
|
||||
}
|
||||
@@ -0,0 +1,246 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
using System.ComponentModel;
|
||||
|
||||
namespace Pf2e.Database.Model.Common.I18n;
|
||||
|
||||
/// <summary>
|
||||
/// Тип локализации.
|
||||
/// </summary>
|
||||
public enum LocaleType
|
||||
{
|
||||
/// <summary>
|
||||
/// Английский язык (основной).
|
||||
/// </summary>
|
||||
[Description("en")]
|
||||
English,
|
||||
|
||||
/// <summary>
|
||||
/// Русский язык.
|
||||
/// </summary>
|
||||
[Description("ru")]
|
||||
Russian,
|
||||
|
||||
/// <summary>
|
||||
/// Русский язык (вариант HobbyGames).
|
||||
/// </summary>
|
||||
[Description("ru.hobby")]
|
||||
Hobby,
|
||||
|
||||
/// <summary>
|
||||
/// Другой язык.
|
||||
/// </summary>
|
||||
[Description("other")]
|
||||
Other,
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Pf2e.Database.Model.Common.I18n;
|
||||
using Pf2e.Database.Model.Enum;
|
||||
|
||||
namespace Pf2e.Database.Model.Common;
|
||||
|
||||
/// <summary>
|
||||
/// Изучаемая способность.
|
||||
/// </summary>
|
||||
public class Training
|
||||
{
|
||||
/// <summary>
|
||||
/// Идентификатор.
|
||||
/// </summary>
|
||||
[Key]
|
||||
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
|
||||
[Column(Order = 1)]
|
||||
[Comment("Идентификатор")]
|
||||
public int Id { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Название способности.
|
||||
/// </summary>
|
||||
[Column(Order = 2)]
|
||||
[Comment("Название способности")]
|
||||
public LocaleString Name { get; set; } = [];
|
||||
|
||||
/// <summary>
|
||||
/// Тип способности.
|
||||
/// </summary>
|
||||
[Column(Order = 3)]
|
||||
[Comment("Тип способности")]
|
||||
public TrainingType Type { get; set; }
|
||||
}
|
||||
Reference in New Issue
Block a user