当前位置:   article > 正文

vue项目 i18n 国际化完整教程_vuei18n

vuei18n

国际化介绍

国际化对于跨国项目至关重要,因为它可以让项目适应不同国家的语言和文化,为不同客户提供更好的使用体验。具体而言,国际化可以让项目根据不同国家的语言进行翻译,并支持多语言切换,让不同国家的客户都能够方便地使用项目。这不仅可以提升项目的用户满意度,还能够扩大项目的市场范围,提高项目的商业价值。

基本思路如下

1. 安装语言包

2. 定义语言包

3. 在vue实例挂载 vue-i18n类对象

下面具体讲解

使用

i18n是为了方便书写和记忆而产生的缩写。它是一个能够帮助Vue应用实现国际化功能的插件,可以快速地将一些本地化功能集成到Vue应用程序中,提高用户体验和跨语言适配性。

1. 安装插件 vue- i18n

这里建议安装 7.3.2 版本

npm install vue-i18n@7.3.2

在 main.js 中导入并使用

  1. 1. import i18n from './lang' // internationalization
  2. 2. Vue.use(VueI18n)
  3. 3. Vue.use(ElementUI, {
  4. i18n: (key, value) => i18n.t(key, value)
  5. })
  6. 4. new Vue({
  7. el: '#app',
  8. i18n,
  9. render: h => h(App)
  10. })

2. 创建语言包

在src目录下创建 lang 文件夹,里面包含 index.js、en.js、zh.js 等文件夹

  1. // 在 index.js 文件进行配置
  2. // 导入所需的库和资源: 代码中导入了 Vue.js 框架、Vue I18n 扩展以及各种语言版本的翻译资源,包括 Element UI 组件库的翻译。
  3. import Vue from 'vue'
  4. import VueI18n from 'vue-i18n'
  5. import Cookies from 'js-cookie'
  6. import elementEnLocale from 'element-ui/lib/locale/lang/en' // element-ui lang
  7. import elementZhLocale from 'element-ui/lib/locale/lang/zh-CN'// element-ui lang
  8. import elementEsLocale from 'element-ui/lib/locale/lang/es'// element-ui lang
  9. import elementJaLocale from 'element-ui/lib/locale/lang/ja'// element-ui lang
  10. import enLocale from './en'
  11. import zhLocale from './zh'
  12. import esLocale from './es'
  13. import jaLocale from './ja'
  14. // 启用 Vue I18n:使其可以在 Vue 应用中使用。
  15. Vue.use(VueI18n)
  16. // 定义翻译信息: 创建一个名为 messages 的对象,其中包含不同语言的翻译信息。每个语言都由一个键值对表示,包括自定义的应用文本翻译和 Element UI 组件库的翻译信息。
  17. const messages = {
  18. en: {
  19. ...enLocale,
  20. ...elementEnLocale
  21. },
  22. zh: {
  23. ...zhLocale,
  24. ...elementZhLocale
  25. }
  26. }
  27. // 确定用户语言偏好: 定义名为 getLanguage 的函数,根据用户选择的语言和浏览器语言设置来确定应该使用的语言。如果用户未选择语言或浏览器语言无匹配项,则默认使用英语。
  28. export function getLanguage() {
  29. const chooseLanguage = Cookies.get('language')
  30. if (chooseLanguage) return chooseLanguage
  31. // if has not choose language
  32. const language = (navigator.language || navigator.browserLanguage).toLowerCase()
  33. const locales = Object.keys(messages)
  34. for (const locale of locales) {
  35. if (language.indexOf(locale) > -1) {
  36. return locale
  37. }
  38. }
  39. return 'en'
  40. }
  41. // 创建 Vue I18n 实例: 使用 VueI18n 的构造函数创建一个名为 i18n 的实例。在构造函数中,通过传递当前语言代码和翻译信息来初始化实例。
  42. const i18n = new VueI18n({
  43. // set locale
  44. // options: en | zh | es
  45. locale: getLanguage(),
  46. // set locale messages
  47. messages
  48. })
  49. // 导出 I18n 实例
  50. export default i18n
  1. // zh.js
  2. export default {
  3. route: {
  4. dashboard: '首页',
  5. documentation: '文档',
  6. guide: '引导页'
  7. }
  8. }
  1. // en.js
  2. export default {
  3. route: {
  4. dashboard: 'Dashboard',
  5. documentation: 'Documentation',
  6. guide: 'Guide'
  7. }
  8. }

3. 在组件中使用

  •  定制切换语言组件。创建LangSelect文件夹
  1. <template>
  2. <el-dropdown trigger="click" class="international" @command="handleSetLanguage">
  3. <div>
  4. <!-- <svg-icon class-name="international-icon" icon-class="language" /> -->
  5. <p>切换语言</p> <!-- 在下拉菜单按钮上显示的文本,点击以切换语言 -->
  6. </div>
  7. <el-dropdown-menu slot="dropdown">
  8. <el-dropdown-item :disabled="language==='zh'" command="zh">
  9. 中文 <!-- 中文语言选项 -->
  10. </el-dropdown-item>
  11. <el-dropdown-item :disabled="language==='en'" command="en">
  12. English <!-- 英语语言选项 -->
  13. </el-dropdown-item>
  14. </el-dropdown-menu>
  15. </el-dropdown>
  16. </template>
  17. <script>
  18. export default {
  19. computed: {
  20. language() {
  21. return this.$store.getters.language // 获取当前应用的语言设置
  22. }
  23. },
  24. methods: {
  25. handleSetLanguage(lang) {
  26. this.$i18n.locale = lang // 切换应用的语言
  27. this.$store.dispatch('app/setLanguage', lang) // 通过 Vuex 存储更新应用的语言
  28. this.$message({
  29. message: '切换语言成功', // 显示语言切换成功的消息
  30. type: 'success'
  31. })
  32. }
  33. }
  34. }
  35. </script>
  •  在页面中使用组件
  1. // 1. 引入LangSelect组件
  2. import LangSelect from '@/components/LangSelect'
  3. // 2. 注册组件
  4. export default {
  5. components: {
  6. LangSelect
  7. }
  8. }
  9. // 3. 使用
  10. <template>
  11. <div>
  12. <p icon="organization">{{ $t('login.title') }}</p>
  13. </div>
  14. </template>

4. 页面标题国际化 & router中调用this.$t()会报错,无法使用

1. 在utils 文件夹下创建 i18n.js

当页面需要显示标题时,这个函数会根据传入的原始标题,尝试从翻译资源中获取对应的翻译文本。如果找到了与原始标题匹配的翻译键,函数将返回该翻译文本作为页面的标题;否则,它将保持原始标题不变。这个机制允许应用根据用户的语言偏好,动态地在不同语言版本之间切换页面标题,提供更好的用户体验。

  1. 定义generateTitle 函数
  2. export function generateTitle(title) {
  3. const hasKey = this.$te('route.' + title)
  4. if (hasKey) {
  5. // $t :this method from vue-i18n, inject in @/lang/index.js
  6. const translatedTitle = this.$t('route.' + title)
  7. return translatedTitle
  8. }
  9. return title
  10. }

2. 在router路由文件夹的js配置文件内,对应菜单的title位置写入国际化对应的key

  1. {
  2. path: '/',
  3. component: Layout,
  4. redirect: '/dashboard',
  5. only: 'im-dashboard',
  6. children: [{
  7. path: 'dashboard',
  8. name: 'Dashboard',
  9. component: () => import('@/views/dashboard/index'),
  10. meta: { title: 'dashboard', icon: 'dashboard' }
  11. }]
  12. },

3 . 在使用标题的title引入 i18n.js 文件,进行使用

  1. // 1. 引入 i18n.js
  2. import { generateTitle } from '@/utils/i18n'
  3. // 2. generateTitle 函数被添加到了 methods 中,这意味着你可以在组件的方法中调用它来生成页面的标题。这种方式使你能够在组件中动态设置页面的标题,根据不同的情况返回不同的标题文本,或者在多语言应用中返回翻译后的标题。
  4. methods: {
  5. generateTitle,
  6. }
  7. // 3. 在 template中进行使用
  8. <el-breadcrumb-item v-for="(item,index) in levelList" :key="item.path">
  9. <span v-if="item.redirect==='noRedirect'||index==levelList.length-1" class="no-redirect">{{ generateTitle(item.meta.title) }}</span>
  10. <a v-else @click.prevent="handleLink(item)">{{ generateTitle(item.meta.title) }}</a>
  11. </el-breadcrumb-item>

4. 在使用路由的组件,进行使用

  1. // 示例
  2. <div v-if="!item.hidden">
  3. <template v-if="hasOneShowingChild(item.children,item) && (!onlyOneChild.children||onlyOneChild.noShowingChildren)&&!item.alwaysShow">
  4. <app-link v-if="onlyOneChild.meta" :to="resolvePath(onlyOneChild.path)">
  5. <el-menu-item :index="resolvePath(onlyOneChild.path)" :class="{'submenu- title-noDropdown':!isNest}">
  6. <item :icon="onlyOneChild.meta.icon||(item.meta&&item.meta.icon)" :title="generateTitle(onlyOneChild.meta.title)" /> //在 :title使用generateTitle
  7. </el-menu-item>
  8. </app-link>
  9. </template>
  10. <el-submenu v-else ref="subMenu" :index="resolvePath(item.path)" popper-append-to-body>
  11. <template slot="title">
  12. <item v-if="item.meta" :icon="item.meta && item.meta.icon" :title="generateTitle(item.meta.title)" /> //在 :title使用generateTitle
  13. </template>
  14. <sidebar-item
  15. v-for="child in item.children"
  16. :key="child.path"
  17. :is-nest="true"
  18. :item="child"
  19. :base-path="resolvePath(child.path)"
  20. class="nest-menu"
  21. />
  22. </el-submenu>
  23. </div>
  24. // 引入i18n.js 文件
  25. import { generateTitle } from '@/utils/i18n'
  26. // generateTitle 函数被添加到了 methods 中,这意味着你可以在组件的方法中调用它来生成页面的菜单。这种方式使你能够在组件中动态设置菜单的名称,根据不同的情况返回不同的菜单名称,或者在多语言应用中返回翻译后的菜单名称。
  27. methods: {
  28. generateTitle,
  29. }

5. el-table中使用

  1. // 使用
  2. 1.
  3. <el-table-column
  4. prop="real_name"
  5. :label="$t('topic.topicContent')"
  6. width="80"
  7. />
  8. // 2.
  9. <el-table-column prop="topicContent" :label="table.topicContent" width="130" />
  10. // data中定义 table.topicContent
  11. data () {
  12. return {
  13. table: {
  14. topicContent: this.$t('topic.topicContent')
  15. },
  16. }
  17. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/418137
推荐阅读
  

闽ICP备14008679号