Fractured Locales Support (ryubing/ryujinx!238)

See merge request ryubing/ryujinx!238
This commit is contained in:
LotP
2025-12-27 14:07:56 -06:00
parent 9ebf444644
commit 45193dcc8d
9 changed files with 272 additions and 175 deletions

View File

@@ -1,5 +1,7 @@
using Microsoft.CodeAnalysis;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.IO;
using System.Linq;
using System.Text;
@@ -10,23 +12,34 @@ namespace Ryujinx.UI.LocaleGenerator
{
public void Initialize(IncrementalGeneratorInitializationContext context)
{
IncrementalValuesProvider<AdditionalText> localeFile = context.AdditionalTextsProvider.Where(static x => x.Path.EndsWith("locales.json"));
IncrementalValuesProvider<AdditionalText> localeFiles = context.AdditionalTextsProvider.Where(static x => Path.GetDirectoryName(x.Path)?.Replace('\\', '/').EndsWith("assets/Locales") ?? false);
IncrementalValuesProvider<string> contents = localeFile.Select((text, cancellationToken) => text.GetText(cancellationToken)!.ToString());
IncrementalValueProvider<ImmutableArray<(string, string)>> collectedContents = localeFiles.Select((text, cancellationToken) => (text.GetText(cancellationToken)!.ToString(), Path.GetFileName(text.Path))).Collect();
context.RegisterSourceOutput(contents, (spc, content) =>
context.RegisterSourceOutput(collectedContents, (spc, contents) =>
{
IEnumerable<string> lines = content.Split('\n').Where(x => x.Trim().StartsWith("\"ID\":")).Select(x => x.Split(':')[1].Trim().Replace("\"", string.Empty).Replace(",", string.Empty));
StringBuilder enumSourceBuilder = new();
enumSourceBuilder.AppendLine("namespace Ryujinx.Ava.Common.Locale;");
enumSourceBuilder.AppendLine("public enum LocaleKeys");
enumSourceBuilder.AppendLine("{");
foreach (string? line in lines)
foreach ((string, string) content in contents)
{
enumSourceBuilder.AppendLine($" {line},");
IEnumerable<string> lines = content.Item1.Split('\n').Where(x => x.Trim().StartsWith("\"ID\":")).Select(x => x.Split(':')[1].Trim().Replace("\"", string.Empty).Replace(",", string.Empty));
foreach (string? line in lines)
{
if (content.Item2 == "Root.json")
{
enumSourceBuilder.AppendLine($" {line},");
}
else
{
enumSourceBuilder.AppendLine($" {content.Item2.Split('.')[0]}_{line},");
}
}
}
enumSourceBuilder.AppendLine("}");
spc.AddSource("LocaleKeys", enumSourceBuilder.ToString());