inline-i18n-multi 0.3.0 → 0.4.0

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/index.js CHANGED
@@ -27,6 +27,21 @@ var NUMBER_STYLES = {
27
27
  percent: { style: "percent" },
28
28
  integer: { style: "decimal", maximumFractionDigits: 0 }
29
29
  };
30
+ var RELATIVE_TIME_STYLES = {
31
+ long: { style: "long", numeric: "auto" },
32
+ short: { style: "short", numeric: "auto" },
33
+ narrow: { style: "narrow", numeric: "auto" }
34
+ };
35
+ var LIST_TYPES = {
36
+ conjunction: "conjunction",
37
+ disjunction: "disjunction",
38
+ unit: "unit"
39
+ };
40
+ var LIST_STYLES = {
41
+ long: "long",
42
+ short: "short",
43
+ narrow: "narrow"
44
+ };
30
45
  function toDate(value) {
31
46
  if (value instanceof Date) {
32
47
  return value;
@@ -100,9 +115,98 @@ function formatTimeElement(el, vars, locale) {
100
115
  return `{${el.value}}`;
101
116
  }
102
117
  }
118
+ function getRelativeTimeUnit(date, now = /* @__PURE__ */ new Date()) {
119
+ const diffMs = date.getTime() - now.getTime();
120
+ const diffSeconds = Math.round(diffMs / 1e3);
121
+ const diffMinutes = Math.round(diffSeconds / 60);
122
+ const diffHours = Math.round(diffMinutes / 60);
123
+ const diffDays = Math.round(diffHours / 24);
124
+ const diffWeeks = Math.round(diffDays / 7);
125
+ const diffMonths = Math.round(diffDays / 30);
126
+ const diffYears = Math.round(diffDays / 365);
127
+ if (Math.abs(diffSeconds) < 60) return { value: diffSeconds, unit: "second" };
128
+ if (Math.abs(diffMinutes) < 60) return { value: diffMinutes, unit: "minute" };
129
+ if (Math.abs(diffHours) < 24) return { value: diffHours, unit: "hour" };
130
+ if (Math.abs(diffDays) < 7) return { value: diffDays, unit: "day" };
131
+ if (Math.abs(diffWeeks) < 4) return { value: diffWeeks, unit: "week" };
132
+ if (Math.abs(diffMonths) < 12) return { value: diffMonths, unit: "month" };
133
+ return { value: diffYears, unit: "year" };
134
+ }
135
+ var RELATIVE_TIME_PATTERN = /\{(\w+),\s*relativeTime(?:,\s*(\w+))?\}/g;
136
+ function preprocessRelativeTime(template) {
137
+ const replacements = /* @__PURE__ */ new Map();
138
+ let counter = 0;
139
+ const processed = template.replace(RELATIVE_TIME_PATTERN, (_, variable, style) => {
140
+ const placeholder = `__RELTIME_${counter++}__`;
141
+ replacements.set(placeholder, { variable, style });
142
+ return `{${placeholder}}`;
143
+ });
144
+ return { processed, replacements };
145
+ }
146
+ function formatRelativeTimeValue(variableName, style, vars, locale) {
147
+ const value = vars[variableName];
148
+ if (value === void 0) {
149
+ return `{${variableName}}`;
150
+ }
151
+ try {
152
+ const date = toDate(value);
153
+ const { value: relValue, unit } = getRelativeTimeUnit(date);
154
+ const options = style && RELATIVE_TIME_STYLES[style] || RELATIVE_TIME_STYLES.long;
155
+ return new Intl.RelativeTimeFormat(locale, options).format(relValue, unit);
156
+ } catch {
157
+ return `{${variableName}}`;
158
+ }
159
+ }
160
+ var LIST_PATTERN = /\{(\w+),\s*list(?:,\s*(\w+))?(?:,\s*(\w+))?\}/g;
161
+ function preprocessList(template) {
162
+ const replacements = /* @__PURE__ */ new Map();
163
+ let counter = 0;
164
+ const processed = template.replace(LIST_PATTERN, (_, variable, arg1, arg2) => {
165
+ const placeholder = `__LIST_${counter++}__`;
166
+ let type;
167
+ let style;
168
+ if (arg1) {
169
+ if (LIST_TYPES[arg1]) {
170
+ type = arg1;
171
+ style = arg2;
172
+ } else if (LIST_STYLES[arg1]) {
173
+ style = arg1;
174
+ }
175
+ }
176
+ replacements.set(placeholder, { variable, type, style });
177
+ return `{${placeholder}}`;
178
+ });
179
+ return { processed, replacements };
180
+ }
181
+ function formatListValue(variableName, type, style, vars, locale) {
182
+ const value = vars[variableName];
183
+ if (value === void 0 || !Array.isArray(value)) {
184
+ return `{${variableName}}`;
185
+ }
186
+ const options = {
187
+ type: type || "conjunction",
188
+ style: style || "long"
189
+ };
190
+ try {
191
+ return new Intl.ListFormat(locale, options).format(value);
192
+ } catch {
193
+ return value.join(", ");
194
+ }
195
+ }
103
196
  function interpolateICU(template, vars, locale) {
104
- const ast = icuMessageformatParser.parse(template);
105
- return formatElements(ast, vars, locale, null);
197
+ const { processed: afterRelTime, replacements: relTimeReplacements } = preprocessRelativeTime(template);
198
+ const { processed: afterList, replacements: listReplacements } = preprocessList(afterRelTime);
199
+ const ast = icuMessageformatParser.parse(afterList);
200
+ let result = formatElements(ast, vars, locale, null);
201
+ for (const [placeholder, { variable, style }] of relTimeReplacements) {
202
+ const formatted = formatRelativeTimeValue(variable, style, vars, locale);
203
+ result = result.replace(`{${placeholder}}`, formatted);
204
+ }
205
+ for (const [placeholder, { variable, type, style }] of listReplacements) {
206
+ const formatted = formatListValue(variable, type, style, vars, locale);
207
+ result = result.replace(`{${placeholder}}`, formatted);
208
+ }
209
+ return result;
106
210
  }
107
211
  function formatElements(elements, vars, locale, currentPluralValue) {
108
212
  return elements.map((el) => formatElement(el, vars, locale, currentPluralValue)).join("");
@@ -166,7 +270,7 @@ function formatSelect(el, vars, locale) {
166
270
  }
167
271
  return `{${el.value}}`;
168
272
  }
169
- var ICU_PATTERN = /\{[^}]+,\s*(plural|select|selectordinal|number|date|time)\s*[,}]/;
273
+ var ICU_PATTERN = /\{[^}]+,\s*(plural|select|selectordinal|number|date|time|relativeTime|list)\s*[,}]/;
170
274
  function hasICUPattern(template) {
171
275
  return ICU_PATTERN.test(template);
172
276
  }
@@ -213,7 +317,8 @@ var defaultConfig = {
213
317
  autoParentLocale: true,
214
318
  fallbackChain: {},
215
319
  warnOnMissing: isDevMode(),
216
- onMissingTranslation: defaultWarningHandler
320
+ onMissingTranslation: defaultWarningHandler,
321
+ debugMode: false
217
322
  };
218
323
  var config = { ...defaultConfig };
219
324
  function configure(options) {
@@ -265,6 +370,22 @@ function emitWarning(warning) {
265
370
  cfg.onMissingTranslation(warning);
266
371
  }
267
372
  }
373
+ function applyDebugFormat(output, debugInfo) {
374
+ const cfg = getConfig();
375
+ if (!cfg.debugMode) {
376
+ return output;
377
+ }
378
+ const options = typeof cfg.debugMode === "object" ? cfg.debugMode : { showMissingPrefix: true, showFallbackPrefix: true };
379
+ if (debugInfo.isMissing && options.showMissingPrefix !== false) {
380
+ const prefix = options.missingPrefixFormat ? options.missingPrefixFormat(debugInfo.requestedLocale, debugInfo.key) : `[MISSING: ${debugInfo.requestedLocale}] `;
381
+ return prefix + output;
382
+ }
383
+ if (debugInfo.isFallback && options.showFallbackPrefix !== false && debugInfo.usedLocale) {
384
+ const prefix = options.fallbackPrefixFormat ? options.fallbackPrefixFormat(debugInfo.requestedLocale, debugInfo.usedLocale, debugInfo.key) : `[${debugInfo.requestedLocale} -> ${debugInfo.usedLocale}] `;
385
+ return prefix + output;
386
+ }
387
+ return output;
388
+ }
268
389
 
269
390
  // src/translate.ts
270
391
  function resolveTemplate(translations) {
@@ -274,7 +395,8 @@ function resolveTemplate(translations) {
274
395
  for (const tryLocale of fallbackChain) {
275
396
  const template = translations[tryLocale];
276
397
  if (template) {
277
- if (tryLocale !== locale) {
398
+ const isFallback = tryLocale !== locale;
399
+ if (isFallback) {
278
400
  emitWarning({
279
401
  type: "missing_translation",
280
402
  requestedLocale: locale,
@@ -282,7 +404,16 @@ function resolveTemplate(translations) {
282
404
  fallbackUsed: tryLocale
283
405
  });
284
406
  }
285
- return { template, locale: tryLocale };
407
+ return {
408
+ template,
409
+ locale: tryLocale,
410
+ debugInfo: {
411
+ isMissing: false,
412
+ isFallback,
413
+ requestedLocale: locale,
414
+ usedLocale: tryLocale
415
+ }
416
+ };
286
417
  }
287
418
  }
288
419
  const firstAvailable = Object.entries(translations)[0];
@@ -293,7 +424,16 @@ function resolveTemplate(translations) {
293
424
  availableLocales,
294
425
  fallbackUsed: firstAvailable[0]
295
426
  });
296
- return { template: firstAvailable[1], locale: firstAvailable[0] };
427
+ return {
428
+ template: firstAvailable[1],
429
+ locale: firstAvailable[0],
430
+ debugInfo: {
431
+ isMissing: false,
432
+ isFallback: true,
433
+ requestedLocale: locale,
434
+ usedLocale: firstAvailable[0]
435
+ }
436
+ };
297
437
  }
298
438
  throw new Error(
299
439
  `No translation found for locale "${locale}". Available: ${availableLocales.join(", ")}`
@@ -303,15 +443,17 @@ function it(first, second, third) {
303
443
  if (typeof first === "object") {
304
444
  const translations2 = first;
305
445
  const vars2 = second;
306
- const { template: template2, locale: locale2 } = resolveTemplate(translations2);
307
- return interpolate(template2, vars2, locale2);
446
+ const { template: template2, locale: locale2, debugInfo: debugInfo2 } = resolveTemplate(translations2);
447
+ const result2 = interpolate(template2, vars2, locale2);
448
+ return applyDebugFormat(result2, debugInfo2);
308
449
  }
309
450
  const ko = first;
310
451
  const en = second;
311
452
  const vars = third;
312
453
  const translations = { ko, en };
313
- const { template, locale } = resolveTemplate(translations);
314
- return interpolate(template, vars, locale);
454
+ const { template, locale, debugInfo } = resolveTemplate(translations);
455
+ const result = interpolate(template, vars, locale);
456
+ return applyDebugFormat(result, debugInfo);
315
457
  }
316
458
 
317
459
  // src/runtime.ts
@@ -376,15 +518,48 @@ var ja_es = createPair("ja", "es");
376
518
  var zh_es = createPair("zh", "es");
377
519
 
378
520
  // src/dictionary.ts
379
- var dictionaries = {};
380
- function loadDictionaries(dicts) {
381
- dictionaries = { ...dictionaries, ...dicts };
521
+ var DEFAULT_NAMESPACE = "default";
522
+ var NAMESPACE_SEPARATOR = ":";
523
+ var namespacedDictionaries = {};
524
+ function parseKey(fullKey) {
525
+ const separatorIndex = fullKey.indexOf(NAMESPACE_SEPARATOR);
526
+ if (separatorIndex > 0) {
527
+ return {
528
+ namespace: fullKey.substring(0, separatorIndex),
529
+ key: fullKey.substring(separatorIndex + 1)
530
+ };
531
+ }
532
+ return {
533
+ namespace: DEFAULT_NAMESPACE,
534
+ key: fullKey
535
+ };
382
536
  }
383
- function loadDictionary(locale, dict) {
384
- dictionaries[locale] = { ...dictionaries[locale], ...dict };
537
+ function loadDictionaries(dicts, namespace) {
538
+ const ns = namespace || DEFAULT_NAMESPACE;
539
+ if (!namespacedDictionaries[ns]) {
540
+ namespacedDictionaries[ns] = {};
541
+ }
542
+ namespacedDictionaries[ns] = {
543
+ ...namespacedDictionaries[ns],
544
+ ...dicts
545
+ };
546
+ }
547
+ function loadDictionary(locale, dict, namespace) {
548
+ const ns = namespace || DEFAULT_NAMESPACE;
549
+ if (!namespacedDictionaries[ns]) {
550
+ namespacedDictionaries[ns] = {};
551
+ }
552
+ namespacedDictionaries[ns][locale] = {
553
+ ...namespacedDictionaries[ns][locale],
554
+ ...dict
555
+ };
385
556
  }
386
- function clearDictionaries() {
387
- dictionaries = {};
557
+ function clearDictionaries(namespace) {
558
+ if (namespace) {
559
+ delete namespacedDictionaries[namespace];
560
+ } else {
561
+ namespacedDictionaries = {};
562
+ }
388
563
  }
389
564
  function getNestedValue(dict, key) {
390
565
  const parts = key.split(".");
@@ -416,15 +591,17 @@ function findInDictionary(dict, key, vars, locale) {
416
591
  return template;
417
592
  }
418
593
  function t(key, vars, locale) {
594
+ const { namespace, key: actualKey } = parseKey(key);
419
595
  const currentLocale2 = locale ?? getLocale();
420
596
  const fallbackChain = buildFallbackChain(currentLocale2);
421
- const availableLocales = Object.keys(dictionaries);
597
+ const nsDictionaries = namespacedDictionaries[namespace] || {};
598
+ const availableLocales = Object.keys(nsDictionaries);
422
599
  let template;
423
600
  let usedLocale;
424
601
  for (const tryLocale of fallbackChain) {
425
- const dict = dictionaries[tryLocale];
602
+ const dict = nsDictionaries[tryLocale];
426
603
  if (!dict) continue;
427
- const found = findInDictionary(dict, key, vars, tryLocale);
604
+ const found = findInDictionary(dict, actualKey, vars, tryLocale);
428
605
  if (found) {
429
606
  template = found;
430
607
  usedLocale = tryLocale;
@@ -438,9 +615,16 @@ function t(key, vars, locale) {
438
615
  requestedLocale: currentLocale2,
439
616
  availableLocales
440
617
  });
441
- return key;
618
+ const debugInfo2 = {
619
+ isMissing: true,
620
+ isFallback: false,
621
+ requestedLocale: currentLocale2,
622
+ key
623
+ };
624
+ return applyDebugFormat(key, debugInfo2);
442
625
  }
443
- if (usedLocale && usedLocale !== currentLocale2) {
626
+ const isFallback = usedLocale !== currentLocale2;
627
+ if (isFallback) {
444
628
  emitWarning({
445
629
  type: "missing_translation",
446
630
  key,
@@ -449,18 +633,41 @@ function t(key, vars, locale) {
449
633
  fallbackUsed: usedLocale
450
634
  });
451
635
  }
452
- return interpolate(template, vars, usedLocale || currentLocale2);
636
+ const result = interpolate(template, vars, usedLocale || currentLocale2);
637
+ const debugInfo = {
638
+ isMissing: false,
639
+ isFallback,
640
+ requestedLocale: currentLocale2,
641
+ usedLocale,
642
+ key
643
+ };
644
+ return applyDebugFormat(result, debugInfo);
453
645
  }
454
646
  function hasTranslation(key, locale) {
647
+ const { namespace, key: actualKey } = parseKey(key);
455
648
  const currentLocale2 = locale ?? getLocale();
456
- const dict = dictionaries[currentLocale2];
457
- return dict ? getNestedValue(dict, key) !== void 0 : false;
649
+ const nsDictionaries = namespacedDictionaries[namespace] || {};
650
+ const dict = nsDictionaries[currentLocale2];
651
+ return dict ? getNestedValue(dict, actualKey) !== void 0 : false;
652
+ }
653
+ function getLoadedLocales(namespace) {
654
+ if (namespace) {
655
+ return Object.keys(namespacedDictionaries[namespace] || {});
656
+ }
657
+ const locales = /* @__PURE__ */ new Set();
658
+ for (const ns of Object.values(namespacedDictionaries)) {
659
+ for (const locale of Object.keys(ns)) {
660
+ locales.add(locale);
661
+ }
662
+ }
663
+ return Array.from(locales);
458
664
  }
459
- function getLoadedLocales() {
460
- return Object.keys(dictionaries);
665
+ function getDictionary(locale, namespace) {
666
+ const ns = namespace || DEFAULT_NAMESPACE;
667
+ return namespacedDictionaries[ns]?.[locale];
461
668
  }
462
- function getDictionary(locale) {
463
- return dictionaries[locale];
669
+ function getLoadedNamespaces() {
670
+ return Object.keys(namespacedDictionaries);
464
671
  }
465
672
 
466
673
  exports.__i18n_lookup = __i18n_lookup;
@@ -474,6 +681,7 @@ exports.en_zh = en_zh;
474
681
  exports.getConfig = getConfig;
475
682
  exports.getDictionary = getDictionary;
476
683
  exports.getLoadedLocales = getLoadedLocales;
684
+ exports.getLoadedNamespaces = getLoadedNamespaces;
477
685
  exports.getLocale = getLocale;
478
686
  exports.hasTranslation = hasTranslation;
479
687
  exports.it = it;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/context.ts","../src/icu.ts","../src/interpolation.ts","../src/config.ts","../src/translate.ts","../src/runtime.ts","../src/pairs.ts","../src/dictionary.ts"],"names":["parse","isLiteralElement","isArgumentElement","isPoundElement","isPluralElement","isSelectElement","isNumberElement","isDateElement","isTimeElement","translations","vars","template","locale","currentLocale"],"mappings":"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","file":"index.js","sourcesContent":["import type { Locale } from './types'\n\nlet currentLocale: Locale = 'en'\n\nexport function setLocale(locale: Locale): void {\n currentLocale = locale\n}\n\nexport function getLocale(): Locale {\n return currentLocale\n}\n","import {\n parse,\n TYPE,\n type MessageFormatElement,\n type PluralElement,\n type SelectElement,\n type NumberElement,\n type DateElement,\n type TimeElement,\n isLiteralElement,\n isArgumentElement,\n isPluralElement,\n isSelectElement,\n isPoundElement,\n isNumberElement,\n isDateElement,\n isTimeElement,\n} from '@formatjs/icu-messageformat-parser'\n\nexport type ICUVars = Record<string, string | number | Date>\n\n/**\n * Map ICU date style names to Intl.DateTimeFormat options\n */\nconst DATE_STYLES: Record<string, Intl.DateTimeFormatOptions> = {\n short: { dateStyle: 'short' },\n medium: { dateStyle: 'medium' },\n long: { dateStyle: 'long' },\n full: { dateStyle: 'full' },\n}\n\n/**\n * Map ICU time style names to Intl.DateTimeFormat options\n */\nconst TIME_STYLES: Record<string, Intl.DateTimeFormatOptions> = {\n short: { timeStyle: 'short' },\n medium: { timeStyle: 'medium' },\n long: { timeStyle: 'long' },\n full: { timeStyle: 'full' },\n}\n\n/**\n * Map ICU number style names to Intl.NumberFormat options\n */\nconst NUMBER_STYLES: Record<string, Intl.NumberFormatOptions> = {\n decimal: { style: 'decimal' },\n percent: { style: 'percent' },\n integer: { style: 'decimal', maximumFractionDigits: 0 },\n}\n\n/**\n * Convert value to Date\n */\nfunction toDate(value: string | number | Date): Date {\n if (value instanceof Date) {\n return value\n }\n return new Date(value)\n}\n\n/**\n * Format a number element\n */\nfunction formatNumberElement(\n el: NumberElement,\n vars: ICUVars,\n locale: string\n): string {\n const value = vars[el.value]\n if (value === undefined) {\n return `{${el.value}}`\n }\n\n const num = typeof value === 'number' ? value : Number(value)\n if (isNaN(num)) {\n return `{${el.value}}`\n }\n\n let options: Intl.NumberFormatOptions = {}\n\n if (el.style) {\n if (typeof el.style === 'string') {\n // Check for currency format: \"currency\" or specific currency like \"USD\"\n if (el.style === 'currency') {\n options = { style: 'currency', currency: 'USD' }\n } else if (NUMBER_STYLES[el.style]) {\n options = NUMBER_STYLES[el.style]\n }\n } else if ('parsedOptions' in el.style) {\n // NumberSkeleton with parsed options\n options = el.style.parsedOptions as Intl.NumberFormatOptions\n }\n }\n\n try {\n return new Intl.NumberFormat(locale, options).format(num)\n } catch {\n return String(num)\n }\n}\n\n/**\n * Format a date element\n */\nfunction formatDateElement(\n el: DateElement,\n vars: ICUVars,\n locale: string\n): string {\n const value = vars[el.value]\n if (value === undefined) {\n return `{${el.value}}`\n }\n\n let options: Intl.DateTimeFormatOptions = {}\n\n if (el.style) {\n if (typeof el.style === 'string') {\n options = DATE_STYLES[el.style] || {}\n } else if ('parsedOptions' in el.style) {\n // DateTimeSkeleton with parsed options\n options = el.style.parsedOptions as Intl.DateTimeFormatOptions\n }\n }\n\n try {\n const date = toDate(value)\n return new Intl.DateTimeFormat(locale, options).format(date)\n } catch {\n return `{${el.value}}`\n }\n}\n\n/**\n * Format a time element\n */\nfunction formatTimeElement(\n el: TimeElement,\n vars: ICUVars,\n locale: string\n): string {\n const value = vars[el.value]\n if (value === undefined) {\n return `{${el.value}}`\n }\n\n let options: Intl.DateTimeFormatOptions = {}\n\n if (el.style) {\n if (typeof el.style === 'string') {\n options = TIME_STYLES[el.style] || {}\n } else if ('parsedOptions' in el.style) {\n // DateTimeSkeleton with parsed options\n options = el.style.parsedOptions as Intl.DateTimeFormatOptions\n }\n }\n\n try {\n const date = toDate(value)\n return new Intl.DateTimeFormat(locale, options).format(date)\n } catch {\n return `{${el.value}}`\n }\n}\n\n/**\n * Parse and format an ICU Message Format string\n */\nexport function interpolateICU(\n template: string,\n vars: ICUVars,\n locale: string\n): string {\n const ast = parse(template)\n return formatElements(ast, vars, locale, null)\n}\n\nfunction formatElements(\n elements: MessageFormatElement[],\n vars: ICUVars,\n locale: string,\n currentPluralValue: number | null\n): string {\n return elements\n .map((el) => formatElement(el, vars, locale, currentPluralValue))\n .join('')\n}\n\nfunction formatElement(\n el: MessageFormatElement,\n vars: ICUVars,\n locale: string,\n currentPluralValue: number | null\n): string {\n if (isLiteralElement(el)) {\n return el.value\n }\n\n if (isArgumentElement(el)) {\n const value = vars[el.value]\n return value !== undefined ? String(value) : `{${el.value}}`\n }\n\n if (isPoundElement(el)) {\n // # is replaced with the current plural value\n return currentPluralValue !== null ? String(currentPluralValue) : '#'\n }\n\n if (isPluralElement(el)) {\n return formatPlural(el, vars, locale)\n }\n\n if (isSelectElement(el)) {\n return formatSelect(el, vars, locale)\n }\n\n if (isNumberElement(el)) {\n return formatNumberElement(el, vars, locale)\n }\n\n if (isDateElement(el)) {\n return formatDateElement(el, vars, locale)\n }\n\n if (isTimeElement(el)) {\n return formatTimeElement(el, vars, locale)\n }\n\n // Tag elements - not supported yet\n return ''\n}\n\nfunction formatPlural(\n el: PluralElement,\n vars: ICUVars,\n locale: string\n): string {\n const value = vars[el.value]\n if (typeof value !== 'number') {\n return `{${el.value}}`\n }\n\n const adjustedValue = value - el.offset\n const pluralRules = new Intl.PluralRules(locale, { type: el.pluralType })\n const category = pluralRules.select(adjustedValue)\n\n // Try exact match first (=0, =1, =2, etc.)\n const exactKey = `=${value}`\n if (el.options[exactKey]) {\n return formatElements(el.options[exactKey].value, vars, locale, adjustedValue)\n }\n\n // Then try plural category (zero, one, two, few, many, other)\n if (el.options[category]) {\n return formatElements(el.options[category].value, vars, locale, adjustedValue)\n }\n\n // Fallback to 'other'\n if (el.options.other) {\n return formatElements(el.options.other.value, vars, locale, adjustedValue)\n }\n\n return `{${el.value}}`\n}\n\nfunction formatSelect(\n el: SelectElement,\n vars: ICUVars,\n locale: string\n): string {\n const value = vars[el.value]\n const key = String(value)\n\n // Try exact match\n if (el.options[key]) {\n return formatElements(el.options[key].value, vars, locale, null)\n }\n\n // Fallback to 'other'\n if (el.options.other) {\n return formatElements(el.options.other.value, vars, locale, null)\n }\n\n return `{${el.value}}`\n}\n\n// Pattern to detect ICU format (plural, select, selectordinal, number, date, time)\nexport const ICU_PATTERN = /\\{[^}]+,\\s*(plural|select|selectordinal|number|date|time)\\s*[,}]/\n\n/**\n * Check if a template contains ICU Message Format patterns\n */\nexport function hasICUPattern(template: string): boolean {\n return ICU_PATTERN.test(template)\n}\n","import type { TranslationVars } from './types'\nimport { hasICUPattern, interpolateICU } from './icu'\n\nconst VARIABLE_PATTERN = /\\{(\\w+)\\}/g\n\nexport function interpolate(\n template: string,\n vars?: TranslationVars,\n locale?: string,\n): string {\n if (!vars) return template\n\n // ICU Message Format (plural, select)\n if (hasICUPattern(template)) {\n return interpolateICU(template, vars, locale || 'en')\n }\n\n // Simple variable substitution\n return template.replace(VARIABLE_PATTERN, (_, key) => {\n const value = vars[key]\n return value !== undefined ? String(value) : `{${key}}`\n })\n}\n","import type { Config, Locale, TranslationWarning } from './types'\n\n/**\n * Default warning handler - logs to console\n */\nfunction defaultWarningHandler(warning: TranslationWarning): void {\n const parts = [`[inline-i18n] Missing translation for locale \"${warning.requestedLocale}\"`]\n\n if (warning.key) {\n parts.push(`key: \"${warning.key}\"`)\n }\n\n parts.push(`Available: [${warning.availableLocales.join(', ')}]`)\n\n if (warning.fallbackUsed) {\n parts.push(`Using fallback: \"${warning.fallbackUsed}\"`)\n }\n\n console.warn(parts.join(' | '))\n}\n\n/**\n * Check if we're in development mode\n */\nfunction isDevMode(): boolean {\n try {\n // Check for Node.js environment\n if (typeof globalThis !== 'undefined' && 'process' in globalThis) {\n const proc = (globalThis as { process?: { env?: { NODE_ENV?: string } } }).process\n return proc?.env?.NODE_ENV !== 'production'\n }\n return false\n } catch {\n return false\n }\n}\n\nconst defaultConfig: Required<Config> = {\n defaultLocale: 'en',\n fallbackLocale: 'en',\n autoParentLocale: true,\n fallbackChain: {},\n warnOnMissing: isDevMode(),\n onMissingTranslation: defaultWarningHandler,\n}\n\nlet config: Config = { ...defaultConfig }\n\n/**\n * Configure inline-i18n-multi settings\n *\n * @example\n * configure({\n * fallbackLocale: 'en',\n * fallbackChain: { 'pt-BR': ['pt', 'es', 'en'] },\n * warnOnMissing: true,\n * })\n */\nexport function configure(options: Partial<Config>): void {\n config = { ...config, ...options }\n}\n\n/**\n * Get current configuration\n */\nexport function getConfig(): Required<Config> {\n return {\n ...defaultConfig,\n ...config,\n }\n}\n\n/**\n * Reset configuration to defaults\n */\nexport function resetConfig(): void {\n config = { ...defaultConfig }\n}\n\n/**\n * Derive parent locale from BCP 47 tag\n *\n * @example\n * getParentLocale('zh-TW') // => 'zh'\n * getParentLocale('en-US') // => 'en'\n * getParentLocale('en') // => undefined\n */\nexport function getParentLocale(locale: Locale): Locale | undefined {\n const dashIndex = locale.indexOf('-')\n if (dashIndex > 0) {\n return locale.substring(0, dashIndex)\n }\n return undefined\n}\n\n/**\n * Build fallback chain for a locale\n *\n * @example\n * // With autoParentLocale enabled (default)\n * buildFallbackChain('zh-TW') // => ['zh-TW', 'zh', 'en']\n * buildFallbackChain('en-US') // => ['en-US', 'en']\n *\n * // With custom fallback chain\n * configure({ fallbackChain: { 'pt-BR': ['pt', 'es', 'en'] } })\n * buildFallbackChain('pt-BR') // => ['pt-BR', 'pt', 'es', 'en']\n */\nexport function buildFallbackChain(locale: Locale): Locale[] {\n const cfg = getConfig()\n\n // Check for custom chain first\n if (cfg.fallbackChain[locale]) {\n return [locale, ...cfg.fallbackChain[locale]]\n }\n\n const chain: Locale[] = [locale]\n\n // Auto-derive parent locales if enabled\n if (cfg.autoParentLocale) {\n let current = locale\n while (true) {\n const parent = getParentLocale(current)\n if (parent && !chain.includes(parent)) {\n chain.push(parent)\n current = parent\n } else {\n break\n }\n }\n }\n\n // Add final fallback if not already in chain\n const finalFallback = cfg.fallbackLocale\n if (finalFallback && !chain.includes(finalFallback)) {\n chain.push(finalFallback)\n }\n\n return chain\n}\n\n/**\n * Emit a missing translation warning\n */\nexport function emitWarning(warning: TranslationWarning): void {\n const cfg = getConfig()\n if (cfg.warnOnMissing && cfg.onMissingTranslation) {\n cfg.onMissingTranslation(warning)\n }\n}\n","import type { Translations, TranslationVars } from './types'\nimport { getLocale } from './context'\nimport { interpolate } from './interpolation'\nimport { buildFallbackChain, emitWarning } from './config'\n\ninterface ResolveResult {\n template: string\n locale: string\n}\n\nfunction resolveTemplate(translations: Translations): ResolveResult {\n const locale = getLocale()\n const availableLocales = Object.keys(translations)\n const fallbackChain = buildFallbackChain(locale)\n\n // Try each locale in the fallback chain\n for (const tryLocale of fallbackChain) {\n const template = translations[tryLocale]\n if (template) {\n // Warn if we had to fall back\n if (tryLocale !== locale) {\n emitWarning({\n type: 'missing_translation',\n requestedLocale: locale,\n availableLocales,\n fallbackUsed: tryLocale,\n })\n }\n return { template, locale: tryLocale }\n }\n }\n\n // Last resort: use first available translation\n const firstAvailable = Object.entries(translations)[0]\n if (firstAvailable) {\n emitWarning({\n type: 'missing_translation',\n requestedLocale: locale,\n availableLocales,\n fallbackUsed: firstAvailable[0],\n })\n return { template: firstAvailable[1], locale: firstAvailable[0] }\n }\n\n throw new Error(\n `No translation found for locale \"${locale}\". Available: ${availableLocales.join(', ')}`\n )\n}\n\n/**\n * Translate with two languages (shorthand)\n * @param ko - Korean text\n * @param en - English text\n * @param vars - Variables for interpolation\n */\nexport function it(ko: string, en: string, vars?: TranslationVars): string\n\n/**\n * Translate with multiple languages (object syntax)\n * @param translations - Translation map with locale keys\n * @param vars - Variables for interpolation\n */\nexport function it(translations: Translations, vars?: TranslationVars): string\n\nexport function it(\n first: string | Translations,\n second?: string | TranslationVars,\n third?: TranslationVars,\n): string {\n // object syntax: it({ ko: '...', en: '...' }, vars?)\n if (typeof first === 'object') {\n const translations = first\n const vars = second as TranslationVars | undefined\n const { template, locale } = resolveTemplate(translations)\n return interpolate(template, vars, locale)\n }\n\n // shorthand syntax: it('한글', 'English', vars?)\n const ko = first\n const en = second as string\n const vars = third\n\n const translations: Translations = { ko, en }\n const { template, locale } = resolveTemplate(translations)\n return interpolate(template, vars, locale)\n}\n","import type { Translations, TranslationVars } from './types'\nimport { getLocale } from './context'\nimport { interpolate } from './interpolation'\nimport { buildFallbackChain, emitWarning } from './config'\n\n/**\n * Runtime lookup function for plugin-transformed code.\n * This is called by code that has been processed by @inline-i18n-multi/babel-plugin\n * or @inline-i18n-multi/swc-plugin.\n *\n * @param _hash - Content hash (for caching/debugging, unused at runtime)\n * @param translations - Translation map with locale keys\n * @param vars - Variables for interpolation\n */\nexport function __i18n_lookup(\n _hash: string,\n translations: Translations,\n vars?: TranslationVars\n): string {\n const locale = getLocale()\n const availableLocales = Object.keys(translations)\n const fallbackChain = buildFallbackChain(locale)\n\n // Try each locale in the fallback chain\n for (const tryLocale of fallbackChain) {\n const template = translations[tryLocale]\n if (template) {\n // Warn if we had to fall back\n if (tryLocale !== locale) {\n emitWarning({\n type: 'missing_translation',\n requestedLocale: locale,\n availableLocales,\n fallbackUsed: tryLocale,\n })\n }\n return interpolate(template, vars, tryLocale)\n }\n }\n\n // Last resort: use first available translation\n const firstAvailable = Object.entries(translations)[0]\n if (firstAvailable) {\n emitWarning({\n type: 'missing_translation',\n requestedLocale: locale,\n availableLocales,\n fallbackUsed: firstAvailable[0],\n })\n return interpolate(firstAvailable[1], vars, firstAvailable[0])\n }\n\n throw new Error(\n `No translation found for locale \"${locale}\". Available: ${availableLocales.join(', ')}`\n )\n}\n\n// Register __i18n_lookup globally for plugin transformations\n// This makes it available without explicit import after bundle\nif (typeof globalThis !== 'undefined') {\n (globalThis as Record<string, unknown>).__i18n_lookup = __i18n_lookup\n}\n","import type { Locale, Translations, TranslationVars } from './types'\nimport { it } from './translate'\n\ntype PairFunction = (\n text1: string,\n text2: string,\n vars?: TranslationVars,\n) => string\n\nfunction createPair(lang1: Locale, lang2: Locale): PairFunction {\n return (text1, text2, vars) => {\n const translations: Translations = {\n [lang1]: text1,\n [lang2]: text2,\n }\n return it(translations, vars)\n }\n}\n\n// Korean combinations\nexport const it_ja = createPair('ko', 'ja')\nexport const it_zh = createPair('ko', 'zh')\nexport const it_es = createPair('ko', 'es')\nexport const it_fr = createPair('ko', 'fr')\nexport const it_de = createPair('ko', 'de')\n\n// English combinations\nexport const en_ja = createPair('en', 'ja')\nexport const en_zh = createPair('en', 'zh')\nexport const en_es = createPair('en', 'es')\nexport const en_fr = createPair('en', 'fr')\nexport const en_de = createPair('en', 'de')\n\n// Other combinations\nexport const ja_zh = createPair('ja', 'zh')\nexport const ja_es = createPair('ja', 'es')\nexport const zh_es = createPair('zh', 'es')\n","import { getLocale } from './context'\nimport type { Locale, TranslationVars } from './types'\nimport { interpolate } from './interpolation'\nimport { buildFallbackChain, emitWarning } from './config'\n\n/**\n * Nested dictionary structure for translations\n * @example { greeting: { hello: \"Hello\", goodbye: \"Goodbye\" } }\n */\nexport type Dictionary = {\n [key: string]: string | Dictionary\n}\n\n/**\n * All loaded dictionaries by locale\n */\nexport type Dictionaries = Record<Locale, Dictionary>\n\n/**\n * Plural rules configuration\n */\nexport interface PluralRules {\n zero?: string\n one?: string\n two?: string\n few?: string\n many?: string\n other: string\n}\n\n// Global dictionary storage\nlet dictionaries: Dictionaries = {}\n\n/**\n * Load translations from dictionary objects\n * @param dicts - Dictionary objects keyed by locale\n * @example\n * loadDictionaries({\n * en: { greeting: { hello: \"Hello\" } },\n * ko: { greeting: { hello: \"안녕하세요\" } }\n * })\n */\nexport function loadDictionaries(dicts: Dictionaries): void {\n dictionaries = { ...dictionaries, ...dicts }\n}\n\n/**\n * Load a single locale's dictionary\n * @param locale - Locale code\n * @param dict - Dictionary object\n */\nexport function loadDictionary(locale: Locale, dict: Dictionary): void {\n dictionaries[locale] = { ...dictionaries[locale], ...dict }\n}\n\n/**\n * Clear all loaded dictionaries\n */\nexport function clearDictionaries(): void {\n dictionaries = {}\n}\n\n/**\n * Get a nested value from dictionary using dot notation\n * @param dict - Dictionary object\n * @param key - Dot-separated key path\n */\nfunction getNestedValue(dict: Dictionary, key: string): string | undefined {\n const parts = key.split('.')\n let current: string | Dictionary | undefined = dict\n\n for (const part of parts) {\n if (typeof current !== 'object' || current === null) {\n return undefined\n }\n current = current[part]\n if (current === undefined) {\n return undefined\n }\n }\n\n return typeof current === 'string' ? current : undefined\n}\n\n/**\n * Get plural category using Intl.PluralRules\n */\nfunction getPluralCategory(count: number, locale: Locale): Intl.LDMLPluralRule {\n const rules = new Intl.PluralRules(locale)\n return rules.select(count)\n}\n\n/**\n * Try to find a translation in a dictionary, handling plurals\n */\nfunction findInDictionary(\n dict: Dictionary,\n key: string,\n vars: TranslationVars | undefined,\n locale: Locale\n): string | undefined {\n let template = getNestedValue(dict, key)\n\n // Handle plurals if count is provided\n if (vars && typeof vars.count === 'number') {\n const pluralKey = `${key}_${getPluralCategory(vars.count, locale)}`\n const pluralTemplate = getNestedValue(dict, pluralKey)\n if (pluralTemplate) {\n template = pluralTemplate\n }\n }\n\n return template\n}\n\n/**\n * Translate using key-based lookup (i18n compatible)\n * @param key - Dot-separated translation key\n * @param vars - Variables for interpolation (including 'count' for plurals)\n * @param locale - Override locale (optional)\n * @example\n * t('greeting.hello') // \"Hello\"\n * t('items.count', { count: 5 }) // \"5 items\"\n */\nexport function t(\n key: string,\n vars?: TranslationVars,\n locale?: Locale\n): string {\n const currentLocale = locale ?? getLocale()\n const fallbackChain = buildFallbackChain(currentLocale)\n const availableLocales = Object.keys(dictionaries)\n\n let template: string | undefined\n let usedLocale: Locale | undefined\n\n // Try each locale in the fallback chain\n for (const tryLocale of fallbackChain) {\n const dict = dictionaries[tryLocale]\n if (!dict) continue\n\n const found = findInDictionary(dict, key, vars, tryLocale)\n if (found) {\n template = found\n usedLocale = tryLocale\n break\n }\n }\n\n if (!template) {\n emitWarning({\n type: 'missing_translation',\n key,\n requestedLocale: currentLocale,\n availableLocales,\n })\n return key\n }\n\n // Warn if we used a fallback\n if (usedLocale && usedLocale !== currentLocale) {\n emitWarning({\n type: 'missing_translation',\n key,\n requestedLocale: currentLocale,\n availableLocales,\n fallbackUsed: usedLocale,\n })\n }\n\n return interpolate(template, vars, usedLocale || currentLocale)\n}\n\n/**\n * Check if a translation key exists\n */\nexport function hasTranslation(key: string, locale?: Locale): boolean {\n const currentLocale = locale ?? getLocale()\n const dict = dictionaries[currentLocale]\n return dict ? getNestedValue(dict, key) !== undefined : false\n}\n\n/**\n * Get all loaded locales\n */\nexport function getLoadedLocales(): Locale[] {\n return Object.keys(dictionaries)\n}\n\n/**\n * Get dictionary for a specific locale\n */\nexport function getDictionary(locale: Locale): Dictionary | undefined {\n return dictionaries[locale]\n}\n"]}
1
+ {"version":3,"sources":["../src/context.ts","../src/icu.ts","../src/interpolation.ts","../src/config.ts","../src/translate.ts","../src/runtime.ts","../src/pairs.ts","../src/dictionary.ts"],"names":["parse","isLiteralElement","isArgumentElement","isPoundElement","isPluralElement","isSelectElement","isNumberElement","isDateElement","isTimeElement","translations","vars","template","locale","debugInfo","result","currentLocale"],"mappings":"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","file":"index.js","sourcesContent":["import type { Locale } from './types'\n\nlet currentLocale: Locale = 'en'\n\nexport function setLocale(locale: Locale): void {\n currentLocale = locale\n}\n\nexport function getLocale(): Locale {\n return currentLocale\n}\n","import {\n parse,\n TYPE,\n type MessageFormatElement,\n type PluralElement,\n type SelectElement,\n type NumberElement,\n type DateElement,\n type TimeElement,\n isLiteralElement,\n isArgumentElement,\n isPluralElement,\n isSelectElement,\n isPoundElement,\n isNumberElement,\n isDateElement,\n isTimeElement,\n} from '@formatjs/icu-messageformat-parser'\n\nexport type ICUVars = Record<string, string | number | Date | string[]>\n\n/**\n * Map ICU date style names to Intl.DateTimeFormat options\n */\nconst DATE_STYLES: Record<string, Intl.DateTimeFormatOptions> = {\n short: { dateStyle: 'short' },\n medium: { dateStyle: 'medium' },\n long: { dateStyle: 'long' },\n full: { dateStyle: 'full' },\n}\n\n/**\n * Map ICU time style names to Intl.DateTimeFormat options\n */\nconst TIME_STYLES: Record<string, Intl.DateTimeFormatOptions> = {\n short: { timeStyle: 'short' },\n medium: { timeStyle: 'medium' },\n long: { timeStyle: 'long' },\n full: { timeStyle: 'full' },\n}\n\n/**\n * Map ICU number style names to Intl.NumberFormat options\n */\nconst NUMBER_STYLES: Record<string, Intl.NumberFormatOptions> = {\n decimal: { style: 'decimal' },\n percent: { style: 'percent' },\n integer: { style: 'decimal', maximumFractionDigits: 0 },\n}\n\n/**\n * Map ICU relative time style names to Intl.RelativeTimeFormat options\n */\nconst RELATIVE_TIME_STYLES: Record<string, Intl.RelativeTimeFormatOptions> = {\n long: { style: 'long', numeric: 'auto' },\n short: { style: 'short', numeric: 'auto' },\n narrow: { style: 'narrow', numeric: 'auto' },\n}\n\n/**\n * Map ICU list type/style names to Intl.ListFormat options\n */\nconst LIST_TYPES: Record<string, Intl.ListFormatType> = {\n conjunction: 'conjunction',\n disjunction: 'disjunction',\n unit: 'unit',\n}\n\nconst LIST_STYLES: Record<string, Intl.ListFormatStyle> = {\n long: 'long',\n short: 'short',\n narrow: 'narrow',\n}\n\n/**\n * Convert value to Date\n */\nfunction toDate(value: string | number | Date): Date {\n if (value instanceof Date) {\n return value\n }\n return new Date(value)\n}\n\n/**\n * Format a number element\n */\nfunction formatNumberElement(\n el: NumberElement,\n vars: ICUVars,\n locale: string\n): string {\n const value = vars[el.value]\n if (value === undefined) {\n return `{${el.value}}`\n }\n\n const num = typeof value === 'number' ? value : Number(value)\n if (isNaN(num)) {\n return `{${el.value}}`\n }\n\n let options: Intl.NumberFormatOptions = {}\n\n if (el.style) {\n if (typeof el.style === 'string') {\n // Check for currency format: \"currency\" or specific currency like \"USD\"\n if (el.style === 'currency') {\n options = { style: 'currency', currency: 'USD' }\n } else if (NUMBER_STYLES[el.style]) {\n options = NUMBER_STYLES[el.style]\n }\n } else if ('parsedOptions' in el.style) {\n // NumberSkeleton with parsed options\n options = el.style.parsedOptions as Intl.NumberFormatOptions\n }\n }\n\n try {\n return new Intl.NumberFormat(locale, options).format(num)\n } catch {\n return String(num)\n }\n}\n\n/**\n * Format a date element\n */\nfunction formatDateElement(\n el: DateElement,\n vars: ICUVars,\n locale: string\n): string {\n const value = vars[el.value]\n if (value === undefined) {\n return `{${el.value}}`\n }\n\n let options: Intl.DateTimeFormatOptions = {}\n\n if (el.style) {\n if (typeof el.style === 'string') {\n options = DATE_STYLES[el.style] || {}\n } else if ('parsedOptions' in el.style) {\n // DateTimeSkeleton with parsed options\n options = el.style.parsedOptions as Intl.DateTimeFormatOptions\n }\n }\n\n try {\n const date = toDate(value)\n return new Intl.DateTimeFormat(locale, options).format(date)\n } catch {\n return `{${el.value}}`\n }\n}\n\n/**\n * Format a time element\n */\nfunction formatTimeElement(\n el: TimeElement,\n vars: ICUVars,\n locale: string\n): string {\n const value = vars[el.value]\n if (value === undefined) {\n return `{${el.value}}`\n }\n\n let options: Intl.DateTimeFormatOptions = {}\n\n if (el.style) {\n if (typeof el.style === 'string') {\n options = TIME_STYLES[el.style] || {}\n } else if ('parsedOptions' in el.style) {\n // DateTimeSkeleton with parsed options\n options = el.style.parsedOptions as Intl.DateTimeFormatOptions\n }\n }\n\n try {\n const date = toDate(value)\n return new Intl.DateTimeFormat(locale, options).format(date)\n } catch {\n return `{${el.value}}`\n }\n}\n\n// ============================================================================\n// Relative Time Formatting (v0.4.0)\n// ============================================================================\n\ninterface RelativeTimeUnit {\n value: number\n unit: Intl.RelativeTimeFormatUnit\n}\n\n/**\n * Calculate the best unit for relative time display\n */\nfunction getRelativeTimeUnit(date: Date, now: Date = new Date()): RelativeTimeUnit {\n const diffMs = date.getTime() - now.getTime()\n const diffSeconds = Math.round(diffMs / 1000)\n const diffMinutes = Math.round(diffSeconds / 60)\n const diffHours = Math.round(diffMinutes / 60)\n const diffDays = Math.round(diffHours / 24)\n const diffWeeks = Math.round(diffDays / 7)\n const diffMonths = Math.round(diffDays / 30)\n const diffYears = Math.round(diffDays / 365)\n\n if (Math.abs(diffSeconds) < 60) return { value: diffSeconds, unit: 'second' }\n if (Math.abs(diffMinutes) < 60) return { value: diffMinutes, unit: 'minute' }\n if (Math.abs(diffHours) < 24) return { value: diffHours, unit: 'hour' }\n if (Math.abs(diffDays) < 7) return { value: diffDays, unit: 'day' }\n if (Math.abs(diffWeeks) < 4) return { value: diffWeeks, unit: 'week' }\n if (Math.abs(diffMonths) < 12) return { value: diffMonths, unit: 'month' }\n return { value: diffYears, unit: 'year' }\n}\n\ninterface RelativeTimeReplacement {\n variable: string\n style?: string\n}\n\nconst RELATIVE_TIME_PATTERN = /\\{(\\w+),\\s*relativeTime(?:,\\s*(\\w+))?\\}/g\n\n/**\n * Preprocess relative time formats before ICU parsing\n */\nfunction preprocessRelativeTime(template: string): {\n processed: string\n replacements: Map<string, RelativeTimeReplacement>\n} {\n const replacements = new Map<string, RelativeTimeReplacement>()\n let counter = 0\n const processed = template.replace(RELATIVE_TIME_PATTERN, (_, variable, style) => {\n const placeholder = `__RELTIME_${counter++}__`\n replacements.set(placeholder, { variable, style })\n return `{${placeholder}}`\n })\n return { processed, replacements }\n}\n\n/**\n * Format a relative time value\n */\nfunction formatRelativeTimeValue(\n variableName: string,\n style: string | undefined,\n vars: ICUVars,\n locale: string\n): string {\n const value = vars[variableName]\n if (value === undefined) {\n return `{${variableName}}`\n }\n\n try {\n const date = toDate(value as string | number | Date)\n const { value: relValue, unit } = getRelativeTimeUnit(date)\n const options = (style && RELATIVE_TIME_STYLES[style]) || RELATIVE_TIME_STYLES.long\n return new Intl.RelativeTimeFormat(locale, options).format(relValue, unit)\n } catch {\n return `{${variableName}}`\n }\n}\n\n// ============================================================================\n// List Formatting (v0.4.0)\n// ============================================================================\n\ninterface ListReplacement {\n variable: string\n type?: string\n style?: string\n}\n\nconst LIST_PATTERN = /\\{(\\w+),\\s*list(?:,\\s*(\\w+))?(?:,\\s*(\\w+))?\\}/g\n\n/**\n * Preprocess list formats before ICU parsing\n */\nfunction preprocessList(template: string): {\n processed: string\n replacements: Map<string, ListReplacement>\n} {\n const replacements = new Map<string, ListReplacement>()\n let counter = 0\n const processed = template.replace(LIST_PATTERN, (_, variable, arg1, arg2) => {\n const placeholder = `__LIST_${counter++}__`\n let type: string | undefined\n let style: string | undefined\n\n if (arg1) {\n if (LIST_TYPES[arg1]) {\n type = arg1\n style = arg2\n } else if (LIST_STYLES[arg1]) {\n style = arg1\n }\n }\n\n replacements.set(placeholder, { variable, type, style })\n return `{${placeholder}}`\n })\n return { processed, replacements }\n}\n\n/**\n * Format a list value\n */\nfunction formatListValue(\n variableName: string,\n type: string | undefined,\n style: string | undefined,\n vars: ICUVars,\n locale: string\n): string {\n const value = vars[variableName]\n if (value === undefined || !Array.isArray(value)) {\n return `{${variableName}}`\n }\n\n const options: Intl.ListFormatOptions = {\n type: (type as Intl.ListFormatType) || 'conjunction',\n style: (style as Intl.ListFormatStyle) || 'long',\n }\n\n try {\n return new Intl.ListFormat(locale, options).format(value)\n } catch {\n return value.join(', ')\n }\n}\n\n/**\n * Parse and format an ICU Message Format string\n */\nexport function interpolateICU(\n template: string,\n vars: ICUVars,\n locale: string\n): string {\n // Pre-process relativeTime and list formats (not natively supported by ICU parser)\n const { processed: afterRelTime, replacements: relTimeReplacements } = preprocessRelativeTime(template)\n const { processed: afterList, replacements: listReplacements } = preprocessList(afterRelTime)\n\n const ast = parse(afterList)\n let result = formatElements(ast, vars, locale, null)\n\n // Post-process relativeTime placeholders\n for (const [placeholder, { variable, style }] of relTimeReplacements) {\n const formatted = formatRelativeTimeValue(variable, style, vars, locale)\n result = result.replace(`{${placeholder}}`, formatted)\n }\n\n // Post-process list placeholders\n for (const [placeholder, { variable, type, style }] of listReplacements) {\n const formatted = formatListValue(variable, type, style, vars, locale)\n result = result.replace(`{${placeholder}}`, formatted)\n }\n\n return result\n}\n\nfunction formatElements(\n elements: MessageFormatElement[],\n vars: ICUVars,\n locale: string,\n currentPluralValue: number | null\n): string {\n return elements\n .map((el) => formatElement(el, vars, locale, currentPluralValue))\n .join('')\n}\n\nfunction formatElement(\n el: MessageFormatElement,\n vars: ICUVars,\n locale: string,\n currentPluralValue: number | null\n): string {\n if (isLiteralElement(el)) {\n return el.value\n }\n\n if (isArgumentElement(el)) {\n const value = vars[el.value]\n return value !== undefined ? String(value) : `{${el.value}}`\n }\n\n if (isPoundElement(el)) {\n // # is replaced with the current plural value\n return currentPluralValue !== null ? String(currentPluralValue) : '#'\n }\n\n if (isPluralElement(el)) {\n return formatPlural(el, vars, locale)\n }\n\n if (isSelectElement(el)) {\n return formatSelect(el, vars, locale)\n }\n\n if (isNumberElement(el)) {\n return formatNumberElement(el, vars, locale)\n }\n\n if (isDateElement(el)) {\n return formatDateElement(el, vars, locale)\n }\n\n if (isTimeElement(el)) {\n return formatTimeElement(el, vars, locale)\n }\n\n // Tag elements - not supported yet\n return ''\n}\n\nfunction formatPlural(\n el: PluralElement,\n vars: ICUVars,\n locale: string\n): string {\n const value = vars[el.value]\n if (typeof value !== 'number') {\n return `{${el.value}}`\n }\n\n const adjustedValue = value - el.offset\n const pluralRules = new Intl.PluralRules(locale, { type: el.pluralType })\n const category = pluralRules.select(adjustedValue)\n\n // Try exact match first (=0, =1, =2, etc.)\n const exactKey = `=${value}`\n if (el.options[exactKey]) {\n return formatElements(el.options[exactKey].value, vars, locale, adjustedValue)\n }\n\n // Then try plural category (zero, one, two, few, many, other)\n if (el.options[category]) {\n return formatElements(el.options[category].value, vars, locale, adjustedValue)\n }\n\n // Fallback to 'other'\n if (el.options.other) {\n return formatElements(el.options.other.value, vars, locale, adjustedValue)\n }\n\n return `{${el.value}}`\n}\n\nfunction formatSelect(\n el: SelectElement,\n vars: ICUVars,\n locale: string\n): string {\n const value = vars[el.value]\n const key = String(value)\n\n // Try exact match\n if (el.options[key]) {\n return formatElements(el.options[key].value, vars, locale, null)\n }\n\n // Fallback to 'other'\n if (el.options.other) {\n return formatElements(el.options.other.value, vars, locale, null)\n }\n\n return `{${el.value}}`\n}\n\n// Pattern to detect ICU format (plural, select, selectordinal, number, date, time, relativeTime, list)\nexport const ICU_PATTERN = /\\{[^}]+,\\s*(plural|select|selectordinal|number|date|time|relativeTime|list)\\s*[,}]/\n\n/**\n * Check if a template contains ICU Message Format patterns\n */\nexport function hasICUPattern(template: string): boolean {\n return ICU_PATTERN.test(template)\n}\n","import type { TranslationVars } from './types'\nimport { hasICUPattern, interpolateICU } from './icu'\n\nconst VARIABLE_PATTERN = /\\{(\\w+)\\}/g\n\nexport function interpolate(\n template: string,\n vars?: TranslationVars,\n locale?: string,\n): string {\n if (!vars) return template\n\n // ICU Message Format (plural, select)\n if (hasICUPattern(template)) {\n return interpolateICU(template, vars, locale || 'en')\n }\n\n // Simple variable substitution\n return template.replace(VARIABLE_PATTERN, (_, key) => {\n const value = vars[key]\n return value !== undefined ? String(value) : `{${key}}`\n })\n}\n","import type { Config, Locale, TranslationWarning, DebugModeOptions } from './types'\n\n/**\n * Default warning handler - logs to console\n */\nfunction defaultWarningHandler(warning: TranslationWarning): void {\n const parts = [`[inline-i18n] Missing translation for locale \"${warning.requestedLocale}\"`]\n\n if (warning.key) {\n parts.push(`key: \"${warning.key}\"`)\n }\n\n parts.push(`Available: [${warning.availableLocales.join(', ')}]`)\n\n if (warning.fallbackUsed) {\n parts.push(`Using fallback: \"${warning.fallbackUsed}\"`)\n }\n\n console.warn(parts.join(' | '))\n}\n\n/**\n * Check if we're in development mode\n */\nfunction isDevMode(): boolean {\n try {\n // Check for Node.js environment\n if (typeof globalThis !== 'undefined' && 'process' in globalThis) {\n const proc = (globalThis as { process?: { env?: { NODE_ENV?: string } } }).process\n return proc?.env?.NODE_ENV !== 'production'\n }\n return false\n } catch {\n return false\n }\n}\n\nconst defaultConfig: Required<Config> = {\n defaultLocale: 'en',\n fallbackLocale: 'en',\n autoParentLocale: true,\n fallbackChain: {},\n warnOnMissing: isDevMode(),\n onMissingTranslation: defaultWarningHandler,\n debugMode: false,\n}\n\nlet config: Config = { ...defaultConfig }\n\n/**\n * Configure inline-i18n-multi settings\n *\n * @example\n * configure({\n * fallbackLocale: 'en',\n * fallbackChain: { 'pt-BR': ['pt', 'es', 'en'] },\n * warnOnMissing: true,\n * })\n */\nexport function configure(options: Partial<Config>): void {\n config = { ...config, ...options }\n}\n\n/**\n * Get current configuration\n */\nexport function getConfig(): Required<Config> {\n return {\n ...defaultConfig,\n ...config,\n }\n}\n\n/**\n * Reset configuration to defaults\n */\nexport function resetConfig(): void {\n config = { ...defaultConfig }\n}\n\n/**\n * Derive parent locale from BCP 47 tag\n *\n * @example\n * getParentLocale('zh-TW') // => 'zh'\n * getParentLocale('en-US') // => 'en'\n * getParentLocale('en') // => undefined\n */\nexport function getParentLocale(locale: Locale): Locale | undefined {\n const dashIndex = locale.indexOf('-')\n if (dashIndex > 0) {\n return locale.substring(0, dashIndex)\n }\n return undefined\n}\n\n/**\n * Build fallback chain for a locale\n *\n * @example\n * // With autoParentLocale enabled (default)\n * buildFallbackChain('zh-TW') // => ['zh-TW', 'zh', 'en']\n * buildFallbackChain('en-US') // => ['en-US', 'en']\n *\n * // With custom fallback chain\n * configure({ fallbackChain: { 'pt-BR': ['pt', 'es', 'en'] } })\n * buildFallbackChain('pt-BR') // => ['pt-BR', 'pt', 'es', 'en']\n */\nexport function buildFallbackChain(locale: Locale): Locale[] {\n const cfg = getConfig()\n\n // Check for custom chain first\n if (cfg.fallbackChain[locale]) {\n return [locale, ...cfg.fallbackChain[locale]]\n }\n\n const chain: Locale[] = [locale]\n\n // Auto-derive parent locales if enabled\n if (cfg.autoParentLocale) {\n let current = locale\n while (true) {\n const parent = getParentLocale(current)\n if (parent && !chain.includes(parent)) {\n chain.push(parent)\n current = parent\n } else {\n break\n }\n }\n }\n\n // Add final fallback if not already in chain\n const finalFallback = cfg.fallbackLocale\n if (finalFallback && !chain.includes(finalFallback)) {\n chain.push(finalFallback)\n }\n\n return chain\n}\n\n/**\n * Emit a missing translation warning\n */\nexport function emitWarning(warning: TranslationWarning): void {\n const cfg = getConfig()\n if (cfg.warnOnMissing && cfg.onMissingTranslation) {\n cfg.onMissingTranslation(warning)\n }\n}\n\n// ============================================================================\n// Debug Mode (v0.4.0)\n// ============================================================================\n\n/**\n * Debug information for translation output\n */\nexport interface DebugInfo {\n /** True if no translation was found */\n isMissing: boolean\n /** True if a fallback locale was used */\n isFallback: boolean\n /** The locale that was requested */\n requestedLocale: string\n /** The locale that was actually used */\n usedLocale?: string\n /** The translation key (for t() function) */\n key?: string\n}\n\n/**\n * Format translation output with debug information if enabled\n */\nexport function applyDebugFormat(output: string, debugInfo: DebugInfo): string {\n const cfg = getConfig()\n\n if (!cfg.debugMode) {\n return output\n }\n\n const options: DebugModeOptions =\n typeof cfg.debugMode === 'object'\n ? cfg.debugMode\n : { showMissingPrefix: true, showFallbackPrefix: true }\n\n // Handle missing translation\n if (debugInfo.isMissing && options.showMissingPrefix !== false) {\n const prefix = options.missingPrefixFormat\n ? options.missingPrefixFormat(debugInfo.requestedLocale, debugInfo.key)\n : `[MISSING: ${debugInfo.requestedLocale}] `\n return prefix + output\n }\n\n // Handle fallback translation\n if (debugInfo.isFallback && options.showFallbackPrefix !== false && debugInfo.usedLocale) {\n const prefix = options.fallbackPrefixFormat\n ? options.fallbackPrefixFormat(debugInfo.requestedLocale, debugInfo.usedLocale, debugInfo.key)\n : `[${debugInfo.requestedLocale} -> ${debugInfo.usedLocale}] `\n return prefix + output\n }\n\n return output\n}\n","import type { Translations, TranslationVars } from './types'\nimport { getLocale } from './context'\nimport { interpolate } from './interpolation'\nimport { buildFallbackChain, emitWarning, applyDebugFormat, type DebugInfo } from './config'\n\ninterface ResolveResult {\n template: string\n locale: string\n debugInfo: DebugInfo\n}\n\nfunction resolveTemplate(translations: Translations): ResolveResult {\n const locale = getLocale()\n const availableLocales = Object.keys(translations)\n const fallbackChain = buildFallbackChain(locale)\n\n // Try each locale in the fallback chain\n for (const tryLocale of fallbackChain) {\n const template = translations[tryLocale]\n if (template) {\n const isFallback = tryLocale !== locale\n // Warn if we had to fall back\n if (isFallback) {\n emitWarning({\n type: 'missing_translation',\n requestedLocale: locale,\n availableLocales,\n fallbackUsed: tryLocale,\n })\n }\n return {\n template,\n locale: tryLocale,\n debugInfo: {\n isMissing: false,\n isFallback,\n requestedLocale: locale,\n usedLocale: tryLocale,\n },\n }\n }\n }\n\n // Last resort: use first available translation\n const firstAvailable = Object.entries(translations)[0]\n if (firstAvailable) {\n emitWarning({\n type: 'missing_translation',\n requestedLocale: locale,\n availableLocales,\n fallbackUsed: firstAvailable[0],\n })\n return {\n template: firstAvailable[1],\n locale: firstAvailable[0],\n debugInfo: {\n isMissing: false,\n isFallback: true,\n requestedLocale: locale,\n usedLocale: firstAvailable[0],\n },\n }\n }\n\n throw new Error(\n `No translation found for locale \"${locale}\". Available: ${availableLocales.join(', ')}`\n )\n}\n\n/**\n * Translate with two languages (shorthand)\n * @param ko - Korean text\n * @param en - English text\n * @param vars - Variables for interpolation\n */\nexport function it(ko: string, en: string, vars?: TranslationVars): string\n\n/**\n * Translate with multiple languages (object syntax)\n * @param translations - Translation map with locale keys\n * @param vars - Variables for interpolation\n */\nexport function it(translations: Translations, vars?: TranslationVars): string\n\nexport function it(\n first: string | Translations,\n second?: string | TranslationVars,\n third?: TranslationVars,\n): string {\n // object syntax: it({ ko: '...', en: '...' }, vars?)\n if (typeof first === 'object') {\n const translations = first\n const vars = second as TranslationVars | undefined\n const { template, locale, debugInfo } = resolveTemplate(translations)\n const result = interpolate(template, vars, locale)\n return applyDebugFormat(result, debugInfo)\n }\n\n // shorthand syntax: it('한글', 'English', vars?)\n const ko = first\n const en = second as string\n const vars = third\n\n const translations: Translations = { ko, en }\n const { template, locale, debugInfo } = resolveTemplate(translations)\n const result = interpolate(template, vars, locale)\n return applyDebugFormat(result, debugInfo)\n}\n","import type { Translations, TranslationVars } from './types'\nimport { getLocale } from './context'\nimport { interpolate } from './interpolation'\nimport { buildFallbackChain, emitWarning } from './config'\n\n/**\n * Runtime lookup function for plugin-transformed code.\n * This is called by code that has been processed by @inline-i18n-multi/babel-plugin\n * or @inline-i18n-multi/swc-plugin.\n *\n * @param _hash - Content hash (for caching/debugging, unused at runtime)\n * @param translations - Translation map with locale keys\n * @param vars - Variables for interpolation\n */\nexport function __i18n_lookup(\n _hash: string,\n translations: Translations,\n vars?: TranslationVars\n): string {\n const locale = getLocale()\n const availableLocales = Object.keys(translations)\n const fallbackChain = buildFallbackChain(locale)\n\n // Try each locale in the fallback chain\n for (const tryLocale of fallbackChain) {\n const template = translations[tryLocale]\n if (template) {\n // Warn if we had to fall back\n if (tryLocale !== locale) {\n emitWarning({\n type: 'missing_translation',\n requestedLocale: locale,\n availableLocales,\n fallbackUsed: tryLocale,\n })\n }\n return interpolate(template, vars, tryLocale)\n }\n }\n\n // Last resort: use first available translation\n const firstAvailable = Object.entries(translations)[0]\n if (firstAvailable) {\n emitWarning({\n type: 'missing_translation',\n requestedLocale: locale,\n availableLocales,\n fallbackUsed: firstAvailable[0],\n })\n return interpolate(firstAvailable[1], vars, firstAvailable[0])\n }\n\n throw new Error(\n `No translation found for locale \"${locale}\". Available: ${availableLocales.join(', ')}`\n )\n}\n\n// Register __i18n_lookup globally for plugin transformations\n// This makes it available without explicit import after bundle\nif (typeof globalThis !== 'undefined') {\n (globalThis as Record<string, unknown>).__i18n_lookup = __i18n_lookup\n}\n","import type { Locale, Translations, TranslationVars } from './types'\nimport { it } from './translate'\n\ntype PairFunction = (\n text1: string,\n text2: string,\n vars?: TranslationVars,\n) => string\n\nfunction createPair(lang1: Locale, lang2: Locale): PairFunction {\n return (text1, text2, vars) => {\n const translations: Translations = {\n [lang1]: text1,\n [lang2]: text2,\n }\n return it(translations, vars)\n }\n}\n\n// Korean combinations\nexport const it_ja = createPair('ko', 'ja')\nexport const it_zh = createPair('ko', 'zh')\nexport const it_es = createPair('ko', 'es')\nexport const it_fr = createPair('ko', 'fr')\nexport const it_de = createPair('ko', 'de')\n\n// English combinations\nexport const en_ja = createPair('en', 'ja')\nexport const en_zh = createPair('en', 'zh')\nexport const en_es = createPair('en', 'es')\nexport const en_fr = createPair('en', 'fr')\nexport const en_de = createPair('en', 'de')\n\n// Other combinations\nexport const ja_zh = createPair('ja', 'zh')\nexport const ja_es = createPair('ja', 'es')\nexport const zh_es = createPair('zh', 'es')\n","import { getLocale } from './context'\nimport type { Locale, TranslationVars } from './types'\nimport { interpolate } from './interpolation'\nimport { buildFallbackChain, emitWarning, applyDebugFormat, type DebugInfo } from './config'\n\n/**\n * Nested dictionary structure for translations\n * @example { greeting: { hello: \"Hello\", goodbye: \"Goodbye\" } }\n */\nexport type Dictionary = {\n [key: string]: string | Dictionary\n}\n\n/**\n * All loaded dictionaries by locale\n */\nexport type Dictionaries = Record<Locale, Dictionary>\n\n/**\n * Namespaced dictionaries storage\n * Structure: { namespace: { locale: Dictionary } }\n */\ntype NamespacedDictionaries = Record<string, Dictionaries>\n\n/**\n * Plural rules configuration\n */\nexport interface PluralRules {\n zero?: string\n one?: string\n two?: string\n few?: string\n many?: string\n other: string\n}\n\n// Default namespace for backward compatibility\nconst DEFAULT_NAMESPACE = 'default'\n\n// Namespace separator in keys\nconst NAMESPACE_SEPARATOR = ':'\n\n// Global dictionary storage - now namespaced\nlet namespacedDictionaries: NamespacedDictionaries = {}\n\n/**\n * Parse a key that may contain a namespace prefix\n * @example\n * parseKey('common:greeting') // { namespace: 'common', key: 'greeting' }\n * parseKey('greeting') // { namespace: 'default', key: 'greeting' }\n */\nfunction parseKey(fullKey: string): { namespace: string; key: string } {\n const separatorIndex = fullKey.indexOf(NAMESPACE_SEPARATOR)\n if (separatorIndex > 0) {\n return {\n namespace: fullKey.substring(0, separatorIndex),\n key: fullKey.substring(separatorIndex + 1),\n }\n }\n return {\n namespace: DEFAULT_NAMESPACE,\n key: fullKey,\n }\n}\n\n/**\n * Load translations from dictionary objects\n * @param dicts - Dictionary objects keyed by locale\n * @param namespace - Optional namespace (defaults to 'default')\n * @example\n * // Without namespace (backward compatible)\n * loadDictionaries({\n * en: { greeting: { hello: \"Hello\" } },\n * ko: { greeting: { hello: \"안녕하세요\" } }\n * })\n *\n * // With namespace\n * loadDictionaries({\n * en: { hello: \"Hello\" },\n * ko: { hello: \"안녕하세요\" }\n * }, 'common')\n */\nexport function loadDictionaries(dicts: Dictionaries, namespace?: string): void {\n const ns = namespace || DEFAULT_NAMESPACE\n if (!namespacedDictionaries[ns]) {\n namespacedDictionaries[ns] = {}\n }\n namespacedDictionaries[ns] = {\n ...namespacedDictionaries[ns],\n ...dicts,\n }\n}\n\n/**\n * Load a single locale's dictionary\n * @param locale - Locale code\n * @param dict - Dictionary object\n * @param namespace - Optional namespace (defaults to 'default')\n */\nexport function loadDictionary(locale: Locale, dict: Dictionary, namespace?: string): void {\n const ns = namespace || DEFAULT_NAMESPACE\n if (!namespacedDictionaries[ns]) {\n namespacedDictionaries[ns] = {}\n }\n namespacedDictionaries[ns][locale] = {\n ...namespacedDictionaries[ns][locale],\n ...dict,\n }\n}\n\n/**\n * Clear loaded dictionaries\n * @param namespace - Optional namespace to clear (clears all if not specified)\n */\nexport function clearDictionaries(namespace?: string): void {\n if (namespace) {\n delete namespacedDictionaries[namespace]\n } else {\n namespacedDictionaries = {}\n }\n}\n\n/**\n * Get a nested value from dictionary using dot notation\n * @param dict - Dictionary object\n * @param key - Dot-separated key path\n */\nfunction getNestedValue(dict: Dictionary, key: string): string | undefined {\n const parts = key.split('.')\n let current: string | Dictionary | undefined = dict\n\n for (const part of parts) {\n if (typeof current !== 'object' || current === null) {\n return undefined\n }\n current = current[part]\n if (current === undefined) {\n return undefined\n }\n }\n\n return typeof current === 'string' ? current : undefined\n}\n\n/**\n * Get plural category using Intl.PluralRules\n */\nfunction getPluralCategory(count: number, locale: Locale): Intl.LDMLPluralRule {\n const rules = new Intl.PluralRules(locale)\n return rules.select(count)\n}\n\n/**\n * Try to find a translation in a dictionary, handling plurals\n */\nfunction findInDictionary(\n dict: Dictionary,\n key: string,\n vars: TranslationVars | undefined,\n locale: Locale\n): string | undefined {\n let template = getNestedValue(dict, key)\n\n // Handle plurals if count is provided\n if (vars && typeof vars.count === 'number') {\n const pluralKey = `${key}_${getPluralCategory(vars.count, locale)}`\n const pluralTemplate = getNestedValue(dict, pluralKey)\n if (pluralTemplate) {\n template = pluralTemplate\n }\n }\n\n return template\n}\n\n/**\n * Translate using key-based lookup (i18n compatible)\n * @param key - Dot-separated translation key, optionally prefixed with namespace\n * @param vars - Variables for interpolation (including 'count' for plurals)\n * @param locale - Override locale (optional)\n * @example\n * t('greeting.hello') // Uses default namespace\n * t('common:greeting.hello') // Uses 'common' namespace\n * t('items.count', { count: 5 }) // \"5 items\"\n */\nexport function t(\n key: string,\n vars?: TranslationVars,\n locale?: Locale\n): string {\n const { namespace, key: actualKey } = parseKey(key)\n const currentLocale = locale ?? getLocale()\n const fallbackChain = buildFallbackChain(currentLocale)\n\n const nsDictionaries = namespacedDictionaries[namespace] || {}\n const availableLocales = Object.keys(nsDictionaries)\n\n let template: string | undefined\n let usedLocale: Locale | undefined\n\n // Try each locale in the fallback chain\n for (const tryLocale of fallbackChain) {\n const dict = nsDictionaries[tryLocale]\n if (!dict) continue\n\n const found = findInDictionary(dict, actualKey, vars, tryLocale)\n if (found) {\n template = found\n usedLocale = tryLocale\n break\n }\n }\n\n if (!template) {\n emitWarning({\n type: 'missing_translation',\n key,\n requestedLocale: currentLocale,\n availableLocales,\n })\n\n const debugInfo: DebugInfo = {\n isMissing: true,\n isFallback: false,\n requestedLocale: currentLocale,\n key,\n }\n return applyDebugFormat(key, debugInfo)\n }\n\n const isFallback = usedLocale !== currentLocale\n\n // Warn if we used a fallback\n if (isFallback) {\n emitWarning({\n type: 'missing_translation',\n key,\n requestedLocale: currentLocale,\n availableLocales,\n fallbackUsed: usedLocale,\n })\n }\n\n const result = interpolate(template, vars, usedLocale || currentLocale)\n\n const debugInfo: DebugInfo = {\n isMissing: false,\n isFallback,\n requestedLocale: currentLocale,\n usedLocale,\n key,\n }\n\n return applyDebugFormat(result, debugInfo)\n}\n\n/**\n * Check if a translation key exists\n * @param key - Translation key (may include namespace prefix)\n * @param locale - Optional locale to check\n */\nexport function hasTranslation(key: string, locale?: Locale): boolean {\n const { namespace, key: actualKey } = parseKey(key)\n const currentLocale = locale ?? getLocale()\n const nsDictionaries = namespacedDictionaries[namespace] || {}\n const dict = nsDictionaries[currentLocale]\n return dict ? getNestedValue(dict, actualKey) !== undefined : false\n}\n\n/**\n * Get all loaded locales\n * @param namespace - Optional namespace (returns from all if not specified)\n */\nexport function getLoadedLocales(namespace?: string): Locale[] {\n if (namespace) {\n return Object.keys(namespacedDictionaries[namespace] || {})\n }\n // Return unique locales across all namespaces\n const locales = new Set<Locale>()\n for (const ns of Object.values(namespacedDictionaries)) {\n for (const locale of Object.keys(ns)) {\n locales.add(locale)\n }\n }\n return Array.from(locales)\n}\n\n/**\n * Get dictionary for a specific locale\n * @param locale - Locale code\n * @param namespace - Optional namespace (defaults to 'default')\n */\nexport function getDictionary(locale: Locale, namespace?: string): Dictionary | undefined {\n const ns = namespace || DEFAULT_NAMESPACE\n return namespacedDictionaries[ns]?.[locale]\n}\n\n/**\n * Get all loaded namespaces\n */\nexport function getLoadedNamespaces(): string[] {\n return Object.keys(namespacedDictionaries)\n}\n"]}