@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.
Files changed (43) hide show
  1. package/dist/chunk-5BLUF2HG.js +25 -0
  2. package/dist/chunk-5BLUF2HG.js.map +1 -0
  3. package/dist/chunk-DOHQE2YZ.js +392 -0
  4. package/dist/chunk-DOHQE2YZ.js.map +1 -0
  5. package/dist/chunk-FOZO6TLY.js +673 -0
  6. package/dist/chunk-FOZO6TLY.js.map +1 -0
  7. package/dist/chunk-G3PMV62Z.js +33 -0
  8. package/dist/chunk-G3PMV62Z.js.map +1 -0
  9. package/dist/chunk-KOHCRCV3.js +490 -0
  10. package/dist/chunk-KOHCRCV3.js.map +1 -0
  11. package/dist/chunk-MI6BP7A6.js +11 -0
  12. package/dist/chunk-MI6BP7A6.js.map +1 -0
  13. package/dist/chunk-NQMORMNP.js +15 -0
  14. package/dist/chunk-NQMORMNP.js.map +1 -0
  15. package/dist/chunk-RAEOBW6E.js +133 -0
  16. package/dist/chunk-RAEOBW6E.js.map +1 -0
  17. package/dist/chunk-UE7T7Z45.js +884 -0
  18. package/dist/chunk-UE7T7Z45.js.map +1 -0
  19. package/dist/devtools/index.js +2 -882
  20. package/dist/devtools/index.js.map +1 -1
  21. package/dist/engine/index.js +6 -1267
  22. package/dist/engine/index.js.map +1 -1
  23. package/dist/filters/index.js +1 -1
  24. package/dist/helpers/index.js +6 -35
  25. package/dist/helpers/index.js.map +1 -1
  26. package/dist/i18n/index.js +4 -525
  27. package/dist/i18n/index.js.map +1 -1
  28. package/dist/layout/index.js +2 -671
  29. package/dist/layout/index.js.map +1 -1
  30. package/dist/particle/index.js +1 -6
  31. package/dist/particle/index.js.map +1 -1
  32. package/dist/plugins/Plugin.types.d.ts +4 -2
  33. package/dist/plugins/Plugin.types.d.ts.map +1 -1
  34. package/dist/plugins/index.js +6 -521
  35. package/dist/plugins/index.js.map +1 -1
  36. package/dist/state-machine/index.js +1 -1
  37. package/dist/store/index.js +1 -1
  38. package/dist/ui/index.js +5 -531
  39. package/dist/ui/index.js.map +1 -1
  40. package/dist/utils/index.js +4 -897
  41. package/dist/utils/index.js.map +1 -1
  42. package/dist/vite/index.js +1 -1
  43. package/package.json +1 -1
@@ -1,7 +1,9 @@
1
1
  import type { PixiEngine } from '../engine/PixiEngine';
2
2
  /**
3
- * Internal symbols for engine-only hook access
4
- * These symbols prevent external code from calling lifecycle hooks
3
+ * Internal symbols for engine-only hook access.
4
+ * Use Symbol.for so every published tsup entry (engine, plugins, …) shares
5
+ * the same hook keys. Plain Symbol() is unique per bundle and silently
6
+ * drops resize/pause/ready callbacks in npm consumers.
5
7
  */
6
8
  export declare const ENGINE_HOOKS: {
7
9
  readonly onEngineReady: symbol;
@@ -1 +1 @@
1
- {"version":3,"file":"Plugin.types.d.ts","sourceRoot":"","sources":["../../plugins/Plugin.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEvD;;;GAGG;AACH,eAAO,MAAM,YAAY;;;;;CAKf,CAAC;AAEX;;GAEG;AACH,oBAAY,WAAW;IACrB,UAAU,eAAe;IACzB,YAAY,iBAAiB;IAC7B,WAAW,gBAAgB;IAC3B,KAAK,UAAU;IACf,KAAK,UAAU;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,KAAK,CAAC,EAAE,WAAW,CAAC;IAEpB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IAExB;;;;OAIG;IACH,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAErD;;;;;OAKG;IACH,OAAO,CAAC,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAEnD;;OAEG;IACH,OAAO,CAAC,IAAI,IAAI,CAAC;IAEjB;;;;OAIG;IACH,QAAQ,CAAC,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IAElC;;;OAGG;IACH,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB"}
1
+ {"version":3,"file":"Plugin.types.d.ts","sourceRoot":"","sources":["../../plugins/Plugin.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEvD;;;;;GAKG;AACH,eAAO,MAAM,YAAY;;;;;CAKf,CAAC;AAEX;;GAEG;AACH,oBAAY,WAAW;IACrB,UAAU,eAAe;IACzB,YAAY,iBAAiB;IAC7B,WAAW,gBAAgB;IAC3B,KAAK,UAAU;IACf,KAAK,UAAU;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,KAAK,CAAC,EAAE,WAAW,CAAC;IAEpB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IAExB;;;;OAIG;IACH,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAErD;;;;;OAKG;IACH,OAAO,CAAC,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAEnD;;OAEG;IACH,OAAO,CAAC,IAAI,IAAI,CAAC;IAEjB;;;;OAIG;IACH,QAAQ,CAAC,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IAElC;;;OAGG;IACH,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB"}
@@ -1,393 +1,15 @@
1
- import { detectWebp, isMobile, Assets, EventEmitter, Container, VERSION } from 'pixi.js';
1
+ import { initSlotI18n, t, changeLanguage, getCurrentLanguage, isI18nReady, getI18nInstance } from '../chunk-RAEOBW6E.js';
2
+ import { ENGINE_HOOKS } from '../chunk-MI6BP7A6.js';
3
+ import { resolvePublicPath } from '../chunk-NQMORMNP.js';
4
+ import { getLogger } from '../chunk-DOHQE2YZ.js';
5
+ import '../chunk-G3PMV62Z.js';
6
+ import { EventEmitter, detectWebp, isMobile, Assets, Container, VERSION } from 'pixi.js';
2
7
  import '@esotericsoftware/spine-pixi-v8';
3
8
  import gsap2, { gsap } from 'gsap';
4
- import i18next from 'i18next';
5
- import Backend from 'i18next-http-backend';
6
- import LanguageDetector from 'i18next-browser-languagedetector';
7
9
  import * as Sentry from '@sentry/browser';
8
10
  import { merge } from 'lodash';
9
11
  import { sound } from '@pixi/sound';
10
12
 
11
- // utils/Logger.ts
12
- var Logger = class _Logger {
13
- static instance;
14
- config;
15
- // Terminal colors (for Node.js environment)
16
- terminalColors = {
17
- reset: "\x1B[0m",
18
- red: "\x1B[31m",
19
- yellow: "\x1B[33m",
20
- blue: "\x1B[34m",
21
- green: "\x1B[32m",
22
- gray: "\x1B[90m",
23
- cyan: "\x1B[36m",
24
- magenta: "\x1B[35m",
25
- white: "\x1B[37m"
26
- };
27
- // Browser console colors (using CSS)
28
- browserColors = {
29
- timestamp: "color: gray",
30
- context: "color: cyan; font-weight: bold",
31
- message: "color: white",
32
- error: "color: red; font-weight: bold",
33
- warn: "color: orange; font-weight: bold",
34
- info: "color: dodgerblue; font-weight: bold",
35
- debug: "color: green",
36
- trace: "color: gray"
37
- };
38
- levelLabels = {
39
- [0 /* ERROR */]: "ERROR",
40
- [1 /* WARN */]: "WARN",
41
- [2 /* INFO */]: "INFO",
42
- [3 /* DEBUG */]: "DEBUG",
43
- [4 /* TRACE */]: "TRACE"
44
- };
45
- levelColors = {
46
- [0 /* ERROR */]: this.terminalColors.red,
47
- [1 /* WARN */]: this.terminalColors.yellow,
48
- [2 /* INFO */]: this.terminalColors.blue,
49
- [3 /* DEBUG */]: this.terminalColors.green,
50
- [4 /* TRACE */]: this.terminalColors.gray
51
- };
52
- levelBrowserColors = {
53
- [0 /* ERROR */]: this.browserColors.error,
54
- [1 /* WARN */]: this.browserColors.warn,
55
- [2 /* INFO */]: this.browserColors.info,
56
- [3 /* DEBUG */]: this.browserColors.debug,
57
- [4 /* TRACE */]: this.browserColors.trace
58
- };
59
- /**
60
- * Private constructor for singleton pattern
61
- */
62
- constructor() {
63
- var _a;
64
- this.config = {
65
- level: 3 /* DEBUG */,
66
- // Default log level
67
- enabled: true,
68
- // Logging enabled by default
69
- showTimestamp: false,
70
- // Show timestamps by default
71
- showColors: true
72
- // Show colors by default
73
- };
74
- if ((_a = import.meta.env) == null ? void 0 : _a.DEV) {
75
- console.warn(
76
- "[Logger] For better debugging experience, add Logger.ts to DevTools ignore list:\nDevTools \u2192 Settings (F1) \u2192 Ignore List \u2192 Add pattern: /Logger\\.ts$"
77
- );
78
- }
79
- }
80
- /**
81
- * Get the singleton instance of the Logger
82
- */
83
- static getInstance() {
84
- if (!_Logger.instance) {
85
- _Logger.instance = new _Logger();
86
- }
87
- return _Logger.instance;
88
- }
89
- /**
90
- * Configure the logger
91
- * @param config Configuration options
92
- */
93
- configure(config) {
94
- this.config = { ...this.config, ...config };
95
- }
96
- /**
97
- * Enable or disable logging
98
- * @param enabled Whether logging is enabled
99
- */
100
- setEnabled(enabled) {
101
- this.config.enabled = enabled;
102
- }
103
- /**
104
- * Set the log level
105
- * @param level The log level to set
106
- */
107
- setLevel(level) {
108
- this.config.level = level;
109
- }
110
- /**
111
- * Get the current log level
112
- */
113
- getLevel() {
114
- return this.config.level;
115
- }
116
- /**
117
- * Log an error message
118
- * @param message The message to log
119
- * @param args Additional arguments to log
120
- */
121
- error(message, ...args) {
122
- this.log(0 /* ERROR */, message, ...args);
123
- }
124
- /**
125
- * Log a warning message
126
- * @param message The message to log
127
- * @param args Additional arguments to log
128
- */
129
- warn(message, ...args) {
130
- this.log(1 /* WARN */, message, ...args);
131
- }
132
- /**
133
- * Log an info message
134
- * @param message The message to log
135
- * @param args Additional arguments to log
136
- */
137
- info(message, ...args) {
138
- this.log(2 /* INFO */, message, ...args);
139
- }
140
- /**
141
- * Log a debug message
142
- * @param message The message to log
143
- * @param args Additional arguments to log
144
- */
145
- debug(message, ...args) {
146
- this.log(3 /* DEBUG */, message, ...args);
147
- }
148
- /**
149
- * Log a trace message
150
- * @param message The message to log
151
- * @param args Additional arguments to log
152
- */
153
- trace(message, ...args) {
154
- this.log(4 /* TRACE */, message, ...args);
155
- }
156
- /**
157
- * Log a message with a specific log level
158
- * @param level The log level
159
- * @param message The message to log
160
- * @param args Additional arguments to log
161
- */
162
- log(level, message, ...args) {
163
- if (!this.config.enabled || level > this.config.level) {
164
- return;
165
- }
166
- if (!this.shouldLogMessage(message)) {
167
- return;
168
- }
169
- const isBrowser = typeof window !== "undefined";
170
- if (isBrowser && this.config.showColors) {
171
- this.logBrowser(level, message, ...args);
172
- } else {
173
- this.logTerminal(level, message, ...args);
174
- }
175
- }
176
- extractContext(message) {
177
- const contextMatch = message.match(/^\[([^\]]+)\]\s(.*)$/);
178
- if (!contextMatch) {
179
- return {
180
- context: "",
181
- messageContent: message
182
- };
183
- }
184
- return {
185
- context: contextMatch[1],
186
- messageContent: contextMatch[2]
187
- };
188
- }
189
- matchesFilter(value, matchers) {
190
- if (!(matchers == null ? void 0 : matchers.length)) {
191
- return false;
192
- }
193
- return matchers.some((matcher) => {
194
- if (typeof matcher === "string") {
195
- return value.includes(matcher);
196
- }
197
- matcher.lastIndex = 0;
198
- return matcher.test(value);
199
- });
200
- }
201
- shouldLogMessage(message) {
202
- var _a, _b;
203
- const filter = this.config.filter;
204
- if (!filter) {
205
- return true;
206
- }
207
- const hasFilters = Boolean(((_a = filter.contexts) == null ? void 0 : _a.length) || ((_b = filter.messages) == null ? void 0 : _b.length));
208
- if (!hasFilters) {
209
- return true;
210
- }
211
- const { context, messageContent } = this.extractContext(message);
212
- const contextMatches = this.matchesFilter(context, filter.contexts);
213
- const messageMatches = this.matchesFilter(messageContent, filter.messages);
214
- const matches = contextMatches || messageMatches;
215
- return filter.mode === "exclude" ? !matches : matches;
216
- }
217
- /**
218
- * Log a message in terminal/node environment
219
- */
220
- logTerminal(level, message, ...args) {
221
- let timestamp = "";
222
- let levelStr = "";
223
- let contextPart = "";
224
- const contextMatch = message.match(/^\[([^\]]+)\]\s(.*)$/);
225
- let messageContent = message;
226
- if (contextMatch) {
227
- contextPart = `[${contextMatch[1]}] `;
228
- messageContent = contextMatch[2];
229
- }
230
- if (this.config.showTimestamp) {
231
- const now = (/* @__PURE__ */ new Date()).toISOString();
232
- timestamp = `[${now}] `;
233
- }
234
- levelStr = `[${this.levelLabels[level]}] `;
235
- if (this.config.showColors) {
236
- const levelColor = this.levelColors[level];
237
- const contextColor = this.terminalColors.cyan;
238
- const timestampColor = this.terminalColors.gray;
239
- const messageColor = this.terminalColors.white;
240
- timestamp = `${timestampColor}${timestamp}${this.terminalColors.reset}`;
241
- levelStr = `${levelColor}${levelStr}${this.terminalColors.reset}`;
242
- if (contextPart) {
243
- contextPart = `${contextColor}${contextPart}${this.terminalColors.reset}`;
244
- }
245
- messageContent = `${messageColor}${messageContent}${this.terminalColors.reset}`;
246
- }
247
- const formattedMessage = timestamp + levelStr + contextPart + messageContent;
248
- switch (level) {
249
- case 0 /* ERROR */:
250
- console.error(formattedMessage, ...args);
251
- break;
252
- case 1 /* WARN */:
253
- console.warn(formattedMessage, ...args);
254
- break;
255
- case 2 /* INFO */:
256
- console.info(formattedMessage, ...args);
257
- break;
258
- case 3 /* DEBUG */:
259
- case 4 /* TRACE */:
260
- default:
261
- console.log(formattedMessage, ...args);
262
- break;
263
- }
264
- }
265
- /**
266
- * Log a message in browser environment with CSS styling
267
- */
268
- logBrowser(level, message, ...args) {
269
- const contextMatch = message.match(/^\[([^\]]+)\]\s(.*)$/);
270
- let context = "";
271
- let messageContent = message;
272
- if (contextMatch) {
273
- context = contextMatch[1];
274
- messageContent = contextMatch[2];
275
- }
276
- let format = "";
277
- const formatArgs = [];
278
- if (this.config.showTimestamp) {
279
- const now = (/* @__PURE__ */ new Date()).toISOString();
280
- format += "%c[" + now + "] ";
281
- formatArgs.push(this.browserColors.timestamp);
282
- }
283
- format += "%c[" + this.levelLabels[level] + "] ";
284
- formatArgs.push(this.levelBrowserColors[level]);
285
- if (context) {
286
- format += "%c[" + context + "] ";
287
- formatArgs.push(this.browserColors.context);
288
- }
289
- format += "%c" + messageContent;
290
- formatArgs.push(this.browserColors.message);
291
- switch (level) {
292
- case 0 /* ERROR */:
293
- console.error(format, ...formatArgs, ...args);
294
- break;
295
- case 1 /* WARN */:
296
- console.warn(format, ...formatArgs, ...args);
297
- break;
298
- case 2 /* INFO */:
299
- console.info(format, ...formatArgs, ...args);
300
- break;
301
- case 3 /* DEBUG */:
302
- case 4 /* TRACE */:
303
- default:
304
- console.log(format, ...formatArgs, ...args);
305
- break;
306
- }
307
- }
308
- /**
309
- * Creates a context-specific logger.
310
- *
311
- * Context loggers automatically prefix all log messages with a context tag.
312
- * Commonly used in plugins and classes to identify log sources.
313
- *
314
- * @param context - Context name (e.g., 'MyPlugin', 'SceneManager')
315
- * @returns ContextLogger instance
316
- *
317
- * @example
318
- * ```typescript
319
- * class DisplayPlugin {
320
- * private logger = logger.createContextLogger('DisplayPlugin');
321
- *
322
- * initialize() {
323
- * this.logger.info('Initializing display');
324
- * // Output: [INFO] [DisplayPlugin] Initializing display
325
- * }
326
- * }
327
- * ```
328
- */
329
- createContextLogger(context) {
330
- return new ContextLogger(this, context);
331
- }
332
- };
333
- var ContextLogger = class {
334
- logger;
335
- context;
336
- constructor(logger2, context) {
337
- this.logger = logger2;
338
- this.context = context;
339
- }
340
- /**
341
- * Log an error message
342
- * @param message The message to log
343
- * @param args Additional arguments to log
344
- */
345
- error(message, ...args) {
346
- this.logger.error(`[${this.context}] ${message}`, ...args);
347
- }
348
- /**
349
- * Log a warning message
350
- * @param message The message to log
351
- * @param args Additional arguments to log
352
- */
353
- warn(message, ...args) {
354
- this.logger.warn(`[${this.context}] ${message}`, ...args);
355
- }
356
- /**
357
- * Log an info message
358
- * @param message The message to log
359
- * @param args Additional arguments to log
360
- */
361
- info(message, ...args) {
362
- this.logger.info(`[${this.context}] ${message}`, ...args);
363
- }
364
- /**
365
- * Log a debug message
366
- * @param message The message to log
367
- * @param args Additional arguments to log
368
- */
369
- debug(message, ...args) {
370
- this.logger.debug(`[${this.context}] ${message}`, ...args);
371
- }
372
- /**
373
- * Log a trace message
374
- * @param message The message to log
375
- * @param args Additional arguments to log
376
- */
377
- trace(message, ...args) {
378
- this.logger.trace(`[${this.context}] ${message}`, ...args);
379
- }
380
- };
381
- var logger = Logger.getInstance();
382
- var contextLoggers = /* @__PURE__ */ new Map();
383
- function getLogger(context) {
384
- let cached = contextLoggers.get(context);
385
- if (!cached) {
386
- cached = new ContextLogger(logger, context);
387
- contextLoggers.set(context, cached);
388
- }
389
- return cached;
390
- }
391
13
  var DeviceOptimizerPlugin = class {
392
14
  name = "deviceOptimizerPlugin";
393
15
  priority = 10;
@@ -1036,18 +658,6 @@ var DeviceOptimizerPlugin = class {
1036
658
  getLogger("DeviceOptimizerPlugin").debug(`Forced performance tier: ${tier}`);
1037
659
  }
1038
660
  };
1039
-
1040
- // helpers/resolvePublicPath.ts
1041
- function resolvePublicPath(path) {
1042
- var _a;
1043
- if (path.startsWith("http://") || path.startsWith("https://")) {
1044
- return path;
1045
- }
1046
- const base = typeof import.meta !== "undefined" && ((_a = import.meta.env) == null ? void 0 : _a.BASE_URL) ? import.meta.env.BASE_URL : "/";
1047
- const normalizedBase = base.endsWith("/") ? base : `${base}/`;
1048
- const normalizedPath = path.startsWith("/") ? path.slice(1) : path;
1049
- return `${normalizedBase}${normalizedPath}`;
1050
- }
1051
661
  var ResourcePlugin = class {
1052
662
  name = "resourcePlugin";
1053
663
  priority = 50;
@@ -1430,14 +1040,6 @@ var ResourcePlugin = class {
1430
1040
  return this.config.bundles.filter((bundle) => !bundle.isLazy).length;
1431
1041
  }
1432
1042
  };
1433
-
1434
- // plugins/Plugin.types.ts
1435
- var ENGINE_HOOKS = {
1436
- onEngineReady: Symbol("onEngineReady"),
1437
- onPause: Symbol("onPause"),
1438
- onResume: Symbol("onResume"),
1439
- onResize: Symbol("onResize")
1440
- };
1441
1043
  var DisplayPlugin = class extends EventEmitter {
1442
1044
  name = "displayPlugin";
1443
1045
  priority = 900;
@@ -2592,123 +2194,6 @@ var InputPlugin = class extends EventEmitter {
2592
2194
  getLogger("InputPlugin").info("InputPlugin cleaned up");
2593
2195
  }
2594
2196
  };
2595
- var DEFAULT_LANGUAGE = "en";
2596
- var initPromise = null;
2597
- var languageChangedListeners = /* @__PURE__ */ new Set();
2598
- function normalizeLanguageCode(lng) {
2599
- if (!lng) return DEFAULT_LANGUAGE;
2600
- return lng.trim().toLowerCase().split("-")[0] || DEFAULT_LANGUAGE;
2601
- }
2602
- function resolveLanguageFromUrl(search = window.location.search) {
2603
- const raw = new URLSearchParams(search).get("lng");
2604
- return normalizeLanguageCode(raw);
2605
- }
2606
- function createInterpolationFormat() {
2607
- return (value, format) => {
2608
- if (typeof value === "string") {
2609
- value = value.trim();
2610
- }
2611
- if (format === "optional" && (value === null || value === void 0 || value === "")) {
2612
- return "";
2613
- }
2614
- switch (format) {
2615
- case "percentage":
2616
- if (typeof value === "number" && Number.isNaN(value)) return value;
2617
- return `${Number(value)}%`;
2618
- case "uppercase":
2619
- return (value || "").toString().toLocaleUpperCase();
2620
- case "lowercase":
2621
- return (value || "").toString().toLocaleLowerCase();
2622
- case "firstchar":
2623
- return (value || "").toString().split(/([.?!]+\s*|\n+)/g).map((part) => {
2624
- if (/^[.?!]+/.test(part) || /^\s*$/.test(part)) {
2625
- return part;
2626
- }
2627
- return part.toLocaleLowerCase().replace(
2628
- /^(\s*)(\S)/,
2629
- (_, spaces, firstChar) => spaces + firstChar.toLocaleUpperCase()
2630
- );
2631
- }).join("");
2632
- case "camel":
2633
- return (value || "").toString().split(" ").map((word) => {
2634
- return word.charAt(0).toLocaleUpperCase() + (word || "").slice(1).toLocaleLowerCase();
2635
- }).join(" ");
2636
- default:
2637
- return value;
2638
- }
2639
- };
2640
- }
2641
- async function initSlotI18n() {
2642
- if (i18next.isInitialized) {
2643
- return;
2644
- }
2645
- if (initPromise) {
2646
- return initPromise;
2647
- }
2648
- initPromise = (async () => {
2649
- const requestedLng = resolveLanguageFromUrl();
2650
- await i18next.use(Backend).use(LanguageDetector).use({
2651
- type: "postProcessor",
2652
- name: "trimProcessor",
2653
- process(value) {
2654
- if (typeof value === "string") {
2655
- return value.trim();
2656
- }
2657
- return value;
2658
- }
2659
- }).init({
2660
- lng: requestedLng,
2661
- preload: [DEFAULT_LANGUAGE],
2662
- fallbackLng: [DEFAULT_LANGUAGE],
2663
- load: "currentOnly",
2664
- debug: false,
2665
- detection: {
2666
- order: ["querystring", "localStorage", "cookie", "navigator"],
2667
- lookupQuerystring: "lng",
2668
- caches: ["localStorage", "cookie"]
2669
- },
2670
- backend: {
2671
- loadPath: resolvePublicPath("locales/{{lng}}.json"),
2672
- queryStringParams: { v: "1.0.0" }
2673
- },
2674
- interpolation: {
2675
- escapeValue: false,
2676
- format: createInterpolationFormat()
2677
- },
2678
- postProcess: ["trimProcessor"]
2679
- });
2680
- i18next.on("languageChanged", (lng) => {
2681
- const normalized = normalizeLanguageCode(lng);
2682
- for (const listener of languageChangedListeners) {
2683
- listener(normalized);
2684
- }
2685
- });
2686
- getLogger("SharedI18n").info("i18n initialized", { language: getCurrentLanguage() });
2687
- })();
2688
- try {
2689
- await initPromise;
2690
- } catch (error) {
2691
- initPromise = null;
2692
- getLogger("SharedI18n").error("Failed to initialize i18n", error);
2693
- throw error;
2694
- }
2695
- }
2696
- function t(key, options) {
2697
- return i18next.t(key, options);
2698
- }
2699
- async function changeLanguage(lng) {
2700
- const normalized = normalizeLanguageCode(lng);
2701
- await i18next.changeLanguage(normalized);
2702
- }
2703
- function getCurrentLanguage() {
2704
- return normalizeLanguageCode(i18next.language);
2705
- }
2706
- function isI18nReady() {
2707
- return i18next.isInitialized;
2708
- }
2709
- function getI18nInstance() {
2710
- return i18next;
2711
- }
2712
2197
 
2713
2198
  // plugins/language/I18NextPlugin.ts
2714
2199
  var I18NextPlugin = class {