i18n.js 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. import { createI18n } from 'vue-i18n';
  2. import { localST_Locale } from './base/storage';
  3. import { LANGUAGE_ENGLISH, LANGUAGE_CHINESE } from './base/variables';
  4. import { useLocaleStore } from './base/store/use-locale';
  5. import ajax from './base/ajax';
  6. /**
  7. * 多语言解决方案
  8. * @see https://vue-i18n.intlify.dev/
  9. */
  10. let i18n = null;
  11. // 创建一个函数来加载语言文件
  12. async function loadLocaleMessages() {
  13. const messages = {};
  14. const locales = [LANGUAGE_ENGLISH, LANGUAGE_CHINESE]; // 根据你的需求添加语言代码
  15. for (const locale of locales) {
  16. const url = `/i18n/lang-${locale}.json`;
  17. const response = await ajax.get(url);
  18. messages[locale] = response;
  19. }
  20. return messages;
  21. }
  22. /**
  23. * 检查一个字符串是否是合法的语言名称
  24. * @param {string} lang
  25. * @returns
  26. */
  27. function isValidLanguage(lang) {
  28. return lang === LANGUAGE_ENGLISH || lang === LANGUAGE_CHINESE;
  29. }
  30. /**
  31. * 设置当前的语言
  32. * @param {string} locale - en/zh
  33. */
  34. export function setI18nLanguage(locale) {
  35. const is_valid = isValidLanguage(locale);
  36. if (!is_valid) {
  37. return;
  38. }
  39. if (!i18n) {
  40. return;
  41. }
  42. i18n.global.locale = locale;
  43. localST_Locale.setItem(locale);
  44. /**
  45. * NOTE:
  46. * If you need to specify the language setting for headers, such as the `fetch` API, set it here.
  47. * The following is an example for axios.
  48. *
  49. * axios.defaults.headers.common['Accept-Language'] = locale
  50. */
  51. document.querySelector('html').setAttribute('lang', locale);
  52. const store = useLocaleStore();
  53. store.updateLanguage(locale);
  54. }
  55. export async function setupI18n() {
  56. const messages = await loadLocaleMessages();
  57. i18n = createI18n({
  58. locale: LANGUAGE_CHINESE,
  59. fallbackLocale: LANGUAGE_ENGLISH,
  60. messages
  61. });
  62. return i18n;
  63. }