You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vue i18n翻译模块添加接口请求后出现context is undefined报错如何解决

问题根因

你将loadLocales调整为async异步函数后,异步函数默认返回Promise对象,你直接同步执行const { context, messages } = loadLocales()无法拿到实际返回值,两个变量均为undefined,因此后续访问context.id自然抛出类型错误。

修复方案

同时适配「合并本地+接口翻译」的需求,修正后的代码如下:

const loadLocales = async () => {
  const context = require.context('./locales', true);
  // 拉取接口端翻译
  const remoteRes = await ApiService.post(`${translationToolUrl}/gateway/translations`, { project: 'myProject' });
  const remoteTrans = remoteRes.data; // 可根据接口实际返回结构调整取值路径
  // 加载本地翻译
  const localMessages = context.keys()
    .map((key) => ({ key, locale: key.match(/[-a-z0-9_]+/i)[0] }))
    .reduce((msgs, { key, locale }) => ({
      ...msgs,
      [locale]: extendMessages(context(key)),
    }), {});
  // 合并翻译:当前配置为接口翻译优先覆盖本地同key内容,如需本地优先调换两者顺序即可
  const mergedMessages = Object.keys({...localMessages, ...remoteTrans}).reduce((acc, locale) => {
    acc[locale] = {
      ...(localMessages[locale] || {}),
      ...(remoteTrans[locale] || {})
    }
    return acc
  }, {})
  return { context, messages: mergedMessages };
};

// 异步初始化基础变量和i18n实例
let i18n = null
let context = null
let messages = null
(async () => {
  const initRes = await loadLocales()
  context = initRes.context
  messages = initRes.messages
  i18n = new VueI18n({
    locale: 'en',
    fallbackLocale: 'en',
    silentFallbackWarn: true,
    messages,
  });
  // 原有i18n挂载逻辑(比如export default i18n、Vue.use(i18n)等)放在此处执行
})()

if (module.hot) {
  module.hot.accept(context.id, async () => {
    // 热更新时也要异步等待加载完成
    const { messages: newMessages } = await loadLocales();
    Object.keys(newMessages)
      // 可替换为项目内的深比较方法替代JSON.stringify,性能和准确性更高
      .filter((locale) => JSON.stringify(messages[locale]) !== JSON.stringify(newMessages[locale]))
      .forEach((locale) => {
         const msgs = newMessages[locale];
         messages[locale] = msgs;
         i18n.setLocaleMessage(locale, msgs);
       });
  });
}

后续切换纯远程翻译的调整方法

不需要本地翻译时,直接删除loadLocales内加载本地文件、合并翻译的逻辑,直接用接口返回的remoteTrans生成messages即可,其余逻辑无需改动。

内容的提问来源于stack exchange,提问作者GPiter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 07:45:03