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

Nuxt i18n翻译中能否保留JSON示例?编译报错求助

在Nuxt i18n翻译中包含JSON内容的解决方案

错误原因

@nuxtjs/i18n 基于 vue-i18n 实现,默认会将文本中的 {} 识别为插值占位符解析。你写入的 {"key": "value"} 被误判为占位符语法,但其中的 "key": 不符合占位符的命名规则(仅支持字母、数字、下划线),因此触发编译错误。

解决方法

1. 转义大括号(推荐,适合少量JSON内容)

vue-i18n 支持用双大括号 {{ 和 }} 转义为单个大括号,避免被当作占位符解析。修改你的翻译配置:

// nuxt-app/i18n.config.ts
export default defineI18nConfig(() => ({
    legacy: false,
    locale: 'en',
    fallbackLocale: "en",
    escapeParameterHtml: false,
    warnHtmlMessage: false,
    messages: {
        en: {
            welcome: "hello dear human {{\"key\": \"value\"}}"
        },
        fr: {
            welcome: "hello dear human fr"
        }
    },
}))

渲染后会正常显示:hello dear human {"key": "value"}。

2. 全局修改插值分隔符(适合大量JSON内容)

如果翻译中包含大量JSON,转义效率低,可以全局替换vue-i18n的插值分隔符,避免与JSON的大括号冲突:

// nuxt-app/i18n.config.ts
export default defineI18nConfig(() => ({
    legacy: false,
    locale: 'en',
    fallbackLocale: "en",
    escapeParameterHtml: false,
    warnHtmlMessage: false,
    interpolation: {
        prefix: '[[',
        suffix: ']]'
    },
    messages: {
        en: {
            welcome: "hello dear human {\"key\": \"value\"}"
        },
        fr: {
            welcome: "hello dear human fr"
        }
    },
}))

后续需要使用插值占位符时,改用 [[变量名]] 格式即可。

3. 单条翻译使用raw模式(临时方案)

如果仅需对特定翻译跳过占位符解析,可在调用 $t 时传入 raw: true 参数:

<!-- pages/index.vue -->
<template>
  <div>
    <div>
      <button class="btn ml-3" @click="setLocale('en')">en</button>
      <button class="btn ml-3" @click="setLocale('fr')">fr</button>
      <p>{{ $t('welcome', {}, { raw: true }) }}</p>
    </div>
  </div>
</template>

注意:该方法会使这条翻译中的所有占位符失效,若同时需要正常插值,不建议使用。

内容的提问来源于stack exchange,提问作者Full-Stack Developer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 19:37:36