@rb-games/core 0.1.1 → 0.1.2
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/chunk-5BLUF2HG.js +25 -0
- package/dist/chunk-5BLUF2HG.js.map +1 -0
- package/dist/chunk-DOHQE2YZ.js +392 -0
- package/dist/chunk-DOHQE2YZ.js.map +1 -0
- package/dist/chunk-FOZO6TLY.js +673 -0
- package/dist/chunk-FOZO6TLY.js.map +1 -0
- package/dist/chunk-G3PMV62Z.js +33 -0
- package/dist/chunk-G3PMV62Z.js.map +1 -0
- package/dist/chunk-KOHCRCV3.js +490 -0
- package/dist/chunk-KOHCRCV3.js.map +1 -0
- package/dist/chunk-MI6BP7A6.js +11 -0
- package/dist/chunk-MI6BP7A6.js.map +1 -0
- package/dist/chunk-NQMORMNP.js +15 -0
- package/dist/chunk-NQMORMNP.js.map +1 -0
- package/dist/chunk-RAEOBW6E.js +133 -0
- package/dist/chunk-RAEOBW6E.js.map +1 -0
- package/dist/chunk-UE7T7Z45.js +884 -0
- package/dist/chunk-UE7T7Z45.js.map +1 -0
- package/dist/devtools/index.js +2 -882
- package/dist/devtools/index.js.map +1 -1
- package/dist/engine/index.js +6 -1267
- package/dist/engine/index.js.map +1 -1
- package/dist/filters/index.js +1 -1
- package/dist/helpers/index.js +6 -35
- package/dist/helpers/index.js.map +1 -1
- package/dist/i18n/index.js +4 -525
- package/dist/i18n/index.js.map +1 -1
- package/dist/layout/index.js +2 -671
- package/dist/layout/index.js.map +1 -1
- package/dist/particle/index.js +1 -6
- package/dist/particle/index.js.map +1 -1
- package/dist/plugins/Plugin.types.d.ts +4 -2
- package/dist/plugins/Plugin.types.d.ts.map +1 -1
- package/dist/plugins/index.js +6 -521
- package/dist/plugins/index.js.map +1 -1
- package/dist/state-machine/index.js +1 -1
- package/dist/store/index.js +1 -1
- package/dist/ui/index.js +5 -531
- package/dist/ui/index.js.map +1 -1
- package/dist/utils/index.js +4 -897
- package/dist/utils/index.js.map +1 -1
- package/dist/vite/index.js +1 -1
- package/package.json +1 -1
package/dist/i18n/index.js
CHANGED
|
@@ -1,527 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
|
|
5
|
-
// i18n/sharedI18n.ts
|
|
6
|
-
|
|
7
|
-
// helpers/resolvePublicPath.ts
|
|
8
|
-
function resolvePublicPath(path) {
|
|
9
|
-
var _a;
|
|
10
|
-
if (path.startsWith("http://") || path.startsWith("https://")) {
|
|
11
|
-
return path;
|
|
12
|
-
}
|
|
13
|
-
const base = typeof import.meta !== "undefined" && ((_a = import.meta.env) == null ? void 0 : _a.BASE_URL) ? import.meta.env.BASE_URL : "/";
|
|
14
|
-
const normalizedBase = base.endsWith("/") ? base : `${base}/`;
|
|
15
|
-
const normalizedPath = path.startsWith("/") ? path.slice(1) : path;
|
|
16
|
-
return `${normalizedBase}${normalizedPath}`;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
// utils/Logger.ts
|
|
20
|
-
var Logger = class _Logger {
|
|
21
|
-
static instance;
|
|
22
|
-
config;
|
|
23
|
-
// Terminal colors (for Node.js environment)
|
|
24
|
-
terminalColors = {
|
|
25
|
-
reset: "\x1B[0m",
|
|
26
|
-
red: "\x1B[31m",
|
|
27
|
-
yellow: "\x1B[33m",
|
|
28
|
-
blue: "\x1B[34m",
|
|
29
|
-
green: "\x1B[32m",
|
|
30
|
-
gray: "\x1B[90m",
|
|
31
|
-
cyan: "\x1B[36m",
|
|
32
|
-
magenta: "\x1B[35m",
|
|
33
|
-
white: "\x1B[37m"
|
|
34
|
-
};
|
|
35
|
-
// Browser console colors (using CSS)
|
|
36
|
-
browserColors = {
|
|
37
|
-
timestamp: "color: gray",
|
|
38
|
-
context: "color: cyan; font-weight: bold",
|
|
39
|
-
message: "color: white",
|
|
40
|
-
error: "color: red; font-weight: bold",
|
|
41
|
-
warn: "color: orange; font-weight: bold",
|
|
42
|
-
info: "color: dodgerblue; font-weight: bold",
|
|
43
|
-
debug: "color: green",
|
|
44
|
-
trace: "color: gray"
|
|
45
|
-
};
|
|
46
|
-
levelLabels = {
|
|
47
|
-
[0 /* ERROR */]: "ERROR",
|
|
48
|
-
[1 /* WARN */]: "WARN",
|
|
49
|
-
[2 /* INFO */]: "INFO",
|
|
50
|
-
[3 /* DEBUG */]: "DEBUG",
|
|
51
|
-
[4 /* TRACE */]: "TRACE"
|
|
52
|
-
};
|
|
53
|
-
levelColors = {
|
|
54
|
-
[0 /* ERROR */]: this.terminalColors.red,
|
|
55
|
-
[1 /* WARN */]: this.terminalColors.yellow,
|
|
56
|
-
[2 /* INFO */]: this.terminalColors.blue,
|
|
57
|
-
[3 /* DEBUG */]: this.terminalColors.green,
|
|
58
|
-
[4 /* TRACE */]: this.terminalColors.gray
|
|
59
|
-
};
|
|
60
|
-
levelBrowserColors = {
|
|
61
|
-
[0 /* ERROR */]: this.browserColors.error,
|
|
62
|
-
[1 /* WARN */]: this.browserColors.warn,
|
|
63
|
-
[2 /* INFO */]: this.browserColors.info,
|
|
64
|
-
[3 /* DEBUG */]: this.browserColors.debug,
|
|
65
|
-
[4 /* TRACE */]: this.browserColors.trace
|
|
66
|
-
};
|
|
67
|
-
/**
|
|
68
|
-
* Private constructor for singleton pattern
|
|
69
|
-
*/
|
|
70
|
-
constructor() {
|
|
71
|
-
var _a;
|
|
72
|
-
this.config = {
|
|
73
|
-
level: 3 /* DEBUG */,
|
|
74
|
-
// Default log level
|
|
75
|
-
enabled: true,
|
|
76
|
-
// Logging enabled by default
|
|
77
|
-
showTimestamp: false,
|
|
78
|
-
// Show timestamps by default
|
|
79
|
-
showColors: true
|
|
80
|
-
// Show colors by default
|
|
81
|
-
};
|
|
82
|
-
if ((_a = import.meta.env) == null ? void 0 : _a.DEV) {
|
|
83
|
-
console.warn(
|
|
84
|
-
"[Logger] For better debugging experience, add Logger.ts to DevTools ignore list:\nDevTools \u2192 Settings (F1) \u2192 Ignore List \u2192 Add pattern: /Logger\\.ts$"
|
|
85
|
-
);
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
/**
|
|
89
|
-
* Get the singleton instance of the Logger
|
|
90
|
-
*/
|
|
91
|
-
static getInstance() {
|
|
92
|
-
if (!_Logger.instance) {
|
|
93
|
-
_Logger.instance = new _Logger();
|
|
94
|
-
}
|
|
95
|
-
return _Logger.instance;
|
|
96
|
-
}
|
|
97
|
-
/**
|
|
98
|
-
* Configure the logger
|
|
99
|
-
* @param config Configuration options
|
|
100
|
-
*/
|
|
101
|
-
configure(config) {
|
|
102
|
-
this.config = { ...this.config, ...config };
|
|
103
|
-
}
|
|
104
|
-
/**
|
|
105
|
-
* Enable or disable logging
|
|
106
|
-
* @param enabled Whether logging is enabled
|
|
107
|
-
*/
|
|
108
|
-
setEnabled(enabled) {
|
|
109
|
-
this.config.enabled = enabled;
|
|
110
|
-
}
|
|
111
|
-
/**
|
|
112
|
-
* Set the log level
|
|
113
|
-
* @param level The log level to set
|
|
114
|
-
*/
|
|
115
|
-
setLevel(level) {
|
|
116
|
-
this.config.level = level;
|
|
117
|
-
}
|
|
118
|
-
/**
|
|
119
|
-
* Get the current log level
|
|
120
|
-
*/
|
|
121
|
-
getLevel() {
|
|
122
|
-
return this.config.level;
|
|
123
|
-
}
|
|
124
|
-
/**
|
|
125
|
-
* Log an error message
|
|
126
|
-
* @param message The message to log
|
|
127
|
-
* @param args Additional arguments to log
|
|
128
|
-
*/
|
|
129
|
-
error(message, ...args) {
|
|
130
|
-
this.log(0 /* ERROR */, message, ...args);
|
|
131
|
-
}
|
|
132
|
-
/**
|
|
133
|
-
* Log a warning message
|
|
134
|
-
* @param message The message to log
|
|
135
|
-
* @param args Additional arguments to log
|
|
136
|
-
*/
|
|
137
|
-
warn(message, ...args) {
|
|
138
|
-
this.log(1 /* WARN */, message, ...args);
|
|
139
|
-
}
|
|
140
|
-
/**
|
|
141
|
-
* Log an info message
|
|
142
|
-
* @param message The message to log
|
|
143
|
-
* @param args Additional arguments to log
|
|
144
|
-
*/
|
|
145
|
-
info(message, ...args) {
|
|
146
|
-
this.log(2 /* INFO */, message, ...args);
|
|
147
|
-
}
|
|
148
|
-
/**
|
|
149
|
-
* Log a debug message
|
|
150
|
-
* @param message The message to log
|
|
151
|
-
* @param args Additional arguments to log
|
|
152
|
-
*/
|
|
153
|
-
debug(message, ...args) {
|
|
154
|
-
this.log(3 /* DEBUG */, message, ...args);
|
|
155
|
-
}
|
|
156
|
-
/**
|
|
157
|
-
* Log a trace message
|
|
158
|
-
* @param message The message to log
|
|
159
|
-
* @param args Additional arguments to log
|
|
160
|
-
*/
|
|
161
|
-
trace(message, ...args) {
|
|
162
|
-
this.log(4 /* TRACE */, message, ...args);
|
|
163
|
-
}
|
|
164
|
-
/**
|
|
165
|
-
* Log a message with a specific log level
|
|
166
|
-
* @param level The log level
|
|
167
|
-
* @param message The message to log
|
|
168
|
-
* @param args Additional arguments to log
|
|
169
|
-
*/
|
|
170
|
-
log(level, message, ...args) {
|
|
171
|
-
if (!this.config.enabled || level > this.config.level) {
|
|
172
|
-
return;
|
|
173
|
-
}
|
|
174
|
-
if (!this.shouldLogMessage(message)) {
|
|
175
|
-
return;
|
|
176
|
-
}
|
|
177
|
-
const isBrowser = typeof window !== "undefined";
|
|
178
|
-
if (isBrowser && this.config.showColors) {
|
|
179
|
-
this.logBrowser(level, message, ...args);
|
|
180
|
-
} else {
|
|
181
|
-
this.logTerminal(level, message, ...args);
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
extractContext(message) {
|
|
185
|
-
const contextMatch = message.match(/^\[([^\]]+)\]\s(.*)$/);
|
|
186
|
-
if (!contextMatch) {
|
|
187
|
-
return {
|
|
188
|
-
context: "",
|
|
189
|
-
messageContent: message
|
|
190
|
-
};
|
|
191
|
-
}
|
|
192
|
-
return {
|
|
193
|
-
context: contextMatch[1],
|
|
194
|
-
messageContent: contextMatch[2]
|
|
195
|
-
};
|
|
196
|
-
}
|
|
197
|
-
matchesFilter(value, matchers) {
|
|
198
|
-
if (!(matchers == null ? void 0 : matchers.length)) {
|
|
199
|
-
return false;
|
|
200
|
-
}
|
|
201
|
-
return matchers.some((matcher) => {
|
|
202
|
-
if (typeof matcher === "string") {
|
|
203
|
-
return value.includes(matcher);
|
|
204
|
-
}
|
|
205
|
-
matcher.lastIndex = 0;
|
|
206
|
-
return matcher.test(value);
|
|
207
|
-
});
|
|
208
|
-
}
|
|
209
|
-
shouldLogMessage(message) {
|
|
210
|
-
var _a, _b;
|
|
211
|
-
const filter = this.config.filter;
|
|
212
|
-
if (!filter) {
|
|
213
|
-
return true;
|
|
214
|
-
}
|
|
215
|
-
const hasFilters = Boolean(((_a = filter.contexts) == null ? void 0 : _a.length) || ((_b = filter.messages) == null ? void 0 : _b.length));
|
|
216
|
-
if (!hasFilters) {
|
|
217
|
-
return true;
|
|
218
|
-
}
|
|
219
|
-
const { context, messageContent } = this.extractContext(message);
|
|
220
|
-
const contextMatches = this.matchesFilter(context, filter.contexts);
|
|
221
|
-
const messageMatches = this.matchesFilter(messageContent, filter.messages);
|
|
222
|
-
const matches = contextMatches || messageMatches;
|
|
223
|
-
return filter.mode === "exclude" ? !matches : matches;
|
|
224
|
-
}
|
|
225
|
-
/**
|
|
226
|
-
* Log a message in terminal/node environment
|
|
227
|
-
*/
|
|
228
|
-
logTerminal(level, message, ...args) {
|
|
229
|
-
let timestamp = "";
|
|
230
|
-
let levelStr = "";
|
|
231
|
-
let contextPart = "";
|
|
232
|
-
const contextMatch = message.match(/^\[([^\]]+)\]\s(.*)$/);
|
|
233
|
-
let messageContent = message;
|
|
234
|
-
if (contextMatch) {
|
|
235
|
-
contextPart = `[${contextMatch[1]}] `;
|
|
236
|
-
messageContent = contextMatch[2];
|
|
237
|
-
}
|
|
238
|
-
if (this.config.showTimestamp) {
|
|
239
|
-
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
240
|
-
timestamp = `[${now}] `;
|
|
241
|
-
}
|
|
242
|
-
levelStr = `[${this.levelLabels[level]}] `;
|
|
243
|
-
if (this.config.showColors) {
|
|
244
|
-
const levelColor = this.levelColors[level];
|
|
245
|
-
const contextColor = this.terminalColors.cyan;
|
|
246
|
-
const timestampColor = this.terminalColors.gray;
|
|
247
|
-
const messageColor = this.terminalColors.white;
|
|
248
|
-
timestamp = `${timestampColor}${timestamp}${this.terminalColors.reset}`;
|
|
249
|
-
levelStr = `${levelColor}${levelStr}${this.terminalColors.reset}`;
|
|
250
|
-
if (contextPart) {
|
|
251
|
-
contextPart = `${contextColor}${contextPart}${this.terminalColors.reset}`;
|
|
252
|
-
}
|
|
253
|
-
messageContent = `${messageColor}${messageContent}${this.terminalColors.reset}`;
|
|
254
|
-
}
|
|
255
|
-
const formattedMessage = timestamp + levelStr + contextPart + messageContent;
|
|
256
|
-
switch (level) {
|
|
257
|
-
case 0 /* ERROR */:
|
|
258
|
-
console.error(formattedMessage, ...args);
|
|
259
|
-
break;
|
|
260
|
-
case 1 /* WARN */:
|
|
261
|
-
console.warn(formattedMessage, ...args);
|
|
262
|
-
break;
|
|
263
|
-
case 2 /* INFO */:
|
|
264
|
-
console.info(formattedMessage, ...args);
|
|
265
|
-
break;
|
|
266
|
-
case 3 /* DEBUG */:
|
|
267
|
-
case 4 /* TRACE */:
|
|
268
|
-
default:
|
|
269
|
-
console.log(formattedMessage, ...args);
|
|
270
|
-
break;
|
|
271
|
-
}
|
|
272
|
-
}
|
|
273
|
-
/**
|
|
274
|
-
* Log a message in browser environment with CSS styling
|
|
275
|
-
*/
|
|
276
|
-
logBrowser(level, message, ...args) {
|
|
277
|
-
const contextMatch = message.match(/^\[([^\]]+)\]\s(.*)$/);
|
|
278
|
-
let context = "";
|
|
279
|
-
let messageContent = message;
|
|
280
|
-
if (contextMatch) {
|
|
281
|
-
context = contextMatch[1];
|
|
282
|
-
messageContent = contextMatch[2];
|
|
283
|
-
}
|
|
284
|
-
let format = "";
|
|
285
|
-
const formatArgs = [];
|
|
286
|
-
if (this.config.showTimestamp) {
|
|
287
|
-
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
288
|
-
format += "%c[" + now + "] ";
|
|
289
|
-
formatArgs.push(this.browserColors.timestamp);
|
|
290
|
-
}
|
|
291
|
-
format += "%c[" + this.levelLabels[level] + "] ";
|
|
292
|
-
formatArgs.push(this.levelBrowserColors[level]);
|
|
293
|
-
if (context) {
|
|
294
|
-
format += "%c[" + context + "] ";
|
|
295
|
-
formatArgs.push(this.browserColors.context);
|
|
296
|
-
}
|
|
297
|
-
format += "%c" + messageContent;
|
|
298
|
-
formatArgs.push(this.browserColors.message);
|
|
299
|
-
switch (level) {
|
|
300
|
-
case 0 /* ERROR */:
|
|
301
|
-
console.error(format, ...formatArgs, ...args);
|
|
302
|
-
break;
|
|
303
|
-
case 1 /* WARN */:
|
|
304
|
-
console.warn(format, ...formatArgs, ...args);
|
|
305
|
-
break;
|
|
306
|
-
case 2 /* INFO */:
|
|
307
|
-
console.info(format, ...formatArgs, ...args);
|
|
308
|
-
break;
|
|
309
|
-
case 3 /* DEBUG */:
|
|
310
|
-
case 4 /* TRACE */:
|
|
311
|
-
default:
|
|
312
|
-
console.log(format, ...formatArgs, ...args);
|
|
313
|
-
break;
|
|
314
|
-
}
|
|
315
|
-
}
|
|
316
|
-
/**
|
|
317
|
-
* Creates a context-specific logger.
|
|
318
|
-
*
|
|
319
|
-
* Context loggers automatically prefix all log messages with a context tag.
|
|
320
|
-
* Commonly used in plugins and classes to identify log sources.
|
|
321
|
-
*
|
|
322
|
-
* @param context - Context name (e.g., 'MyPlugin', 'SceneManager')
|
|
323
|
-
* @returns ContextLogger instance
|
|
324
|
-
*
|
|
325
|
-
* @example
|
|
326
|
-
* ```typescript
|
|
327
|
-
* class DisplayPlugin {
|
|
328
|
-
* private logger = logger.createContextLogger('DisplayPlugin');
|
|
329
|
-
*
|
|
330
|
-
* initialize() {
|
|
331
|
-
* this.logger.info('Initializing display');
|
|
332
|
-
* // Output: [INFO] [DisplayPlugin] Initializing display
|
|
333
|
-
* }
|
|
334
|
-
* }
|
|
335
|
-
* ```
|
|
336
|
-
*/
|
|
337
|
-
createContextLogger(context) {
|
|
338
|
-
return new ContextLogger(this, context);
|
|
339
|
-
}
|
|
340
|
-
};
|
|
341
|
-
var ContextLogger = class {
|
|
342
|
-
logger;
|
|
343
|
-
context;
|
|
344
|
-
constructor(logger2, context) {
|
|
345
|
-
this.logger = logger2;
|
|
346
|
-
this.context = context;
|
|
347
|
-
}
|
|
348
|
-
/**
|
|
349
|
-
* Log an error message
|
|
350
|
-
* @param message The message to log
|
|
351
|
-
* @param args Additional arguments to log
|
|
352
|
-
*/
|
|
353
|
-
error(message, ...args) {
|
|
354
|
-
this.logger.error(`[${this.context}] ${message}`, ...args);
|
|
355
|
-
}
|
|
356
|
-
/**
|
|
357
|
-
* Log a warning message
|
|
358
|
-
* @param message The message to log
|
|
359
|
-
* @param args Additional arguments to log
|
|
360
|
-
*/
|
|
361
|
-
warn(message, ...args) {
|
|
362
|
-
this.logger.warn(`[${this.context}] ${message}`, ...args);
|
|
363
|
-
}
|
|
364
|
-
/**
|
|
365
|
-
* Log an info message
|
|
366
|
-
* @param message The message to log
|
|
367
|
-
* @param args Additional arguments to log
|
|
368
|
-
*/
|
|
369
|
-
info(message, ...args) {
|
|
370
|
-
this.logger.info(`[${this.context}] ${message}`, ...args);
|
|
371
|
-
}
|
|
372
|
-
/**
|
|
373
|
-
* Log a debug message
|
|
374
|
-
* @param message The message to log
|
|
375
|
-
* @param args Additional arguments to log
|
|
376
|
-
*/
|
|
377
|
-
debug(message, ...args) {
|
|
378
|
-
this.logger.debug(`[${this.context}] ${message}`, ...args);
|
|
379
|
-
}
|
|
380
|
-
/**
|
|
381
|
-
* Log a trace message
|
|
382
|
-
* @param message The message to log
|
|
383
|
-
* @param args Additional arguments to log
|
|
384
|
-
*/
|
|
385
|
-
trace(message, ...args) {
|
|
386
|
-
this.logger.trace(`[${this.context}] ${message}`, ...args);
|
|
387
|
-
}
|
|
388
|
-
};
|
|
389
|
-
var logger = Logger.getInstance();
|
|
390
|
-
var contextLoggers = /* @__PURE__ */ new Map();
|
|
391
|
-
function getLogger(context) {
|
|
392
|
-
let cached = contextLoggers.get(context);
|
|
393
|
-
if (!cached) {
|
|
394
|
-
cached = new ContextLogger(logger, context);
|
|
395
|
-
contextLoggers.set(context, cached);
|
|
396
|
-
}
|
|
397
|
-
return cached;
|
|
398
|
-
}
|
|
399
|
-
|
|
400
|
-
// i18n/sharedI18n.ts
|
|
401
|
-
var DEFAULT_LANGUAGE = "en";
|
|
402
|
-
var initPromise = null;
|
|
403
|
-
var languageChangedListeners = /* @__PURE__ */ new Set();
|
|
404
|
-
function normalizeLanguageCode(lng) {
|
|
405
|
-
if (!lng) return DEFAULT_LANGUAGE;
|
|
406
|
-
return lng.trim().toLowerCase().split("-")[0] || DEFAULT_LANGUAGE;
|
|
407
|
-
}
|
|
408
|
-
function resolveLanguageFromUrl(search = window.location.search) {
|
|
409
|
-
const raw = new URLSearchParams(search).get("lng");
|
|
410
|
-
return normalizeLanguageCode(raw);
|
|
411
|
-
}
|
|
412
|
-
function createInterpolationFormat() {
|
|
413
|
-
return (value, format) => {
|
|
414
|
-
if (typeof value === "string") {
|
|
415
|
-
value = value.trim();
|
|
416
|
-
}
|
|
417
|
-
if (format === "optional" && (value === null || value === void 0 || value === "")) {
|
|
418
|
-
return "";
|
|
419
|
-
}
|
|
420
|
-
switch (format) {
|
|
421
|
-
case "percentage":
|
|
422
|
-
if (typeof value === "number" && Number.isNaN(value)) return value;
|
|
423
|
-
return `${Number(value)}%`;
|
|
424
|
-
case "uppercase":
|
|
425
|
-
return (value || "").toString().toLocaleUpperCase();
|
|
426
|
-
case "lowercase":
|
|
427
|
-
return (value || "").toString().toLocaleLowerCase();
|
|
428
|
-
case "firstchar":
|
|
429
|
-
return (value || "").toString().split(/([.?!]+\s*|\n+)/g).map((part) => {
|
|
430
|
-
if (/^[.?!]+/.test(part) || /^\s*$/.test(part)) {
|
|
431
|
-
return part;
|
|
432
|
-
}
|
|
433
|
-
return part.toLocaleLowerCase().replace(
|
|
434
|
-
/^(\s*)(\S)/,
|
|
435
|
-
(_, spaces, firstChar) => spaces + firstChar.toLocaleUpperCase()
|
|
436
|
-
);
|
|
437
|
-
}).join("");
|
|
438
|
-
case "camel":
|
|
439
|
-
return (value || "").toString().split(" ").map((word) => {
|
|
440
|
-
return word.charAt(0).toLocaleUpperCase() + (word || "").slice(1).toLocaleLowerCase();
|
|
441
|
-
}).join(" ");
|
|
442
|
-
default:
|
|
443
|
-
return value;
|
|
444
|
-
}
|
|
445
|
-
};
|
|
446
|
-
}
|
|
447
|
-
async function initSlotI18n() {
|
|
448
|
-
if (i18next.isInitialized) {
|
|
449
|
-
return;
|
|
450
|
-
}
|
|
451
|
-
if (initPromise) {
|
|
452
|
-
return initPromise;
|
|
453
|
-
}
|
|
454
|
-
initPromise = (async () => {
|
|
455
|
-
const requestedLng = resolveLanguageFromUrl();
|
|
456
|
-
await i18next.use(Backend).use(LanguageDetector).use({
|
|
457
|
-
type: "postProcessor",
|
|
458
|
-
name: "trimProcessor",
|
|
459
|
-
process(value) {
|
|
460
|
-
if (typeof value === "string") {
|
|
461
|
-
return value.trim();
|
|
462
|
-
}
|
|
463
|
-
return value;
|
|
464
|
-
}
|
|
465
|
-
}).init({
|
|
466
|
-
lng: requestedLng,
|
|
467
|
-
preload: [DEFAULT_LANGUAGE],
|
|
468
|
-
fallbackLng: [DEFAULT_LANGUAGE],
|
|
469
|
-
load: "currentOnly",
|
|
470
|
-
debug: false,
|
|
471
|
-
detection: {
|
|
472
|
-
order: ["querystring", "localStorage", "cookie", "navigator"],
|
|
473
|
-
lookupQuerystring: "lng",
|
|
474
|
-
caches: ["localStorage", "cookie"]
|
|
475
|
-
},
|
|
476
|
-
backend: {
|
|
477
|
-
loadPath: resolvePublicPath("locales/{{lng}}.json"),
|
|
478
|
-
queryStringParams: { v: "1.0.0" }
|
|
479
|
-
},
|
|
480
|
-
interpolation: {
|
|
481
|
-
escapeValue: false,
|
|
482
|
-
format: createInterpolationFormat()
|
|
483
|
-
},
|
|
484
|
-
postProcess: ["trimProcessor"]
|
|
485
|
-
});
|
|
486
|
-
i18next.on("languageChanged", (lng) => {
|
|
487
|
-
const normalized = normalizeLanguageCode(lng);
|
|
488
|
-
for (const listener of languageChangedListeners) {
|
|
489
|
-
listener(normalized);
|
|
490
|
-
}
|
|
491
|
-
});
|
|
492
|
-
getLogger("SharedI18n").info("i18n initialized", { language: getCurrentLanguage() });
|
|
493
|
-
})();
|
|
494
|
-
try {
|
|
495
|
-
await initPromise;
|
|
496
|
-
} catch (error) {
|
|
497
|
-
initPromise = null;
|
|
498
|
-
getLogger("SharedI18n").error("Failed to initialize i18n", error);
|
|
499
|
-
throw error;
|
|
500
|
-
}
|
|
501
|
-
}
|
|
502
|
-
function t(key, options) {
|
|
503
|
-
return i18next.t(key, options);
|
|
504
|
-
}
|
|
505
|
-
async function changeLanguage(lng) {
|
|
506
|
-
const normalized = normalizeLanguageCode(lng);
|
|
507
|
-
await i18next.changeLanguage(normalized);
|
|
508
|
-
}
|
|
509
|
-
function getCurrentLanguage() {
|
|
510
|
-
return normalizeLanguageCode(i18next.language);
|
|
511
|
-
}
|
|
512
|
-
function isI18nReady() {
|
|
513
|
-
return i18next.isInitialized;
|
|
514
|
-
}
|
|
515
|
-
function onLanguageChanged(listener) {
|
|
516
|
-
languageChangedListeners.add(listener);
|
|
517
|
-
return () => {
|
|
518
|
-
languageChangedListeners.delete(listener);
|
|
519
|
-
};
|
|
520
|
-
}
|
|
521
|
-
function getI18nInstance() {
|
|
522
|
-
return i18next;
|
|
523
|
-
}
|
|
524
|
-
|
|
525
|
-
export { changeLanguage, getCurrentLanguage, getI18nInstance, initSlotI18n, isI18nReady, onLanguageChanged, resolveLanguageFromUrl, t };
|
|
1
|
+
export { changeLanguage, getCurrentLanguage, getI18nInstance, initSlotI18n, isI18nReady, onLanguageChanged, resolveLanguageFromUrl, t } from '../chunk-RAEOBW6E.js';
|
|
2
|
+
import '../chunk-NQMORMNP.js';
|
|
3
|
+
import '../chunk-DOHQE2YZ.js';
|
|
4
|
+
import '../chunk-G3PMV62Z.js';
|
|
526
5
|
//# sourceMappingURL=index.js.map
|
|
527
6
|
//# sourceMappingURL=index.js.map
|
package/dist/i18n/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../helpers/resolvePublicPath.ts","../../utils/Logger.ts","../../i18n/sharedI18n.ts"],"names":["logger"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Resolves a runtime public asset path against Vite's deploy base URL.\n * Use for assets loaded after build (Pixi, i18n, fonts, SVGs, etc.).\n */\nexport function resolvePublicPath(path: string): string {\n if (path.startsWith('http://') || path.startsWith('https://')) {\n return path;\n }\n\n const base =\n typeof import.meta !== 'undefined' && import.meta.env?.BASE_URL\n ? import.meta.env.BASE_URL\n : '/';\n\n const normalizedBase = base.endsWith('/') ? base : `${base}/`;\n const normalizedPath = path.startsWith('/') ? path.slice(1) : path;\n\n return `${normalizedBase}${normalizedPath}`;\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n/**\n * Log levels for filtering log output.\n *\n * Lower numeric values have higher priority.\n * Setting a log level will show that level and all higher priority levels.\n *\n * @example\n * ```typescript\n * // Set to INFO level\n * logger.setLevel(LogLevel.INFO);\n * // Will show: ERROR, WARN, INFO\n * // Will hide: DEBUG, TRACE\n * ```\n *\n * @public\n */\nexport enum LogLevel {\n /** Critical errors (always shown) */\n ERROR = 0,\n /** Warnings (shown at WARN level and above) */\n WARN = 1,\n /** Informational messages (shown at INFO level and above) */\n INFO = 2,\n /** Debug messages (shown at DEBUG level and above) */\n DEBUG = 3,\n /** Trace messages (most verbose, shown only at TRACE level) */\n TRACE = 4,\n}\n\nexport type LoggerFilterMatcher = string | RegExp;\n\nexport interface LoggerFilterConfig {\n contexts?: LoggerFilterMatcher[];\n messages?: LoggerFilterMatcher[];\n mode?: 'include' | 'exclude';\n}\n\n/**\n * Configuration options for the Logger.\n *\n * @public\n */\nexport interface LoggerConfig {\n /** Minimum log level to display */\n level: LogLevel;\n /** Whether logging is enabled */\n enabled: boolean;\n /** Whether to show timestamps in logs */\n showTimestamp: boolean;\n /** Whether to show colors in logs */\n showColors: boolean;\n filter?: LoggerFilterConfig;\n}\n\n/**\n * Singleton logger for centralized logging.\n *\n * Logger provides a unified logging system with:\n * - Multiple log levels (ERROR, WARN, INFO, DEBUG, TRACE)\n * - Colored output (browser and terminal)\n * - Timestamps\n * - Context-based sub-loggers\n * - Environment detection (browser vs Node.js)\n *\n * ## Features\n *\n * - **Singleton Pattern**: Single instance across the application\n * - **Log Levels**: Filter logs by severity\n * - **Colored Output**: CSS colors in browser, ANSI colors in terminal\n * - **Context Loggers**: Create sub-loggers with context prefixes\n * - **Timestamps**: Optional ISO timestamp display\n * - **Environment Aware**: Automatically detects browser vs Node.js\n *\n * ## Log Levels\n *\n * - **ERROR** (0): Critical errors\n * - **WARN** (1): Warnings\n * - **INFO** (2): Informational messages (default)\n * - **DEBUG** (3): Debug information\n * - **TRACE** (4): Detailed trace information\n *\n * @example\n * Basic usage:\n * ```typescript\n * import { logger, LogLevel } from '@rb-games/core/utils';\n *\n * // Configure logger\n * logger.configure({\n * level: LogLevel.DEBUG,\n * showTimestamp: true,\n * showColors: true\n * });\n *\n * // Log messages\n * logger.error('Critical error occurred');\n * logger.warn('This is a warning');\n * logger.info('Application started');\n * logger.debug('Debug information', { data: 'value' });\n * logger.trace('Detailed trace');\n * ```\n *\n * @example\n * Context loggers (used in plugins):\n * ```typescript\n * class MyPlugin {\n * private logger = logger.createContextLogger('MyPlugin');\n *\n * initialize() {\n * this.logger.info('Plugin initialized');\n * // Output: [2024-01-01T12:00:00.000Z] [INFO] [MyPlugin] Plugin initialized\n * }\n *\n * doSomething() {\n * this.logger.debug('Doing something', { value: 42 });\n * // Output: [2024-01-01T12:00:00.000Z] [DEBUG] [MyPlugin] Doing something { value: 42 }\n * }\n * }\n * ```\n *\n * @example\n * Production configuration:\n * ```typescript\n * // In production, only show errors and warnings\n * if (process.env.NODE_ENV === 'production') {\n * logger.setLevel(LogLevel.WARN);\n * } else {\n * logger.setLevel(LogLevel.DEBUG);\n * }\n * ```\n *\n * @example\n * Disable logging:\n * ```typescript\n * logger.setEnabled(false);\n * ```\n *\n * @category Utils\n * @public\n */\nexport class Logger {\n private static instance: Logger;\n private config: LoggerConfig;\n\n // Terminal colors (for Node.js environment)\n private readonly terminalColors = {\n reset: '\\x1b[0m',\n red: '\\x1b[31m',\n yellow: '\\x1b[33m',\n blue: '\\x1b[34m',\n green: '\\x1b[32m',\n gray: '\\x1b[90m',\n cyan: '\\x1b[36m',\n magenta: '\\x1b[35m',\n white: '\\x1b[37m',\n };\n\n // Browser console colors (using CSS)\n private readonly browserColors = {\n timestamp: 'color: gray',\n context: 'color: cyan; font-weight: bold',\n message: 'color: white',\n error: 'color: red; font-weight: bold',\n warn: 'color: orange; font-weight: bold',\n info: 'color: dodgerblue; font-weight: bold',\n debug: 'color: green',\n trace: 'color: gray',\n };\n\n private readonly levelLabels = {\n [LogLevel.ERROR]: 'ERROR',\n [LogLevel.WARN]: 'WARN',\n [LogLevel.INFO]: 'INFO',\n [LogLevel.DEBUG]: 'DEBUG',\n [LogLevel.TRACE]: 'TRACE',\n };\n\n private readonly levelColors = {\n [LogLevel.ERROR]: this.terminalColors.red,\n [LogLevel.WARN]: this.terminalColors.yellow,\n [LogLevel.INFO]: this.terminalColors.blue,\n [LogLevel.DEBUG]: this.terminalColors.green,\n [LogLevel.TRACE]: this.terminalColors.gray,\n };\n\n private readonly levelBrowserColors = {\n [LogLevel.ERROR]: this.browserColors.error,\n [LogLevel.WARN]: this.browserColors.warn,\n [LogLevel.INFO]: this.browserColors.info,\n [LogLevel.DEBUG]: this.browserColors.debug,\n [LogLevel.TRACE]: this.browserColors.trace,\n };\n\n /**\n * Private constructor for singleton pattern\n */\n private constructor() {\n // Default configuration\n this.config = {\n level: LogLevel.DEBUG, // Default log level\n enabled: true, // Logging enabled by default\n showTimestamp: false, // Show timestamps by default\n showColors: true, // Show colors by default\n };\n\n if ((import.meta as { env?: { DEV?: boolean } }).env?.DEV) {\n console.warn(\n '[Logger] For better debugging experience, add Logger.ts to DevTools ignore list:\\n' +\n 'DevTools → Settings (F1) → Ignore List → Add pattern: /Logger\\\\.ts$',\n );\n }\n }\n\n /**\n * Get the singleton instance of the Logger\n */\n public static getInstance(): Logger {\n if (!Logger.instance) {\n Logger.instance = new Logger();\n }\n return Logger.instance;\n }\n\n /**\n * Configure the logger\n * @param config Configuration options\n */\n public configure(config: Partial<LoggerConfig>): void {\n this.config = { ...this.config, ...config };\n }\n\n /**\n * Enable or disable logging\n * @param enabled Whether logging is enabled\n */\n public setEnabled(enabled: boolean): void {\n this.config.enabled = enabled;\n }\n\n /**\n * Set the log level\n * @param level The log level to set\n */\n public setLevel(level: LogLevel): void {\n this.config.level = level;\n }\n\n /**\n * Get the current log level\n */\n public getLevel(): LogLevel {\n return this.config.level;\n }\n\n /**\n * Log an error message\n * @param message The message to log\n * @param args Additional arguments to log\n */\n public error(message: string, ...args: any[]): void {\n this.log(LogLevel.ERROR, message, ...args);\n }\n\n /**\n * Log a warning message\n * @param message The message to log\n * @param args Additional arguments to log\n */\n public warn(message: string, ...args: any[]): void {\n this.log(LogLevel.WARN, message, ...args);\n }\n\n /**\n * Log an info message\n * @param message The message to log\n * @param args Additional arguments to log\n */\n public info(message: string, ...args: any[]): void {\n this.log(LogLevel.INFO, message, ...args);\n }\n\n /**\n * Log a debug message\n * @param message The message to log\n * @param args Additional arguments to log\n */\n public debug(message: string, ...args: any[]): void {\n this.log(LogLevel.DEBUG, message, ...args);\n }\n\n /**\n * Log a trace message\n * @param message The message to log\n * @param args Additional arguments to log\n */\n public trace(message: string, ...args: any[]): void {\n this.log(LogLevel.TRACE, message, ...args);\n }\n\n /**\n * Log a message with a specific log level\n * @param level The log level\n * @param message The message to log\n * @param args Additional arguments to log\n */\n private log(level: LogLevel, message: string, ...args: any[]): void {\n // Only log if enabled and the log level is sufficient\n if (!this.config.enabled || level > this.config.level) {\n return;\n }\n\n if (!this.shouldLogMessage(message)) {\n return;\n }\n\n // Check if we're in a browser environment\n const isBrowser = typeof window !== 'undefined';\n\n if (isBrowser && this.config.showColors) {\n this.logBrowser(level, message, ...args);\n } else {\n this.logTerminal(level, message, ...args);\n }\n }\n\n private extractContext(message: string): { context: string; messageContent: string } {\n const contextMatch = message.match(/^\\[([^\\]]+)\\]\\s(.*)$/);\n\n if (!contextMatch) {\n return {\n context: '',\n messageContent: message,\n };\n }\n\n return {\n context: contextMatch[1],\n messageContent: contextMatch[2],\n };\n }\n\n private matchesFilter(value: string, matchers?: LoggerFilterMatcher[]): boolean {\n if (!matchers?.length) {\n return false;\n }\n\n return matchers.some((matcher) => {\n if (typeof matcher === 'string') {\n return value.includes(matcher);\n }\n\n matcher.lastIndex = 0;\n return matcher.test(value);\n });\n }\n\n private shouldLogMessage(message: string): boolean {\n const filter = this.config.filter;\n\n if (!filter) {\n return true;\n }\n\n const hasFilters = Boolean(filter.contexts?.length || filter.messages?.length);\n\n if (!hasFilters) {\n return true;\n }\n\n const { context, messageContent } = this.extractContext(message);\n const contextMatches = this.matchesFilter(context, filter.contexts);\n const messageMatches = this.matchesFilter(messageContent, filter.messages);\n const matches = contextMatches || messageMatches;\n\n return filter.mode === 'exclude' ? !matches : matches;\n }\n\n /**\n * Log a message in terminal/node environment\n */\n private logTerminal(level: LogLevel, message: string, ...args: any[]): void {\n // Prepare log prefix\n let timestamp = '';\n let levelStr = '';\n let contextPart = '';\n\n // Extract context if present\n const contextMatch = message.match(/^\\[([^\\]]+)\\]\\s(.*)$/);\n let messageContent = message;\n\n if (contextMatch) {\n contextPart = `[${contextMatch[1]}] `;\n messageContent = contextMatch[2];\n }\n\n // Add timestamp if enabled\n if (this.config.showTimestamp) {\n const now = new Date().toISOString();\n timestamp = `[${now}] `;\n }\n\n // Add log level\n levelStr = `[${this.levelLabels[level]}] `;\n\n // Format with colors if enabled\n if (this.config.showColors) {\n const levelColor = this.levelColors[level];\n const contextColor = this.terminalColors.cyan;\n const timestampColor = this.terminalColors.gray;\n const messageColor = this.terminalColors.white;\n\n timestamp = `${timestampColor}${timestamp}${this.terminalColors.reset}`;\n levelStr = `${levelColor}${levelStr}${this.terminalColors.reset}`;\n\n if (contextPart) {\n contextPart = `${contextColor}${contextPart}${this.terminalColors.reset}`;\n }\n\n messageContent = `${messageColor}${messageContent}${this.terminalColors.reset}`;\n }\n\n const formattedMessage = timestamp + levelStr + contextPart + messageContent;\n\n // Log with console methods based on level\n switch (level) {\n case LogLevel.ERROR:\n console.error(formattedMessage, ...args);\n break;\n case LogLevel.WARN:\n console.warn(formattedMessage, ...args);\n break;\n case LogLevel.INFO:\n console.info(formattedMessage, ...args);\n break;\n case LogLevel.DEBUG:\n case LogLevel.TRACE:\n default:\n console.log(formattedMessage, ...args);\n break;\n }\n }\n\n /**\n * Log a message in browser environment with CSS styling\n */\n private logBrowser(level: LogLevel, message: string, ...args: any[]): void {\n // Extract context if present\n const contextMatch = message.match(/^\\[([^\\]]+)\\]\\s(.*)$/);\n let context = '';\n let messageContent = message;\n\n if (contextMatch) {\n context = contextMatch[1];\n messageContent = contextMatch[2];\n }\n\n // Create CSS styled format string\n let format = '';\n const formatArgs: string[] = [];\n\n // Add timestamp if enabled\n if (this.config.showTimestamp) {\n const now = new Date().toISOString();\n format += '%c[' + now + '] ';\n formatArgs.push(this.browserColors.timestamp);\n }\n\n // Add log level with style\n format += '%c[' + this.levelLabels[level] + '] ';\n formatArgs.push(this.levelBrowserColors[level]);\n\n // Add context if present\n if (context) {\n format += '%c[' + context + '] ';\n formatArgs.push(this.browserColors.context);\n }\n\n // Add the actual message\n format += '%c' + messageContent;\n formatArgs.push(this.browserColors.message);\n\n // Log with console methods based on level\n switch (level) {\n case LogLevel.ERROR:\n console.error(format, ...formatArgs, ...args);\n break;\n case LogLevel.WARN:\n console.warn(format, ...formatArgs, ...args);\n break;\n case LogLevel.INFO:\n console.info(format, ...formatArgs, ...args);\n break;\n case LogLevel.DEBUG:\n case LogLevel.TRACE:\n default:\n console.log(format, ...formatArgs, ...args);\n break;\n }\n }\n\n /**\n * Creates a context-specific logger.\n *\n * Context loggers automatically prefix all log messages with a context tag.\n * Commonly used in plugins and classes to identify log sources.\n *\n * @param context - Context name (e.g., 'MyPlugin', 'SceneManager')\n * @returns ContextLogger instance\n *\n * @example\n * ```typescript\n * class DisplayPlugin {\n * private logger = logger.createContextLogger('DisplayPlugin');\n *\n * initialize() {\n * this.logger.info('Initializing display');\n * // Output: [INFO] [DisplayPlugin] Initializing display\n * }\n * }\n * ```\n */\n public createContextLogger(context: string): ContextLogger {\n return new ContextLogger(this, context);\n }\n}\n\n/**\n * Context-specific logger that prefixes all messages.\n *\n * ContextLogger wraps the main Logger and automatically adds a context prefix\n * to all log messages. This makes it easy to identify which component or plugin\n * generated a log message.\n *\n * ## Usage\n *\n * Create context loggers using `logger.createContextLogger(context)`.\n * All log methods (error, warn, info, debug, trace) are available.\n *\n * @example\n * ```typescript\n * class ResourcePlugin {\n * private logger = logger.createContextLogger('ResourcePlugin');\n *\n * async loadAssets() {\n * this.logger.info('Loading assets...');\n * // Output: [INFO] [ResourcePlugin] Loading assets...\n *\n * try {\n * await this.load();\n * this.logger.info('Assets loaded successfully');\n * } catch (error) {\n * this.logger.error('Failed to load assets', error);\n * }\n * }\n * }\n * ```\n *\n * @category Utils\n * @public\n */\nexport class ContextLogger {\n private logger: Logger;\n private context: string;\n\n constructor(logger: Logger, context: string) {\n this.logger = logger;\n this.context = context;\n }\n\n /**\n * Log an error message\n * @param message The message to log\n * @param args Additional arguments to log\n */\n public error(message: string, ...args: any[]): void {\n this.logger.error(`[${this.context}] ${message}`, ...args);\n }\n\n /**\n * Log a warning message\n * @param message The message to log\n * @param args Additional arguments to log\n */\n public warn(message: string, ...args: any[]): void {\n this.logger.warn(`[${this.context}] ${message}`, ...args);\n }\n\n /**\n * Log an info message\n * @param message The message to log\n * @param args Additional arguments to log\n */\n public info(message: string, ...args: any[]): void {\n this.logger.info(`[${this.context}] ${message}`, ...args);\n }\n\n /**\n * Log a debug message\n * @param message The message to log\n * @param args Additional arguments to log\n */\n public debug(message: string, ...args: any[]): void {\n this.logger.debug(`[${this.context}] ${message}`, ...args);\n }\n\n /**\n * Log a trace message\n * @param message The message to log\n * @param args Additional arguments to log\n */\n public trace(message: string, ...args: any[]): void {\n this.logger.trace(`[${this.context}] ${message}`, ...args);\n }\n}\n\n// Export a default instance for convenience\nexport const logger = Logger.getInstance();\n\n// Cached context loggers for inline usage\nconst contextLoggers = new Map<string, ContextLogger>();\n\n/**\n * Get or create a cached context logger.\n * Same context string always returns the same instance.\n *\n * Preferred over class property pattern for easier tree-shaking\n * and production stripping.\n *\n * @param context - Context name (e.g., 'MyPlugin', 'SceneManager')\n * @returns Cached ContextLogger instance\n *\n * @example\n * ```typescript\n * import { getLogger } from '@rb-games/core/utils';\n *\n * // No class property needed - use inline\n * getLogger('MyClass').info('message');\n * getLogger('MyClass').debug('data', { x: 1 });\n * ```\n */\nexport function getLogger(context: string): ContextLogger {\n let cached = contextLoggers.get(context);\n if (!cached) {\n cached = new ContextLogger(logger, context);\n contextLoggers.set(context, cached);\n }\n return cached;\n}\n","import i18next from 'i18next';\nimport Backend from 'i18next-http-backend';\nimport LanguageDetector from 'i18next-browser-languagedetector';\nimport { resolvePublicPath } from '../helpers/resolvePublicPath';\nimport { getLogger } from '../utils/Logger';\n\nconst DEFAULT_LANGUAGE = 'en';\n\nlet initPromise: Promise<void> | null = null;\nconst languageChangedListeners = new Set<(lng: string) => void>();\n\nfunction normalizeLanguageCode(lng: string | null | undefined): string {\n if (!lng) return DEFAULT_LANGUAGE;\n return lng.trim().toLowerCase().split('-')[0] || DEFAULT_LANGUAGE;\n}\n\n/** Reads `?lng=TR` (case-insensitive) and returns ISO code e.g. `tr`. */\nexport function resolveLanguageFromUrl(search = window.location.search): string {\n const raw = new URLSearchParams(search).get('lng');\n return normalizeLanguageCode(raw);\n}\n\nfunction createInterpolationFormat() {\n return (value: unknown, format: string | undefined): unknown => {\n if (typeof value === 'string') {\n value = value.trim();\n }\n\n if (format === 'optional' && (value === null || value === undefined || value === '')) {\n return '';\n }\n\n switch (format) {\n case 'percentage':\n if (typeof value === 'number' && Number.isNaN(value)) return value;\n return `${Number(value)}%`;\n case 'uppercase':\n return (value || '').toString().toLocaleUpperCase();\n case 'lowercase':\n return (value || '').toString().toLocaleLowerCase();\n case 'firstchar':\n return (value || '')\n .toString()\n .split(/([.?!]+\\s*|\\n+)/g)\n .map((part: string) => {\n if (/^[.?!]+/.test(part) || /^\\s*$/.test(part)) {\n return part;\n }\n return part\n .toLocaleLowerCase()\n .replace(\n /^(\\s*)(\\S)/,\n (_, spaces, firstChar) => spaces + firstChar.toLocaleUpperCase(),\n );\n })\n .join('');\n case 'camel':\n return (value || '')\n .toString()\n .split(' ')\n .map((word: string) => {\n return word.charAt(0).toLocaleUpperCase() + (word || '').slice(1).toLocaleLowerCase();\n })\n .join(' ');\n default:\n return value;\n }\n };\n}\n\n/** One-time i18next init shared by Svelte shell and I18NextPlugin. */\nexport async function initSlotI18n(): Promise<void> {\n if (i18next.isInitialized) {\n return;\n }\n\n if (initPromise) {\n return initPromise;\n }\n\n initPromise = (async () => {\n const requestedLng = resolveLanguageFromUrl();\n\n await i18next\n .use(Backend)\n .use(LanguageDetector)\n .use({\n type: 'postProcessor',\n name: 'trimProcessor',\n process(value: unknown) {\n if (typeof value === 'string') {\n return value.trim();\n }\n return value;\n },\n })\n .init({\n lng: requestedLng,\n preload: [DEFAULT_LANGUAGE],\n fallbackLng: [DEFAULT_LANGUAGE],\n load: 'currentOnly',\n debug: false,\n detection: {\n order: ['querystring', 'localStorage', 'cookie', 'navigator'],\n lookupQuerystring: 'lng',\n caches: ['localStorage', 'cookie'],\n },\n backend: {\n loadPath: resolvePublicPath('locales/{{lng}}.json'),\n queryStringParams: { v: '1.0.0' },\n },\n interpolation: {\n escapeValue: false,\n format: createInterpolationFormat(),\n },\n postProcess: ['trimProcessor'],\n });\n\n i18next.on('languageChanged', (lng) => {\n const normalized = normalizeLanguageCode(lng);\n for (const listener of languageChangedListeners) {\n listener(normalized);\n }\n });\n\n getLogger('SharedI18n').info('i18n initialized', { language: getCurrentLanguage() });\n })();\n\n try {\n await initPromise;\n } catch (error) {\n initPromise = null;\n getLogger('SharedI18n').error('Failed to initialize i18n', error);\n throw error;\n }\n}\n\nexport function t(key: string, options?: Record<string, unknown>): string {\n return i18next.t(key, options) as string;\n}\n\nexport async function changeLanguage(lng: string): Promise<void> {\n const normalized = normalizeLanguageCode(lng);\n await i18next.changeLanguage(normalized);\n}\n\nexport function getCurrentLanguage(): string {\n return normalizeLanguageCode(i18next.language);\n}\n\nexport function isI18nReady(): boolean {\n return i18next.isInitialized;\n}\n\nexport function onLanguageChanged(listener: (lng: string) => void): () => void {\n languageChangedListeners.add(listener);\n return () => {\n languageChangedListeners.delete(listener);\n };\n}\n\nexport function getI18nInstance() {\n return i18next;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
|