diff --git a/packages/twenty-server/src/engine/core-modules/i18n/i18n.service.ts b/packages/twenty-server/src/engine/core-modules/i18n/i18n.service.ts index 4c8ca4e78dd..700c025d010 100644 --- a/packages/twenty-server/src/engine/core-modules/i18n/i18n.service.ts +++ b/packages/twenty-server/src/engine/core-modules/i18n/i18n.service.ts @@ -1,4 +1,4 @@ -import { Injectable, type OnModuleInit } from '@nestjs/common'; +import { Injectable, Logger, type OnModuleInit } from '@nestjs/common'; import { type I18n, @@ -42,6 +42,9 @@ import { messages as zhHantMessages } from 'src/engine/core-modules/i18n/locales @Injectable() export class I18nService implements OnModuleInit { + private readonly logger = new Logger(I18nService.name); + private readonly loggedMissingIds = new Set(); + private i18nInstancesMap: Record = {} as Record; @@ -83,7 +86,19 @@ export class I18nService implements OnModuleInit { ( Object.entries(messagesByLocale) as [keyof typeof APP_LOCALES, Messages][] ).forEach(([locale, messages]) => { - const localeI18n = setupI18n(); + const localeI18n = setupI18n({ + missing: (_locale, id) => { + if (!this.loggedMissingIds.has(id)) { + this.loggedMissingIds.add(id); + this.logger.warn( + `Missing translation for message "${id}" in locale "${_locale}". ` + + 'Compiled catalogs may be stale — run lingui compile.', + ); + } + + return id; + }, + }); localeI18n.load(locale, messages); localeI18n.activate(locale);