inline-i18n-multi 0.2.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/README.md +166 -6
- package/dist/index.d.mts +96 -11
- package/dist/index.d.ts +96 -11
- package/dist/index.js +499 -47
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +497 -49
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/context.ts","../src/icu.ts","../src/interpolation.ts","../src/translate.ts","../src/runtime.ts","../src/pairs.ts","../src/dictionary.ts"],"names":["translations","vars","template","locale","currentLocale"],"mappings":"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","file":"index.mjs","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 isLiteralElement,\n isArgumentElement,\n isPluralElement,\n isSelectElement,\n isPoundElement,\n} from '@formatjs/icu-messageformat-parser'\n\nexport type ICUVars = Record<string, string | number>\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 // Unsupported types (number, date, time, tag) - return as-is for now\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)\nexport const ICU_PATTERN = /\\{[^}]+,\\s*(plural|select|selectordinal)\\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 { Translations, TranslationVars } from './types'\nimport { getLocale } from './context'\nimport { interpolate } from './interpolation'\n\ninterface ResolveResult {\n template: string\n locale: string\n}\n\nfunction resolveTemplate(translations: Translations): ResolveResult {\n const locale = getLocale()\n\n const template = translations[locale]\n if (template) return { template, locale }\n\n // fallback: en -> first available\n const fallback = translations.en ?? Object.values(translations)[0]\n if (fallback) return { template: fallback, locale: 'en' }\n\n throw new Error(\n `No translation found for locale \"${locale}\". Available: ${Object.keys(translations).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'\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\n const template = translations[locale]\n if (template) {\n return interpolate(template, vars)\n }\n\n // fallback: en -> first available\n const fallback = translations.en ?? Object.values(translations)[0]\n if (fallback) {\n return interpolate(fallback, vars)\n }\n\n throw new Error(\n `No translation found for locale \"${locale}\". Available: ${Object.keys(translations).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'\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 * 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 dict = dictionaries[currentLocale]\n\n if (!dict) {\n console.warn(`[inline-i18n] No dictionary loaded for locale: ${currentLocale}`)\n return key\n }\n\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, currentLocale)}`\n const pluralTemplate = getNestedValue(dict, pluralKey)\n if (pluralTemplate) {\n template = pluralTemplate\n }\n }\n\n if (!template) {\n // Try fallback to English\n const fallbackDict = dictionaries['en']\n if (fallbackDict && currentLocale !== 'en') {\n template = getNestedValue(fallbackDict, key)\n }\n }\n\n if (!template) {\n console.warn(`[inline-i18n] Missing translation: ${key} (${currentLocale})`)\n return key\n }\n\n return interpolate(template, vars, 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":["translations","vars","template","locale","debugInfo","result","currentLocale"],"mappings":"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","file":"index.mjs","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"]}
|