using System.Text.Json; namespace ClaudeDo.Localization; public static class LocaleJson { public static LocaleFile Parse(string json) { using var doc = JsonDocument.Parse(json); var root = doc.RootElement; var code = ""; var name = ""; if (root.TryGetProperty("metadata", out var meta) && meta.ValueKind == JsonValueKind.Object) { if (meta.TryGetProperty("code", out var c)) code = c.GetString() ?? ""; if (meta.TryGetProperty("name", out var n)) name = n.GetString() ?? ""; } var strings = new Dictionary(StringComparer.Ordinal); foreach (var prop in root.EnumerateObject()) { if (prop.NameEquals("metadata")) continue; Flatten(prop.Name, prop.Value, strings); } return new LocaleFile(code, name, strings); } private static void Flatten(string prefix, JsonElement el, IDictionary into) { switch (el.ValueKind) { case JsonValueKind.Object: foreach (var p in el.EnumerateObject()) Flatten($"{prefix}.{p.Name}", p.Value, into); break; case JsonValueKind.String: into[prefix] = el.GetString() ?? ""; break; default: into[prefix] = el.ToString(); break; } } }