@liujitcn/kratos-admin-core 0.0.20 → 0.0.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (131) hide show
  1. package/README.md +2 -2
  2. package/dist/package/declarations/src/api/base/language.d.ts +8 -0
  3. package/dist/package/declarations/src/components/Dialog/ProDialog.vue.d.ts +1 -0
  4. package/dist/package/declarations/src/components/Dict/index.vue.d.ts +4 -3
  5. package/dist/package/declarations/src/components/Dict/value.d.ts +11 -0
  6. package/dist/package/declarations/src/components/LocaleSwitch/index.vue.d.ts +3 -0
  7. package/dist/package/declarations/src/index.d.ts +2 -0
  8. package/dist/package/declarations/src/locales/generated.d.ts +3382 -0
  9. package/dist/package/declarations/src/locales/index.d.ts +53 -0
  10. package/dist/package/declarations/src/modules/index.d.ts +7 -2
  11. package/dist/package/declarations/src/request.d.ts +1 -0
  12. package/dist/package/declarations/src/routers/modules/staticRouter.d.ts +1 -0
  13. package/dist/package/declarations/src/rpc/base/v1/config.d.ts +13 -1
  14. package/dist/package/declarations/src/rpc/base/v1/language.d.ts +20 -0
  15. package/dist/package/declarations/src/rpc/base/v1/login.d.ts +13 -1
  16. package/dist/package/declarations/src/rpc/system/admin/v1/auth.d.ts +1 -1
  17. package/dist/package/declarations/src/rpc/system/admin/v1/base_dict.d.ts +9 -0
  18. package/dist/package/declarations/src/rpc/system/admin/v1/base_translation.d.ts +75 -0
  19. package/dist/package/declarations/src/rpc/system/admin/v1/common.d.ts +13 -0
  20. package/dist/package/declarations/src/stores/interface/index.d.ts +2 -0
  21. package/dist/package/declarations/src/stores/modules/auth.d.ts +6 -6
  22. package/dist/package/declarations/src/stores/runtime.d.ts +1 -0
  23. package/dist/package/declarations/src/utils/dict.d.ts +2 -2
  24. package/dist/package/declarations/src/utils/index.d.ts +1 -1
  25. package/dist/package/declarations/src/utils/oauthProvider.d.ts +2 -0
  26. package/dist/package/declarations/src/utils/passwordCrypto.d.ts +1 -1
  27. package/dist/package/declarations/src/utils/passwordStrength.d.ts +0 -7
  28. package/dist/package/src/App.vue +5 -2
  29. package/dist/package/src/api/base/language.ts +20 -0
  30. package/dist/package/src/api/base/oauth.ts +0 -1
  31. package/dist/package/src/api/system/auth.ts +0 -1
  32. package/dist/package/src/bootstrap.ts +57 -2
  33. package/dist/package/src/components/CronExpression/index.vue +80 -82
  34. package/dist/package/src/components/Dialog/FormDialog.vue +10 -5
  35. package/dist/package/src/components/Dialog/ProDialog.vue +10 -4
  36. package/dist/package/src/components/Dict/index.vue +26 -9
  37. package/dist/package/src/components/Dict/value.ts +18 -0
  38. package/dist/package/src/components/ECharts/config/index.ts +6 -1
  39. package/dist/package/src/components/ErrorMessage/index.vue +3 -1
  40. package/dist/package/src/components/ImportExcel/index.vue +29 -18
  41. package/dist/package/src/components/LocaleSwitch/index.vue +28 -0
  42. package/dist/package/src/components/PasswordStrength/index.vue +8 -5
  43. package/dist/package/src/components/ProForm/components/DynamicList.vue +8 -3
  44. package/dist/package/src/components/ProForm/components/KvList.vue +14 -6
  45. package/dist/package/src/components/ProForm/index.vue +2 -2
  46. package/dist/package/src/components/ProTable/components/ColSetting.vue +7 -5
  47. package/dist/package/src/components/ProTable/components/TableColumn.vue +2 -1
  48. package/dist/package/src/components/ProTable/index.vue +36 -11
  49. package/dist/package/src/components/SearchForm/components/SearchFormItem.vue +9 -4
  50. package/dist/package/src/components/SearchForm/index.vue +6 -3
  51. package/dist/package/src/components/SelectFilter/index.vue +4 -1
  52. package/dist/package/src/components/SelectIcon/index.vue +8 -4
  53. package/dist/package/src/components/TreeFilter/index.vue +14 -6
  54. package/dist/package/src/components/Upload/File.vue +18 -13
  55. package/dist/package/src/components/Upload/Files.vue +22 -15
  56. package/dist/package/src/components/Upload/Img.vue +14 -11
  57. package/dist/package/src/components/Upload/Imgs.vue +15 -12
  58. package/dist/package/src/components/WangEditor/index.vue +12 -4
  59. package/dist/package/src/directives/modules/copy.ts +2 -1
  60. package/dist/package/src/hooks/useDownload.ts +3 -2
  61. package/dist/package/src/hooks/useHandleData.ts +5 -4
  62. package/dist/package/src/hooks/useTheme.ts +2 -1
  63. package/dist/package/src/hooks/useTime.ts +11 -2
  64. package/dist/package/src/index.ts +2 -0
  65. package/dist/package/src/layouts/components/Header/ToolBarRight.vue +2 -0
  66. package/dist/package/src/layouts/components/Header/components/AssemblySize.vue +8 -6
  67. package/dist/package/src/layouts/components/Header/components/Avatar.vue +11 -9
  68. package/dist/package/src/layouts/components/Header/components/Breadcrumb.vue +11 -3
  69. package/dist/package/src/layouts/components/Header/components/Fullscreen.vue +4 -2
  70. package/dist/package/src/layouts/components/Header/components/InfoDialog.vue +6 -3
  71. package/dist/package/src/layouts/components/Header/components/PasswordDialog.vue +6 -3
  72. package/dist/package/src/layouts/components/Header/components/SearchMenu.vue +5 -3
  73. package/dist/package/src/layouts/components/Header/components/ThemeSetting.vue +3 -1
  74. package/dist/package/src/layouts/components/Main/index.vue +1 -0
  75. package/dist/package/src/layouts/components/Tabs/components/MoreButton.vue +9 -7
  76. package/dist/package/src/layouts/components/Tabs/index.vue +15 -1
  77. package/dist/package/src/layouts/components/ThemeDrawer/index.vue +27 -24
  78. package/dist/package/src/locales/README.md +15 -0
  79. package/dist/package/src/locales/en-US.json +283 -0
  80. package/dist/package/src/locales/es-ES.json +283 -0
  81. package/dist/package/src/locales/fr-FR.json +283 -0
  82. package/dist/package/src/locales/generated.ts +57 -0
  83. package/dist/package/src/locales/index.ts +222 -0
  84. package/dist/package/src/locales/ja-JP.json +283 -0
  85. package/dist/package/src/locales/ko-KR.json +283 -0
  86. package/dist/package/src/locales/zh-CN.json +283 -0
  87. package/dist/package/src/locales/zh-TW.json +283 -0
  88. package/dist/package/src/modules/index.ts +7 -2
  89. package/dist/package/src/modules/kratosAdmin.ts +5 -1
  90. package/dist/package/src/request.ts +8 -1
  91. package/dist/package/src/routers/index.ts +4 -1
  92. package/dist/package/src/routers/modules/dynamicRouter.ts +5 -4
  93. package/dist/package/src/routers/modules/staticRouter.ts +8 -4
  94. package/dist/package/src/rpc/base/v1/config.ts +14 -1
  95. package/dist/package/src/rpc/base/v1/language.ts +31 -0
  96. package/dist/package/src/rpc/base/v1/login.ts +14 -1
  97. package/dist/package/src/rpc/system/admin/v1/auth.ts +1 -1
  98. package/dist/package/src/rpc/system/admin/v1/base_dict.ts +9 -0
  99. package/dist/package/src/rpc/system/admin/v1/base_translation.ts +90 -0
  100. package/dist/package/src/rpc/system/admin/v1/common.ts +21 -0
  101. package/dist/package/src/stores/interface/index.ts +2 -0
  102. package/dist/package/src/stores/modules/config.ts +7 -3
  103. package/dist/package/src/stores/modules/user.ts +2 -1
  104. package/dist/package/src/stores/runtime.ts +1 -0
  105. package/dist/package/src/styles/element.scss +2 -0
  106. package/dist/package/src/utils/color.ts +5 -4
  107. package/dist/package/src/utils/dict.ts +27 -4
  108. package/dist/package/src/utils/eleValidate.ts +3 -2
  109. package/dist/package/src/utils/errorHandler.ts +9 -8
  110. package/dist/package/src/utils/index.ts +9 -8
  111. package/dist/package/src/utils/oauthProvider.ts +15 -10
  112. package/dist/package/src/utils/passwordCrypto.ts +4 -3
  113. package/dist/package/src/utils/passwordStrength.ts +1 -16
  114. package/dist/package/src/utils/request.ts +13 -8
  115. package/dist/package/src/views/error/403.vue +3 -1
  116. package/dist/package/src/views/error/404.vue +3 -1
  117. package/dist/package/src/views/error/500.vue +3 -1
  118. package/dist/package/src/views/error/pending.vue +5 -2
  119. package/dist/package/src/views/login/components/LoginForm.vue +58 -29
  120. package/dist/package/src/views/login/index.scss +6 -0
  121. package/dist/package/src/views/login/index.vue +2 -0
  122. package/dist/package/types/generated/auto-imports.d.ts +129 -111
  123. package/dist/package/types/generated/components.d.ts +67 -67
  124. package/package.json +4 -2
  125. package/types/generated/auto-imports.d.ts +129 -111
  126. package/types/generated/components.d.ts +67 -67
  127. package/vite.config.ts +12 -0
  128. package/dist/package/declarations/src/rpc/base/v1/enum.d.ts +0 -43
  129. package/dist/package/declarations/src/rpc/system/common/v1/enum.d.ts +0 -67
  130. package/dist/package/src/rpc/base/v1/enum.ts +0 -54
  131. package/dist/package/src/rpc/system/common/v1/enum.ts +0 -80
@@ -10,9 +10,11 @@
10
10
  import { computed, onMounted, ref } from "vue";
11
11
  import { ElMessage } from "element-plus";
12
12
  import screenfull from "screenfull";
13
+ import { useLocaleStore } from "../../../../locales";
13
14
 
14
15
  const isFullscreen = ref(screenfull.isFullscreen);
15
- const fullscreenTooltip = computed(() => (isFullscreen.value ? "退出全屏" : "全屏"));
16
+ const { t } = useLocaleStore();
17
+ const fullscreenTooltip = computed(() => (isFullscreen.value ? t("core.header.fullscreen_exit") : t("core.header.fullscreen")));
16
18
 
17
19
  onMounted(() => {
18
20
  screenfull.on("change", () => {
@@ -22,7 +24,7 @@ onMounted(() => {
22
24
  });
23
25
 
24
26
  const handleFullScreen = () => {
25
- if (!screenfull.isEnabled) ElMessage.warning("当前您的浏览器不支持全屏 ❌");
27
+ if (!screenfull.isEnabled) ElMessage.warning(t("core.header.fullscreen_unsupported"));
26
28
  screenfull.toggle();
27
29
  };
28
30
  </script>
@@ -1,16 +1,19 @@
1
1
  <template>
2
- <el-dialog v-model="dialogVisible" title="个人信息" width="500px" draggable>
2
+ <el-dialog v-model="dialogVisible" :title="t('core.layout.info')" width="500px" draggable>
3
3
  <span>This is userInfo</span>
4
4
  <template #footer>
5
5
  <span class="dialog-footer">
6
- <el-button @click="dialogVisible = false">取消</el-button>
7
- <el-button type="primary" @click="dialogVisible = false">确认</el-button>
6
+ <el-button @click="dialogVisible = false">{{ t("common.action.cancel") }}</el-button>
7
+ <el-button type="primary" @click="dialogVisible = false">{{ t("common.action.confirm") }}</el-button>
8
8
  </span>
9
9
  </template>
10
10
  </el-dialog>
11
11
  </template>
12
12
 
13
13
  <script setup lang="ts">
14
+ import { useLocaleStore } from "../../../../locales";
15
+
16
+ const { t } = useLocaleStore();
14
17
  import { ref } from "vue";
15
18
 
16
19
  const dialogVisible = ref(false);
@@ -1,16 +1,19 @@
1
1
  <template>
2
- <el-dialog v-model="dialogVisible" title="修改密码" width="500px" draggable>
2
+ <el-dialog v-model="dialogVisible" :title="t('core.layout.password_change')" width="500px" draggable>
3
3
  <span>This is Password</span>
4
4
  <template #footer>
5
5
  <span class="dialog-footer">
6
- <el-button @click="dialogVisible = false">取消</el-button>
7
- <el-button type="primary" @click="dialogVisible = false">确认</el-button>
6
+ <el-button @click="dialogVisible = false">{{ t("common.action.cancel") }}</el-button>
7
+ <el-button type="primary" @click="dialogVisible = false">{{ t("common.action.confirm") }}</el-button>
8
8
  </span>
9
9
  </template>
10
10
  </el-dialog>
11
11
  </template>
12
12
 
13
13
  <script setup lang="ts">
14
+ import { useLocaleStore } from "../../../../locales";
15
+
16
+ const { t } = useLocaleStore();
14
17
  import { ref } from "vue";
15
18
 
16
19
  const dialogVisible = ref(false);
@@ -1,13 +1,13 @@
1
1
  <template>
2
2
  <div class="search-menu">
3
- <el-tooltip effect="dark" content="菜单搜索" placement="bottom" :show-after="200">
3
+ <el-tooltip effect="dark" :content="t('core.header.menu_search')" placement="bottom" :show-after="200">
4
4
  <i :class="'iconfont icon-sousuo'" class="toolBar-icon" @click="handleOpen"></i>
5
5
  </el-tooltip>
6
6
  <el-dialog class="search-dialog" v-model="isShowSearch" :width="600" :show-close="false" top="10vh">
7
7
  <el-input
8
8
  v-model="searchMenu"
9
9
  ref="menuInputRef"
10
- placeholder="菜单搜索:支持菜单名称、路径"
10
+ :placeholder="t('core.header.menu_search_placeholder')"
11
11
  size="large"
12
12
  clearable
13
13
  :prefix-icon="Search"
@@ -29,7 +29,7 @@
29
29
  <i :class="'iconfont icon-huiche'" class="menu-enter" @click="handleOpen"></i>
30
30
  </div>
31
31
  </div>
32
- <el-empty v-else class="mt20 mb20" :image-size="100" description="暂无菜单" />
32
+ <el-empty v-else class="mt20 mb20" :image-size="100" :description="t('core.header.menu_search_empty')" />
33
33
  </el-dialog>
34
34
  </div>
35
35
  </template>
@@ -43,6 +43,7 @@ import { useRouter } from "vue-router";
43
43
  import { useDebounceFn } from "@vueuse/core";
44
44
  import type { RouteItem } from "../../../../rpc/system/admin/v1/auth";
45
45
  import { getRouteMetaHidden, getRouteMetaIcon, getRouteMetaTitle, getRouteTarget, isExternalPath } from "../../../../utils";
46
+ import { useLocaleStore } from "../../../../locales";
46
47
 
47
48
  /** 可被菜单搜索展示的路由项。 */
48
49
  interface SearchRouteItem extends RouteItem {
@@ -51,6 +52,7 @@ interface SearchRouteItem extends RouteItem {
51
52
 
52
53
  const router = useRouter();
53
54
  const authStore = useAuthStore();
55
+ const { t } = useLocaleStore();
54
56
  const menuList = computed<SearchRouteItem[]>(() => {
55
57
  return authStore.flatMenuListGet.filter((item): item is SearchRouteItem => {
56
58
  return Boolean(item.path) && !getRouteMetaHidden(item.meta);
@@ -1,6 +1,6 @@
1
1
  <template>
2
2
  <div class="theme-setting">
3
- <el-tooltip effect="dark" content="主题设置" placement="bottom" :show-after="200">
3
+ <el-tooltip effect="dark" :content="t('core.header.theme')" placement="bottom" :show-after="200">
4
4
  <i :class="'iconfont icon-zhuti'" class="toolBar-icon" @click="openDrawer"></i>
5
5
  </el-tooltip>
6
6
  </div>
@@ -8,6 +8,8 @@
8
8
 
9
9
  <script setup lang="ts">
10
10
  import mittBus from "../../../../utils/mittBus";
11
+ import { useLocaleStore } from "../../../../locales";
12
+ const { t } = useLocaleStore();
11
13
  const openDrawer = () => {
12
14
  mittBus.emit("openThemeDrawer");
13
15
  };
@@ -79,6 +79,7 @@ const listeningWindow = useDebounceFn(() => {
79
79
  if (!isCollapse.value && screenWidth.value < 1200) globalStore.setGlobalState("isCollapse", true);
80
80
  if (isCollapse.value && screenWidth.value > 1200) globalStore.setGlobalState("isCollapse", false);
81
81
  }, 100);
82
+ listeningWindow();
82
83
  window.addEventListener("resize", listeningWindow, false);
83
84
  onBeforeUnmount(() => {
84
85
  window.removeEventListener("resize", listeningWindow);
@@ -6,25 +6,25 @@
6
6
  <template #dropdown>
7
7
  <el-dropdown-menu>
8
8
  <el-dropdown-item @click="refresh">
9
- <el-icon><Refresh /></el-icon>刷新当前
9
+ <el-icon><Refresh /></el-icon>{{ t("core.tabs.refresh") }}
10
10
  </el-dropdown-item>
11
11
  <el-dropdown-item @click="maximize">
12
- <el-icon><FullScreen /></el-icon>最大化
12
+ <el-icon><FullScreen /></el-icon>{{ t("core.tabs.maximize") }}
13
13
  </el-dropdown-item>
14
14
  <el-dropdown-item divided @click="closeCurrentTab">
15
- <el-icon><Remove /></el-icon>关闭当前
15
+ <el-icon><Remove /></el-icon>{{ t("core.tabs.close_current") }}
16
16
  </el-dropdown-item>
17
17
  <el-dropdown-item @click="tabStore.closeTabsOnSide(currentTabPath, 'left')">
18
- <el-icon><DArrowLeft /></el-icon>关闭左侧
18
+ <el-icon><DArrowLeft /></el-icon>{{ t("core.tabs.close_left") }}
19
19
  </el-dropdown-item>
20
20
  <el-dropdown-item @click="tabStore.closeTabsOnSide(currentTabPath, 'right')">
21
- <el-icon><DArrowRight /></el-icon>关闭右侧
21
+ <el-icon><DArrowRight /></el-icon>{{ t("core.tabs.close_right") }}
22
22
  </el-dropdown-item>
23
23
  <el-dropdown-item divided @click="tabStore.closeMultipleTab(currentTabPath)">
24
- <el-icon><CircleClose /></el-icon>关闭其他
24
+ <el-icon><CircleClose /></el-icon>{{ t("core.tabs.close_other") }}
25
25
  </el-dropdown-item>
26
26
  <el-dropdown-item @click="closeAllTab">
27
- <el-icon><FolderDelete /></el-icon>关闭全部
27
+ <el-icon><FolderDelete /></el-icon>{{ t("core.tabs.close_all") }}
28
28
  </el-dropdown-item>
29
29
  </el-dropdown-menu>
30
30
  </template>
@@ -39,12 +39,14 @@ import { useTabsStore } from "../../../../stores/modules/tabs";
39
39
  import { useGlobalStore } from "../../../../stores/modules/global";
40
40
  import { useKeepAliveStore } from "../../../../stores/modules/keepAlive";
41
41
  import { useRoute, useRouter } from "vue-router";
42
+ import { useLocaleStore } from "../../../../locales";
42
43
 
43
44
  const route = useRoute();
44
45
  const router = useRouter();
45
46
  const tabStore = useTabsStore();
46
47
  const globalStore = useGlobalStore();
47
48
  const keepAliveStore = useKeepAliveStore();
49
+ const { t } = useLocaleStore();
48
50
  const currentTabPath = computed(() => getAdminTabPath(route));
49
51
 
50
52
  // refresh current page
@@ -27,17 +27,25 @@ import { TabsPaneContext, TabPaneName } from "element-plus";
27
27
  import { getRouteMetaAffix, getRouteMetaFull, getRouteMetaIcon, getRouteMetaKeepAlive, getRouteMetaTitle } from "../../../utils";
28
28
  import MoreButton from "./components/MoreButton.vue";
29
29
  import { getAdminTabPath } from "../../../modules";
30
+ import { useLocaleStore } from "../../../locales";
30
31
 
31
32
  const route = useRoute();
32
33
  const router = useRouter();
33
34
  const tabStore = useTabsStore();
34
35
  const authStore = useAuthStore();
35
36
  const globalStore = useGlobalStore();
37
+ const { locale, t } = useLocaleStore();
36
38
 
37
39
  const tabsMenuValue = ref(getAdminTabPath(route));
38
40
  const tabsMenuList = computed(() => tabStore.tabsMenuList);
39
41
  const tabsIcon = computed(() => globalStore.tabsIcon);
40
42
 
43
+ /** 获取当前路由标签标题,兼容静态路由的多语言标题键。 */
44
+ const getCurrentRouteTitle = () => {
45
+ const titleKey = typeof route.meta.titleKey === "string" ? route.meta.titleKey : "";
46
+ return titleKey ? t(titleKey) : String(route.meta.title ?? "");
47
+ };
48
+
41
49
  onMounted(() => {
42
50
  tabsDrop();
43
51
  initTabs();
@@ -52,7 +60,7 @@ watch(
52
60
  tabsMenuValue.value = tabPath;
53
61
  const tabsParams = {
54
62
  icon: route.meta.icon as string,
55
- title: route.meta.title as string,
63
+ title: getCurrentRouteTitle(),
56
64
  path: tabPath,
57
65
  name: route.name as string,
58
66
  close: !route.meta.affix,
@@ -63,6 +71,12 @@ watch(
63
71
  { immediate: true }
64
72
  );
65
73
 
74
+ watch(locale, () => {
75
+ const currentTabPath = getAdminTabPath(route);
76
+ const currentTab = tabStore.tabsMenuList.find(item => item.path === currentTabPath);
77
+ if (currentTab && route.meta.titleKey) currentTab.title = getCurrentRouteTitle();
78
+ });
79
+
66
80
  // 初始化固定标签
67
81
  const initTabs = () => {
68
82
  authStore.flatMenuListGet.forEach(item => {
@@ -1,12 +1,12 @@
1
1
  <template>
2
- <el-drawer v-model="drawerVisible" title="布局设置" size="290px">
2
+ <el-drawer v-model="drawerVisible" :title="t('core.theme.settings')" size="290px">
3
3
  <!-- 布局样式 -->
4
4
  <el-divider class="divider" content-position="center">
5
5
  <el-icon><Notification /></el-icon>
6
- 布局样式
6
+ {{ t("core.theme.layout") }}
7
7
  </el-divider>
8
8
  <div class="layout-box">
9
- <el-tooltip effect="dark" content="纵向" placement="top" :show-after="200">
9
+ <el-tooltip effect="dark" :content="t('core.theme.layout.vertical')" placement="top" :show-after="200">
10
10
  <div :class="['layout-item layout-vertical', { 'is-active': layout == 'vertical' }]" @click="setLayout('vertical')">
11
11
  <div class="layout-dark"></div>
12
12
  <div class="layout-container">
@@ -18,7 +18,7 @@
18
18
  </el-icon>
19
19
  </div>
20
20
  </el-tooltip>
21
- <el-tooltip effect="dark" content="经典" placement="top" :show-after="200">
21
+ <el-tooltip effect="dark" :content="t('core.theme.layout.classic')" placement="top" :show-after="200">
22
22
  <div :class="['layout-item layout-classic', { 'is-active': layout == 'classic' }]" @click="setLayout('classic')">
23
23
  <div class="layout-dark"></div>
24
24
  <div class="layout-container">
@@ -30,7 +30,7 @@
30
30
  </el-icon>
31
31
  </div>
32
32
  </el-tooltip>
33
- <el-tooltip effect="dark" content="横向" placement="top" :show-after="200">
33
+ <el-tooltip effect="dark" :content="t('core.theme.layout.transverse')" placement="top" :show-after="200">
34
34
  <div :class="['layout-item layout-transverse', { 'is-active': layout == 'transverse' }]" @click="setLayout('transverse')">
35
35
  <div class="layout-dark"></div>
36
36
  <div class="layout-content"></div>
@@ -39,7 +39,7 @@
39
39
  </el-icon>
40
40
  </div>
41
41
  </el-tooltip>
42
- <el-tooltip effect="dark" content="分栏" placement="top" :show-after="200">
42
+ <el-tooltip effect="dark" :content="t('core.theme.layout.columns')" placement="top" :show-after="200">
43
43
  <div :class="['layout-item layout-columns', { 'is-active': layout == 'columns' }]" @click="setLayout('columns')">
44
44
  <div class="layout-dark"></div>
45
45
  <div class="layout-light"></div>
@@ -52,8 +52,8 @@
52
52
  </div>
53
53
  <div class="theme-item">
54
54
  <span>
55
- 侧边栏反转色
56
- <el-tooltip effect="dark" content="侧边栏颜色变为深色模式" placement="top">
55
+ {{ t("core.theme.aside_inverted") }}
56
+ <el-tooltip effect="dark" :content="t('core.theme.aside_inverted_tip')" placement="top">
57
57
  <el-icon><QuestionFilled /></el-icon>
58
58
  </el-tooltip>
59
59
  </span>
@@ -61,8 +61,8 @@
61
61
  </div>
62
62
  <div class="theme-item mb50">
63
63
  <span>
64
- 头部反转色
65
- <el-tooltip effect="dark" content="头部颜色变为深色模式" placement="top">
64
+ {{ t("core.theme.header_inverted") }}
65
+ <el-tooltip effect="dark" :content="t('core.theme.header_inverted_tip')" placement="top">
66
66
  <el-icon><QuestionFilled /></el-icon>
67
67
  </el-tooltip>
68
68
  </span>
@@ -72,60 +72,60 @@
72
72
  <!-- 全局主题 -->
73
73
  <el-divider class="divider" content-position="center">
74
74
  <el-icon><ColdDrink /></el-icon>
75
- 全局主题
75
+ {{ t("core.theme.global") }}
76
76
  </el-divider>
77
77
  <div class="theme-item">
78
- <span>主题颜色</span>
78
+ <span>{{ t("core.theme.color") }}</span>
79
79
  <el-color-picker v-model="primary" :predefine="colorList" @change="changePrimary" />
80
80
  </div>
81
81
  <div class="theme-item">
82
- <span>暗黑模式</span>
82
+ <span>{{ t("core.theme.dark") }}</span>
83
83
  <SwitchDark />
84
84
  </div>
85
85
  <div class="theme-item">
86
- <span>灰色模式</span>
86
+ <span>{{ t("core.theme.grey") }}</span>
87
87
  <el-switch v-model="isGrey" @change="changeGreyOrWeak('grey', !!$event)" />
88
88
  </div>
89
89
  <div class="theme-item mb40">
90
- <span>色弱模式</span>
90
+ <span>{{ t("core.theme.weak") }}</span>
91
91
  <el-switch v-model="isWeak" @change="changeGreyOrWeak('weak', !!$event)" />
92
92
  </div>
93
93
 
94
94
  <!-- 界面设置 -->
95
95
  <el-divider class="divider" content-position="center">
96
96
  <el-icon><Setting /></el-icon>
97
- 界面设置
97
+ {{ t("core.theme.interface") }}
98
98
  </el-divider>
99
99
  <div class="theme-item">
100
- <span>菜单折叠</span>
100
+ <span>{{ t("core.theme.menu_collapse") }}</span>
101
101
  <el-switch v-model="isCollapse" />
102
102
  </div>
103
103
  <div class="theme-item">
104
- <span>菜单手风琴</span>
104
+ <span>{{ t("core.theme.accordion") }}</span>
105
105
  <el-switch v-model="accordion" />
106
106
  </div>
107
107
  <div class="theme-item">
108
- <span>水印</span>
108
+ <span>{{ t("core.theme.watermark") }}</span>
109
109
  <el-switch v-model="watermark" />
110
110
  </div>
111
111
  <div class="theme-item">
112
- <span>面包屑</span>
112
+ <span>{{ t("core.theme.breadcrumb") }}</span>
113
113
  <el-switch v-model="breadcrumb" />
114
114
  </div>
115
115
  <div class="theme-item">
116
- <span>面包屑图标</span>
116
+ <span>{{ t("core.theme.breadcrumb_icon") }}</span>
117
117
  <el-switch v-model="breadcrumbIcon" />
118
118
  </div>
119
119
  <div class="theme-item">
120
- <span>标签栏</span>
120
+ <span>{{ t("core.theme.tabs") }}</span>
121
121
  <el-switch v-model="tabs" />
122
122
  </div>
123
123
  <div class="theme-item">
124
- <span>标签栏图标</span>
124
+ <span>{{ t("core.theme.tabs_icon") }}</span>
125
125
  <el-switch v-model="tabsIcon" />
126
126
  </div>
127
127
  <div class="theme-item">
128
- <span>页脚</span>
128
+ <span>{{ t("core.theme.footer") }}</span>
129
129
  <el-switch v-model="footer" />
130
130
  </div>
131
131
  </el-drawer>
@@ -140,6 +140,9 @@ import { LayoutType } from "../../../stores/interface";
140
140
  import { DEFAULT_PRIMARY } from "../../../config";
141
141
  import mittBus from "../../../utils/mittBus";
142
142
  import SwitchDark from "../../../components/SwitchDark/index.vue";
143
+ import { useLocaleStore } from "../../../locales";
144
+
145
+ const { t } = useLocaleStore();
143
146
 
144
147
  const { changePrimary, changeGreyOrWeak, setAsideTheme, setHeaderTheme } = useTheme();
145
148
 
@@ -0,0 +1,15 @@
1
+ # 管理端 Core 语言包
2
+
3
+ 本目录提供管理端底座和公共组件使用的稳定文案,包括通用操作、字段、状态、登录认证、上传、校验和错误提示。语言包由 `../modules/kratosAdmin.ts` 导入,作为 `kratos-admin` 模块注册到 `packages/core/src/locales/index.ts`,最终由 `bootstrap.ts` 合并到 Vue I18n;core 内组件、hooks、请求错误处理和登录页通过 `t()` 或 `useLocaleStore()` 使用。
4
+
5
+ | 文件 | 用途 | 使用位置 |
6
+ | --- | --- | --- |
7
+ | `zh-CN.json` | 简体中文固定 UI 默认语言包,也是所有语言键集合和占位符校验基准。 | 管理端固定文案默认语言及缺失翻译回退。 |
8
+ | `zh-TW.json` | 繁体中文公共语言包。 | 管理端切换为繁体中文时由 Vue I18n 使用。 |
9
+ | `en-US.json` | 英文公共语言包。 | 管理端切换为英文时由 Vue I18n 使用。 |
10
+ | `ja-JP.json` | 日文公共语言包。 | 管理端切换为日文时由 Vue I18n 使用。 |
11
+ | `ko-KR.json` | 韩语公共语言包。 | 管理端切换为韩语时由 Vue I18n 使用。 |
12
+ | `fr-FR.json` | 法语公共语言包。 | 管理端切换为法语时由 Vue I18n 使用。 |
13
+ | `es-ES.json` | 西班牙语公共语言包。 | 管理端切换为西班牙语时由 Vue I18n 使用。 |
14
+
15
+ 语言包是标准 JSON,不能在文件内直接写注释;新增语言或修改键后执行仓库根目录的 `make i18n-sync`,脚本会校验所有语言并生成注册产物。语言切换选项固定显示后端 `base_language.native_name`,接口不可用时使用代码内置的原生名称;`common.language.*` 仅用于普通文案和语言迁移初始数据。新增语言的完整文件清单见[国际化语言扩展指南](../../../../../../docs/国际化语言扩展指南.md)。