/** * 按页面类型与语言动态加载 Markdown 文案(如服务条款、隐私政策) */ type MdPageType = 'termsOfService' | 'privacyPolicy'; const DEFAULT_LANG = 'en-US'; // 匹配 @/assets/md/{pageName}_{lang}.md,如 termsOfService_en-US.md、privacyPolicy_zh-CN.md const rawMdModules = import.meta.glob('@/assets/md/*_*.md', { query: '?raw', import: 'default', }); const mdLoaders: Record Promise>> = {}; Object.keys(rawMdModules).forEach((key) => { const match = key.match(/\/([^/]+)_([\w-]+)\.md$/); if (match) { const [, pageName, lang] = match; if (!mdLoaders[pageName!]) mdLoaders[pageName!] = {}; mdLoaders[pageName!]![lang!] = () => (rawMdModules[key] as () => Promise)(); } }); const localeModules = import.meta.glob<{ default?: { DIR?: string } }>('@/locales/*.ts', { eager: true, }); const dirByLang: Record = {}; Object.keys(localeModules).forEach((key) => { const match = key.match(/\/([\w-]+)\.ts$/); if (match) { const lang = match[1]!; const dir = localeModules[key]?.default?.DIR; if (dir === 'ltr' || dir === 'rtl') dirByLang[lang] = dir; } }); export interface LoadMdByLangOptions { /** 占位符替换:key 为 MD 中的占位符(如 [Insert Date]),value 为替换后的字符串 */ replacements?: Record; } /** * 根据当前语言加载 Markdown 内容;无该语言时回退到英文。返回内容及实际使用的语言。 * 可通过 options.replacements 替换 MD 中的占位符(如 [Insert Date])。 */ export async function loadMdByLang( page: MdPageType, lang: string, options?: LoadMdByLangOptions ): Promise<{ content: string; usedLang: string }> { const loaders = mdLoaders[page]; const hasLang = Boolean(loaders?.[lang]); const usedLang = hasLang ? lang : DEFAULT_LANG; const loader = loaders?.[usedLang] ?? loaders?.[DEFAULT_LANG]; if (!loader) return { content: '', usedLang }; let content = await loader(); const replacements = options?.replacements; if (replacements && Object.keys(replacements).length > 0) { content = Object.entries(replacements).reduce( (acc, [placeholder, value]) => acc.replaceAll(placeholder, value), content ); } return { content, usedLang }; } /** * 根据语言获取文案方向(ltr/rtl),用于 dir 与样式 */ export function getDirByLang(lang: string): 'ltr' | 'rtl' { return dirByLang[lang] ?? 'ltr'; } export type { MdPageType };