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)}");
+ }
+ }
+}