@hua-labs/i18n-core 2.0.4 → 2.1.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/translator-factory.ts","../src/utils/default-translations.ts","../src/hooks/useI18n.tsx","../src/hooks/useTranslation.tsx","../src/index.ts"],"names":["error","value","useCallback"],"mappings":"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","file":"index.mjs","sourcesContent":["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} from '../types';\nimport { getDefaultTranslations } from '../utils/default-translations';\n\n// React Context\nconst I18nContext = createContext<I18nContextType | null>(null);\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(config.defaultLanguage);\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 || typeof window === 'undefined') {\n return;\n }\n\n const handleLanguageChange = (event: CustomEvent) => {\n const newLanguage = event.detail;\n if (typeof newLanguage === 'string' && newLanguage !== currentLanguage) {\n if (config.debug) {\n console.log('🌐 Auto language sync:', newLanguage);\n }\n setLanguage(newLanguage);\n }\n };\n\n // HUA i18n 언어 전환 이벤트 감지\n window.addEventListener('huaI18nLanguageChange', handleLanguageChange as EventListener);\n \n // 일반적인 언어 변경 이벤트도 감지\n window.addEventListener('i18nLanguageChanged', handleLanguageChange as EventListener);\n \n return () => {\n window.removeEventListener('huaI18nLanguageChange', handleLanguageChange as EventListener);\n window.removeEventListener('i18nLanguageChanged', handleLanguageChange as EventListener);\n };\n }, [config.autoLanguageSync, 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((key: string, language?: string): unknown => {\n if (!translator || !isInitialized) {\n return undefined;\n }\n return translator.getRawValue(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 translationVersion,\n }), [currentLanguage, setLanguage, t, tPlural, tArray, tAsync, tSync, getRawValue, isLoading, error, config.supportedLanguages, debug, isInitialized, translationVersion]);\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: () => 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 } 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 type { I18nConfig, I18nContextType, TranslationParams, TypedTranslationKeys, ResolveStringKey, ResolveArrayKey, ResolvePluralKey, PluralValue, PluralCategory };"]}
1
+ {"version":3,"sources":["../src/core/translator-factory.ts","../src/utils/default-translations.ts","../src/hooks/useI18n.tsx","../src/hooks/useTranslation.tsx","../src/index.ts"],"names":["error","value","useCallback"],"mappings":"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","file":"index.mjs","sourcesContent":["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} from '../types';\nimport { getDefaultTranslations } from '../utils/default-translations';\n\n// React Context\nconst I18nContext = createContext<I18nContextType | null>(null);\n\n/**\n * 초기 언어를 결정하는 헬퍼 함수\n * 우선순위: config.defaultLanguage > navigator.language 매칭 > supportedLanguages[0]\n * config.defaultLanguage가 명시적으로 제공되지 않은 경우에만 navigator.language 감지 동작\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. navigator.language 매칭 (SSR 환경에서는 navigator가 없으므로 체크 필요)\n if (typeof window !== 'undefined' && navigator?.language) {\n const browserLang = navigator.language.slice(0, 2).toLowerCase();\n const supportedCodes = config.supportedLanguages?.map(l => l.code) ?? [];\n if (supportedCodes.includes(browserLang)) {\n return browserLang;\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 || typeof window === 'undefined') {\n return;\n }\n\n const handleLanguageChange = (event: CustomEvent) => {\n const newLanguage = event.detail;\n if (typeof newLanguage === 'string' && newLanguage !== currentLanguage) {\n if (config.debug) {\n console.log('🌐 Auto language sync:', newLanguage);\n }\n setLanguage(newLanguage);\n }\n };\n\n // HUA i18n 언어 전환 이벤트 감지\n window.addEventListener('huaI18nLanguageChange', handleLanguageChange as EventListener);\n \n // 일반적인 언어 변경 이벤트도 감지\n window.addEventListener('i18nLanguageChanged', handleLanguageChange as EventListener);\n \n return () => {\n window.removeEventListener('huaI18nLanguageChange', handleLanguageChange as EventListener);\n window.removeEventListener('i18nLanguageChanged', handleLanguageChange as EventListener);\n };\n }, [config.autoLanguageSync, 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((key: string, language?: string): unknown => {\n if (!translator || !isInitialized) {\n return undefined;\n }\n return translator.getRawValue(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: () => 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 } 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 type { I18nConfig, I18nContextType, TranslationParams, TypedTranslationKeys, ResolveStringKey, ResolveArrayKey, ResolvePluralKey, PluralValue, PluralCategory };"]}
package/dist/server.mjs CHANGED
@@ -1,3 +1,3 @@
1
- export { Translator, serverTranslate, ssrTranslate } from './chunk-F4PDBJLO.mjs';
1
+ export { Translator, serverTranslate, ssrTranslate } from './chunk-EZL5TNH5.mjs';
2
2
  //# sourceMappingURL=server.mjs.map
3
3
  //# sourceMappingURL=server.mjs.map
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "@hua-labs/i18n-core",
3
- "version": "2.0.4",
3
+ "version": "2.1.0",
4
4
  "description": "HUA Labs - Core i18n functionality with SSR/CSR support and state management integration",
5
- "main": "./dist/index.js",
5
+ "main": "./dist/index.mjs",
6
6
  "module": "./dist/index.mjs",
7
7
  "types": "./dist/index.d.ts",
8
8
  "files": [
@@ -13,12 +13,12 @@
13
13
  ".": {
14
14
  "types": "./dist/index.d.ts",
15
15
  "import": "./dist/index.mjs",
16
- "require": "./dist/index.js"
16
+ "default": "./dist/index.mjs"
17
17
  },
18
18
  "./server": {
19
19
  "types": "./dist/server.d.ts",
20
20
  "import": "./dist/server.mjs",
21
- "require": "./dist/server.js"
21
+ "default": "./dist/server.mjs"
22
22
  }
23
23
  },
24
24
  "sideEffects": false,
@@ -28,16 +28,16 @@
28
28
  "devDependencies": {
29
29
  "@testing-library/jest-dom": "^6.6.3",
30
30
  "@testing-library/react": "^16.3.0",
31
- "@types/node": "^25.2.0",
32
- "@types/react": "^19.2.10",
33
- "@vitejs/plugin-react": "^4.5.2",
34
- "eslint": "^10.0.0",
35
- "jsdom": "^26.1.0",
31
+ "@types/node": "^25.3.0",
32
+ "@types/react": "^19.2.14",
33
+ "@vitejs/plugin-react": "^5.1.4",
34
+ "eslint": "^10.0.1",
35
+ "jsdom": "^28.1.0",
36
36
  "react": "^19.2.4",
37
37
  "react-dom": "^19.2.4",
38
38
  "tsup": "^8.5.1",
39
39
  "typescript": "^5.9.3",
40
- "vitest": "^3.2.1"
40
+ "vitest": "^4.0.18"
41
41
  },
42
42
  "peerDependencies": {
43
43
  "react": ">=19.0.0"
@@ -75,7 +75,7 @@
75
75
  "clean": "rm -rf dist",
76
76
  "test": "vitest run",
77
77
  "test:watch": "vitest",
78
- "lint": "echo 'Skipping lint for hua-i18n-core (ESLint 8, needs separate config)'",
78
+ "lint": "eslint .",
79
79
  "type-check": "tsc --noEmit",
80
80
  "generate:types": "tsx scripts/generate-i18n-types.ts",
81
81
  "validate:translations": "tsx scripts/validate-translations.ts"
@@ -14,17 +14,43 @@ import { getDefaultTranslations } from '../utils/default-translations';
14
14
  // React Context
15
15
  const I18nContext = createContext<I18nContextType | null>(null);
16
16
 
17
+ /**
18
+ * 초기 언어를 결정하는 헬퍼 함수
19
+ * 우선순위: config.defaultLanguage > navigator.language 매칭 > supportedLanguages[0]
20
+ * config.defaultLanguage가 명시적으로 제공되지 않은 경우에만 navigator.language 감지 동작
21
+ */
22
+ function resolveInitialLanguage(
23
+ config: I18nConfig & { autoLanguageSync?: boolean }
24
+ ): string {
25
+ // 1. config.defaultLanguage가 명시적으로 제공된 경우 우선 사용
26
+ if (config.defaultLanguage) {
27
+ return config.defaultLanguage;
28
+ }
29
+
30
+ // 2. navigator.language 매칭 (SSR 환경에서는 navigator가 없으므로 체크 필요)
31
+ if (typeof window !== 'undefined' && navigator?.language) {
32
+ const browserLang = navigator.language.slice(0, 2).toLowerCase();
33
+ const supportedCodes = config.supportedLanguages?.map(l => l.code) ?? [];
34
+ if (supportedCodes.includes(browserLang)) {
35
+ return browserLang;
36
+ }
37
+ }
38
+
39
+ // 3. 첫 번째 지원 언어로 폴백
40
+ return config.supportedLanguages?.[0]?.code ?? 'ko';
41
+ }
42
+
17
43
  /**
18
44
  * I18n Provider 컴포넌트
19
45
  */
20
- export function I18nProvider({
21
- config,
22
- children
23
- }: {
24
- config: I18nConfig & { autoLanguageSync?: boolean };
25
- children: React.ReactNode;
46
+ export function I18nProvider({
47
+ config,
48
+ children
49
+ }: {
50
+ config: I18nConfig & { autoLanguageSync?: boolean };
51
+ children: React.ReactNode;
26
52
  }) {
27
- const [currentLanguage, setCurrentLanguageState] = useState(config.defaultLanguage);
53
+ const [currentLanguage, setCurrentLanguageState] = useState(() => resolveInitialLanguage(config));
28
54
  const [isLoading, setIsLoading] = useState(true);
29
55
  const [isInitialized, setIsInitialized] = useState(false);
30
56
  const [error, setError] = useState<TranslationError | null>(null);
@@ -524,8 +550,7 @@ export function I18nProvider({
524
550
  supportedLanguages: config.supportedLanguages,
525
551
  debug,
526
552
  isInitialized,
527
- translationVersion,
528
- }), [currentLanguage, setLanguage, t, tPlural, tArray, tAsync, tSync, getRawValue, isLoading, error, config.supportedLanguages, debug, isInitialized, translationVersion]);
553
+ }), [currentLanguage, setLanguage, t, tPlural, tArray, tAsync, tSync, getRawValue, isLoading, error, config.supportedLanguages, debug, isInitialized]);
529
554
 
530
555
  return (
531
556
  <I18nContext.Provider value={value}>
@@ -206,7 +206,7 @@ export interface TranslationParams {
206
206
  *
207
207
  * augmentation이 없으면 string으로 fallback (breaking 없음).
208
208
  */
209
- // eslint-disable-next-line @typescript-eslint/no-empty-interface
209
+
210
210
  export interface TypedTranslationKeys {}
211
211
 
212
212
  /** augmentation 시 좁혀진 타입, 미설정 시 string */