i18n.js 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  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. * 此项目中的多语言配置有如下几处:
  11. * 位置1. public/i18n/lang-*.json
  12. * 位置2. src/modules/answer-refference/i18n-message/*.json
  13. *
  14. * 位置 1 是项目整体的多语言配置,项目中主要的多语言皆在此配置
  15. * 位置 2 是对话过程中,针对智能体的回答内容部分,有些是动态生成的组件
  16. * 例如:pdf预览,下载链接的展示,文档引用的展示等场景,其中多语言内容是 复制 于位置1中的配置项,是重复项
  17. * 使用复制而非像主APP一样动态加载的原因是:多语言配置项较少,且组件是动态创建,在动态创建时加载多语言会造成资源浪费
  18. */
  19. let i18n = null;
  20. // 创建一个函数来加载语言文件
  21. async function loadLocaleMessages() {
  22. const messages = {};
  23. const locales = [LANGUAGE_ENGLISH, LANGUAGE_CHINESE]; // 根据你的需求添加语言代码
  24. for (const locale of locales) {
  25. const url = `/i18n/lang-${locale}.json`;
  26. const response = await ajax.get(url);
  27. messages[locale] = response;
  28. }
  29. return messages;
  30. }
  31. /**
  32. * 检查一个字符串是否是合法的语言名称
  33. * @param {string} lang
  34. * @returns
  35. */
  36. function isValidLanguage(lang) {
  37. return lang === LANGUAGE_ENGLISH || lang === LANGUAGE_CHINESE;
  38. }
  39. /**
  40. * 设置当前的语言
  41. * @param {string} locale - en/zh
  42. */
  43. export function setI18nLanguage(locale) {
  44. const is_valid = isValidLanguage(locale);
  45. if (!is_valid) {
  46. return;
  47. }
  48. if (!i18n) {
  49. return;
  50. }
  51. i18n.global.locale = locale;
  52. localST_Locale.setItem(locale);
  53. /**
  54. * NOTE:
  55. * If you need to specify the language setting for headers, such as the `fetch` API, set it here.
  56. * The following is an example for axios.
  57. *
  58. * axios.defaults.headers.common['Accept-Language'] = locale
  59. */
  60. document.querySelector('html').setAttribute('lang', locale);
  61. const store = useLocaleStore();
  62. store.updateLanguage(locale);
  63. }
  64. export async function setupI18n() {
  65. const messages = await loadLocaleMessages();
  66. i18n = createI18n({
  67. locale: LANGUAGE_CHINESE,
  68. fallbackLocale: LANGUAGE_ENGLISH,
  69. messages
  70. });
  71. return i18n;
  72. }