ソースを参照

perf: optimize the naming of locale key

vince 10 ヶ月 前
コミット
4674380266
59 ファイル変更504 行追加822 行削除
  1. 0 3
      .tazerc.json
  2. 15 15
      apps/backend-mock/src/modules/menu/menu.controller.ts
  3. 3 3
      apps/web-antd/src/apis/modules/user.ts
  4. 2 2
      apps/web-antd/src/apis/types/user.ts
  5. 1 1
      apps/web-antd/src/bootstrap.ts
  6. 1 1
      apps/web-antd/src/forward/access.ts
  7. 1 0
      apps/web-antd/src/locales/index.ts
  8. 14 15
      apps/web-antd/src/locales/langs/en-US.json
  9. 12 12
      apps/web-antd/src/locales/langs/zh-CN.json
  10. 2 2
      apps/web-antd/src/router/routes/_essentials.ts
  11. 22 22
      apps/web-antd/src/router/routes/modules/demos.ts
  12. 2 2
      apps/web-antd/src/views/_essential/authentication/login.vue
  13. 0 0
      apps/web-antd/src/views/demos/access/backend/admin-visible.vue
  14. 0 0
      apps/web-antd/src/views/demos/access/backend/super-visible.vue
  15. 0 0
      apps/web-antd/src/views/demos/access/backend/user-visible.vue
  16. 0 0
      apps/web-antd/src/views/demos/access/frontend/admin-visible.vue
  17. 0 0
      apps/web-antd/src/views/demos/access/frontend/super-visible.vue
  18. 0 0
      apps/web-antd/src/views/demos/access/frontend/user-visible.vue
  19. 1 0
      cspell.json
  20. 1 1
      internal/lint-configs/eslint-config/package.json
  21. 1 1
      internal/lint-configs/stylelint-config/package.json
  22. 1 1
      internal/node-utils/package.json
  23. 1 1
      internal/vite-config/package.json
  24. 9 4
      package.json
  25. 1 1
      packages/@core/forward/stores/src/modules/tabbar.test.ts
  26. 2 1
      packages/@core/locales/src/index.ts
  27. 132 136
      packages/@core/locales/src/langs/en-US.json
  28. 103 106
      packages/@core/locales/src/langs/zh-CN.json
  29. 1 1
      packages/@core/shared/colorful/package.json
  30. 1 1
      packages/@core/shared/toolkit/package.json
  31. 2 2
      packages/business/layouts/src/authentication/authentication.vue
  32. 8 8
      packages/business/layouts/src/basic/tabbar/use-tabs.ts
  33. 1 1
      packages/business/layouts/src/widgets/global-search/global-search.vue
  34. 2 2
      packages/business/layouts/src/widgets/global-search/search-panel.vue
  35. 2 2
      packages/business/layouts/src/widgets/layout-toggle.vue
  36. 4 4
      packages/business/layouts/src/widgets/notification/notification.vue
  37. 1 1
      packages/business/layouts/src/widgets/preferences/blocks/general/general.vue
  38. 1 1
      packages/business/layouts/src/widgets/preferences/blocks/layout/breadcrumb.vue
  39. 3 3
      packages/business/layouts/src/widgets/preferences/blocks/layout/copyright.vue
  40. 4 4
      packages/business/layouts/src/widgets/preferences/blocks/layout/header.vue
  41. 8 8
      packages/business/layouts/src/widgets/preferences/blocks/layout/layout.vue
  42. 4 4
      packages/business/layouts/src/widgets/preferences/blocks/layout/navigation.vue
  43. 1 1
      packages/business/layouts/src/widgets/preferences/blocks/layout/sidebar.vue
  44. 5 5
      packages/business/layouts/src/widgets/preferences/blocks/layout/widget.vue
  45. 4 4
      packages/business/layouts/src/widgets/preferences/blocks/shortcut-keys/global.vue
  46. 3 3
      packages/business/layouts/src/widgets/preferences/blocks/theme/builtin.vue
  47. 2 2
      packages/business/layouts/src/widgets/preferences/blocks/theme/color-mode.vue
  48. 2 2
      packages/business/layouts/src/widgets/preferences/blocks/theme/theme.vue
  49. 10 14
      packages/business/layouts/src/widgets/preferences/preferences-sheet.vue
  50. 1 1
      packages/business/layouts/src/widgets/theme-toggle/theme-toggle.vue
  51. 1 1
      packages/business/layouts/src/widgets/user-dropdown/user-dropdown.vue
  52. 5 5
      packages/business/universal-ui/src/authentication/code-login.vue
  53. 4 4
      packages/business/universal-ui/src/authentication/forget-password.vue
  54. 10 10
      packages/business/universal-ui/src/authentication/login.vue
  55. 3 3
      packages/business/universal-ui/src/authentication/qrcode-login.vue
  56. 15 15
      packages/business/universal-ui/src/authentication/register.vue
  57. 1 1
      packages/business/universal-ui/src/authentication/third-party-login.vue
  58. 8 8
      packages/business/universal-ui/src/fallback/fallback.vue
  59. 60 371
      pnpm-lock.yaml

+ 0 - 3
.tazerc.json

@@ -1,3 +0,0 @@
-{
-  "exclude": ["zx", "eslint", "eslint-plugin-unused-imports"]
-}

+ 15 - 15
apps/backend-mock/src/modules/menu/menu.controller.ts

@@ -50,31 +50,31 @@ export class MenuController {
     const createDemosMenus = (role: 'admin' | 'super' | 'user') => {
       const roleWithMenus = {
         admin: {
-          component: '/demos/access/backend/access-test-2',
+          component: '/demos/access/backend/admin-visible',
           meta: {
             icon: 'mdi:button-cursor',
-            title: 'page.demos.access.access-test-2',
+            title: 'page.demos.access.adminVisible',
           },
-          name: 'AccessBackendTest2',
-          path: 'access-test-2',
+          name: 'AccessBackendAdminVisible',
+          path: 'admin-visible',
         },
         super: {
-          component: '/demos/access/backend/access-test-1',
+          component: '/demos/access/backend/super-visible',
           meta: {
             icon: 'mdi:button-cursor',
-            title: 'page.demos.access.access-test-1',
+            title: 'page.demos.access.superVisible',
           },
-          name: 'AccessBackendTest1',
-          path: 'access-test-1',
+          name: 'AccessBackendSuperVisible',
+          path: 'super-visible',
         },
         user: {
-          component: '/demos/access/backend/access-test-3',
+          component: '/demos/access/backend/user-visible',
           meta: {
             icon: 'mdi:button-cursor',
-            title: 'page.demos.access.access-test-3',
+            title: 'page.demos.access.userVisible',
           },
-          name: 'AccessBackendTest3',
-          path: 'access-test-3',
+          name: 'AccessBackendUserVisible',
+          path: 'user-visible',
         },
       };
 
@@ -105,7 +105,7 @@ export class MenuController {
                   path: 'backend',
                   meta: {
                     icon: 'mdi:cloud-key-outline',
-                    title: 'page.demos.access.backend-control',
+                    title: 'page.demos.access.backendControl',
                   },
                   redirect: '/demos/access/backend/page-control',
                   children: [
@@ -115,7 +115,7 @@ export class MenuController {
                       component: '/demos/access/backend/index',
                       meta: {
                         icon: 'mdi:page-previous-outline',
-                        title: 'page.demos.access.page',
+                        title: 'page.demos.access.pageAccess',
                       },
                     },
                     {
@@ -124,7 +124,7 @@ export class MenuController {
                       component: '/demos/access/backend/button-control',
                       meta: {
                         icon: 'mdi:button-cursor',
-                        title: 'page.demos.access.button',
+                        title: 'page.demos.access.buttonControl',
                       },
                     },
                     roleWithMenus[role],

+ 3 - 3
apps/web-antd/src/apis/modules/user.ts

@@ -1,14 +1,14 @@
 import type { UserInfo } from '@vben/types';
 
-import type { UserApiType } from '../types';
+import type { UserApi } from '../types';
 
 import { requestClient } from '#/forward';
 
 /**
  * 登录
  */
-async function userLogin(data: UserApiType.LoginParams) {
-  return requestClient.post<UserApiType.LoginResult>('/auth/login', data);
+async function userLogin(data: UserApi.LoginParams) {
+  return requestClient.post<UserApi.LoginResult>('/auth/login', data);
 }
 
 /**

+ 2 - 2
apps/web-antd/src/apis/types/user.ts

@@ -1,4 +1,4 @@
-namespace UserApiType {
+namespace UserApi {
   /** 登录接口参数 */
   export interface LoginParams {
     password: string;
@@ -16,4 +16,4 @@ namespace UserApiType {
   }
 }
 
-export type { UserApiType };
+export type { UserApi };

+ 1 - 1
apps/web-antd/src/bootstrap.ts

@@ -17,7 +17,7 @@ async function bootstrap(namespace: string) {
   await setupI18n(app, {
     defaultLocale: preferences.app.locale,
     loadMessages,
-    missingWarn: import.meta.env.PROD,
+    missingWarn: !import.meta.env.PROD,
   });
 
   // 配置 pinia-store

+ 1 - 1
apps/web-antd/src/forward/access.ts

@@ -25,7 +25,7 @@ async function generateAccess(options: GeneratorMenuAndRoutesOptions) {
     ...options,
     fetchMenuListAsync: async () => {
       message.loading({
-        content: `${$t('common.loading-menu')}...`,
+        content: `${$t('common.loadingMenu')}...`,
         duration: 1.5,
       });
       return await getAllMenus();

+ 1 - 0
apps/web-antd/src/locales/index.ts

@@ -16,6 +16,7 @@ const localesMap = loadLocalesMap(modules);
 
 /**
  * 加载应用特有的语言包
+ * 这里也可以改造为从服务端获取翻译数据
  * @param lang
  */
 async function loadMessages(lang: SupportedLanguagesType) {

+ 14 - 15
apps/web-antd/src/locales/langs/en-US.json

@@ -4,29 +4,28 @@
       "title": "Demos",
       "access": {
         "title": "Access Control",
-        "frontend-control": "Front-end Control",
-        "backend-control": "Backend Control",
-        "page": "Page visit",
-        "button": "Button control",
-        "loading-menu": "In the loading menu",
-        "access-test-1": "Super visit",
-        "access-test-2": "Admin visit",
-        "access-test-3": "User visit"
+        "frontendControl": "Frontend Control",
+        "backendControl": "Backend Control",
+        "pageAccess": "Page Access",
+        "buttonControl": "Button Control",
+        "superVisible": "Visible to Super",
+        "adminVisible": "Visible to Admin",
+        "userVisible": "Visible to User"
       },
       "nested": {
         "title": "Nested Menu",
         "menu1": "Menu 1",
         "menu2": "Menu 2",
-        "menu21": "Menu 2-1",
+        "menu2_1": "Menu 2-1",
         "menu3": "Menu 3",
-        "menu31": "Menu 3-1",
-        "menu32": "Menu 3-2",
-        "menu321": "Menu 3-2-1"
+        "menu3_1": "Menu 3-1",
+        "menu3_2": "Menu 3-2",
+        "menu3_2_1": "Menu 3-2-1"
       },
       "outside": {
-        "title": "External Page",
-        "embedded": "embedded Page",
-        "external-link": "External Link"
+        "title": "External Pages",
+        "embedded": "Embedded",
+        "externalLink": "External Link"
       },
       "fallback": { "title": "Fallback Page" }
     }

+ 12 - 12
apps/web-antd/src/locales/langs/zh-CN.json

@@ -4,28 +4,28 @@
       "title": "演示",
       "access": {
         "title": "访问控制",
-        "frontend-control": "前端控制",
-        "backend-control": "后端控制",
-        "page": "页面访问",
-        "button": "按钮控制",
-        "access-test-1": "Super 可见",
-        "access-test-2": "Admin 可见",
-        "access-test-3": "User 可见"
+        "frontendControl": "前端控制",
+        "backendControl": "后端控制",
+        "pageAccess": "页面访问",
+        "buttonControl": "按钮控制",
+        "superVisible": "Super 可见",
+        "adminVisible": "Admin 可见",
+        "userVisible": "User 可见"
       },
       "nested": {
         "title": "嵌套菜单",
         "menu1": "菜单 1",
         "menu2": "菜单 2",
-        "menu21": "菜单 2-1",
+        "menu2_1": "菜单 2-1",
         "menu3": "菜单 3",
-        "menu31": "菜单 3-1",
-        "menu32": "菜单 3-2",
-        "menu321": "菜单 3-2-1"
+        "menu3_1": "菜单 3-1",
+        "menu3_2": "菜单 3-2",
+        "menu3_2_1": "菜单 3-2-1"
       },
       "outside": {
         "title": "外部页面",
         "embedded": "内嵌",
-        "external-link": "外链"
+        "externalLink": "外链"
       },
       "fallback": {
         "title": "缺省页"

+ 2 - 2
apps/web-antd/src/router/routes/_essentials.ts

@@ -60,7 +60,7 @@ const essentialsRoutes: RouteRecordRaw[] = [
         component: () =>
           import('#/views/_essential/authentication/qrcode-login.vue'),
         meta: {
-          title: $t('page.essentials.qrcode-login'),
+          title: $t('page.essentials.qrcodeLogin'),
         },
       },
       {
@@ -69,7 +69,7 @@ const essentialsRoutes: RouteRecordRaw[] = [
         component: () =>
           import('#/views/_essential/authentication/forget-password.vue'),
         meta: {
-          title: $t('page.essentials.forget-password'),
+          title: $t('page.essentials.forgetPassword'),
         },
       },
       {

+ 22 - 22
apps/web-antd/src/router/routes/modules/demos.ts

@@ -31,7 +31,7 @@ const routes: RouteRecordRaw[] = [
             redirect: '/demos/access/frontend/page-control',
             meta: {
               icon: 'mdi:table-key',
-              title: $t('page.demos.access.frontend-control'),
+              title: $t('page.demos.access.frontendControl'),
             },
             children: [
               {
@@ -41,7 +41,7 @@ const routes: RouteRecordRaw[] = [
                   import('#/views/demos/access/frontend/index.vue'),
                 meta: {
                   icon: 'mdi:page-previous-outline',
-                  title: $t('page.demos.access.page'),
+                  title: $t('page.demos.access.pageAccess'),
                 },
               },
               {
@@ -51,40 +51,40 @@ const routes: RouteRecordRaw[] = [
                   import('#/views/demos/access/frontend/button-control.vue'),
                 meta: {
                   icon: 'mdi:button-cursor',
-                  title: $t('page.demos.access.button'),
+                  title: $t('page.demos.access.buttonControl'),
                 },
               },
               {
-                name: 'AccessFrontendTest1',
-                path: 'access-test-1',
+                name: 'AccessFrontendSuperVisible',
+                path: 'super-visible',
                 component: () =>
-                  import('#/views/demos/access/frontend/access-test-1.vue'),
+                  import('#/views/demos/access/frontend/super-visible.vue'),
                 meta: {
                   authority: ['super'],
                   icon: 'mdi:button-cursor',
-                  title: $t('page.demos.access.access-test-1'),
+                  title: $t('page.demos.access.superVisible'),
                 },
               },
               {
-                name: 'AccessFrontendTest2',
-                path: 'access-test-2',
+                name: 'AccessFrontendAdminVisible',
+                path: 'admin-visible',
                 component: () =>
-                  import('#/views/demos/access/frontend/access-test-2.vue'),
+                  import('#/views/demos/access/frontend/admin-visible.vue'),
                 meta: {
                   authority: ['admin'],
                   icon: 'mdi:button-cursor',
-                  title: $t('page.demos.access.access-test-2'),
+                  title: $t('page.demos.access.adminVisible'),
                 },
               },
               {
-                name: 'AccessFrontendTest3',
-                path: 'access-test-3',
+                name: 'AccessFrontendUserVisible',
+                path: 'user-visible',
                 component: () =>
-                  import('#/views/demos/access/frontend/access-test-3.vue'),
+                  import('#/views/demos/access/frontend/user-visible.vue'),
                 meta: {
                   authority: ['user'],
                   icon: 'mdi:button-cursor',
-                  title: $t('page.demos.access.access-test-3'),
+                  title: $t('page.demos.access.userVisible'),
                 },
               },
             ],
@@ -95,7 +95,7 @@ const routes: RouteRecordRaw[] = [
             component: () => import('#/views/demos/access/backend/index.vue'),
             meta: {
               icon: 'mdi:cloud-key-outline',
-              title: $t('page.demos.access.backend-control'),
+              title: $t('page.demos.access.backendControl'),
             },
             children: [
               {
@@ -105,7 +105,7 @@ const routes: RouteRecordRaw[] = [
                   import('#/views/demos/access/frontend/index.vue'),
                 meta: {
                   icon: 'mdi:page-previous-outline',
-                  title: $t('page.demos.access.page'),
+                  title: $t('page.demos.access.pageAccess'),
                 },
               },
             ],
@@ -209,7 +209,7 @@ const routes: RouteRecordRaw[] = [
             path: 'external-link',
             meta: {
               icon: 'mdi:newspaper-variant-multiple-outline',
-              title: $t('page.demos.outside.external-link'),
+              title: $t('page.demos.outside.externalLink'),
             },
             redirect: '/outside/external-link/vite',
             children: [
@@ -273,7 +273,7 @@ const routes: RouteRecordRaw[] = [
                 meta: {
                   icon: 'ic:round-menu',
                   keepAlive: true,
-                  title: $t('page.demos.nested.menu21'),
+                  title: $t('page.demos.nested.menu2_1'),
                 },
               },
             ],
@@ -294,7 +294,7 @@ const routes: RouteRecordRaw[] = [
                 meta: {
                   icon: 'ic:round-menu',
                   keepAlive: true,
-                  title: $t('page.demos.nested.menu31'),
+                  title: $t('page.demos.nested.menu3_1'),
                 },
               },
               {
@@ -302,7 +302,7 @@ const routes: RouteRecordRaw[] = [
                 path: 'menu3-2',
                 meta: {
                   icon: 'ic:round-menu',
-                  title: $t('page.demos.nested.menu32'),
+                  title: $t('page.demos.nested.menu3_2'),
                 },
                 redirect: '/nested/menu3/menu3-2/menu3-2-1',
                 children: [
@@ -314,7 +314,7 @@ const routes: RouteRecordRaw[] = [
                     meta: {
                       icon: 'ic:round-menu',
                       keepAlive: true,
-                      title: $t('page.demos.nested.menu321'),
+                      title: $t('page.demos.nested.menu3_2_1'),
                     },
                   },
                 ],

+ 2 - 2
apps/web-antd/src/views/_essential/authentication/login.vue

@@ -20,9 +20,9 @@ async function handleLogin(params: LoginAndRegisterParams) {
   const { userInfo } = await accessStore.authLogin(params);
   if (userInfo?.realName) {
     notification.success({
-      description: `${$t('authentication.login-success-desc')}:${userInfo?.realName}`,
+      description: `${$t('authentication.loginSuccessDesc')}:${userInfo?.realName}`,
       duration: 3,
-      message: $t('authentication.login-success'),
+      message: $t('authentication.loginSuccess'),
     });
   }
 }

+ 0 - 0
apps/web-antd/src/views/demos/access/backend/access-test-2.vue → apps/web-antd/src/views/demos/access/backend/admin-visible.vue


+ 0 - 0
apps/web-antd/src/views/demos/access/backend/access-test-1.vue → apps/web-antd/src/views/demos/access/backend/super-visible.vue


+ 0 - 0
apps/web-antd/src/views/demos/access/backend/access-test-3.vue → apps/web-antd/src/views/demos/access/backend/user-visible.vue


+ 0 - 0
apps/web-antd/src/views/demos/access/frontend/access-test-2.vue → apps/web-antd/src/views/demos/access/frontend/admin-visible.vue


+ 0 - 0
apps/web-antd/src/views/demos/access/frontend/access-test-1.vue → apps/web-antd/src/views/demos/access/frontend/super-visible.vue


+ 0 - 0
apps/web-antd/src/views/demos/access/frontend/access-test-3.vue → apps/web-antd/src/views/demos/access/frontend/user-visible.vue


+ 1 - 0
cspell.json

@@ -27,6 +27,7 @@
     "sonner",
     "unplugin",
     "vben",
+    "vbenjs",
     "vueuse",
     "yxxx",
     "nuxt",

+ 1 - 1
internal/lint-configs/eslint-config/package.json

@@ -46,7 +46,7 @@
     "eslint-plugin-prettier": "^5.1.3",
     "eslint-plugin-regexp": "^2.6.0",
     "eslint-plugin-unicorn": "^54.0.0",
-    "eslint-plugin-unused-imports": "^3.2.0",
+    "eslint-plugin-unused-imports": "^4.0.0",
     "eslint-plugin-vitest": "^0.5.4",
     "eslint-plugin-vue": "^9.27.0",
     "globals": "^15.8.0",

+ 1 - 1
internal/lint-configs/stylelint-config/package.json

@@ -30,7 +30,7 @@
   "dependencies": {
     "@stylistic/stylelint-plugin": "^2.1.2",
     "stylelint-config-recess-order": "^5.0.1",
-    "stylelint-scss": "^6.4.0"
+    "stylelint-scss": "^6.4.1"
   },
   "devDependencies": {
     "postcss": "^8.4.39",

+ 1 - 1
internal/node-utils/package.json

@@ -37,6 +37,6 @@
     "pkg-types": "^1.1.3",
     "prettier": "^3.3.2",
     "rimraf": "^6.0.0",
-    "zx": "^7.2.3"
+    "zx": "^8.1.4"
   }
 }

+ 1 - 1
internal/vite-config/package.json

@@ -46,7 +46,7 @@
     "rollup": "^4.18.1",
     "rollup-plugin-visualizer": "^5.12.0",
     "sass": "^1.77.7",
-    "unplugin-turbo-console": "^1.9.0",
+    "unplugin-turbo-console": "^1.9.2",
     "vite": "^5.3.3",
     "vite-plugin-compression": "^0.5.1",
     "vite-plugin-dts": "^3.9.1",

+ 9 - 4
package.json

@@ -44,7 +44,8 @@
     "publint": "vsh publint",
     "reinstall": "pnpm clean --del-lock && pnpm bootstrap",
     "test": "vitest",
-    "version": "pnpm exec changeset version && pnpm install --no-frozen-lockfile"
+    "version": "pnpm exec changeset version && pnpm install --no-frozen-lockfile",
+    "update:deps": " pnpm update --latest --recursive"
   },
   "devDependencies": {
     "@changesets/changelog-github": "^0.5.0",
@@ -68,7 +69,6 @@
     "is-ci": "^3.0.1",
     "jsdom": "^24.1.0",
     "rimraf": "^6.0.0",
-    "taze": "^0.14.2",
     "turbo": "^2.0.6",
     "typescript": "^5.5.3",
     "unbuild": "^2.0.0",
@@ -88,6 +88,12 @@
       "clsx": "^2.1.1",
       "vue": "^3.4.31"
     },
+    "peerDependencyRules": {
+      "allowedVersions": {
+        "eslint": "*",
+        " @typescript-eslint/eslint-plugin": "*"
+      }
+    },
     "neverBuiltDependencies": [
       "canvas",
       "node-gyp",
@@ -95,8 +101,7 @@
     ],
     "updateConfig": {
       "ignoreDependencies": [
-        "eslint",
-        "zx"
+        "eslint"
       ]
     }
   }

+ 1 - 1
packages/@core/forward/stores/src/modules/tabbar.test.ts

@@ -101,7 +101,7 @@ describe('useCoreAccessStore', () => {
     const store = useCoreTabbarStore();
     store.cachedTabs.add('Home');
     store.cachedTabs.add('About');
-    expect(store.cachedTabs).toEqual(['Home', 'About']);
+    expect(store.getCachedTabs).toEqual(['Home', 'About']);
   });
 
   it('returns all tabs, including affix tabs', () => {

+ 2 - 1
packages/@core/locales/src/index.ts

@@ -28,10 +28,11 @@ async function setupI18n(app: App, options: LocaleSetupOptions = {}) {
 
   // 在控制台打印警告
   i18n.global.setMissingHandler((locale, key) => {
-    options.missingWarn &&
+    if (options.missingWarn && key.includes('.')) {
       console.warn(
         `[intlify] Not found '${key}' key in '${locale}' locale messages.`,
       );
+    }
   });
 }
 

+ 132 - 136
packages/@core/locales/src/langs/en-US.json

@@ -3,9 +3,9 @@
     "essentials": {
       "login": "Login",
       "register": "Register",
-      "code-login": "Code Login",
-      "qrcode-login": "Qrcode Login",
-      "forget-password": "Forget Password"
+      "codeLogin": "Code Login",
+      "qrcodeLogin": "Qr Code Login",
+      "forgetPassword": "Forget Password"
     },
     "dashboard": {
       "title": "Dashboard",
@@ -19,197 +19,193 @@
   },
   "common": {
     "back": "Back",
-    "back-to-home": "Back To Home",
+    "backToHome": "Back To Home",
     "login": "Login",
     "logout": "Logout",
     "prompt": "Prompt",
     "cancel": "Cancel",
     "confirm": "Comfirm",
-    "not-data": "No data",
-    "refresh": "Refresh"
+    "noData": "No Data",
+    "refresh": "Refresh",
+    "loadingMenu": "Loading Menu"
   },
   "fallback": {
-    "page-not-found": "Oops! Page Not Found",
-    "page-not-found-desc": "Sorry, we couldn't find the page you were looking for.",
+    "pageNotFound": "Oops! Page Not Found",
+    "pageNotFoundDesc": "Sorry, we couldn't find the page you were looking for.",
     "forbidden": "Oops! Access Denied",
-    "forbidden-desc": "Sorry, but you don't have permission to access this page.",
-    "internal-error": "Oops! Something Went Wrong",
-    "internal-error-desc": "Sorry, but the server encountered an error.",
+    "forbiddenDesc": "Sorry, but you don't have permission to access this page.",
+    "internalError": "Oops! Something Went Wrong",
+    "internalErrorDesc": "Sorry, but the server encountered an error.",
     "offline": "Offline Page",
-    "offline-error": "Oops! Network Error",
-    "offline-error-desc": "Sorry, can't connect to the internet. Check your connection.",
-    "coming-soon": "Coming soon"
+    "offlineError": "Oops! Network Error",
+    "offlineErrorDesc": "Sorry, can't connect to the internet. Check your connection.",
+    "coming-soon": "Coming Soon"
   },
   "widgets": {
     "document": "Document",
-    "qa": "FAQ & Help",
-    "setting": "Setting",
-    "logout-tip": "Do you want to log out?",
-    "view-all": "View all messages",
+    "qa": "Q&A",
+    "setting": "Settings",
+    "logoutTip": "Do you want to logout?",
+    "viewAll": "View All Messages",
     "notifications": "Notifications",
-    "make-all-as-read": "Make all as read",
-    "clear-notifications": "Clear",
+    "markAllAsRead": "Make All as Read",
+    "clearNotifications": "Clear",
     "search": {
       "title": "Search",
-      "search-navigate": "Search Navigate",
-      "select": "To select",
-      "navigate": "To navigate",
-      "close": "To close",
-      "no-results": "No results for",
-      "no-recent": "No recent searches",
-      "recent": "Recent"
+      "searchNavigate": "Search Navigation",
+      "select": "Select",
+      "navigate": "Navigate",
+      "close": "Close",
+      "noResults": "No Search Results Found",
+      "noRecent": "No Search History",
+      "recent": "Search History"
     }
   },
   "authentication": {
-    "welcome-back": "Welcome Back",
-    "page-title": "Plug-and-play backend system",
-    "page-desc": "Efficient, versatile frontend template",
-    "login-success": "Login successful",
-    "login-success-desc": "Welcome back",
-    "login-subtitle": "Enter your account details to manage your projects",
+    "welcomeBack": "Welcome Back",
+    "pageTitle": "Plug-and-play Admin system",
+    "pageDesc": "Efficient, versatile frontend template",
+    "loginSuccess": "Login Successful",
+    "loginSuccessDesc": "Welcome Back",
+    "loginSubtitle": "Enter your account details to manage your projects",
     "username": "Username",
     "password": "Password",
-    "username-tip": "Username is required",
-    "password-tip": "Password is required",
-    "remember-me": "Remember Me",
-    "create-an-account": "Create an account",
-    "create-account": "Create account",
-    "already-account": "Already have an account?",
-    "account-tip": "Don't have an account yet?",
-    "sign-up": "Sign Up",
-    "sign-up-subtitle": "Make managing your applications simple and fun",
-    "comfirm-password": "Comfirm Password",
-    "comfirm-password-tip": "The passwords entered twice do not match",
-    "sign-up-agree": "I agree to",
-    "sign-up-privacy-policy": "Privacy-policy",
-    "sign-up-terms": "Terms",
-    "sign-up-agree-tip": "Please agree to the Privacy Policy and Terms",
-    "go-login": "Login instead",
-    "password-strength": "Use 8 or more characters with a mix of letters, numbers & symbols",
-    "forget-password": "Forget Password?",
-    "forget-password-subtitle": "Enter your email and we'll send you instructions to reset your password",
-    "email-tip": "Email is required",
-    "send-reset-link": "Send Reset Link",
+    "usernameTip": "Please enter username",
+    "passwordTip": "Please enter password",
+    "rememberMe": "Remember Me",
+    "createAnAccount": "Create an Account",
+    "createAccount": "Create Account",
+    "alreadyHaveAccount": "Already have an account?",
+    "accountTip": "Don't have an account?",
+    "signUp": "Sign Up",
+    "signUpSubtitle": "Make managing your applications simple and fun",
+    "confirmPassword": "Comfirm Password",
+    "confirmPasswordTip": "The passwords do not match",
+    "agree": "I agree to",
+    "agreeprivacyPolicy": "Privacy-policy",
+    "terms": "Terms",
+    "agreeTip": "Please agree to the Privacy Policy and Terms",
+    "goToLogin": "Login instead",
+    "passwordStrength": "Use 8 or more characters with a mix of letters, numbers & symbols",
+    "forgetPassword": "Forget Password?",
+    "forgetPasswordSubtitle": "Enter your email and we'll send you instructions to reset your password",
+    "emailTip": "Please enter email",
+    "sendResetLink": "Send Reset Link",
     "email": "Email",
-    "qrcode-subtitle": "Please scan the QR code to log in on your mobile device",
-    "qrcode-prompt": "Scanning the code to complete the login",
-    "qrcode-login": "QR Login",
-    "code-subtitle": "Please enter your phone number to start managing your projects",
+    "qrcodeSubtitle": "Scan the QR code with your phone to login",
+    "qrcodePrompt": "Click 'Confirm' after scanning to complete login",
+    "qrcodeLogin": "QR Code Login",
+    "codeSubtitle": "Enter your phone number to start managing your project",
     "code": "Security code",
-    "code-tip": "Security code is required",
+    "codeTip": "Security code is required",
     "mobile": "Mobile",
-    "mobile-login": "Mobile Login",
-    "mobile-tip": "Mobile is required",
-    "send-code": "Get Security code",
-    "send-text": "Reacquire in {0}s",
-    "third-party-login": "Or continue with",
+    "mobileLogin": "Mobile Login",
+    "mobile-tip": "Please enter phone number",
+    "sendCode": "Get Security code",
+    "sendText": "Resend in {0}s",
+    "thirdPartyLogin": "Or continue with",
     "layout": {
       "center": "Align Center",
-      "align-left": "Align Left",
-      "align-right": "Align Right"
+      "alignLeft": "Align Left",
+      "alignRight": "Align Right"
     }
   },
   "preferences": {
     "title": "Preferences",
     "subtitle": "Customize Preferences & Preview in Real Time",
-    "reset-tip": "The data has changed, click to reset",
-    "reset-title": "Preferences reset",
-    "reset-success": "Preferences reset successfully",
+    "resetTip": "Data has changed, click to reset",
+    "resetTitle": "Reset Preferences",
+    "resetSuccess": "Preferences reset successfully",
     "appearance": "Appearance",
     "layout": "Layout",
     "content": "Content",
     "other": "Other",
-    "wide": "Fluid",
-    "compact": "Fixed Width",
-    "follow-system": "Follow System",
+    "wide": "Wide",
+    "compact": "Fixed",
+    "followSystem": "Follow System",
     "vertical": "Vertical",
-    "vertical-tip": "Side Vertical Menu Mode",
+    "verticalTip": "Side vertical menu mode",
     "horizontal": "Horizontal",
-    "horizontal-tip": "Top Horizontal Menu",
-    "two-column": "Two Column",
-    "two-column-tip": "Vertical Two Column Menu Mode",
-    "mixed-menu": "Mixed Menu",
-    "split-menu": "Split Menu",
-    "mixed-menu-tip": "Vertical & Horizontal Menu Co-exists",
-    "full-content": "Full Content",
-    "full-content-tip": "Display only the main content, no menus",
-    "weak-mode": "Color Weak Mode",
-    "gray-mode": "Gray Mode",
+    "horizontalTip": "Horizontal menu mode, all menus displayed at the top",
+    "twoColumn": "Two Column",
+    "twoColumnTip": "Vertical Two Column Menu Mode",
+    "mixedMenu": "Mixed Menu",
+    "mixedMenuTip": "Vertical & Horizontal Menu Co-exists",
+    "fullContent": "Full Content",
+    "fullContentTip": "Only display content body, hide all menus",
     "normal": "Normal",
     "plain": "Plain",
     "rounded": "Rounded",
-    "interface-control": "Interface Layout Control",
-    "copy": "Copy Preferences",
-    "copy-success": "Copy successful. Please replace in `src/preferences.ts` of the app",
-    "clear-and-logout": "Clear Cache & Logout",
+    "copyPreferences": "Copy Preferences",
+    "copyPreferencesSuccess": "Copy successful, please override in `src/preferences.ts` under app",
+    "clearAndLogout": "Clear Cache & Logout",
     "mode": "Mode",
-    "logo-visible": "Display Logo",
     "general": "General",
     "language": "Language",
-    "dynamic-title": "Dynamic Title",
+    "dynamicTitle": "Dynamic Title",
     "sidebar": {
       "title": "Sidebar",
       "width": "Width",
-      "visible": "Display Sidebar",
+      "visible": "Show Sidebar",
       "collapsed": "Collpase Menu",
-      "collapsed-show-title": "Display menu name"
+      "collapsedShowTitle": "Show Menu Title"
     },
     "tabbar": {
       "title": "Tabbar",
       "enable": "Enable Tab Bar",
-      "icon": "Display Tabbar Icon",
-      "persist": "Persistent tabs",
-      "context-menu": {
+      "icon": "Show Tabbar Icon",
+      "persist": "Persist Tabs",
+      "contextMenu": {
         "reload": "Reload",
-        "close": "Close",
-        "pin": "Pin",
-        "unpin": "Unpin",
-        "close-left": "Close Left",
-        "close-right": "Close Right",
-        "close-other": "Close Other",
-        "close-all": "Close All"
+        "close": "Close Tab",
+        "pin": "Pin Tab",
+        "unpin": "Unpin Tab",
+        "closeLeft": "Close Left Tabs",
+        "closeRight": "Close Right Tabs",
+        "closeOther": "Close Other Tabs",
+        "closeAll": "Close All Tabs"
       }
     },
-    "navigation-menu": {
+    "navigationMenu": {
       "title": "Navigation Menu",
-      "style": "Navigation menu style",
+      "style": "Navigation Menu Style",
+      "accordion": "Sidebar Accordion Menu",
       "split": "Navigation Menu Separation",
-      "accordion": "Sidebar Navigation Menu Accordion mode",
-      "split-tip": "When enabled, the sidebar shows the top bar's submenu"
+      "splitTip": "When enabled, the sidebar displays the top bar's submenu"
     },
     "breadcrumb": {
       "title": "Breadcrumb",
-      "home": "Display the home button",
+      "home": "Show Home Button",
       "enable": "Enable Breadcrumb",
-      "icon": "Display breadcrumb icon",
+      "icon": "Show Breadcrumb Icon",
       "background": "background",
-      "style": "Breadcrumb Type",
-      "hide-only-one": "Hidden when only one left"
+      "style": "Breadcrumb Style",
+      "hideOnlyOne": "Hidden when only one"
     },
     "animation": {
       "title": "Animation",
-      "loading": "Page transition loading",
-      "transition": "Page transition animation",
-      "progress": "Page transition progress"
+      "loading": "Page Loading",
+      "transition": "Page Transition",
+      "progress": "Page Progress"
     },
     "theme": {
       "title": "Theme",
       "radius": "Radius",
       "light": "Light",
       "dark": "Dark",
-      "dark-menu": "Semi Dark Menu",
-      "weak-mode": "Color Weak Mode",
-      "gray-mode": "Gray Mode",
+      "darkMenu": "Semi Dark Menu",
+      "weakMode": "Weak Mode",
+      "grayMode": "Gray Mode",
       "builtin": {
         "title": "Built-in",
         "default": "Default",
         "violet": "Violet",
         "pink": "Pink",
         "rose": "Rose",
-        "sky-blue": "Sky Blue",
-        "deep-blue": "Deep Blue",
+        "skyBlue": "Sky Blue",
+        "deepBlue": "Deep Blue",
         "green": "Green",
-        "deep-green": "Deep Green",
+        "deepGreen": "Deep Green",
         "orange": "Orange",
         "yellow": "Yellow",
         "zinc": "Zinc",
@@ -221,27 +217,27 @@
     },
     "header": {
       "title": "Header",
-      "visible": "Display Header",
-      "mode-static": "Static",
-      "mode-fixed": "Fixed",
-      "mode-auto": "Auto hide/display",
-      "mode-auto-scroll": "Scroll hide/display"
+      "visible": "Show Header",
+      "modeStatic": "Static",
+      "modeFixed": "Fixed",
+      "modeAuto": "Auto hide & Show",
+      "modeAutoScroll": "Scroll to Hide & Show"
     },
     "footer": {
       "title": "Footer",
-      "visible": "Display Footer",
-      "fixed": "Fixed at the bottom"
+      "visible": "Show Footer",
+      "fixed": "Fixed at Bottom"
     },
     "copyright": {
       "title": "Copyright",
-      "enable": "Enable copyright",
-      "company-name": "Company name",
-      "company-site-link": "Company homepage",
+      "enable": "Enable Copyright",
+      "companyName": "Company Name",
+      "companySiteLink": "Company Site Link",
       "date": "Date",
-      "icp": "ICP number",
-      "icp-link": "ICP Site Link"
+      "icp": "ICP License Number",
+      "icpLink": "ICP Site Link"
     },
-    "shortcut-keys": {
+    "shortcutKeys": {
       "title": "Shortcut Keys",
       "global": "Global",
       "search": "Global Search",
@@ -250,13 +246,13 @@
     },
     "widget": {
       "title": "Widget",
-      "global-search": "Enable Global Search",
+      "globalSearch": "Enable Global Search",
       "fullscreen": "Enable Fullscreen",
-      "theme-toggle": "Enable Theme Toggle",
-      "language-toggle": "Enable Language Toggle",
+      "themeToggle": "Enable Theme Toggle",
+      "languageToggle": "Enable Language Toggle",
       "notification": "Enable Notification",
-      "sidebar-toggle": "Enable Sidebar Toggle",
-      "ai-assistant": "Enable AI Assistant"
+      "sidebarToggle": "Enable Sidebar Toggle",
+      "aiAssistant": "Enable AI Assistant"
     }
   }
 }

+ 103 - 106
packages/@core/locales/src/langs/zh-CN.json

@@ -3,9 +3,9 @@
     "essentials": {
       "login": "登陆",
       "register": "注册",
-      "code-login": "验证码登陆",
-      "qrcode-login": "二维码登陆",
-      "forget-password": "忘记密码"
+      "codeLogin": "验证码登陆",
+      "qrcodeLogin": "二维码登陆",
+      "forgetPassword": "忘记密码"
     },
     "dashboard": {
       "title": "概览",
@@ -19,162 +19,159 @@
   },
   "common": {
     "back": "返回",
-    "back-to-home": "返回首页",
+    "backToHome": "返回首页",
     "login": "登录",
     "logout": "退出登录",
     "prompt": "提示",
     "cancel": "取消",
     "confirm": "确认",
-    "not-data": "暂无数据",
+    "noData": "暂无数据",
     "refresh": "刷新",
-    "loading-menu": "加载菜单中"
+    "loadingMenu": "加载菜单中"
   },
   "fallback": {
-    "page-not-found": "哎呀!未找到页面",
-    "page-not-found-desc": "抱歉,我们无法找到您要找的页面。",
+    "pageNotFound": "哎呀!未找到页面",
+    "pageNotFoundDesc": "抱歉,我们无法找到您要找的页面。",
     "forbidden": "哎呀!访问被拒绝",
-    "forbidden-desc": "抱歉,您没有权限访问此页面。",
-    "internal-error": "哎呀!出错了",
-    "internal-error-desc": "抱歉,服务器遇到错误。",
+    "forbiddenDesc": "抱歉,您没有权限访问此页面。",
+    "internalError": "哎呀!出错了",
+    "internalErrorDesc": "抱歉,服务器遇到错误。",
     "offline": "离线页面",
-    "offline-error": "哎呀!网络错误",
-    "offline-error-desc": "抱歉,无法连接到互联网,请检查您的网络连接并重试。",
+    "offlineError": "哎呀!网络错误",
+    "offlineErrorDesc": "抱歉,无法连接到互联网,请检查您的网络连接并重试。",
     "coming-soon": "即将推出"
   },
   "widgets": {
     "document": "文档",
     "qa": "问题 & 帮助",
     "setting": "设置",
-    "logout-tip": "是否退出登录?",
-    "view-all": "查看所有消息",
+    "logoutTip": "是否退出登录?",
+    "viewAll": "查看所有消息",
     "notifications": "通知",
-    "make-all-as-read": "全部标记为已读",
-    "clear-notifications": "清空",
+    "markAllAsRead": "全部标记为已读",
+    "clearNotifications": "清空",
     "search": {
       "title": "搜索",
-      "search-navigate": "搜索导航菜单",
+      "searchNavigate": "搜索导航菜单",
       "select": "选择",
       "navigate": "导航",
       "close": "关闭",
-      "no-results": "未找到搜索结果",
-      "no-recent": "没有搜索历史",
+      "noResults": "未找到搜索结果",
+      "noRecent": "没有搜索历史",
       "recent": "搜索历史"
     }
   },
   "authentication": {
-    "welcome-back": "欢迎回来",
-    "page-title": "开箱即用的大型中后台管理系统",
-    "page-desc": "工程化、高性能、跨组件库的前端模版",
-    "login-success": "登录成功",
-    "login-success-desc": "欢迎回来",
-    "login-subtitle": "请输入您的帐户信息以开始管理您的项目",
+    "welcomeBack": "欢迎回来",
+    "pageTitle": "开箱即用的大型中后台管理系统",
+    "pageDesc": "工程化、高性能、跨组件库的前端模版",
+    "loginSuccess": "登录成功",
+    "loginSuccessDesc": "欢迎回来",
+    "loginSubtitle": "请输入您的帐户信息以开始管理您的项目",
     "username": "账号",
     "password": "密码",
-    "username-tip": "请输入用户名",
-    "password-tip": "请输入密码",
-    "remember-me": "记住账号",
-    "create-an-account": "创建一个账号",
-    "create-account": "创建账号",
-    "already-account": "已经有账号了?",
-    "account-tip": "还没有账号?",
-    "sign-up": "注册",
-    "sign-up-subtitle": "让您的应用程序管理变得简单而有趣",
-    "comfirm-password": "确认密码",
-    "comfirm-password-tip": "两次输入的密码不一致",
-    "sign-up-agree": "我同意",
-    "sign-up-privacy-policy": "隐私政策",
-    "sign-up-terms": "条款",
-    "sign-up-agree-tip": "请同意隐私政策和条款",
-    "go-login": "去登录",
-    "password-strength": "使用 8 个或更多字符,混合字母、数字和符号",
-    "forget-password": "忘记密码?",
-    "forget-password-subtitle": "输入您的电子邮件,我们将向您发送重置密码的连接",
-    "email-tip": "请输入邮箱",
-    "send-reset-link": "发送重置链接",
+    "usernameTip": "请输入用户名",
+    "passwordTip": "请输入密码",
+    "rememberMe": "记住账号",
+    "createAnAccount": "创建一个账号",
+    "createAccount": "创建账号",
+    "alreadyHaveAccount": "已经有账号了?",
+    "accountTip": "还没有账号?",
+    "signUp": "注册",
+    "signUpSubtitle": "让您的应用程序管理变得简单而有趣",
+    "confirmPassword": "确认密码",
+    "confirmPasswordTip": "两次输入的密码不一致",
+    "agree": "我同意",
+    "agreeprivacyPolicy": "隐私政策",
+    "terms": "条款",
+    "agreeTip": "请同意隐私政策和条款",
+    "goToLogin": "去登录",
+    "passwordStrength": "使用 8 个或更多字符,混合字母、数字和符号",
+    "forgetPassword": "忘记密码?",
+    "forgetPasswordSubtitle": "输入您的电子邮件,我们将向您发送重置密码的连接",
+    "emailTip": "请输入邮箱",
+    "sendResetLink": "发送重置链接",
     "email": "邮箱",
-    "qrcode-subtitle": "请用手机扫描二维码登录",
-    "qrcode-prompt": "扫码后点击 '确认',即可完成登录",
-    "qrcode-login": "扫码登录",
-    "code-subtitle": "请输入您的手机号码以开始管理您的项目",
+    "qrcodeSubtitle": "请用手机扫描二维码登录",
+    "qrcodePrompt": "扫码后点击 '确认',即可完成登录",
+    "qrcodeLogin": "扫码登录",
+    "codeSubtitle": "请输入您的手机号码以开始管理您的项目",
     "code": "验证码",
-    "code-tip": "请输入验证码",
+    "codeTip": "请输入验证码",
     "mobile": "手机号码",
-    "mobile-login": "手机号登录",
+    "mobileLogin": "手机号登录",
     "mobile-tip": "请输入手机号码",
-    "send-code": "获取验证码",
-    "send-text": "{0}秒后重新获取",
-    "third-party-login": "其他登录方式",
+    "sendCode": "获取验证码",
+    "sendText": "{0}秒后重新获取",
+    "thirdPartyLogin": "其他登录方式",
     "layout": {
       "center": "居中",
-      "align-left": "居左",
-      "align-right": "居右"
+      "alignLeft": "居左",
+      "alignRight": "居右"
     }
   },
   "preferences": {
     "title": "偏好设置",
     "subtitle": "自定义偏好设置 & 实时预览",
-    "reset-title": "重置偏好设置",
-    "reset-tip": "数据有变化,点击可进行重置",
-    "reset-success": "重置偏好设置成功",
+    "resetTitle": "重置偏好设置",
+    "resetTip": "数据有变化,点击可进行重置",
+    "resetSuccess": "重置偏好设置成功",
     "appearance": "外观",
     "layout": "布局",
     "content": "内容",
     "other": "其它",
     "wide": "流式",
     "compact": "定宽",
-    "follow-system": "跟随系统",
+    "followSystem": "跟随系统",
     "vertical": "垂直",
-    "vertical-tip": "侧边垂直菜单模式",
+    "verticalTip": "侧边垂直菜单模式",
     "horizontal": "水平",
-    "horizontal-tip": "水平菜单模式,菜单全部显示在顶部",
-    "two-column": "双列菜单",
-    "two-column-tip": "垂直双列菜单模式",
-    "mixed-menu": "混合菜单",
-    "mixed-menu-tip": "垂直水平菜单共存",
-    "split-menu": "切割菜单",
-    "full-content": "内容全屏",
-    "full-content-tip": "不显示任何菜单,只显示内容主体",
-    "interface-control": "界面布局控制",
-    "normal": "默认",
+    "horizontalTip": "水平菜单模式,菜单全部显示在顶部",
+    "twoColumn": "双列菜单",
+    "twoColumnTip": "垂直双列菜单模式",
+    "mixedMenu": "混合菜单",
+    "mixedMenuTip": "垂直水平菜单共存",
+    "fullContent": "内容全屏",
+    "fullContentTip": "不显示任何菜单,只显示内容主体",
+    "normal": "常规",
     "plain": "朴素",
     "rounded": "圆润",
-    "copy": "复制偏好设置",
-    "copy-success": "复制成功,请在 app 下的 `src/preferences.ts`内进行覆盖",
-    "clear-and-logout": "清空缓存 & 退出登录",
+    "copyPreferences": "复制偏好设置",
+    "copyPreferencesSuccess": "复制成功,请在 app 下的 `src/preferences.ts`内进行覆盖",
+    "clearAndLogout": "清空缓存 & 退出登录",
     "mode": "模式",
-    "logo-visible": "显示 Logo",
     "general": "通用",
     "language": "语言",
-    "dynamic-title": "动态标题",
+    "dynamicTitle": "动态标题",
     "sidebar": {
       "title": "侧边栏",
       "width": "宽度",
       "visible": "显示侧边栏",
       "collapsed": "折叠菜单",
-      "collapsed-show-title": "显示菜单名"
+      "collapsedShowTitle": "显示菜单名"
     },
     "tabbar": {
       "title": "标签栏",
       "enable": "启用标签栏",
       "icon": "显示标签栏图标",
       "persist": "持久化标签页",
-      "context-menu": {
+      "contextMenu": {
         "reload": "重新加载",
         "close": "关闭标签页",
         "pin": "固定标签页",
         "unpin": "取消固定标签页",
-        "close-left": "关闭左侧标签页",
-        "close-right": "关闭右侧标签页",
-        "close-other": "关闭其它标签页",
-        "close-all": "关闭全部标签页"
+        "closeLeft": "关闭左侧标签页",
+        "closeRight": "关闭右侧标签页",
+        "closeOther": "关闭其它标签页",
+        "closeAll": "关闭全部标签页"
       }
     },
-    "navigation-menu": {
+    "navigationMenu": {
       "title": "导航菜单",
       "style": "导航菜单风格",
       "accordion": "侧边导航菜单手风琴模式",
       "split": "导航菜单分离",
-      "split-tip": "开启时,侧边栏显示顶栏对应菜单的子菜单"
+      "splitTip": "开启时,侧边栏显示顶栏对应菜单的子菜单"
     },
     "breadcrumb": {
       "title": "面包屑导航",
@@ -182,7 +179,7 @@
       "icon": "显示面包屑图标",
       "home": "显示首页按钮",
       "style": "面包屑风格",
-      "hide-only-one": "仅有一个时隐藏",
+      "hideOnlyOne": "仅有一个时隐藏",
       "background": "背景"
     },
     "animation": {
@@ -196,19 +193,19 @@
       "radius": "圆角",
       "light": "浅色",
       "dark": "深色",
-      "dark-menu": "深色菜单",
-      "weak-mode": "色弱模式",
-      "gray-mode": "灰色模式",
+      "darkMenu": "深色菜单",
+      "weakMode": "色弱模式",
+      "grayMode": "灰色模式",
       "builtin": {
         "title": "内置主题",
         "default": "默认",
         "violet": "紫罗兰",
         "pink": "樱花粉",
         "rose": "玫瑰红",
-        "sky-blue": "天蓝色",
-        "deep-blue": "深蓝色",
+        "skyBlue": "天蓝色",
+        "deepBlue": "深蓝色",
         "green": "浅绿色",
-        "deep-green": "深绿色",
+        "deepGreen": "深绿色",
         "orange": "橙黄色",
         "yellow": "柠檬黄",
         "zinc": "锌色灰",
@@ -220,10 +217,10 @@
     },
     "header": {
       "title": "顶栏",
-      "mode-static": "静止",
-      "mode-fixed": "固定",
-      "mode-auto": "自动隐藏和显示",
-      "mode-auto-scroll": "滚动隐藏和显示",
+      "modeStatic": "静止",
+      "modeFixed": "固定",
+      "modeAuto": "自动隐藏和显示",
+      "modeAutoScroll": "滚动隐藏和显示",
       "visible": "显示顶栏"
     },
     "footer": {
@@ -234,13 +231,13 @@
     "copyright": {
       "title": "版权",
       "enable": "启用版权",
-      "company-name": "公司名",
-      "company-site-link": "公司主页",
+      "companyName": "公司名",
+      "companySiteLink": "公司主页",
       "date": "日期",
       "icp": "ICP 备案号",
-      "icp-link": "ICP 网站链接"
+      "icpLink": "ICP 网站链接"
     },
-    "shortcut-keys": {
+    "shortcutKeys": {
       "title": "快捷键",
       "global": "全局",
       "search": "全局搜索",
@@ -249,13 +246,13 @@
     },
     "widget": {
       "title": "小部件",
-      "global-search": "启用全局搜索",
+      "globalSearch": "启用全局搜索",
       "fullscreen": "启用全屏",
-      "theme-toggle": "启用主题切换",
-      "language-toggle": "启用语言切换",
+      "themeToggle": "启用主题切换",
+      "languageToggle": "启用语言切换",
       "notification": "启用通知",
-      "sidebar-toggle": "启用侧边栏切换",
-      "ai-assistant": "启用 AI 助手"
+      "sidebarToggle": "启用侧边栏切换",
+      "aiAssistant": "启用 AI 助手"
     }
   }
 }

+ 1 - 1
packages/@core/shared/colorful/package.json

@@ -37,6 +37,6 @@
   },
   "dependencies": {
     "@ant-design/colors": "^7.1.0",
-    "@ctrl/tinycolor": "4.1.0"
+    "@ctrl/tinycolor": "^4.1.0"
   }
 }

+ 1 - 1
packages/@core/shared/toolkit/package.json

@@ -37,7 +37,7 @@
   },
   "dependencies": {
     "@vue/shared": "^3.4.31",
-    "clsx": "2.1.1",
+    "clsx": "^2.1.1",
     "defu": "^6.1.4",
     "lodash.clonedeep": "^4.5.0",
     "nprogress": "^0.2.0",

+ 2 - 2
packages/business/layouts/src/authentication/authentication.vue

@@ -49,10 +49,10 @@ const appName = computed(() => preferences.app.name);
         <div class="flex-col-center -enter-x mr-20 h-full">
           <SloganIcon :alt="appName" class="animate-float h-64 w-2/5" />
           <div class="text-1xl mt-6 font-sans text-white lg:text-2xl">
-            {{ $t('authentication.page-title') }}
+            {{ $t('authentication.pageTitle') }}
           </div>
           <div class="dark:text-muted-foreground mt-2 text-white/60">
-            {{ $t('authentication.page-desc') }}
+            {{ $t('authentication.pageDesc') }}
           </div>
         </div>
       </div>

+ 8 - 8
packages/business/layouts/src/basic/tabbar/use-tabs.ts

@@ -117,7 +117,7 @@ function useTabs() {
         },
         icon: IcRoundRefresh,
         key: 'reload',
-        text: $t('preferences.tabbar.context-menu.reload'),
+        text: $t('preferences.tabbar.contextMenu.reload'),
       },
       {
         disabled: !!affixTab || disabled,
@@ -126,7 +126,7 @@ function useTabs() {
         },
         icon: IcRoundClose,
         key: 'close',
-        text: $t('preferences.tabbar.context-menu.close'),
+        text: $t('preferences.tabbar.contextMenu.close'),
       },
       {
         handler: async () => {
@@ -138,8 +138,8 @@ function useTabs() {
         key: 'affix',
         separator: true,
         text: affixTab
-          ? $t('preferences.tabbar.context-menu.unpin')
-          : $t('preferences.tabbar.context-menu.pin'),
+          ? $t('preferences.tabbar.contextMenu.unpin')
+          : $t('preferences.tabbar.contextMenu.pin'),
       },
       {
         disabled: closeLeftDisabled,
@@ -148,7 +148,7 @@ function useTabs() {
         },
         icon: MdiFormatHorizontalAlignLeft,
         key: 'close-left',
-        text: $t('preferences.tabbar.context-menu.close-left'),
+        text: $t('preferences.tabbar.contextMenu.closeLeft'),
       },
       {
         disabled: closeRightDisabled,
@@ -158,7 +158,7 @@ function useTabs() {
         icon: MdiFormatHorizontalAlignRight,
         key: 'close-right',
         separator: true,
-        text: $t('preferences.tabbar.context-menu.close-right'),
+        text: $t('preferences.tabbar.contextMenu.closeRight'),
       },
       {
         disabled: closeOtherDisabled,
@@ -167,7 +167,7 @@ function useTabs() {
         },
         icon: MdiArrowExpandHorizontal,
         key: 'close-other',
-        text: $t('preferences.tabbar.context-menu.close-other'),
+        text: $t('preferences.tabbar.contextMenu.closeOther'),
       },
       {
         disabled,
@@ -176,7 +176,7 @@ function useTabs() {
         },
         icon: IcRoundMultipleStop,
         key: 'close-all',
-        text: $t('preferences.tabbar.context-menu.close-all'),
+        text: $t('preferences.tabbar.contextMenu.closeAll'),
       },
       // {
       //   icon: 'icon-[material-symbols--back-to-tab-sharp]',

+ 1 - 1
packages/business/layouts/src/widgets/global-search/global-search.vue

@@ -116,7 +116,7 @@ onMounted(() => {
             <IcRoundSearch class="mt-1 size-4" />
             <input
               v-model="keyword"
-              :placeholder="$t('widgets.search.search-navigate')"
+              :placeholder="$t('widgets.search.searchNavigate')"
               class="ring-none placeholder:text-muted-foreground w-[80%] rounded-md border border-none bg-transparent p-2 text-sm outline-none ring-0 ring-offset-transparent focus-visible:ring-transparent"
             />
           </DialogTitle>

+ 2 - 2
packages/business/layouts/src/widgets/global-search/search-panel.vue

@@ -223,7 +223,7 @@ onMounted(() => {
       >
         <IcRoundSearchOff class="size-12" />
         <p class="my-10 text-xs">
-          {{ $t('widgets.search.no-results') }}
+          {{ $t('widgets.search.noResults') }}
           <span class="text-foreground text-sm font-medium">
             "{{ keyword }}"
           </span>
@@ -235,7 +235,7 @@ onMounted(() => {
         class="text-muted-foreground text-center"
       >
         <p class="my-10 text-xs">
-          {{ $t('widgets.search.no-recent') }}
+          {{ $t('widgets.search.noRecent') }}
         </p>
       </div>
 

+ 2 - 2
packages/business/layouts/src/widgets/layout-toggle.vue

@@ -21,7 +21,7 @@ const menus = computed((): VbenDropdownMenuItem[] => [
   {
     icon: MdiDockLeft,
     key: 'panel-left',
-    text: $t('authentication.layout.align-left'),
+    text: $t('authentication.layout.alignLeft'),
   },
   {
     icon: MdiDockBottom,
@@ -31,7 +31,7 @@ const menus = computed((): VbenDropdownMenuItem[] => [
   {
     icon: MdiDockRight,
     key: 'panel-right',
-    text: $t('authentication.layout.align-right'),
+    text: $t('authentication.layout.alignRight'),
   },
 ]);
 

+ 4 - 4
packages/business/layouts/src/widgets/notification/notification.vue

@@ -84,7 +84,7 @@ function handleClick(item: NotificationItem) {
       <div class="flex items-center justify-between p-4 py-3">
         <div class="text-foreground">{{ $t('widgets.notifications') }}</div>
         <VbenIconButton
-          :tooltip="$t('widgets.make-all-as-read')"
+          :tooltip="$t('widgets.markAllAsRead')"
           @click="handleMakeAll"
         >
           <IcRoundMarkEmailRead />
@@ -127,7 +127,7 @@ function handleClick(item: NotificationItem) {
 
       <template v-else>
         <div class="flex-center text-muted-foreground min-h-[150px] w-full">
-          {{ $t('common.not-data') }}
+          {{ $t('common.noData') }}
         </div>
       </template>
 
@@ -135,10 +135,10 @@ function handleClick(item: NotificationItem) {
         class="border-border flex items-center justify-between border-t px-4 py-3"
       >
         <VbenButton size="sm" variant="ghost" @click="handleClear">
-          {{ $t('widgets.clear-notifications') }}
+          {{ $t('widgets.clearNotifications') }}
         </VbenButton>
         <VbenButton size="sm" @click="handleViewAll">
-          {{ $t('widgets.view-all') }}
+          {{ $t('widgets.viewAll') }}
         </VbenButton>
       </div>
     </div>

+ 1 - 1
packages/business/layouts/src/widgets/preferences/blocks/general/general.vue

@@ -25,6 +25,6 @@ const localeItems: SelectListItem[] = SUPPORT_LANGUAGES.map((item) => ({
     {{ $t('preferences.language') }}
   </SelectItem>
   <SwitchItem v-model="appDynamicTitle">
-    {{ $t('preferences.dynamic-title') }}
+    {{ $t('preferences.dynamicTitle') }}
   </SwitchItem>
 </template>

+ 1 - 1
packages/business/layouts/src/widgets/preferences/blocks/layout/breadcrumb.vue

@@ -35,7 +35,7 @@ const disableItem = computed(() => {
     {{ $t('preferences.breadcrumb.enable') }}
   </SwitchItem>
   <SwitchItem v-model="breadcrumbHideOnlyOne" :disabled="disableItem">
-    {{ $t('preferences.breadcrumb.hide-only-one') }}
+    {{ $t('preferences.breadcrumb.hideOnlyOne') }}
   </SwitchItem>
   <SwitchItem v-model="breadcrumbShowIcon" :disabled="disableItem">
     {{ $t('preferences.breadcrumb.icon') }}

+ 3 - 3
packages/business/layouts/src/widgets/preferences/blocks/layout/copyright.vue

@@ -30,10 +30,10 @@ const itemDisabled = computed(() => props.disabled || !copyrightEnable.value);
   </SwitchItem>
 
   <InputItem v-model="copyrightCompanyName" :disabled="itemDisabled">
-    {{ $t('preferences.copyright.company-name') }}
+    {{ $t('preferences.copyright.companyName') }}
   </InputItem>
   <InputItem v-model="copyrightCompanySiteLink" :disabled="itemDisabled">
-    {{ $t('preferences.copyright.company-site-link') }}
+    {{ $t('preferences.copyright.companySiteLink') }}
   </InputItem>
   <InputItem v-model="copyrightDate" :disabled="itemDisabled">
     {{ $t('preferences.copyright.date') }}
@@ -43,6 +43,6 @@ const itemDisabled = computed(() => props.disabled || !copyrightEnable.value);
     {{ $t('preferences.copyright.icp') }}
   </InputItem>
   <InputItem v-model="copyrightIcpLink" :disabled="itemDisabled">
-    {{ $t('preferences.copyright.icp-link') }}
+    {{ $t('preferences.copyright.icpLink') }}
   </InputItem>
 </template>

+ 4 - 4
packages/business/layouts/src/widgets/preferences/blocks/layout/header.vue

@@ -17,19 +17,19 @@ const headerMode = defineModel<LayoutHeaderModeType>('headerMode');
 
 const localeItems: SelectListItem[] = [
   {
-    label: $t('preferences.header.mode-static'),
+    label: $t('preferences.header.modeStatic'),
     value: 'static',
   },
   {
-    label: $t('preferences.header.mode-fixed'),
+    label: $t('preferences.header.modeFixed'),
     value: 'fixed',
   },
   {
-    label: $t('preferences.header.mode-auto'),
+    label: $t('preferences.header.modeAuto'),
     value: 'auto',
   },
   {
-    label: $t('preferences.header.mode-auto-scroll'),
+    label: $t('preferences.header.modeAutoScroll'),
     value: 'auto-scroll',
   },
 ];

+ 8 - 8
packages/business/layouts/src/widgets/preferences/blocks/layout/layout.vue

@@ -38,27 +38,27 @@ const components: Record<LayoutType, Component> = {
 const PRESET = computed((): PresetItem[] => [
   {
     name: $t('preferences.vertical'),
-    tip: $t('preferences.vertical-tip'),
+    tip: $t('preferences.verticalTip'),
     type: 'sidebar-nav',
   },
   {
-    name: $t('preferences.two-column'),
-    tip: $t('preferences.two-column-tip'),
+    name: $t('preferences.twoColumn'),
+    tip: $t('preferences.twoColumnTip'),
     type: 'sidebar-mixed-nav',
   },
   {
     name: $t('preferences.horizontal'),
-    tip: $t('preferences.vertical-tip'),
+    tip: $t('preferences.horizontalTip'),
     type: 'header-nav',
   },
   {
-    name: $t('preferences.mixed-menu'),
-    tip: $t('preferences.mixed-menu-tip'),
+    name: $t('preferences.mixedMenu'),
+    tip: $t('preferences.mixedMenuTip'),
     type: 'mixed-nav',
   },
   {
-    name: $t('preferences.full-content'),
-    tip: $t('preferences.full-content-tip'),
+    name: $t('preferences.fullContent'),
+    tip: $t('preferences.fullContentTip'),
     type: 'full-content',
   },
 ]);

+ 4 - 4
packages/business/layouts/src/widgets/preferences/blocks/layout/navigation.vue

@@ -28,18 +28,18 @@ const stylesItems: SelectListItem[] = [
     :disabled="disabled"
     :items="stylesItems"
   >
-    {{ $t('preferences.navigation-menu.style') }}
+    {{ $t('preferences.navigationMenu.style') }}
   </ToggleItem>
   <SwitchItem
     v-model="navigationSplit"
     :disabled="disabledNavigationSplit || disabled"
   >
-    {{ $t('preferences.navigation-menu.split') }}
+    {{ $t('preferences.navigationMenu.split') }}
     <template #tip>
-      {{ $t('preferences.navigation-menu.split-tip') }}
+      {{ $t('preferences.navigationMenu.splitTip') }}
     </template>
   </SwitchItem>
   <SwitchItem v-model="navigationAccordion" :disabled="disabled">
-    {{ $t('preferences.navigation-menu.accordion') }}
+    {{ $t('preferences.navigationMenu.accordion') }}
   </SwitchItem>
 </template>

+ 1 - 1
packages/business/layouts/src/widgets/preferences/blocks/layout/sidebar.vue

@@ -29,7 +29,7 @@ const sidebarCollapsed = defineModel<boolean>('sidebarCollapsed');
     v-model="sidebarCollapsedShowTitle"
     :disabled="!sidebarEnable || disabled"
   >
-    {{ $t('preferences.sidebar.collapsed-show-title') }}
+    {{ $t('preferences.sidebar.collapsedShowTitle') }}
   </SwitchItem>
   <NumberFieldItem
     v-model="sidebarWidth"

+ 5 - 5
packages/business/layouts/src/widgets/preferences/blocks/layout/widget.vue

@@ -18,13 +18,13 @@ const widgetSidebarToggle = defineModel<boolean>('widgetSidebarToggle');
 
 <template>
   <SwitchItem v-model="widgetGlobalSearch">
-    {{ $t('preferences.widget.global-search') }}
+    {{ $t('preferences.widget.globalSearch') }}
   </SwitchItem>
   <SwitchItem v-model="widgetThemeToggle">
-    {{ $t('preferences.widget.theme-toggle') }}
+    {{ $t('preferences.widget.themeToggle') }}
   </SwitchItem>
   <SwitchItem v-model="widgetLanguageToggle">
-    {{ $t('preferences.widget.language-toggle') }}
+    {{ $t('preferences.widget.languageToggle') }}
   </SwitchItem>
   <SwitchItem v-model="widgetFullscreen">
     {{ $t('preferences.widget.fullscreen') }}
@@ -33,9 +33,9 @@ const widgetSidebarToggle = defineModel<boolean>('widgetSidebarToggle');
     {{ $t('preferences.widget.notification') }}
   </SwitchItem>
   <SwitchItem v-model="widgetAiAssistant">
-    {{ $t('preferences.widget.ai-assistant') }}
+    {{ $t('preferences.widget.aiAssistant') }}
   </SwitchItem>
   <SwitchItem v-model="widgetSidebarToggle">
-    {{ $t('preferences.widget.sidebar-toggle') }}
+    {{ $t('preferences.widget.sidebarToggle') }}
   </SwitchItem>
 </template>

+ 4 - 4
packages/business/layouts/src/widgets/preferences/blocks/shortcut-keys/global.vue

@@ -22,21 +22,21 @@ const altView = computed(() => (isWindowsOs() ? 'Alt' : '⌥'));
 
 <template>
   <SwitchItem v-model="shortcutKeysEnable">
-    {{ $t('preferences.shortcut-keys.title') }}
+    {{ $t('preferences.shortcutKeys.title') }}
   </SwitchItem>
   <SwitchItem v-if="shortcutKeysEnable" v-model="shortcutKeysGlobalSearch">
-    {{ $t('preferences.shortcut-keys.search') }}
+    {{ $t('preferences.shortcutKeys.search') }}
     <template #shortcut>
       {{ isWindowsOs() ? 'Ctrl' : '⌘' }}
       <kbd> K </kbd>
     </template>
   </SwitchItem>
   <SwitchItem v-if="shortcutKeysEnable" v-model="shortcutKeysLogout">
-    {{ $t('preferences.shortcut-keys.logout') }}
+    {{ $t('preferences.shortcutKeys.logout') }}
     <template #shortcut> {{ altView }} Q </template>
   </SwitchItem>
   <SwitchItem v-if="shortcutKeysEnable" v-model="shortcutKeysPreferences">
-    {{ $t('preferences.shortcut-keys.preferences') }}
+    {{ $t('preferences.shortcutKeys.preferences') }}
     <template #shortcut> {{ altView }} , </template>
   </SwitchItem>
 </template>

+ 3 - 3
packages/business/layouts/src/widgets/preferences/blocks/theme/builtin.vue

@@ -40,17 +40,17 @@ function typeView(name: BuiltinThemeType) {
       return $t('preferences.theme.builtin.rose');
     }
     case 'sky-blue': {
-      return $t('preferences.theme.builtin.sky-blue');
+      return $t('preferences.theme.builtin.skyBlue');
     }
     case 'deep-blue': {
-      return $t('preferences.theme.builtin.deep-blue');
+      return $t('preferences.theme.builtin.deepBlue');
     }
 
     case 'green': {
       return $t('preferences.theme.builtin.green');
     }
     case 'deep-green': {
-      return $t('preferences.theme.builtin.deep-green');
+      return $t('preferences.theme.builtin.deepGreen');
     }
     case 'orange': {
       return $t('preferences.theme.builtin.orange');

+ 2 - 2
packages/business/layouts/src/widgets/preferences/blocks/theme/color-mode.vue

@@ -18,9 +18,9 @@ const appColorGrayMode = defineModel<boolean>('appColorGrayMode', {
 
 <template>
   <SwitchItem v-model="appColorWeakMode">
-    {{ $t('preferences.theme.weak-mode') }}
+    {{ $t('preferences.theme.weakMode') }}
   </SwitchItem>
   <SwitchItem v-model="appColorGrayMode">
-    {{ $t('preferences.theme.gray-mode') }}
+    {{ $t('preferences.theme.grayMode') }}
   </SwitchItem>
 </template>

+ 2 - 2
packages/business/layouts/src/widgets/preferences/blocks/theme/theme.vue

@@ -49,7 +49,7 @@ function nameView(name: string) {
       return $t('preferences.theme.dark');
     }
     case 'auto': {
-      return $t('preferences.follow-system');
+      return $t('preferences.followSystem');
     }
   }
 }
@@ -79,7 +79,7 @@ function nameView(name: string) {
       :disabled="modelValue !== 'light'"
       class="mt-6"
     >
-      {{ $t('preferences.theme.dark-menu') }}
+      {{ $t('preferences.theme.darkMenu') }}
     </SwitchItem>
   </div>
 </template>

+ 10 - 14
packages/business/layouts/src/widgets/preferences/preferences-sheet.vue

@@ -162,7 +162,7 @@ const tabs = computed((): SegmentedItem[] => {
       value: 'layout',
     },
     {
-      label: $t('preferences.shortcut-keys.title'),
+      label: $t('preferences.shortcutKeys.title'),
       value: 'shortcutKey',
     },
     {
@@ -187,8 +187,8 @@ async function handleCopy() {
   await copy(JSON.stringify(diffPreference.value, null, 2));
 
   toast({
-    description: $t('preferences.copy'),
-    title: $t('preferences.copy-success'),
+    description: $t('preferences.copyPreferences'),
+    title: $t('preferences.copyPreferencesSuccess'),
   });
 }
 
@@ -205,12 +205,8 @@ async function handleReset() {
   resetPreferences();
   await loadLocaleMessages(preferences.app.locale);
   toast({
-    description: $t('preferences.reset-title'),
-    title: $t('preferences.reset-success'),
-  });
-  toast({
-    description: $t('preferences.reset-title'),
-    title: $t('preferences.reset-success'),
+    description: $t('preferences.resetTitle'),
+    title: $t('preferences.resetSuccess'),
   });
 }
 </script>
@@ -236,7 +232,7 @@ async function handleReset() {
         <div class="flex items-center">
           <VbenIconButton
             :disabled="!diffPreference"
-            :tooltip="$t('preferences.reset-tip')"
+            :tooltip="$t('preferences.resetTip')"
             class="relative"
           >
             <span
@@ -323,7 +319,7 @@ async function handleReset() {
               />
             </Block>
 
-            <Block :title="$t('preferences.navigation-menu.title')">
+            <Block :title="$t('preferences.navigationMenu.title')">
               <Navigation
                 v-model:navigation-accordion="navigationAccordion"
                 v-model:navigation-split="navigationSplit"
@@ -384,7 +380,7 @@ async function handleReset() {
           </template>
 
           <template #shortcutKey>
-            <Block :title="$t('preferences.shortcut-keys.global')">
+            <Block :title="$t('preferences.shortcutKeys.global')">
               <GlobalShortcutKeys
                 v-model:shortcut-keys-enable="shortcutKeysEnable"
                 v-model:shortcut-keys-global-search="shortcutKeysGlobalSearch"
@@ -407,7 +403,7 @@ async function handleReset() {
           @click="handleClearCache"
         >
           <IcRoundRestartAlt class="mr-2 size-4" />
-          {{ $t('preferences.clear-and-logout') }}
+          {{ $t('preferences.clearAndLogout') }}
         </VbenButton>
         <VbenButton
           :disabled="!diffPreference"
@@ -417,7 +413,7 @@ async function handleReset() {
           @click="handleCopy"
         >
           <IcRoundFolderCopy class="mr-2 size-3" />
-          {{ $t('preferences.copy') }}
+          {{ $t('preferences.copyPreferences') }}
         </VbenButton>
       </template>
     </VbenSheet>

+ 1 - 1
packages/business/layouts/src/widgets/theme-toggle/theme-toggle.vue

@@ -49,7 +49,7 @@ const PRESETS = [
   {
     icon: IcRoundMotionPhotosAuto,
     name: 'auto',
-    title: $t('preferences.follow-system'),
+    title: $t('preferences.followSystem'),
   },
 ];
 </script>

+ 1 - 1
packages/business/layouts/src/widgets/user-dropdown/user-dropdown.vue

@@ -121,7 +121,7 @@ if (enableShortcutKey.value) {
   <VbenAlertDialog
     v-model:open="openDialog"
     :cancel-text="$t('common.cancel')"
-    :content="$t('widgets.logout-tip')"
+    :content="$t('widgets.logoutTip')"
     :submit-text="$t('common.confirm')"
     :title="$t('common.prompt')"
     @submit="handleSubmitLogout"

+ 5 - 5
packages/business/universal-ui/src/authentication/code-login.vue

@@ -52,8 +52,8 @@ const isValidPhoneNumber = computed(() => {
 
 const btnText = computed(() => {
   return countdown.value > 0
-    ? $t('authentication.send-text', [countdown.value])
-    : $t('authentication.send-code');
+    ? $t('authentication.sendText', [countdown.value])
+    : $t('authentication.sendCode');
 });
 const btnLoading = computed(() => {
   return countdown.value > 0;
@@ -117,10 +117,10 @@ onBeforeUnmount(() => {
 <template>
   <div>
     <Title>
-      {{ $t('authentication.welcome-back') }} 📲
+      {{ $t('authentication.welcomeBack') }} 📲
       <template #desc>
         <span class="text-muted-foreground">
-          {{ $t('authentication.code-subtitle') }}
+          {{ $t('authentication.codeSubtitle') }}
         </span>
       </template>
     </Title>
@@ -140,7 +140,7 @@ onBeforeUnmount(() => {
       :btn-loading="btnLoading"
       :btn-text="btnText"
       :code-length="4"
-      :error-tip="$t('authentication.code-tip')"
+      :error-tip="$t('authentication.codeTip')"
       :handle-send-code="handleSendCode"
       :label="$t('authentication.code')"
       :placeholder="$t('authentication.code')"

+ 4 - 4
packages/business/universal-ui/src/authentication/forget-password.vue

@@ -58,15 +58,15 @@ function goLogin() {
 <template>
   <div>
     <Title>
-      {{ $t('authentication.forget-password') }} 🤦🏻‍♂️
+      {{ $t('authentication.forgetPassword') }} 🤦🏻‍♂️
       <template #desc>
-        {{ $t('authentication.forget-password-subtitle') }}
+        {{ $t('authentication.forgetPasswordSubtitle') }}
       </template>
     </Title>
     <div class="mb-6">
       <VbenInput
         v-model="formState.email"
-        :error-tip="$t('authentication.email-tip')"
+        :error-tip="$t('authentication.emailTip')"
         :label="$t('authentication.email')"
         :status="emailStatus"
         autofocus
@@ -77,7 +77,7 @@ function goLogin() {
     </div>
     <div>
       <VbenButton class="mt-2 w-full" @click="handleSubmut">
-        {{ $t('authentication.send-reset-link') }}
+        {{ $t('authentication.sendResetLink') }}
       </VbenButton>
       <VbenButton class="mt-4 w-full" variant="outline" @click="goLogin()">
         {{ $t('common.back') }}

+ 10 - 10
packages/business/universal-ui/src/authentication/login.vue

@@ -150,10 +150,10 @@ function handleGo(path: string) {
 <template>
   <div @keypress.enter.prevent="handleSubmit">
     <Title>
-      {{ $t('authentication.welcome-back') }} 👋🏻
+      {{ $t('authentication.welcomeBack') }} 👋🏻
       <template #desc>
         <span class="text-muted-foreground">
-          {{ $t('authentication.login-subtitle') }}
+          {{ $t('authentication.loginSubtitle') }}
         </span>
       </template>
     </Title>
@@ -161,7 +161,7 @@ function handleGo(path: string) {
     <VbenInput
       v-model="formState.username"
       :autofocus="false"
-      :error-tip="$t('authentication.username-tip')"
+      :error-tip="$t('authentication.usernameTip')"
       :label="$t('authentication.username')"
       :placeholder="usernamePlaceholder || $t('authentication.username')"
       :status="usernameStatus"
@@ -171,7 +171,7 @@ function handleGo(path: string) {
     />
     <VbenInputPassword
       v-model="formState.password"
-      :error-tip="$t('authentication.password-tip')"
+      :error-tip="$t('authentication.passwordTip')"
       :label="$t('authentication.password')"
       :placeholder="passwordPlaceholder || $t('authentication.password')"
       :status="passwordStatus"
@@ -183,7 +183,7 @@ function handleGo(path: string) {
     <div class="mb-6 mt-4 flex justify-between">
       <div class="flex-center flex">
         <VbenCheckbox v-model:checked="formState.rememberMe" name="rememberMe">
-          {{ $t('authentication.remember-me') }}
+          {{ $t('authentication.rememberMe') }}
         </VbenCheckbox>
       </div>
 
@@ -192,7 +192,7 @@ function handleGo(path: string) {
         class="text-primary hover:text-primary-hover active:text-primary-active cursor-pointer text-sm font-normal"
         @click="handleGo(forgetPasswordPath)"
       >
-        {{ $t('authentication.forget-password') }}
+        {{ $t('authentication.forgetPassword') }}
       </span>
 
       <!-- <VbenButton variant="ghost" @click="handleGo('/auth/forget-password')">
@@ -210,7 +210,7 @@ function handleGo(path: string) {
         variant="outline"
         @click="handleGo(codeLoginPath)"
       >
-        {{ $t('authentication.mobile-login') }}
+        {{ $t('authentication.mobileLogin') }}
       </VbenButton>
       <VbenButton
         v-if="showQrcodeLogin"
@@ -218,7 +218,7 @@ function handleGo(path: string) {
         variant="outline"
         @click="handleGo(qrCodeLoginPath)"
       >
-        {{ $t('authentication.qrcode-login') }}
+        {{ $t('authentication.qrcodeLogin') }}
       </VbenButton>
       <!-- <VbenButton
         :loading="loading"
@@ -234,12 +234,12 @@ function handleGo(path: string) {
     <ThirdPartyLogin v-if="showThirdPartyLogin" />
 
     <div v-if="showRegister" class="text-center text-sm">
-      {{ $t('authentication.account-tip') }}
+      {{ $t('authentication.accountTip') }}
       <span
         class="text-primary hover:text-primary-hover active:text-primary-active cursor-pointer text-sm font-normal"
         @click="handleGo(registerPath)"
       >
-        {{ $t('authentication.create-account') }}
+        {{ $t('authentication.createAccount') }}
       </span>
     </div>
   </div>

+ 3 - 3
packages/business/universal-ui/src/authentication/qrcode-login.vue

@@ -47,10 +47,10 @@ function goLogin() {
 <template>
   <div>
     <Title>
-      {{ $t('authentication.welcome-back') }} 📱
+      {{ $t('authentication.welcomeBack') }} 📱
       <template #desc>
         <span class="text-muted-foreground">
-          {{ $t('authentication.qrcode-subtitle') }}
+          {{ $t('authentication.qrcodeSubtitle') }}
         </span>
       </template>
     </Title>
@@ -58,7 +58,7 @@ function goLogin() {
     <div class="flex-col-center mt-6">
       <img :src="qrcode" alt="qrcode" class="w-1/2" />
       <p class="text-muted-foreground mt-4 text-sm">
-        {{ $t('authentication.qrcode-prompt') }}
+        {{ $t('authentication.qrcodePrompt') }}
       </p>
     </div>
 

+ 15 - 15
packages/business/universal-ui/src/authentication/register.vue

@@ -86,12 +86,12 @@ function goLogin() {
 <template>
   <div>
     <Title>
-      {{ $t('authentication.create-an-account') }} 🚀
-      <template #desc> {{ $t('authentication.sign-up-subtitle') }} </template>
+      {{ $t('authentication.createAnAccount') }} 🚀
+      <template #desc> {{ $t('authentication.signUpSubtitle') }} </template>
     </Title>
     <VbenInput
       v-model="formState.username"
-      :error-tip="$t('authentication.username-tip')"
+      :error-tip="$t('authentication.usernameTip')"
       :label="$t('authentication.username')"
       :placeholder="$t('authentication.username')"
       :status="usernameStatus"
@@ -101,7 +101,7 @@ function goLogin() {
     <!-- Use 8 or more characters with a mix of letters, numbers & symbols. -->
     <VbenInputPassword
       v-model="formState.password"
-      :error-tip="$t('authentication.password-tip')"
+      :error-tip="$t('authentication.passwordTip')"
       :label="$t('authentication.password')"
       :password-strength="true"
       :placeholder="$t('authentication.password')"
@@ -111,15 +111,15 @@ function goLogin() {
       type="password"
     >
       <template #strengthText>
-        {{ $t('authentication.password-strength') }}
+        {{ $t('authentication.passwordStrength') }}
       </template>
     </VbenInputPassword>
 
     <VbenInputPassword
       v-model="formState.comfirmPassword"
-      :error-tip="$t('authentication.comfirm-password-tip')"
-      :label="$t('authentication.comfirm-password')"
-      :placeholder="$t('authentication.comfirm-password')"
+      :error-tip="$t('authentication.confirmPasswordTip')"
+      :label="$t('authentication.confirmPassword')"
+      :placeholder="$t('authentication.confirmPassword')"
       :status="comfirmPasswordStatus"
       name="comfirmPassword"
       required
@@ -132,13 +132,13 @@ function goLogin() {
           v-model:checked="formState.agreePolicy"
           name="agreePolicy"
         >
-          {{ $t('authentication.sign-up-agree') }}
+          {{ $t('authentication.agree') }}
           <span class="text-primary hover:text-primary-hover">{{
-            $t('authentication.sign-up-privacy-policy')
+            $t('authentication.agreeprivacyPolicy')
           }}</span>
           &
           <span class="text-primary hover:text-primary-hover">
-            {{ $t('authentication.sign-up-terms') }}
+            {{ $t('authentication.terms') }}
           </span>
         </VbenCheckbox>
       </div>
@@ -147,22 +147,22 @@ function goLogin() {
           v-show="formState.submitted && !formState.agreePolicy"
           class="text-destructive absolute bottom-1 left-0 text-xs"
         >
-          {{ $t('authentication.sign-up-agree-tip') }}
+          {{ $t('authentication.agreeTip') }}
         </p>
       </Transition>
     </div>
     <div>
       <VbenButton :loading="loading" class="w-full" @click="handleSubmit">
-        {{ $t('authentication.sign-up') }}
+        {{ $t('authentication.signUp') }}
       </VbenButton>
     </div>
     <div class="mt-4 text-center text-sm">
-      {{ $t('authentication.already-account') }}
+      {{ $t('authentication.alreadyHaveAccount') }}
       <span
         class="text-primary hover:text-primary-hover cursor-pointer text-sm font-normal"
         @click="goLogin()"
       >
-        {{ $t('authentication.go-login') }}
+        {{ $t('authentication.goToLogin') }}
       </span>
     </div>
   </div>

+ 1 - 1
packages/business/universal-ui/src/authentication/third-party-login.vue

@@ -13,7 +13,7 @@ defineOptions({
     <div class="mt-4 flex items-center justify-between">
       <span class="border-input w-[35%] border-b dark:border-gray-600"></span>
       <span class="text-muted-foreground text-center text-xs uppercase">
-        {{ $t('authentication.third-party-login') }}
+        {{ $t('authentication.thirdPartyLogin') }}
       </span>
       <span class="border-input w-[35%] border-b dark:border-gray-600"></span>
     </div>

+ 8 - 8
packages/business/universal-ui/src/fallback/fallback.vue

@@ -43,13 +43,13 @@ const titleText = computed(() => {
       return $t('fallback.forbidden');
     }
     case '404': {
-      return $t('fallback.page-not-found');
+      return $t('fallback.pageNotFound');
     }
     case '500': {
-      return $t('fallback.internal-error');
+      return $t('fallback.internalError');
     }
     case 'offline': {
-      return $t('fallback.offline-error');
+      return $t('fallback.offlineError');
     }
     case 'comming-soon': {
       return $t('fallback.coming-soon');
@@ -66,16 +66,16 @@ const descText = computed(() => {
   }
   switch (props.status) {
     case '403': {
-      return $t('fallback.forbidden-desc');
+      return $t('fallback.forbiddenDesc');
     }
     case '404': {
-      return $t('fallback.page-not-found-desc');
+      return $t('fallback.pageNotFoundDesc');
     }
     case '500': {
-      return $t('fallback.internal-error-desc');
+      return $t('fallback.internalErrorDesc');
     }
     case 'offline': {
-      return $t('fallback.offline-error-desc');
+      return $t('fallback.offlineErrorDesc');
     }
     default: {
       return '';
@@ -152,7 +152,7 @@ function refresh() {
       <slot v-if="$slots.action" name="action"></slot>
       <VbenButton v-else-if="showBack" size="lg" @click="back">
         <IcRoundArrowBackIosNew class="mr-2" />
-        {{ $t('common.back-to-home') }}
+        {{ $t('common.backToHome') }}
       </VbenButton>
       <VbenButton v-else-if="showRefresh" size="lg" @click="refresh">
         <IcRoundRefresh class="mr-2" />

ファイルの差分が大きいため隠しています
+ 60 - 371
pnpm-lock.yaml


この差分においてかなりの量のファイルが変更されているため、一部のファイルを表示していません