From 3c40bb5ea38b3de6eb704dba3d1d8ae93e431ca9 Mon Sep 17 00:00:00 2001 From: mika kuns Date: Wed, 3 Jun 2026 11:41:51 +0200 Subject: [PATCH] feat(i18n): seed en.json and wire locale copy to app output --- src/ClaudeDo.App/ClaudeDo.App.csproj | 2 + .../ClaudeDo.Localization.csproj | 1 + src/ClaudeDo.Localization/Locales.targets | 7 ++++ src/ClaudeDo.Localization/locales/en.json | 13 +++++++ .../EnJsonCoverageTests.cs | 37 +++++++++++++++++++ 5 files changed, 60 insertions(+) create mode 100644 src/ClaudeDo.Localization/Locales.targets create mode 100644 src/ClaudeDo.Localization/locales/en.json create mode 100644 tests/ClaudeDo.Localization.Tests/EnJsonCoverageTests.cs diff --git a/src/ClaudeDo.App/ClaudeDo.App.csproj b/src/ClaudeDo.App/ClaudeDo.App.csproj index cd66b50..2b2c2b4 100644 --- a/src/ClaudeDo.App/ClaudeDo.App.csproj +++ b/src/ClaudeDo.App/ClaudeDo.App.csproj @@ -28,5 +28,7 @@ + + diff --git a/src/ClaudeDo.Localization/ClaudeDo.Localization.csproj b/src/ClaudeDo.Localization/ClaudeDo.Localization.csproj index 3b41c04..bdfb698 100644 --- a/src/ClaudeDo.Localization/ClaudeDo.Localization.csproj +++ b/src/ClaudeDo.Localization/ClaudeDo.Localization.csproj @@ -7,4 +7,5 @@ + diff --git a/src/ClaudeDo.Localization/Locales.targets b/src/ClaudeDo.Localization/Locales.targets new file mode 100644 index 0000000..4a9afa2 --- /dev/null +++ b/src/ClaudeDo.Localization/Locales.targets @@ -0,0 +1,7 @@ + + + + + diff --git a/src/ClaudeDo.Localization/locales/en.json b/src/ClaudeDo.Localization/locales/en.json new file mode 100644 index 0000000..b61f536 --- /dev/null +++ b/src/ClaudeDo.Localization/locales/en.json @@ -0,0 +1,13 @@ +{ + "metadata": { "code": "en", "name": "English" }, + "settings": { + "title": "SETTINGS", + "save": "Save", + "cancel": "Cancel", + "language": "Language", + "tabGeneral": "General", + "tabWorktrees": "Worktrees", + "tabFiles": "Files", + "tabPrime": "Prime Claude" + } +} diff --git a/tests/ClaudeDo.Localization.Tests/EnJsonCoverageTests.cs b/tests/ClaudeDo.Localization.Tests/EnJsonCoverageTests.cs new file mode 100644 index 0000000..e9dcd8c --- /dev/null +++ b/tests/ClaudeDo.Localization.Tests/EnJsonCoverageTests.cs @@ -0,0 +1,37 @@ +using ClaudeDo.Localization; + +namespace ClaudeDo.Localization.Tests; + +public class EnJsonCoverageTests +{ + private static string LocalesDir() + { + var dir = AppContext.BaseDirectory; + while (dir is not null) + { + var candidate = Path.Combine(dir, "src", "ClaudeDo.Localization", "locales"); + if (Directory.Exists(candidate)) return candidate; + dir = Path.GetDirectoryName(dir); + } + throw new DirectoryNotFoundException("Could not locate src/ClaudeDo.Localization/locales"); + } + + [Fact] + public void Every_locale_has_same_keys_as_english() + { + var store = LocaleStore.Load(LocalesDir()); + Assert.True(store.TryGet("en", out var en)); + var enKeys = en!.Strings.Keys.ToHashSet(); + + foreach (var locale in store.Available) + { + var keys = locale.Strings.Keys.ToHashSet(); + var missing = enKeys.Except(keys).OrderBy(k => k).ToList(); + var extra = keys.Except(enKeys).OrderBy(k => k).ToList(); + Assert.True(missing.Count == 0, + $"Locale '{locale.Code}' missing keys: {string.Join(", ", missing)}"); + Assert.True(extra.Count == 0, + $"Locale '{locale.Code}' has extra keys not in en.json: {string.Join(", ", extra)}"); + } + } +}