@hua-labs/i18n-core 2.0.5 → 2.2.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 +7 -1
- package/dist/{chunk-EZL5TNH5.mjs → chunk-7ZYOSEMW.mjs} +36 -3
- package/dist/chunk-7ZYOSEMW.mjs.map +1 -0
- package/dist/{index.js → index.cjs} +60 -18
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.mts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.mjs +25 -18
- package/dist/index.mjs.map +1 -1
- package/dist/{server-4TeBq6hp.d.mts → server-DgpyR0RE.d.mts} +27 -4
- package/dist/{server-4TeBq6hp.d.ts → server-DgpyR0RE.d.ts} +27 -4
- package/dist/{server.js → server.cjs} +2 -2
- package/dist/server.cjs.map +1 -0
- package/dist/server.d.mts +1 -1
- package/dist/server.d.ts +1 -1
- package/dist/server.mjs +1 -1
- package/package.json +13 -10
- package/src/components/MissingKeyOverlay.tsx +6 -4
- package/src/core/translator.tsx +7 -7
- package/src/hooks/useI18n.tsx +52 -36
- package/src/index.ts +5 -2
- package/src/types/index.ts +59 -2
- package/dist/chunk-EZL5TNH5.mjs.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/server.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/types/index.ts","../src/core/translator.tsx","../src/core/translator-factory.ts","../src/utils/default-translations.ts","../src/hooks/useI18n.tsx","../src/hooks/useTranslation.tsx","../src/index.ts"],"names":["key","createContext","useState","useEffect","useMemo","useCallback","error","parseKey","value","jsx","useContext","React"],"mappings":"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","file":"index.cjs","sourcesContent":["// ---------------------------------------------------------------------------\n// Plural (ICU / Intl.PluralRules)\n// ---------------------------------------------------------------------------\nexport type PluralCategory = 'zero' | 'one' | 'two' | 'few' | 'many' | 'other';\n\nexport interface PluralValue {\n zero?: string;\n one?: string;\n two?: string;\n few?: string;\n many?: string;\n other: string; // 필수\n}\n\nconst PLURAL_CATEGORIES = new Set<string>(['zero', 'one', 'two', 'few', 'many', 'other']);\n\nexport function isPluralValue(value: unknown): value is PluralValue {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return false;\n const obj = value as Record<string, unknown>;\n const keys = Object.keys(obj);\n return (\n keys.length > 0 &&\n keys.every(k => PLURAL_CATEGORIES.has(k)) &&\n Object.values(obj).every(v => typeof v === 'string') &&\n typeof obj.other === 'string'\n );\n}\n\n// ---------------------------------------------------------------------------\n// Platform Adapter (cross-platform: Web / React Native / Flutter bridge)\n// ---------------------------------------------------------------------------\n\n/**\n * 플랫폼별 i18n 어댑터 인터페이스.\n *\n * Web(기본), React Native, Flutter 브릿지 등 환경에 맞는 구현체를 주입.\n * I18nConfig.platformAdapter로 전달하면 useI18n이 자동으로 사용한다.\n */\nexport interface I18nPlatformAdapter {\n /** 디바이스/브라우저 언어 코드 (e.g. 'ko', 'en'). 감지 불가 시 undefined */\n getDeviceLanguage(): string | undefined;\n\n /** 시스템 언어 변경 이벤트 구독. 해제 함수 반환 */\n onLanguageChange(cb: (lang: string) => void): () => void;\n}\n\n/**\n * Web 기본 어댑터.\n * navigator.language + CustomEvent 기반. SSR에서는 안전하게 no-op.\n */\nexport const webPlatformAdapter: I18nPlatformAdapter = {\n getDeviceLanguage() {\n if (typeof globalThis !== 'undefined' && typeof navigator !== 'undefined' && navigator.language) {\n return navigator.language.slice(0, 2).toLowerCase();\n }\n return undefined;\n },\n onLanguageChange(cb) {\n if (typeof globalThis === 'undefined' || typeof window === 'undefined' || typeof CustomEvent === 'undefined') {\n return () => {};\n }\n const handler = (e: Event) => {\n const lang = (e as CustomEvent).detail;\n if (typeof lang === 'string') cb(lang);\n };\n window.addEventListener('huaI18nLanguageChange', handler);\n window.addEventListener('i18nLanguageChanged', handler);\n return () => {\n window.removeEventListener('huaI18nLanguageChange', handler);\n window.removeEventListener('i18nLanguageChanged', handler);\n };\n },\n};\n\n/**\n * Headless 어댑터 (SSR / 테스트 / Flutter 브릿지용).\n * 언어 감지·이벤트 없이 config.defaultLanguage만 사용.\n */\nexport const headlessPlatformAdapter: I18nPlatformAdapter = {\n getDeviceLanguage() { return undefined; },\n onLanguageChange() { return () => {}; },\n};\n\n// ---------------------------------------------------------------------------\n// Translation namespace\n// ---------------------------------------------------------------------------\nexport interface TranslationNamespace {\n [key: string]: string | string[] | PluralValue | TranslationNamespace;\n}\n\nexport interface TranslationData {\n [namespace: string]: TranslationNamespace;\n}\n\nexport interface LanguageConfig {\n code: string;\n name: string;\n nativeName: string;\n tone?: 'emotional' | 'encouraging' | 'calm' | 'gentle' | 'formal' | 'technical' | 'informal';\n formality?: 'informal' | 'casual' | 'formal' | 'polite';\n}\n\n// 더 구체적인 설정 타입 정의\nexport interface I18nConfig {\n defaultLanguage: string;\n fallbackLanguage?: string;\n supportedLanguages: LanguageConfig[];\n namespaces?: string[];\n loadTranslations: (language: string, namespace: string) => Promise<TranslationNamespace>;\n // SSR에서 전달된 초기 번역 데이터 (네트워크 요청 없이 사용)\n initialTranslations?: Record<string, Record<string, TranslationNamespace>>;\n // 개발 모드 설정\n debug?: boolean;\n // 번역 키가 없을 때의 동작\n missingKeyHandler?: (key: string, language: string, namespace: string) => string;\n // 번역 로딩 실패 시 동작\n errorHandler?: (error: Error, language: string, namespace: string) => void;\n // 캐시 설정\n cacheOptions?: {\n maxSize?: number;\n ttl?: number; // Time to live in milliseconds\n };\n // 성능 설정\n performanceOptions?: {\n preloadAll?: boolean;\n lazyLoad?: boolean;\n };\n // 에러 처리 설정\n errorHandling?: {\n recoveryStrategy?: ErrorRecoveryStrategy;\n logging?: ErrorLoggingConfig;\n userFriendlyMessages?: boolean;\n suppressErrors?: boolean;\n };\n // 자동 언어 전환 이벤트 처리 (withDefaultConfig용)\n autoLanguageSync?: boolean;\n // 플랫폼 어댑터 (기본: webPlatformAdapter)\n platformAdapter?: I18nPlatformAdapter;\n}\n\n// 에러 타입 정의\nexport interface TranslationError extends Error {\n code: 'MISSING_KEY' | 'LOAD_FAILED' | 'INVALID_KEY' | 'NETWORK_ERROR' | 'INITIALIZATION_ERROR' | 'VALIDATION_ERROR' | 'CACHE_ERROR' | 'FALLBACK_LOAD_FAILED' | 'INITIALIZATION_FAILED' | 'RETRY_FAILED';\n language?: string;\n namespace?: string;\n key?: string;\n originalError?: Error;\n retryCount?: number;\n maxRetries?: number;\n timestamp: number;\n context?: Record<string, unknown>;\n}\n\n// 에러 복구 전략\nexport interface ErrorRecoveryStrategy {\n maxRetries: number;\n retryDelay: number; // milliseconds\n backoffMultiplier: number;\n shouldRetry: (error: TranslationError) => boolean;\n onRetry: (error: TranslationError, attempt: number) => void;\n onMaxRetriesExceeded: (error: TranslationError) => void;\n}\n\n// 에러 로깅 설정\nexport interface ErrorLoggingConfig {\n enabled: boolean;\n level: 'error' | 'warn' | 'info' | 'debug';\n includeStack: boolean;\n includeContext: boolean;\n customLogger?: (error: TranslationError) => void;\n}\n\n// 사용자 친화적 에러 메시지\nexport interface UserFriendlyError {\n code: string;\n message: string;\n suggestion?: string;\n action?: string;\n severity: 'low' | 'medium' | 'high' | 'critical';\n}\n\n// 캐시 엔트리 타입\nexport interface CacheEntry {\n data: TranslationNamespace;\n timestamp: number;\n ttl: number;\n}\n\n// 로딩 상태 타입\nexport interface LoadingState {\n isLoading: boolean;\n error: TranslationError | null;\n progress?: {\n loaded: number;\n total: number;\n };\n}\n\n// 번역 결과 타입\nexport interface TranslationResult {\n text: string;\n language: string;\n namespace: string;\n key: string;\n isFallback: boolean;\n cacheHit: boolean;\n}\n\nexport interface I18nContextType {\n currentLanguage: string;\n setLanguage: (language: string) => void | Promise<void>;\n // 통합 번역 함수: t(key), t(key, language), t(key, params), t(key, params, language)\n t: (key: ResolveStringKey, paramsOrLang?: TranslationParams | string, language?: string) => string;\n // 복수형 번역 함수: tPlural(key, count), tPlural(key, count, params), tPlural(key, count, params, language)\n tPlural: (key: ResolvePluralKey, count: number, params?: Record<string, unknown>, language?: string) => string;\n // 기존 비동기 번역 함수 (하위 호환성)\n tAsync: (key: string, params?: TranslationParams) => Promise<string>;\n // 기존 동기 번역 함수 (하위 호환성)\n tSync: (key: string, namespace?: string, params?: TranslationParams) => string;\n // 원시 값 가져오기 (배열, 객체 포함) — 제네릭으로 타입 캐스팅 가능\n getRawValue: <T = unknown>(key: string, language?: string) => T | undefined;\n // 배열 번역 값 가져오기 (타입 안전)\n tArray: (key: ResolveArrayKey, language?: string) => string[];\n isLoading: boolean;\n error: TranslationError | null;\n supportedLanguages: LanguageConfig[];\n // 초기화 상태\n isInitialized: boolean;\n // 개발자 도구\n debug: {\n getCurrentLanguage: () => string;\n getSupportedLanguages: () => string[];\n getLoadedNamespaces: () => string[];\n getAllTranslations: () => Record<string, Record<string, unknown>>;\n isReady: () => boolean;\n getInitializationError: () => TranslationError | null;\n clearCache: () => void;\n reloadTranslations: () => Promise<void>;\n getCacheStats: () => {\n size: number;\n hits: number;\n misses: number;\n };\n };\n}\n\nexport interface TranslationParams {\n [key: string]: string | number;\n}\n\n/**\n * 타입 안전한 번역 키를 위한 augmentation point.\n *\n * 앱에서 declaration merging으로 좁힐 수 있음:\n * ```ts\n * declare module '@hua-labs/i18n-core' {\n * interface TypedTranslationKeys {\n * stringKey: TranslationStringKey;\n * arrayKey: TranslationArrayKey;\n * }\n * }\n * ```\n *\n * augmentation이 없으면 string으로 fallback (breaking 없음).\n */\n \nexport interface TypedTranslationKeys {}\n\n/** augmentation 시 좁혀진 타입, 미설정 시 string */\nexport type ResolveStringKey = TypedTranslationKeys extends { stringKey: infer K } ? K & string : string;\nexport type ResolveArrayKey = TypedTranslationKeys extends { arrayKey: infer K } ? K & string : string;\nexport type ResolvePluralKey = TypedTranslationKeys extends { pluralKey: infer K } ? K & string : string;\n\n// 타입 안전한 번역 키 시스템 (단순화된 버전)\nexport type TranslationKey<T> = T extends Record<string, unknown>\n ? {\n [K in keyof T]: T[K] extends string\n ? K\n : T[K] extends Record<string, unknown>\n ? `${K & string}.${TranslationKey<T[K]> & string}`\n : never;\n }[keyof T]\n : never;\n\n// 타입 안전한 번역 함수들\nexport interface TypedI18nContextType<T extends TranslationData> extends Omit<I18nContextType, 't' | 'tSync'> {\n // 타입 안전한 번역 함수\n t: <K extends TranslationKey<T>>(key: K, paramsOrLang?: TranslationParams | string, language?: string) => string;\n tSync: <K extends TranslationKey<T>>(key: K, namespace?: string, params?: TranslationParams) => string;\n}\n\n// 간단한 번역 키 타입 (무한 재귀 방지)\nexport type SimpleTranslationKey = string;\n\n// 고급 번역 키 타입 (제한된 깊이)\nexport type TranslationKeyLegacy<T extends Record<string, unknown>, D extends number = 3> = \n [D] extends [never] \n ? never \n : T extends Record<string, unknown>\n ? {\n [K in keyof T]: T[K] extends string \n ? K \n : T[K] extends Record<string, unknown>\n ? `${K & string}.${TranslationKeyLegacy<T[K], Prev<D>> & string}` \n : never;\n }[keyof T]\n : never;\n\ntype Prev<T extends number> = T extends 0 ? never : T extends 1 ? 0 : T extends 2 ? 1 : T extends 3 ? 2 : never;\n\n// 유틸리티 타입들\nexport type ExtractTranslationKeys<T> = T extends Record<string, unknown>\n ? {\n [K in keyof T]: T[K] extends string\n ? K\n : T[K] extends Record<string, unknown>\n ? `${K & string}.${ExtractTranslationKeys<T[K]> & string}`\n : never;\n }[keyof T]\n : never;\n\n// 네임스페이스별 타입 정의를 위한 헬퍼\nexport type NamespaceKeys<T extends TranslationData, N extends keyof T> = ExtractTranslationKeys<T[N]>;\n\n// 타입 안전한 번역 키 생성 헬퍼\nexport const createTranslationKey = <T extends TranslationData, N extends keyof T, K extends NamespaceKeys<T, N>>(\n namespace: N,\n key: K\n): `${N & string}.${K & string}` => `${String(namespace)}.${String(key)}` as `${N & string}.${K & string}`; \n\n// 타입 가드 함수들\nexport function isTranslationNamespace(value: unknown): value is TranslationNamespace {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nexport function isLanguageConfig(value: unknown): value is LanguageConfig {\n return (\n typeof value === 'object' &&\n value !== null &&\n typeof (value as LanguageConfig).code === 'string' &&\n typeof (value as LanguageConfig).name === 'string' &&\n typeof (value as LanguageConfig).nativeName === 'string'\n );\n}\n\nexport function isTranslationError(value: unknown): value is TranslationError {\n return (\n value instanceof Error &&\n typeof (value as TranslationError).code === 'string' &&\n ['MISSING_KEY', 'LOAD_FAILED', 'INVALID_KEY', 'NETWORK_ERROR', 'INITIALIZATION_ERROR'].includes(\n (value as TranslationError).code\n )\n );\n}\n\n// 설정 검증 함수\nexport function validateI18nConfig(config: unknown): config is I18nConfig {\n if (!config || typeof config !== 'object') {\n return false;\n }\n\n const c = config as I18nConfig;\n \n return (\n typeof c.defaultLanguage === 'string' &&\n Array.isArray(c.supportedLanguages) &&\n c.supportedLanguages.every(isLanguageConfig) &&\n typeof c.loadTranslations === 'function'\n );\n}\n\n// 에러 처리 유틸리티 함수들\nexport function createTranslationError(\n code: TranslationError['code'],\n message: string,\n originalError?: Error,\n context?: {\n language?: string;\n namespace?: string;\n key?: string;\n retryCount?: number;\n maxRetries?: number;\n }\n): TranslationError {\n const error = new Error(message) as TranslationError;\n error.code = code;\n error.language = context?.language;\n error.namespace = context?.namespace;\n error.key = context?.key;\n error.originalError = originalError;\n error.retryCount = context?.retryCount || 0;\n error.maxRetries = context?.maxRetries || 3;\n error.timestamp = Date.now();\n error.name = 'TranslationError';\n return error;\n}\n\n// 사용자 친화적 에러 메시지 생성\nexport function createUserFriendlyError(error: TranslationError): UserFriendlyError {\n const errorMessages: Record<TranslationError['code'], UserFriendlyError> = {\n MISSING_KEY: {\n code: 'MISSING_KEY',\n message: '번역 키를 찾을 수 없습니다',\n suggestion: '번역 파일에 해당 키가 있는지 확인해주세요',\n action: '번역 파일 업데이트',\n severity: 'low'\n },\n LOAD_FAILED: {\n code: 'LOAD_FAILED',\n message: '번역 파일을 불러오는데 실패했습니다',\n suggestion: '네트워크 연결과 파일 경로를 확인해주세요',\n action: '재시도',\n severity: 'medium'\n },\n INVALID_KEY: {\n code: 'INVALID_KEY',\n message: '잘못된 번역 키 형식입니다',\n suggestion: '키 형식을 \"namespace.key\" 형태로 입력해주세요',\n action: '키 형식 수정',\n severity: 'low'\n },\n NETWORK_ERROR: {\n code: 'NETWORK_ERROR',\n message: '네트워크 오류가 발생했습니다',\n suggestion: '인터넷 연결을 확인하고 다시 시도해주세요',\n action: '재시도',\n severity: 'high'\n },\n INITIALIZATION_ERROR: {\n code: 'INITIALIZATION_ERROR',\n message: '번역 시스템 초기화에 실패했습니다',\n suggestion: '설정을 확인하고 페이지를 새로고침해주세요',\n action: '페이지 새로고침',\n severity: 'critical'\n },\n VALIDATION_ERROR: {\n code: 'VALIDATION_ERROR',\n message: '설정 검증에 실패했습니다',\n suggestion: '번역 설정을 확인해주세요',\n action: '설정 수정',\n severity: 'medium'\n },\n CACHE_ERROR: {\n code: 'CACHE_ERROR',\n message: '캐시 처리 중 오류가 발생했습니다',\n suggestion: '캐시를 초기화하고 다시 시도해주세요',\n action: '캐시 초기화',\n severity: 'low'\n },\n FALLBACK_LOAD_FAILED: {\n code: 'FALLBACK_LOAD_FAILED',\n message: '폴백 언어 로딩에 실패했습니다',\n suggestion: '폴백 언어 파일을 확인해주세요',\n action: '폴백 언어 파일 수정',\n severity: 'medium'\n },\n INITIALIZATION_FAILED: {\n code: 'INITIALIZATION_FAILED',\n message: '초기화에 실패했습니다',\n suggestion: '설정을 확인하고 다시 시도해주세요',\n action: '설정 확인',\n severity: 'critical'\n },\n RETRY_FAILED: {\n code: 'RETRY_FAILED',\n message: '재시도에 실패했습니다',\n suggestion: '네트워크 연결을 확인해주세요',\n action: '재시도',\n severity: 'high'\n }\n };\n\n return errorMessages[error.code];\n}\n\n// 에러 복구 가능 여부 확인\nexport function isRecoverableError(error: TranslationError): boolean {\n const recoverableCodes: TranslationError['code'][] = [\n 'LOAD_FAILED',\n 'NETWORK_ERROR',\n 'CACHE_ERROR'\n ];\n \n return recoverableCodes.includes(error.code) && \n (error.retryCount || 0) < (error.maxRetries || 3);\n}\n\n// 기본 에러 복구 전략\nexport const defaultErrorRecoveryStrategy: ErrorRecoveryStrategy = {\n maxRetries: 3,\n retryDelay: 1000,\n backoffMultiplier: 2,\n shouldRetry: isRecoverableError,\n onRetry: (error: TranslationError, attempt: number) => {\n if (process.env.NODE_ENV !== 'production') console.warn(`Retrying translation operation (attempt ${attempt}/${error.maxRetries}):`, error.message);\n },\n onMaxRetriesExceeded: (error: TranslationError) => {\n console.error('Max retries exceeded for translation operation:', error.message);\n }\n};\n\n// 기본 에러 로깅 설정\nexport const defaultErrorLoggingConfig: ErrorLoggingConfig = {\n enabled: true,\n level: 'error',\n includeStack: true,\n includeContext: true,\n customLogger: undefined\n};\n\n// 에러 로깅 함수\nexport function logTranslationError(\n error: TranslationError, \n config: ErrorLoggingConfig = defaultErrorLoggingConfig\n): void {\n if (!config.enabled) return;\n\n const logData: Record<string, unknown> = {\n code: error.code,\n message: error.message,\n timestamp: error.timestamp,\n retryCount: error.retryCount,\n maxRetries: error.maxRetries\n };\n\n if (config.includeContext) {\n logData.language = error.language;\n logData.namespace = error.namespace;\n logData.key = error.key;\n logData.context = error.context;\n }\n\n if (config.includeStack && error.stack) {\n logData.stack = error.stack;\n }\n\n if (config.customLogger) {\n config.customLogger(error);\n } else {\n switch (config.level) {\n case 'error':\n console.error('Translation Error:', logData);\n break;\n case 'warn':\n if (process.env.NODE_ENV !== 'production') console.warn('Translation Warning:', logData);\n break;\n case 'info':\n console.info('Translation Info:', logData);\n break;\n case 'debug':\n console.debug('Translation Debug:', logData);\n break;\n }\n }\n} ","import {\n I18nConfig,\n TranslationNamespace,\n TranslationError,\n CacheEntry,\n TranslationResult,\n isTranslationNamespace,\n validateI18nConfig,\n createTranslationError,\n logTranslationError,\n defaultErrorRecoveryStrategy,\n defaultErrorLoggingConfig,\n isRecoverableError,\n isPluralValue,\n PluralCategory\n} from '../types';\n\nexport interface TranslatorInterface {\n translate(key: string, paramsOrLang?: Record<string, unknown> | string, language?: string): string;\n tPlural(key: string, count: number, params?: Record<string, unknown>, language?: string): string;\n setLanguage(lang: string): void;\n getCurrentLanguage(): string;\n initialize(): Promise<void>;\n isReady(): boolean;\n debug(): unknown;\n getRawValue<T = unknown>(key: string, language?: string): T | undefined;\n tArray(key: string, language?: string): string[];\n}\n\nexport class Translator implements TranslatorInterface {\n private cache = new Map<string, CacheEntry>();\n private pluralRulesCache = new Map<string, Intl.PluralRules>();\n private loadedNamespaces = new Set<string>();\n private loadingPromises = new Map<string, Promise<TranslationNamespace>>();\n private allTranslations: Record<string, Record<string, TranslationNamespace>> = {};\n private isInitialized = false;\n private initializationError: TranslationError | null = null;\n private config: I18nConfig;\n private currentLang: string = 'en';\n private cacheStats = {\n hits: 0,\n misses: 0,\n };\n // 번역 로드 완료 시 React 리렌더링을 위한 콜백\n private onTranslationLoadedCallbacks: Set<() => void> = new Set();\n // 언어 변경 시 React 리렌더링을 위한 콜백\n private onLanguageChangedCallbacks: Set<(language: string) => void> = new Set();\n // 디바운싱을 위한 타이머\n private notifyTimer: ReturnType<typeof setTimeout> | null = null;\n // 최근 알림한 네임스페이스 (중복 알림 방지)\n private recentlyNotified = new Set<string>();\n \n /**\n * 번역 로드 완료 콜백 등록\n */\n onTranslationLoaded(callback: () => void): () => void {\n this.onTranslationLoadedCallbacks.add(callback);\n return () => {\n this.onTranslationLoadedCallbacks.delete(callback);\n };\n }\n\n /**\n * 언어 변경 콜백 등록\n */\n onLanguageChanged(callback: (language: string) => void): () => void {\n this.onLanguageChangedCallbacks.add(callback);\n return () => {\n this.onLanguageChangedCallbacks.delete(callback);\n };\n }\n\n /**\n * 언어 변경 이벤트 발생\n */\n private notifyLanguageChanged(language: string): void {\n this.onLanguageChangedCallbacks.forEach(callback => {\n try {\n callback(language);\n } catch (error) {\n if (this.config.debug) {\n console.error('Error in language changed callback:', error);\n }\n }\n });\n }\n \n /**\n * 번역 로드 완료 이벤트 발생 (디바운싱 적용)\n */\n private notifyTranslationLoaded(language: string, namespace: string): void {\n const cacheKey = `${language}:${namespace}`;\n \n // 최근에 알림한 네임스페이스는 스킵 (중복 알림 방지)\n if (this.recentlyNotified.has(cacheKey)) {\n return;\n }\n \n this.recentlyNotified.add(cacheKey);\n \n // 디바운싱: 짧은 시간 내 여러 번역이 로드되면 한 번만 알림\n if (this.notifyTimer) {\n clearTimeout(this.notifyTimer);\n }\n \n this.notifyTimer = setTimeout(() => {\n this.onTranslationLoadedCallbacks.forEach(callback => {\n try {\n callback();\n } catch (error) {\n if (this.config.debug) {\n console.warn('Error in translation loaded callback:', error);\n }\n }\n });\n \n // 100ms 후 recentlyNotified 초기화 (같은 네임스페이스도 다시 알림 가능하도록)\n setTimeout(() => {\n this.recentlyNotified.clear();\n }, 100);\n \n this.notifyTimer = null;\n }, 50); // 50ms 디바운싱\n }\n\n constructor(config: I18nConfig) {\n if (!validateI18nConfig(config)) {\n throw new Error('Invalid I18nConfig provided');\n }\n\n this.config = {\n fallbackLanguage: 'en',\n namespaces: ['common'],\n debug: false,\n missingKeyHandler: (key: string) => key,\n errorHandler: (error: Error) => {\n // Silent by default, user can override\n },\n ...config\n };\n this.currentLang = config.defaultLanguage;\n \n // SSR에서 전달된 초기 번역 데이터가 있으면 즉시 설정 (네트워크 요청 없음)\n if (config.initialTranslations) {\n this.allTranslations = config.initialTranslations;\n // 로드된 네임스페이스 마킹\n for (const [language, namespaces] of Object.entries(config.initialTranslations)) {\n for (const namespace of Object.keys(namespaces)) {\n this.loadedNamespaces.add(`${language}:${namespace}`);\n }\n }\n // initialTranslations가 있으면 초기화 완료로 간주 (SSR에서 이미 로드됨)\n // 이렇게 하면 초기화 전 상태에서도 번역을 사용할 수 있음\n this.isInitialized = true;\n }\n }\n\n /**\n * 모든 번역 데이터를 미리 로드 (hua-api 스타일)\n */\n async initialize(): Promise<void> {\n if (this.isInitialized) {\n if (this.config.debug) {\n console.log('🚫 [TRANSLATOR] Already initialized, skipping');\n }\n return;\n }\n\n if (this.config.debug) {\n console.log('🚀 [TRANSLATOR] Starting initialization...');\n }\n\n try {\n // Ensure allTranslations is initialized\n if (!this.allTranslations) {\n this.allTranslations = {};\n }\n\n const languages = [this.currentLang];\n if (this.config.fallbackLanguage && this.config.fallbackLanguage !== this.currentLang) {\n languages.push(this.config.fallbackLanguage);\n }\n \n // 초기 번역 데이터가 이미 있으면 해당 네임스페이스는 스킵\n const skipNamespaces = new Set<string>();\n for (const language of languages) {\n if (this.allTranslations[language]) {\n for (const namespace of Object.keys(this.allTranslations[language])) {\n skipNamespaces.add(`${language}:${namespace}`);\n }\n }\n }\n\n if (this.config.debug) {\n console.log('🌍 [TRANSLATOR] Initializing translator with languages:', languages);\n console.log('📍 [TRANSLATOR] Current language:', this.currentLang);\n console.log('📦 [TRANSLATOR] Config namespaces:', this.config.namespaces);\n }\n\n for (const language of languages) {\n if (this.config.debug) {\n console.log('Processing language:', language);\n }\n\n if (!this.allTranslations[language]) {\n this.allTranslations[language] = {};\n }\n\n for (const namespace of this.config.namespaces || []) {\n const cacheKey = `${language}:${namespace}`;\n \n // 이미 초기 번역 데이터가 있으면 스킵 (네트워크 요청 없음)\n if (skipNamespaces.has(cacheKey)) {\n if (this.config.debug) {\n console.log('⏭️ [TRANSLATOR] Skipping', namespace, 'for', language, '(already loaded from SSR)');\n }\n continue;\n }\n \n if (this.config.debug) {\n console.log('Loading namespace:', namespace, 'for language:', language);\n }\n\n try {\n const data = await this.safeLoadTranslations(language, namespace);\n\n if (this.config.debug) {\n console.log('Loaded data for', language, namespace, ':', data);\n }\n\n this.allTranslations[language][namespace] = data;\n this.loadedNamespaces.add(`${language}:${namespace}`);\n\n } catch (error) {\n const translationError = this.createTranslationError(\n 'LOAD_FAILED',\n error as Error,\n language,\n namespace\n );\n\n this.logError(translationError);\n\n // 복구 가능한 에러인지 확인\n if (isRecoverableError(translationError)) {\n // 폴백 언어로 시도\n if (language !== this.config.fallbackLanguage) {\n try {\n const fallbackData = await this.safeLoadTranslations(this.config.fallbackLanguage || 'en', namespace);\n this.allTranslations[language][namespace] = fallbackData;\n this.loadedNamespaces.add(`${language}:${namespace}`);\n\n if (this.config.debug) {\n console.log('Using fallback data for', language, namespace);\n }\n } catch (fallbackError) {\n const fallbackTranslationError = this.createTranslationError(\n 'FALLBACK_LOAD_FAILED',\n fallbackError as Error,\n this.config.fallbackLanguage,\n namespace\n );\n\n this.logError(fallbackTranslationError);\n\n // 기본 번역 데이터 사용\n this.allTranslations[language][namespace] = {};\n }\n } else {\n // 기본 번역 데이터 사용\n this.allTranslations[language][namespace] = {};\n }\n } else {\n // 복구 불가능한 에러는 기본 번역 데이터 사용\n this.allTranslations[language][namespace] = {};\n }\n }\n }\n }\n\n this.isInitialized = true;\n\n if (this.config.debug) {\n console.log('Translator initialized successfully');\n console.log('Loaded translations:', this.allTranslations);\n }\n\n } catch (error) {\n this.initializationError = this.createTranslationError(\n 'INITIALIZATION_FAILED',\n error as Error\n );\n\n this.logError(this.initializationError);\n\n // 에러가 발생해도 초기화 완료로 표시 (기본 번역 사용)\n this.isInitialized = true;\n\n if (this.config.debug) {\n console.warn('Translator initialized with errors, using fallback translations');\n }\n }\n }\n\n /**\n * 초기화되지 않은 상태에서 번역 시도\n */\n private translateBeforeInitialized(key: string, targetLang: string): string {\n if (this.config.debug) {\n console.warn('Translator not initialized. Call initialize() first.');\n }\n \n // 초기화되지 않았을 때도 기본 번역 시도 (initialTranslations 사용)\n const { namespace, key: actualKey } = this.parseKey(key);\n \n // findInNamespace를 사용하여 중첩 키도 처리\n const result = this.findInNamespace(namespace, actualKey, targetLang);\n if (result) {\n if (this.config.debug) {\n console.log(`✅ [TRANSLATOR] Found fallback translation from initialTranslations:`, result);\n }\n return result;\n }\n \n if (this.config.debug) {\n const translations = this.allTranslations[targetLang]?.[namespace];\n console.log(`🔍 [TRANSLATOR] Not initialized, fallback failed:`, {\n namespace,\n actualKey,\n hasTranslations: !!translations,\n translationsKeys: translations ? Object.keys(translations) : []\n });\n }\n return this.config.missingKeyHandler?.(key, targetLang, 'default') || key;\n }\n\n /**\n * 다른 로드된 언어에서 번역 찾기 (언어 변경 중 깜빡임 방지)\n */\n private findInOtherLanguages(namespace: string, key: string, targetLang: string): string | null {\n if (!this.allTranslations || Object.keys(this.allTranslations).length === 0) {\n return null;\n }\n\n const loadedLanguages = Object.keys(this.allTranslations);\n for (const lang of loadedLanguages) {\n if (lang !== targetLang) {\n const result = this.findInNamespace(namespace, key, lang);\n if (result) {\n return result;\n }\n }\n }\n \n return null;\n }\n\n /**\n * 폴백 언어에서 번역 찾기\n */\n private findInFallbackLanguage(namespace: string, key: string, targetLang: string): string | null {\n const fallbackLang = this.config.fallbackLanguage || 'en';\n if (targetLang === fallbackLang) {\n return null;\n }\n\n const result = this.findInNamespace(namespace, key, fallbackLang);\n if (result) {\n this.cacheStats.hits++;\n return result;\n }\n \n return null;\n }\n\n /**\n * 번역 키를 번역된 텍스트로 변환\n */\n translate(key: string, paramsOrLang?: Record<string, unknown> | string, language?: string): string {\n // 두 번째 인자 타입으로 분기\n let params: Record<string, unknown> | undefined;\n let targetLang: string;\n if (typeof paramsOrLang === 'string') {\n targetLang = paramsOrLang;\n } else if (typeof paramsOrLang === 'object' && paramsOrLang !== null) {\n params = paramsOrLang;\n targetLang = language || this.currentLang;\n } else {\n targetLang = this.currentLang;\n }\n\n // 초기화되지 않은 경우 처리\n if (!this.isInitialized) {\n const raw = this.translateBeforeInitialized(key, targetLang);\n return params ? this.interpolate(raw, params) : raw;\n }\n\n const { namespace, key: actualKey } = this.parseKey(key);\n\n // 1단계: 현재 언어에서 찾기\n let result: string | null = this.findInNamespace(namespace, actualKey, targetLang);\n if (result) {\n this.cacheStats.hits++;\n return params ? this.interpolate(result, params) : result;\n }\n\n // 2단계: 다른 로드된 언어에서 찾기 (언어 변경 중 깜빡임 방지)\n result = this.findInOtherLanguages(namespace, actualKey, targetLang);\n if (result) {\n return params ? this.interpolate(result, params) : result;\n }\n\n // 3단계: 폴백 언어에서 찾기\n result = this.findInFallbackLanguage(namespace, actualKey, targetLang);\n if (result) {\n return params ? this.interpolate(result, params) : result;\n }\n\n // 모든 단계에서 찾지 못한 경우\n this.cacheStats.misses++;\n\n if (this.config.debug) {\n const missing = this.config.missingKeyHandler?.(key, targetLang, namespace) || key;\n return params ? this.interpolate(missing, params) : missing;\n }\n\n // 프로덕션에서는 빈 문자열 반환 (미싱 키 노출 방지)\n return '';\n }\n\n /**\n * 네임스페이스에서 키 찾기\n */\n private findInNamespace(namespace: string, key: string, language: string): string {\n const translations = this.allTranslations[language]?.[namespace];\n\n if (!translations) {\n // 네임스페이스가 없으면 자동으로 로드 시도 (비동기, 백그라운드)\n const cacheKey = `${language}:${namespace}`;\n if (!this.loadedNamespaces.has(cacheKey) && !this.loadingPromises.has(cacheKey)) {\n // 로딩 시작 (비동기, 즉시 반환하지 않음)\n this.loadTranslationData(language, namespace).catch(error => {\n if (this.config.debug) {\n console.warn(`⚠️ [TRANSLATOR] Auto-load failed for ${language}/${namespace}:`, error);\n }\n });\n \n // 디버그 모드에서만 첫 시도 시에만 경고 출력 (중복 방지)\n if (this.config.debug) {\n console.warn(`❌ [TRANSLATOR] No translations found for ${language}/${namespace}, attempting auto-load...`);\n }\n }\n return '';\n }\n\n // 직접 키 매칭\n const directValue = translations[key];\n if (this.isStringValue(directValue)) {\n return directValue;\n }\n if (this.isStringArray(directValue)) {\n return directValue[Math.floor(Math.random() * directValue.length)];\n }\n\n // 중첩 키 매칭 (예: \"user.profile.name\")\n const nestedValue = this.getNestedValue(translations, key);\n if (this.isStringValue(nestedValue)) {\n return nestedValue;\n }\n if (this.isStringArray(nestedValue)) {\n return nestedValue[Math.floor(Math.random() * nestedValue.length)];\n }\n\n if (this.config.debug) {\n console.warn(`❌ [TRANSLATOR] No match found for key: ${key} in ${language}/${namespace}`);\n }\n return '';\n }\n\n /**\n * 중첩된 객체에서 값을 가져오기\n * 배열도 지원: 최종 값이 string[]이면 그대로 반환\n */\n private getNestedValue(obj: unknown, path: string): unknown {\n if (typeof obj !== 'object' || obj === null || Array.isArray(obj)) {\n return undefined;\n }\n\n return path.split('.').reduce((current: unknown, key: string) => {\n if (current == null) return undefined;\n if (Array.isArray(current)) {\n const idx = Number(key);\n return Number.isInteger(idx) ? current[idx] : undefined;\n }\n if (typeof current === 'object' && key in (current as Record<string, unknown>)) {\n return (current as Record<string, unknown>)[key];\n }\n return undefined;\n }, obj);\n }\n \n /**\n * 문자열 값인지 확인하는 타입 가드\n */\n private isStringValue(value: unknown): value is string {\n return typeof value === 'string' && value.length > 0;\n }\n\n /**\n * string[] 배열인지 확인하는 타입 가드\n * 배열 값이 t()에 전달되면 랜덤으로 하나를 선택하여 반환\n */\n private isStringArray(value: unknown): value is string[] {\n return Array.isArray(value) && value.length > 0 && value.every(v => typeof v === 'string');\n }\n\n /**\n * 원시 값 가져오기 (배열, 객체 포함)\n */\n getRawValue<T = unknown>(key: string, language?: string): T | undefined {\n const targetLang = language || this.currentLang;\n\n if (!this.isInitialized) {\n if (this.config.debug) {\n console.warn('Translator not initialized. Call initialize() first.');\n }\n return undefined;\n }\n\n const { namespace, key: actualKey } = this.parseKey(key);\n const translations = this.allTranslations[targetLang]?.[namespace];\n\n if (!translations) {\n return undefined;\n }\n\n // 직접 키 매칭\n if (actualKey in translations) {\n return translations[actualKey] as T;\n }\n\n // 중첩 키 매칭\n const nestedValue = this.getNestedValue(translations, actualKey);\n if (nestedValue !== undefined) {\n return nestedValue as T;\n }\n\n // 폴백 언어에서 찾기\n if (targetLang !== this.config.fallbackLanguage) {\n const fallbackTranslations = this.allTranslations[this.config.fallbackLanguage || 'en']?.[namespace];\n if (fallbackTranslations) {\n if (actualKey in fallbackTranslations) {\n return fallbackTranslations[actualKey] as T;\n }\n const fallbackNestedValue = this.getNestedValue(fallbackTranslations, actualKey);\n if (fallbackNestedValue !== undefined) {\n return fallbackNestedValue as T;\n }\n }\n }\n\n return undefined;\n }\n\n /**\n * 배열 번역 값 가져오기 (타입 안전)\n */\n tArray(key: string, language?: string): string[] {\n const raw = this.getRawValue(key, language);\n if (Array.isArray(raw) && raw.every((v: unknown) => typeof v === 'string')) {\n return raw as string[];\n }\n if (process.env.NODE_ENV === 'development') {\n console.warn(`tArray: \"${key}\" is not a string array`);\n }\n return [];\n }\n\n /**\n * Intl.PluralRules 인스턴스 (언어별 캐시)\n */\n private getPluralRules(language: string): Intl.PluralRules {\n let rules = this.pluralRulesCache.get(language);\n if (!rules) {\n rules = new Intl.PluralRules(language);\n this.pluralRulesCache.set(language, rules);\n }\n return rules;\n }\n\n /**\n * 복수형 번역 (ICU / Intl.PluralRules 기반)\n *\n * JSON: { \"other\": \"총 {count}개\" } (ko)\n * { \"one\": \"{count} item\", \"other\": \"{count} items\" } (en)\n *\n * tPlural('common:total_count', 1) → en: \"1 item\" / ko: \"총 1개\"\n * tPlural('common:total_count', 5) → en: \"5 items\" / ko: \"총 5개\"\n */\n tPlural(key: string, count: number, params?: Record<string, unknown>, language?: string): string {\n const targetLang = language || this.currentLang;\n const raw = this.getRawValue(key, targetLang);\n const mergedParams: Record<string, unknown> = { count, ...params };\n\n // PluralValue 객체인 경우: Intl.PluralRules로 카테고리 결정\n if (isPluralValue(raw)) {\n const category = this.getPluralRules(targetLang).select(count) as PluralCategory;\n const text = raw[category] ?? raw.other;\n return this.interpolate(text, mergedParams);\n }\n\n // fallback: plain string이면 interpolate만\n if (typeof raw === 'string') {\n return this.interpolate(raw, mergedParams);\n }\n\n // 키를 찾지 못한 경우\n if (this.config.debug) {\n return this.interpolate(key, mergedParams);\n }\n return '';\n }\n\n /**\n * 매개변수 보간\n *\n * 지원 형식:\n * - {key} - 단일 중괄호 (일반적인 i18n 형식)\n * - {{key}} - 이중 중괄호 (하위 호환성)\n */\n private interpolate(text: string, params: Record<string, unknown>): string {\n // 단일 중괄호 {key} 또는 이중 중괄호 {{key}} 모두 지원\n return text.replace(/\\{\\{?(\\w+)\\}?\\}/g, (match, key) => {\n const value = params[key];\n return value !== undefined ? String(value) : match;\n });\n }\n\n /**\n * 언어 설정\n */\n setLanguage(language: string): void {\n if (this.currentLang === language) {\n return;\n }\n\n const previousLanguage = this.currentLang;\n this.currentLang = language;\n\n // 언어 변경 이벤트 발생\n this.notifyLanguageChanged(language);\n\n // 새로운 언어의 데이터가 로드되지 않았다면 로드\n if (!this.allTranslations[language]) {\n this.loadLanguageData(language).catch(error => {\n if (this.config.debug) {\n console.warn('Failed to load language data:', error);\n }\n });\n }\n\n if (this.config.debug) {\n console.log(`🌐 [TRANSLATOR] Language changed: ${previousLanguage} -> ${language}`);\n }\n }\n\n /**\n * 언어 데이터 로드\n */\n private async loadLanguageData(language: string): Promise<void> {\n if (!this.allTranslations[language]) {\n this.allTranslations[language] = {};\n }\n\n for (const namespace of this.config.namespaces || []) {\n try {\n const data = await this.safeLoadTranslations(language, namespace);\n this.allTranslations[language][namespace] = data;\n this.loadedNamespaces.add(`${language}:${namespace}`);\n \n // 언어 변경 시 번역 로드 완료 알림\n this.notifyTranslationLoaded(language, namespace);\n } catch (error) {\n const translationError = this.createTranslationError(\n 'LOAD_FAILED',\n error as Error,\n language,\n namespace\n );\n\n this.logError(translationError);\n\n // 복구 가능한 에러인지 확인\n if (isRecoverableError(translationError)) {\n // 재시도는 safeLoadTranslations 내부에서 처리되므로 여기서는 기본값 사용\n this.allTranslations[language][namespace] = {};\n } else {\n // 복구 불가능한 에러는 기본 번역 데이터 사용\n this.allTranslations[language][namespace] = {};\n }\n }\n }\n }\n\n /**\n * 현재 언어 가져오기\n */\n getCurrentLanguage(): string {\n return this.currentLang;\n }\n\n /**\n * 지원되는 언어 목록 가져오기\n */\n getSupportedLanguages(): string[] {\n return this.config.supportedLanguages?.map(lang => lang.code) || [];\n }\n\n /**\n * 초기화 완료 여부 확인\n */\n isReady(): boolean {\n return this.isInitialized && !this.initializationError;\n }\n\n /**\n * 초기화 오류 가져오기\n */\n getInitializationError(): TranslationError | null {\n return this.initializationError;\n }\n\n /**\n * 캐시 클리어\n */\n clearCache(): void {\n this.cache.clear();\n this.cacheStats = { hits: 0, misses: 0 };\n\n if (this.config.debug) {\n console.log('Cache cleared');\n }\n }\n\n /**\n * 캐시 엔트리 설정\n */\n private setCacheEntry(key: string, data: TranslationNamespace): void {\n this.cache.set(key, {\n data,\n timestamp: Date.now(),\n ttl: 5 * 60 * 1000 // 5분\n });\n }\n\n /**\n * 캐시 엔트리 가져오기\n */\n private getCacheEntry(key: string): TranslationNamespace | null {\n const entry = this.cache.get(key);\n\n if (!entry) {\n return null;\n }\n\n // TTL 체크\n if (Date.now() - entry.timestamp > entry.ttl) {\n this.cache.delete(key);\n return null;\n }\n\n return entry.data;\n }\n\n /**\n * 번역 오류 생성\n */\n private createTranslationError(\n code: TranslationError['code'],\n originalError: Error,\n language?: string,\n namespace?: string,\n key?: string\n ): TranslationError {\n return {\n name: 'TranslationError',\n code,\n message: originalError.message,\n originalError,\n language,\n namespace,\n key,\n timestamp: Date.now(),\n stack: originalError.stack\n };\n }\n\n /**\n * 오류 로깅\n */\n private logError(error: TranslationError): void {\n if (this.config.errorHandler) {\n this.config.errorHandler(error, error.language || '', error.namespace || '');\n }\n }\n\n /**\n * 재시도 작업\n */\n private async retryOperation<T>(\n operation: () => Promise<T>,\n error: TranslationError,\n context: { language?: string; namespace?: string; key?: string }\n ): Promise<T> {\n const maxRetries = 3;\n let lastError = error;\n\n for (let attempt = 1; attempt <= maxRetries; attempt++) {\n try {\n return await operation();\n } catch (retryError) {\n lastError = this.createTranslationError(\n 'RETRY_FAILED',\n retryError as Error,\n context.language,\n context.namespace,\n context.key\n );\n\n if (attempt === maxRetries) {\n break;\n }\n\n // 지수 백오프\n await new Promise(resolve => setTimeout(resolve, Math.pow(2, attempt) * 1000));\n }\n }\n\n throw lastError;\n }\n\n /**\n * 안전한 번역 로드\n */\n private async safeLoadTranslations(language: string, namespace: string): Promise<TranslationNamespace> {\n if (this.config.debug) {\n console.log(`📥 [TRANSLATOR] safeLoadTranslations called:`, { language, namespace });\n }\n\n const loadOperation = async (): Promise<TranslationNamespace> => {\n if (!this.config.loadTranslations) {\n throw new Error('No translation loader configured');\n }\n\n if (this.config.debug) {\n console.log(`🔄 [TRANSLATOR] Calling loadTranslations for:`, { language, namespace });\n }\n\n const data = await this.config.loadTranslations(language, namespace);\n\n if (this.config.debug) {\n console.log(`📦 [TRANSLATOR] loadTranslations returned:`, data);\n }\n\n if (!isTranslationNamespace(data)) {\n throw new Error(`Invalid translation data for ${language}:${namespace}`);\n }\n\n return data;\n };\n\n try {\n return await loadOperation();\n } catch (error) {\n const translationError = this.createTranslationError(\n 'LOAD_FAILED',\n error as Error,\n language,\n namespace\n );\n\n return this.retryOperation(loadOperation, translationError, { language, namespace });\n }\n }\n\n /**\n * 디버그 정보\n */\n debug() {\n return {\n isInitialized: this.isInitialized,\n currentLanguage: this.currentLang,\n loadedNamespaces: Array.from(this.loadedNamespaces),\n cacheStats: this.cacheStats,\n cacheSize: this.cache.size,\n allTranslations: this.allTranslations,\n initializationError: this.initializationError,\n config: this.config\n };\n }\n\n /**\n * SSR에서 하이드레이션\n */\n hydrateFromSSR(translations: Record<string, Record<string, TranslationNamespace>>): void {\n this.allTranslations = translations;\n this.isInitialized = true;\n\n // 로드된 네임스페이스 업데이트\n for (const [language, namespaces] of Object.entries(translations)) {\n for (const namespace of Object.keys(namespaces)) {\n this.loadedNamespaces.add(`${language}:${namespace}`);\n }\n }\n }\n\n /**\n * 비동기 번역 (고급 기능)\n */\n async translateAsync(key: string, params?: Record<string, unknown>): Promise<string> {\n if (!this.isInitialized) {\n await this.initialize();\n }\n\n const translated = this.translate(key);\n\n if (!params) {\n return translated;\n }\n\n return this.interpolate(translated, params);\n }\n\n /**\n * 동기 번역 (고급 기능)\n */\n translateSync(key: string, params?: Record<string, unknown>): string {\n if (!this.isInitialized) {\n if (this.config.debug) {\n console.warn('Translator not initialized for sync translation');\n }\n const { namespace } = this.parseKey(key);\n return this.config.missingKeyHandler?.(key, this.currentLang, namespace) || key;\n }\n\n const translated = this.translate(key);\n\n if (!params) {\n return translated;\n }\n\n return this.interpolate(translated, params);\n }\n\n /**\n * 키 파싱 (네임스페이스:키 형식)\n * \n * - 콜론(:)만 네임스페이스 구분자로 사용\n * - 점(.)은 키 이름의 일부로 취급 (중첩 객체 접근용)\n * \n * @example\n * parseKey(\"home:hero.badge\") → { namespace: \"home\", key: \"hero.badge\" }\n * parseKey(\"hero.badge\") → { namespace: \"common\", key: \"hero.badge\" }\n * parseKey(\"save\") → { namespace: \"common\", key: \"save\" }\n */\n private parseKey(key: string): { namespace: string; key: string } {\n // 콜론(:)만 네임스페이스 구분자로 사용\n const colonIndex = key.indexOf(':');\n if (colonIndex !== -1) {\n return { namespace: key.substring(0, colonIndex), key: key.substring(colonIndex + 1) };\n }\n\n // 콜론이 없으면 common 네임스페이스로 간주\n // 점(.)은 키 이름의 일부 (중첩 객체 접근은 getNestedValue에서 처리)\n return { namespace: 'common', key };\n }\n\n /**\n * 번역 데이터 로드 (고급 기능)\n */\n private async loadTranslationData(language: string, namespace: string): Promise<TranslationNamespace> {\n const cacheKey = `${language}:${namespace}`;\n\n // 이미 로드된 네임스페이스인지 확인\n if (this.loadedNamespaces.has(cacheKey)) {\n const existing = this.allTranslations[language]?.[namespace];\n if (existing) {\n return existing;\n }\n }\n\n // 캐시에서 확인\n const cached = this.getCacheEntry(cacheKey);\n if (cached) {\n // 캐시에 있으면 allTranslations에도 저장\n if (!this.allTranslations[language]) {\n this.allTranslations[language] = {};\n }\n this.allTranslations[language][namespace] = cached;\n this.loadedNamespaces.add(cacheKey);\n return cached;\n }\n\n // 로딩 중인지 확인\n const loadingPromise = this.loadingPromises.get(cacheKey);\n if (loadingPromise) {\n return loadingPromise;\n }\n\n // 새로 로드\n const loadPromise = this._loadTranslationData(language, namespace);\n this.loadingPromises.set(cacheKey, loadPromise);\n\n try {\n const data = await loadPromise;\n \n // allTranslations에 저장 (중요: 이렇게 해야 findInNamespace에서 찾을 수 있음)\n if (!this.allTranslations[language]) {\n this.allTranslations[language] = {};\n }\n this.allTranslations[language][namespace] = data;\n this.loadedNamespaces.add(cacheKey);\n \n // 캐시에도 저장\n this.setCacheEntry(cacheKey, data);\n \n if (this.config.debug) {\n console.log(`✅ [TRANSLATOR] Auto-loaded and saved ${language}/${namespace}`);\n }\n \n // React 리렌더링 트리거 (디바운싱 적용)\n this.notifyTranslationLoaded(language, namespace);\n \n return data;\n } finally {\n this.loadingPromises.delete(cacheKey);\n }\n }\n\n /**\n * 실제 번역 데이터 로드\n */\n private async _loadTranslationData(language: string, namespace: string): Promise<TranslationNamespace> {\n if (!this.config.loadTranslations) {\n throw new Error('No translation loader configured');\n }\n\n try {\n const data = await this.config.loadTranslations(language, namespace);\n\n if (!isTranslationNamespace(data)) {\n throw new Error(`Invalid translation data for ${language}:${namespace}`);\n }\n\n return data;\n } catch (error) {\n const translationError = this.createTranslationError(\n 'LOAD_FAILED',\n error as Error,\n language,\n namespace\n );\n\n this.logError(translationError);\n\n // 기본 번역 데이터 반환\n return {};\n }\n }\n}\n\n// SSR 번역 함수들\nexport function ssrTranslate({\n translations,\n key,\n language = 'ko',\n fallbackLanguage = 'en',\n missingKeyHandler = (key: string) => key\n}: {\n translations: Record<string, Record<string, TranslationNamespace>>;\n key: string;\n language?: string;\n fallbackLanguage?: string;\n missingKeyHandler?: (key: string) => string;\n}): string {\n const { namespace, key: actualKey } = parseKey(key);\n\n // 현재 언어에서 찾기\n let result = ssrFindInNamespace(translations, namespace, actualKey, language, fallbackLanguage, missingKeyHandler);\n\n if (result) {\n return result;\n }\n\n // 폴백 언어에서 찾기\n if (language !== fallbackLanguage) {\n result = ssrFindInNamespace(translations, namespace, actualKey, fallbackLanguage, fallbackLanguage, missingKeyHandler);\n if (result) {\n return result;\n }\n }\n\n return missingKeyHandler(key);\n}\n\nfunction ssrFindInNamespace(\n translations: Record<string, Record<string, TranslationNamespace>>,\n namespace: string,\n key: string,\n language: string,\n fallbackLanguage: string,\n missingKeyHandler: (key: string) => string\n): string {\n const namespaceData = translations[language]?.[namespace];\n\n if (!namespaceData) {\n return '';\n }\n\n // 직접 키 매칭\n const directValue = namespaceData[key];\n if (isStringValue(directValue)) {\n return directValue;\n }\n\n // 중첩 키 매칭\n const nestedValue = getNestedValue(namespaceData, key);\n if (isStringValue(nestedValue)) {\n return nestedValue;\n }\n\n return '';\n}\n\nfunction getNestedValue(obj: unknown, path: string): unknown {\n if (typeof obj !== 'object' || obj === null || Array.isArray(obj)) {\n return undefined;\n }\n\n return path.split('.').reduce((current: unknown, key: string) => {\n if (current && typeof current === 'object' && !Array.isArray(current) && key in current) {\n return (current as Record<string, unknown>)[key];\n }\n return undefined;\n }, obj);\n}\n\n/**\n * 문자열 값인지 확인하는 타입 가드\n */\nfunction isStringValue(value: unknown): value is string {\n return typeof value === 'string' && value.length > 0;\n}\n\n/**\n * 키 파싱 (네임스페이스:키 형식) - SSR용 standalone 함수\n * \n * - 콜론(:)만 네임스페이스 구분자로 사용\n * - 점(.)은 키 이름의 일부로 취급 (중첩 객체 접근용)\n */\nfunction parseKey(key: string): { namespace: string; key: string } {\n // 콜론(:)만 네임스페이스 구분자로 사용\n const colonIndex = key.indexOf(':');\n if (colonIndex !== -1) {\n return { namespace: key.substring(0, colonIndex), key: key.substring(colonIndex + 1) };\n }\n\n // 콜론이 없으면 common 네임스페이스로 간주\n return { namespace: 'common', key };\n}\n\n// 서버 번역 함수 (고급 기능 포함)\nexport function serverTranslate({\n translations,\n key,\n language = 'ko',\n fallbackLanguage = 'en',\n missingKeyHandler = (key: string) => key,\n options = {}\n}: {\n translations: Record<string, unknown>; // 번역 데이터\n key: string; // 번역 키\n language?: string; // 언어 코드\n fallbackLanguage?: string; // 폴백 언어\n missingKeyHandler?: (key: string) => string; // 누락 키 처리\n options?: {\n cache?: Map<string, string>; // 캐시 (선택적)\n metrics?: { hits: number; misses: number }; // 메트릭 (선택적)\n debug?: boolean; // 디버그 모드 (선택적)\n };\n}): string {\n const { cache, metrics, debug } = options;\n\n // 캐시에서 확인\n if (cache) {\n const cacheKey = `${language}:${key}`;\n const cached = cache.get(cacheKey);\n if (cached) {\n if (metrics) metrics.hits++;\n if (debug) console.log(`[CACHE HIT] ${cacheKey}`);\n return cached;\n }\n }\n\n // 번역 찾기\n const result = findInTranslations(translations, key, language, fallbackLanguage, missingKeyHandler);\n\n // 캐시에 저장\n if (cache && result) {\n const cacheKey = `${language}:${key}`;\n cache.set(cacheKey, result);\n }\n\n if (metrics) metrics.misses++;\n if (debug) console.log(`[TRANSLATE] ${key} -> ${result}`);\n\n return result;\n}\n\nfunction findInTranslations(\n translations: Record<string, unknown>,\n key: string,\n language: string,\n fallbackLanguage: string,\n missingKeyHandler: (key: string) => string\n): string {\n const { namespace, key: actualKey } = parseKey(key);\n\n // 현재 언어에서 찾기\n let result = findInNamespace(translations, namespace, actualKey, language);\n\n if (result) {\n return result;\n }\n\n // 폴백 언어에서 찾기\n if (language !== fallbackLanguage) {\n result = findInNamespace(translations, namespace, actualKey, fallbackLanguage);\n if (result) {\n return result;\n }\n }\n\n return '';\n}\n\nfunction findInNamespace(\n translations: Record<string, unknown>,\n namespace: string,\n key: string,\n language: string\n): string {\n // 언어 데이터 가져오기\n const languageData = translations[language];\n\n // 언어 데이터가 객체인지 확인\n if (!languageData || typeof languageData !== 'object' || Array.isArray(languageData)) {\n return '';\n }\n\n // 네임스페이스 데이터 가져오기\n const namespaceData = (languageData as Record<string, unknown>)[namespace];\n\n if (!namespaceData || typeof namespaceData !== 'object' || Array.isArray(namespaceData)) {\n return '';\n }\n\n // 타입 단언: namespaceData는 객체임을 확인했으므로 Record로 단언\n const data = namespaceData as Record<string, unknown>;\n\n // 직접 키 매칭\n if (data[key] && typeof data[key] === 'string') {\n return data[key] as string;\n }\n\n // 중첩 키 매칭\n const nestedValue = getNestedValue(namespaceData, key);\n if (typeof nestedValue === 'string') {\n return nestedValue;\n }\n\n return '';\n}","import { Translator } from './translator';\nimport { I18nConfig } from '../types';\n\n/**\n * Translator 인스턴스를 관리하는 Factory 클래스\n * - Config 변경 감지\n * - 테스트 환경 격리\n * - 메모리 관리\n */\nexport class TranslatorFactory {\n private static instances = new Map<string, Translator>();\n private static configCache = new Map<string, I18nConfig>();\n private static readonly MAX_INSTANCES = 10; // 최대 인스턴스 수 제한\n\n /**\n * Config를 기반으로 고유 키 생성\n */\n private static generateConfigKey(config: I18nConfig): string {\n // Config의 핵심 속성들을 기반으로 키 생성\n const keyParts = [\n config.defaultLanguage,\n config.fallbackLanguage || 'en',\n config.namespaces?.join(',') || 'common',\n config.debug ? 'debug' : 'prod',\n ];\n return keyParts.join('|');\n }\n\n /**\n * Config가 변경되었는지 확인\n */\n private static isConfigChanged(configKey: string, newConfig: I18nConfig): boolean {\n const cachedConfig = this.configCache.get(configKey);\n if (!cachedConfig) return true;\n\n // 핵심 속성들만 비교\n return (\n cachedConfig.defaultLanguage !== newConfig.defaultLanguage ||\n cachedConfig.fallbackLanguage !== newConfig.fallbackLanguage ||\n JSON.stringify(cachedConfig.namespaces) !== JSON.stringify(newConfig.namespaces) ||\n cachedConfig.debug !== newConfig.debug\n );\n }\n\n /**\n * Translator 인스턴스 생성 또는 반환\n */\n static create(config: I18nConfig): Translator {\n const configKey = this.generateConfigKey(config);\n \n // Config가 변경되었거나 인스턴스가 없으면 새로 생성\n if (!this.instances.has(configKey) || this.isConfigChanged(configKey, config)) {\n // 최대 인스턴스 수 초과 시 오래된 인스턴스 제거 (LRU 방식)\n if (this.instances.size >= this.MAX_INSTANCES && !this.instances.has(configKey)) {\n // 가장 오래된 인스턴스 제거 (Map은 삽입 순서 유지)\n const oldestKey = this.instances.keys().next().value;\n if (oldestKey) {\n const oldInstance = this.instances.get(oldestKey);\n if (oldInstance) {\n oldInstance.clearCache();\n }\n this.instances.delete(oldestKey);\n this.configCache.delete(oldestKey);\n }\n }\n\n // 기존 인스턴스 정리\n if (this.instances.has(configKey)) {\n const oldInstance = this.instances.get(configKey)!;\n oldInstance.clearCache();\n }\n \n // 새 인스턴스 생성\n const newInstance = new Translator(config);\n this.instances.set(configKey, newInstance);\n this.configCache.set(configKey, { ...config });\n }\n \n return this.instances.get(configKey)!;\n }\n\n /**\n * 특정 Config 키의 Translator 인스턴스 반환\n */\n static get(config: I18nConfig): Translator | null {\n const configKey = this.generateConfigKey(config);\n return this.instances.get(configKey) || null;\n }\n\n /**\n * 모든 Translator 인스턴스 정리 (테스트용)\n */\n static clear(): void {\n // 모든 인스턴스의 캐시 정리\n for (const instance of this.instances.values()) {\n instance.clearCache();\n }\n \n this.instances.clear();\n this.configCache.clear();\n }\n\n /**\n * 특정 Config 키의 인스턴스만 정리\n */\n static clearConfig(config: I18nConfig): void {\n const configKey = this.generateConfigKey(config);\n const instance = this.instances.get(configKey);\n if (instance) {\n instance.clearCache();\n this.instances.delete(configKey);\n this.configCache.delete(configKey);\n }\n }\n\n /**\n * 현재 관리 중인 인스턴스 수 반환\n */\n static getInstanceCount(): number {\n return this.instances.size;\n }\n\n /**\n * 디버깅용: 모든 인스턴스 정보 반환\n */\n static debug(): {\n instanceCount: number;\n configKeys: string[];\n instances: Map<string, Translator>;\n } {\n return {\n instanceCount: this.instances.size,\n configKeys: Array.from(this.instances.keys()),\n instances: this.instances,\n };\n }\n} ","/**\n * 기본 번역 데이터 유틸리티\n * \n * 번역 파일을 로드할 수 없을 때 사용되는 기본 번역 데이터를 제공합니다.\n */\n\n/**\n * 기본 번역 데이터\n */\nconst DEFAULT_TRANSLATIONS: Record<string, Record<string, Record<string, string>>> = {\n ko: {\n common: {\n welcome: \"환영합니다\",\n greeting: \"안녕하세요\",\n goodbye: \"안녕히 가세요\",\n loading: \"로딩 중...\",\n error: \"오류가 발생했습니다\",\n success: \"성공했습니다\",\n cancel: \"취소\",\n confirm: \"확인\",\n save: \"저장\",\n delete: \"삭제\",\n edit: \"편집\",\n add: \"추가\",\n search: \"검색\",\n filter: \"필터\",\n sort: \"정렬\",\n refresh: \"새로고침\",\n back: \"뒤로\",\n next: \"다음\",\n previous: \"이전\",\n home: \"홈\",\n about: \"소개\",\n contact: \"연락처\",\n settings: \"설정\",\n profile: \"프로필\",\n logout: \"로그아웃\",\n login: \"로그인\",\n register: \"회원가입\"\n },\n auth: {\n login: \"로그인\",\n logout: \"로그아웃\",\n register: \"회원가입\",\n email: \"이메일\",\n password: \"비밀번호\",\n forgot_password: \"비밀번호 찾기\",\n remember_me: \"로그인 상태 유지\"\n },\n errors: {\n not_found: \"페이지를 찾을 수 없습니다\",\n server_error: \"서버 오류가 발생했습니다\",\n network_error: \"네트워크 오류가 발생했습니다\",\n unauthorized: \"인증이 필요합니다\",\n forbidden: \"접근이 거부되었습니다\"\n }\n },\n en: {\n common: {\n welcome: \"Welcome\",\n greeting: \"Hello\",\n goodbye: \"Goodbye\",\n loading: \"Loading...\",\n error: \"An error occurred\",\n success: \"Success\",\n cancel: \"Cancel\",\n confirm: \"Confirm\",\n save: \"Save\",\n delete: \"Delete\",\n edit: \"Edit\",\n add: \"Add\",\n search: \"Search\",\n filter: \"Filter\",\n sort: \"Sort\",\n refresh: \"Refresh\",\n back: \"Back\",\n next: \"Next\",\n previous: \"Previous\",\n home: \"Home\",\n about: \"About\",\n contact: \"Contact\",\n settings: \"Settings\",\n profile: \"Profile\",\n logout: \"Logout\",\n login: \"Login\",\n register: \"Register\"\n },\n auth: {\n login: \"Login\",\n logout: \"Logout\",\n register: \"Register\",\n email: \"Email\",\n password: \"Password\",\n forgot_password: \"Forgot Password\",\n remember_me: \"Remember Me\"\n },\n errors: {\n not_found: \"Page not found\",\n server_error: \"Server error occurred\",\n network_error: \"Network error occurred\",\n unauthorized: \"Authentication required\",\n forbidden: \"Access denied\"\n }\n }\n};\n\n/**\n * 기본 번역 데이터 가져오기\n * \n * @param language - 언어 코드 (예: 'ko', 'en')\n * @param namespace - 네임스페이스 (예: 'common', 'auth')\n * @returns 해당 언어와 네임스페이스의 기본 번역 데이터\n */\nexport function getDefaultTranslations(\n language: string,\n namespace: string\n): Record<string, string> {\n return DEFAULT_TRANSLATIONS[language]?.[namespace] || {};\n}\n\n/**\n * 모든 기본 번역 데이터 가져오기\n * \n * @returns 모든 언어와 네임스페이스의 기본 번역 데이터\n */\nexport function getAllDefaultTranslations(): Record<string, Record<string, Record<string, string>>> {\n return DEFAULT_TRANSLATIONS;\n}\n\n","\"use client\";\nimport { useState, useEffect, useCallback, useContext, createContext, useMemo } from 'react';\nimport { Translator } from '../core/translator';\nimport { TranslatorFactory } from '../core/translator-factory';\nimport {\n I18nConfig,\n I18nContextType,\n TranslationParams,\n TranslationError,\n validateI18nConfig,\n webPlatformAdapter\n} from '../types';\nimport { getDefaultTranslations } from '../utils/default-translations';\n\n// React Context\nconst I18nContext = createContext<I18nContextType | null>(null);\n\n/**\n * 초기 언어를 결정하는 헬퍼 함수\n * 우선순위: config.defaultLanguage > platformAdapter.getDeviceLanguage 매칭 > supportedLanguages[0]\n * config.defaultLanguage가 명시적으로 제공되지 않은 경우에만 디바이스 언어 감지 동작\n */\nfunction resolveInitialLanguage(\n config: I18nConfig & { autoLanguageSync?: boolean }\n): string {\n // 1. config.defaultLanguage가 명시적으로 제공된 경우 우선 사용\n if (config.defaultLanguage) {\n return config.defaultLanguage;\n }\n\n // 2. 플랫폼 어댑터로 디바이스 언어 감지\n const adapter = config.platformAdapter ?? webPlatformAdapter;\n const deviceLang = adapter.getDeviceLanguage();\n if (deviceLang) {\n const supportedCodes = config.supportedLanguages?.map(l => l.code) ?? [];\n if (supportedCodes.includes(deviceLang)) {\n return deviceLang;\n }\n }\n\n // 3. 첫 번째 지원 언어로 폴백\n return config.supportedLanguages?.[0]?.code ?? 'ko';\n}\n\n/**\n * I18n Provider 컴포넌트\n */\nexport function I18nProvider({\n config,\n children\n}: {\n config: I18nConfig & { autoLanguageSync?: boolean };\n children: React.ReactNode;\n}) {\n const [currentLanguage, setCurrentLanguageState] = useState(() => resolveInitialLanguage(config));\n const [isLoading, setIsLoading] = useState(true);\n const [isInitialized, setIsInitialized] = useState(false);\n const [error, setError] = useState<TranslationError | null>(null);\n // 번역 로드 완료 시 리렌더링을 위한 상태\n const [translationVersion, setTranslationVersion] = useState(0);\n\n // config.defaultLanguage가 변경되면 currentLanguage도 업데이트\n // 단, 초기화 전에만 적용 (초기화 후에는 외부에서 언어 변경 가능)\n useEffect(() => {\n if (!isInitialized && config.defaultLanguage !== currentLanguage) {\n setCurrentLanguageState(config.defaultLanguage);\n }\n }, [config.defaultLanguage, currentLanguage, isInitialized]);\n\n // Translator 인스턴스 초기화 (메모이제이션)\n const translator = useMemo(() => {\n if (!validateI18nConfig(config)) {\n throw new Error('Invalid I18nConfig provided to I18nProvider');\n }\n return TranslatorFactory.create(config);\n }, [config]);\n\n // 초기화는 한 번만 수행\n useEffect(() => {\n if (isInitialized) {\n // 이미 초기화되어 있으면 언어만 변경\n // 단, translator의 현재 언어와 다를 때만 변경 (무한 루프 방지)\n const translatorLang = translator.getCurrentLanguage();\n if (translatorLang !== currentLanguage) {\n // translator의 언어를 currentLanguage로 변경\n // 이는 외부에서 setLanguage를 호출했을 때 발생하는 정상적인 동기화\n if (config.debug) {\n console.log(`🔄 [USEI18N] Syncing translator language: ${translatorLang} -> ${currentLanguage} (already initialized)`);\n }\n translator.setLanguage(currentLanguage);\n }\n return;\n }\n \n if (config.debug) {\n console.log('🔄 [USEI18N] useEffect triggered:', { \n hasTranslator: !!translator, \n currentLanguage, \n debug: config.debug,\n isInitialized \n });\n }\n \n const initializeTranslator = async () => {\n try {\n setIsLoading(true);\n setError(null);\n \n if (config.debug) {\n console.log('🚀 [USEI18N] Starting translator initialization...');\n }\n \n translator.setLanguage(currentLanguage);\n \n // 모든 번역 데이터 미리 로드\n await translator.initialize();\n setIsInitialized(true);\n \n if (config.debug) {\n console.log('✅ [USEI18N] Translator initialization completed successfully');\n }\n } catch (err) {\n const initError = err as TranslationError;\n setError(initError);\n if (config.debug) {\n console.error('❌ [USEI18N] Failed to initialize translator:', initError);\n }\n // 에러가 발생해도 초기화 완료로 표시 (기본 번역 사용)\n setIsInitialized(true);\n } finally {\n setIsLoading(false);\n }\n };\n\n initializeTranslator();\n }, [translator, currentLanguage, config.debug, isInitialized]);\n\n // 번역 로드 완료 이벤트 감지 (리렌더링 트리거)\n useEffect(() => {\n if (!translator || !isInitialized) {\n return;\n }\n\n const unsubscribe = translator.onTranslationLoaded(() => {\n // 번역이 로드되면 상태를 업데이트하여 리렌더링 트리거\n setTranslationVersion(prev => prev + 1);\n if (config.debug) {\n console.log('🔄 [USEI18N] Translation loaded, triggering re-render');\n }\n });\n\n return unsubscribe;\n }, [translator, isInitialized, config.debug]);\n\n // Translator의 언어 변경 감지 (외부에서 translator.setLanguage() 호출 시 동기화)\n useEffect(() => {\n if (!translator || !isInitialized) {\n return;\n }\n\n // 언어 변경 이벤트 구독\n const unsubscribe = translator.onLanguageChanged((newLanguage: string) => {\n if (newLanguage !== currentLanguage) {\n if (config.debug) {\n console.log(`🔄 [USEI18N] Language changed event: ${currentLanguage} -> ${newLanguage}`);\n }\n setCurrentLanguageState(newLanguage);\n setTranslationVersion(prev => prev + 1); // 리렌더링 트리거\n }\n });\n\n return unsubscribe;\n }, [translator, isInitialized, currentLanguage, config.debug]);\n\n // 자동 언어 전환 이벤트 처리 (플랫폼 어댑터 위임)\n useEffect(() => {\n if (!config.autoLanguageSync) {\n return;\n }\n\n const adapter = config.platformAdapter ?? webPlatformAdapter;\n return adapter.onLanguageChange((newLanguage) => {\n if (newLanguage !== currentLanguage) {\n if (config.debug) {\n console.log('🌐 Auto language sync:', newLanguage);\n }\n setLanguage(newLanguage);\n }\n });\n }, [config.autoLanguageSync, config.platformAdapter, currentLanguage]);\n\n // 언어 변경 함수 (메모이제이션)\n const setLanguage = useCallback(async (language: string) => {\n if (!translator) {\n return;\n }\n\n // 현재 언어와 동일하면 스킵 (무한 루프 방지)\n const currentLang = translator.getCurrentLanguage();\n if (currentLang === language) {\n if (config.debug) {\n console.log(`⏭️ [USEI18N] Language unchanged, skipping: ${language}`);\n }\n return;\n }\n\n if (config.debug) {\n if (config.debug) {\n console.log(`🔄 [USEI18N] setLanguage called: ${currentLang} -> ${language}`);\n }\n }\n \n setIsLoading(true);\n \n try {\n // 언어 변경 (translate 함수에서 이전 언어의 번역을 임시로 반환하므로 깜빡임 방지)\n translator.setLanguage(language);\n setCurrentLanguageState(language);\n \n // 새로운 언어의 번역 데이터가 이미 로드되어 있는지 확인\n // 로드되지 않은 네임스페이스는 자동으로 로드됨 (translator 내부에서 처리)\n // 언어 변경 시 리렌더링 트리거 (번역 로드 완료 이벤트가 자동으로 발생)\n await new Promise(resolve => setTimeout(resolve, 0)); // 다음 틱에서 리렌더링\n \n if (config.debug) {\n console.log(`✅ [USEI18N] Language changed to ${language}`);\n }\n } catch (error) {\n if (config.debug) {\n console.error(`❌ [USEI18N] Failed to change language to ${language}:`, error);\n }\n } finally {\n setIsLoading(false);\n }\n }, [translator, config.debug]);\n\n // parseKey 함수를 메모이제이션하여 성능 최적화\n const parseKey = useCallback((key: string) => {\n const parts = key.split(':');\n if (parts.length >= 2) {\n return { namespace: parts[0], key: parts.slice(1).join(':') };\n }\n return { namespace: 'common', key };\n }, []);\n\n // 네스티드 키 해석 (예: \"nav.docs\" → obj.nav.docs)\n const resolveNestedKey = useCallback((obj: Record<string, unknown>, key: string): string | null => {\n // 1차: flat 접근 시도 (키에 점이 없거나 flat 구조인 경우)\n if (key in obj && typeof obj[key] === 'string') {\n return obj[key] as string;\n }\n\n // 2차: 네스티드 접근 (점 경로 탐색)\n const parts = key.split('.');\n let current: unknown = obj;\n for (const part of parts) {\n if (current && typeof current === 'object' && current !== null && part in (current as Record<string, unknown>)) {\n current = (current as Record<string, unknown>)[part];\n } else {\n return null;\n }\n }\n return typeof current === 'string' ? current : null;\n }, []);\n\n // SSR 번역에서 찾기\n const findInSSRTranslations = useCallback((key: string, targetLang: string): string | null => {\n if (!config.initialTranslations) {\n return null;\n }\n\n const { namespace, key: actualKey } = parseKey(key);\n\n // 현재 언어의 SSR 번역 확인\n const ssrTranslations = config.initialTranslations[targetLang]?.[namespace];\n if (ssrTranslations) {\n const value = resolveNestedKey(ssrTranslations as Record<string, unknown>, actualKey);\n if (value !== null) {\n return value;\n }\n }\n\n // 폴백 언어의 SSR 번역 확인\n const fallbackLang = config.fallbackLanguage || 'en';\n if (targetLang !== fallbackLang) {\n const fallbackTranslations = config.initialTranslations[fallbackLang]?.[namespace];\n if (fallbackTranslations) {\n const value = resolveNestedKey(fallbackTranslations as Record<string, unknown>, actualKey);\n if (value !== null) {\n return value;\n }\n }\n }\n\n return null;\n }, [config.initialTranslations, config.fallbackLanguage, parseKey, resolveNestedKey]);\n\n // 기본 번역에서 찾기\n const findInDefaultTranslations = useCallback((key: string, targetLang: string): string | null => {\n const { namespace, key: actualKey } = parseKey(key);\n const defaultTranslations = getDefaultTranslations(targetLang, namespace);\n const fallbackTranslations = getDefaultTranslations(config.fallbackLanguage || 'en', namespace);\n\n return resolveNestedKey(defaultTranslations as Record<string, unknown>, actualKey)\n || resolveNestedKey(fallbackTranslations as Record<string, unknown>, actualKey)\n || null;\n }, [config.fallbackLanguage, parseKey, resolveNestedKey]);\n\n // hua-api 스타일의 간단한 번역 함수 (메모이제이션)\n // translationVersion과 currentLanguage에 의존하여 번역 로드 및 언어 변경 시 리렌더링 트리거\n const t = useCallback((key: string, paramsOrLang?: TranslationParams | string, language?: string) => {\n // translationVersion과 currentLanguage를 참조하여 번역 로드 및 언어 변경 시 리렌더링 트리거\n void translationVersion;\n void currentLanguage;\n\n if (!translator) {\n return key;\n }\n\n // 두 번째 인자 타입으로 분기\n let params: TranslationParams | undefined;\n let lang: string | undefined;\n if (typeof paramsOrLang === 'string') {\n lang = paramsOrLang;\n } else if (typeof paramsOrLang === 'object' && paramsOrLang !== null) {\n params = paramsOrLang;\n lang = language;\n }\n\n const targetLang = lang || currentLanguage;\n\n // 1단계: translator.translate() 시도 (params가 있으면 translate에 위임)\n try {\n const result = translator.translate(key, params || lang, params ? lang : undefined);\n if (result && result !== key && result !== '') {\n return result;\n }\n } catch (error) {\n // translator.translate() 실패 시 다음 단계로 진행\n }\n\n // interpolate 헬퍼\n const interpolate = (text: string) => {\n if (!params) return text;\n return text.replace(/\\{\\{(\\w+)\\}\\}/g, (match, k) => {\n const value = params![k];\n return value !== undefined ? String(value) : match;\n });\n };\n\n // 2단계: SSR 번역 데이터에서 찾기\n const ssrResult = findInSSRTranslations(key, targetLang);\n if (ssrResult) {\n return interpolate(ssrResult);\n }\n\n // 3단계: 기본 번역 데이터에서 찾기\n const defaultResult = findInDefaultTranslations(key, targetLang);\n if (defaultResult) {\n return interpolate(defaultResult);\n }\n\n // 모든 단계에서 번역을 찾지 못한 경우\n if (config.debug) {\n return interpolate(key); // 개발 환경에서는 키를 표시하여 디버깅 가능\n }\n return ''; // 프로덕션에서는 빈 문자열 반환하여 미싱 키 노출 방지\n }, [translator, config.debug, currentLanguage, config.fallbackLanguage, translationVersion, findInSSRTranslations, findInDefaultTranslations]) as (key: string, paramsOrLang?: TranslationParams | string, language?: string) => string;\n\n // 기존 비동기 번역 함수 (하위 호환성)\n const tAsync = useCallback(async (key: string, params?: TranslationParams) => {\n if (!translator) {\n if (config.debug) {\n console.warn('Translator not initialized');\n }\n return key;\n }\n\n setIsLoading(true);\n try {\n const result = await translator.translateAsync(key, params);\n return result;\n } catch (error) {\n if (config.debug) {\n console.error('Translation error:', error);\n }\n return key;\n } finally {\n setIsLoading(false);\n }\n }, [translator, config.debug]);\n\n // 기존 동기 번역 함수 (하위 호환성)\n const tSync = useCallback((key: string, namespace?: string, params?: TranslationParams) => {\n if (!translator) {\n if (config.debug) {\n console.warn('Translator not initialized');\n }\n return key;\n }\n\n return translator.translateSync(key, params);\n }, [translator, config.debug]);\n\n // 원시 값 가져오기 (배열, 객체 포함) — 제네릭으로 타입 캐스팅 가능\n const getRawValue = useCallback(<T = unknown>(key: string, language?: string): T | undefined => {\n if (!translator || !isInitialized) {\n return undefined;\n }\n return translator.getRawValue<T>(key, language);\n }, [translator, isInitialized]);\n\n // 배열 번역 값 가져오기 (타입 안전)\n const tArray = useCallback((key: string, language?: string): string[] => {\n void translationVersion;\n void currentLanguage;\n if (!translator || !isInitialized) {\n return [];\n }\n return translator.tArray(key, language);\n }, [translator, isInitialized, translationVersion, currentLanguage]);\n\n // 복수형 번역 (ICU / Intl.PluralRules 기반)\n const tPlural = useCallback((key: string, count: number, params?: Record<string, unknown>, language?: string): string => {\n void translationVersion;\n void currentLanguage;\n if (!translator || !isInitialized) {\n return key;\n }\n return translator.tPlural(key, count, params, language);\n }, [translator, isInitialized, translationVersion, currentLanguage]);\n\n // 개발자 도구 (메모이제이션)\n const debug = useMemo(() => ({\n getCurrentLanguage: () => {\n try {\n return translator?.getCurrentLanguage() || currentLanguage;\n } catch {\n return currentLanguage;\n }\n },\n getSupportedLanguages: () => {\n try {\n return translator?.getSupportedLanguages() || config.supportedLanguages?.map(l => l.code) || [];\n } catch {\n return config.supportedLanguages?.map(l => l.code) || [];\n }\n },\n getLoadedNamespaces: () => {\n try {\n const debugInfo = translator?.debug();\n if (debugInfo && debugInfo.loadedNamespaces) {\n return Array.from(debugInfo.loadedNamespaces);\n }\n // 번역 데이터가 있으면 네임스페이스 추정\n if (debugInfo && debugInfo.allTranslations) {\n const namespaces = new Set<string>();\n Object.values(debugInfo.allTranslations).forEach((langData: unknown) => {\n if (langData && typeof langData === 'object') {\n Object.keys(langData).forEach(namespace => {\n namespaces.add(namespace);\n });\n }\n });\n return Array.from(namespaces);\n }\n return [];\n } catch (error) {\n return [];\n }\n },\n getAllTranslations: () => {\n try {\n return translator?.debug()?.allTranslations || {};\n } catch (error) {\n return {};\n }\n },\n isReady: () => {\n try {\n return translator?.isReady() || isInitialized;\n } catch {\n return isInitialized;\n }\n },\n getInitializationError: () => {\n try {\n return translator?.getInitializationError() || error;\n } catch {\n return error;\n }\n },\n clearCache: () => {\n try {\n translator?.clearCache();\n } catch {\n // 무시\n }\n },\n getCacheStats: () => {\n try {\n const debugInfo = translator?.debug();\n if (debugInfo && debugInfo.cacheStats) {\n return { \n size: debugInfo.cacheSize || 0, \n hits: debugInfo.cacheStats.hits || 0, \n misses: debugInfo.cacheStats.misses || 0 \n };\n }\n return { size: 0, hits: 0, misses: 0 };\n } catch (error) {\n return { size: 0, hits: 0, misses: 0 };\n }\n },\n reloadTranslations: async () => {\n if (translator) {\n setIsLoading(true);\n setError(null);\n try {\n await translator.initialize();\n } catch (err) {\n setError(err as TranslationError);\n } finally {\n setIsLoading(false);\n }\n }\n },\n }), [translator, currentLanguage, error, isInitialized, config.supportedLanguages]);\n\n const value: I18nContextType = useMemo(() => ({\n currentLanguage,\n setLanguage,\n t,\n tPlural,\n tArray,\n tAsync,\n tSync,\n getRawValue,\n isLoading,\n error,\n supportedLanguages: config.supportedLanguages,\n debug,\n isInitialized,\n }), [currentLanguage, setLanguage, t, tPlural, tArray, tAsync, tSync, getRawValue, isLoading, error, config.supportedLanguages, debug, isInitialized]);\n\n return (\n <I18nContext.Provider value={value}>\n {children}\n </I18nContext.Provider>\n );\n}\n\n/**\n * I18n 훅\n */\nexport function useI18n(): I18nContextType {\n const context = useContext(I18nContext);\n if (!context) {\n // Provider 밖에서 호출되면 기본값 반환\n return {\n currentLanguage: 'ko',\n setLanguage: () => {},\n t: (key: string) => key,\n tPlural: (key: string) => key,\n tAsync: async (key: string) => key,\n tSync: (key: string) => key,\n getRawValue: <T = unknown>() => undefined as T | undefined,\n tArray: () => [],\n isLoading: false,\n error: null,\n supportedLanguages: [\n { code: 'ko', name: 'Korean', nativeName: '한국어' },\n { code: 'en', name: 'English', nativeName: 'English' },\n ],\n isInitialized: false,\n debug: {\n getCurrentLanguage: () => 'ko',\n getSupportedLanguages: () => ['ko', 'en'],\n getLoadedNamespaces: () => [],\n getAllTranslations: () => ({}),\n isReady: () => false,\n getInitializationError: () => null,\n clearCache: () => {},\n getCacheStats: () => ({ size: 0, hits: 0, misses: 0 }),\n reloadTranslations: async () => {},\n },\n };\n }\n return context;\n}\n\n\n","\"use client\";\n\nimport { useCallback } from 'react';\nimport { useI18n } from './useI18n';\n\n/**\n * 간단한 번역 훅 (원본 SDK와 호환)\n *\n * @example\n * ```tsx\n * import { useTranslation } from '@hua-labs/i18n-core';\n *\n * function MyComponent() {\n * const { t, currentLanguage, setLanguage, isLoading, error } = useTranslation();\n *\n * return (\n * <div>\n * <h1>{t('welcome')}</h1>\n * <p>Current language: {currentLanguage}</p>\n * <button onClick={() => setLanguage('en')}>Switch to English</button>\n * </div>\n * );\n * }\n * ```\n */\nexport function useTranslation() {\n const { t, tPlural, tArray, currentLanguage, setLanguage, getRawValue, isLoading, error, supportedLanguages, debug, isInitialized } = useI18n();\n\n return {\n t,\n tPlural,\n tArray,\n currentLanguage,\n setLanguage,\n getRawValue,\n isLoading,\n error,\n supportedLanguages,\n debug,\n isInitialized,\n };\n}\n\n/**\n * 언어 변경 전용 훅\n */\nexport function useLanguageChange() {\n const { currentLanguage, setLanguage, supportedLanguages } = useI18n();\n\n const changeLanguage = useCallback((language: string) => {\n const supported = supportedLanguages.find(lang => lang.code === language);\n if (supported) {\n setLanguage(language);\n } else {\n if (process.env.NODE_ENV !== 'production') console.warn(`Language ${language} is not supported`);\n }\n }, [setLanguage, supportedLanguages]);\n\n return {\n currentLanguage,\n changeLanguage,\n supportedLanguages,\n };\n} ","/**\n * @hua-labs/i18n-core - 핵심 기능 전용 엔트리포인트\n * \n * 이 모듈은 기본적인 번역 기능만 필요한 경우 사용합니다.\n * 플러그인, 고급 기능, 디버깅 도구 없이 순수한 번역 기능만 제공합니다.\n */\n\nimport React from 'react';\nimport { I18nProvider, useI18n } from './hooks/useI18n';\nimport { useTranslation, useLanguageChange } from './hooks/useTranslation';\nimport { Translator, ssrTranslate, serverTranslate } from './core/translator';\nimport { I18nConfig, I18nContextType, TranslationParams, TypedTranslationKeys, ResolveStringKey, ResolveArrayKey, ResolvePluralKey, PluralValue, PluralCategory, I18nPlatformAdapter, webPlatformAdapter, headlessPlatformAdapter } from './types';\n\n// Window 객체 타입 확장\ndeclare global {\n interface Window {\n __I18N_DEBUG_MODE__?: boolean;\n __I18N_DEBUG_MISSING_KEYS__?: Record<string, string[]>;\n __I18N_DEBUG_ERRORS__?: Array<{\n timestamp: string;\n language: string;\n namespace: string;\n error: string;\n stack?: string;\n }>;\n __I18N_PERFORMANCE_DATA__?: Record<string, number[]>;\n __I18N_PERFORMANCE_ALERTS__?: Array<{\n id: string;\n type: 'warning' | 'error' | 'info';\n severity: 'low' | 'medium' | 'high' | 'critical';\n message: string;\n metric: string;\n value: number;\n threshold: number;\n timestamp: number;\n resolved: boolean;\n }>;\n __I18N_ANALYTICS_DATA__?: {\n missingKeys?: Set<string> | string[];\n performance?: {\n totalTime: number;\n averageTime: number;\n calls: number;\n };\n usage?: {\n keys?: Map<string, number> | Record<string, number>;\n languages?: Map<string, number> | Record<string, number>;\n namespaces?: Map<string, number> | Record<string, number>;\n };\n errors?: Array<{\n timestamp: number;\n error: string;\n context: string;\n }>;\n };\n }\n}\n\n// 기본 언어 설정 (10개 언어 지원)\nconst defaultLanguages = [\n { code: 'ko', name: 'Korean', nativeName: '한국어' },\n { code: 'en', name: 'English', nativeName: 'English' },\n { code: 'en-IN', name: 'English (India)', nativeName: 'English (India)' },\n { code: 'ja', name: 'Japanese', nativeName: '日本語' },\n { code: 'zh', name: 'Chinese (Simplified)', nativeName: '简体中文' },\n { code: 'zh-TW', name: 'Chinese (Traditional)', nativeName: '繁體中文' },\n { code: 'es', name: 'Spanish', nativeName: 'Español' },\n { code: 'ru', name: 'Russian', nativeName: 'Русский' },\n { code: 'de', name: 'German', nativeName: 'Deutsch' },\n { code: 'fr', name: 'French', nativeName: 'Français' },\n];\n\n/**\n * 핵심 기능용 설정 함수\n * \n * @example\n * ```tsx\n * // app/layout.tsx (Next.js App Router)\n * import { createCoreI18n } from '@hua-labs/i18n-core';\n * \n * export default function RootLayout({ children }) {\n * return (\n * <html>\n * <body>\n * {createCoreI18n({\n * defaultLanguage: 'ko',\n * fallbackLanguage: 'en',\n * namespaces: ['common', 'auth']\n * })({ children })}\n * </body>\n * </html>\n * );\n * }\n * ```\n */\nexport function createCoreI18n(options?: {\n defaultLanguage?: string;\n fallbackLanguage?: string;\n namespaces?: string[];\n debug?: boolean;\n loadTranslations?: (language: string, namespace: string) => Promise<Record<string, string>>;\n /**\n * 번역 파일 로딩 방식 설정\n * - 'api': API route를 통해 동적 로드 (기본값, 권장)\n * - 'static': 정적 파일 경로에서 로드\n * - 'custom': loadTranslations 함수 사용\n */\n translationLoader?: 'api' | 'static' | 'custom';\n /**\n * API route 경로 (translationLoader가 'api'일 때 사용)\n * 기본값: '/api/translations'\n */\n translationApiPath?: string;\n /**\n * SSR에서 전달된 초기 번역 데이터 (네트워크 요청 없이 사용)\n * 형식: { [language]: { [namespace]: { [key]: value } } }\n */\n initialTranslations?: Record<string, Record<string, Record<string, string>>>;\n /**\n * 지원 언어 목록 (LanguageConfig 배열 또는 언어 코드 문자열 배열)\n * 기본값: ['ko', 'en']\n */\n supportedLanguages?: Array<{ code: string; name: string; nativeName: string }> | string[];\n /**\n * 자동 언어 동기화 활성화 여부\n * 기본값: false (Zustand 어댑터 등 외부에서 직접 처리하는 경우)\n */\n autoLanguageSync?: boolean;\n /**\n * 서버사이드 렌더링 시 사용할 기본 URL\n * 환경 변수보다 우선 적용됨\n */\n baseUrl?: string;\n /**\n * 로컬 개발 환경 fallback URL\n * 기본값: 'http://localhost:3010'\n */\n localFallbackBaseUrl?: string;\n}) {\n const {\n defaultLanguage = 'ko',\n fallbackLanguage = 'en',\n namespaces = ['common'],\n debug = false,\n loadTranslations,\n translationLoader = 'api',\n translationApiPath = '/api/translations',\n initialTranslations,\n supportedLanguages: providedSupportedLanguages,\n autoLanguageSync = false, // 기본값 false (Zustand 어댑터 등 외부에서 직접 처리)\n baseUrl,\n localFallbackBaseUrl,\n } = options || {};\n\n // supportedLanguages 처리: string[] 또는 LanguageConfig[] 모두 지원\n let supportedLanguagesConfig: Array<{ code: string; name: string; nativeName: string }>;\n if (providedSupportedLanguages) {\n if (Array.isArray(providedSupportedLanguages) && providedSupportedLanguages.length > 0) {\n // string[]인지 LanguageConfig[]인지 확인\n if (typeof providedSupportedLanguages[0] === 'string') {\n // string[]를 LanguageConfig[]로 변환\n const languageMap: Record<string, { name: string; nativeName: string }> = {\n ko: { name: 'Korean', nativeName: '한국어' },\n en: { name: 'English', nativeName: 'English' },\n ja: { name: 'Japanese', nativeName: '日本語' },\n zh: { name: 'Chinese', nativeName: '中文' },\n es: { name: 'Spanish', nativeName: 'Español' },\n fr: { name: 'French', nativeName: 'Français' },\n de: { name: 'German', nativeName: 'Deutsch' },\n pt: { name: 'Portuguese', nativeName: 'Português' },\n it: { name: 'Italian', nativeName: 'Italiano' },\n ru: { name: 'Russian', nativeName: 'Русский' },\n };\n supportedLanguagesConfig = (providedSupportedLanguages as string[]).map(code => ({\n code,\n name: languageMap[code]?.name || code,\n nativeName: languageMap[code]?.nativeName || code,\n }));\n } else {\n // LanguageConfig[]인 경우 그대로 사용\n supportedLanguagesConfig = providedSupportedLanguages as Array<{ code: string; name: string; nativeName: string }>;\n }\n } else {\n supportedLanguagesConfig = defaultLanguages;\n }\n } else {\n supportedLanguagesConfig = defaultLanguages;\n }\n\n /**\n * 서버사이드/클라이언트사이드 URL 빌드 함수\n * createApiTranslationLoader의 로직을 참고하여 구현\n */\n const buildUrl = (language: string, namespace: string): string => {\n const safeNamespace = namespace.replace(/[^a-zA-Z0-9-_]/g, '');\n const path = `${translationApiPath}/${language}/${safeNamespace}`;\n \n // 클라이언트 사이드: 상대 경로 사용\n if (typeof window !== 'undefined') {\n return path;\n }\n \n // 서버사이드: 절대 URL 필요\n // 1. baseUrl 옵션이 있으면 우선 사용\n if (baseUrl) {\n return `${baseUrl}${path}`;\n }\n \n // 2. NEXT_PUBLIC_SITE_URL 환경 변수 확인\n if (process.env.NEXT_PUBLIC_SITE_URL) {\n return `${process.env.NEXT_PUBLIC_SITE_URL}${path}`;\n }\n \n // 3. VERCEL_URL 환경 변수 확인\n if (process.env.VERCEL_URL) {\n const vercelUrl = process.env.VERCEL_URL.startsWith('http')\n ? process.env.VERCEL_URL\n : `https://${process.env.VERCEL_URL}`;\n return `${vercelUrl}${path}`;\n }\n \n // 4. 로컬 개발 환경 fallback\n const fallbackBase = localFallbackBaseUrl ?? 'http://localhost:3010';\n return `${fallbackBase}${path}`;\n };\n // API route 기반 로더 (기본값, 권장)\n const apiRouteLoader = async (language: string, namespace: string) => {\n try {\n // 클라이언트 사이드에서만 동적 로드\n if (typeof window !== 'undefined') {\n const apiUrl = `${translationApiPath}/${language}/${namespace}`;\n const response = await fetch(apiUrl);\n \n if (response.ok) {\n const data = await response.json();\n if (debug) {\n console.log(`✅ Loaded translation from API: ${language}/${namespace}`);\n }\n return data;\n } else if (response.status === 404) {\n if (debug) {\n console.warn(`⚠️ Translation not found in API: ${language}/${namespace}`);\n }\n }\n }\n \n // SSR 또는 API 실패 시 기본 번역 반환\n return getDefaultTranslations(language, namespace);\n } catch (error) {\n if (debug) {\n console.warn(`Failed to load translation from API: ${language}/${namespace}`, error);\n }\n return getDefaultTranslations(language, namespace);\n }\n };\n\n // 정적 파일 로더 (하위 호환성)\n const staticFileLoader = async (language: string, namespace: string) => {\n try {\n let data: Record<string, string> | null = null;\n \n // 클라이언트 사이드에서만 동적 로드 시도\n if (typeof window !== 'undefined') {\n const possiblePaths = [\n `/translations/${language}/${namespace}.json`,\n `../translations/${language}/${namespace}.json`,\n `./translations/${language}/${namespace}.json`,\n `translations/${language}/${namespace}.json`,\n `../../translations/${language}/${namespace}.json`,\n ];\n\n for (const path of possiblePaths) {\n try {\n const response = await fetch(path);\n if (response.ok) {\n data = await response.json();\n if (debug) {\n console.log(`✅ Loaded translation from static path: ${path}`);\n }\n break;\n }\n } catch (pathError) {\n continue;\n }\n }\n }\n\n if (data) {\n return data;\n }\n\n return getDefaultTranslations(language, namespace);\n } catch (error) {\n if (debug) {\n console.warn(`Failed to load translation file: ${language}/${namespace}.json`);\n }\n return getDefaultTranslations(language, namespace);\n }\n };\n\n // 기본 파일 로더 선택\n const defaultFileLoader = translationLoader === 'api' \n ? apiRouteLoader \n : translationLoader === 'static'\n ? staticFileLoader\n : loadTranslations || apiRouteLoader;\n\n const config: I18nConfig = {\n defaultLanguage,\n fallbackLanguage,\n supportedLanguages: supportedLanguagesConfig,\n namespaces,\n loadTranslations: translationLoader === 'custom' && loadTranslations \n ? loadTranslations \n : defaultFileLoader,\n initialTranslations, // SSR 번역 데이터 전달\n debug,\n missingKeyHandler: (key: string, language?: string, namespace?: string) => {\n if (debug) {\n console.warn(`Missing translation key: ${key}`);\n \n // Debug SDK와 연동하여 누락 키 추적\n if (typeof window !== 'undefined' && window.__I18N_DEBUG_MISSING_KEYS__) {\n const missingKeys = window.__I18N_DEBUG_MISSING_KEYS__;\n const keyPath = `${language || 'unknown'}:${namespace || 'unknown'}`;\n missingKeys[keyPath] = missingKeys[keyPath] || [];\n if (!missingKeys[keyPath].includes(key)) {\n missingKeys[keyPath].push(key);\n }\n }\n \n return `[MISSING: ${key}]`;\n }\n return key.split('.').pop() || key;\n },\n errorHandler: (error: unknown, language: string, namespace: string) => {\n if (debug) {\n console.error(`Translation error for ${language}:${namespace}:`, error);\n }\n },\n // autoLanguageSync는 기본적으로 false (Zustand 어댑터 등 외부에서 직접 처리하는 경우)\n // 필요시 options에서 명시적으로 true로 설정 가능\n autoLanguageSync: options?.autoLanguageSync ?? false\n };\n\n // Provider 컴포넌트 반환\n return function CoreI18nProvider({ children }: { children: React.ReactNode }) {\n return React.createElement(I18nProvider, { config, children });\n };\n}\n\n// 기본 번역 데이터는 공통 유틸리티에서 가져옴\nimport { getDefaultTranslations } from './utils/default-translations';\n\n/**\n * 가장 기본적인 Provider (최소한의 설정)\n */\nexport function CoreProvider({ children }: { children: React.ReactNode }) {\n return createCoreI18n()({ children });\n}\n\n/**\n * 언어별 Provider (언어만 지정)\n */\nexport function createLanguageProvider(language: string) {\n return createCoreI18n({ defaultLanguage: language });\n}\n\n/**\n * 네임스페이스별 Provider (네임스페이스만 지정)\n */\nexport function createNamespaceProvider(namespaces: string[]) {\n return createCoreI18n({ namespaces });\n}\n\n/**\n * 커스텀 로더 Provider (사용자 정의 번역 로더 사용)\n */\nexport function createCustomLoaderProvider(\n loadTranslations: (language: string, namespace: string) => Promise<Record<string, string>>\n) {\n return createCoreI18n({ loadTranslations });\n}\n\n// 핵심 훅들 export\nexport { useTranslation, useLanguageChange, useI18n };\n\n// Provider export\nexport { I18nProvider };\n\n// 핵심 클래스/함수들 export\nexport { Translator, ssrTranslate, serverTranslate };\n\n// 플랫폼 어댑터 export\nexport { webPlatformAdapter, headlessPlatformAdapter };\n\n// 타입 export\nexport type { I18nConfig, I18nContextType, TranslationParams, TypedTranslationKeys, ResolveStringKey, ResolveArrayKey, ResolvePluralKey, PluralValue, PluralCategory, I18nPlatformAdapter };"]}
|
package/dist/index.d.mts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import React$1 from 'react';
|
|
2
2
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
3
|
-
import { I as I18nConfig, a as I18nContextType, L as LanguageConfig, R as ResolveStringKey, T as TranslationParams, b as ResolvePluralKey, c as ResolveArrayKey, d as TranslationError } from './server-
|
|
4
|
-
export { P as PluralCategory,
|
|
3
|
+
import { I as I18nConfig, a as I18nContextType, L as LanguageConfig, R as ResolveStringKey, T as TranslationParams, b as ResolvePluralKey, c as ResolveArrayKey, d as TranslationError } from './server-DgpyR0RE.mjs';
|
|
4
|
+
export { e as I18nPlatformAdapter, P as PluralCategory, f as PluralValue, g as Translator, h as TypedTranslationKeys, i as headlessPlatformAdapter, s as serverTranslate, j as ssrTranslate, w as webPlatformAdapter } from './server-DgpyR0RE.mjs';
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* I18n Provider 컴포넌트
|
|
@@ -43,7 +43,7 @@ declare function useTranslation(): {
|
|
|
43
43
|
tArray: (key: ResolveArrayKey, language?: string) => string[];
|
|
44
44
|
currentLanguage: string;
|
|
45
45
|
setLanguage: (language: string) => void | Promise<void>;
|
|
46
|
-
getRawValue: (key: string, language?: string) =>
|
|
46
|
+
getRawValue: <T = unknown>(key: string, language?: string) => T | undefined;
|
|
47
47
|
isLoading: boolean;
|
|
48
48
|
error: TranslationError | null;
|
|
49
49
|
supportedLanguages: LanguageConfig[];
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import React$1 from 'react';
|
|
2
2
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
3
|
-
import { I as I18nConfig, a as I18nContextType, L as LanguageConfig, R as ResolveStringKey, T as TranslationParams, b as ResolvePluralKey, c as ResolveArrayKey, d as TranslationError } from './server-
|
|
4
|
-
export { P as PluralCategory,
|
|
3
|
+
import { I as I18nConfig, a as I18nContextType, L as LanguageConfig, R as ResolveStringKey, T as TranslationParams, b as ResolvePluralKey, c as ResolveArrayKey, d as TranslationError } from './server-DgpyR0RE.js';
|
|
4
|
+
export { e as I18nPlatformAdapter, P as PluralCategory, f as PluralValue, g as Translator, h as TypedTranslationKeys, i as headlessPlatformAdapter, s as serverTranslate, j as ssrTranslate, w as webPlatformAdapter } from './server-DgpyR0RE.js';
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* I18n Provider 컴포넌트
|
|
@@ -43,7 +43,7 @@ declare function useTranslation(): {
|
|
|
43
43
|
tArray: (key: ResolveArrayKey, language?: string) => string[];
|
|
44
44
|
currentLanguage: string;
|
|
45
45
|
setLanguage: (language: string) => void | Promise<void>;
|
|
46
|
-
getRawValue: (key: string, language?: string) =>
|
|
46
|
+
getRawValue: <T = unknown>(key: string, language?: string) => T | undefined;
|
|
47
47
|
isLoading: boolean;
|
|
48
48
|
error: TranslationError | null;
|
|
49
49
|
supportedLanguages: LanguageConfig[];
|
package/dist/index.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { validateI18nConfig, Translator } from './chunk-
|
|
2
|
-
export { Translator, serverTranslate, ssrTranslate } from './chunk-
|
|
1
|
+
import { validateI18nConfig, webPlatformAdapter, Translator } from './chunk-7ZYOSEMW.mjs';
|
|
2
|
+
export { Translator, headlessPlatformAdapter, serverTranslate, ssrTranslate, webPlatformAdapter } from './chunk-7ZYOSEMW.mjs';
|
|
3
3
|
import React, { createContext, useState, useEffect, useMemo, useCallback, useContext } from 'react';
|
|
4
4
|
import { jsx } from 'react/jsx-runtime';
|
|
5
5
|
|
|
@@ -204,11 +204,25 @@ function getDefaultTranslations(language, namespace) {
|
|
|
204
204
|
return DEFAULT_TRANSLATIONS[language]?.[namespace] || {};
|
|
205
205
|
}
|
|
206
206
|
var I18nContext = createContext(null);
|
|
207
|
+
function resolveInitialLanguage(config) {
|
|
208
|
+
if (config.defaultLanguage) {
|
|
209
|
+
return config.defaultLanguage;
|
|
210
|
+
}
|
|
211
|
+
const adapter = config.platformAdapter ?? webPlatformAdapter;
|
|
212
|
+
const deviceLang = adapter.getDeviceLanguage();
|
|
213
|
+
if (deviceLang) {
|
|
214
|
+
const supportedCodes = config.supportedLanguages?.map((l) => l.code) ?? [];
|
|
215
|
+
if (supportedCodes.includes(deviceLang)) {
|
|
216
|
+
return deviceLang;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
return config.supportedLanguages?.[0]?.code ?? "ko";
|
|
220
|
+
}
|
|
207
221
|
function I18nProvider({
|
|
208
222
|
config,
|
|
209
223
|
children
|
|
210
224
|
}) {
|
|
211
|
-
const [currentLanguage, setCurrentLanguageState] = useState(config
|
|
225
|
+
const [currentLanguage, setCurrentLanguageState] = useState(() => resolveInitialLanguage(config));
|
|
212
226
|
const [isLoading, setIsLoading] = useState(true);
|
|
213
227
|
const [isInitialized, setIsInitialized] = useState(false);
|
|
214
228
|
const [error, setError] = useState(null);
|
|
@@ -297,25 +311,19 @@ function I18nProvider({
|
|
|
297
311
|
return unsubscribe;
|
|
298
312
|
}, [translator, isInitialized, currentLanguage, config.debug]);
|
|
299
313
|
useEffect(() => {
|
|
300
|
-
if (!config.autoLanguageSync
|
|
314
|
+
if (!config.autoLanguageSync) {
|
|
301
315
|
return;
|
|
302
316
|
}
|
|
303
|
-
const
|
|
304
|
-
|
|
305
|
-
if (
|
|
317
|
+
const adapter = config.platformAdapter ?? webPlatformAdapter;
|
|
318
|
+
return adapter.onLanguageChange((newLanguage) => {
|
|
319
|
+
if (newLanguage !== currentLanguage) {
|
|
306
320
|
if (config.debug) {
|
|
307
321
|
console.log("\u{1F310} Auto language sync:", newLanguage);
|
|
308
322
|
}
|
|
309
323
|
setLanguage(newLanguage);
|
|
310
324
|
}
|
|
311
|
-
};
|
|
312
|
-
|
|
313
|
-
window.addEventListener("i18nLanguageChanged", handleLanguageChange);
|
|
314
|
-
return () => {
|
|
315
|
-
window.removeEventListener("huaI18nLanguageChange", handleLanguageChange);
|
|
316
|
-
window.removeEventListener("i18nLanguageChanged", handleLanguageChange);
|
|
317
|
-
};
|
|
318
|
-
}, [config.autoLanguageSync, currentLanguage]);
|
|
325
|
+
});
|
|
326
|
+
}, [config.autoLanguageSync, config.platformAdapter, currentLanguage]);
|
|
319
327
|
const setLanguage = useCallback(async (language) => {
|
|
320
328
|
if (!translator) {
|
|
321
329
|
return;
|
|
@@ -593,9 +601,8 @@ function I18nProvider({
|
|
|
593
601
|
error,
|
|
594
602
|
supportedLanguages: config.supportedLanguages,
|
|
595
603
|
debug,
|
|
596
|
-
isInitialized
|
|
597
|
-
|
|
598
|
-
}), [currentLanguage, setLanguage, t, tPlural, tArray, tAsync, tSync, getRawValue, isLoading, error, config.supportedLanguages, debug, isInitialized, translationVersion]);
|
|
604
|
+
isInitialized
|
|
605
|
+
}), [currentLanguage, setLanguage, t, tPlural, tArray, tAsync, tSync, getRawValue, isLoading, error, config.supportedLanguages, debug, isInitialized]);
|
|
599
606
|
return /* @__PURE__ */ jsx(I18nContext.Provider, { value, children });
|
|
600
607
|
}
|
|
601
608
|
function useI18n() {
|