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

如何在Nuxt3+Vuetify3多语言应用中根据nuxtI18n语言切换$body-font-family字体

如何在Nuxt3+Vuetify3多语言应用中根据nuxtI18n语言切换$body-font-family字体

嘿,我之前在做Nuxt3+Vuetify3多语言项目的时候,刚好碰到过和你一模一样的需求——根据切换的语言(波斯语/英语)自动替换全局字体。给你分享两个亲测有效的方案,你可以根据自己的项目情况选一个:

方案一:监听语言切换事件,动态修改CSS变量

Vuetify的$body-font-family实际上对应着全局CSS变量--v-body-font-family,我们可以通过监听nuxtI18n的语言切换事件,动态修改这个变量的值。

步骤1:准备并引入字体文件

先把你的波斯语字体(比如常用的Vazirmatn)和英语字体(比如Roboto)放到项目的assets/fonts目录下,然后在assets/css/main.css里通过@font-face引入:

@font-face {
  font-family: 'Vazirmatn';
  src: url('~/assets/fonts/Vazirmatn-Regular.woff2') format('woff2');
  font-weight: normal;
  font-style: normal;
}

@font-face {
  font-family: 'Roboto';
  src: url('~/assets/fonts/Roboto-Regular.woff2') format('woff2');
  font-weight: normal;
  font-style: normal;
}

步骤2:创建插件监听语言切换

在项目的plugins目录下新建一个font-switcher.ts文件,用来监听语言变化并修改字体:

export default defineNuxtPlugin(({ $i18n }) => {
  // 定义设置字体的函数
  const setFontFamily = (locale: string) => {
    const rootElement = document.documentElement;
    if (locale === 'fa') {
      // 切换到波斯语时使用Vazirmatn
      rootElement.style.setProperty('--v-body-font-family', '"Vazirmatn", sans-serif');
      // 顺便设置RTL排版方向(可选,根据需求加)
      rootElement.style.direction = 'rtl';
    } else {
      // 切换到英语时使用Roboto
      rootElement.style.setProperty('--v-body-font-family', '"Roboto", sans-serif');
      rootElement.style.direction = 'ltr';
    }
  };

  // 页面初始化时先设置一次对应字体
  setFontFamily($i18n.locale.value);

  // 监听nuxtI18n的语言切换事件
  $i18n.onLocaleChanged((newLocale) => {
    setFontFamily(newLocale);
  });
});

步骤3:配置Nuxt和Vuetify

在nuxt.config.ts里引入我们的CSS文件,并配置Vuetify的默认主题(可选,用来设置初始字体):

export default defineNuxtConfig({
  css: ['~/assets/css/main.css'],
  modules: ['@nuxtjs/i18n', 'vuetify-nuxt-module'],
  vuetify: {
    theme: {
      defaultTheme: 'light',
      themes: {
        light: {
          variables: {
            'body-font-family': '"Roboto", sans-serif' // 默认英语字体
          }
        }
      }
    }
  },
  i18n: {
    locales: [
      { code: 'en', name: 'English' },
      { code: 'fa', name: 'Farsi' }
    ],
    defaultLocale: 'en'
  }
});

方案二:通过布局组件动态添加类名切换字体

这个方案更偏向CSS层面,通过给根容器添加语言对应的类名,然后用CSS变量覆盖字体设置,逻辑更直观。

步骤1:同样先引入字体文件(和方案一的步骤1一致)

确保assets/css/main.css里已经正确引入了两种字体。

步骤2:修改默认布局组件

打开layouts/default.vue,给根容器绑定语言对应的类名,并在样式里设置不同类名下的字体变量:

<template>
  <!-- 根据当前语言动态添加类名 -->
  <div :class="`lang-${$i18n.locale}`">
    <NuxtPage />
  </div>
</template>

<style>
/* 英语字体设置 */
.lang-en {
  --v-body-font-family: "Roboto", sans-serif;
  direction: ltr;
}

/* 波斯语字体设置 */
.lang-fa {
  --v-body-font-family: "Vazirmatn", sans-serif;
  direction: rtl;
}
</style>

这样,当你切换语言时,根容器的类名会自动变化,对应的字体和排版方向也会跟着切换,完全不需要额外的JS逻辑。

小提示

  • 如果你用的是其他波斯语字体,只需要替换@font-face里的字体名称和文件路径就行。
  • 记得给字体文件添加合适的字体权重(比如Bold、Light),如果你的项目需要用到不同粗细的文字。

备注:内容来源于stack exchange,提问作者Hanieh MA

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.21 11:13:10