Skip to content

Commit

Permalink
perf: 优化transformI18n函数,国际化支持无限嵌套级别(当然平台还是推荐嵌套层级越少越好)
Browse files Browse the repository at this point in the history
  • Loading branch information
xiaoxian521 committed Jul 18, 2023
1 parent fe5ed68 commit b0b03a3
Showing 1 changed file with 28 additions and 3 deletions.
31 changes: 28 additions & 3 deletions src/plugins/i18n.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
// 多组件库的国际化和本地项目国际化兼容
import { App, WritableComputedRef } from "vue";
import { storageLocal } from "@pureadmin/utils";
import { type I18n, createI18n } from "vue-i18n";
import { responsiveStorageNameSpace } from "@/config";
import { storageLocal, isObject } from "@pureadmin/utils";

// element-plus国际化
import enLocale from "element-plus/lib/locale/lang/en";
Expand Down Expand Up @@ -30,6 +30,30 @@ export const localesConfigs = {
}
};

/** 获取对象中所有嵌套对象的key键,并将它们用点号分割组成字符串 */
function getObjectKeys(obj) {
const stack = [];
const keys = [];

stack.push({ obj, key: "" });

while (stack.length > 0) {
const { obj, key } = stack.pop();

for (const k in obj) {
const newKey = key ? `${key}.${k}` : k;

if (obj[k] && isObject(obj[k])) {
stack.push({ obj: obj[k], key: newKey });
} else {
keys.push(newKey);
}
}
}

return keys;
}

/**
* 国际化转换工具函数(自动读取根目录locales文件夹下文件进行国际化匹配)
* @param message message
Expand All @@ -47,8 +71,9 @@ export function transformI18n(message: any = "") {
return message[locale?.value];
}

const key = message.match(/(\S*)\./)?.[1];
if (key && Object.keys(siphonI18n("zh-CN")).includes(key)) {
const key = message.match(/(\S*)\./)?.input;

if (key && getObjectKeys(siphonI18n("zh-CN")).find(item => item === key)) {
return i18n.global.t.call(i18n.global.locale, message);
} else if (!key && Object.keys(siphonI18n("zh-CN")).includes(message)) {
// 兼容非嵌套形式的国际化写法
Expand Down

0 comments on commit b0b03a3

Please sign in to comment.