返回 AiToEarn
languageConfig.ts
根目录 / project / aitoearn-web / src / app / i18n / languageConfig.ts
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
120 lines TYPESCRIPT