@guren/server 0.2.0-alpha.7 → 1.0.0-rc.9
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.
- package/dist/Application-DtWDHXr1.d.ts +2110 -0
- package/dist/BroadcastManager-AkIWUGJo.d.ts +466 -0
- package/dist/CacheManager-BkvHEOZX.d.ts +244 -0
- package/dist/ConsoleKernel-CqCVrdZs.d.ts +207 -0
- package/dist/EventManager-CmIoLt7r.d.ts +207 -0
- package/dist/Gate-CNkBYf8m.d.ts +268 -0
- package/dist/HealthManager-DUyMIzsZ.d.ts +141 -0
- package/dist/I18nManager-Dtgzsf5n.d.ts +270 -0
- package/dist/LogManager-7mxnkaPM.d.ts +256 -0
- package/dist/MailManager-DpMvYiP9.d.ts +292 -0
- package/dist/Scheduler-BstvSca7.d.ts +469 -0
- package/dist/StorageManager-oZTHqaza.d.ts +337 -0
- package/dist/api-token-JOif2CtG.d.ts +1792 -0
- package/dist/app-key-CsBfRC_Q.d.ts +214 -0
- package/dist/auth/index.d.ts +418 -0
- package/dist/auth/index.js +6742 -0
- package/dist/authorization/index.d.ts +129 -0
- package/dist/authorization/index.js +621 -0
- package/dist/broadcasting/index.d.ts +233 -0
- package/dist/broadcasting/index.js +907 -0
- package/dist/cache/index.d.ts +233 -0
- package/dist/cache/index.js +817 -0
- package/dist/encryption/index.d.ts +222 -0
- package/dist/encryption/index.js +602 -0
- package/dist/events/index.d.ts +155 -0
- package/dist/events/index.js +330 -0
- package/dist/health/index.d.ts +185 -0
- package/dist/health/index.js +379 -0
- package/dist/i18n/index.d.ts +101 -0
- package/dist/i18n/index.js +597 -0
- package/dist/index-9_Jzj5jo.d.ts +7 -0
- package/dist/index.d.ts +2628 -619
- package/dist/index.js +22229 -3116
- package/dist/lambda/index.d.ts +156 -0
- package/dist/lambda/index.js +91 -0
- package/dist/logging/index.d.ts +50 -0
- package/dist/logging/index.js +557 -0
- package/dist/mail/index.d.ts +288 -0
- package/dist/mail/index.js +695 -0
- package/dist/mcp/index.d.ts +139 -0
- package/dist/mcp/index.js +382 -0
- package/dist/notifications/index.d.ts +271 -0
- package/dist/notifications/index.js +741 -0
- package/dist/queue/index.d.ts +423 -0
- package/dist/queue/index.js +958 -0
- package/dist/runtime/index.d.ts +93 -0
- package/dist/runtime/index.js +834 -0
- package/dist/scheduling/index.d.ts +41 -0
- package/dist/scheduling/index.js +836 -0
- package/dist/storage/index.d.ts +196 -0
- package/dist/storage/index.js +832 -0
- package/dist/vite/index.js +203 -3
- package/package.json +93 -6
- package/dist/chunk-FK2XQSBF.js +0 -160
|
@@ -0,0 +1,597 @@
|
|
|
1
|
+
// src/i18n/pluralization.ts
|
|
2
|
+
var pluralizationRules = {
|
|
3
|
+
/**
|
|
4
|
+
* English, German, Spanish, Italian, Portuguese, etc.
|
|
5
|
+
* 1 = singular, everything else = plural
|
|
6
|
+
*/
|
|
7
|
+
en: (count) => count === 1 ? 0 : 1,
|
|
8
|
+
de: (count) => count === 1 ? 0 : 1,
|
|
9
|
+
es: (count) => count === 1 ? 0 : 1,
|
|
10
|
+
it: (count) => count === 1 ? 0 : 1,
|
|
11
|
+
pt: (count) => count === 1 ? 0 : 1,
|
|
12
|
+
nl: (count) => count === 1 ? 0 : 1,
|
|
13
|
+
/**
|
|
14
|
+
* French, Brazilian Portuguese
|
|
15
|
+
* 0 and 1 = singular, everything else = plural
|
|
16
|
+
*/
|
|
17
|
+
fr: (count) => count <= 1 ? 0 : 1,
|
|
18
|
+
"pt-BR": (count) => count <= 1 ? 0 : 1,
|
|
19
|
+
/**
|
|
20
|
+
* Japanese, Chinese, Korean, Vietnamese, Thai
|
|
21
|
+
* No plural forms
|
|
22
|
+
*/
|
|
23
|
+
ja: () => 0,
|
|
24
|
+
zh: () => 0,
|
|
25
|
+
ko: () => 0,
|
|
26
|
+
vi: () => 0,
|
|
27
|
+
th: () => 0,
|
|
28
|
+
/**
|
|
29
|
+
* Russian, Ukrainian, Serbian, Croatian, Bosnian
|
|
30
|
+
* Three forms: one, few (2-4), many (5+)
|
|
31
|
+
*/
|
|
32
|
+
ru: (count) => {
|
|
33
|
+
const mod10 = count % 10;
|
|
34
|
+
const mod100 = count % 100;
|
|
35
|
+
if (mod10 === 1 && mod100 !== 11) return 0;
|
|
36
|
+
if (mod10 >= 2 && mod10 <= 4 && (mod100 < 10 || mod100 >= 20)) return 1;
|
|
37
|
+
return 2;
|
|
38
|
+
},
|
|
39
|
+
uk: (count) => {
|
|
40
|
+
const mod10 = count % 10;
|
|
41
|
+
const mod100 = count % 100;
|
|
42
|
+
if (mod10 === 1 && mod100 !== 11) return 0;
|
|
43
|
+
if (mod10 >= 2 && mod10 <= 4 && (mod100 < 10 || mod100 >= 20)) return 1;
|
|
44
|
+
return 2;
|
|
45
|
+
},
|
|
46
|
+
/**
|
|
47
|
+
* Polish
|
|
48
|
+
* Three forms with different rules
|
|
49
|
+
*/
|
|
50
|
+
pl: (count) => {
|
|
51
|
+
if (count === 1) return 0;
|
|
52
|
+
const mod10 = count % 10;
|
|
53
|
+
const mod100 = count % 100;
|
|
54
|
+
if (mod10 >= 2 && mod10 <= 4 && (mod100 < 10 || mod100 >= 20)) return 1;
|
|
55
|
+
return 2;
|
|
56
|
+
},
|
|
57
|
+
/**
|
|
58
|
+
* Czech, Slovak
|
|
59
|
+
* Three forms: 1, 2-4, 5+
|
|
60
|
+
*/
|
|
61
|
+
cs: (count) => {
|
|
62
|
+
if (count === 1) return 0;
|
|
63
|
+
if (count >= 2 && count <= 4) return 1;
|
|
64
|
+
return 2;
|
|
65
|
+
},
|
|
66
|
+
sk: (count) => {
|
|
67
|
+
if (count === 1) return 0;
|
|
68
|
+
if (count >= 2 && count <= 4) return 1;
|
|
69
|
+
return 2;
|
|
70
|
+
},
|
|
71
|
+
/**
|
|
72
|
+
* Arabic
|
|
73
|
+
* Six forms
|
|
74
|
+
*/
|
|
75
|
+
ar: (count) => {
|
|
76
|
+
if (count === 0) return 0;
|
|
77
|
+
if (count === 1) return 1;
|
|
78
|
+
if (count === 2) return 2;
|
|
79
|
+
const mod100 = count % 100;
|
|
80
|
+
if (mod100 >= 3 && mod100 <= 10) return 3;
|
|
81
|
+
if (mod100 >= 11) return 4;
|
|
82
|
+
return 5;
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
function getPluralizationRule(locale) {
|
|
86
|
+
if (pluralizationRules[locale]) {
|
|
87
|
+
return pluralizationRules[locale];
|
|
88
|
+
}
|
|
89
|
+
const langCode = locale.split("-")[0];
|
|
90
|
+
if (pluralizationRules[langCode]) {
|
|
91
|
+
return pluralizationRules[langCode];
|
|
92
|
+
}
|
|
93
|
+
return pluralizationRules.en;
|
|
94
|
+
}
|
|
95
|
+
function selectPluralForm(translation, count, rule) {
|
|
96
|
+
const forms = translation.split("|");
|
|
97
|
+
const index = rule(Math.abs(count));
|
|
98
|
+
return forms[index] ?? forms[forms.length - 1];
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// src/i18n/Translator.ts
|
|
102
|
+
var Translator = class {
|
|
103
|
+
locale;
|
|
104
|
+
fallbackLocale;
|
|
105
|
+
messages;
|
|
106
|
+
pluralizationRules;
|
|
107
|
+
onMissingKey;
|
|
108
|
+
constructor(options) {
|
|
109
|
+
this.locale = options.locale;
|
|
110
|
+
this.fallbackLocale = options.fallbackLocale;
|
|
111
|
+
this.messages = options.messages ?? {};
|
|
112
|
+
this.pluralizationRules = options.pluralizationRules ?? {};
|
|
113
|
+
this.onMissingKey = options.onMissingKey;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Translate a key.
|
|
117
|
+
*/
|
|
118
|
+
t(key, replacements) {
|
|
119
|
+
return this.translate(key, replacements);
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Translate a key with count for pluralization.
|
|
123
|
+
*/
|
|
124
|
+
tc(key, count, replacements) {
|
|
125
|
+
const translation = this.getRawTranslation(key, this.locale) ?? this.getRawTranslation(key, this.fallbackLocale);
|
|
126
|
+
if (!translation) {
|
|
127
|
+
return this.handleMissingKey(key);
|
|
128
|
+
}
|
|
129
|
+
const rule = this.pluralizationRules[this.locale] ?? getPluralizationRule(this.locale);
|
|
130
|
+
const pluralized = selectPluralForm(translation, count, rule);
|
|
131
|
+
return this.applyReplacements(pluralized, { count, ...replacements });
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Check if a translation exists.
|
|
135
|
+
*/
|
|
136
|
+
has(key, locale) {
|
|
137
|
+
const targetLocale = locale ?? this.locale;
|
|
138
|
+
return this.getRawTranslation(key, targetLocale) !== void 0;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Get the current locale.
|
|
142
|
+
*/
|
|
143
|
+
getLocale() {
|
|
144
|
+
return this.locale;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Set the current locale.
|
|
148
|
+
*/
|
|
149
|
+
setLocale(locale) {
|
|
150
|
+
this.locale = locale;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Get the fallback locale.
|
|
154
|
+
*/
|
|
155
|
+
getFallbackLocale() {
|
|
156
|
+
return this.fallbackLocale;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Set the fallback locale.
|
|
160
|
+
*/
|
|
161
|
+
setFallbackLocale(locale) {
|
|
162
|
+
this.fallbackLocale = locale;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Add messages for a locale.
|
|
166
|
+
*/
|
|
167
|
+
addMessages(locale, messages) {
|
|
168
|
+
this.messages[locale] = this.mergeMessages(
|
|
169
|
+
this.messages[locale] ?? {},
|
|
170
|
+
messages
|
|
171
|
+
);
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Set messages for a locale (replaces existing).
|
|
175
|
+
*/
|
|
176
|
+
setMessages(locale, messages) {
|
|
177
|
+
this.messages[locale] = messages;
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Get all messages for a locale.
|
|
181
|
+
*/
|
|
182
|
+
getMessages(locale) {
|
|
183
|
+
return this.messages[locale ?? this.locale] ?? {};
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Get available locales.
|
|
187
|
+
*/
|
|
188
|
+
getAvailableLocales() {
|
|
189
|
+
return Object.keys(this.messages);
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Set a custom pluralization rule.
|
|
193
|
+
*/
|
|
194
|
+
setPluralizationRule(locale, rule) {
|
|
195
|
+
this.pluralizationRules[locale] = rule;
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Internal translate method.
|
|
199
|
+
*/
|
|
200
|
+
translate(key, replacements) {
|
|
201
|
+
let translation = this.getRawTranslation(key, this.locale);
|
|
202
|
+
if (translation === void 0 && this.fallbackLocale) {
|
|
203
|
+
translation = this.getRawTranslation(key, this.fallbackLocale);
|
|
204
|
+
}
|
|
205
|
+
if (translation === void 0) {
|
|
206
|
+
return this.handleMissingKey(key);
|
|
207
|
+
}
|
|
208
|
+
return this.applyReplacements(translation, replacements);
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Get raw translation without replacements.
|
|
212
|
+
*/
|
|
213
|
+
getRawTranslation(key, locale) {
|
|
214
|
+
if (!locale) return void 0;
|
|
215
|
+
const messages = this.messages[locale];
|
|
216
|
+
if (!messages) return void 0;
|
|
217
|
+
const parts = key.split(".");
|
|
218
|
+
let result = messages;
|
|
219
|
+
for (const part of parts) {
|
|
220
|
+
if (result === void 0 || typeof result === "string") {
|
|
221
|
+
return void 0;
|
|
222
|
+
}
|
|
223
|
+
result = result[part];
|
|
224
|
+
}
|
|
225
|
+
return typeof result === "string" ? result : void 0;
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Apply replacements to a translation string.
|
|
229
|
+
*/
|
|
230
|
+
applyReplacements(translation, replacements) {
|
|
231
|
+
if (!replacements) return translation;
|
|
232
|
+
let result = translation;
|
|
233
|
+
for (const [key, value] of Object.entries(replacements)) {
|
|
234
|
+
result = result.replace(new RegExp(`:${key}`, "g"), String(value)).replace(new RegExp(`\\{${key}\\}`, "g"), String(value));
|
|
235
|
+
}
|
|
236
|
+
return result;
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Handle missing translation key.
|
|
240
|
+
*/
|
|
241
|
+
handleMissingKey(key) {
|
|
242
|
+
if (this.onMissingKey) {
|
|
243
|
+
const result = this.onMissingKey(key, this.locale);
|
|
244
|
+
if (result !== void 0) {
|
|
245
|
+
return result;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
return key;
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Deep merge messages.
|
|
252
|
+
*/
|
|
253
|
+
mergeMessages(target, source) {
|
|
254
|
+
const result = { ...target };
|
|
255
|
+
for (const [key, value] of Object.entries(source)) {
|
|
256
|
+
if (typeof value === "object" && value !== null && typeof result[key] === "object" && result[key] !== null) {
|
|
257
|
+
result[key] = this.mergeMessages(
|
|
258
|
+
result[key],
|
|
259
|
+
value
|
|
260
|
+
);
|
|
261
|
+
} else {
|
|
262
|
+
result[key] = value;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
return result;
|
|
266
|
+
}
|
|
267
|
+
};
|
|
268
|
+
|
|
269
|
+
// src/i18n/loaders/JsonLoader.ts
|
|
270
|
+
import { readdir, readFile } from "fs/promises";
|
|
271
|
+
import { join, basename, extname } from "path";
|
|
272
|
+
var JsonLoader = class {
|
|
273
|
+
basePath;
|
|
274
|
+
cache = /* @__PURE__ */ new Map();
|
|
275
|
+
useCache;
|
|
276
|
+
constructor(basePath, options = {}) {
|
|
277
|
+
this.basePath = basePath;
|
|
278
|
+
this.useCache = options.cache ?? true;
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Load all translations for a locale.
|
|
282
|
+
*/
|
|
283
|
+
async load(locale) {
|
|
284
|
+
const cacheKey = locale;
|
|
285
|
+
if (this.useCache && this.cache.has(cacheKey)) {
|
|
286
|
+
return this.cache.get(cacheKey);
|
|
287
|
+
}
|
|
288
|
+
const localePath = join(this.basePath, locale);
|
|
289
|
+
const messages = {};
|
|
290
|
+
try {
|
|
291
|
+
const files = await readdir(localePath);
|
|
292
|
+
for (const file of files) {
|
|
293
|
+
if (extname(file) !== ".json") continue;
|
|
294
|
+
const namespace = basename(file, ".json");
|
|
295
|
+
const filePath = join(localePath, file);
|
|
296
|
+
const content = await readFile(filePath, "utf-8");
|
|
297
|
+
try {
|
|
298
|
+
messages[namespace] = JSON.parse(content);
|
|
299
|
+
} catch {
|
|
300
|
+
console.warn(`Failed to parse translation file: ${filePath}`);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
} catch {
|
|
304
|
+
}
|
|
305
|
+
if (this.useCache) {
|
|
306
|
+
this.cache.set(cacheKey, messages);
|
|
307
|
+
}
|
|
308
|
+
return messages;
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* Load translations for a specific namespace.
|
|
312
|
+
*/
|
|
313
|
+
async loadNamespace(locale, namespace) {
|
|
314
|
+
const cacheKey = `${locale}:${namespace}`;
|
|
315
|
+
if (this.useCache && this.cache.has(cacheKey)) {
|
|
316
|
+
return this.cache.get(cacheKey);
|
|
317
|
+
}
|
|
318
|
+
const filePath = join(this.basePath, locale, `${namespace}.json`);
|
|
319
|
+
try {
|
|
320
|
+
const content = await readFile(filePath, "utf-8");
|
|
321
|
+
const messages = JSON.parse(content);
|
|
322
|
+
if (this.useCache) {
|
|
323
|
+
this.cache.set(cacheKey, messages);
|
|
324
|
+
}
|
|
325
|
+
return messages;
|
|
326
|
+
} catch {
|
|
327
|
+
return {};
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
/**
|
|
331
|
+
* Get available locales.
|
|
332
|
+
*/
|
|
333
|
+
async getAvailableLocales() {
|
|
334
|
+
try {
|
|
335
|
+
const entries = await readdir(this.basePath, { withFileTypes: true });
|
|
336
|
+
return entries.filter((entry) => entry.isDirectory()).map((entry) => entry.name);
|
|
337
|
+
} catch {
|
|
338
|
+
return [];
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* Clear the cache.
|
|
343
|
+
*/
|
|
344
|
+
clearCache() {
|
|
345
|
+
this.cache.clear();
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* Enable or disable caching.
|
|
349
|
+
*/
|
|
350
|
+
setCaching(enabled) {
|
|
351
|
+
this.useCache = enabled;
|
|
352
|
+
if (!enabled) {
|
|
353
|
+
this.clearCache();
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
};
|
|
357
|
+
|
|
358
|
+
// src/i18n/I18nManager.ts
|
|
359
|
+
var I18nManager = class {
|
|
360
|
+
config;
|
|
361
|
+
translator;
|
|
362
|
+
loader;
|
|
363
|
+
loadedLocales = /* @__PURE__ */ new Set();
|
|
364
|
+
constructor(config) {
|
|
365
|
+
this.config = config;
|
|
366
|
+
this.loader = config.path ? new JsonLoader(config.path) : null;
|
|
367
|
+
this.translator = new Translator({
|
|
368
|
+
locale: config.locale,
|
|
369
|
+
fallbackLocale: config.fallbackLocale,
|
|
370
|
+
messages: config.messages ?? {}
|
|
371
|
+
});
|
|
372
|
+
if (config.messages) {
|
|
373
|
+
for (const locale of Object.keys(config.messages)) {
|
|
374
|
+
this.loadedLocales.add(locale);
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
/**
|
|
379
|
+
* Translate a key.
|
|
380
|
+
*/
|
|
381
|
+
t(key, replacements) {
|
|
382
|
+
return this.translator.t(key, replacements);
|
|
383
|
+
}
|
|
384
|
+
/**
|
|
385
|
+
* Translate a key with count for pluralization.
|
|
386
|
+
*/
|
|
387
|
+
tc(key, count, replacements) {
|
|
388
|
+
return this.translator.tc(key, count, replacements);
|
|
389
|
+
}
|
|
390
|
+
/**
|
|
391
|
+
* Check if a translation exists.
|
|
392
|
+
*/
|
|
393
|
+
has(key, locale) {
|
|
394
|
+
return this.translator.has(key, locale);
|
|
395
|
+
}
|
|
396
|
+
/**
|
|
397
|
+
* Get the current locale.
|
|
398
|
+
*/
|
|
399
|
+
getLocale() {
|
|
400
|
+
return this.translator.getLocale();
|
|
401
|
+
}
|
|
402
|
+
/**
|
|
403
|
+
* Set the current locale.
|
|
404
|
+
*/
|
|
405
|
+
setLocale(locale) {
|
|
406
|
+
this.translator.setLocale(locale);
|
|
407
|
+
}
|
|
408
|
+
/**
|
|
409
|
+
* Get the fallback locale.
|
|
410
|
+
*/
|
|
411
|
+
getFallbackLocale() {
|
|
412
|
+
return this.translator.getFallbackLocale();
|
|
413
|
+
}
|
|
414
|
+
/**
|
|
415
|
+
* Set the fallback locale.
|
|
416
|
+
*/
|
|
417
|
+
setFallbackLocale(locale) {
|
|
418
|
+
this.translator.setFallbackLocale(locale);
|
|
419
|
+
}
|
|
420
|
+
/**
|
|
421
|
+
* Load translations for a locale.
|
|
422
|
+
*/
|
|
423
|
+
async loadLocale(locale) {
|
|
424
|
+
if (this.loadedLocales.has(locale)) return;
|
|
425
|
+
if (!this.loader) return;
|
|
426
|
+
const messages = await this.loader.load(locale);
|
|
427
|
+
this.translator.addMessages(locale, messages);
|
|
428
|
+
this.loadedLocales.add(locale);
|
|
429
|
+
}
|
|
430
|
+
/**
|
|
431
|
+
* Load translations for multiple locales.
|
|
432
|
+
*/
|
|
433
|
+
async loadLocales(locales) {
|
|
434
|
+
await Promise.all(locales.map((locale) => this.loadLocale(locale)));
|
|
435
|
+
}
|
|
436
|
+
/**
|
|
437
|
+
* Load a specific namespace for a locale.
|
|
438
|
+
*/
|
|
439
|
+
async loadNamespace(locale, namespace) {
|
|
440
|
+
if (!this.loader?.loadNamespace) return;
|
|
441
|
+
const messages = await this.loader.loadNamespace(locale, namespace);
|
|
442
|
+
const currentMessages = this.translator.getMessages(locale);
|
|
443
|
+
this.translator.setMessages(locale, {
|
|
444
|
+
...currentMessages,
|
|
445
|
+
[namespace]: messages
|
|
446
|
+
});
|
|
447
|
+
}
|
|
448
|
+
/**
|
|
449
|
+
* Add messages for a locale.
|
|
450
|
+
*/
|
|
451
|
+
addMessages(locale, messages) {
|
|
452
|
+
this.translator.addMessages(locale, messages);
|
|
453
|
+
this.loadedLocales.add(locale);
|
|
454
|
+
}
|
|
455
|
+
/**
|
|
456
|
+
* Get all messages for a locale.
|
|
457
|
+
*/
|
|
458
|
+
getMessages(locale) {
|
|
459
|
+
return this.translator.getMessages(locale);
|
|
460
|
+
}
|
|
461
|
+
/**
|
|
462
|
+
* Get available locales.
|
|
463
|
+
*/
|
|
464
|
+
getAvailableLocales() {
|
|
465
|
+
return this.translator.getAvailableLocales();
|
|
466
|
+
}
|
|
467
|
+
/**
|
|
468
|
+
* Get available locales from loader.
|
|
469
|
+
*/
|
|
470
|
+
async getLoaderLocales() {
|
|
471
|
+
if (!this.loader?.getAvailableLocales) return [];
|
|
472
|
+
return this.loader.getAvailableLocales();
|
|
473
|
+
}
|
|
474
|
+
/**
|
|
475
|
+
* Check if a locale is loaded.
|
|
476
|
+
*/
|
|
477
|
+
isLocaleLoaded(locale) {
|
|
478
|
+
return this.loadedLocales.has(locale);
|
|
479
|
+
}
|
|
480
|
+
/**
|
|
481
|
+
* Get the underlying translator.
|
|
482
|
+
*/
|
|
483
|
+
getTranslator() {
|
|
484
|
+
return this.translator;
|
|
485
|
+
}
|
|
486
|
+
/**
|
|
487
|
+
* Set a custom loader.
|
|
488
|
+
*/
|
|
489
|
+
setLoader(loader) {
|
|
490
|
+
this.loader = loader;
|
|
491
|
+
}
|
|
492
|
+
/**
|
|
493
|
+
* Create a scoped translator for a specific locale.
|
|
494
|
+
*/
|
|
495
|
+
forLocale(locale) {
|
|
496
|
+
return new Translator({
|
|
497
|
+
locale,
|
|
498
|
+
fallbackLocale: this.config.fallbackLocale,
|
|
499
|
+
messages: {
|
|
500
|
+
[locale]: this.translator.getMessages(locale),
|
|
501
|
+
...this.config.fallbackLocale ? { [this.config.fallbackLocale]: this.translator.getMessages(this.config.fallbackLocale) } : {}
|
|
502
|
+
}
|
|
503
|
+
});
|
|
504
|
+
}
|
|
505
|
+
};
|
|
506
|
+
var globalI18n = null;
|
|
507
|
+
function createI18n(config) {
|
|
508
|
+
return new I18nManager(config);
|
|
509
|
+
}
|
|
510
|
+
function setI18n(i18n) {
|
|
511
|
+
globalI18n = i18n;
|
|
512
|
+
}
|
|
513
|
+
function getI18n() {
|
|
514
|
+
if (!globalI18n) {
|
|
515
|
+
throw new Error("I18n manager not initialized. Call setI18n() first.");
|
|
516
|
+
}
|
|
517
|
+
return globalI18n;
|
|
518
|
+
}
|
|
519
|
+
function t(key, replacements) {
|
|
520
|
+
return getI18n().t(key, replacements);
|
|
521
|
+
}
|
|
522
|
+
function tc(key, count, replacements) {
|
|
523
|
+
return getI18n().tc(key, count, replacements);
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
// src/i18n/loaders/MemoryLoader.ts
|
|
527
|
+
var MemoryLoader = class {
|
|
528
|
+
messages;
|
|
529
|
+
constructor(messages = {}) {
|
|
530
|
+
this.messages = messages;
|
|
531
|
+
}
|
|
532
|
+
/**
|
|
533
|
+
* Load all translations for a locale.
|
|
534
|
+
*/
|
|
535
|
+
async load(locale) {
|
|
536
|
+
return this.messages[locale] ?? {};
|
|
537
|
+
}
|
|
538
|
+
/**
|
|
539
|
+
* Load translations for a specific namespace.
|
|
540
|
+
*/
|
|
541
|
+
async loadNamespace(locale, namespace) {
|
|
542
|
+
const localeMessages = this.messages[locale];
|
|
543
|
+
if (!localeMessages) return {};
|
|
544
|
+
const namespaceMessages = localeMessages[namespace];
|
|
545
|
+
if (typeof namespaceMessages === "object" && namespaceMessages !== null) {
|
|
546
|
+
return namespaceMessages;
|
|
547
|
+
}
|
|
548
|
+
return {};
|
|
549
|
+
}
|
|
550
|
+
/**
|
|
551
|
+
* Get available locales.
|
|
552
|
+
*/
|
|
553
|
+
async getAvailableLocales() {
|
|
554
|
+
return Object.keys(this.messages);
|
|
555
|
+
}
|
|
556
|
+
/**
|
|
557
|
+
* Add messages for a locale.
|
|
558
|
+
*/
|
|
559
|
+
addMessages(locale, messages) {
|
|
560
|
+
this.messages[locale] = {
|
|
561
|
+
...this.messages[locale],
|
|
562
|
+
...messages
|
|
563
|
+
};
|
|
564
|
+
}
|
|
565
|
+
/**
|
|
566
|
+
* Set messages for a locale (replaces existing).
|
|
567
|
+
*/
|
|
568
|
+
setMessages(locale, messages) {
|
|
569
|
+
this.messages[locale] = messages;
|
|
570
|
+
}
|
|
571
|
+
/**
|
|
572
|
+
* Remove messages for a locale.
|
|
573
|
+
*/
|
|
574
|
+
removeLocale(locale) {
|
|
575
|
+
delete this.messages[locale];
|
|
576
|
+
}
|
|
577
|
+
/**
|
|
578
|
+
* Clear all messages.
|
|
579
|
+
*/
|
|
580
|
+
clear() {
|
|
581
|
+
this.messages = {};
|
|
582
|
+
}
|
|
583
|
+
};
|
|
584
|
+
export {
|
|
585
|
+
I18nManager,
|
|
586
|
+
JsonLoader,
|
|
587
|
+
MemoryLoader,
|
|
588
|
+
Translator,
|
|
589
|
+
createI18n,
|
|
590
|
+
getI18n,
|
|
591
|
+
getPluralizationRule,
|
|
592
|
+
pluralizationRules,
|
|
593
|
+
selectPluralForm,
|
|
594
|
+
setI18n,
|
|
595
|
+
t,
|
|
596
|
+
tc
|
|
597
|
+
};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { MiddlewareHandler } from 'hono';
|
|
2
|
+
|
|
3
|
+
type Middleware = MiddlewareHandler;
|
|
4
|
+
declare function defineMiddleware(handler: MiddlewareHandler): MiddlewareHandler;
|
|
5
|
+
declare function jsonResponse(data: unknown, status?: number): Response;
|
|
6
|
+
|
|
7
|
+
export { type Middleware as M, defineMiddleware as d, jsonResponse as j };
|