nuxt3之国际化i18n

1,598 阅读3分钟

前言

大家好,我是你不会困,写代码就不会困,今天分享的是nuxt3之国际化i18n 国际化是在应用程序中实现多语言支持的重要方面之一。在处理国际化时,可以使用不同的方法来实现数据持久化和页面初始化的查询。其中一种常见的方法是使用 Pinia(一种 Vue.js 状态管理库)来处理数据持久化。

然而,当使用服务端渲染(SSR)时,可能会遇到一个问题,即在页面初始化时会出现闪屏的情况,给用户带来不良的体验。这个问题的原因是服务端渲染先渲染默认语言的页面,然后再根据用户选择的语言进行一次渲染,导致页面的闪烁。

看来很多文章,有一定的误导性,之前做国际化是通过pinia去做数据持久化,然后在页面初始化的时候进行查询,然后你会发现屏幕会闪一下,原因就是服务端渲染,先给你渲染默认的,这个时候如果你的语言不是默认的就会再渲染一次,页面表现就是闪屏,用户体验极其不好。

那怎么配置pinia呢?nuxt3 他不需要,没错,就是不需要,使用方法是很简单

为了解决这个问题,可以使用 Nuxt.js 3(Nuxt 3)和 @nuxtjs/i18n 模块来进行国际化的配置,而不再依赖 Pinia 进行数据持久化。

首先,需要安装相关的依赖,包括 vue-i18n 和 @nuxtjs/i18n:

yarn add vue-i18n 
yarn add @nuxtjs/i18n@next -D

然后,在 Nuxt 3 的配置文件 nuxt.config.ts 中添加 @nuxtjs/i18n 模块并进行相应的配置:

export default defineNuxtConfig({
  modules: [
    '@nuxtjs/i18n',//添加模块到Nuxt项目的配置
  ],
  i18n: {
    strategy: 'prefix_and_default', // 添加路由前缀的方式
    locales: ['en', 'zh', 'ja'], // 配置语种
    defaultLocale: 'zh', // 默认语种
    vueI18n: './i18n.config.ts', // 通过vueI18n配置
  },

})

接下来,创建 vue-i18n 的配置文件 i18n.config.ts,用于配置语言和对应的翻译资源:

import en from './locales/en.json'
import zh from './locales/zh.json'
import ja from './locales/ja.json'

export default defineI18nConfig(() => ({
  legacy: false, // 是否兼容之前
  locale: 'zh', // 默认语言
  messages: {//对应的语言
    en,
    zh,
    ja,
  },
}))

在 locales 目录下创建对应的语言文件,例如 en.json 和 zh.json,并填写相应的翻译内容:

en.json配置:

{
  "welcome": "hello",
  "messages": "world!"
}

zh.json配置:

{
    "welcome": "你好",
    "messages": "我的世界!"
}

在页面中使用 useI18n 和 $t 方法来实现多语言切换和翻译:

<script setup lang="ts">
const {locale, setLocale} = useI18n()
onMounted(() => {
  console.log("locale--language", locale.value)
})

</script>

<template>
	<div>
        <v-btn @click="setLocale('en')">切换英文</v-btn>
        <v-btn @click="setLocale('zh')">切换中文</v-btn>
        <p>{{ $t('welcome') }}</p>
        <p>{{ $t('messages') }}</p>
    </div>
</template>

<style scoped>

</style>

文件目录结构,在项目的根目录下新建lacales文件,分别创建对应的json文件

image.png

这个是nuxt3他在cookies的数据持久化的key,在项目里面要用到排查,可以直接看这里 image.png

总结

通过以上配置和代码,你可以使用 Nuxt 3 和 @nuxtjs/i18n 模块来实现国际化功能,而不再需要 Pinia 进行数据持久化。在页面初始化时,不会出现闪屏现象,用户体验得到了改善。

请注意,这里提供的是使用 Nuxt 3 和 @nuxtjs/i18n 模块的示例配置,具体的实现可能因项目需为了解决服务端渲染(SSR)下的闪屏问题,可以使用 Nuxt.js 3(Nuxt 3)和 @nuxtjs/i18n 模块来进行国际化的配置,而不再依赖 Pinia 进行数据持久化。