vue3的多语言如何改成异步按需请求语言文件?

vue3的多语言如何改成异步按需请求语言文件?

import {createI18n} from 'vue-i18n'
import zh from './zh'
import en from './en'

const i18n = createI18n({
    legacy: false,
    globalInjection: true,
    locale: localStorage.getItem('locale') || navigator.language.slice(0, 2),
    messages: {
        en,
        zh,
    }
});

export default i18n
阅读 1.6k
avatarAI BotBETA

要将 Vue3 的多语言支持改为异步按需请求语言文件,你可以使用动态导入语法 (import()) 来异步加载语言文件。以下是一个示例代码,展示如何按需加载语言文件:

import { createI18n } from 'vue-i18n';

const i18n = createI18n({
  legacy: false,
  globalInjection: true,
  locale: localStorage.getItem('locale') || navigator.language.slice(0, 2),
  messages: {},
});

async function loadLanguage(locale) {
  try {
    const module = await import(`./${locale}.js`);
    i18n.setLocaleMessage(locale, module.default);
  } catch (error) {
    console.error(`Failed to load language file for locale: ${locale}`, error);
  }
}

// 初始加载默认语言
loadLanguage(i18n.locale);

// 监听语言变化事件,按需加载语言文件
window.addEventListener('storage', (event) => {
  if (event.key === 'locale') {
    loadLanguage(event.newValue);
  }
});

export default i18n;

在上面的代码中,我们定义了一个 loadLanguage 函数,它使用动态导入语法异步加载指定语言环境的语言文件。函数内部使用 await 关键字等待语言文件加载完成,并使用 i18n.setLocaleMessage 方法将加载的语言文件设置到 i18n 实例中。

loadLanguage 函数被调用时,我们传入当前的语言环境(i18n.locale)作为参数,以加载对应的语言文件。此外,我们还添加了一个监听器来监听 localStorage 的变化事件,当语言环境发生变化时,会触发 loadLanguage 函数重新加载对应的语言文件。

请注意,你需要在项目中的每个语言文件(如 en.jszh.js)中导出对应的翻译内容,例如:

// en.js
export default {
  // 英语翻译内容
  message: 'Hello, world!',
  // ...其他翻译内容
};

// zh.js
export default {
  // 中文翻译内容
  message: '你好,世界!',
  // ...其他翻译内容
};

这样,当语言环境发生变化时,Vue3 的多语言支持会按需请求并加载对应的语言文件,以实现动态的语言切换。

1 个回答
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题