I18n через jsonb-поля

This commit is contained in:
2025-04-24 15:53:05 +04:00
parent 35b571eb57
commit 31ad99ade5
33 changed files with 409 additions and 264 deletions
@@ -1,6 +1,7 @@
using Konsole;
using Pf2eDataScrapper.Importers.Implementations.Aonprd.Compendium;
using static Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.AbstractProcessor;
using Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.Processors;
using static Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.Processors.AbstractProcessor;
namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder;
@@ -7,13 +7,15 @@ using Pf2eModel.Model;
using Pf2eModel.Model.Base;
using Pf2eModel.Model.Base.Source;
using Pf2eModel.Model.Base.Targets;
using Pf2eModel.Model.Common.I18n;
using Pf2eModel.Model.Enum;
using Pf2eModel.Model.Structure;
using System.Collections.Generic;
using System.Security.Cryptography;
using System.Text;
using System.Text.RegularExpressions;
namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder;
namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.Processors;
internal abstract partial class AbstractProcessor(AonprdProcessorInput input)
{
@@ -65,11 +67,11 @@ internal abstract partial class AbstractProcessor(AonprdProcessorInput input)
{
Entity.Id = Helper.NextEntityId;
Entity.Type = Type;
Entity.Name = Input.GetRequired<string>("name");
Entity.Name[LocaleType.English] = Input.GetRequired<string>("name");
Entity.Img = "";
Entity.Description = GetDescription();
Entity.Rarity = Input.EnumOptional<EntityRarity>("rarity", EntityRarity.Common);
Entity.Slug = Helper.GenerateSlug(Entity.Name);
Entity.Slug = Helper.GenerateSlug(Entity.Name[LocaleType.English]);
Entity.IsTranslated = false;
Entity.IsChecked = false;
@@ -81,15 +83,6 @@ internal abstract partial class AbstractProcessor(AonprdProcessorInput input)
protected virtual void AddAlias()
{
EntityAlias alias = new()
{
Type = AliasType.English,
Alias = Entity.Name,
Entity = Entity
};
Context.EntityAliases.Add(alias);
JArray? legacyIdArray = Input.GetOptional<JArray>("legacy_id");
if (legacyIdArray is null)
@@ -101,17 +94,8 @@ internal abstract partial class AbstractProcessor(AonprdProcessorInput input)
if (LegacyAliases.TryGetValue(legacyId, out string? legacyName))
{
if (legacyName != Entity.Name)
{
EntityAlias legacyAlias = new()
{
Type = AliasType.LegacyEnglish,
Alias = legacyName,
Entity = Entity
};
Context.EntityAliases.Add(legacyAlias);
}
// if (legacyName != Entity.Name[LocaleType.English])
Entity.Name[LocaleType.LegacyEnglish] = legacyName;
LegacyAliases.Remove(legacyId);
}
@@ -187,20 +171,18 @@ internal abstract partial class AbstractProcessor(AonprdProcessorInput input)
IEnumerable<string> names = traitsJson.ToArray().Select(jToken => jToken.ToString());
List<Entity> traitEntities = Context.Traits
.SelectMany(t => t.Entity.Aliases)
.Where(a => names.Contains(a.Alias))
.Select(a => a.Entity)
.Select(t => t.Entity)
.Where(e => Pf2eDbContext.LocaleSearchArray(e.Name, names))
.ToList();
List<Trait> traits = Context.Traits
.Include(t => t.Entity)
.ThenInclude(e => e.Aliases)
.Where(t => traitEntities.Contains(t.Entity))
.ToList();
foreach (string name in names)
{
if (!traits.Any(t => t.Entity.Aliases.Select(a => a.Alias).Contains(name)))
if (!traits.Any(t => t.Entity.Name.Contains(name)))
{
throw new Exception($"Trait '{name}' is not found!!!");
}
@@ -216,18 +198,10 @@ internal abstract partial class AbstractProcessor(AonprdProcessorInput input)
{
if (RemasterWithoutLegacy.TryGetValue(id, out Entity? remastered))
{
if (remastered.Name == name)
{
return;
}
// if (remastered.ToString() != name)
remastered.Name[LocaleType.LegacyEnglish] = name;
EntityAlias alias = new()
{
Type = AliasType.LegacyEnglish,
Alias = name,
Entity = remastered!
};
Context.EntityAliases.Add(alias);
RemasterWithoutLegacy.Remove(id);
}
else
{
@@ -1,4 +1,4 @@
namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder;
namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.Processors;
[AttributeUsage(AttributeTargets.Class)]
public class AonprdProcessorAttribute(string name, string type, string[] dependencies) : Attribute
@@ -1,6 +1,6 @@
using System.Reflection;
namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder;
namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.Processors;
internal class AonprdProcessorCollection
{
@@ -2,7 +2,7 @@
using Pf2eModel.Model;
using Pf2eModel.Model.Enum;
namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.Processors;
namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.Processors.Types;
[AonprdProcessor("action")]
internal class ActionProcessor(AonprdProcessorInput input) : AbstractProcessor(input)
@@ -6,7 +6,7 @@ using Pf2eModel.Model.Structure;
using Pf2eModel.Model.Structure.AncestryRelation;
using System.Text.RegularExpressions;
namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.Processors;
namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.Processors.Types;
[AonprdProcessor("ancestry", ["trait", "language"])]
internal class AncestryProcessor(AonprdProcessorInput input) : AbstractProcessor(input)
@@ -6,7 +6,7 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.Processors;
namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.Processors.Types;
[AonprdProcessor("archetype")]
internal class ArchetypeProcessor(AonprdProcessorInput input) : AbstractProcessor(input)
@@ -23,7 +23,6 @@ internal class ArchetypeProcessor(AonprdProcessorInput input) : AbstractProcesso
Object.Level = Input.GetOptional<int>("level");
}
protected override string GetDescription()
@@ -9,7 +9,7 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.Processors;
namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.Processors.Types;
[AonprdProcessor("background")]
internal class BackgroundProcessor(AonprdProcessorInput input) : AbstractProcessor(input)
@@ -14,7 +14,7 @@ using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.Processors;
namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.Processors.Types;
[AonprdProcessor("class", ["trait", "source", "skill"])]
internal class ClassProcessor(AonprdProcessorInput input) : AbstractProcessor(input)
@@ -89,6 +89,7 @@ internal class ClassProcessor(AonprdProcessorInput input) : AbstractProcessor(in
.ToArray();
Training[] skills = Context.Trainings.Where(t => skillNames.Contains(t.Name)).ToArray();
// Training[] skills = Context.Trainings.Where(t => Pf2eDbContext.LocaleSearchArray(t.Name, skillNames)).ToArray();
return skills.Select(skill => new ClassTraining()
{
@@ -1,8 +1,9 @@
using Newtonsoft.Json.Linq;
using Pf2eModel;
using Pf2eModel.Model.Enum;
using Pf2eModel.Model.Structure;
namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.Processors;
namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.Processors.Types;
[AonprdProcessor("feat", ["trait", "source", "archetype"])]
internal class FeatProcessor(AonprdProcessorInput input) : AbstractProcessor(input)
@@ -42,7 +43,10 @@ internal class FeatProcessor(AonprdProcessorInput input) : AbstractProcessor(inp
string[] archetypeStrings = Input.GetOptional<JArray>("archetype")?.Select(t => t.ToString()).ToArray() ?? [];
var archetypes = Context.Archetypes.Where(a => archetypeStrings.Contains(a.Entity.Name)).ToArray();
var archetypes = Context.Archetypes
.Where(a => Pf2eDbContext.LocaleSearchArray(a.Entity.Name, archetypeStrings))
// .Where(a => archetypeStrings.Contains(a.Entity.Name.ToString()))
.ToArray();
if (archetypes.Length != 0)
{
@@ -53,7 +57,7 @@ internal class FeatProcessor(AonprdProcessorInput input) : AbstractProcessor(inp
{
Object.Archetypes.Add(archetype);
if (Entity.Name.Contains("Dedication"))
if (Entity.Name.Any(l => l.Value.Contains("Dedication")))
{
archetype.DedicationFeat = Object;
}
@@ -1,7 +1,7 @@
using Pf2eModel.Model.Enum;
using Pf2eModel.Model.Structure;
namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.Processors;
namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.Processors.Types;
[AonprdProcessor("language")]
internal class LanguageProcessor(AonprdProcessorInput input) : AbstractProcessor(input)
@@ -8,7 +8,7 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.Processors;
namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.Processors.Types;
[AonprdProcessor("source", new string[] { })]
internal class SourceProcessor(AonprdProcessorInput input) : AbstractProcessor(input)
@@ -8,7 +8,7 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.Processors;
namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.Processors.Types;
[AonprdProcessor("skill", new string[] { })]
internal class TrainingProcessor(AonprdProcessorInput input) : AbstractProcessor(input)
@@ -1,7 +1,7 @@
using Pf2eModel.Model.Enum;
using Pf2eModel.Model.Structure;
namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.Processors;
namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.Processors.Types;
[AonprdProcessor("trait", new string[] { })]
internal class TraitProcessor(AonprdProcessorInput input) : AbstractProcessor(input)
@@ -4,6 +4,7 @@ using Pf2eModel.Model;
using Pf2eModel.Model.Base;
using Pf2eModel.Model.Base.Source;
using Pf2eModel.Model.Base.Targets;
using Pf2eModel.Model.Common.I18n;
using Pf2eModel.Model.Enum;
using Pf2eModel.Model.Structure;
using System.Security.Cryptography;
@@ -30,14 +31,14 @@ internal abstract class AbstractProcessor(ProcessorInput input)
Entity.Id = Helper.NextEntityId;
Entity.Type = Type;
Entity.Name = Input.GetRequired<string>("name");
Entity.Name[LocaleType.English] = Input.GetRequired<string>("name");
Entity.Img = Input.GetRequired<string>("img");
Entity.Description = Input.GetRequired<string>("system.description.value");
Entity.IsTranslated = false;
Entity.IsChecked = false;
Entity.Slug = Helper.GenerateSlug(Entity.Name);
Entity.Slug = Helper.GenerateSlug(Entity.Name[LocaleType.English]);
Entity.Rarity = Input.EnumOptional<EntityRarity>("system.traits.rarity", EntityRarity.Common);
Object.Id = Entity.Id;
@@ -45,15 +46,16 @@ internal abstract class AbstractProcessor(ProcessorInput input)
Context.Entities.Add(Entity);
// Alias
/*
EntityAlias alias = new()
{
Type = AliasType.English,
Type = LocaleType.English,
Alias = Entity.Name,
EntityId = Entity.Id,
Entity = Entity
};
Context.EntityAliases.Add(alias);
*/
// Source
EntitySource source = new()
{
@@ -138,11 +140,11 @@ internal abstract class AbstractProcessor(ProcessorInput input)
protected IEnumerable<Trait> GetTraits(IEnumerable<string> names)
{
List<Trait> result = Context.Traits.Where(t => names.Contains(t.Entity.Name)).ToList();
List<Trait> result = Context.Traits.Where(t => names.Contains(t.Entity.ToString())).ToList();
foreach (string name in names)
{
if (result.Any(t => t.Entity.Name == name))
if (result.Any(t => t.Entity.Name.Contains(name)))
{
continue;
}
+4
View File
@@ -37,4 +37,8 @@
</None>
</ItemGroup>
<ItemGroup>
<Folder Include="Importers\Implementations\Aonprd\DataBuilder\Processors\Subclasses\" />
</ItemGroup>
</Project>