Ed Tanous | 7d6b44c | 2024-03-23 14:56:34 -0700 | [diff] [blame] | 1 | import { createI18n } from 'vue-i18n'; |
jason westover | d248362 | 2025-08-18 09:26:41 -0500 | [diff] [blame] | 2 | import { deepMerge } from './utilities/objectUtils'; |
Dixsie Wolmers | cbcd213 | 2020-01-30 20:58:37 -0600 | [diff] [blame] | 3 | |
jason westover | d248362 | 2025-08-18 09:26:41 -0500 | [diff] [blame] | 4 | export function loadBaseLocaleMessages() { |
| 5 | const context = require.context( |
| 6 | './locales', |
| 7 | true, |
| 8 | /[A-Za-z0-9-_,\s]+\.json$/i, |
| 9 | ); |
| 10 | const messages = {}; |
| 11 | context.keys().forEach((key) => { |
| 12 | const match = key.match(/([A-Za-z0-9-_]+)\.json$/i); |
| 13 | if (!match) return; |
| 14 | const locale = match[1]; |
| 15 | const mod = context(key); |
| 16 | messages[locale] = mod && mod.default ? mod.default : mod; |
| 17 | }); |
Dixsie Wolmers | cbcd213 | 2020-01-30 20:58:37 -0600 | [diff] [blame] | 18 | return messages; |
| 19 | } |
| 20 | |
jason westover | d248362 | 2025-08-18 09:26:41 -0500 | [diff] [blame] | 21 | export function loadEnvLocaleMessages(envName) { |
| 22 | if (!envName) return {}; |
| 23 | const envMessages = {}; |
| 24 | const envLocales = require.context( |
| 25 | './env/locales', |
| 26 | true, |
| 27 | /[A-Za-z0-9-_,\s]+\.json$/i, |
| 28 | ); |
| 29 | const vendorRoot = String(envName).split('-')[0]; |
| 30 | const candidates = |
| 31 | vendorRoot && vendorRoot !== envName ? [vendorRoot, envName] : [envName]; |
| 32 | candidates.forEach((candidate) => { |
| 33 | envLocales.keys().forEach((key) => { |
| 34 | if (!key.includes(`/${candidate}/`)) return; |
| 35 | const localeMatch = key.match(/([A-Za-z0-9-_]+)\.json$/i); |
| 36 | if (!localeMatch) return; |
| 37 | const locale = localeMatch[1]; |
| 38 | const mod = envLocales(key); |
| 39 | const bundle = mod && mod.default ? mod.default : mod; |
| 40 | envMessages[locale] = deepMerge(envMessages[locale] || {}, bundle); |
| 41 | }); |
| 42 | }); |
| 43 | return envMessages; |
| 44 | } |
Ed Tanous | 7d6b44c | 2024-03-23 14:56:34 -0700 | [diff] [blame] | 45 | |
jason westover | d248362 | 2025-08-18 09:26:41 -0500 | [diff] [blame] | 46 | export function createI18nInstance( |
| 47 | envName, |
| 48 | locale, |
| 49 | loadEnv = loadEnvLocaleMessages, |
| 50 | loadBase = loadBaseLocaleMessages, |
| 51 | ) { |
| 52 | const base = loadBase(); |
| 53 | const env = loadEnv(envName); |
| 54 | const messages = { ...base }; |
| 55 | Object.keys(env).forEach((loc) => { |
| 56 | messages[loc] = deepMerge(base[loc] || {}, env[loc]); |
| 57 | }); |
| 58 | |
| 59 | const addAlias = (alias, target) => { |
| 60 | if (!messages[alias] && messages[target]) |
| 61 | messages[alias] = messages[target]; |
| 62 | }; |
| 63 | addAlias('en', 'en-US'); |
| 64 | addAlias('ru', 'ru-RU'); |
| 65 | addAlias('zh', 'zh-CN'); |
| 66 | addAlias('ka', 'ka-GE'); |
| 67 | |
| 68 | const normalize = (val) => { |
| 69 | if (!val) return undefined; |
| 70 | const s = String(val); |
| 71 | if (s === 'en') return 'en-US'; |
| 72 | if (s === 'ru') return 'ru-RU'; |
| 73 | if (s === 'zh') return 'zh-CN'; |
| 74 | if (s === 'ka') return 'ka-GE'; |
| 75 | return s; |
| 76 | }; |
| 77 | |
| 78 | return createI18n({ |
| 79 | locale: normalize(locale), |
| 80 | // Locales that don't exist will fallback to English |
| 81 | fallbackLocale: 'en-US', |
| 82 | // Falling back to fallbackLocale generates two console warnings |
| 83 | // Silent fallback suppresses console warnings when using fallback |
| 84 | silentFallbackWarn: true, |
| 85 | messages, |
| 86 | globalInjection: false, |
| 87 | legacy: false, |
| 88 | }); |
| 89 | } |
| 90 | |
| 91 | const envName = process.env.VUE_APP_ENV_NAME; |
| 92 | // Get default locale from local storage |
| 93 | const stored = window.localStorage.getItem('storedLanguage'); |
| 94 | export default createI18nInstance(envName, stored); |