Cleanup - unused files / unused exports / duplicate exports
[ProtonMail-WebClient.git] / packages / shared / test / i18n / relocalize.spec.ts
blobe9143bfae5a437ec397a80b23d3f5763c5a6d799
1 import { format } from 'date-fns';
2 import type { LocaleData } from 'ttag';
3 import { c, useLocale as ttagUseLocale } from 'ttag';
5 import { DEFAULT_LOCALE } from '../../lib/constants';
6 import { dateLocale } from '../../lib/i18n';
7 import { loadDateLocale, loadLocale } from '../../lib/i18n/loadLocale';
8 import { setTtagLocales } from '../../lib/i18n/locales';
9 import { relocalizeText } from '../../lib/i18n/relocalize';
10 import type { UserSettings } from '../../lib/interfaces';
12 const dummyUserSettings: Pick<UserSettings, 'TimeFormat' | 'DateFormat' | 'WeekStart'> = {
13     WeekStart: 1,
14     DateFormat: 1,
15     TimeFormat: 1,
18 const getTranslation = (data: string) => {
19     return {
20         headers: {
21             'plural-forms': 'nplurals=2; plural=(n != 1);',
22         },
23         contexts: {
24             Info: {
25                 'This is not a pipe': [data],
26             },
27         },
28     } as unknown as LocaleData; // the LocaleData type is wrong.
30 const getTranslationWithDate = (data: string) => {
31     return {
32         headers: {
33             'plural-forms': 'nplurals=2; plural=(n != 1);',
34         },
35         contexts: {
36             Info: {
37                 // eslint-disable-next-line no-template-curly-in-string
38                 'December 16th 2021 was a ${ formattedDate }': [data],
39             },
40         },
41     } as unknown as LocaleData; // the LocaleData type is wrong.
43 const getLocalizedText = () => c('Info').t`This is not a pipe`;
44 const getLocalizedTextWithDate = () => {
45     const formattedDate = format(new Date(2021, 11, 16), 'cccc', { locale: dateLocale });
46     return c('Info').t`December 16th 2021 was a ${formattedDate}`;
49 describe('relocalizeText', () => {
50     afterEach(() => {
51         setTtagLocales({});
52         ttagUseLocale(DEFAULT_LOCALE);
53         void loadDateLocale(DEFAULT_LOCALE);
54     });
56     it('should localize to a different locale only inside the relocalizeText context', async () => {
57         const locales = {
58             fr_FR: async () => getTranslation("Ceci n'est pas une pipe"),
59             it_IT: async () => getTranslation('Questa non è una pipa'),
60         };
61         setTtagLocales(locales);
62         await loadLocale('fr_FR', locales);
63         expect(
64             await relocalizeText({
65                 getLocalizedText,
66                 newLocaleCode: 'it_IT',
67                 userSettings: dummyUserSettings,
68             })
69         ).toEqual('Questa non è una pipa');
70         expect(getLocalizedText()).toEqual("Ceci n'est pas une pipe");
71     });
73     it('should not try to load the default locale', async () => {
74         const locales = {
75             fr_FR: async () => getTranslation("Ceci n'est pas une pipe"),
76             it_IT: async () => getTranslation('Questa non è una pipa'),
77         };
78         setTtagLocales(locales);
79         await loadLocale('fr_FR', locales);
80         expect(
81             await relocalizeText({
82                 getLocalizedText,
83                 newLocaleCode: DEFAULT_LOCALE,
84                 userSettings: dummyUserSettings,
85             })
86         ).toEqual('This is not a pipe');
87         // notice that if relocalizeText tried to load the default locale, it would fail
88         // and fall in the next test (fallback to current locale if the locale passed has no data)
89     });
91     it('should fallback to the current locale if the locale passed has no data', async () => {
92         const locales = {
93             fr_FR: async () => getTranslation("Ceci n'est pas une pipe"),
94             it_IT: async () => getTranslation('Questa non è una pipa'),
95             gl_ES: undefined,
96         };
97         setTtagLocales(locales);
98         await loadLocale('fr_FR', locales);
99         expect(
100             await relocalizeText({
101                 getLocalizedText,
102                 newLocaleCode: 'gl_ES',
103                 userSettings: dummyUserSettings,
104             })
105         ).toEqual("Ceci n'est pas une pipe");
106         expect(getLocalizedText()).toEqual("Ceci n'est pas une pipe");
107     });
109     it('should fallback to the current locale if no locale is passed', async () => {
110         expect(
111             await relocalizeText({
112                 getLocalizedText,
113                 userSettings: dummyUserSettings,
114             })
115         ).toEqual('This is not a pipe');
116     });
118     it('should relocalize without date format', async () => {
119         setTtagLocales({
120             // eslint-disable-next-line no-template-curly-in-string
121             es_ES: async () => getTranslationWithDate('El 16 de diciembre de 2021 fue un ${ formattedDate }'),
122         });
123         expect(
124             await relocalizeText({
125                 getLocalizedText: getLocalizedTextWithDate,
126                 newLocaleCode: 'es_ES',
127                 userSettings: dummyUserSettings,
128             })
129         ).toEqual('El 16 de diciembre de 2021 fue un Thursday');
130     });
132     it('should relocalize with date format', async () => {
133         setTtagLocales({
134             // eslint-disable-next-line no-template-curly-in-string
135             es_ES: async () => getTranslationWithDate('El 16 de diciembre de 2021 fue un ${ formattedDate }'),
136         });
137         await loadDateLocale('es_ES', 'es_ES');
138         expect(
139             await relocalizeText({
140                 getLocalizedText: getLocalizedTextWithDate,
141                 newLocaleCode: 'es_ES',
142                 relocalizeDateFormat: true,
143                 userSettings: dummyUserSettings,
144             })
145         ).toEqual('El 16 de diciembre de 2021 fue un jueves');
146     });
148     it('should fallback to current date locale if no date locale data is found', async () => {
149         setTtagLocales({
150             // eslint-disable-next-line no-template-curly-in-string
151             xx_XX: async () => getTranslationWithDate('blah blah blah ${ formattedDate }'),
152         });
153         expect(
154             await relocalizeText({
155                 getLocalizedText: getLocalizedTextWithDate,
156                 newLocaleCode: 'xx_XX',
157                 relocalizeDateFormat: true,
158                 userSettings: dummyUserSettings,
159             })
160         ).toEqual('blah blah blah Thursday');
161     });