xref: /expo/apps/test-suite/tests/Localization.js (revision 39a321fa)
1import * as Localization from 'expo-localization';
2import i18n from 'i18n-js';
3import { Platform } from 'react-native';
4
5const en = {
6  good: 'good',
7  morning: 'morning',
8};
9
10const fr = {
11  good: 'bien',
12  morning: 'matin',
13};
14
15const pl = {
16  good: 'dobry',
17  morning: 'rano',
18};
19
20export const name = 'Localization';
21
22export function test(t) {
23  function validateString(result) {
24    t.expect(result).toBeDefined();
25    t.expect(typeof result).toBe('string');
26    t.expect(result.length > 0).toBe(true);
27  }
28
29  function validateStringArray(result) {
30    t.expect(result).toBeDefined();
31    t.expect(Array.isArray(result)).toBe(true);
32  }
33
34  t.describe(`Localization methods`, () => {
35    t.it('expect async to return locale', async () => {
36      const {
37        currency,
38        decimalSeparator,
39        digitGroupingSeparator,
40        isoCurrencyCodes,
41        isMetric,
42        isRTL,
43        locale,
44        locales,
45        timezone,
46        region,
47      } = await Localization.getLocalizationAsync();
48
49      validateString(locale);
50      validateString(timezone);
51      if (Platform.OS !== 'web' || region) {
52        validateString(region);
53      }
54      validateStringArray(isoCurrencyCodes);
55      validateStringArray(locales);
56      t.expect(locales[0]).toBe(Localization.locale);
57      t.expect(typeof isRTL).toBe('boolean');
58      t.expect(typeof isMetric).toBe('boolean');
59      validateString(decimalSeparator);
60      validateString(digitGroupingSeparator);
61      if (Platform.OS !== 'web' || currency) {
62        validateString(currency);
63      }
64    });
65  });
66
67  t.describe(`Localization defines constants`, () => {
68    t.it('Gets the region', async () => {
69      const result = Localization.region;
70      if (Platform.OS !== 'web' || result) {
71        validateString(result);
72      }
73    });
74    t.it('Gets the locale', async () => {
75      validateString(Localization.locale);
76    });
77    t.it('Gets the preferred locales', async () => {
78      const result = Localization.locales;
79      validateStringArray(result);
80      t.expect(result.length > 0).toBe(true);
81      t.expect(result[0]).toBe(Localization.locale);
82    });
83    t.it('Gets ISO currency codes', async () => {
84      const result = Localization.isoCurrencyCodes;
85      validateStringArray(result);
86      result.map(validateString);
87    });
88    t.it('Gets the timezone', async () => {
89      const result = Localization.timezone;
90      if (result || Platform.OS !== 'web') {
91        validateString(Localization.timezone);
92      }
93    });
94    t.it('Gets the layout direction (ltr only)', async () => {
95      const result = Localization.isRTL;
96      t.expect(typeof result).toBe('boolean');
97      t.expect(result).toBe(false);
98    });
99    t.it('Gets the measurement system (metric)', async () => {
100      const result = Localization.isMetric;
101      t.expect(typeof result).toBe('boolean');
102    });
103    t.it('Gets the decimal separator', async () => {
104      validateString(Localization.decimalSeparator);
105    });
106    t.it('Gets the grouping separator', async () => {
107      const result = Localization.decimalSeparator;
108      t.expect(result).toBeDefined();
109      t.expect(typeof result).toBe('string');
110    });
111    if (Platform.OS !== 'web') {
112      t.it('Gets the currency', async () => {
113        validateString(Localization.currency);
114      });
115    }
116  });
117
118  t.describe(`Localization works with i18n-js`, () => {
119    i18n.locale = Localization.locale;
120    i18n.translations = { en, fr, pl };
121    i18n.missingTranslationPrefix = 'EE: ';
122    i18n.fallbacks = true;
123
124    t.it('expect language to match strings (en, pl, fr supported)', async () => {
125      const target = 'good';
126
127      i18n.locale = Localization.locale;
128
129      const expoPredictedLangTag = Localization.locale.split('-')[0];
130      const translation = i18n.translations[expoPredictedLangTag];
131
132      t.expect(translation[target]).toBe(i18n.t(target));
133    });
134  });
135}
136