remove singleton usage of i18n (#14422)

closes https://github.com/twentyhq/core-team-issues/issues/1480

---------

Co-authored-by: Félix Malfait <felix.malfait@gmail.com>
This commit is contained in:
nitin
2025-09-17 22:31:43 +05:30
committed by GitHub
parent 2ffbe017c2
commit 666b99524a
34 changed files with 286 additions and 186 deletions
@@ -1,21 +1,24 @@
import { i18n } from '@lingui/core';
import { type I18n } from '@lingui/core';
import { SOURCE_LOCALE } from 'twenty-shared/translations';
import { generateMessageId } from 'src/engine/core-modules/i18n/utils/generateMessageId';
import { type ObjectMetadataDTO } from 'src/engine/metadata-modules/object-metadata/dtos/object-metadata.dto';
import { resolveObjectMetadataStandardOverride } from 'src/engine/metadata-modules/object-metadata/utils/resolve-object-metadata-standard-override.util';
jest.mock('@lingui/core');
jest.mock('src/engine/core-modules/i18n/utils/generateMessageId');
const mockI18n = i18n as jest.Mocked<typeof i18n>;
const mockGenerateMessageId = generateMessageId as jest.MockedFunction<
typeof generateMessageId
>;
describe('resolveObjectMetadataStandardOverride', () => {
let mockI18n: jest.Mocked<I18n>;
beforeEach(() => {
jest.clearAllMocks();
mockI18n = {
_: jest.fn(),
} as unknown as jest.Mocked<I18n>;
});
describe('Custom objects', () => {
@@ -41,6 +44,7 @@ describe('resolveObjectMetadataStandardOverride', () => {
objectMetadata,
'labelSingular',
'fr-FR',
mockI18n,
);
expect(result).toBe('My Custom');
@@ -68,6 +72,7 @@ describe('resolveObjectMetadataStandardOverride', () => {
objectMetadata,
'description',
undefined,
mockI18n,
);
expect(result).toBe('Custom Description');
@@ -95,6 +100,7 @@ describe('resolveObjectMetadataStandardOverride', () => {
objectMetadata,
'icon',
SOURCE_LOCALE,
mockI18n,
);
expect(result).toBe('custom-icon');
@@ -118,6 +124,7 @@ describe('resolveObjectMetadataStandardOverride', () => {
objectMetadata,
'icon',
'fr-FR',
mockI18n,
);
expect(result).toBe('override-icon');
@@ -148,6 +155,7 @@ describe('resolveObjectMetadataStandardOverride', () => {
objectMetadata,
'labelSingular',
'fr-FR',
mockI18n,
),
).toBe('Libellé traduit');
expect(
@@ -155,6 +163,7 @@ describe('resolveObjectMetadataStandardOverride', () => {
objectMetadata,
'labelPlural',
'fr-FR',
mockI18n,
),
).toBe('Libellés traduits');
expect(
@@ -162,6 +171,7 @@ describe('resolveObjectMetadataStandardOverride', () => {
objectMetadata,
'description',
'fr-FR',
mockI18n,
),
).toBe('Description traduite');
});
@@ -191,6 +201,7 @@ describe('resolveObjectMetadataStandardOverride', () => {
objectMetadata,
'labelSingular',
'fr-FR',
mockI18n,
);
expect(result).toBe('Standard Label');
@@ -220,6 +231,7 @@ describe('resolveObjectMetadataStandardOverride', () => {
objectMetadata,
'description',
'fr-FR',
mockI18n,
);
expect(result).toBe('Standard Description');
@@ -250,6 +262,7 @@ describe('resolveObjectMetadataStandardOverride', () => {
objectMetadata,
'labelSingular',
undefined,
mockI18n,
);
expect(result).toBe('Standard Label');
@@ -277,6 +290,7 @@ describe('resolveObjectMetadataStandardOverride', () => {
objectMetadata,
'labelSingular',
SOURCE_LOCALE,
mockI18n,
),
).toBe('Overridden Label');
expect(
@@ -284,6 +298,7 @@ describe('resolveObjectMetadataStandardOverride', () => {
objectMetadata,
'labelPlural',
SOURCE_LOCALE,
mockI18n,
),
).toBe('Overridden Labels');
expect(
@@ -291,6 +306,7 @@ describe('resolveObjectMetadataStandardOverride', () => {
objectMetadata,
'description',
SOURCE_LOCALE,
mockI18n,
),
).toBe('Overridden Description');
expect(
@@ -298,6 +314,7 @@ describe('resolveObjectMetadataStandardOverride', () => {
objectMetadata,
'icon',
SOURCE_LOCALE,
mockI18n,
),
).toBe('overridden-icon');
});
@@ -322,6 +339,7 @@ describe('resolveObjectMetadataStandardOverride', () => {
objectMetadata,
'labelSingular',
'fr-FR',
mockI18n,
);
expect(result).toBe('Standard Label');
@@ -339,10 +357,14 @@ describe('resolveObjectMetadataStandardOverride', () => {
},
};
mockGenerateMessageId.mockReturnValue('generated-message-id');
mockI18n._.mockReturnValue('generated-message-id');
const result = resolveObjectMetadataStandardOverride(
objectMetadata,
'labelSingular',
SOURCE_LOCALE,
mockI18n,
);
expect(result).toBe('Standard Label');
@@ -367,6 +389,7 @@ describe('resolveObjectMetadataStandardOverride', () => {
objectMetadata,
'labelSingular',
'fr-FR',
mockI18n,
);
expect(mockGenerateMessageId).toHaveBeenCalledWith('Standard Label');
@@ -393,6 +416,7 @@ describe('resolveObjectMetadataStandardOverride', () => {
objectMetadata,
'labelSingular',
'fr-FR',
mockI18n,
);
expect(result).toBe('Standard Label');
@@ -423,6 +447,7 @@ describe('resolveObjectMetadataStandardOverride', () => {
objectMetadata,
'labelSingular',
'fr-FR',
mockI18n,
);
expect(result).toBe('Translation Override');
@@ -447,6 +472,7 @@ describe('resolveObjectMetadataStandardOverride', () => {
objectMetadata,
'labelSingular',
SOURCE_LOCALE,
mockI18n,
);
expect(result).toBe('Source Override');
@@ -471,6 +497,7 @@ describe('resolveObjectMetadataStandardOverride', () => {
objectMetadata,
'labelSingular',
'de-DE',
mockI18n,
);
expect(result).toBe('Auto Translated Label');
@@ -496,6 +523,7 @@ describe('resolveObjectMetadataStandardOverride', () => {
objectMetadata,
'labelSingular',
undefined,
mockI18n,
);
expect(result).toBe('Source Override');
@@ -520,6 +548,7 @@ describe('resolveObjectMetadataStandardOverride', () => {
objectMetadata,
'labelSingular',
undefined,
mockI18n,
);
expect(result).toBe('Auto Translated Label');
@@ -1,4 +1,4 @@
import { i18n } from '@lingui/core';
import { type I18n } from '@lingui/core';
import { isNonEmptyString } from '@sniptt/guards';
import { type APP_LOCALES, SOURCE_LOCALE } from 'twenty-shared/translations';
import { isDefined } from 'twenty-shared/utils';
@@ -18,6 +18,7 @@ export const resolveObjectMetadataStandardOverride = (
>,
labelKey: 'labelPlural' | 'labelSingular' | 'description' | 'icon',
locale: keyof typeof APP_LOCALES | undefined,
i18nInstance: I18n,
): string => {
const safeLocale = locale ?? SOURCE_LOCALE;
@@ -52,7 +53,7 @@ export const resolveObjectMetadataStandardOverride = (
}
const messageId = generateMessageId(objectMetadata[labelKey] ?? '');
const translatedMessage = i18n._(messageId);
const translatedMessage = i18nInstance._(messageId);
if (translatedMessage === messageId) {
return objectMetadata[labelKey] ?? '';