| 1 | /** |
| 2 | * 语言配置中心 |
| 3 | * 统一管理项目中所有语言相关配置 |
| 4 | * |
| 5 | * 添加新语言时,只需在此文件的 LANGUAGE_METADATA 中添加配置即可 |
| 6 | */ |
| 7 | |
| 8 | import { HREFLANG_MAP } from './hreflangMap.cjs' |
| 9 | |
| 10 | // 语言元数据类型 |
| 11 | export interface LanguageMetadata { |
| 12 | code: string // 语言代码,如 'en', 'zh-CN' |
| 13 | label: string // 显示名称,如 'English', '简体中文' |
| 14 | dayjsLocale: string // dayjs/FullCalendar locale,如 'en-gb', 'zh-cn' |
| 15 | hreflang: string // SEO hreflang,如 'en', 'zh' |
| 16 | dateLocale: string // toLocaleDateString locale,如 'en-US', 'zh-CN' |
| 17 | } |
| 18 | |
| 19 | // 语言元数据配置(单一数据源) |
| 20 | export const LANGUAGE_METADATA: Record<string, LanguageMetadata> = { |
| 21 | 'en': { |
| 22 | code: 'en', |
| 23 | label: 'English', |
| 24 | dayjsLocale: 'en-gb', |
| 25 | hreflang: HREFLANG_MAP.en, |
| 26 | dateLocale: 'en-US', |
| 27 | }, |
| 28 | 'zh-CN': { |
| 29 | code: 'zh-CN', |
| 30 | label: '简体中文', |
| 31 | dayjsLocale: 'zh-cn', |
| 32 | hreflang: HREFLANG_MAP['zh-CN'], |
| 33 | dateLocale: 'zh-CN', |
| 34 | }, |
| 35 | 'ja': { |
| 36 | code: 'ja', |
| 37 | label: '日本語', |
| 38 | dayjsLocale: 'ja', |
| 39 | hreflang: HREFLANG_MAP.ja || 'ja', |
| 40 | dateLocale: 'ja-JP', |
| 41 | }, |
| 42 | 'de': { |
| 43 | code: 'de', |
| 44 | label: 'Deutsch', |
| 45 | dayjsLocale: 'de', |
| 46 | hreflang: HREFLANG_MAP.de || 'de', |
| 47 | dateLocale: 'de-DE', |
| 48 | }, |
| 49 | 'fr': { |
| 50 | code: 'fr', |
| 51 | label: 'Français', |
| 52 | dayjsLocale: 'fr', |
| 53 | hreflang: HREFLANG_MAP.fr || 'fr', |
| 54 | dateLocale: 'fr-FR', |
| 55 | }, |
| 56 | 'ko': { |
| 57 | code: 'ko', |
| 58 | label: '한국어', |
| 59 | dayjsLocale: 'ko', |
| 60 | hreflang: HREFLANG_MAP.ko || 'ko', |
| 61 | dateLocale: 'ko-KR', |
| 62 | }, |
| 63 | } |
| 64 | |
| 65 | // 从 LANGUAGE_METADATA 派生的配置 |
| 66 | export const fallbackLng = 'en' |
| 67 | export const languages = Object.keys(LANGUAGE_METADATA) |
| 68 | |
| 69 | /** |
| 70 | * 获取语言元数据 |
| 71 | */ |
| 72 | export function getLanguageMetadata(lng: string): LanguageMetadata { |
| 73 | return LANGUAGE_METADATA[lng] || LANGUAGE_METADATA[fallbackLng] |
| 74 | } |
| 75 | |
| 76 | /** |
| 77 | * 获取 dayjs/FullCalendar 使用的 locale |
| 78 | */ |
| 79 | export function getDayjsLocale(lng: string): string { |
| 80 | return getLanguageMetadata(lng).dayjsLocale |
| 81 | } |
| 82 | |
| 83 | /** |
| 84 | * 获取 toLocaleDateString 使用的 locale |
| 85 | */ |
| 86 | export function getDateLocale(lng: string): string { |
| 87 | return getLanguageMetadata(lng).dateLocale |
| 88 | } |
| 89 | |
| 90 | /** |
| 91 | * 获取 SEO hreflang 属性值 |
| 92 | */ |
| 93 | export function getHreflang(lng: string): string { |
| 94 | return getLanguageMetadata(lng).hreflang |
| 95 | } |
| 96 | |
| 97 | /** |
| 98 | * 获取所有语言选项(用于语言切换下拉框) |
| 99 | */ |
| 100 | export function getAllLanguageOptions() { |
| 101 | return languages.map(lng => ({ |
| 102 | value: lng, |
| 103 | label: getLanguageMetadata(lng).label, |
| 104 | })) |
| 105 | } |
| 106 | |
| 107 | /** |
| 108 | * 判断是否为支持的语言 |
| 109 | */ |
| 110 | export function isSupportedLanguage(lng: string): boolean { |
| 111 | return languages.includes(lng) |
| 112 | } |
| 113 | |
| 114 | /** |
| 115 | * 判断是否为中文语言 |
| 116 | */ |
| 117 | export function isChineseLanguage(lng: string): boolean { |
| 118 | return lng === 'zh-CN' || lng.startsWith('zh') |
| 119 | } |
| 120 |