@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.
- package/README.md +2 -2
- package/dist/package/declarations/src/api/base/language.d.ts +8 -0
- package/dist/package/declarations/src/components/Dialog/ProDialog.vue.d.ts +1 -0
- package/dist/package/declarations/src/components/Dict/index.vue.d.ts +4 -3
- package/dist/package/declarations/src/components/Dict/value.d.ts +11 -0
- package/dist/package/declarations/src/components/LocaleSwitch/index.vue.d.ts +3 -0
- package/dist/package/declarations/src/index.d.ts +2 -0
- package/dist/package/declarations/src/locales/generated.d.ts +3382 -0
- package/dist/package/declarations/src/locales/index.d.ts +53 -0
- package/dist/package/declarations/src/modules/index.d.ts +7 -2
- package/dist/package/declarations/src/request.d.ts +1 -0
- package/dist/package/declarations/src/routers/modules/staticRouter.d.ts +1 -0
- package/dist/package/declarations/src/rpc/base/v1/config.d.ts +13 -1
- package/dist/package/declarations/src/rpc/base/v1/language.d.ts +20 -0
- package/dist/package/declarations/src/rpc/base/v1/login.d.ts +13 -1
- package/dist/package/declarations/src/rpc/system/admin/v1/auth.d.ts +1 -1
- package/dist/package/declarations/src/rpc/system/admin/v1/base_dict.d.ts +9 -0
- package/dist/package/declarations/src/rpc/system/admin/v1/base_translation.d.ts +75 -0
- package/dist/package/declarations/src/rpc/system/admin/v1/common.d.ts +13 -0
- package/dist/package/declarations/src/stores/interface/index.d.ts +2 -0
- package/dist/package/declarations/src/stores/modules/auth.d.ts +6 -6
- package/dist/package/declarations/src/stores/runtime.d.ts +1 -0
- package/dist/package/declarations/src/utils/dict.d.ts +2 -2
- package/dist/package/declarations/src/utils/index.d.ts +1 -1
- package/dist/package/declarations/src/utils/oauthProvider.d.ts +2 -0
- package/dist/package/declarations/src/utils/passwordCrypto.d.ts +1 -1
- package/dist/package/declarations/src/utils/passwordStrength.d.ts +0 -7
- package/dist/package/src/App.vue +5 -2
- package/dist/package/src/api/base/language.ts +20 -0
- package/dist/package/src/api/base/oauth.ts +0 -1
- package/dist/package/src/api/system/auth.ts +0 -1
- package/dist/package/src/bootstrap.ts +57 -2
- package/dist/package/src/components/CronExpression/index.vue +80 -82
- package/dist/package/src/components/Dialog/FormDialog.vue +10 -5
- package/dist/package/src/components/Dialog/ProDialog.vue +10 -4
- package/dist/package/src/components/Dict/index.vue +26 -9
- package/dist/package/src/components/Dict/value.ts +18 -0
- package/dist/package/src/components/ECharts/config/index.ts +6 -1
- package/dist/package/src/components/ErrorMessage/index.vue +3 -1
- package/dist/package/src/components/ImportExcel/index.vue +29 -18
- package/dist/package/src/components/LocaleSwitch/index.vue +28 -0
- package/dist/package/src/components/PasswordStrength/index.vue +8 -5
- package/dist/package/src/components/ProForm/components/DynamicList.vue +8 -3
- package/dist/package/src/components/ProForm/components/KvList.vue +14 -6
- package/dist/package/src/components/ProForm/index.vue +2 -2
- package/dist/package/src/components/ProTable/components/ColSetting.vue +7 -5
- package/dist/package/src/components/ProTable/components/TableColumn.vue +2 -1
- package/dist/package/src/components/ProTable/index.vue +36 -11
- package/dist/package/src/components/SearchForm/components/SearchFormItem.vue +9 -4
- package/dist/package/src/components/SearchForm/index.vue +6 -3
- package/dist/package/src/components/SelectFilter/index.vue +4 -1
- package/dist/package/src/components/SelectIcon/index.vue +8 -4
- package/dist/package/src/components/TreeFilter/index.vue +14 -6
- package/dist/package/src/components/Upload/File.vue +18 -13
- package/dist/package/src/components/Upload/Files.vue +22 -15
- package/dist/package/src/components/Upload/Img.vue +14 -11
- package/dist/package/src/components/Upload/Imgs.vue +15 -12
- package/dist/package/src/components/WangEditor/index.vue +12 -4
- package/dist/package/src/directives/modules/copy.ts +2 -1
- package/dist/package/src/hooks/useDownload.ts +3 -2
- package/dist/package/src/hooks/useHandleData.ts +5 -4
- package/dist/package/src/hooks/useTheme.ts +2 -1
- package/dist/package/src/hooks/useTime.ts +11 -2
- package/dist/package/src/index.ts +2 -0
- package/dist/package/src/layouts/components/Header/ToolBarRight.vue +2 -0
- package/dist/package/src/layouts/components/Header/components/AssemblySize.vue +8 -6
- package/dist/package/src/layouts/components/Header/components/Avatar.vue +11 -9
- package/dist/package/src/layouts/components/Header/components/Breadcrumb.vue +11 -3
- package/dist/package/src/layouts/components/Header/components/Fullscreen.vue +4 -2
- package/dist/package/src/layouts/components/Header/components/InfoDialog.vue +6 -3
- package/dist/package/src/layouts/components/Header/components/PasswordDialog.vue +6 -3
- package/dist/package/src/layouts/components/Header/components/SearchMenu.vue +5 -3
- package/dist/package/src/layouts/components/Header/components/ThemeSetting.vue +3 -1
- package/dist/package/src/layouts/components/Main/index.vue +1 -0
- package/dist/package/src/layouts/components/Tabs/components/MoreButton.vue +9 -7
- package/dist/package/src/layouts/components/Tabs/index.vue +15 -1
- package/dist/package/src/layouts/components/ThemeDrawer/index.vue +27 -24
- package/dist/package/src/locales/README.md +15 -0
- package/dist/package/src/locales/en-US.json +283 -0
- package/dist/package/src/locales/es-ES.json +283 -0
- package/dist/package/src/locales/fr-FR.json +283 -0
- package/dist/package/src/locales/generated.ts +57 -0
- package/dist/package/src/locales/index.ts +222 -0
- package/dist/package/src/locales/ja-JP.json +283 -0
- package/dist/package/src/locales/ko-KR.json +283 -0
- package/dist/package/src/locales/zh-CN.json +283 -0
- package/dist/package/src/locales/zh-TW.json +283 -0
- package/dist/package/src/modules/index.ts +7 -2
- package/dist/package/src/modules/kratosAdmin.ts +5 -1
- package/dist/package/src/request.ts +8 -1
- package/dist/package/src/routers/index.ts +4 -1
- package/dist/package/src/routers/modules/dynamicRouter.ts +5 -4
- package/dist/package/src/routers/modules/staticRouter.ts +8 -4
- package/dist/package/src/rpc/base/v1/config.ts +14 -1
- package/dist/package/src/rpc/base/v1/language.ts +31 -0
- package/dist/package/src/rpc/base/v1/login.ts +14 -1
- package/dist/package/src/rpc/system/admin/v1/auth.ts +1 -1
- package/dist/package/src/rpc/system/admin/v1/base_dict.ts +9 -0
- package/dist/package/src/rpc/system/admin/v1/base_translation.ts +90 -0
- package/dist/package/src/rpc/system/admin/v1/common.ts +21 -0
- package/dist/package/src/stores/interface/index.ts +2 -0
- package/dist/package/src/stores/modules/config.ts +7 -3
- package/dist/package/src/stores/modules/user.ts +2 -1
- package/dist/package/src/stores/runtime.ts +1 -0
- package/dist/package/src/styles/element.scss +2 -0
- package/dist/package/src/utils/color.ts +5 -4
- package/dist/package/src/utils/dict.ts +27 -4
- package/dist/package/src/utils/eleValidate.ts +3 -2
- package/dist/package/src/utils/errorHandler.ts +9 -8
- package/dist/package/src/utils/index.ts +9 -8
- package/dist/package/src/utils/oauthProvider.ts +15 -10
- package/dist/package/src/utils/passwordCrypto.ts +4 -3
- package/dist/package/src/utils/passwordStrength.ts +1 -16
- package/dist/package/src/utils/request.ts +13 -8
- package/dist/package/src/views/error/403.vue +3 -1
- package/dist/package/src/views/error/404.vue +3 -1
- package/dist/package/src/views/error/500.vue +3 -1
- package/dist/package/src/views/error/pending.vue +5 -2
- package/dist/package/src/views/login/components/LoginForm.vue +58 -29
- package/dist/package/src/views/login/index.scss +6 -0
- package/dist/package/src/views/login/index.vue +2 -0
- package/dist/package/types/generated/auto-imports.d.ts +129 -111
- package/dist/package/types/generated/components.d.ts +67 -67
- package/package.json +4 -2
- package/types/generated/auto-imports.d.ts +129 -111
- package/types/generated/components.d.ts +67 -67
- package/vite.config.ts +12 -0
- package/dist/package/declarations/src/rpc/base/v1/enum.d.ts +0 -43
- package/dist/package/declarations/src/rpc/system/common/v1/enum.d.ts +0 -67
- package/dist/package/src/rpc/base/v1/enum.ts +0 -54
- 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
|
|
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="
|
|
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"
|
|
7
|
-
<el-button type="primary" @click="dialogVisible = false"
|
|
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="
|
|
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"
|
|
7
|
-
<el-button type="primary" @click="dialogVisible = false"
|
|
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="
|
|
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="
|
|
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:
|
|
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="
|
|
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="
|
|
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="
|
|
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="
|
|
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="
|
|
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="
|
|
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="
|
|
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
|
|
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
|
|
82
|
+
<span>{{ t("core.theme.dark") }}</span>
|
|
83
83
|
<SwitchDark />
|
|
84
84
|
</div>
|
|
85
85
|
<div class="theme-item">
|
|
86
|
-
<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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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)。
|