From 666b99524acf837410242cc5a79761758bf3402d Mon Sep 17 00:00:00 2001 From: nitin <142569587+ehconitin@users.noreply.github.com> Date: Wed, 17 Sep 2025 22:31:43 +0530 Subject: [PATCH] remove singleton usage of i18n (#14422) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit closes https://github.com/twentyhq/core-team-issues/issues/1480 --------- Co-authored-by: Félix Malfait --- .../src/components/BaseEmail.tsx | 83 ++---------------- .../twenty-emails/src/components/Footer.tsx | 8 +- .../src/components/WhatIsTwenty.tsx | 8 +- .../clean-suspended-workspace.email.tsx | 6 +- .../src/emails/password-reset-link.email.tsx | 4 +- .../emails/password-update-notify.email.tsx | 3 +- .../send-email-verification-link.email.tsx | 4 +- .../src/emails/send-invite-link.email.tsx | 5 +- .../twenty-emails/src/emails/test.email.tsx | 6 +- .../validate-approved-access-domain.email.tsx | 5 +- .../emails/warn-suspended-workspace.email.tsx | 3 +- .../twenty-emails/src/utils/i18n.utils.ts | 86 +++++++++++++++++++ .../services/approved-access-domain.spec.ts | 1 + .../auth/services/auth.service.spec.ts | 9 ++ .../auth/services/auth.service.ts | 11 ++- .../services/reset-password.service.spec.ts | 9 ++ .../auth/services/reset-password.service.ts | 11 ++- .../services/email-verification.service.ts | 12 ++- .../core-modules/i18n/i18n.middleware.ts | 21 ----- .../engine/core-modules/i18n/i18n.module.ts | 14 +-- .../engine/core-modules/i18n/i18n.service.ts | 8 -- .../view/controllers/view.controller.ts | 4 + .../view/resolvers/view.resolver.ts | 4 + .../workspace-invitation.service.spec.ts | 10 +++ .../services/workspace-invitation.service.ts | 11 ++- .../before-update-one-field.hook.spec.ts | 20 ++--- .../hooks/before-update-one-field.hook.ts | 4 +- ...ld-metadata-standard-override.util.spec.ts | 9 +- .../before-update-one-object.hook.spec.ts | 20 ++--- .../hooks/before-update-one-object.hook.ts | 8 +- .../object-metadata.resolver.ts | 14 +++ ...ct-metadata-standard-override.util.spec.ts | 35 +++++++- ...-object-metadata-standard-override.util.ts | 5 +- .../services/cleaner.workspace-service.ts | 11 ++- 34 files changed, 286 insertions(+), 186 deletions(-) create mode 100644 packages/twenty-emails/src/utils/i18n.utils.ts delete mode 100644 packages/twenty-server/src/engine/core-modules/i18n/i18n.middleware.ts diff --git a/packages/twenty-emails/src/components/BaseEmail.tsx b/packages/twenty-emails/src/components/BaseEmail.tsx index 6105a5c249..a45efbe063 100644 --- a/packages/twenty-emails/src/components/BaseEmail.tsx +++ b/packages/twenty-emails/src/components/BaseEmail.tsx @@ -1,42 +1,11 @@ -import { i18n, type Messages } from '@lingui/core'; import { I18nProvider } from '@lingui/react'; import { Container, Html } from '@react-email/components'; import { BaseHead } from 'src/components/BaseHead'; import { Footer } from 'src/components/Footer'; import { Logo } from 'src/components/Logo'; -import { type APP_LOCALES, SOURCE_LOCALE } from 'twenty-shared/translations'; -import { messages as afMessages } from '../locales/generated/af-ZA'; -import { messages as arMessages } from '../locales/generated/ar-SA'; -import { messages as caMessages } from '../locales/generated/ca-ES'; -import { messages as csMessages } from '../locales/generated/cs-CZ'; -import { messages as daMessages } from '../locales/generated/da-DK'; -import { messages as deMessages } from '../locales/generated/de-DE'; -import { messages as elMessages } from '../locales/generated/el-GR'; -import { messages as enMessages } from '../locales/generated/en'; -import { messages as esMessages } from '../locales/generated/es-ES'; -import { messages as fiMessages } from '../locales/generated/fi-FI'; -import { messages as frMessages } from '../locales/generated/fr-FR'; -import { messages as heMessages } from '../locales/generated/he-IL'; -import { messages as huMessages } from '../locales/generated/hu-HU'; -import { messages as itMessages } from '../locales/generated/it-IT'; -import { messages as jaMessages } from '../locales/generated/ja-JP'; -import { messages as koMessages } from '../locales/generated/ko-KR'; -import { messages as nlMessages } from '../locales/generated/nl-NL'; -import { messages as noMessages } from '../locales/generated/no-NO'; -import { messages as plMessages } from '../locales/generated/pl-PL'; -import { messages as pseudoEnMessages } from '../locales/generated/pseudo-en'; -import { messages as ptBRMessages } from '../locales/generated/pt-BR'; -import { messages as ptPTMessages } from '../locales/generated/pt-PT'; -import { messages as roMessages } from '../locales/generated/ro-RO'; -import { messages as ruMessages } from '../locales/generated/ru-RU'; -import { messages as srMessages } from '../locales/generated/sr-Cyrl'; -import { messages as svMessages } from '../locales/generated/sv-SE'; -import { messages as trMessages } from '../locales/generated/tr-TR'; -import { messages as ukMessages } from '../locales/generated/uk-UA'; -import { messages as viMessages } from '../locales/generated/vi-VN'; -import { messages as zhHansMessages } from '../locales/generated/zh-CN'; -import { messages as zhHantMessages } from '../locales/generated/zh-TW'; +import { createI18nInstance } from 'src/utils/i18n.utils'; +import { type APP_LOCALES } from 'twenty-shared/translations'; type BaseEmailProps = { children: JSX.Element | JSX.Element[] | string; @@ -44,59 +13,17 @@ type BaseEmailProps = { locale: keyof typeof APP_LOCALES; }; -const messages: Record = { - en: enMessages, - 'pseudo-en': pseudoEnMessages, - 'af-ZA': afMessages, - 'ar-SA': arMessages, - 'ca-ES': caMessages, - 'cs-CZ': csMessages, - 'da-DK': daMessages, - 'de-DE': deMessages, - 'el-GR': elMessages, - 'es-ES': esMessages, - 'fi-FI': fiMessages, - 'fr-FR': frMessages, - 'he-IL': heMessages, - 'hu-HU': huMessages, - 'it-IT': itMessages, - 'ja-JP': jaMessages, - 'ko-KR': koMessages, - 'nl-NL': nlMessages, - 'no-NO': noMessages, - 'pl-PL': plMessages, - 'pt-BR': ptBRMessages, - 'pt-PT': ptPTMessages, - 'ro-RO': roMessages, - 'ru-RU': ruMessages, - 'sr-Cyrl': srMessages, - 'sv-SE': svMessages, - 'tr-TR': trMessages, - 'uk-UA': ukMessages, - 'vi-VN': viMessages, - 'zh-CN': zhHansMessages, - 'zh-TW': zhHantMessages, -}; - -(Object.entries(messages) as [keyof typeof APP_LOCALES, any][]).forEach( - ([locale, message]) => { - i18n.load(locale, message); - }, -); - -i18n.activate(SOURCE_LOCALE); - export const BaseEmail = ({ children, width, locale }: BaseEmailProps) => { - i18n.activate(locale); + const i18nInstance = createI18nInstance(locale); return ( - + {children} -