Vue i18n

Vue I18n 是一个用于 Vue.js 应用的国际化插件,支持 Vue.js 3.0.0+。本文档涵盖了安装方法,包括直接下载、NPM 和 Yarn,以及如何进行全局和局部导入。详细介绍了基本使用,如在 main.js 和组件中设置,以及如何通过点击图片切换语言。此外,还讨论了利用 vuex 进行本地存储,确保刷新页面后仍能保持语言状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

💡Vue I18n 是 Vue.js 的国际化插件----兼容 Vue.js 3.0.0+

安装

直接下载

https://unpkg.com/vue-i18n@9

unpkg.com 提供了一个基于 npm 的 CDN 链接。 上面的链接将始终指向 npm 上的最新版本。

全局导入

<script src="https://unpkg.com/vue@3"></script>
<script src="https://unpkg.com/vue-i18n@9"></script>

ES模块导入

<script type="module" src="https://unpkg.com/vue@3/dist/vue.esm-browser.js">
<script type="module" src="https://unpkg.com/vue-i18n@9/dist/vue-i18n.esm-browser.js">

包管理器

NPM

npm install vue-i18n@9

Yarn

yarn add vue-i18n@9

开发版构建

如果你想使用最新的开发版构建,就得从 GitHub 上直接 clone,然后自己构建一个 vue-i18n

git clone git@github.com:intlify/vue-i18n-next.git node_modules/vue-i18n
cd node_modules/vue-i18n
npm install # or `yarn`
npm run build  # or `yarn run build`

基本使用

Base

main.js

import { createApp } from 'vue'
import { createI18n } from 'vue-i18n'
import App from './App.vue'

const app = createApp(App) //创建Vue根实例

const messages = { //设置本地化的语言环境信息
    zh: {
        section: {
            honor: '企业荣誉',
            partner: '主要客户'
        }
    },
    en: {
        section: {
            honor: 'honor',
            partner: 'partner'
        }
    }
}

// 创建 i18n 实例
const i18n = createI18n({
    locale: 'zh', //语言默认值
    fallbackLocale: 'en', //备选语言
    messages
})

app.use(i18n).mount('#app')

组件中

<template>
  <section>
    <h3>{{ $tc('section.honor') }}</h3>
  </section>
  <section>
    <h3>{{ $t("section.partner") }}</h3>
  </section>
</template>

通过更改locale的值即可实现不同语言切换

Case–点击图片切换语言

/src/lang/

1.创建所需的语言环境

zh.js

export default {
    // Vue i18n 支持复数  您需要定义具有管道的语言环境消息 |分隔符并在管道分隔符中定义复数
    // 可以通过预定义的命名参数在语言环境消息中访问该数字 {count}和/或 {n}. 如有必要,您可以覆盖那些预定义的命名参数。
    apple: '没有苹果 | 一个苹果 | {count} 苹果',
    header: {
        msg: '你好,世界!',
        open: '打开弹窗',
        close: '关闭弹窗'
    },
    section: {
        honor: '企业荣誉',
        partner: '主要客户',
        culture: '企业文化',
        person: {
            name: '貂蝉',
            job: {
                type: '前端',
                salary: '20k'
            }
        }
    },
}

en.js

export default {
    apple: 'no apple | one apple | {count} apple',
    header: {
        msg: '{Hi} World!',
        open: 'Open Modal',
        close: 'Clode Modal'
    },
    section: {
        honor: 'Corporate honor',
        partner: 'Major customers ',
        culture: 'Corporate culture',
        person: {
            name: 'Mine cicada',
            job: {
                type: 'Web',
                salary: '20K'
            }
        }
    },
}

de.js

export default {
    apple: 'Keine Äpfel | Ein Apfel | {count} Apfel',
    header: {
        msg: 'Hallo, Welt!',
        open: 'Popup-Fenster öffnen',
        close: 'Popup-Fenster schließen'
    },
    section: {
        honor: 'Ehre des Unternehmens',
        partner: 'Wichtige Kunden ',
        culture: 'Unternehmenskultur',
        person: {
            name: 'Ornamente für Armeeoffiziermützen',
            job: {
                type: 'Frontend',
                salary: '20k'
            }
        }
    },
}
2./src/lang/index.js
import { createI18n } from "vue-i18n";
import zh from './zh'
import en from './en'
import de from './de.js'

export default createI18n({
    locale: 'zh', // 默认语言
    fallbackLocale: 'en', // set fallback locale
    messages: { // set locale messages
        zh,
        en,
        de
    }
})
console.log(zh, en, createI18n.allowComposition);
3.main.js
import { createApp } from 'vue'
import App from './App.vue'

const app = createApp(App)

import i18n from './lang'

app.use(i18n).mount('#app')
4.组件中

html

<template>
  <div class="lang">
    <img :src="item.label" v-for="item in langData.lang" :key="item" alt="" @click="tollgeLang(item.value)" />
    <!-- 也可以省略方法,直接赋值 -->  <!-- @click='$i18n.locale = item.value' -->
  </div>
  <section>
    <h3>{{ $t('section.honor') }}</h3>
  </section>
  <section>
    <h3>{{ $t("section.partner") }}</h3>
  </section>
  <h4>
    {{ $t("section.person.name") }}--{{ $t("section.person.job.type") }}--{{ $t("section.person.job.salary") }}
  </h4>
  <section>
    <h3>{{ $t("section.culture") }}</h3>
  </section>
  <div class="apple">
    <!-- 第一个参数是语言环境消息键,第二个参数是数值或对象 -->
    <p>{{ $tc("apple", 0) }}</p>
    <p>{{ $t("apple", 1) }}</p>
    <p>{{ $tc("apple", 10, { count: "ten" }) }}</p>
  </div>
</template>

css

<style scoped>
.lang {
  display: flex;
  justify-content: space-between;
  margin-top: 20px;
  float: right;
  width: 146px;
}
.lang img {
  width: 46px;
  height: 30px;
}
</style>

JS

<script>
import { reactive } from "vue";
import { useI18n } from "vue-i18n";
export default ({
  name: "I18n",
  setup() {
    // 这里使用的是 Vue + Vite 构建的项目,故以此导入图片
    const chinese = new URL(`../assets/img/中国.jpeg`, import.meta.url).href;
    // 通过字符串模板支持动态 URL
    function getImageUrl(name) {
      return new URL(`../assets/img/${name}.jpg`, import.meta.url).href;
    }
    // ES导入
    /* lang: [
        {label: require('@/assets/images/index/中国.jpg'), value: 'zh-CN'},
        {label: require('@/assets/images/index/美国.jpg'), value: 'en-US'},
        {label: require('@/assets/images/index/德国.jpg'), value: 'de-DE'}
    ] */

    const langData = reactive({
      lang: [
        { label: chinese, value: "zh" },
        { label: getImageUrl("美国"), value: "en" },
        { label: getImageUrl("德国"), value: "de" },
      ],
    });

    const { locale } = useI18n({ useScope: "global" });
    console.log(useI18n(), locale, "=========", locale._value);

    const tollgeLang = (item) => {
        locale.value = item
    }

    return { langData, tollgeLang };
  },
});
</script>

本地存储

切换语言后,再次刷新页面,从 vuex 中获取语言信息,页面显示对应的语言

安装 vuex
src/store/index.js
import { createStore } from 'vuex'

export default createStore({
  state: {
    locale: ''
  },
  mutations: {
    setLanguage(state, payload) {
      state.locale = payload.value;
      window.localStorage.setItem('locale', payload.value);
    },
    changeLanguage(state, language) {
      state.locale = language
    }
  },
  actions: {
    getLanguage(context) {
      const language = window.localStorage.getItem('locale') || 'zh';
      context.commit('changeLanguage', language)
    }
  },
})
main.js
import { createApp } from 'vue'
const app = createApp(App)

import store from './store'

import I18n from './language'

app.use(I18n).use(store).mount('#app')
组件中调用

延续上文的case(切记保存在 vuex 的时候 tollgeLang 传递的是一个对象)

import { onMounted } from "vue";
import { useI18n} from 'vue-i18n'
import { useStore } from 'vuex'
setup() {
  const { locale } = useI18n()
  const store = useStore()
  const tollgeLang= (item) => {
    locale.value = item.value
    store.commit('setLanguage', locale)
  }

  onMounted(() => {
    store.dispatch('language')
    locale.value = store.state.isChangeLanguages
  })
  
  return { tollgeLang };
}
### Vue i18n 国际化配置方法 在 Vue 项目中实现国际化功能通常涉及以下几个方面:安装依赖库、创建语言包文件夹、初始化 `vue-i18n` 实例以及将其挂载到应用实例上。 #### 安装依赖 对于 Vue 3 的项目,推荐使用 `vue-i18n@next` 版本。可以通过以下命令完成安装: ```bash npm install vue-i18n@next ``` 或者使用 Yarn 进行安装[^3]: ```bash yarn add vue-i18n@next ``` --- #### 创建语言包 定义不同语言的翻译内容,可以将这些内容存放在单独的目录下(如 `src/lang`)。以下是英语和中文的语言包示例: **English (en.js):** ```javascript export default { message: { hello: 'Hello', welcome: 'Welcome to the application!' } }; ``` **Chinese (zh.js):** ```javascript export default { message: { hello: '你好', welcome: '欢迎来到应用程序!' } }; ``` --- #### 初始化 `vue-i18n` 实例 通过导入语言包来构建 `messages` 对象,并设置默认语言环境 (`locale`) 和其他选项。下面是一个完整的配置示例: ```javascript // src/i18n/index.js import { createI18n } from 'vue-i18n'; import selfEn from './lang/en'; // 导入英文语言包 import selfZh from './lang/zh'; // 导入中文语言包 const messages = { en: { ...selfEn }, // 合并英文语言包 zh: { ...selfZh } // 合并中文语言包 }; const locale = 'zh'; // 默认语言为中文 const i18n = createI18n({ locale, // 设置默认语言 messages, // 注册消息集合 legacy: false, // 使用 Composition API 模式 globalInjection: true // 全局注入 $t 方法 }); export default i18n; ``` 上述代码展示了如何基于组合式 API 构建国际化的基础结构[^2]。 --- #### 将 `i18n` 挂载至 Vue 应用 最后一步是在项目的入口文件中引入并注册该插件: ```javascript // main.js import { createApp } from 'vue'; import App from './App.vue'; import i18n from './i18n'; const app = createApp(App); app.use(i18n); // 挂载 i18n 插件 app.mount('#app'); ``` 这样就完成了整个国际化流程的搭建。 --- #### 动态切换语言 为了支持动态更改用户的语言偏好,可以在运行时更新 `locale` 属性。例如,在按钮点击事件中执行如下逻辑: ```javascript this.$i18n.locale = 'en'; // 切换到英文 ``` 也可以结合前端框架的功能获取设备系统的语言设置作为初始值[^4]: ```javascript let i18nConfig = { locale: uni.getLocale() || systemInfo.language || 'zh-Hant', // 获取系统语言或指定默认值 fallbackLocale: "zh-Hant", silentTranslationWarn: true, messages: langMessage() }; ``` --- ### 总结 以上过程涵盖了从依赖安装到实际使用的全部环节,能够帮助开发者快速集成 Vue i18n 并实现多语言支持。需要注意的是,具体实现可能因业务需求而有所调整,比如扩展更多语言资源或将翻译数据存储于远程服务器等场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值