ERP-node/frontend/hooks/useMultiLang.ts

146 lines
4.6 KiB
TypeScript

import { useState, useEffect } from "react";
import { setTranslationCache } from "@/lib/utils/multilang";
import { apiClient } from "@/lib/api/client";
interface UseMultiLangOptions {
companyCode?: string;
defaultLang?: string;
}
// 전역 언어 상태 관리
let globalUserLang = "KR";
let globalChangeLangCallback: ((lang: string) => void) | null = null;
export function useMultiLang(options: UseMultiLangOptions = {}) {
const { companyCode = "ILSHIN", defaultLang = "KR" } = options;
const [userLang, setUserLang] = useState(globalUserLang || defaultLang);
// 전역 언어 상태 업데이트
useEffect(() => {
globalUserLang = userLang;
// window 객체에 전역 언어 상태 저장 (API 클라이언트에서 접근용)
if (typeof window !== "undefined") {
(window as any).__GLOBAL_USER_LANG = userLang;
console.log("전역 언어 상태 설정:", userLang);
}
if (globalChangeLangCallback) {
globalChangeLangCallback(userLang);
}
}, [userLang]);
// API 기본 URL 설정
const API_BASE_URL = process.env.NEXT_PUBLIC_API_URL || "http://localhost:8080";
// 브라우저 언어 감지
useEffect(() => {
const fetchUserLocale = async () => {
try {
console.log("🔍 사용자 로케일 조회 시작");
const response = await apiClient.get("/admin/user-locale");
if (response.data.success && response.data.data) {
const userLocale = response.data.data;
console.log("✅ 사용자 로케일 조회 성공:", userLocale);
// 사용자 로케일을 데이터베이스 언어 코드로 매핑
const langMapping: Record<string, string> = {
ko: "KR",
en: "US",
ja: "JP",
zh: "CN",
};
const mappedLang = langMapping[userLocale] || userLocale;
console.log("🔄 언어 매핑:", userLocale, "->", mappedLang);
setUserLang(mappedLang);
return;
}
// API 호출 실패 시 브라우저 언어 사용
console.warn("⚠️ 사용자 로케일 조회 실패, 브라우저 언어 사용");
const browserLang = navigator.language.split("-")[0];
const langMapping: Record<string, string> = {
ko: "KR",
en: "US",
ja: "JP",
zh: "CN",
};
if (langMapping[browserLang]) {
setUserLang(langMapping[browserLang]);
}
} catch (error) {
console.error("❌ 사용자 로케일 조회 중 오류:", error);
// 오류 시 브라우저 언어 사용
const browserLang = navigator.language.split("-")[0];
const langMapping: Record<string, string> = {
ko: "KR",
en: "US",
ja: "JP",
zh: "CN",
};
if (langMapping[browserLang]) {
setUserLang(langMapping[browserLang]);
}
}
};
fetchUserLocale();
}, []);
// 다국어 텍스트 가져오기
const getText = async (menuCode: string, langKey: string, fallback?: string): Promise<string> => {
console.log(`🔍 다국어 텍스트 요청:`, { menuCode, langKey, userLang, companyCode });
try {
const url = `/multilang/user-text/${companyCode}/${menuCode}/${langKey}?userLang=${userLang}`;
console.log(`📡 API 요청 URL:`, url);
const response = await apiClient.get(url);
console.log(`📡 API 응답 상태:`, response.status, response.statusText);
if (response.data.success && response.data.data) {
// 개별 번역 텍스트를 캐시에 저장
const cacheKey = `${menuCode}.${langKey}`;
const currentCache = (window as any).__TRANSLATION_CACHE || {};
currentCache[cacheKey] = response.data.data;
(window as any).__TRANSLATION_CACHE = currentCache;
return response.data.data;
}
// 실패 시 fallback 또는 키 반환
console.log(`🔄 API 성공했지만 데이터 없음, fallback 반환:`, fallback || langKey);
return fallback || langKey;
} catch (error) {
console.error("❌ 다국어 텍스트 조회 실패:", error);
console.log(`🔄 에러 시 fallback 반환:`, fallback || langKey);
return fallback || langKey;
}
};
// 언어 변경
const changeLang = (newLang: string) => {
setUserLang(newLang);
globalUserLang = newLang;
};
// 전역 언어 상태 접근자
const getGlobalUserLang = () => globalUserLang;
const setGlobalChangeLangCallback = (callback: (lang: string) => void) => {
globalChangeLangCallback = callback;
};
return {
userLang,
getText,
changeLang,
companyCode,
getGlobalUserLang,
setGlobalChangeLangCallback,
};
}