xref: /openbmc/webui-vue/src/i18n.js (revision d2483622fc31f6b965a052d0c4f999ad963d0a0f)
1import { createI18n } from 'vue-i18n';
2import { deepMerge } from './utilities/objectUtils';
3
4export 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  });
18  return messages;
19}
20
21export 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}
45
46export 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
91const envName = process.env.VUE_APP_ENV_NAME;
92// Get default locale from local storage
93const stored = window.localStorage.getItem('storedLanguage');
94export default createI18nInstance(envName, stored);
95