index.js 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. /**
  2. * Vue i18n loader
  3. * created by @musnow
  4. * https://github.com/musnow
  5. */
  6. import Vue from 'vue'
  7. import VueI18n from 'vue-i18n'
  8. // default language
  9. import enUS from './lang/en-US'
  10. // change default accept-language
  11. import { axios } from '@/utils/request'
  12. Vue.use(VueI18n)
  13. export const defaultLang = 'en-US'
  14. const messages = {
  15. 'en-US': {
  16. ...enUS
  17. }
  18. }
  19. const i18n = new VueI18n({
  20. locale: defaultLang,
  21. fallbackLocale: defaultLang,
  22. messages
  23. })
  24. export default i18n
  25. const loadedLanguages = [defaultLang]
  26. // 从缓存設置中加载当前语言
  27. // if (Vue.ls.get('lang') !== null && defaultLang !== Vue.ls.get('lang')) {
  28. // loadLanguageAsync(localStorage.lang)
  29. // }
  30. function setI18nLanguage (lang) {
  31. i18n.locale = lang
  32. axios.defaults.headers.common['Accept-Language'] = lang
  33. document.querySelector('html').setAttribute('lang', lang)
  34. return lang
  35. }
  36. export function loadLanguageAsync (lang = defaultLang) {
  37. return new Promise(resolve => {
  38. // 缓存语言设置
  39. Vue.ls.set('lang', lang)
  40. if (i18n.locale !== lang) {
  41. if (!loadedLanguages.includes(lang)) {
  42. return import(/* webpackChunkName: "lang-[request]" */ `./lang/${lang}`).then(msg => {
  43. i18n.setLocaleMessage(lang, msg.default)
  44. loadedLanguages.push(lang)
  45. return setI18nLanguage(lang)
  46. })
  47. }
  48. return resolve(setI18nLanguage(lang))
  49. }
  50. return resolve(lang)
  51. })
  52. }