From e25049fb20af079016d86e0bf60cc49b6e561ced Mon Sep 17 00:00:00 2001 From: Michael Wu Date: Thu, 6 Aug 2026 12:10:26 +0900 Subject: [PATCH] test(app): allow locale-specific plural keys --- packages/app/src/i18n/resources.test.ts | 33 ++++++++++++++++++------- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/packages/app/src/i18n/resources.test.ts b/packages/app/src/i18n/resources.test.ts index 46b3428026..055383077b 100644 --- a/packages/app/src/i18n/resources.test.ts +++ b/packages/app/src/i18n/resources.test.ts @@ -20,6 +20,21 @@ function flattenKeys(value: unknown, prefix = ""): string[] { return entries.flatMap(([key, child]) => flattenKeys(child, prefix ? `${prefix}.${key}` : key)); } +const pluralSuffixPattern = /_(zero|one|two|few|many|other)$/; + +function canonicalKeys(value: unknown): string[] { + const keys = flattenKeys(value); + const keySet = new Set(keys); + return [ + ...new Set( + keys.map((key) => { + const baseKey = key.replace(pluralSuffixPattern, ""); + return baseKey !== key && keySet.has(baseKey) ? baseKey : key; + }), + ), + ].sort(); +} + function flattenStrings(value: unknown, prefix = ""): Record { if (typeof value === "string") { return { [prefix]: value }; @@ -105,15 +120,15 @@ function findUntranslatedConnectionErrors(): string[] { describe("translation resources", () => { it("keeps all supported language keys in sync with English", () => { - const englishKeys = flattenKeys(en).sort(); - expect(flattenKeys(ar).sort()).toEqual(englishKeys); - expect(flattenKeys(es).sort()).toEqual(englishKeys); - expect(flattenKeys(fr).sort()).toEqual(englishKeys); - expect(flattenKeys(ja).sort()).toEqual(englishKeys); - expect(flattenKeys(ko).sort()).toEqual(englishKeys); - expect(flattenKeys(ptBR).sort()).toEqual(englishKeys); - expect(flattenKeys(ru).sort()).toEqual(englishKeys); - expect(flattenKeys(zhCN).sort()).toEqual(englishKeys); + const englishKeys = canonicalKeys(en); + expect(canonicalKeys(ar)).toEqual(englishKeys); + expect(canonicalKeys(es)).toEqual(englishKeys); + expect(canonicalKeys(fr)).toEqual(englishKeys); + expect(canonicalKeys(ja)).toEqual(englishKeys); + expect(canonicalKeys(ko)).toEqual(englishKeys); + expect(canonicalKeys(ptBR)).toEqual(englishKeys); + expect(canonicalKeys(ru)).toEqual(englishKeys); + expect(canonicalKeys(zhCN)).toEqual(englishKeys); }); it("keeps non-English supported languages translated beyond fallback labels", () => {