From dac4cb2d0427a5758a3874d2b15bc64f92ada95a Mon Sep 17 00:00:00 2001 From: Jan Amann Date: Wed, 18 Sep 2024 15:16:47 +0200 Subject: [PATCH 1/3] fix: Use default messages from `en` as fallback if messages are missing in another locale --- apps/site/i18n.tsx | 18 ++++++++++++------ apps/site/package.json | 1 + package-lock.json | 3 +-- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/apps/site/i18n.tsx b/apps/site/i18n.tsx index 5e235d8e3d15f..39724c3402eae 100644 --- a/apps/site/i18n.tsx +++ b/apps/site/i18n.tsx @@ -1,22 +1,28 @@ import { importLocale } from '@node-core/website-i18n'; +import deepmerge from 'deepmerge'; import { getRequestConfig } from 'next-intl/server'; import { availableLocaleCodes } from '@/next.locales.mjs'; // Loads the Application Locales/Translations Dynamically const loadLocaleDictionary = async (locale: string) => { + // This enables HMR on the English Locale, so that instant refresh + // happens while we add/change texts on the source locale + const defaultMessages = await import( + '@node-core/website-i18n/locales/en.json' + ).then(f => f.default); + if (locale === 'en') { - // This enables HMR on the English Locale, so that instant refresh - // happens while we add/change texts on the source locale - return import('@node-core/website-i18n/locales/en.json').then( - f => f.default - ); + return defaultMessages; } if (availableLocaleCodes.includes(locale)) { // Other languages don't really require HMR as they will never be development languages // so we can load them dynamically - return importLocale(locale); + const messages = await importLocale(locale); + + // Use default messages as fallback + return deepmerge(defaultMessages, messages); } throw new Error(`Unsupported locale: ${locale}`); diff --git a/apps/site/package.json b/apps/site/package.json index d6172ce334139..732f72bec9fc9 100644 --- a/apps/site/package.json +++ b/apps/site/package.json @@ -63,6 +63,7 @@ "classnames": "~2.5.1", "cross-env": "7.0.3", "dedent": "1.5.3", + "deepmerge": "^4.3.1", "feed": "~4.2.2", "github-slugger": "~2.0.0", "glob": "~11.0.0", diff --git a/package-lock.json b/package-lock.json index 49554ccff1ebd..ae88c477ad94a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -56,6 +56,7 @@ "classnames": "~2.5.1", "cross-env": "7.0.3", "dedent": "1.5.3", + "deepmerge": "^4.3.1", "feed": "~4.2.2", "github-slugger": "~2.0.0", "glob": "~11.0.0", @@ -11980,8 +11981,6 @@ "version": "4.3.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } From 3d72be26d9e5b8ec4c526bf96ac2c22aef0262b9 Mon Sep 17 00:00:00 2001 From: Jan Amann Date: Wed, 18 Sep 2024 15:44:05 +0200 Subject: [PATCH 2/3] chore: Remove `deepmerge` dependency in favor of a more optimized custom function --- apps/site/i18n.tsx | 5 +++-- apps/site/package.json | 1 - apps/site/util/deepMerge.ts | 20 ++++++++++++++++++++ package-lock.json | 2 +- 4 files changed, 24 insertions(+), 4 deletions(-) create mode 100644 apps/site/util/deepMerge.ts diff --git a/apps/site/i18n.tsx b/apps/site/i18n.tsx index 39724c3402eae..efed3f4d9c6fd 100644 --- a/apps/site/i18n.tsx +++ b/apps/site/i18n.tsx @@ -1,9 +1,10 @@ import { importLocale } from '@node-core/website-i18n'; -import deepmerge from 'deepmerge'; import { getRequestConfig } from 'next-intl/server'; import { availableLocaleCodes } from '@/next.locales.mjs'; +import deepMerge from './util/deepMerge'; + // Loads the Application Locales/Translations Dynamically const loadLocaleDictionary = async (locale: string) => { // This enables HMR on the English Locale, so that instant refresh @@ -22,7 +23,7 @@ const loadLocaleDictionary = async (locale: string) => { const messages = await importLocale(locale); // Use default messages as fallback - return deepmerge(defaultMessages, messages); + return deepMerge(defaultMessages, messages); } throw new Error(`Unsupported locale: ${locale}`); diff --git a/apps/site/package.json b/apps/site/package.json index 732f72bec9fc9..d6172ce334139 100644 --- a/apps/site/package.json +++ b/apps/site/package.json @@ -63,7 +63,6 @@ "classnames": "~2.5.1", "cross-env": "7.0.3", "dedent": "1.5.3", - "deepmerge": "^4.3.1", "feed": "~4.2.2", "github-slugger": "~2.0.0", "glob": "~11.0.0", diff --git a/apps/site/util/deepMerge.ts b/apps/site/util/deepMerge.ts new file mode 100644 index 0000000000000..751c09a3afe16 --- /dev/null +++ b/apps/site/util/deepMerge.ts @@ -0,0 +1,20 @@ +export default function deepMerge( + obj1: Obj1, + obj2: Obj2 +): Obj1 & Obj2 { + const result = { ...obj1 } as Obj1 & Obj2; + + for (const key in obj2) { + if (Object.prototype.hasOwnProperty.call(obj2, key)) { + if (typeof obj2[key] === 'object' && obj2[key] !== null) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + result[key] = deepMerge(result[key] as any, obj2[key] as any); + } else { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + result[key] = obj2[key] as any; + } + } + } + + return result; +} diff --git a/package-lock.json b/package-lock.json index ae88c477ad94a..85070d868da7e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -56,7 +56,6 @@ "classnames": "~2.5.1", "cross-env": "7.0.3", "dedent": "1.5.3", - "deepmerge": "^4.3.1", "feed": "~4.2.2", "github-slugger": "~2.0.0", "glob": "~11.0.0", @@ -11981,6 +11980,7 @@ "version": "4.3.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, "engines": { "node": ">=0.10.0" } From 0734a2ebda6b97ca0acc3c99b6bdfcfdc8fdcf41 Mon Sep 17 00:00:00 2001 From: Jan Amann Date: Thu, 19 Sep 2024 09:30:51 +0200 Subject: [PATCH 3/3] chore: Revert changes to lockfile --- package-lock.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package-lock.json b/package-lock.json index 85070d868da7e..49554ccff1ebd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11981,6 +11981,7 @@ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" }