@coffic/cosy-ui 0.5.6 → 0.5.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3,8 +3,10 @@ import { LinkUtil } from '../../utils/link';
3
3
  const baseUrl = LinkUtil.getBaseUrl();
4
4
  ---
5
5
 
6
- <div class="flex flex-col justify-center items-center min-h-[50vh] text-center">
7
- <h1 class="mb-4 font-bold text-4xl">404 - 页面未找到</h1>
8
- <p class="mb-8 text-lg">抱歉,您要找的文档不存在。</p>
9
- <a href={baseUrl} class="btn btn-primary"> 返回首页 </a>
6
+ <div class="flex flex-col items-center justify-center h-screen">
7
+ <div class="flex flex-col justify-center items-center min-h-[50vh] text-center">
8
+ <h1 class="mb-4 font-bold text-4xl">404 - 页面未找到</h1>
9
+ <p class="mb-8 text-lg">抱歉,您要找的文档不存在。</p>
10
+ <a href={baseUrl} class="btn btn-primary"> 返回首页 </a>
11
+ </div>
10
12
  </div>
package/dist/index.ts CHANGED
@@ -42,7 +42,7 @@ export { default as Article } from './components/typography/Article.astro';
42
42
  export { default as Text } from './components/typography/Text.astro';
43
43
  export { default as Heading } from './components/typography/Heading.astro';
44
44
 
45
- // Errors Page
45
+ // Errors Page
46
46
  export { default as ErrorPage404 } from './components/errors/404.astro';
47
47
 
48
48
  // Icons
@@ -79,6 +79,7 @@ export * from './utils/i18n';
79
79
  export * from './utils/path';
80
80
  export * from './utils/url';
81
81
  export * from './utils/language';
82
+ export * from './utils/lang_package';
82
83
  export * from './utils/logger';
83
84
  export * from './utils/link';
84
85
 
@@ -0,0 +1,222 @@
1
+ /**
2
+ * 多语言工具类
3
+ * 提供链式API来创建和管理多语言文本
4
+ */
5
+ export class LangEntry {
6
+ private translations: Record<string, string> = {};
7
+
8
+ /**
9
+ * 设置中文文本
10
+ * @param text 中文文本
11
+ */
12
+ setZh(text: string): LangEntry {
13
+ this.translations['zh-cn'] = text;
14
+ return this;
15
+ }
16
+
17
+ /**
18
+ * 设置英文文本
19
+ * @param text 英文文本
20
+ */
21
+ setEn(text: string): LangEntry {
22
+ this.translations['en'] = text;
23
+ return this;
24
+ }
25
+
26
+ /**
27
+ * 设置日文文本
28
+ * @param text 日文文本
29
+ */
30
+ setJa(text: string): LangEntry {
31
+ this.translations['ja'] = text;
32
+ return this;
33
+ }
34
+
35
+ /**
36
+ * 设置任意语言的文本
37
+ * @param lang 语言代码
38
+ * @param text 文本内容
39
+ */
40
+ set(lang: string, text: string): LangEntry {
41
+ this.translations[lang] = text;
42
+ return this;
43
+ }
44
+
45
+ /**
46
+ * 设置所有语言为相同的文本值
47
+ * 适用于不需要翻译的品牌名、专有名词等
48
+ * @param text 所有语言共用的文本
49
+ */
50
+ setAll(text: string): LangEntry {
51
+ // 如果已有语言,则更新它们
52
+ if (Object.keys(this.translations).length > 0) {
53
+ for (const lang of Object.keys(this.translations)) {
54
+ this.translations[lang] = text;
55
+ }
56
+ } else {
57
+ // 默认至少设置中英文
58
+ this.translations['zh-cn'] = text;
59
+ this.translations['en'] = text;
60
+ }
61
+ return this;
62
+ }
63
+
64
+ /**
65
+ * 获取指定语言的文本
66
+ * @param lang 语言代码
67
+ * @param defaultValue 默认值,如果未找到翻译则返回此值
68
+ */
69
+ get(lang: string, defaultValue?: string): string {
70
+ return this.translations[lang] || defaultValue || this.getFirst() || '';
71
+ }
72
+
73
+ /**
74
+ * 获取第一个可用的翻译文本
75
+ */
76
+ getFirst(): string | undefined {
77
+ const keys = Object.keys(this.translations);
78
+ return keys.length > 0 ? this.translations[keys[0]] : undefined;
79
+ }
80
+
81
+ /**
82
+ * 获取所有可用的语言代码
83
+ */
84
+ getLanguages(): string[] {
85
+ return Object.keys(this.translations);
86
+ }
87
+
88
+ /**
89
+ * 获取所有翻译
90
+ */
91
+ getAll(): Record<string, string> {
92
+ return { ...this.translations };
93
+ }
94
+
95
+ /**
96
+ * 合并另一个语言条目
97
+ * @param other 要合并的语言条目
98
+ */
99
+ merge(other: LangEntry): LangEntry {
100
+ Object.assign(this.translations, other.getAll());
101
+ return this;
102
+ }
103
+
104
+ /**
105
+ * 检查是否包含指定语言
106
+ * @param lang 语言代码
107
+ */
108
+ has(lang: string): boolean {
109
+ return lang in this.translations;
110
+ }
111
+
112
+ /**
113
+ * 转换为普通对象
114
+ */
115
+ toObject(): Record<string, string> {
116
+ return { ...this.translations };
117
+ }
118
+
119
+ /**
120
+ * 允许以对象属性方式访问翻译
121
+ * 例如: entry['zh-cn'] 或 entry.en
122
+ */
123
+ [key: string]: any;
124
+ }
125
+
126
+ // 创建索引访问器的Proxy处理程序
127
+ const langEntryHandler: ProxyHandler<LangEntry> = {
128
+ get(target: LangEntry, prop: string | symbol): any {
129
+ // 如果是字符串属性并且不是LangEntry的方法,则尝试作为语言代码获取翻译
130
+ if (typeof prop === 'string' &&
131
+ !(prop in Object.getPrototypeOf(target)) &&
132
+ prop !== 'translations') {
133
+ return target.get(prop);
134
+ }
135
+
136
+ // 否则返回原始属性
137
+ return (target as any)[prop];
138
+ }
139
+ };
140
+
141
+ /**
142
+ * 提供快捷访问的LangPackage
143
+ * 可以直接通过静态方法创建和配置语言条目
144
+ */
145
+ export class LangPackage {
146
+ // 内部实例,用于静态方法直接操作
147
+ private static _instance = new Proxy(new LangEntry(), langEntryHandler);
148
+
149
+ /**
150
+ * 创建一个新的语言条目
151
+ */
152
+ static make(): LangEntry {
153
+ return new Proxy(new LangEntry(), langEntryHandler);
154
+ }
155
+
156
+ /**
157
+ * 从对象创建语言条目
158
+ * @param obj 包含语言翻译的对象
159
+ */
160
+ static from(obj: Record<string, string>): LangEntry {
161
+ const entry = new LangEntry();
162
+ Object.entries(obj).forEach(([lang, text]) => {
163
+ entry.set(lang, text);
164
+ });
165
+ return new Proxy(entry, langEntryHandler);
166
+ }
167
+
168
+ /**
169
+ * 创建只包含中文和英文的语言条目
170
+ * @param zh 中文文本
171
+ * @param en 英文文本
172
+ */
173
+ static zhEn(zh: string, en: string): LangEntry {
174
+ return new Proxy(new LangEntry().setZh(zh).setEn(en), langEntryHandler);
175
+ }
176
+
177
+ /**
178
+ * 创建所有语言都使用相同文本的语言条目
179
+ * 适用于品牌名、产品名等不需要翻译的文本
180
+ * @param text 所有语言共用的文本
181
+ */
182
+ static common(text: string): LangEntry {
183
+ return new Proxy(new LangEntry().setAll(text), langEntryHandler);
184
+ }
185
+
186
+ /**
187
+ * 设置中文文本
188
+ * 快捷方法,直接返回一个新的LangEntry实例
189
+ * @param text 中文文本
190
+ */
191
+ static setZh(text: string): LangEntry {
192
+ return new Proxy(new LangEntry().setZh(text), langEntryHandler);
193
+ }
194
+
195
+ /**
196
+ * 设置英文文本
197
+ * 快捷方法,直接返回一个新的LangEntry实例
198
+ * @param text 英文文本
199
+ */
200
+ static setEn(text: string): LangEntry {
201
+ return new Proxy(new LangEntry().setEn(text), langEntryHandler);
202
+ }
203
+
204
+ /**
205
+ * 设置日文文本
206
+ * 快捷方法,直接返回一个新的LangEntry实例
207
+ * @param text 日文文本
208
+ */
209
+ static setJa(text: string): LangEntry {
210
+ return new Proxy(new LangEntry().setJa(text), langEntryHandler);
211
+ }
212
+
213
+ /**
214
+ * 设置任意语言的文本
215
+ * 快捷方法,直接返回一个新的LangEntry实例
216
+ * @param lang 语言代码
217
+ * @param text 文本内容
218
+ */
219
+ static set(lang: string, text: string): LangEntry {
220
+ return new Proxy(new LangEntry().set(lang, text), langEntryHandler);
221
+ }
222
+ }
@@ -47,6 +47,11 @@ export class LanguageUtil {
47
47
  * @returns 当前应使用的语言代码
48
48
  */
49
49
  static getCurrentLanguage(astro: AstroGlobal): string {
50
+ // 尝试从Astro全局对象中获取语言
51
+ const astroLang = astro.currentLocale;
52
+ if (astroLang) {
53
+ return astroLang;
54
+ }
50
55
  // 尝试从URL中获取语言
51
56
  const urlLang = this.getLanguageFromURL(astro.url.pathname);
52
57
  if (urlLang) {
@@ -59,6 +64,12 @@ export class LanguageUtil {
59
64
  return browserLang;
60
65
  }
61
66
 
67
+ // 尝试从Astro全局对象中获取语言
68
+ const preferredLocale = astro.preferredLocale;
69
+ if (preferredLocale) {
70
+ return preferredLocale;
71
+ }
72
+
62
73
  // 如果无法检测,返回默认语言
63
74
  return DEFAULT_LANGUAGE;
64
75
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@coffic/cosy-ui",
3
- "version": "0.5.6",
3
+ "version": "0.5.8",
4
4
  "description": "An astro component library",
5
5
  "author": {
6
6
  "name": "nookery",