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