From 6c76d81a40057a9df1867859ff1acbef4e3775c0 Mon Sep 17 00:00:00 2001 From: R2m1liA <15258427350@163.com> Date: Thu, 16 Oct 2025 15:14:46 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=B8=BAdirectus=E5=81=9AI18n=E9=80=82?= =?UTF-8?q?=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加getDirectusLocale方法用于获取Directus本地化字段 --- app/composables/useLocalizations.ts | 101 +++++++++++++++++++++------- app/pages/productions/[...slug].vue | 17 +++-- app/pages/productions/index.vue | 10 +-- 3 files changed, 91 insertions(+), 37 deletions(-) diff --git a/app/composables/useLocalizations.ts b/app/composables/useLocalizations.ts index 35debd2..8ef3949 100644 --- a/app/composables/useLocalizations.ts +++ b/app/composables/useLocalizations.ts @@ -3,38 +3,89 @@ import type { Language as ElementLanguage } from 'element-plus/es/locale'; import zhCn from 'element-plus/es/locale/lang/zh-cn'; import en from 'element-plus/es/locale/lang/en'; -// Strapi本地化映射 -export const strapiLocales: Record = { - zh: 'zh-CN', - en: 'en', -}; +/** + * 应用语言映射结构 + * 用于统一 Strapi / Directus / Element Plus 的多语言配置 + */ +export interface LocaleMapping { + /** 用于StrapiLocale **/ + strapi: StrapiLocale; + /** 用于Directus translations.languages_code **/ + directus: string; + /** Element Plus语言对象 **/ + element: ElementLanguage; +} -// Element Plus本地化映射 -export const elementPlusLocales: Record = { - zh: zhCn, - en: en, -}; +/** + * 应用支持的语言映射表。 + * + * 每个键(如 "zh"、"en")对应一套统一的本地化配置, + * 方便在 Strapi / Directus / Element Plus 三方系统间保持一致。 + */ +export const localeMap = { + zh: { + strapi: 'zh-CN', + directus: 'zh-CN', + element: zhCn, + }, + en: { + strapi: 'en', + directus: 'en-US', + element: en, + }, +} satisfies Record; +/** 应用支持的语言键类型 **/ +export type AppLocale = keyof typeof localeMap; + +/** 默认语言, 当找不到匹配语言时回退到默认语言 **/ +const defaultLocale: AppLocale = 'zh'; + +/** + * 提供 Strapi、 Directus 与 Element Plus的国际化映射工具 + * + * --- + * @example + * ``` ts + * const { locale, getStrapiLocale, getElementPlusLocale } = useLocalizations() + * + * const strapiLang = getStrapiLocale() // 当前 Strapi 语言码 + * const elLocale = getElementPlusLocale('en') // 获取 Element Plus 英文对象 + * const all = getLocaleMapping('zh') // 获取完整映射结构 + * ``` + * --- + * + * @returns 返回当前语言及各系统的本地化获取方法 + */ export const useLocalizations = () => { - const { locale } = useI18n(); + const { locale } = useI18n<{ locale: Ref }>(); - // 获取Strapi本地化代码 - const getStrapiLocale = (nuxtLocale?: string): StrapiLocale => { - const currentLocale = nuxtLocale || locale.value; - return strapiLocales[currentLocale] || 'zh-Hans'; - }; - - // 获取Element Plus本地化 - const getElementPlusLocale = (nuxtLocale?: string) => { - const currentLocale = nuxtLocale || locale.value; - const elementPlusLocale = - elementPlusLocales[currentLocale] || elementPlusLocales['zh']; - return elementPlusLocale; + /** + * 获取对应语言的完整映射结构 + * + * @param nuxtLocale - 可选的语言码参数,若提供则使用该语言码,否则使用当前应用语言 + * @returns 返回当前语言的完整映射对象 + */ + const getMapping = (nuxtLocale?: AppLocale): LocaleMapping => { + const current = nuxtLocale || locale.value; + return localeMap[current] || localeMap[defaultLocale]; }; return { + /** 当前Nuxt I18n语言(只读) **/ locale: readonly(locale), - getStrapiLocale, - getElementPlusLocale, + /** 获取Strapi的本地化代码 **/ + getStrapiLocale: (l?: AppLocale) => getMapping(l).strapi, + /** 获取Directus的本地化代码 **/ + getDirectusLocale: (l?: AppLocale) => getMapping(l).directus, + /** 获取Element Plus语言对象 **/ + getElementPlusLocale: (l?: AppLocale) => getMapping(l).element, + /** + * 获取完整的语言映射结构(Strapi / Directus / Element Plus) + * + * @param l: 指定语言,默认为当前locale + * @returns 语言映射对象 + */ + getLocaleMapping: getMapping, }; }; diff --git a/app/pages/productions/[...slug].vue b/app/pages/productions/[...slug].vue index 02851b1..936fa4e 100644 --- a/app/pages/productions/[...slug].vue +++ b/app/pages/productions/[...slug].vue @@ -108,8 +108,8 @@