From d8400cf665c30e8e5539711e4dae40cd9fd88811 Mon Sep 17 00:00:00 2001 From: devin Date: Fri, 1 Aug 2025 11:31:47 +0800 Subject: [PATCH 1/3] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E5=88=86?= =?UTF-8?q?=E6=89=B9=E6=89=A7=E8=A1=8C=E5=87=BD=E6=95=B0=EF=BC=8C=E5=8F=AF?= =?UTF-8?q?=E7=94=A8=E4=BA=8E=E8=80=97=E6=97=B6=E7=9A=84=E5=A4=A7=E9=87=8F?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E6=89=A7=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/opendesign/src/_utils/helper.ts | 37 ++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/packages/opendesign/src/_utils/helper.ts b/packages/opendesign/src/_utils/helper.ts index cc90a990..31b566d8 100644 --- a/packages/opendesign/src/_utils/helper.ts +++ b/packages/opendesign/src/_utils/helper.ts @@ -251,3 +251,40 @@ export function pick(source: Object, keys: string[]) { }); return result; } + + +/** + * 分批执行大量任务 + * tasks: 任务列表 Array<() => void> + * sheduler:调度器函数,用于分批执行任务 + * runChunk:分批执行函数 (toContinue:(currentTaskIndex: number)=>boolean)=>void + * toContinue:(currentTaskIndex: number)=>boolean 是否继续执行的条件 + */ +export function performTask(tasks: Array<() => void>, sheduler: (runChunk: (toContinue: (currentTaskIndex: number) => boolean) => void) => void) { + let runingIndex = 0; + function _runTask() { + sheduler((toContinue) => { + while (runingIndex < tasks.length && toContinue(runingIndex)) { + tasks[runingIndex++](); + } + if (runingIndex < tasks.length) { + _runTask(); + } + }); + } + _runTask(); +} + +/** + * 分时执行大量任务,使用requestIdleCallback + * tasks: 任务列表 Array<() => void> + */ +export function idlePerformTask(tasks: Array<() => void>) { + const sheduler = (runChunk: (toContinue: () => boolean) => void) => { + requestIdleCallback((idle) => { + runChunk(() => idle.timeRemaining() > 0); + }); + }; + + performTask(tasks, sheduler); +} \ No newline at end of file -- Gitee From fadd30b10619b489f051a8bd5134f989d92d693c Mon Sep 17 00:00:00 2001 From: devin Date: Mon, 4 Aug 2025 18:59:42 +0800 Subject: [PATCH 2/3] =?UTF-8?q?feat:=20=E9=87=8D=E6=9E=84=E5=A4=9A?= =?UTF-8?q?=E8=AF=AD=E8=A8=80=EF=BC=8C=E5=A2=9E=E5=8A=A0=E8=AF=8D=E6=9D=A1?= =?UTF-8?q?=E5=8F=AF=E8=AF=BB=E6=80=A7=EF=BC=9B=E6=94=AF=E6=8C=81useI18n?= =?UTF-8?q?=E5=9C=A8=E9=9D=9E=E7=BB=84=E4=BB=B6=E4=B8=AD=E4=BD=BF=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/docs/src/lang/en-US.ts | 16 ++-- packages/docs/src/lang/index.ts | 20 ++--- packages/docs/src/lang/zh-CN.ts | 16 ++-- packages/docs/tsconfig.json | 3 + .../config-provider/__demo__/ConfigLink.vue | 21 +++++ .../config-provider/__demo__/ConfigLocale.vue | 60 +++++++++++++++ .../__demo__/ConfigProviderBasic.vue | 76 ------------------- .../src/config-provider/__demo__/TheChild.vue | 6 +- .../src/config-provider/__demo__/TheIndex.vue | 6 +- .../opendesign/src/config-provider/types.ts | 3 + .../src/locale/__demo__/LocaleBasic.vue | 49 ++++++++++++ .../src/locale/__demo__/TheIndex.vue | 9 +++ packages/opendesign/src/locale/index.ts | 45 ++++++++--- packages/opendesign/src/locale/lang/en-us.ts | 47 +++++------- packages/opendesign/src/locale/lang/zh-cn.ts | 47 +++++------- packages/opendesign/src/locale/types.ts | 50 ++++++------ .../opendesign/src/pagination/OPagination.vue | 10 ++- packages/portal/src/components/TheHeader.vue | 4 +- packages/portal/src/router.ts | 8 ++ 19 files changed, 282 insertions(+), 214 deletions(-) create mode 100644 packages/opendesign/src/config-provider/__demo__/ConfigLink.vue create mode 100644 packages/opendesign/src/config-provider/__demo__/ConfigLocale.vue delete mode 100644 packages/opendesign/src/config-provider/__demo__/ConfigProviderBasic.vue create mode 100644 packages/opendesign/src/locale/__demo__/LocaleBasic.vue create mode 100644 packages/opendesign/src/locale/__demo__/TheIndex.vue diff --git a/packages/docs/src/lang/en-US.ts b/packages/docs/src/lang/en-US.ts index 9df6479b..2b83d673 100644 --- a/packages/docs/src/lang/en-US.ts +++ b/packages/docs/src/lang/en-US.ts @@ -1,13 +1,7 @@ export default { - components: { - component: 'Component', - }, - header: { - globalSettings: 'Global settings', - home: 'Home', - theme: 'Theme', - }, - dev: { - devEnv: 'Dev env' - } + locale: 'en-US', + 'components.component': 'component', + 'header.globalSettings': 'global settings', + 'header.home': 'home', + 'dev.devEnv': 'dev env' }; diff --git a/packages/docs/src/lang/index.ts b/packages/docs/src/lang/index.ts index 3cda6de2..dc104d90 100644 --- a/packages/docs/src/lang/index.ts +++ b/packages/docs/src/lang/index.ts @@ -1,22 +1,17 @@ import { useLocale, useI18n, addLocale } from '@opensig/opendesign'; import { computed } from 'vue'; // @opensig/opendesign 未暴露语言包,因此通过路径添加 -import zhCn from '@components/locale/lang/zh-cn'; import enUS from '@components/locale/lang/en-us'; import enUSPortal from './en-US'; import zhCNPortal from './zh-CN'; -export const messages = { - 'en-US': { - ...enUS, - ...enUSPortal, - }, - 'zh-CN': { - ...zhCn, - ...zhCNPortal, - }, -}; -export type LocaleT = keyof typeof messages; +addLocale(enUS, { overwrite: true }); +addLocale(enUSPortal, { overwrite: true }); +addLocale(zhCNPortal, { overwrite: true }); + + + +export type LocaleT = 'zh-CN' | 'en-US'; type LocaleItemT = { value: LocaleT; label: string }; export const locales: Array = [ { @@ -40,4 +35,3 @@ export const changeLocale = (l: LocaleT) => { document.cookie = `${LOCALE_COOKIE_KEY}=${l}; path=/`; }; -addLocale(messages, { overwrite: true }); diff --git a/packages/docs/src/lang/zh-CN.ts b/packages/docs/src/lang/zh-CN.ts index 461840e4..b1305974 100644 --- a/packages/docs/src/lang/zh-CN.ts +++ b/packages/docs/src/lang/zh-CN.ts @@ -1,13 +1,7 @@ export default { - components: { - component: '组件', - }, - header: { - globalSettings: '全局设置', - home: '首页', - theme: '主题', - }, - dev: { - devEnv: '开发环境', - }, + locale: 'zh-CN', + 'components.component': '组件', + 'header.globalSettings': '全局设置', + 'header.home': '首页', + 'dev.devEnv': '开发环境', }; diff --git a/packages/docs/tsconfig.json b/packages/docs/tsconfig.json index 25426853..838e2ab8 100644 --- a/packages/docs/tsconfig.json +++ b/packages/docs/tsconfig.json @@ -22,6 +22,9 @@ ], "@components/*": [ "../opendesign/src/*" + ], + "@opensig/opendesign": [ + "../opendesign/src/index.ts" ] } }, diff --git a/packages/opendesign/src/config-provider/__demo__/ConfigLink.vue b/packages/opendesign/src/config-provider/__demo__/ConfigLink.vue new file mode 100644 index 00000000..b1c76cfa --- /dev/null +++ b/packages/opendesign/src/config-provider/__demo__/ConfigLink.vue @@ -0,0 +1,21 @@ + + + diff --git a/packages/opendesign/src/config-provider/__demo__/ConfigLocale.vue b/packages/opendesign/src/config-provider/__demo__/ConfigLocale.vue new file mode 100644 index 00000000..bfe39a01 --- /dev/null +++ b/packages/opendesign/src/config-provider/__demo__/ConfigLocale.vue @@ -0,0 +1,60 @@ + + + diff --git a/packages/opendesign/src/config-provider/__demo__/ConfigProviderBasic.vue b/packages/opendesign/src/config-provider/__demo__/ConfigProviderBasic.vue deleted file mode 100644 index 913b48f4..00000000 --- a/packages/opendesign/src/config-provider/__demo__/ConfigProviderBasic.vue +++ /dev/null @@ -1,76 +0,0 @@ - - - diff --git a/packages/opendesign/src/config-provider/__demo__/TheChild.vue b/packages/opendesign/src/config-provider/__demo__/TheChild.vue index 5b5ad218..786f02a5 100644 --- a/packages/opendesign/src/config-provider/__demo__/TheChild.vue +++ b/packages/opendesign/src/config-provider/__demo__/TheChild.vue @@ -5,7 +5,9 @@ const { t, locale } = useI18n(); diff --git a/packages/opendesign/src/config-provider/__demo__/TheIndex.vue b/packages/opendesign/src/config-provider/__demo__/TheIndex.vue index a6286ff0..a91649d0 100644 --- a/packages/opendesign/src/config-provider/__demo__/TheIndex.vue +++ b/packages/opendesign/src/config-provider/__demo__/TheIndex.vue @@ -1,9 +1,11 @@ diff --git a/packages/opendesign/src/config-provider/types.ts b/packages/opendesign/src/config-provider/types.ts index 2d2035ee..eb52c612 100644 --- a/packages/opendesign/src/config-provider/types.ts +++ b/packages/opendesign/src/config-provider/types.ts @@ -14,6 +14,9 @@ export const configProviderProps = { locale: { type: Object as PropType, }, + /** + * Link组件全局配置 + */ link: { type: Object as PropType, }, diff --git a/packages/opendesign/src/locale/__demo__/LocaleBasic.vue b/packages/opendesign/src/locale/__demo__/LocaleBasic.vue new file mode 100644 index 00000000..377d2570 --- /dev/null +++ b/packages/opendesign/src/locale/__demo__/LocaleBasic.vue @@ -0,0 +1,49 @@ + + + + diff --git a/packages/opendesign/src/locale/__demo__/TheIndex.vue b/packages/opendesign/src/locale/__demo__/TheIndex.vue new file mode 100644 index 00000000..063e9fdd --- /dev/null +++ b/packages/opendesign/src/locale/__demo__/TheIndex.vue @@ -0,0 +1,9 @@ + + + diff --git a/packages/opendesign/src/locale/index.ts b/packages/opendesign/src/locale/index.ts index 556bfe5a..e85bf7aa 100644 --- a/packages/opendesign/src/locale/index.ts +++ b/packages/opendesign/src/locale/index.ts @@ -1,13 +1,12 @@ import { log } from '../_utils/log'; -import { getValueByPath } from '../_utils/helper'; -import { isString } from '../_utils/is'; +import { isArray, isString, isUndefined } from '../_utils/is'; import { configProviderInjectKey } from '../config-provider'; -import { computed, inject, ref } from 'vue'; +import { computed, inject, ref, getCurrentInstance } from 'vue'; import zhCN from './lang/zh-cn'; -import { LanguageT, i18nLanguages } from './types'; +import { OpendesignLanguageT, i18nLanguagesT } from './types'; const currentLocal = ref('zh-CN'); -const i18nLanguage = ref>({ +const i18nLanguage = ref>({ 'zh-CN': zhCN, }); @@ -17,15 +16,31 @@ const i18nLanguage = ref>({ * @param opts 配置 */ export function addLocale( - locale: i18nLanguages, + locale: i18nLanguagesT[], opts?: { overwrite?: boolean; } ) { - Object.keys(locale).forEach((key) => { - if (!i18nLanguage.value[key] || opts?.overwrite) { - i18nLanguage.value[key] = locale[key]; + const locales = isArray(locale) ? locale : [locale]; + + locales.forEach(lc => { + const currLocal = lc.locale; + if (!currLocal) { + return; + } + + if (!i18nLanguage.value[currLocal]) { + i18nLanguage.value[currLocal] = { + locale: lc.locale + }; } + + Object.keys(lc).forEach((key) => { + const k = key as keyof OpendesignLanguageT; + if (!i18nLanguage.value[currLocal][k] || opts?.overwrite) { + i18nLanguage.value[currLocal][k] = lc[key]; + } + }); }); } @@ -36,14 +51,16 @@ export function addLocale( */ export function useLocale(localeKey: string) { if (!i18nLanguage.value[localeKey]) { - log.warn(`no ${localeKey} languages found`); + log.warn(`no '${localeKey}' languages configed`); return; } currentLocal.value = localeKey; } export function useI18n() { - const configProvider = inject(configProviderInjectKey, {}); + const instance = getCurrentInstance(); + // 判断当前是否在组件环境下,如果是,则优先取configProvider的值 + const configProvider = instance ? inject(configProviderInjectKey, {}) : null; const languages = computed(() => { return configProvider?.locale ?? i18nLanguage.value[currentLocal.value]; }); @@ -54,7 +71,7 @@ export function useI18n() { log.warn('no languages configed'); return ''; } - const value = getValueByPath(languages.value, key); + const value = languages.value[key]; // 处理变量替换 if (args.length > 0 && isString(value)) { @@ -63,6 +80,10 @@ export function useI18n() { }); } + if (isUndefined(value)) { + log.warn(`Cannot translate the value of keypath '${key}'`); + } + return value; }; diff --git a/packages/opendesign/src/locale/lang/en-us.ts b/packages/opendesign/src/locale/lang/en-us.ts index 743ab8a1..ddddbc31 100644 --- a/packages/opendesign/src/locale/lang/en-us.ts +++ b/packages/opendesign/src/locale/lang/en-us.ts @@ -1,29 +1,24 @@ export default { locale: 'en-US', - common: { - empty: 'No Data', - loading: 'Loading...', - }, - pagination: { - goto: 'Go to', - page: 'Page', - countPerPage: '/page', - total: 'Total: {0}', - }, - upload: { - buttonLabel: 'Upload', - drag: 'Click or drag file to this area to upload', - dragHover: 'Release to upload', - retry: 'Click to retry', - delete: 'Delete', - preview: 'Preview', - edit: 'Edit', - }, - select: { - cancel: 'Cancel', - confirm: 'Ok', - }, - input: { - limit: '{0}/{1}', - }, + // common + 'common.empty': 'No Data', + 'common.loading': 'Loading...', + // pagination + 'pagination.goto': 'Go to', + 'pagination.page': 'Page', + 'pagination.countPerPage': '/page', + 'pagination.total': 'Total: {0}', + // upload + 'upload.buttonLabel': 'Upload', + 'upload.drag': 'Click or drag file to this area to upload', + 'upload.dragHover': 'Release to upload', + 'upload.retry': 'Click to retry', + 'upload.delete': 'Delete', + 'upload.preview': 'Preview', + 'upload.edit': 'Edit', + // select + 'select.cancel': 'Cancel', + 'select.confirm': 'Ok', + // input + 'input.limit': '{0}/{1}', }; diff --git a/packages/opendesign/src/locale/lang/zh-cn.ts b/packages/opendesign/src/locale/lang/zh-cn.ts index 5080395e..ee5809ca 100644 --- a/packages/opendesign/src/locale/lang/zh-cn.ts +++ b/packages/opendesign/src/locale/lang/zh-cn.ts @@ -1,29 +1,24 @@ export default { locale: 'zh-CN', - common: { - empty: '暂无数据', - loading: '加载中...', - }, - pagination: { - goto: '前往', - page: '页', - countPerPage: '条/页', - total: '共 {0} 条', - }, - upload: { - buttonLabel: '点击上传', - drag: '点击或拖拽文件到此处上传', - dragHover: '释放文件并开始上传', - retry: '点击重试', - delete: '删除', - preview: '预览', - edit: '编辑', - }, - select: { - cancel: '取消', - confirm: '确定', - }, - input: { - limit: '{0}/{1}', - }, + // common + 'common.empty': '暂无数据', + 'common.loading': '加载中...', + // pagination + 'pagination.goto': '前往', + 'pagination.page': '页', + 'pagination.countPerPage': '条/页', + 'pagination.total': '共 {0} 条', + // upload + 'upload.buttonLabel': '点击上传', + 'upload.drag': '点击或拖拽文件到此处上传', + 'upload.dragHover': '释放文件并开始上传', + 'upload.retry': '点击重试', + 'upload.delete': '删除', + 'upload.preview': '预览', + 'upload.edit': '编辑', + // select + 'select.cancel': '取消', + 'select.confirm': '确定', + // input + 'input.limit': '{0}/{1}', }; diff --git a/packages/opendesign/src/locale/types.ts b/packages/opendesign/src/locale/types.ts index 46606d31..a4bb0a6d 100644 --- a/packages/opendesign/src/locale/types.ts +++ b/packages/opendesign/src/locale/types.ts @@ -1,30 +1,24 @@ -export interface LanguageT { +export interface OpendesignLanguageT { locale: string; - common?: { - empty: string; - loading: string; - }; - pagination?: { - goto: string; - page: string; - countPerPage: string; - total: string; - }; - upload?: { - buttonLabel: string; - drag: string; - dragHover: string; - retry: string; - delete: string; - preview: string; - edit: string; - }; - select?: { - cancel: string; - confirm: string; - }; - input?: { - limit: string; - }; + 'common.empty'?: string; + 'common.loading'?: string; + 'pagination.goto'?: string; + 'pagination.page'?: string; + 'pagination.countPerPage'?: string; + 'pagination.total'?: string; + 'upload.buttonLabel'?: string; + 'upload.drag'?: string; + 'upload.dragHover'?: string; + 'upload.retry'?: string; + 'upload.delete'?: string; + 'upload.preview'?: string; + 'upload.edit'?: string; + 'select.cancel'?: string; + 'select.confirm'?: string; + 'input.limit'?: string; +} + +export interface i18nLanguagesT { + locale: string; + [k: string]: string } -export type i18nLanguages = Record; diff --git a/packages/opendesign/src/pagination/OPagination.vue b/packages/opendesign/src/pagination/OPagination.vue index d753599c..ebc5708e 100644 --- a/packages/opendesign/src/pagination/OPagination.vue +++ b/packages/opendesign/src/pagination/OPagination.vue @@ -94,6 +94,12 @@ const selectPage = (page: number | string) => { const clickPageBtn = (Increase: boolean) => { updatePageAndPageSize(Increase ? pageVal.value! + 1 : pageVal.value! - 1, pageSize.value!); }; + +const moreVisible = ref<{ left: boolean; right: boolean }>({ + left: false, + right: false, +}); + // 点击收起的更多箭头 const moreClick = (more: PagerItemT) => { const { value, list } = more; @@ -132,10 +138,6 @@ const selectPageSize = (val: SelectValueT) => { updatePageAndPageSize(newPage, size); }; -const moreVisible = ref<{ left: boolean; right: boolean }>({ - left: false, - right: false, -}); // 选择弹层中的页码 const onMoreItemClick = (item: number, value: number | 'left' | 'right') => { diff --git a/packages/portal/src/components/TheHeader.vue b/packages/portal/src/components/TheHeader.vue index ed11fbc5..a5ff2336 100644 --- a/packages/portal/src/components/TheHeader.vue +++ b/packages/portal/src/components/TheHeader.vue @@ -69,9 +69,7 @@ const locales = [ }, ]; -addLocale({ - 'en-US': enUS, -}); +addLocale(enUS); const { locale } = useI18n(); const currentLocale = computed(() => { diff --git a/packages/portal/src/router.ts b/packages/portal/src/router.ts index 098fc730..657cae2a 100644 --- a/packages/portal/src/router.ts +++ b/packages/portal/src/router.ts @@ -11,6 +11,14 @@ export const routes = [ title: '通用', }, }, + { + path: '/i18n', + name: 'i18n', + component: () => import('@opendesign-src/locale/__demo__/TheIndex.vue'), + meta: { + title: '多语言', + }, + }, { path: '/virtual-list', name: 'virtual-list', -- Gitee From 84a18196d1940ab823bd1b667e8b16c89c941c48 Mon Sep 17 00:00:00 2001 From: devin Date: Tue, 5 Aug 2025 10:37:47 +0800 Subject: [PATCH 3/3] =?UTF-8?q?style:=20=E6=A0=BC=E5=BC=8F=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../opendesign/src/config-provider/__demo__/ConfigLink.vue | 4 ++-- .../opendesign/src/config-provider/__demo__/ConfigLocale.vue | 2 +- packages/opendesign/src/config-provider/__demo__/TheIndex.vue | 2 +- packages/opendesign/src/locale/__demo__/LocaleBasic.vue | 1 - packages/opendesign/src/locale/index.ts | 2 +- 5 files changed, 5 insertions(+), 6 deletions(-) diff --git a/packages/opendesign/src/config-provider/__demo__/ConfigLink.vue b/packages/opendesign/src/config-provider/__demo__/ConfigLink.vue index b1c76cfa..63e5f1e4 100644 --- a/packages/opendesign/src/config-provider/__demo__/ConfigLink.vue +++ b/packages/opendesign/src/config-provider/__demo__/ConfigLink.vue @@ -11,9 +11,9 @@ const linkConfig: LinkConfigT = { };