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

Nuxt-i18n中如何在翻译命名参数中插入HTML内容?

解决Nuxt 3 + Nuxt-i18n中HTML插值及<i18n>组件无法使用的问题

问题核心

你在使用Nuxt-i18n构建多语言站点时,尝试用<i18n>组件实现带HTML的翻译内容,但组件无法被识别;直接导入vue-i18n的组件又因依赖层级问题导致构建失败。以下是两种可靠的解决方案:


方案一:全局注册<i18n>组件

Nuxt-i18n v8+在Composition API模式(legacy: false)下不会自动全局注册<i18n>组件,你可以通过Nuxt插件手动注册:

  1. 在项目根目录创建plugins/i18n-component.ts文件:
import { I18n } from 'vue-i18n'

export default defineNuxtPlugin((nuxtApp) => {
  nuxtApp.vueApp.component('i18n', I18n)
})
  1. Nuxt会自动加载该插件,之后你就能在组件中正常使用最初的<i18n>组件代码:
<i18n path="venue.intro-1" tag="p">
  <template v-slot:island>
     <a
       :href="$t('venue.island-link')"
       target="_blank"
       rel="noopener noreferrer"
     >
       {{ $t('venue.intro-1-island-name') }}
     </a>
  </template>
</i18n>

方案二:使用$t配合v-html(适合简单场景)

如果不想注册组件,可通过v-html指令渲染带HTML的翻译结果,但需注意仅在内容完全可控时使用(避免XSS风险):

  1. 在翻译文件(如en.json)中定义带占位符的字符串:
{
  "venue": {
    "intro-1": "Welcome to our venue on {island}",
    "island-link": "/island-info",
    "intro-1-island-name": "Sunset Island"
  }
}
  1. 在组件中通过v-html插入HTML内容:
<p v-html="$t('venue.intro-1', { 
  island: `<a href='${$t('venue.island-link')}' target='_blank' rel='noopener noreferrer'>${$t('venue.intro-1-island-name')}</a>` 
})"></p>

配置验证

你的nuxt.config.ts和i18n.config.ts配置符合Nuxt-i18n v8+的要求,legacy: false确保使用Composition API模式,无需修改。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 00:22:25