Переглянути джерело

refactor: i18n

* refactor: i18n
啝裳 3 роки тому
батько
коміт
494ce8f41b

+ 0 - 1
.vscode/extensions.json

@@ -1,6 +1,5 @@
 {
   "recommendations": [
-    "johnsoncodehk.vscode-typescript-vue-plugin",
     "voorjaar.windicss-intellisense",
     "vscode-icons-team.vscode-icons",
     "davidanson.vscode-markdownlint",

+ 3 - 9
.vscode/settings.json

@@ -1,13 +1,9 @@
 {
   "editor.formatOnType": true,
   "editor.formatOnSave": true,
-  "javascript.updateImportsOnFileMove.enabled": "always",
   "[vue]": {
     "editor.defaultFormatter": "esbenp.prettier-vscode"
   },
-  "[javascript]": {
-    "editor.defaultFormatter": "vscode.typescript-language-features"
-  },
   "editor.tabSize": 2,
   "editor.formatOnPaste": true,
   "files.autoSave": "afterDelay",
@@ -30,14 +26,12 @@
   "editor.codeActionsOnSave": {
     "source.fixAll.eslint": true
   },
-  "typescript.tsdk": "node_modules/typescript/lib",
-  "i18n-ally.localesPaths": ["src/plugins/i18n"],
+  "i18n-ally.localesPaths": "locales",
   "i18n-ally.keystyle": "nested",
   "i18n-ally.sortKeys": true,
   "i18n-ally.namespace": true,
-  "i18n-ally.pathMatcher": "{locale}/{namespaces}.{ext}",
-  "i18n-ally.enabledParsers": ["ts"],
+  "i18n-ally.enabledParsers": ["yaml", "js"],
   "i18n-ally.sourceLanguage": "en",
   "i18n-ally.displayLanguage": "zh-CN",
-  "i18n-ally.enabledFrameworks": ["vue", "react"]
+  "i18n-ally.enabledFrameworks": ["vue"]
 }

+ 8 - 0
build/plugins.ts

@@ -1,3 +1,4 @@
+import { resolve } from "path";
 import vue from "@vitejs/plugin-vue";
 import { viteBuildInfo } from "./info";
 import svgLoader from "vite-svg-loader";
@@ -7,6 +8,7 @@ import WindiCSS from "vite-plugin-windicss";
 import { viteMockServe } from "vite-plugin-mock";
 import liveReload from "vite-plugin-live-reload";
 import styleImport from "vite-plugin-style-import";
+import VueI18n from "@intlify/vite-plugin-vue-i18n";
 import ElementPlus from "unplugin-element-plus/vite";
 import { visualizer } from "rollup-plugin-visualizer";
 import removeConsole from "vite-plugin-remove-console";
@@ -17,6 +19,12 @@ export function getPluginsList(command, VITE_LEGACY) {
   const lifecycle = process.env.npm_lifecycle_event;
   return [
     vue(),
+    // https://github.com/intlify/bundle-tools/tree/main/packages/vite-plugin-vue-i18n
+    VueI18n({
+      runtimeOnly: true,
+      compositionOnly: true,
+      include: [resolve("locales/**")]
+    }),
     // jsx、tsx语法支持
     vueJsx(),
     WindiCSS(),

+ 74 - 0
locales/en.yaml

@@ -0,0 +1,74 @@
+buttons:
+  hsLoginOut: LoginOut
+  hsfullscreen: FullScreen
+  hsexitfullscreen: ExitFullscreen
+  hsrefreshRoute: RefreshRoute
+  hslogin: Login
+  hsadd: Add
+  hsmark: Mark/Cancel
+  hssave: Save
+  hssearch: Search
+  hsexpendAll: Expand All
+  hscollapseAll: Collapse All
+  hssystemSet: Open ProjectConfig
+  hsdelete: Delete
+  hsreload: Reload
+  hscloseCurrentTab: Close CurrentTab
+  hscloseLeftTabs: Close LeftTabs
+  hscloseRightTabs: Close RightTabs
+  hscloseOtherTabs: Close OtherTabs
+  hscloseAllTabs: Close AllTabs
+menus:
+  hshome: Home
+  hslogin: Login
+  hssysManagement: System Manage
+  hsBaseinfo: Base Info
+  hsDict: Dict Manage
+  hseditor: Editor
+  hserror: Error Page
+  hsfourZeroFour: "404"
+  hsfourZeroOne: "403"
+  hsFive: "500"
+  hscomponents: Components
+  hsvideo: Video Components
+  hsmap: Map Components
+  hsdraggable: Draggable Components
+  hssplitPane: Split Pane
+  hsbutton: Button Components
+  hscropping: Picture Cropping
+  hscountTo: Digital Animation
+  hsselector: Selector Components
+  hsflowChart: Flow Chart
+  hsseamless: Seamless Scroll
+  hscontextmenu: Context Menu
+  hsmenus: MultiLevel Menu
+  hsmenu1: Menu1
+  hsmenu1-1: Menu1-1
+  hsmenu1-2: Menu1-2
+  hsmenu1-2-1: Menu1-2-1
+  hsmenu1-2-2: Menu1-2-2
+  hsmenu1-3: Menu1-3
+  hsmenu2: Menu2
+  permission: Permission Manage
+  permissionPage: Page Permission
+  permissionButton: Button Permission
+  hstabs: Tabs Operate
+  hsguide: Guide
+  hsAble: Able
+  hsMenuTree: Menu Tree
+  hsWatermark: Water Mark
+  hsPrint: Print
+  hsExternalPage: External Page
+  hsPureDocument: Pure Doc(Embedded)
+  externalLink: Pure Doc(External)
+  hsEpDocument: Element Plus Doc(Embedded)
+  hsAbout: About
+  hsResult: Result Page
+  hsSuccess: Success Page
+  hsFail: Fail Page
+  hsIconSelect: Icon Select
+  hsTimeline: Time Line
+  hsLineTree: LineTree
+  hsAntTabs: Imitate Antdv Tabs
+  hsAntAnchor: Imitate Antdv Anchor
+  hsAntTreeSelect: Imitate Antdv TreeSelector

+ 74 - 0
locales/zh-CN.yaml

@@ -0,0 +1,74 @@
+buttons:
+  hsLoginOut: 退出系统
+  hsfullscreen: 全屏
+  hsexitfullscreen: 退出全屏
+  hsrefreshRoute: 刷新路由
+  hslogin: 登陆
+  hsadd: 新增
+  hsmark: 标记/取消
+  hssave: 保存
+  hssearch: 搜索
+  hsexpendAll: 全部展开
+  hscollapseAll: 全部折叠
+  hssystemSet: 打开项目配置
+  hsdelete: 删除
+  hsreload: 重新加载
+  hscloseCurrentTab: 关闭当前标签页
+  hscloseLeftTabs: 关闭左侧标签页
+  hscloseRightTabs: 关闭右侧标签页
+  hscloseOtherTabs: 关闭其他标签页
+  hscloseAllTabs: 关闭全部标签页
+menus:
+  hshome: 首页
+  hslogin: 登陆
+  hssysManagement: 系统管理
+  hsBaseinfo: 基础信息
+  hsDict: 字典管理
+  hseditor: 编辑器
+  hserror: 错误页面
+  hsfourZeroFour: "404"
+  hsfourZeroOne: "403"
+  hsFive: "500"
+  hscomponents: 组件
+  hsvideo: 视频组件
+  hsmap: 地图组件
+  hsdraggable: 拖拽组件
+  hssplitPane: 切割面板
+  hsbutton: 按钮组件
+  hscropping: 图片裁剪
+  hscountTo: 数字动画
+  hsselector: 选择器组件
+  hsflowChart: 流程图
+  hsseamless: 无缝滚动
+  hscontextmenu: 右键菜单
+  hsmenus: 多级菜单
+  hsmenu1: 菜单1
+  hsmenu1-1: 菜单1-1
+  hsmenu1-2: 菜单1-2
+  hsmenu1-2-1: 菜单1-2-1
+  hsmenu1-2-2: 菜单1-2-2
+  hsmenu1-3: 菜单1-3
+  hsmenu2: 菜单2
+  permission: 权限管理
+  permissionPage: 页面权限
+  permissionButton: 按钮权限
+  hstabs: 标签页操作
+  hsguide: 引导页
+  hsAble: 功能
+  hsMenuTree: 菜单树结构
+  hsWatermark: 水印
+  hsPrint: 打印
+  hsExternalPage: 外部页面
+  hsPureDocument: 平台文档(内嵌)
+  externalLink: 平台文档(外链)
+  hsEpDocument: Element Plus文档(内嵌)
+  hsAbout: 关于
+  hsResult: 结果页面
+  hsSuccess: 成功页面
+  hsFail: 失败页面
+  hsIconSelect: 图标选择器
+  hsTimeline: 时间线
+  hsLineTree: 树形连接线
+  hsAntTabs: 仿antdv标签页
+  hsAntAnchor: 仿antdv锚点
+  hsAntTreeSelect: 仿antdv树型选择器

+ 9 - 8
package.json

@@ -31,11 +31,11 @@
     "@logicflow/core": "0.7.1",
     "@logicflow/extension": "0.7.1",
     "@pureadmin/components": "^1.0.0",
-    "@vueuse/core": "^7.7.0",
+    "@vueuse/core": "^8.0.0",
     "@vueuse/motion": "^2.0.0-beta.9",
-    "@vueuse/shared": "^7.7.0",
+    "@vueuse/shared": "^8.0.0",
     "animate.css": "^4.1.1",
-    "axios": "^0.26.0",
+    "axios": "^0.26.1",
     "cropperjs": "^1.5.12",
     "css-color-function": "^1.3.3",
     "dayjs": "^1.10.7",
@@ -57,9 +57,9 @@
     "rgb-hex": "^4.0.0",
     "v-contextmenu": "3.0.0",
     "vue": "^3.2.31",
-    "vue-i18n": "^9.2.0-beta.30",
+    "vue-i18n": "^9.2.0-beta.32",
     "vue-json-pretty": "^2.0.2",
-    "vue-router": "^4.0.13",
+    "vue-router": "^4.0.14",
     "vue-types": "^4.1.1",
     "vuedraggable": "4.1.0",
     "vxe-table": "^4.2.0",
@@ -74,7 +74,8 @@
     "@iconify-icons/fa": "^1.1.1",
     "@iconify-icons/fa-solid": "^1.1.2",
     "@iconify-icons/ri": "^1.1.1",
-    "@iconify/vue": "^3.1.3",
+    "@iconify/vue": "^3.1.4",
+    "@intlify/vite-plugin-vue-i18n": "^3.3.1",
     "@types/element-resize-detector": "1.1.3",
     "@types/js-cookie": "^3.0.1",
     "@types/lodash-es": "^4.17.6",
@@ -115,14 +116,14 @@
     "stylelint-config-recommended": "^6.0.0",
     "stylelint-config-standard": "^24.0.0",
     "stylelint-order": "^5.0.0",
-    "typescript": "^4.5.5",
+    "typescript": "^4.6.2",
     "unplugin-element-plus": "^0.3.1",
     "vite": "2.7.13",
     "vite-plugin-live-reload": "^2.1.0",
     "vite-plugin-mock": "^2.9.6",
     "vite-plugin-remove-console": "^0.0.6",
     "vite-plugin-style-import": "1.4.1",
-    "vite-plugin-windicss": "^1.8.2",
+    "vite-plugin-windicss": "^1.8.3",
     "vite-svg-loader": "2.2.0",
     "vue-eslint-parser": "^8.2.0",
     "windicss": "^3.5.1"

+ 263 - 136
pnpm-lock.yaml

@@ -9,7 +9,8 @@ specifiers:
   "@iconify-icons/fa": ^1.1.1
   "@iconify-icons/fa-solid": ^1.1.2
   "@iconify-icons/ri": ^1.1.1
-  "@iconify/vue": ^3.1.3
+  "@iconify/vue": ^3.1.4
+  "@intlify/vite-plugin-vue-i18n": ^3.3.1
   "@logicflow/core": 0.7.1
   "@logicflow/extension": 0.7.1
   "@pureadmin/components": ^1.0.0
@@ -27,13 +28,13 @@ specifiers:
   "@vitejs/plugin-vue-jsx": ^1.3.8
   "@vue/eslint-config-prettier": ^7.0.0
   "@vue/eslint-config-typescript": ^10.0.0
-  "@vueuse/core": ^7.7.0
+  "@vueuse/core": ^8.0.0
   "@vueuse/motion": ^2.0.0-beta.9
-  "@vueuse/shared": ^7.7.0
+  "@vueuse/shared": ^8.0.0
   "@zougt/vite-plugin-theme-preprocessor": ^1.4.4
   animate.css: ^4.1.1
   autoprefixer: ^10.4.2
-  axios: ^0.26.0
+  axios: ^0.26.1
   cropperjs: ^1.5.12
   cross-env: 7.0.3
   css-color-function: ^1.3.3
@@ -77,7 +78,7 @@ specifiers:
   stylelint-config-recommended: ^6.0.0
   stylelint-config-standard: ^24.0.0
   stylelint-order: ^5.0.0
-  typescript: ^4.5.5
+  typescript: ^4.6.2
   unplugin-element-plus: ^0.3.1
   v-contextmenu: 3.0.0
   vite: 2.7.13
@@ -85,13 +86,13 @@ specifiers:
   vite-plugin-mock: ^2.9.6
   vite-plugin-remove-console: ^0.0.6
   vite-plugin-style-import: 1.4.1
-  vite-plugin-windicss: ^1.8.2
+  vite-plugin-windicss: ^1.8.3
   vite-svg-loader: 2.2.0
   vue: ^3.2.31
   vue-eslint-parser: ^8.2.0
-  vue-i18n: ^9.2.0-beta.30
+  vue-i18n: ^9.2.0-beta.32
   vue-json-pretty: ^2.0.2
-  vue-router: ^4.0.13
+  vue-router: ^4.0.14
   vue-types: ^4.1.1
   vuedraggable: 4.1.0
   vxe-table: ^4.2.0
@@ -106,11 +107,11 @@ dependencies:
   "@logicflow/core": 0.7.1
   "@logicflow/extension": 0.7.1
   "@pureadmin/components": 1.0.0_vue@3.2.31
-  "@vueuse/core": 7.7.0_vue@3.2.31
+  "@vueuse/core": 8.0.0_vue@3.2.31
   "@vueuse/motion": 2.0.0-beta.9_vue@3.2.31
-  "@vueuse/shared": 7.7.0_vue@3.2.31
+  "@vueuse/shared": 8.0.0_vue@3.2.31
   animate.css: 4.1.1
-  axios: 0.26.0
+  axios: 0.26.1
   cropperjs: 1.5.12
   css-color-function: 1.3.3
   dayjs: 1.10.7
@@ -125,16 +126,16 @@ dependencies:
   mockjs: 1.1.0
   nprogress: 0.2.0
   path: 0.12.7
-  pinia: 2.0.11_typescript@4.5.5+vue@3.2.31
+  pinia: 2.0.11_typescript@4.6.2+vue@3.2.31
   qs: 6.10.3
   resize-observer-polyfill: 1.5.1
   responsive-storage: 1.0.11_vue@3.2.31
   rgb-hex: 4.0.0
   v-contextmenu: 3.0.0_vue@3.2.31
   vue: 3.2.31
-  vue-i18n: 9.2.0-beta.30_vue@3.2.31
+  vue-i18n: 9.2.0-beta.32_vue@3.2.31
   vue-json-pretty: 2.0.6_vue@3.2.31
-  vue-router: 4.0.13_vue@3.2.31
+  vue-router: 4.0.14_vue@3.2.31
   vue-types: 4.1.1_vue@3.2.31
   vuedraggable: 4.1.0_vue@3.2.31
   vxe-table: 4.2.0_vue@3.2.31+xe-utils@3.5.4
@@ -149,7 +150,8 @@ devDependencies:
   "@iconify-icons/fa": 1.2.0
   "@iconify-icons/fa-solid": 1.2.0
   "@iconify-icons/ri": 1.2.0
-  "@iconify/vue": 3.1.3_vue@3.2.31
+  "@iconify/vue": 3.1.4_vue@3.2.31
+  "@intlify/vite-plugin-vue-i18n": 3.3.1_927a0a946d0d434f1ee9f376a300ea94
   "@types/element-resize-detector": 1.1.3
   "@types/js-cookie": 3.0.1
   "@types/lodash-es": 4.17.6
@@ -157,13 +159,13 @@ devDependencies:
   "@types/node": 14.14.14
   "@types/nprogress": 0.2.0
   "@types/qs": 6.9.7
-  "@typescript-eslint/eslint-plugin": 5.11.0_15a231715447500ed5c06da64c8aef1c
-  "@typescript-eslint/parser": 5.11.0_eslint@8.9.0+typescript@4.5.5
+  "@typescript-eslint/eslint-plugin": 5.11.0_e5aa81e2725d014cc10493a9f0356cdc
+  "@typescript-eslint/parser": 5.11.0_eslint@8.9.0+typescript@4.6.2
   "@vitejs/plugin-legacy": 1.7.1_vite@2.7.13
   "@vitejs/plugin-vue": 2.2.4_vite@2.7.13+vue@3.2.31
   "@vitejs/plugin-vue-jsx": 1.3.8
   "@vue/eslint-config-prettier": 7.0.0_eslint@8.9.0+prettier@2.5.1
-  "@vue/eslint-config-typescript": 10.0.0_cd100ca74b8c3cfb64acbb3ff997764b
+  "@vue/eslint-config-typescript": 10.0.0_e9ae806e724e1e93b0f13f024669b2db
   "@zougt/vite-plugin-theme-preprocessor": 1.4.4_sass@1.49.9
   autoprefixer: 10.4.2_postcss@8.4.6
   cross-env: 7.0.3
@@ -190,14 +192,14 @@ devDependencies:
   stylelint-config-recommended: 6.0.0_stylelint@14.5.0
   stylelint-config-standard: 24.0.0_stylelint@14.5.0
   stylelint-order: 5.0.0_stylelint@14.5.0
-  typescript: 4.5.5
+  typescript: 4.6.2
   unplugin-element-plus: 0.3.1_vite@2.7.13+vue@3.2.31
   vite: 2.7.13_sass@1.49.9
   vite-plugin-live-reload: 2.1.0
   vite-plugin-mock: 2.9.6_mockjs@1.1.0+vite@2.7.13
   vite-plugin-remove-console: 0.0.6
   vite-plugin-style-import: 1.4.1_vite@2.7.13
-  vite-plugin-windicss: 1.8.2_vite@2.7.13
+  vite-plugin-windicss: 1.8.3_vite@2.7.13
   vite-svg-loader: 2.2.0
   vue-eslint-parser: 8.2.0_eslint@8.9.0
   windicss: 3.5.1
@@ -776,12 +778,12 @@ packages:
       "@commitlint/execute-rule": 13.2.0
       "@commitlint/resolve-extends": 13.2.0
       "@commitlint/types": 13.2.0
-      "@endemolshinegroup/cosmiconfig-typescript-loader": 3.0.2_e1c3b685f8b7686dcc885a02fd14c5f0
+      "@endemolshinegroup/cosmiconfig-typescript-loader": 3.0.2_c84a270c92bf6e8d30a9786dab5936e4
       chalk: 4.1.2
       cosmiconfig: 7.0.1
       lodash: 4.17.21
       resolve-from: 5.0.0
-      typescript: 4.5.5
+      typescript: 4.6.2
     dev: true
 
   /@commitlint/message/13.2.0:
@@ -891,7 +893,7 @@ packages:
       vue: 3.2.31
     dev: false
 
-  /@endemolshinegroup/cosmiconfig-typescript-loader/3.0.2_e1c3b685f8b7686dcc885a02fd14c5f0:
+  /@endemolshinegroup/cosmiconfig-typescript-loader/3.0.2_c84a270c92bf6e8d30a9786dab5936e4:
     resolution:
       {
         integrity: sha512-QRVtqJuS1mcT56oHpVegkKBlgtWjXw/gHNWO3eL9oyB5Sc7HBoc2OLG/nYpVfT/Jejvo3NUrD0Udk7XgoyDKkA==
@@ -903,7 +905,7 @@ packages:
       cosmiconfig: 7.0.1
       lodash.get: 4.4.2
       make-error: 1.3.6
-      ts-node: 9.1.1_typescript@4.5.5
+      ts-node: 9.1.1_typescript@4.6.2
       tslib: 2.3.1
     transitivePeerDependencies:
       - typescript
@@ -993,71 +995,117 @@ packages:
       }
     dev: true
 
-  /@iconify/vue/3.1.3_vue@3.2.31:
+  /@iconify/vue/3.1.4_vue@3.2.31:
     resolution:
       {
-        integrity: sha512-tZ7+mh2HDy8pj7dajByn4bE72XIZM3l+F490VIAAYifwpqGnjqv9O60n1MPsV5dM7Q+FN6yVXZMdXT68l//WTw==
+        integrity: sha512-oJm0VPl1fhlsbBX9tBeAbtmZ5iHCxCkVQdCi81lxdA3cqc9yqBlCloqObX93/YWNM5N8j/j0Efk6iSwsihOoNA==
       }
     peerDependencies:
       vue: 3.x
     dependencies:
-      cross-fetch: 3.1.5
       vue: 3.2.31
-    transitivePeerDependencies:
-      - encoding
     dev: true
 
-  /@intlify/core-base/9.2.0-beta.30:
+  /@intlify/bundle-utils/2.2.0_vue-i18n@9.2.0-beta.32:
     resolution:
       {
-        integrity: sha512-tnOuI8gs4S7vv4WjG8oFL7vbZ4PM7Is/Ld3lRHQlBO7UjpnCVcQ94AgP/4F0cUPFn9JSPMQRN0aOOahW1BXvSA==
+        integrity: sha512-qVuN7+c84UB6rlLHSued2J9R86LG1rHg6ZibCghGMyPXnW0nOuIfkUFf1F7tXIqfMXjIPeJzlbpmzjWTI2z9Kw==
       }
     engines: { node: ">= 12" }
+    peerDependencies:
+      petite-vue-i18n: "*"
+      vue-i18n: "*"
+    peerDependenciesMeta:
+      petite-vue-i18n:
+        optional: true
+      vue-i18n:
+        optional: true
     dependencies:
-      "@intlify/devtools-if": 9.2.0-beta.30
-      "@intlify/message-compiler": 9.2.0-beta.30
-      "@intlify/shared": 9.2.0-beta.30
-      "@intlify/vue-devtools": 9.2.0-beta.30
+      "@intlify/message-compiler": 9.2.0-beta.32
+      "@intlify/shared": 9.2.0-beta.32
+      jsonc-eslint-parser: 1.4.1
+      source-map: 0.6.1
+      vue-i18n: 9.2.0-beta.32_vue@3.2.31
+      yaml-eslint-parser: 0.3.2
+    dev: true
+
+  /@intlify/core-base/9.2.0-beta.32:
+    resolution:
+      {
+        integrity: sha512-t9IB9Z65cx0fcpd9/oD8MrsMvGy1FOColOe5oodjo9E//Qm7P8kvSHnKymWjsAcJs0wR2Y6J9X8FRFmO6LNLNQ==
+      }
+    engines: { node: ">= 12" }
+    dependencies:
+      "@intlify/devtools-if": 9.2.0-beta.32
+      "@intlify/message-compiler": 9.2.0-beta.32
+      "@intlify/shared": 9.2.0-beta.32
+      "@intlify/vue-devtools": 9.2.0-beta.32
     dev: false
 
-  /@intlify/devtools-if/9.2.0-beta.30:
+  /@intlify/devtools-if/9.2.0-beta.32:
     resolution:
       {
-        integrity: sha512-3OxGFi6ooya9DFqX/JsxFjrj9nGYcDoo4CRGYSDqnC+xv4bnsyB5ekmaYBiVZtagCdZdSUMxbTFphl1WbtgNLQ==
+        integrity: sha512-MvcxHrP7urM17wcna2vyqt8D8Pc5lyD3ps2BcmAr60UYifNKBQU7LmHfjTG7BZO4t0LyUWrWFJmm7fRVlju40g==
       }
     engines: { node: ">= 12" }
     dependencies:
-      "@intlify/shared": 9.2.0-beta.30
+      "@intlify/shared": 9.2.0-beta.32
     dev: false
 
-  /@intlify/message-compiler/9.2.0-beta.30:
+  /@intlify/message-compiler/9.2.0-beta.32:
     resolution:
       {
-        integrity: sha512-2kj/0nLIFrgiO86f9VifcUUcV8LdzXt4YYPIujx/LkTEQOuSFUo/bNiMaG1hyfiU/8mfq6tsaWKjoOZjeao1eQ==
+        integrity: sha512-7OOHIhOmOM4nqe3KfEuE65xLwawwBGg/pCFByzayf0jARoHkeaA7v/eKsUJVJMEakeF2pNstx06AvfecijgPzg==
       }
     engines: { node: ">= 12" }
     dependencies:
-      "@intlify/shared": 9.2.0-beta.30
+      "@intlify/shared": 9.2.0-beta.32
       source-map: 0.6.1
-    dev: false
 
-  /@intlify/shared/9.2.0-beta.30:
+  /@intlify/shared/9.2.0-beta.32:
     resolution:
       {
-        integrity: sha512-E1WHRTIlUEse3d/6t1pAagSXRxmeVeNIhx5kT80dfpYxw8lOnCWV9wLve2bq9Fkv+3TD2I5j+CdN7jvSl3LdsA==
+        integrity: sha512-lVaHnKFNg16eWlfDLzDFLapurrf0WK7xLWEkz8DMYNIXJshRQOZCkH7sQaqtONPoOT0LqjyPo1+sV0Wq85/HRQ==
       }
     engines: { node: ">= 12" }
-    dev: false
 
-  /@intlify/vue-devtools/9.2.0-beta.30:
+  /@intlify/vite-plugin-vue-i18n/3.3.1_927a0a946d0d434f1ee9f376a300ea94:
     resolution:
       {
-        integrity: sha512-hcqDfwP/oXVmVCaJ0RA+uv1WSCcd42/Y13S0bySmWZv2KamLcxiD7wYxp/MaECG/D4KZcSLkq/wDHTG7lhYf5Q==
+        integrity: sha512-b9HIUANzL4/LmrA5RqeiPabZl2/RiWNAJ90TVZ8kSi3APRZ4BbmwUAclKe8ip+1jCDhqaGO/qfAI7SbQ0Y76Uw==
       }
     engines: { node: ">= 12" }
+    peerDependencies:
+      petite-vue-i18n: ^9.0.0
+      vite: ^2.0.0
+      vue-i18n: ^9.0.0
+    peerDependenciesMeta:
+      petite-vue-i18n:
+        optional: true
+      vue-i18n:
+        optional: true
     dependencies:
-      "@intlify/core-base": 9.2.0-beta.30
-      "@intlify/shared": 9.2.0-beta.30
+      "@intlify/bundle-utils": 2.2.0_vue-i18n@9.2.0-beta.32
+      "@intlify/shared": 9.2.0-beta.32
+      "@rollup/pluginutils": 4.1.2
+      debug: 4.3.3
+      fast-glob: 3.2.11
+      source-map: 0.6.1
+      vite: 2.7.13_sass@1.49.9
+      vue-i18n: 9.2.0-beta.32_vue@3.2.31
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /@intlify/vue-devtools/9.2.0-beta.32:
+    resolution:
+      {
+        integrity: sha512-LZ+E8S+PBeKzV5zDrh/6kbPdEMu+oO6W7B9EmNhzBOKcF94oiJRTkFLymV6U2YefWu+JYEl2LGe7giXXt2jcwg==
+      }
+    engines: { node: ">= 12" }
+    dependencies:
+      "@intlify/core-base": 9.2.0-beta.32
+      "@intlify/shared": 9.2.0-beta.32
     dev: false
 
   /@jridgewell/resolve-uri/3.0.5:
@@ -1328,7 +1376,7 @@ packages:
       "@types/node": 14.14.14
     dev: true
 
-  /@typescript-eslint/eslint-plugin/5.11.0_15a231715447500ed5c06da64c8aef1c:
+  /@typescript-eslint/eslint-plugin/5.11.0_e5aa81e2725d014cc10493a9f0356cdc:
     resolution:
       {
         integrity: sha512-HJh33bgzXe6jGRocOj4FmefD7hRY4itgjzOrSs3JPrTNXsX7j5+nQPciAUj/1nZtwo2kAc3C75jZO+T23gzSGw==
@@ -1342,23 +1390,23 @@ packages:
       typescript:
         optional: true
     dependencies:
-      "@typescript-eslint/parser": 5.11.0_eslint@8.9.0+typescript@4.5.5
+      "@typescript-eslint/parser": 5.11.0_eslint@8.9.0+typescript@4.6.2
       "@typescript-eslint/scope-manager": 5.11.0
-      "@typescript-eslint/type-utils": 5.11.0_eslint@8.9.0+typescript@4.5.5
-      "@typescript-eslint/utils": 5.11.0_eslint@8.9.0+typescript@4.5.5
+      "@typescript-eslint/type-utils": 5.11.0_eslint@8.9.0+typescript@4.6.2
+      "@typescript-eslint/utils": 5.11.0_eslint@8.9.0+typescript@4.6.2
       debug: 4.3.3
       eslint: 8.9.0
       functional-red-black-tree: 1.0.1
       ignore: 5.2.0
       regexpp: 3.2.0
       semver: 7.3.5
-      tsutils: 3.21.0_typescript@4.5.5
-      typescript: 4.5.5
+      tsutils: 3.21.0_typescript@4.6.2
+      typescript: 4.6.2
     transitivePeerDependencies:
       - supports-color
     dev: true
 
-  /@typescript-eslint/parser/5.11.0_eslint@8.9.0+typescript@4.5.5:
+  /@typescript-eslint/parser/5.11.0_eslint@8.9.0+typescript@4.6.2:
     resolution:
       {
         integrity: sha512-x0DCjetHZYBRovJdr3U0zG9OOdNXUaFLJ82ehr1AlkArljJuwEsgnud+Q7umlGDFLFrs8tU8ybQDFocp/eX8mQ==
@@ -1373,10 +1421,10 @@ packages:
     dependencies:
       "@typescript-eslint/scope-manager": 5.11.0
       "@typescript-eslint/types": 5.11.0
-      "@typescript-eslint/typescript-estree": 5.11.0_typescript@4.5.5
+      "@typescript-eslint/typescript-estree": 5.11.0_typescript@4.6.2
       debug: 4.3.3
       eslint: 8.9.0
-      typescript: 4.5.5
+      typescript: 4.6.2
     transitivePeerDependencies:
       - supports-color
     dev: true
@@ -1392,7 +1440,7 @@ packages:
       "@typescript-eslint/visitor-keys": 5.11.0
     dev: true
 
-  /@typescript-eslint/type-utils/5.11.0_eslint@8.9.0+typescript@4.5.5:
+  /@typescript-eslint/type-utils/5.11.0_eslint@8.9.0+typescript@4.6.2:
     resolution:
       {
         integrity: sha512-wDqdsYO6ofLaD4DsGZ0jGwxp4HrzD2YKulpEZXmgN3xo4BHJwf7kq49JTRpV0Gx6bxkSUmc9s0EIK1xPbFFpIA==
@@ -1405,11 +1453,11 @@ packages:
       typescript:
         optional: true
     dependencies:
-      "@typescript-eslint/utils": 5.11.0_eslint@8.9.0+typescript@4.5.5
+      "@typescript-eslint/utils": 5.11.0_eslint@8.9.0+typescript@4.6.2
       debug: 4.3.3
       eslint: 8.9.0
-      tsutils: 3.21.0_typescript@4.5.5
-      typescript: 4.5.5
+      tsutils: 3.21.0_typescript@4.6.2
+      typescript: 4.6.2
     transitivePeerDependencies:
       - supports-color
     dev: true
@@ -1422,7 +1470,7 @@ packages:
     engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 }
     dev: true
 
-  /@typescript-eslint/typescript-estree/5.11.0_typescript@4.5.5:
+  /@typescript-eslint/typescript-estree/5.11.0_typescript@4.6.2:
     resolution:
       {
         integrity: sha512-yVH9hKIv3ZN3lw8m/Jy5I4oXO4ZBMqijcXCdA4mY8ull6TPTAoQnKKrcZ0HDXg7Bsl0Unwwx7jcXMuNZc0m4lg==
@@ -1440,13 +1488,13 @@ packages:
       globby: 11.1.0
       is-glob: 4.0.3
       semver: 7.3.5
-      tsutils: 3.21.0_typescript@4.5.5
-      typescript: 4.5.5
+      tsutils: 3.21.0_typescript@4.6.2
+      typescript: 4.6.2
     transitivePeerDependencies:
       - supports-color
     dev: true
 
-  /@typescript-eslint/utils/5.11.0_eslint@8.9.0+typescript@4.5.5:
+  /@typescript-eslint/utils/5.11.0_eslint@8.9.0+typescript@4.6.2:
     resolution:
       {
         integrity: sha512-g2I480tFE1iYRDyMhxPAtLQ9HAn0jjBtipgTCZmd9I9s11OV8CTsG+YfFciuNDcHqm4csbAgC2aVZCHzLxMSUw==
@@ -1458,7 +1506,7 @@ packages:
       "@types/json-schema": 7.0.9
       "@typescript-eslint/scope-manager": 5.11.0
       "@typescript-eslint/types": 5.11.0
-      "@typescript-eslint/typescript-estree": 5.11.0_typescript@4.5.5
+      "@typescript-eslint/typescript-estree": 5.11.0_typescript@4.6.2
       eslint: 8.9.0
       eslint-scope: 5.1.1
       eslint-utils: 3.0.0_eslint@8.9.0
@@ -1621,7 +1669,7 @@ packages:
       prettier: 2.5.1
     dev: true
 
-  /@vue/eslint-config-typescript/10.0.0_cd100ca74b8c3cfb64acbb3ff997764b:
+  /@vue/eslint-config-typescript/10.0.0_e9ae806e724e1e93b0f13f024669b2db:
     resolution:
       {
         integrity: sha512-F94cL8ug3FaYXlCfU5/wiGjk1qeadmoBpRGAOBq+qre3Smdupa59dd6ZJrsfRODpsMPyTG7330juMDsUvpZ3Rw==
@@ -1631,8 +1679,8 @@ packages:
       eslint: ^6.2.0 || ^7.0.0 || ^8.0.0
       eslint-plugin-vue: ^8.0.1
     dependencies:
-      "@typescript-eslint/eslint-plugin": 5.11.0_15a231715447500ed5c06da64c8aef1c
-      "@typescript-eslint/parser": 5.11.0_eslint@8.9.0+typescript@4.5.5
+      "@typescript-eslint/eslint-plugin": 5.11.0_e5aa81e2725d014cc10493a9f0356cdc
+      "@typescript-eslint/parser": 5.11.0_eslint@8.9.0+typescript@4.6.2
       eslint: 8.9.0
       eslint-plugin-vue: 8.4.1_eslint@8.9.0
       vue-eslint-parser: 8.2.0_eslint@8.9.0
@@ -1721,6 +1769,33 @@ packages:
       vue-demi: 0.12.1_vue@3.2.31
     dev: false
 
+  /@vueuse/core/8.0.0_vue@3.2.31:
+    resolution:
+      {
+        integrity: sha512-CU8oQhTaAQ4+9IlEHnaGk88qQ2fSvALHixWZhfyA2j18G42XeyJz3V0FmnBMWZUwd7VRSHJZFbGziZ6o5npNow==
+      }
+    peerDependencies:
+      "@vue/composition-api": ^1.1.0
+      vue: ^2.6.0 || ^3.2.0
+    peerDependenciesMeta:
+      "@vue/composition-api":
+        optional: true
+      vue:
+        optional: true
+    dependencies:
+      "@vueuse/metadata": 8.0.0
+      "@vueuse/shared": 8.0.0_vue@3.2.31
+      vue: 3.2.31
+      vue-demi: 0.12.1_vue@3.2.31
+    dev: false
+
+  /@vueuse/metadata/8.0.0:
+    resolution:
+      {
+        integrity: sha512-23R9pqgfJnfmUnGCOtaDkwaNYEAO7N6whvaAFAs5D5xHXgqAj+z/tLhwQzSJw/ZzJGUb8W5L+VgP9S7SL35riw==
+      }
+    dev: false
+
   /@vueuse/motion/2.0.0-beta.9_vue@3.2.31:
     resolution:
       {
@@ -1757,10 +1832,28 @@ packages:
       vue-demi: 0.12.1_vue@3.2.31
     dev: false
 
-  /@windicss/config/1.8.2:
+  /@vueuse/shared/8.0.0_vue@3.2.31:
+    resolution:
+      {
+        integrity: sha512-HUIFZ5Vc3aGvIzDQJJhg2+Ok5xvNuwxoz5HrOr/M765wlj357WiMYzhU2XGljL6IcmK29SP/1Jb4Fra7A4PBCw==
+      }
+    peerDependencies:
+      "@vue/composition-api": ^1.1.0
+      vue: ^2.6.0 || ^3.2.0
+    peerDependenciesMeta:
+      "@vue/composition-api":
+        optional: true
+      vue:
+        optional: true
+    dependencies:
+      vue: 3.2.31
+      vue-demi: 0.12.1_vue@3.2.31
+    dev: false
+
+  /@windicss/config/1.8.3:
     resolution:
       {
-        integrity: sha512-dGXkzcH1Bnm9716/pE63YSewLQIZXGWerHEotUKf2EMlz/JqsI9Z3yBy/lXVL9HsEoTNpyvMPLk75oquH0vXGg==
+        integrity: sha512-1fvfZhRD7WfV/Xh6uIAYKIdbQWrwEgSdkFlHiLPzMDS44KjwNZILDzLAz9Y2W5H2K4MLGgGMnzGS89ECyjc0Ww==
       }
     dependencies:
       debug: 4.3.3
@@ -1770,14 +1863,14 @@ packages:
       - supports-color
     dev: true
 
-  /@windicss/plugin-utils/1.8.2:
+  /@windicss/plugin-utils/1.8.3:
     resolution:
       {
-        integrity: sha512-UlinWxojyGxWV18AyQ1ISeGvtpbw4ITQpcRe0v4PyuJZHwnrrHmxp8o/pg10oEcDKnsTIbjGeZfW5DC+mkjYYQ==
+        integrity: sha512-emlMeDt73uNV1ZofLTDogcxqL9aZ5uIRYkjeHlrWiaDozFbX6Jc+a6eRo9Ieaar3JUryl6AnecTPHAiFDl4IXg==
       }
     dependencies:
       "@antfu/utils": 0.5.0
-      "@windicss/config": 1.8.2
+      "@windicss/config": 1.8.3
       debug: 4.3.3
       fast-glob: 3.2.11
       magic-string: 0.25.7
@@ -1837,6 +1930,17 @@ packages:
       through: 2.3.8
     dev: true
 
+  /acorn-jsx/5.3.2_acorn@7.4.1:
+    resolution:
+      {
+        integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
+      }
+    peerDependencies:
+      acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
+    dependencies:
+      acorn: 7.4.1
+    dev: true
+
   /acorn-jsx/5.3.2_acorn@8.7.0:
     resolution:
       {
@@ -1848,6 +1952,15 @@ packages:
       acorn: 8.7.0
     dev: true
 
+  /acorn/7.4.1:
+    resolution:
+      {
+        integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==
+      }
+    engines: { node: ">=0.4.0" }
+    hasBin: true
+    dev: true
+
   /acorn/8.7.0:
     resolution:
       {
@@ -2041,10 +2154,10 @@ packages:
       postcss-value-parser: 4.2.0
     dev: true
 
-  /axios/0.26.0:
+  /axios/0.26.1:
     resolution:
       {
-        integrity: sha512-lKoGLMYtHvFrPVt3r+RBMp9nh34N0M8zEfCWqdWZx6phynIEhQqAdydpyBAAG211zlhX9Rgu08cOamy6XjE5Og==
+        integrity: sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==
       }
     dependencies:
       follow-redirects: 1.14.9
@@ -2604,17 +2717,6 @@ packages:
       cross-spawn: 7.0.3
     dev: true
 
-  /cross-fetch/3.1.5:
-    resolution:
-      {
-        integrity: sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==
-      }
-    dependencies:
-      node-fetch: 2.6.7
-    transitivePeerDependencies:
-      - encoding
-    dev: true
-
   /cross-spawn/7.0.3:
     resolution:
       {
@@ -3494,6 +3596,16 @@ packages:
       estraverse: 5.3.0
     dev: true
 
+  /eslint-utils/2.1.0:
+    resolution:
+      {
+        integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==
+      }
+    engines: { node: ">=6" }
+    dependencies:
+      eslint-visitor-keys: 1.3.0
+    dev: true
+
   /eslint-utils/3.0.0_eslint@8.9.0:
     resolution:
       {
@@ -3507,6 +3619,14 @@ packages:
       eslint-visitor-keys: 2.1.0
     dev: true
 
+  /eslint-visitor-keys/1.3.0:
+    resolution:
+      {
+        integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==
+      }
+    engines: { node: ">=4" }
+    dev: true
+
   /eslint-visitor-keys/2.1.0:
     resolution:
       {
@@ -3570,6 +3690,18 @@ packages:
       - supports-color
     dev: true
 
+  /espree/6.2.1:
+    resolution:
+      {
+        integrity: sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==
+      }
+    engines: { node: ">=6.0.0" }
+    dependencies:
+      acorn: 7.4.1
+      acorn-jsx: 5.3.2_acorn@7.4.1
+      eslint-visitor-keys: 1.3.0
+    dev: true
+
   /espree/9.3.1:
     resolution:
       {
@@ -4566,6 +4698,20 @@ packages:
       minimist: 1.2.5
     dev: true
 
+  /jsonc-eslint-parser/1.4.1:
+    resolution:
+      {
+        integrity: sha512-hXBrvsR1rdjmB2kQmUjf1rEIa+TqHBGMge8pwi++C+Si1ad7EjZrJcpgwym+QGK/pqTx+K7keFAtLlVNdLRJOg==
+      }
+    engines: { node: ">=8.10.0" }
+    dependencies:
+      acorn: 7.4.1
+      eslint-utils: 2.1.0
+      eslint-visitor-keys: 1.3.0
+      espree: 6.2.1
+      semver: 6.3.0
+    dev: true
+
   /jsonfile/4.0.0:
     resolution: { integrity: sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= }
     optionalDependencies:
@@ -5077,21 +5223,6 @@ packages:
       tslib: 2.3.1
     dev: true
 
-  /node-fetch/2.6.7:
-    resolution:
-      {
-        integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==
-      }
-    engines: { node: 4.x || >=6.0.0 }
-    peerDependencies:
-      encoding: ^0.1.0
-    peerDependenciesMeta:
-      encoding:
-        optional: true
-    dependencies:
-      whatwg-url: 5.0.0
-    dev: true
-
   /node-releases/2.0.2:
     resolution:
       {
@@ -5424,7 +5555,7 @@ packages:
     engines: { node: ">=0.10.0" }
     dev: true
 
-  /pinia/2.0.11_typescript@4.5.5+vue@3.2.31:
+  /pinia/2.0.11_typescript@4.6.2+vue@3.2.31:
     resolution:
       {
         integrity: sha512-JzcmnMqu28PNWOjDgEDK6fTrIzX8eQZKPPKvu/fpHdpXARUj1xeVdFi3YFIMOWswqaBd589cpmAMdSSTryI9iw==
@@ -5440,7 +5571,7 @@ packages:
         optional: true
     dependencies:
       "@vue/devtools-api": 6.0.10
-      typescript: 4.5.5
+      typescript: 4.6.2
       vue: 3.2.31
       vue-demi: 0.12.1_vue@3.2.31
     dev: false
@@ -6923,10 +7054,6 @@ packages:
       is-number: 7.0.0
     dev: true
 
-  /tr46/0.0.3:
-    resolution: { integrity: sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= }
-    dev: true
-
   /trim-newlines/3.0.1:
     resolution:
       {
@@ -6935,7 +7062,7 @@ packages:
     engines: { node: ">=8" }
     dev: true
 
-  /ts-node/9.1.1_typescript@4.5.5:
+  /ts-node/9.1.1_typescript@4.6.2:
     resolution:
       {
         integrity: sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==
@@ -6950,7 +7077,7 @@ packages:
       diff: 4.0.2
       make-error: 1.3.6
       source-map-support: 0.5.21
-      typescript: 4.5.5
+      typescript: 4.6.2
       yn: 3.1.1
     dev: true
 
@@ -6974,7 +7101,7 @@ packages:
         integrity: sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==
       }
 
-  /tsutils/3.21.0_typescript@4.5.5:
+  /tsutils/3.21.0_typescript@4.6.2:
     resolution:
       {
         integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==
@@ -6984,7 +7111,7 @@ packages:
       typescript: ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta"
     dependencies:
       tslib: 1.14.1
-      typescript: 4.5.5
+      typescript: 4.6.2
     dev: true
 
   /type-check/0.4.0:
@@ -7051,10 +7178,10 @@ packages:
       }
     dev: false
 
-  /typescript/4.5.5:
+  /typescript/4.6.2:
     resolution:
       {
-        integrity: sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==
+        integrity: sha512-HM/hFigTBHZhLXshn9sN37H085+hQGeJHJ/X7LpBWLID/fbc2acUMfU+lGD98X81sKP+pFa9f0DZmCwB9GnbAg==
       }
     engines: { node: ">=4.2.0" }
     hasBin: true
@@ -7288,15 +7415,15 @@ packages:
       - supports-color
     dev: true
 
-  /vite-plugin-windicss/1.8.2_vite@2.7.13:
+  /vite-plugin-windicss/1.8.3_vite@2.7.13:
     resolution:
       {
-        integrity: sha512-tO9bCoqIW945ehwMr9D41YPods8b7HXtVtYVPx62dxadxlbcoD7PQ/8wSvLEiIkMMfuDG5WQ6LZaUdmfALC/vQ==
+        integrity: sha512-RIw2GD6H6cKNE8wZXVOBs4L1uTicVS0FaAkeqXvy1oyuXLC4SXmvnzEuoK0+qFuWJjW0ECNwE8eU+ZZhzNQKUg==
       }
     peerDependencies:
       vite: ^2.0.1
     dependencies:
-      "@windicss/plugin-utils": 1.8.2
+      "@windicss/plugin-utils": 1.8.3
       debug: 4.3.3
       kolorist: 1.5.1
       vite: 2.7.13_sass@1.49.9
@@ -7382,18 +7509,18 @@ packages:
       - supports-color
     dev: true
 
-  /vue-i18n/9.2.0-beta.30_vue@3.2.31:
+  /vue-i18n/9.2.0-beta.32_vue@3.2.31:
     resolution:
       {
-        integrity: sha512-5DqrgG9ffgC7j3RRAfViC0WUcdz0C3Ix1qq1AyQItpF7UkSB6iSJGEjBG6KdspbRQq/8t1YzDx4JRXbL05l6ow==
+        integrity: sha512-heUy1Aa/4DT2+ukoZkXMtDeU0o4pB5K6XxCypsmpoQ1QURAx1zyHqHB4mdjnLj3DDjllT921cV9cuKEWflQYGQ==
       }
     engines: { node: ">= 12" }
     peerDependencies:
       vue: ^3.0.0
     dependencies:
-      "@intlify/core-base": 9.2.0-beta.30
-      "@intlify/shared": 9.2.0-beta.30
-      "@intlify/vue-devtools": 9.2.0-beta.30
+      "@intlify/core-base": 9.2.0-beta.32
+      "@intlify/shared": 9.2.0-beta.32
+      "@intlify/vue-devtools": 9.2.0-beta.32
       "@vue/devtools-api": 6.0.10
       vue: 3.2.31
     dev: false
@@ -7410,10 +7537,10 @@ packages:
       vue: 3.2.31
     dev: false
 
-  /vue-router/4.0.13_vue@3.2.31:
+  /vue-router/4.0.14_vue@3.2.31:
     resolution:
       {
-        integrity: sha512-LmXrC+BkDRLak+d5xTMgUYraT3Nj0H/vCbP+7usGvIl9Viqd1UP6AsP0i69pSbn9O0dXK/xCdp4yPw21HqV9Jw==
+        integrity: sha512-wAO6zF9zxA3u+7AkMPqw9LjoUCjSxfFvINQj3E/DceTt6uEz1XZLraDhdg2EYmvVwTBSGlLYsUw8bDmx0754Mw==
       }
     peerDependencies:
       vue: ^3.2.0
@@ -7484,10 +7611,6 @@ packages:
       tslib: 2.3.1
     dev: false
 
-  /webidl-conversions/3.0.1:
-    resolution: { integrity: sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= }
-    dev: true
-
   /webpack-virtual-modules/0.4.3:
     resolution:
       {
@@ -7495,13 +7618,6 @@ packages:
       }
     dev: true
 
-  /whatwg-url/5.0.0:
-    resolution: { integrity: sha1-lmRU6HZUYuN2RNNib2dCzotwll0= }
-    dependencies:
-      tr46: 0.0.3
-      webidl-conversions: 3.0.1
-    dev: true
-
   /which/1.3.1:
     resolution:
       {
@@ -7628,6 +7744,17 @@ packages:
       }
     dev: true
 
+  /yaml-eslint-parser/0.3.2:
+    resolution:
+      {
+        integrity: sha512-32kYO6kJUuZzqte82t4M/gB6/+11WAuHiEnK7FreMo20xsCKPeFH5tDBU7iWxR7zeJpNnMXfJyXwne48D0hGrg==
+      }
+    dependencies:
+      eslint-visitor-keys: 1.3.0
+      lodash: 4.17.21
+      yaml: 1.10.2
+    dev: true
+
   /yaml/1.10.2:
     resolution:
       {

+ 3 - 3
src/layout/components/navbar.vue

@@ -14,7 +14,7 @@ import screenfull from "../components/screenfull/index.vue";
 import globalization from "/@/assets/svg/globalization.svg?component";
 
 const route = useRoute();
-const { locale } = useI18n();
+const { locale, t } = useI18n();
 const instance =
   getCurrentInstance().appContext.config.globalProperties.$storage;
 const {
@@ -101,14 +101,14 @@ function translationEn() {
               <IconifyIconOffline
                 icon="logout-circle-r-line"
                 style="margin: 5px"
-              />{{ $t("buttons.hsLoginOut") }}</el-dropdown-item
+              />{{ t("buttons.hsLoginOut") }}</el-dropdown-item
             >
           </el-dropdown-menu>
         </template>
       </el-dropdown>
       <el-icon
         class="el-icon-setting"
-        :title="$t('buttons.hssystemSet')"
+        :title="t('buttons.hssystemSet')"
         @click="onPanel"
       >
         <IconifyIconOffline icon="setting" />

+ 4 - 3
src/layout/components/screenfull/index.vue

@@ -1,5 +1,8 @@
 <script setup lang="ts">
 import { useFullscreen } from "@vueuse/core";
+import { useI18n } from "vue-i18n";
+
+const { t } = useI18n();
 const { isFullscreen, toggle } = useFullscreen();
 </script>
 
@@ -7,9 +10,7 @@ const { isFullscreen, toggle } = useFullscreen();
   <div class="screen-full" @click="toggle">
     <FontIcon
       :title="
-        isFullscreen
-          ? $t('buttons.hsexitfullscreen')
-          : $t('buttons.hsfullscreen')
+        isFullscreen ? t('buttons.hsexitfullscreen') : t('buttons.hsfullscreen')
       "
       :icon="isFullscreen ? 'team-iconexit-fullscreen' : 'team-iconfullscreen'"
     />

+ 4 - 1
src/layout/components/search/components/SearchResult.vue

@@ -14,7 +14,7 @@
         <component
           :is="useRenderIcon(item.meta?.icon ?? 'bookmark-2-line')"
         ></component>
-        <span class="result-item-title">{{ $t(item.meta?.title) }}</span>
+        <span class="result-item-title">{{ t(item.meta?.title) }}</span>
         <enterOutlined />
       </div>
     </template>
@@ -23,10 +23,13 @@
 
 <script lang="ts" setup>
 import { computed } from "vue";
+import { useI18n } from "vue-i18n";
 import { useEpThemeStoreHook } from "/@/store/modules/epTheme";
 import { useRenderIcon } from "/@/components/ReIcon/src/hooks";
 import enterOutlined from "/@/assets/svg/enter_outlined.svg?component";
 
+const { t } = useI18n();
+
 interface optionsItem {
   path: string;
   meta?: {

+ 3 - 3
src/layout/components/sidebar/horizontal.vue

@@ -14,7 +14,7 @@ import { usePermissionStoreHook } from "/@/store/modules/permission";
 import globalization from "/@/assets/svg/globalization.svg?component";
 
 const route = useRoute();
-const { locale } = useI18n();
+const { locale, t } = useI18n();
 const routers = useRouter().options.routes;
 const menuRef = templateRef<ElRef | null>("menu", null);
 const instance =
@@ -133,14 +133,14 @@ function translationEn() {
                 icon="logout-circle-r-line"
                 style="margin: 5px"
               />
-              {{ $t("buttons.hsLoginOut") }}</el-dropdown-item
+              {{ t("buttons.hsLoginOut") }}</el-dropdown-item
             >
           </el-dropdown-menu>
         </template>
       </el-dropdown>
       <el-icon
         class="el-icon-setting"
-        :title="$t('buttons.hssystemSet')"
+        :title="t('buttons.hssystemSet')"
         @click="onPanel"
       >
         <IconifyIconOffline icon="setting" />

+ 3 - 3
src/layout/components/sidebar/mixNav.vue

@@ -17,7 +17,7 @@ import globalization from "/@/assets/svg/globalization.svg?component";
 import { ref, watch, nextTick, onMounted, getCurrentInstance } from "vue";
 
 const route = useRoute();
-const { locale } = useI18n();
+const { locale, t } = useI18n();
 const routers = useRouter().options.routes;
 const menuRef = templateRef<ElRef | null>("menu", null);
 const instance =
@@ -178,14 +178,14 @@ function translationEn() {
                 icon="logout-circle-r-line"
                 style="margin: 5px"
               />
-              {{ $t("buttons.hsLoginOut") }}</el-dropdown-item
+              {{ t("buttons.hsLoginOut") }}</el-dropdown-item
             >
           </el-dropdown-menu>
         </template>
       </el-dropdown>
       <el-icon
         class="el-icon-setting"
-        :title="$t('buttons.hssystemSet')"
+        :title="t('buttons.hssystemSet')"
         @click="onPanel"
       >
         <IconifyIconOffline icon="setting" />

+ 12 - 11
src/layout/components/tag/index.vue

@@ -19,12 +19,12 @@ import closeLeft from "/@/assets/svg/close_left.svg?component";
 import closeOther from "/@/assets/svg/close_other.svg?component";
 import closeRight from "/@/assets/svg/close_right.svg?component";
 
+import { useI18n } from "vue-i18n";
 import { emitter } from "/@/utils/mitt";
-import { $t as t } from "/@/plugins/i18n";
-import { transformI18n } from "/@/plugins/i18n";
 import { storageLocal } from "/@/utils/storage";
 import { useRoute, useRouter } from "vue-router";
 import { isEqual, isEmpty } from "lodash-unified";
+import { transformI18n, $t } from "/@/plugins/i18n";
 import { RouteConfigs, tagsViewsType } from "../../types";
 import { useSettingStoreHook } from "/@/store/modules/settings";
 import { handleAliveRoute, delAliveRoutes } from "/@/router/utils";
@@ -33,6 +33,7 @@ import { usePermissionStoreHook } from "/@/store/modules/permission";
 import { toggleClass, removeClass, hasClass } from "/@/utils/operate";
 import { templateRef, useResizeObserver, useDebounceFn } from "@vueuse/core";
 
+const { t } = useI18n();
 const route = useRoute();
 const router = useRouter();
 const translateX = ref<number>(0);
@@ -193,42 +194,42 @@ const handleScroll = (offset: number): void => {
 const tagsViews = reactive<Array<tagsViewsType>>([
   {
     icon: refresh,
-    text: t("buttons.hsreload"),
+    text: $t("buttons.hsreload"),
     divided: false,
     disabled: false,
     show: true
   },
   {
     icon: close,
-    text: t("buttons.hscloseCurrentTab"),
+    text: $t("buttons.hscloseCurrentTab"),
     divided: false,
     disabled: multiTags.value.length > 1 ? false : true,
     show: true
   },
   {
     icon: closeLeft,
-    text: t("buttons.hscloseLeftTabs"),
+    text: $t("buttons.hscloseLeftTabs"),
     divided: true,
     disabled: multiTags.value.length > 1 ? false : true,
     show: true
   },
   {
     icon: closeRight,
-    text: t("buttons.hscloseRightTabs"),
+    text: $t("buttons.hscloseRightTabs"),
     divided: false,
     disabled: multiTags.value.length > 1 ? false : true,
     show: true
   },
   {
     icon: closeOther,
-    text: t("buttons.hscloseOtherTabs"),
+    text: $t("buttons.hscloseOtherTabs"),
     divided: true,
     disabled: multiTags.value.length > 2 ? false : true,
     show: true
   },
   {
     icon: closeAll,
-    text: t("buttons.hscloseAllTabs"),
+    text: $t("buttons.hscloseAllTabs"),
     divided: false,
     disabled: multiTags.value.length > 1 ? false : true,
     show: true
@@ -701,7 +702,7 @@ const getContextMenuStyle = computed((): CSSProperties => {
         >
           <li v-if="item.show" @click="selectTag(key, item)">
             <component :is="item.icon" :key="key" />
-            {{ $t(item.text) }}
+            {{ t(item.text) }}
           </li>
         </div>
       </ul>
@@ -710,7 +711,7 @@ const getContextMenuStyle = computed((): CSSProperties => {
     <ul class="right-button">
       <li>
         <el-icon
-          :title="$t('buttons.hsrefreshRoute')"
+          :title="t('buttons.hsrefreshRoute')"
           class="el-icon-refresh-right rotate"
           @click="onFresh"
         >
@@ -740,7 +741,7 @@ const getContextMenuStyle = computed((): CSSProperties => {
                   :key="key"
                   style="margin-right: 6px"
                 />
-                {{ $t(item.text) }}
+                {{ t(item.text) }}
               </el-dropdown-item>
             </el-dropdown-menu>
           </template>

+ 78 - 0
src/plugins/i18n.ts

@@ -0,0 +1,78 @@
+// 多组件库的国际化和本地项目国际化兼容
+import { App, WritableComputedRef } from "vue";
+import { storageLocal } from "/@/utils/storage";
+import { type I18n, createI18n } from "vue-i18n";
+
+// vxe-table组件国际化
+import zhVxeTable from "vxe-table/lib/locale/lang/zh-CN";
+import enVxeTable from "vxe-table/lib/locale/lang/en-US";
+// element-plus国际化
+import enLocale from "element-plus/lib/locale/lang/en";
+import zhLocale from "element-plus/lib/locale/lang/zh-cn";
+
+function siphonI18n(prefix = "zh-CN") {
+  return Object.fromEntries(
+    Object.entries(import.meta.globEager("../../locales/*.y(a)?ml")).map(
+      ([key, value]) => {
+        const matched = key.match(/([A-Za-z0-9-_]+)\./i)[1];
+        return [matched, value.default];
+      }
+    )
+  )[prefix];
+}
+
+export const localesConfigs = {
+  zh: {
+    ...siphonI18n("zh-CN"),
+    ...zhVxeTable,
+    ...zhLocale
+  },
+  en: {
+    ...siphonI18n("en"),
+    ...enVxeTable,
+    ...enLocale
+  }
+};
+
+/**
+ * 国际化转换工具函数
+ * @param message message
+ * @param isI18n  如果true,获取对应的消息,否则返回本身
+ * @returns message
+ */
+export function transformI18n(
+  message: string | unknown | object = "",
+  isI18n: boolean | unknown = false
+) {
+  if (!message) {
+    return "";
+  }
+
+  // 处理存储动态路由的title,格式 {zh:"",en:""}
+  if (typeof message === "object") {
+    debugger;
+    const locale: string | WritableComputedRef<string> | any =
+      i18n.global.locale;
+    return message[locale];
+  }
+
+  if (isI18n) {
+    return i18n.global.t.call(i18n.global.locale, message);
+  } else {
+    return message;
+  }
+}
+
+// 此函数只是配合i18n Ally插件来进行国际化智能提示,并无实际意义(只对提示起作用),如果不需要国际化可删除
+export const $t = (key: string) => key;
+
+export const i18n: I18n = createI18n({
+  legacy: false,
+  locale: storageLocal.getItem("responsive-locale")?.locale ?? "zh",
+  fallbackLocale: "en",
+  messages: localesConfigs
+});
+
+export function usI18n(app: App) {
+  app.use(i18n);
+}

+ 0 - 25
src/plugins/i18n/config.ts

@@ -1,25 +0,0 @@
-import { siphonI18n } from "./index";
-// vxe-table组件国际化
-import zhVxeTable from "vxe-table/lib/locale/lang/zh-CN";
-import enVxeTable from "vxe-table/lib/locale/lang/en-US";
-
-// element-plus国际化
-import enLocale from "element-plus/lib/locale/lang/en";
-import zhLocale from "element-plus/lib/locale/lang/zh-cn";
-
-// 项目内自定义国际化
-const zhModules = import.meta.globEager("./zh-CN/**/*.ts");
-const enModules = import.meta.globEager("./en/**/*.ts");
-
-export const localesConfigs = {
-  zh: {
-    ...siphonI18n(zhModules, "zh-CN"),
-    ...zhVxeTable,
-    ...zhLocale
-  },
-  en: {
-    ...siphonI18n(enModules, "en"),
-    ...enVxeTable,
-    ...enLocale
-  }
-};

+ 0 - 21
src/plugins/i18n/en/buttons.ts

@@ -1,21 +0,0 @@
-export default {
-  hsLoginOut: "LoginOut",
-  hsfullscreen: "FullScreen",
-  hsexitfullscreen: "ExitFullscreen",
-  hsrefreshRoute: "RefreshRoute",
-  hslogin: "Login",
-  hsadd: "Add",
-  hsmark: "Mark/Cancel",
-  hssave: "Save",
-  hssearch: "Search",
-  hsexpendAll: "Expand All",
-  hscollapseAll: "Collapse All",
-  hssystemSet: "Open ProjectConfig",
-  hsdelete: "Delete",
-  hsreload: "Reload",
-  hscloseCurrentTab: "Close CurrentTab",
-  hscloseLeftTabs: "Close LeftTabs",
-  hscloseRightTabs: "Close RightTabs",
-  hscloseOtherTabs: "Close OtherTabs",
-  hscloseAllTabs: "Close AllTabs"
-};

+ 0 - 55
src/plugins/i18n/en/menus.ts

@@ -1,55 +0,0 @@
-export default {
-  hshome: "Home",
-  hslogin: "Login",
-  hssysManagement: "System Manage",
-  hsBaseinfo: "Base Info",
-  hsDict: "Dict Manage",
-  hseditor: "Editor",
-  hserror: "Error Page",
-  hsfourZeroFour: "404",
-  hsfourZeroOne: "403",
-  hsFive: "500",
-  hscomponents: "Components",
-  hsvideo: "Video Components",
-  hsmap: "Map Components",
-  hsdraggable: "Draggable Components",
-  hssplitPane: "Split Pane",
-  hsbutton: "Button Components",
-  hscropping: "Picture Cropping",
-  hscountTo: "Digital Animation",
-  hsselector: "Selector Components",
-  hsflowChart: "Flow Chart",
-  hsseamless: "Seamless Scroll",
-  hscontextmenu: "Context Menu",
-  hsmenus: "MultiLevel Menu",
-  hsmenu1: "Menu1",
-  "hsmenu1-1": "Menu1-1",
-  "hsmenu1-2": "Menu1-2",
-  "hsmenu1-2-1": "Menu1-2-1",
-  "hsmenu1-2-2": "Menu1-2-2",
-  "hsmenu1-3": "Menu1-3",
-  hsmenu2: "Menu2",
-  permission: "Permission Manage",
-  permissionPage: "Page Permission",
-  permissionButton: "Button Permission",
-  hstabs: "Tabs Operate",
-  hsguide: "Guide",
-  hsAble: "Able",
-  hsMenuTree: "Menu Tree",
-  hsWatermark: "Water Mark",
-  hsPrint: "Print",
-  hsExternalPage: "External Page",
-  hsPureDocument: "Pure Doc(Embedded)",
-  externalLink: "Pure Doc(External)",
-  hsEpDocument: "Element Plus Doc(Embedded)",
-  hsAbout: "About",
-  hsResult: "Result Page",
-  hsSuccess: "Success Page",
-  hsFail: "Fail Page",
-  hsIconSelect: "Icon Select",
-  hsTimeline: "Time Line",
-  hsLineTree: "LineTree",
-  hsAntTabs: "Imitate Antdv Tabs",
-  hsAntAnchor: "Imitate Antdv Anchor",
-  hsAntTreeSelect: "Imitate Antdv TreeSelector"
-};

+ 0 - 77
src/plugins/i18n/index.ts

@@ -1,77 +0,0 @@
-// 多组件库的国际化和本地项目国际化兼容
-import { App } from "vue";
-import { set } from "lodash-unified";
-import { createI18n } from "vue-i18n";
-import { localesConfigs } from "./config";
-import { storageLocal } from "/@/utils/storage";
-
-/**
- * 国际化转换工具函数
- * @param message message
- * @param isI18n  如果true,获取对应的消息,否则返回本身
- * @returns message
- */
-export function transformI18n(
-  message: string | unknown | object = "",
-  isI18n: boolean | unknown = false
-) {
-  if (!message) {
-    return "";
-  }
-
-  // 处理存储动态路由的title,格式 {zh:"",en:""}
-  if (typeof message === "object") {
-    return message[i18n.global?.locale];
-  }
-
-  if (isI18n) {
-    //@ts-ignore
-    return i18n.global.tc.call(i18n.global, message);
-  } else {
-    return message;
-  }
-}
-
-/**
- * 从模块中抽取国际化
- * @param langs 存放国际化模块
- * @param prefix 语言 默认 zh-CN
- * @returns obj 格式:{模块名.**}
- */
-export function siphonI18n(
-  langs: Record<string, Record<string, any>>,
-  prefix = "zh-CN"
-) {
-  const langsObj: Recordable = {};
-  Object.keys(langs).forEach((key: string) => {
-    let fileName = key.replace(`./${prefix}/`, "").replace(/^\.\//, "");
-    fileName = fileName.substring(0, fileName.lastIndexOf("."));
-    const keyList = fileName.split("/");
-    const moduleName = keyList.shift();
-    const objKey = keyList.join(".");
-    const langFileModule = langs[key].default;
-
-    if (moduleName) {
-      if (objKey) {
-        set(langsObj, moduleName, langsObj[moduleName] || {});
-        set(langsObj[moduleName], objKey, langFileModule);
-      } else {
-        set(langsObj, moduleName, langFileModule || {});
-      }
-    }
-  });
-  return langsObj;
-}
-
-// 此函数只是配合i18n Ally插件来进行国际化智能提示,并无实际意义(只对提示起作用),如果不需要国际化可删除
-export const $t = (key: string) => key;
-
-export const i18n = createI18n({
-  locale: storageLocal.getItem("responsive-locale")?.locale ?? "zh",
-  fallbackLocale: "en",
-  messages: localesConfigs
-});
-
-export function usI18n(app: App) {
-  app.use(i18n);
-}

+ 0 - 21
src/plugins/i18n/zh-CN/buttons.ts

@@ -1,21 +0,0 @@
-export default {
-  hsLoginOut: "退出系统",
-  hsfullscreen: "全屏",
-  hsexitfullscreen: "退出全屏",
-  hsrefreshRoute: "刷新路由",
-  hslogin: "登陆",
-  hsadd: "新增",
-  hsmark: "标记/取消",
-  hssave: "保存",
-  hssearch: "搜索",
-  hsexpendAll: "全部展开",
-  hscollapseAll: "全部折叠",
-  hssystemSet: "打开项目配置",
-  hsdelete: "删除",
-  hsreload: "重新加载",
-  hscloseCurrentTab: "关闭当前标签页",
-  hscloseLeftTabs: "关闭左侧标签页",
-  hscloseRightTabs: "关闭右侧标签页",
-  hscloseOtherTabs: "关闭其他标签页",
-  hscloseAllTabs: "关闭全部标签页"
-};

+ 0 - 55
src/plugins/i18n/zh-CN/menus.ts

@@ -1,55 +0,0 @@
-export default {
-  hshome: "首页",
-  hslogin: "登陆",
-  hssysManagement: "系统管理",
-  hsBaseinfo: "基础信息",
-  hsDict: "字典管理",
-  hseditor: "编辑器",
-  hserror: "错误页面",
-  hsfourZeroFour: "404",
-  hsfourZeroOne: "403",
-  hsFive: "500",
-  hscomponents: "组件",
-  hsvideo: "视频组件",
-  hsmap: "地图组件",
-  hsdraggable: "拖拽组件",
-  hssplitPane: "切割面板",
-  hsbutton: "按钮组件",
-  hscropping: "图片裁剪",
-  hscountTo: "数字动画",
-  hsselector: "选择器组件",
-  hsflowChart: "流程图",
-  hsseamless: "无缝滚动",
-  hscontextmenu: "右键菜单",
-  hsmenus: "多级菜单",
-  hsmenu1: "菜单1",
-  "hsmenu1-1": "菜单1-1",
-  "hsmenu1-2": "菜单1-2",
-  "hsmenu1-2-1": "菜单1-2-1",
-  "hsmenu1-2-2": "菜单1-2-2",
-  "hsmenu1-3": "菜单1-3",
-  hsmenu2: "菜单2",
-  permission: "权限管理",
-  permissionPage: "页面权限",
-  permissionButton: "按钮权限",
-  hstabs: "标签页操作",
-  hsguide: "引导页",
-  hsAble: "功能",
-  hsMenuTree: "菜单树结构",
-  hsWatermark: "水印",
-  hsPrint: "打印",
-  hsExternalPage: "外部页面",
-  hsPureDocument: "平台文档(内嵌)",
-  externalLink: "平台文档(外链)",
-  hsEpDocument: "Element Plus文档(内嵌)",
-  hsAbout: "关于",
-  hsResult: "结果页面",
-  hsSuccess: "成功页面",
-  hsFail: "失败页面",
-  hsIconSelect: "图标选择器",
-  hsTimeline: "时间线",
-  hsLineTree: "树形连接线",
-  hsAntTabs: "仿antdv标签页",
-  hsAntAnchor: "仿antdv锚点",
-  hsAntTreeSelect: "仿antdv树型选择器"
-};

+ 1 - 1
src/plugins/vxe-table/index.ts

@@ -1,6 +1,6 @@
 import "xe-utils";
 import { App } from "vue";
-import { i18n } from "../i18n/index";
+import { i18n } from "/@/plugins/i18n";
 import "font-awesome/css/font-awesome.min.css";
 import {
   // 核心

+ 4 - 2
src/views/able/line-tree.vue

@@ -1,8 +1,10 @@
 <script setup lang="ts">
 import { computed } from "vue";
+import { useI18n } from "vue-i18n";
 import ElTreeLine from "/@/components/ReTreeLine";
 import { extractPathList, deleteChildren } from "/@/utils/tree";
 import { usePermissionStoreHook } from "/@/store/modules/permission";
+const { t } = useI18n();
 
 let menusData = computed(() => {
   return deleteChildren(usePermissionStoreHook().menusTree);
@@ -43,7 +45,7 @@ let dataProps = {
               ><template v-slot:default="{ node }">
                 <el-tree-line :node="node" :showLabelLine="true">
                   <template v-slot:node-label>
-                    <span class="text-sm">{{ $t(node.data.meta.title) }}</span>
+                    <span class="text-sm">{{ t(node.data.meta.title) }}</span>
                   </template>
                 </el-tree-line>
               </template>
@@ -75,7 +77,7 @@ let dataProps = {
                   :indent="30"
                 >
                   <template v-slot:node-label>
-                    <span class="text-sm">{{ $t(node.data.meta.title) }}</span>
+                    <span class="text-sm">{{ t(node.data.meta.title) }}</span>
                   </template>
                 </el-tree-line>
               </template>

+ 3 - 1
src/views/able/menu-tree.vue

@@ -5,6 +5,7 @@ export default {
 </script>
 
 <script setup lang="ts">
+import { useI18n } from "vue-i18n";
 import { ref, computed } from "vue";
 import type { ElTreeV2 } from "element-plus";
 import { transformI18n } from "/@/plugins/i18n";
@@ -12,6 +13,7 @@ import { useRenderIcon } from "/@/components/ReIcon/src/hooks";
 import { extractPathList, deleteChildren } from "/@/utils/tree";
 import { usePermissionStoreHook } from "/@/store/modules/permission";
 import type { TreeNode } from "element-plus/es/components/tree-v2/src/types";
+const { t } = useI18n();
 
 interface treeNode extends TreeNode {
   meta: {
@@ -76,7 +78,7 @@ const filterMethod = (query: string, node: treeNode) => {
       :default-expanded-keys="expandedKeys"
     >
       <template #default="{ data }">
-        <span>{{ $t(data.meta.title) }}</span>
+        <span>{{ t(data.meta.title) }}</span>
       </template>
     </el-tree-v2>
   </el-card>

+ 6 - 3
src/views/nested/menu1/menu1-1/index.vue

@@ -1,18 +1,21 @@
 <template>
   <div>
-    <p>{{ $t("menus.hsmenu1") }}</p>
-    <p style="text-indent: 2em">{{ $t("menus.hsmenu1-1") }}</p>
+    <p>{{ t("menus.hsmenu1") }}</p>
+    <p style="text-indent: 2em">{{ t("menus.hsmenu1-1") }}</p>
     <el-input v-model="input" />
   </div>
 </template>
 
 <script lang="ts">
+import { useI18n } from "vue-i18n";
 import { defineComponent, ref } from "vue";
 export default defineComponent({
   name: "Menu1-1",
   setup() {
+    const { t } = useI18n();
     return {
-      input: ref("")
+      input: ref(""),
+      t
     };
   }
 });

+ 7 - 4
src/views/nested/menu1/menu1-2/menu1-2-1/index.vue

@@ -1,19 +1,22 @@
 <template>
   <div>
-    <p>{{ $t("menus.hsmenu1") }}</p>
-    <p style="text-indent: 2em">{{ $t("menus.hsmenu1-2") }}</p>
-    <p style="text-indent: 4em">{{ $t("menus.hsmenu1-2-1") }}</p>
+    <p>{{ t("menus.hsmenu1") }}</p>
+    <p style="text-indent: 2em">{{ t("menus.hsmenu1-2") }}</p>
+    <p style="text-indent: 4em">{{ t("menus.hsmenu1-2-1") }}</p>
     <el-input v-model="input" />
   </div>
 </template>
 
 <script lang="ts">
+import { useI18n } from "vue-i18n";
 import { defineComponent, ref } from "vue";
 export default defineComponent({
   name: "Menu1-2-1",
   setup() {
+    const { t } = useI18n();
     return {
-      input: ref("")
+      input: ref(""),
+      t
     };
   }
 });

+ 7 - 4
src/views/nested/menu1/menu1-2/menu1-2-2/index.vue

@@ -1,19 +1,22 @@
 <template>
   <div>
-    <p>{{ $t("menus.hsmenu1") }}</p>
-    <p style="text-indent: 2em">{{ $t("menus.hsmenu1-2") }}</p>
-    <p style="text-indent: 4em">{{ $t("menus.hsmenu1-2-2") }}</p>
+    <p>{{ t("menus.hsmenu1") }}</p>
+    <p style="text-indent: 2em">{{ t("menus.hsmenu1-2") }}</p>
+    <p style="text-indent: 4em">{{ t("menus.hsmenu1-2-2") }}</p>
     <el-input v-model="input" />
   </div>
 </template>
 
 <script lang="ts">
+import { useI18n } from "vue-i18n";
 import { defineComponent, ref } from "vue";
 export default defineComponent({
   name: "Menu1-2-2",
   setup() {
+    const { t } = useI18n();
     return {
-      input: ref("")
+      input: ref(""),
+      t
     };
   }
 });

+ 6 - 3
src/views/nested/menu1/menu1-3/index.vue

@@ -1,18 +1,21 @@
 <template>
   <div>
-    <p>{{ $t("menus.hsmenu1") }}</p>
-    <p style="text-indent: 2em">{{ $t("menus.hsmenu1-3") }}</p>
+    <p>{{ t("menus.hsmenu1") }}</p>
+    <p style="text-indent: 2em">{{ t("menus.hsmenu1-3") }}</p>
     <el-input v-model="input" />
   </div>
 </template>
 
 <script lang="ts">
+import { useI18n } from "vue-i18n";
 import { defineComponent, ref } from "vue";
 export default defineComponent({
   name: "Menu1-3",
   setup() {
+    const { t } = useI18n();
     return {
-      input: ref("")
+      input: ref(""),
+      t
     };
   }
 });

+ 5 - 2
src/views/nested/menu2/index.vue

@@ -1,17 +1,20 @@
 <template>
   <div>
-    <p>{{ $t("menus.hsmenu2") }}</p>
+    <p>{{ t("menus.hsmenu2") }}</p>
     <el-input v-model="input" />
   </div>
 </template>
 
 <script lang="ts">
+import { useI18n } from "vue-i18n";
 import { defineComponent, ref } from "vue";
 export default defineComponent({
   name: "Menu2",
   setup() {
+    const { t } = useI18n();
     return {
-      input: ref("")
+      input: ref(""),
+      t
     };
   }
 });

+ 4 - 1
src/views/system/dict/config.vue

@@ -1,5 +1,6 @@
 <script setup lang="ts">
 import { reactive } from "vue";
+import { useI18n } from "vue-i18n";
 import { VxeTableEvents } from "vxe-table";
 import { templateRef } from "@vueuse/core";
 
@@ -19,6 +20,8 @@ const emit = defineEmits<{
   (e: "handleClose"): void;
 }>();
 
+const { t } = useI18n();
+
 const xTable = templateRef<any>("xTable", null);
 
 const configData = reactive({
@@ -140,7 +143,7 @@ const checkboxChangeEvent: VxeTableEvents.CheckboxChange = ({ records }) => {
               <span class="select-count"
                 >已选中{{ configData.selectRecords.length }}条</span
               >
-              <vxe-button size="small">{{ $t("buttons.hsdelete") }}</vxe-button>
+              <vxe-button size="small">{{ t("buttons.hsdelete") }}</vxe-button>
             </span>
           </template>
         </vxe-pager>

+ 7 - 4
src/views/system/dict/index.vue

@@ -7,6 +7,7 @@ export default {
 <script setup lang="ts">
 import XEUtils from "xe-utils";
 import Config from "./config.vue";
+import { useI18n } from "vue-i18n";
 import { cloneDeep } from "lodash-unified";
 import { templateRef } from "@vueuse/core";
 import { reactive, ref, unref, nextTick } from "vue";
@@ -22,6 +23,8 @@ type onEditNRow = {
   model: string;
 };
 
+const { t } = useI18n();
+
 const dictData = reactive({
   submitLoading: false,
   showEdit: false,
@@ -209,7 +212,7 @@ function handleClose() {
       <template #buttons>
         <vxe-input
           v-model="dictData.filterName"
-          :placeholder="$t('buttons.hssearch')"
+          :placeholder="t('buttons.hssearch')"
           @keyup="searchEvent"
         ></vxe-input>
       </template>
@@ -218,19 +221,19 @@ function handleClose() {
           icon="fa fa-plus-square-o"
           status="primary"
           @click="onAdd"
-          >{{ $t("buttons.hsadd") }}</vxe-button
+          >{{ t("buttons.hsadd") }}</vxe-button
         >
         <vxe-button
           icon="fa fa-folder-open-o"
           status="primary"
           @click="$refs.xTree.setAllTreeExpand(true)"
-          >{{ $t("buttons.hsexpendAll") }}</vxe-button
+          >{{ t("buttons.hsexpendAll") }}</vxe-button
         >
         <vxe-button
           icon="fa fa-folder-o"
           status="primary"
           @click="$refs.xTree.clearTreeExpand()"
-          >{{ $t("buttons.hscollapseAll") }}</vxe-button
+          >{{ t("buttons.hscollapseAll") }}</vxe-button
         >
       </template>
     </vxe-toolbar>

+ 1 - 3
vite.config.ts

@@ -16,9 +16,7 @@ const pathResolve = (dir: string): string => {
 // 设置别名
 const alias: Record<string, string> = {
   "/@": pathResolve("src"),
-  "@build": pathResolve("build"),
-  //解决开发环境下的警告
-  "vue-i18n": "vue-i18n/dist/vue-i18n.cjs.js"
+  "@build": pathResolve("build")
 };
 
 const { dependencies, devDependencies, name, version } = pkg;