perf: 优化国际化,路由不再传i18n字段,平台自动读取根目录locales文件夹下文件进行国际化匹配

This commit is contained in:
xiaoxian521
2022-05-11 15:25:01 +08:00
parent f35dea840e
commit 9067d88c3b
37 changed files with 411 additions and 430 deletions

View File

@@ -68,7 +68,7 @@ function search() {
resultOptions.value = flatMenusData.filter(
menu =>
keyword.value &&
transformI18n(menu.meta?.title, menu.meta?.i18n)
transformI18n(menu.meta?.title)
.toLocaleLowerCase()
.includes(keyword.value.toLocaleLowerCase().trim())
);

View File

@@ -157,8 +157,7 @@ function onReset() {
parentPath: "/",
meta: {
title: "menus.hshome",
icon: "home-filled",
i18n: true
icon: "home-filled"
}
}
]);

View File

@@ -65,7 +65,7 @@ const getBreadcrumb = (): void => {
{
path: "/welcome",
parentPath: "/",
meta: { title: "menus.hshome", i18n: true }
meta: { title: "menus.hshome" }
} as unknown as RouteLocationMatched
].concat(matched);
}
@@ -104,10 +104,10 @@ const handleLink = (item: RouteLocationMatched): any => {
<span
v-if="item.redirect === 'noRedirect' || index == levelList.length - 1"
class="no-redirect"
>{{ transformI18n(item.meta.title, item.meta.i18n) }}</span
>{{ transformI18n(item.meta.title) }}</span
>
<a v-else @click.prevent="handleLink(item)">
{{ transformI18n(item.meta.title, item.meta.i18n) }}
{{ transformI18n(item.meta.title) }}
</a>
</el-breadcrumb-item>
</transition-group>

View File

@@ -127,7 +127,7 @@ function translationEn() {
<div v-show="route.meta.icon" :class="['el-icon', route.meta.icon]">
<component :is="useRenderIcon(route.meta && route.meta.icon)" />
</div>
<span>{{ transformI18n(route.meta.title, route.meta.i18n) }}</span>
<span>{{ transformI18n(route.meta.title) }}</span>
<FontIcon
v-if="route.meta.extraIcon"
width="30px"

View File

@@ -167,13 +167,13 @@ function resolvePath(routePath) {
:style="getDivStyle"
>
<span :style="getMenuTextStyle">
{{ transformI18n(onlyOneChild.meta.title, onlyOneChild.meta.i18n) }}
{{ transformI18n(onlyOneChild.meta.title) }}
</span>
</div>
<template #title>
<div :style="getDivStyle">
<span v-if="!menuMode">{{
transformI18n(onlyOneChild.meta.title, onlyOneChild.meta.i18n)
transformI18n(onlyOneChild.meta.title)
}}</span>
<el-tooltip
v-else
@@ -182,18 +182,14 @@ function resolvePath(routePath) {
:disabled="!onlyOneChild.showTooltip"
>
<template #content>
{{
transformI18n(onlyOneChild.meta.title, onlyOneChild.meta.i18n)
}}
{{ transformI18n(onlyOneChild.meta.title) }}
</template>
<span
ref="menuTextRef"
:style="getMenuTextStyle"
@mouseover="hoverMenu(onlyOneChild)"
>
{{
transformI18n(onlyOneChild.meta.title, onlyOneChild.meta.i18n)
}}
{{ transformI18n(onlyOneChild.meta.title) }}
</span>
</el-tooltip>
<FontIcon
@@ -221,9 +217,7 @@ function resolvePath(routePath) {
:is="useRenderIcon(props.item.meta && props.item.meta.icon)"
/>
</div>
<span v-if="!menuMode">{{
transformI18n(props.item.meta.title, props.item.meta.i18n)
}}</span>
<span v-if="!menuMode">{{ transformI18n(props.item.meta.title) }}</span>
<el-tooltip
v-else
placement="top"
@@ -231,7 +225,7 @@ function resolvePath(routePath) {
:disabled="!pureApp.sidebar.opened || !props.item.showTooltip"
>
<template #content>
{{ transformI18n(props.item.meta.title, props.item.meta.i18n) }}
{{ transformI18n(props.item.meta.title) }}
</template>
<div
ref="menuTextRef"
@@ -239,7 +233,7 @@ function resolvePath(routePath) {
@mouseover="hoverMenu(props.item)"
>
<span :style="getSpanStyle">
{{ transformI18n(props.item.meta.title, props.item.meta.i18n) }}
{{ transformI18n(props.item.meta.title) }}
</span>
</div>
</el-tooltip>

View File

@@ -3,6 +3,7 @@ import {
ref,
watch,
unref,
toRaw,
reactive,
nextTick,
computed,
@@ -318,7 +319,6 @@ function deleteDynamicTag(obj: any, current: any, tag?: string) {
parentPath: "/",
meta: {
title: "menus.hshome",
i18n: true,
icon: "home-filled"
}
},
@@ -662,7 +662,7 @@ const getContextMenuStyle = computed((): CSSProperties => {
@click="tagOnClick(item)"
>
<router-link :to="item.path"
>{{ transformI18n(item.meta.title, item.meta.i18n) }}
>{{ transformI18n(item.meta.title) }}
</router-link>
<span
v-if="
@@ -702,7 +702,7 @@ const getContextMenuStyle = computed((): CSSProperties => {
style="display: flex; align-items: center"
>
<li v-if="item.show" @click="selectTag(key, item)">
<component :is="item.icon" :key="key" />
<component :is="toRaw(item.icon)" :key="key" />
{{ t(item.text) }}
</li>
</div>
@@ -736,7 +736,7 @@ const getContextMenuStyle = computed((): CSSProperties => {
:disabled="item.disabled"
>
<component
:is="item.icon"
:is="toRaw(item.icon)"
:key="key"
style="margin-right: 6px"
/>

View File

@@ -1,12 +1,19 @@
<template>
<div class="frame" v-loading="loading">
<div
class="frame"
v-loading="loading"
:element-loading-text="t('status.hsLoad')"
>
<iframe :src="frameSrc" class="frame-iframe" ref="frameRef" />
</div>
</template>
<script lang="ts" setup>
import { useI18n } from "vue-i18n";
import { useRoute } from "vue-router";
import { ref, unref, onMounted, nextTick } from "vue";
const { t } = useI18n();
const loading = ref(false);
const currentRoute = useRoute();
const frameSrc = ref<string>("");
@@ -45,7 +52,7 @@ onMounted(() => {
<style lang="scss" scoped>
.frame {
height: 100vh;
height: calc(100vh - 88px);
z-index: 998;
.frame-iframe {
@@ -58,6 +65,6 @@ onMounted(() => {
}
.main-content {
margin: 0 !important;
margin: 2px 0 0 !important;
}
</style>

View File

@@ -38,9 +38,8 @@ export function useNav() {
// 动态title
function changeTitle(meta: routeMetaType) {
const Title = getConfig().Title;
if (Title)
document.title = `${transformI18n(meta.title, meta.i18n)} | ${Title}`;
else document.title = transformI18n(meta.title, meta.i18n);
if (Title) document.title = `${transformI18n(meta.title)} | ${Title}`;
else document.title = transformI18n(meta.title);
}
// 退出登录

View File

@@ -5,7 +5,6 @@ export const routerArrays: Array<RouteConfigs> = [
parentPath: "/",
meta: {
title: "menus.hshome",
i18n: true,
icon: "home-filled"
}
}

View File

@@ -30,15 +30,11 @@ export const localesConfigs = {
};
/**
* 国际化转换工具函数
* 国际化转换工具函数自动读取根目录locales文件夹下文件进行国际化匹配
* @param message message
* @param isI18n 如果true,获取对应的消息,否则返回本身
* @returns message
* @returns 转化后的message
*/
export function transformI18n(
message: string | unknown | object = "",
isI18n: boolean | unknown = false
) {
export function transformI18n(message: any = "") {
if (!message) {
return "";
}
@@ -50,7 +46,11 @@ export function transformI18n(
return message[locale?.value];
}
if (isI18n) {
const key = message.match(/(\S*)\./)?.[1];
if (key && Object.keys(siphonI18n("zh-CN")).includes(key)) {
return i18n.global.t.call(i18n.global.locale, message);
} else if (!key && Object.keys(siphonI18n("zh-CN")).includes(message)) {
// 兼容非嵌套形式的国际化写法
return i18n.global.t.call(i18n.global.locale, message);
} else {
return message;

View File

@@ -115,11 +115,8 @@ router.beforeEach((to: toRouteType, _from, next) => {
if (!item.meta.title) return "";
const Title = getConfig().Title;
if (Title)
document.title = `${transformI18n(
item.meta.title,
item.meta?.i18n
)} | ${Title}`;
else document.title = transformI18n(item.meta.title, item.meta?.i18n);
document.title = `${transformI18n(item.meta.title)} | ${Title}`;
else document.title = transformI18n(item.meta.title);
});
if (name) {
if (_from?.name) {

View File

@@ -8,7 +8,6 @@ const ableRouter = {
meta: {
icon: "ubuntu-fill",
title: $t("menus.hsAble"),
i18n: true,
rank: 4
},
children: [
@@ -17,8 +16,7 @@ const ableRouter = {
name: "reWatermark",
component: () => import("/@/views/able/watermark.vue"),
meta: {
title: $t("menus.hsWatermark"),
i18n: true
title: $t("menus.hsWatermark")
}
},
{
@@ -26,8 +24,7 @@ const ableRouter = {
name: "rePrint",
component: () => import("/@/views/able/print.vue"),
meta: {
title: $t("menus.hsPrint"),
i18n: true
title: $t("menus.hsPrint")
}
},
{
@@ -35,8 +32,7 @@ const ableRouter = {
name: "reIconSelect",
component: () => import("/@/views/able/icon-select.vue"),
meta: {
title: $t("menus.hsIconSelect"),
i18n: true
title: $t("menus.hsIconSelect")
}
},
{
@@ -44,8 +40,7 @@ const ableRouter = {
name: "reTimeline",
component: () => import("/@/views/able/timeline.vue"),
meta: {
title: $t("menus.hsTimeline"),
i18n: true
title: $t("menus.hsTimeline")
}
},
{
@@ -53,8 +48,7 @@ const ableRouter = {
name: "reMenuTree",
component: () => import("/@/views/able/menu-tree.vue"),
meta: {
title: $t("menus.hsMenuTree"),
i18n: true
title: $t("menus.hsMenuTree")
}
},
{
@@ -62,8 +56,7 @@ const ableRouter = {
name: "reLineTree",
component: () => import("/@/views/able/line-tree.vue"),
meta: {
title: $t("menus.hsLineTree"),
i18n: true
title: $t("menus.hsLineTree")
}
},
{
@@ -71,8 +64,7 @@ const ableRouter = {
name: "reAntTabs",
component: () => import("/@/views/able/ant-tabs.vue"),
meta: {
title: $t("menus.hsAntTabs"),
i18n: true
title: $t("menus.hsAntTabs")
}
},
{
@@ -80,8 +72,7 @@ const ableRouter = {
name: "reAntAnchor",
component: () => import("/@/views/able/ant-anchor.vue"),
meta: {
title: $t("menus.hsAntAnchor"),
i18n: true
title: $t("menus.hsAntAnchor")
}
},
{
@@ -89,8 +80,7 @@ const ableRouter = {
name: "reAntTreeSelect",
component: () => import("/@/views/able/ant-treeSelect.vue"),
meta: {
title: $t("menus.hsAntTreeSelect"),
i18n: true
title: $t("menus.hsAntTreeSelect")
}
},
{
@@ -98,8 +88,7 @@ const ableRouter = {
name: "reDebounce",
component: () => import("/@/views/able/debounce.vue"),
meta: {
title: $t("menus.hsDebounce"),
i18n: true
title: $t("menus.hsDebounce")
}
},
{
@@ -107,8 +96,7 @@ const ableRouter = {
name: "reBarcode",
component: () => import("/@/views/able/barcode.vue"),
meta: {
title: $t("menus.hsBarcode"),
i18n: true
title: $t("menus.hsBarcode")
}
},
{
@@ -116,8 +104,7 @@ const ableRouter = {
name: "reQrcode",
component: () => import("/@/views/able/qrcode.vue"),
meta: {
title: $t("menus.hsQrcode"),
i18n: true
title: $t("menus.hsQrcode")
}
},
{
@@ -125,8 +112,7 @@ const ableRouter = {
name: "reCascader",
component: () => import("/@/views/able/cascader.vue"),
meta: {
title: $t("menus.hsCascader"),
i18n: true
title: $t("menus.hsCascader")
}
},
{
@@ -134,8 +120,7 @@ const ableRouter = {
name: "reSwiper",
component: () => import("/@/views/able/swiper.vue"),
meta: {
title: $t("menus.hsSwiper"),
i18n: true
title: $t("menus.hsSwiper")
}
}
]

View File

@@ -8,7 +8,6 @@ const aboutRouter = {
meta: {
icon: "question-line",
title: $t("menus.hsAbout"),
i18n: true,
rank: 15
},
children: [
@@ -17,8 +16,7 @@ const aboutRouter = {
name: "reAbout",
component: () => import("/@/views/about/index.vue"),
meta: {
title: $t("menus.hsAbout"),
i18n: true
title: $t("menus.hsAbout")
}
}
]

View File

@@ -8,7 +8,6 @@ const componentsRouter = {
meta: {
icon: "menu",
title: $t("menus.hscomponents"),
i18n: true,
rank: 5
},
children: [
@@ -17,8 +16,7 @@ const componentsRouter = {
name: "video",
component: () => import("/@/views/components/video/index.vue"),
meta: {
title: $t("menus.hsvideo"),
i18n: true
title: $t("menus.hsvideo")
}
},
{
@@ -28,7 +26,6 @@ const componentsRouter = {
meta: {
title: $t("menus.hsmap"),
keepAlive: true,
i18n: true,
transition: {
name: "fade"
}
@@ -40,7 +37,6 @@ const componentsRouter = {
component: () => import("/@/views/components/draggable/index.vue"),
meta: {
title: $t("menus.hsdraggable"),
i18n: true,
transition: {
enterTransition: "animate__zoomIn",
leaveTransition: "animate__zoomOut"
@@ -54,7 +50,6 @@ const componentsRouter = {
component: () => import("/@/views/components/split-pane/index.vue"),
meta: {
title: $t("menus.hssplitPane"),
i18n: true,
extraIcon: {
svg: true,
name: "team-iconxinpinrenqiwang"
@@ -66,8 +61,7 @@ const componentsRouter = {
name: "button",
component: () => import("/@/views/components/button/index.vue"),
meta: {
title: $t("menus.hsbutton"),
i18n: true
title: $t("menus.hsbutton")
}
},
{
@@ -75,8 +69,7 @@ const componentsRouter = {
name: "cropping",
component: () => import("/@/views/components/cropping/index.vue"),
meta: {
title: $t("menus.hscropping"),
i18n: true
title: $t("menus.hscropping")
}
},
{
@@ -84,8 +77,7 @@ const componentsRouter = {
name: "countTo",
component: () => import("/@/views/components/count-to/index.vue"),
meta: {
title: $t("menus.hscountTo"),
i18n: true
title: $t("menus.hscountTo")
}
},
{
@@ -93,8 +85,7 @@ const componentsRouter = {
name: "selector",
component: () => import("/@/views/components/selector/index.vue"),
meta: {
title: $t("menus.hsselector"),
i18n: true
title: $t("menus.hsselector")
}
},
{
@@ -102,8 +93,7 @@ const componentsRouter = {
name: "seamlessScroll",
component: () => import("/@/views/components/seamless-scroll/index.vue"),
meta: {
title: $t("menus.hsseamless"),
i18n: true
title: $t("menus.hsseamless")
}
},
{
@@ -111,8 +101,7 @@ const componentsRouter = {
name: "contextmenu",
component: () => import("/@/views/components/contextmenu/index.vue"),
meta: {
title: $t("menus.hscontextmenu"),
i18n: true
title: $t("menus.hscontextmenu")
}
}
]

View File

@@ -8,7 +8,6 @@ const editorRouter = {
meta: {
icon: "edit",
title: $t("menus.hseditor"),
i18n: true,
rank: 2
},
children: [
@@ -18,7 +17,6 @@ const editorRouter = {
component: () => import("/@/views/editor/index.vue"),
meta: {
title: $t("menus.hseditor"),
i18n: true,
keepAlive: true
}
}

View File

@@ -8,7 +8,6 @@ const errorRouter = {
meta: {
icon: "information-line",
title: $t("menus.hserror"),
i18n: true,
rank: 9
},
children: [
@@ -17,8 +16,7 @@ const errorRouter = {
name: "403",
component: () => import("/@/views/error/403.vue"),
meta: {
title: $t("menus.hsfourZeroOne"),
i18n: true
title: $t("menus.hsfourZeroOne")
}
},
{
@@ -26,8 +24,7 @@ const errorRouter = {
name: "404",
component: () => import("/@/views/error/404.vue"),
meta: {
title: $t("menus.hsfourZeroFour"),
i18n: true
title: $t("menus.hsfourZeroFour")
}
},
{
@@ -35,8 +32,7 @@ const errorRouter = {
name: "500",
component: () => import("/@/views/error/500.vue"),
meta: {
title: $t("menus.hsFive"),
i18n: true
title: $t("menus.hsFive")
}
}
]

View File

@@ -8,7 +8,6 @@ const flowChartRouter = {
meta: {
icon: "set-up",
title: $t("menus.hsflowChart"),
i18n: true,
rank: 1
},
children: [
@@ -17,8 +16,7 @@ const flowChartRouter = {
name: "flowChart",
component: () => import("/@/views/flow-chart/index.vue"),
meta: {
title: $t("menus.hsflowChart"),
i18n: true
title: $t("menus.hsflowChart")
}
}
]

View File

@@ -8,7 +8,6 @@ const formDesignRouter = {
meta: {
icon: "terminal-window-line",
title: $t("menus.hsFormDesign"),
i18n: true,
rank: 2
},
children: [
@@ -17,8 +16,7 @@ const formDesignRouter = {
name: "formDesign",
component: () => import("/@/views/form-design/index.vue"),
meta: {
title: $t("menus.hsFormDesign"),
i18n: true
title: $t("menus.hsFormDesign")
}
}
]

View File

@@ -8,7 +8,6 @@ const guideRouter = {
meta: {
icon: "guide",
title: $t("menus.hsguide"),
i18n: true,
rank: 14
},
children: [
@@ -17,8 +16,7 @@ const guideRouter = {
name: "reGuide",
component: () => import("/@/views/guide/index.vue"),
meta: {
title: $t("menus.hsguide"),
i18n: true
title: $t("menus.hsguide")
}
}
]

View File

@@ -9,7 +9,6 @@ const homeRouter = {
meta: {
icon: "home-filled",
title: $t("menus.hshome"),
i18n: true,
rank: 0
},
children: [
@@ -18,8 +17,7 @@ const homeRouter = {
name: "welcome",
component: () => import("/@/views/welcome.vue"),
meta: {
title: $t("menus.hshome"),
i18n: true
title: $t("menus.hshome")
}
}
]

View File

@@ -8,7 +8,6 @@ const ableRouter = {
meta: {
icon: "list-check",
title: $t("menus.hsList"),
i18n: true,
rank: 12
},
children: [
@@ -19,7 +18,6 @@ const ableRouter = {
meta: {
icon: "card",
title: $t("menus.hsListCard"),
i18n: true,
showParent: true
}
}

View File

@@ -8,7 +8,6 @@ const nestedRouter = {
meta: {
title: $t("menus.hsmenus"),
icon: "histogram",
i18n: true,
rank: 6
},
children: [
@@ -16,7 +15,6 @@ const nestedRouter = {
path: "/nested/menu1",
meta: {
title: $t("menus.hsmenu1"),
i18n: true,
keepAlive: true
},
redirect: "/nested/menu1/menu1-1",
@@ -27,7 +25,6 @@ const nestedRouter = {
name: "Menu1-1",
meta: {
title: $t("menus.hsmenu1-1"),
i18n: true,
keepAlive: true
}
},
@@ -36,7 +33,6 @@ const nestedRouter = {
redirect: "/nested/menu1/menu1-2/menu1-2-1",
meta: {
title: $t("menus.hsmenu1-2"),
i18n: true,
keepAlive: true
},
children: [
@@ -47,7 +43,6 @@ const nestedRouter = {
name: "Menu1-2-1",
meta: {
title: $t("menus.hsmenu1-2-1"),
i18n: true,
keepAlive: true
}
},
@@ -59,7 +54,6 @@ const nestedRouter = {
meta: {
title: $t("menus.hsmenu1-2-2"),
keepAlive: true,
i18n: true,
extraIcon: {
svg: true,
name: "team-iconxinpinrenqiwang"
@@ -74,7 +68,6 @@ const nestedRouter = {
name: "Menu1-3",
meta: {
title: $t("menus.hsmenu1-3"),
i18n: true,
keepAlive: true
}
}
@@ -86,7 +79,6 @@ const nestedRouter = {
component: () => import("/@/views/nested/menu2/index.vue"),
meta: {
title: $t("menus.hsmenu2"),
i18n: true,
keepAlive: true
}
}

View File

@@ -8,7 +8,6 @@ const pptRouter = {
meta: {
icon: "ppt",
title: "PPT",
i18n: false,
rank: 3
},
children: [
@@ -18,7 +17,6 @@ const pptRouter = {
component: IFrame,
meta: {
title: "PPT",
i18n: false,
frameSrc: "https://pipipi-pikachu.github.io/PPTist/",
extraIcon: {
svg: true,

View File

@@ -9,7 +9,6 @@ const remainingRouter = [
meta: {
title: $t("menus.hslogin"),
showLink: false,
i18n: true,
rank: 101
}
},
@@ -19,7 +18,6 @@ const remainingRouter = [
meta: {
icon: "home-filled",
title: $t("menus.hshome"),
i18n: true,
showLink: false,
rank: 104
},

View File

@@ -8,7 +8,6 @@ const resultRouter = {
meta: {
icon: "checkbox-circle-line",
title: $t("menus.hsResult"),
i18n: true,
rank: 8
},
children: [
@@ -17,8 +16,7 @@ const resultRouter = {
name: "reSuccess",
component: () => import("/@/views/result/success.vue"),
meta: {
title: $t("menus.hsSuccess"),
i18n: true
title: $t("menus.hsSuccess")
}
},
{
@@ -26,8 +24,7 @@ const resultRouter = {
name: "reFail",
component: () => import("/@/views/result/fail.vue"),
meta: {
title: $t("menus.hsFail"),
i18n: true
title: $t("menus.hsFail")
}
}
]

View File

@@ -17,8 +17,7 @@ export const useMultiTagsStore = defineStore({
parentPath: "/",
meta: {
title: "menus.hshome",
icon: "home-filled",
i18n: true
icon: "home-filled"
}
}
],

View File

@@ -68,8 +68,7 @@ export const useUserStore = defineStore({
parentPath: "/",
meta: {
title: "menus.hshome",
icon: "home-filled",
i18n: true
icon: "home-filled"
}
}
]);

View File

@@ -46,7 +46,6 @@ export const injectResponsiveStorage = (app: App, config: ServerConfigs) => {
parentPath: "/",
meta: {
title: "menus.hshome",
i18n: true,
icon: "home-filled"
}
}

View File

@@ -18,7 +18,6 @@ const { t } = useI18n();
interface treeNode extends TreeNode {
meta: {
title: string;
i18n: boolean;
};
}
@@ -41,7 +40,7 @@ const onQueryChanged = (query: string) => {
};
const filterMethod = (query: string, node: treeNode) => {
return transformI18n(node.meta.title, node.meta.i18n)!.indexOf(query) !== -1;
return transformI18n(node.meta.title)!.indexOf(query) !== -1;
};
</script>

View File

@@ -8,6 +8,6 @@ import { Amap } from "/@/components/ReMap";
<style scoped>
.main-content {
margin: 0 !important;
margin: 2px 0 0 !important;
}
</style>

View File

@@ -35,7 +35,6 @@ function toDetail(index: number) {
meta: {
title: { zh: `No.${index} - 详情信息`, en: `No.${index} - DetailInfo` },
showLink: false,
i18n: false,
dynamicLevel: 3
}
});