From f1f3c18eba2d0a342fb686d0fa8e12ff796f770c Mon Sep 17 00:00:00 2001 From: devin Date: Mon, 15 Apr 2024 16:36:58 +0800 Subject: [PATCH 1/8] =?UTF-8?q?feat(locale):=20=E6=94=AF=E6=8C=81=E5=9B=BD?= =?UTF-8?q?=E9=99=85=E5=8C=96=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/opendesign/src/_utils/helper.ts | 2 +- .../src/config-provider/OConfigProvider.vue | 17 +++++ .../__demo__/ConfigProviderBasic.vue | 63 ++++++++++++++++ .../src/config-provider/__demo__/TheChild.vue | 11 +++ .../src/config-provider/__demo__/TheIndex.vue | 9 +++ .../opendesign/src/config-provider/index.ts | 13 ++++ .../opendesign/src/config-provider/provide.ts | 6 ++ .../opendesign/src/config-provider/types.ts | 13 ++++ packages/opendesign/src/locale/index.ts | 73 +++++++++++++++++++ packages/opendesign/src/locale/lang/en-us.ts | 9 +++ packages/opendesign/src/locale/lang/zh-cn.ts | 9 +++ packages/opendesign/src/locale/types.ts | 10 +++ packages/portal/src/router.ts | 8 +- 13 files changed, 241 insertions(+), 2 deletions(-) create mode 100644 packages/opendesign/src/config-provider/OConfigProvider.vue create mode 100644 packages/opendesign/src/config-provider/__demo__/ConfigProviderBasic.vue create mode 100644 packages/opendesign/src/config-provider/__demo__/TheChild.vue create mode 100644 packages/opendesign/src/config-provider/__demo__/TheIndex.vue create mode 100644 packages/opendesign/src/config-provider/index.ts create mode 100644 packages/opendesign/src/config-provider/provide.ts create mode 100644 packages/opendesign/src/config-provider/types.ts create mode 100644 packages/opendesign/src/locale/index.ts create mode 100644 packages/opendesign/src/locale/lang/en-us.ts create mode 100644 packages/opendesign/src/locale/lang/zh-cn.ts create mode 100644 packages/opendesign/src/locale/types.ts diff --git a/packages/opendesign/src/_utils/helper.ts b/packages/opendesign/src/_utils/helper.ts index a11baebf..ba3f9581 100644 --- a/packages/opendesign/src/_utils/helper.ts +++ b/packages/opendesign/src/_utils/helper.ts @@ -131,7 +131,7 @@ export function getValueByPath(obj: object, path: string) { return; } - let temp = obj; + let temp: any = obj; for (let i = 0; i < keys.length; i++) { if (!isObject(temp)) { return; diff --git a/packages/opendesign/src/config-provider/OConfigProvider.vue b/packages/opendesign/src/config-provider/OConfigProvider.vue new file mode 100644 index 00000000..d1269bd3 --- /dev/null +++ b/packages/opendesign/src/config-provider/OConfigProvider.vue @@ -0,0 +1,17 @@ + + diff --git a/packages/opendesign/src/config-provider/__demo__/ConfigProviderBasic.vue b/packages/opendesign/src/config-provider/__demo__/ConfigProviderBasic.vue new file mode 100644 index 00000000..d28861d4 --- /dev/null +++ b/packages/opendesign/src/config-provider/__demo__/ConfigProviderBasic.vue @@ -0,0 +1,63 @@ + + + diff --git a/packages/opendesign/src/config-provider/__demo__/TheChild.vue b/packages/opendesign/src/config-provider/__demo__/TheChild.vue new file mode 100644 index 00000000..5b5ad218 --- /dev/null +++ b/packages/opendesign/src/config-provider/__demo__/TheChild.vue @@ -0,0 +1,11 @@ + + + diff --git a/packages/opendesign/src/config-provider/__demo__/TheIndex.vue b/packages/opendesign/src/config-provider/__demo__/TheIndex.vue new file mode 100644 index 00000000..a6286ff0 --- /dev/null +++ b/packages/opendesign/src/config-provider/__demo__/TheIndex.vue @@ -0,0 +1,9 @@ + + + diff --git a/packages/opendesign/src/config-provider/index.ts b/packages/opendesign/src/config-provider/index.ts new file mode 100644 index 00000000..e1cbc754 --- /dev/null +++ b/packages/opendesign/src/config-provider/index.ts @@ -0,0 +1,13 @@ +import _OConfigProvider from './OConfigProvider.vue'; +import type { App } from 'vue'; + +const OConfigProvider = Object.assign(_OConfigProvider, { + install(app: App) { + app.component(_OConfigProvider.name, _OConfigProvider); + }, +}); + +export { OConfigProvider }; + +export * from './types'; +export * from './provide'; diff --git a/packages/opendesign/src/config-provider/provide.ts b/packages/opendesign/src/config-provider/provide.ts new file mode 100644 index 00000000..85443e1d --- /dev/null +++ b/packages/opendesign/src/config-provider/provide.ts @@ -0,0 +1,6 @@ +import { InjectionKey } from 'vue'; +import { LanguageT } from '../locale/types'; + +export const configProviderInjectKey: InjectionKey<{ + locale?: LanguageT; +}> = Symbol('provide-config-provider'); diff --git a/packages/opendesign/src/config-provider/types.ts b/packages/opendesign/src/config-provider/types.ts new file mode 100644 index 00000000..92e4ae15 --- /dev/null +++ b/packages/opendesign/src/config-provider/types.ts @@ -0,0 +1,13 @@ +import { LanguageT } from '../locale/types'; +import { ExtractPropTypes, PropType } from 'vue'; + +export const configProviderProps = { + /** + * 语言词条 + */ + locale: { + type: Object as PropType, + }, +}; + +export type ConfigProviderPropsT = ExtractPropTypes; diff --git a/packages/opendesign/src/locale/index.ts b/packages/opendesign/src/locale/index.ts new file mode 100644 index 00000000..597b7114 --- /dev/null +++ b/packages/opendesign/src/locale/index.ts @@ -0,0 +1,73 @@ +import { logger } from '../_utils/log'; +import { getValueByPath } from '../_utils/helper'; +import { isString } from '../_utils/is'; +import { configProviderInjectKey } from '../config-provider'; +import { computed, inject, ref } from 'vue'; +import zhCN from './lang/zh-cn'; +import { LanguageT, i18nLanguages } from './types'; + +const currentLocal = ref('zh-CN'); +const i18nLanguage = ref>({ + 'zh-CN': zhCN, +}); + +/** + * 添加语言包 + * @param locale 语言包 + * @param opts 配置 + */ +export function addLocale( + locale: i18nLanguages, + opts?: { + overwrite?: boolean; + } +) { + Object.keys(locale).forEach((key) => { + if (!i18nLanguage.value[key] || opts?.overwrite) { + i18nLanguage.value[key] = locale[key]; + } + }); +} + +/** + * 使用语言包 + * @param localeKey + * @returns + */ +export function useLocale(localeKey: string) { + if (!i18nLanguage.value[localeKey]) { + logger.warn(`no ${localeKey} languages found`); + return; + } + currentLocal.value = localeKey; +} + +export function useI18n() { + const configProvider = inject(configProviderInjectKey, {}); + const languages = computed(() => { + return configProvider.locale ?? i18nLanguage.value[currentLocal.value]; + }); + const locale = computed(() => languages.value.locale); + + const transform = (key: string, ...args: string[]): string => { + if (!languages.value) { + logger.warn('no languages configed'); + return ''; + } + const value = getValueByPath(languages.value, key); + + // 处理变量替换 + if (args.length > 0 && isString(value)) { + return value.replace(/{(\d+)}/g, (match, index) => { + return args[index] ?? match; + }); + } + + return value; + }; + + return { + locale, + t: transform, + }; +} diff --git a/packages/opendesign/src/locale/lang/en-us.ts b/packages/opendesign/src/locale/lang/en-us.ts new file mode 100644 index 00000000..1c418ae6 --- /dev/null +++ b/packages/opendesign/src/locale/lang/en-us.ts @@ -0,0 +1,9 @@ +export default { + locale: 'en-US', + pagination: { + goto: 'Goto', + page: 'Page', + countPerPage: ' / Page', + total: 'Total: {0}', + }, +}; diff --git a/packages/opendesign/src/locale/lang/zh-cn.ts b/packages/opendesign/src/locale/lang/zh-cn.ts new file mode 100644 index 00000000..25278f3c --- /dev/null +++ b/packages/opendesign/src/locale/lang/zh-cn.ts @@ -0,0 +1,9 @@ +export default { + locale: 'zh-CN', + pagination: { + goto: '前往', + page: '页', + countPerPage: '条/页', + total: '共 {0} 条', + }, +}; diff --git a/packages/opendesign/src/locale/types.ts b/packages/opendesign/src/locale/types.ts new file mode 100644 index 00000000..aa424ed5 --- /dev/null +++ b/packages/opendesign/src/locale/types.ts @@ -0,0 +1,10 @@ +export interface LanguageT { + locale: string; + pagination: { + goto: string; + page: string; + countPerPage: string; + total: string; + }; +} +export type i18nLanguages = Record; diff --git a/packages/portal/src/router.ts b/packages/portal/src/router.ts index fcd6c9c7..66b71718 100644 --- a/packages/portal/src/router.ts +++ b/packages/portal/src/router.ts @@ -1,4 +1,4 @@ -import { createRouter, createWebHashHistory, createWebHistory } from 'vue-router'; +import { createRouter, createWebHistory } from 'vue-router'; import TheHome from './pages/TheHome.vue'; export const routes = [ @@ -8,6 +8,12 @@ export const routes = [ label: '通用', component: TheHome, }, + { + path: '/config-provider', + name: 'config-provider', + label: '全局配置 config-provider', + component: () => import('@components/config-provider/__demo__/TheIndex.vue'), + }, // { // path: '/date-picker', // name: 'DatePicker', -- Gitee From 6459655e3482a54134e7a98ac350f05ae248db26 Mon Sep 17 00:00:00 2001 From: devin Date: Mon, 15 Apr 2024 16:45:01 +0800 Subject: [PATCH 2/8] =?UTF-8?q?fix(useTheme):=20=E4=BF=AE=E5=A4=8DuseTheme?= =?UTF-8?q?=E8=BF=94=E5=9B=9E=E5=80=BC=E7=B1=BB=E5=9E=8B=E4=B8=8D=E4=B8=80?= =?UTF-8?q?=E8=87=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/opendesign/src/hooks/use-theme.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/opendesign/src/hooks/use-theme.ts b/packages/opendesign/src/hooks/use-theme.ts index a93c27e5..bd0765d8 100644 --- a/packages/opendesign/src/hooks/use-theme.ts +++ b/packages/opendesign/src/hooks/use-theme.ts @@ -6,7 +6,7 @@ const THEME_KEY = '__theme__'; export function useTheme(defaultTheme: string = 'light') { if (!isClient) { return { - theme: defaultTheme, + theme: ref(defaultTheme), }; } const currentTheme = ref(localStorage.getItem(THEME_KEY) || defaultTheme); -- Gitee From d61feeaa6ee0f5e8640214a215e89733b23c23e4 Mon Sep 17 00:00:00 2001 From: devin Date: Mon, 15 Apr 2024 16:57:04 +0800 Subject: [PATCH 3/8] =?UTF-8?q?feat(i18n):=20=E5=A2=9E=E5=8A=A0=E8=AF=AD?= =?UTF-8?q?=E8=A8=80=E5=88=87=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/opendesign/src/index.ts | 2 ++ packages/opendesign/src/locale/index.ts | 2 +- packages/portal/src/components/TheHeader.vue | 35 +++++++++++++++++++- 3 files changed, 37 insertions(+), 2 deletions(-) diff --git a/packages/opendesign/src/index.ts b/packages/opendesign/src/index.ts index 6a8ce2b2..70146cf8 100644 --- a/packages/opendesign/src/index.ts +++ b/packages/opendesign/src/index.ts @@ -2,6 +2,8 @@ export * from './_utils/export'; export * from './hooks'; export * from './directves'; +export * from './locale'; + export * from './icon'; export * from './icon-components'; export * from './button'; diff --git a/packages/opendesign/src/locale/index.ts b/packages/opendesign/src/locale/index.ts index 597b7114..d9e70907 100644 --- a/packages/opendesign/src/locale/index.ts +++ b/packages/opendesign/src/locale/index.ts @@ -45,7 +45,7 @@ export function useLocale(localeKey: string) { export function useI18n() { const configProvider = inject(configProviderInjectKey, {}); const languages = computed(() => { - return configProvider.locale ?? i18nLanguage.value[currentLocal.value]; + return configProvider?.locale ?? i18nLanguage.value[currentLocal.value]; }); const locale = computed(() => languages.value.locale); diff --git a/packages/portal/src/components/TheHeader.vue b/packages/portal/src/components/TheHeader.vue index 29782504..d71cb0ff 100644 --- a/packages/portal/src/components/TheHeader.vue +++ b/packages/portal/src/components/TheHeader.vue @@ -1,7 +1,8 @@ +
+ + {{ currentLocale?.label }} + + +
-
{{ Labels.total }} {{ props.total }}
+
{{ t('pagination.total', props.total) }}