| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- /**
- * 按页面类型与语言动态加载 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<string>('@/assets/md/*_*.md', {
- query: '?raw',
- import: 'default',
- });
- const mdLoaders: Record<string, Record<string, () => Promise<string>>> = {};
- 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<string>)();
- }
- });
- const localeModules = import.meta.glob<{ default?: { DIR?: string } }>('@/locales/*.ts', {
- eager: true,
- });
- const dirByLang: Record<string, 'ltr' | 'rtl'> = {};
- 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<string, string>;
- }
- /**
- * 根据当前语言加载 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 };
|