ruoyi-vue-pro 开发指南 ruoyi-vue-pro 开发指南
      视频教程
        微服务版 (opens new window)
        作者博客 (opens new window)
        GitHub (opens new window)
        • 萌新必读

          • 简介
          • 交流群
          • 视频教程
          • 功能列表
          • 快速启动(后端项目)
          • 快速启动(前端项目)
          • 接口文档
          • 技术选型
          • 项目结构
          • 代码热加载
          • 一键改包
          • 删除功能
          • 内网穿透
          • 达梦数据库专属
        • 后端手册

          • 新建模块
          • 代码生成【单表】(新增功能)
          • 代码生成【主子表】
          • 代码生成(树表)
          • 功能权限
          • 数据权限
          • 用户体系
          • 三方登录
          • OAuth 2.0(SSO 单点登录)
          • SaaS 多租户【字段隔离】
          • SaaS 多租户【数据库隔离】
          • WebSocket 实时通信
          • 异常处理(错误码)
          • 参数校验、时间传参
          • 分页实现
          • VO 对象转换、数据翻译
          • 文件存储(上传下载)
          • Excel 导入导出
          • 操作日志、访问日志、异常日志
          • MyBatis 数据库
          • MyBatis 联表&分页查询
          • 多数据源(读写分离)、事务
          • Redis 缓存
          • 本地缓存
          • 异步任务
          • 分布式锁
          • 幂等性(防重复提交)
          • 请求限流(RateLimiter)
          • 单元测试
          • 验证码
          • 工具类 Util
          • 配置管理
          • 数据库文档
        • 中间件手册

          • 定时任务
          • 消息队列(内存)
          • 消息队列(Redis)
          • 消息队列(RocketMQ)
          • 消息队列(RabbitMQ)
          • 消息队列(Kafka)
          • 限流熔断
        • 工作流手册

          • 工作流演示
          • 功能开启
          • 工作流(达梦适配)
          • 审批接入(流程表单)
          • 审批接入(业务表单)
          • 流程设计器(BPMN)
          • 流程设计器(钉钉、飞书)
          • 选择审批人、发起人自选
          • 会签、或签、依次审批
          • 流程发起、取消、重新发起
          • 审批通过、不通过、驳回
          • 审批加签、减签
          • 审批转办、委派、抄送
          • 执行监听器、任务监听器
          • 流程表达式
          • 流程审批通知
        • 大屏手册

          • 报表设计器
          • 大屏设计器
        • 支付手册

          • 功能开启
          • 支付宝支付接入
          • 微信公众号支付接入
          • 微信小程序支付接入
          • 支付宝、微信退款接入
        • 会员手册

          • 功能开启
          • 微信公众号登录
          • 微信小程序登录
          • 会员用户、标签、分组
          • 会员等级、积分、签到
        • 商城手册

          • 商城演示
          • 功能开启
          • 商城装修
          • 【商品】商品分类
          • 【商品】商品属性
          • 【商品】商品 SPU 与 SKU
          • 【商品】商品评价
          • 【交易】购物车
          • 【交易】交易订单
          • 【交易】售后退款
          • 【交易】快递发货
          • 【交易】门店自提
          • 【交易】分销返佣
          • 【营销】优惠劵
          • 【营销】拼团活动
          • 【营销】秒杀活动
          • 【营销】砍价活动
          • 【营销】满减送
          • 【营销】限时折扣
          • 【营销】内容管理
          • 【统计】会员、商品、交易统计
        • ERP手册

          • ERP 演示
          • 功能开启
          • 【产品】产品信息、分类、单位
          • 【库存】产品库存、库存明细
          • 【库存】其它入库、其它出库
          • 【库存】库存调拨、库存盘点
          • 【采购】采购订单、入库、退货
          • 【销售】销售订单、出库、退货
          • 【财务】采购付款、销售收款
        • CRM手册

          • CRM 演示
          • 功能开启
          • 【线索】线索管理
          • 【客户】客户管理、公海客户
          • 【商机】商机管理、商机状态
          • 【合同】合同管理、合同提醒
          • 【回款】回款管理、回款计划
          • 【产品】产品管理、产品分类
          • 【通用】数据权限
          • 【通用】跟进记录、待办事项
        • 公众号手册

          • 功能开启
          • 公众号接入
          • 公众号粉丝
          • 公众号标签
          • 公众号消息
          • 自动回复
          • 公众号菜单
          • 公众号素材
          • 公众号图文
          • 公众号统计
        • 系统手册

          • 短信配置
          • 邮件配置
          • 站内信配置
          • 数据脱敏
          • 敏感词
          • 地区 & IP 库
        • 运维手册

          • 开发环境
          • Linux 部署
          • Docker 部署
          • Jenkins 部署
          • HTTPS 证书
          • 服务监控
        • 前端手册 Vue 3.x

          • 开发规范
          • 菜单路由
          • Icon 图标
          • 字典数据
          • 系统组件
          • 通用方法
          • 配置读取
          • CRUD 组件
          • 国际化
            • IDE 调试
            • 代码格式化
          • 前端手册 Vue 2.x

            • 开发规范
            • 菜单路由
            • Icon 图标
            • 字典数据
            • 系统组件
            • 通用方法
            • 配置读取
          • 更新日志

            • 【v2.1.0】开发中
            • 【v2.0.1】2024-03-01
            • 【v2.0.0】2024-01-26
            • 【v1.9.0】2023-12-01
            • 【v1.8.3】2023-10-24
          • 开发指南
          • 前端手册 Vue 3.x
          芋道源码
          2023-01-01
          目录
          1. I18n-ally 插件
          2. 配置默认语言
          3. 语言文件
          4. 语言导入逻辑说明
          5. 使用
          6. 切换语言
          7. 新增新语言
          7.1 语言文件
          7.2 新增语言
          8. 远程读取语言数据
          8.1 useLocale

          国际化

          友情提示:

          该章节,基于 《vue element plus admin —— 国际化》 (opens new window) 的内容修改。

          如果你使用的 vscode 开发工具,则推荐安装 I18n-ally (opens new window) 这个插件

          # 1. I18n-ally 插件

          安装了该插件后,你的代码内可以实时看到对应的语言内容

          # 2. 配置默认语言

          在 src/store/modules/locale.ts (opens new window) 内配置 currentLocale 为其他语言。

          查看代码
          import { defineStore } from 'pinia'
          import { store } from '../index'
          import zhCn from 'element-plus/es/locale/lang/zh-cn'
          import en from 'element-plus/es/locale/lang/en'
          import { CACHE_KEY, useCache } from '@/hooks/web/useCache'
          import { LocaleDropdownType } from '@/types/localeDropdown'
          
          const { wsCache } = useCache()
          
          const elLocaleMap = {
            'zh-CN': zhCn,
            en: en
          }
          interface LocaleState {
            currentLocale: LocaleDropdownType
            localeMap: LocaleDropdownType[]
          }
          
          export const useLocaleStore = defineStore('locales', {
            state: (): LocaleState => {
              return {
                currentLocale: {
                  lang: wsCache.get(CACHE_KEY.LANG) || 'zh-CN',
                  elLocale: elLocaleMap[wsCache.get(CACHE_KEY.LANG) || 'zh-CN']
                },
                // 多语言
                localeMap: [
                  {
                    lang: 'zh-CN',
                    name: '简体中文'
                  },
                  {
                    lang: 'en',
                    name: 'English'
                  }
                ]
              }
            },
            getters: {
              getCurrentLocale(): LocaleDropdownType {
                return this.currentLocale
              },
              getLocaleMap(): LocaleDropdownType[] {
                return this.localeMap
              }
            },
            actions: {
              setCurrentLocale(localeMap: LocaleDropdownType) {
                // this.locale = Object.assign(this.locale, localeMap)
                this.currentLocale.lang = localeMap?.lang
                this.currentLocale.elLocale = elLocaleMap[localeMap?.lang]
                wsCache.set(CACHE_KEY.LANG, localeMap?.lang)
              }
            }
          })
          
          export const useLocaleStoreWithOut = () => {
            return useLocaleStore(store)
          }
          

          # 3. 语言文件

          在 src/locales (opens new window) 可以配置具体的语言。

          目前项目中的语言都是没有拆分的,全部放一起,后续会考虑拆分出来,比较好维护。

          # 4. 语言导入逻辑说明

          在 src/plugins/vueI18n/index.ts (opens new window) 内可以看到

          const defaultLocal = await import(`../../locales/${locale.lang}.ts`)
          

          这会导入 src/locales 文件语言包。

          # 5. 使用

          引入项目自带的 useI18n

          注意不要引入 vue-i18n 的 useI18n

          import { useI18n } from '/@/hooks/web/useI18n'
          
          const { t } = useI18n()
          
          const title = t('common.menu')
          

          # 6. 切换语言

          切换语言需要使用 src/hooks/web/useLocale.ts (opens new window)

          import { useLocale } from '@/hooks/web/useLocale'
          const { changeLocale } = useLocale()
          
          changeLocale('en')
          

          # 7. 新增新语言

          # 7.1 语言文件

          在 src/locales (opens new window) 增加对应语言的文件即可

          # 7.2 新增语言

          目前项目自带的语言只有 zh_CN 和 en 两种

          如果需要新增,按以下操作即可

          1. 在 src/locales (opens new window) 下语言文件
          2. 在 types/global.d.ts (opens new window) 给 LocaleType 添加对应的类型
          3. 在 src/store/modules/locale.ts localeMap 中添加对应语言

          # 8. 远程读取语言数据

          目前项目会在 src/main.ts 内等待 setupI18n 这个函数执行完之后才会渲染界面,所以只需在 setupI18n 内的 createI18nOptions 发送 ajax 请求,将对应的数据设置到 i18n 实例上即可。

          const createI18nOptions = async (): Promise<I18nOptions> => {
            const localeStore = useLocaleStoreWithOut()
            const locale = localeStore.getCurrentLocale
            const localeMap = localeStore.getLocaleMap
            // 这里改为远程请求即可。
            const defaultLocal = await import(`../../locales/${locale.lang}.ts`)
            const message = defaultLocal.default ?? {}
          
            setHtmlPageLang(locale.lang)
          
            localeStore.setCurrentLocale({
              lang: locale.lang
              // elLocale: elLocal
            })
          
            return {
              legacy: false,
              locale: locale.lang,
              fallbackLocale: locale.lang,
              messages: {
                [locale.lang]: message
              },
              availableLocales: localeMap.map((v) => v.lang),
              sync: true,
              silentTranslationWarn: true,
              missingWarn: false,
              silentFallbackWarn: true
            }
          }
          

          # 8.1 useLocale

          代码: src/hooks/web/useLocale.ts (opens new window)

          当手动切换语言的时候会触发 useLocale 函数,useLocale 也是异步函数,只需等待接口返回响应的数据后,再进行设置即可

          export const useLocale = () => {
            // Switching the language will change the locale of useI18n
            // And submit to configuration modification
            const changeLocale = async (locale: LocaleType) => {
              const globalI18n = i18n.global
              
              // 改为远程获取
              const langModule = await import(`../../locales/${locale}.ts`)
          
              globalI18n.setLocaleMessage(locale, langModule.default)
          
              setI18nLanguage(locale)
            }
          
            return {
              changeLocale
            }
          }
          
          CRUD 组件
          IDE 调试

          ← CRUD 组件 IDE 调试→

          Theme by Vdoing | Copyright © 2019-2024 芋道源码 | MIT License
            ×