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


    国际化介绍

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

    基本思路如下

    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. <script>
    2. export default {
    3. computed: {
    4. language() {
    5. return this.$store.getters.language // 获取当前应用的语言设置
    6. }
    7. },
    8. methods: {
    9. handleSetLanguage(lang) {
    10. this.$i18n.locale = lang // 切换应用的语言
    11. this.$store.dispatch('app/setLanguage', lang) // 通过 Vuex 存储更新应用的语言
    12. this.$message({
    13. message: '切换语言成功', // 显示语言切换成功的消息
    14. type: 'success'
    15. })
    16. }
    17. }
    18. }
    19. script>
    •  在页面中使用组件
    1. // 1. 引入LangSelect组件
    2. import LangSelect from '@/components/LangSelect'
    3. // 2. 注册组件
    4. export default {
    5. components: {
    6. LangSelect
    7. }
    8. }
    9. // 3. 使用

    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. 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>

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

    1. // 示例
    2. 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>
  • // 引入i18n.js 文件
  • import { generateTitle } from '@/utils/i18n'
  • // generateTitle 函数被添加到了 methods 中,这意味着你可以在组件的方法中调用它来生成页面的菜单。这种方式使你能够在组件中动态设置菜单的名称,根据不同的情况返回不同的菜单名称,或者在多语言应用中返回翻译后的菜单名称。
  • methods: {
  • generateTitle,
  • }
  • 5. el-table中使用

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

  • 相关阅读:
    说说原型(prototype)、原型链
    Swift中运算符相关内容
    fastadmin中引入 elementui
    Ansible的脚本——playbook 剧本
    Android开发的UI设计——Material Design
    专精特新企业数据集两份数据
    计算机毕业设计 基于SpringBoot的智能停车场计费系统的设计与实现 Java实战项目 附源码+文档+视频讲解
    需要知道的字符串函数
    解释一下前端框架中的虚拟DOM(virtual DOM)和实际DOM(real DOM)之间的关系。
    Redis主从结构数据同步分析
  • 原文地址:https://blog.csdn.net/weixin_47192158/article/details/132620145