Implement multi-language support in user management and system management pages
- Integrated multi-language functionality across various user management components, including user list, roles list, and user authorization pages, enhancing accessibility for diverse users. - Updated UI elements to utilize translation keys, ensuring that all text is dynamically translated based on user preferences. - Improved error handling messages to be localized, providing a better user experience in case of issues. These changes significantly enhance the usability and internationalization of the user management features, making the application more inclusive.
This commit is contained in:
75
frontend/hooks/usePageMultiLang.ts
Normal file
75
frontend/hooks/usePageMultiLang.ts
Normal file
@@ -0,0 +1,75 @@
|
||||
import { useState, useEffect, useCallback } from "react";
|
||||
import { apiClient } from "@/lib/api/client";
|
||||
import { useMultiLang } from "@/hooks/useMultiLang";
|
||||
import { setTranslationCache } from "@/lib/utils/multilang";
|
||||
|
||||
interface UsePageMultiLangOptions {
|
||||
keys: readonly string[];
|
||||
defaults: Record<string, string>;
|
||||
menuCode: string;
|
||||
}
|
||||
|
||||
/**
|
||||
* 페이지별 다국어 텍스트 관리 훅
|
||||
* - keys: 다국어 키 배열
|
||||
* - defaults: 한국어 기본 텍스트 매핑
|
||||
* - menuCode: 배치 API에 전달할 메뉴 코드
|
||||
*/
|
||||
export function usePageMultiLang({ keys, defaults, menuCode }: UsePageMultiLangOptions) {
|
||||
const { userLang } = useMultiLang();
|
||||
const [uiTexts, setUiTexts] = useState<Record<string, string>>(() => ({ ...defaults }));
|
||||
const [loading, setLoading] = useState(false);
|
||||
|
||||
// 배치 번역 로드
|
||||
useEffect(() => {
|
||||
if (!userLang || loading) return;
|
||||
|
||||
let cancelled = false;
|
||||
const load = async () => {
|
||||
setLoading(true);
|
||||
try {
|
||||
const response = await apiClient.post(
|
||||
"/multilang/batch",
|
||||
{
|
||||
langKeys: keys,
|
||||
companyCode: "*",
|
||||
menuCode,
|
||||
userLang,
|
||||
},
|
||||
{ params: {} },
|
||||
);
|
||||
|
||||
if (!cancelled && response.data.success && response.data.data) {
|
||||
const merged = { ...defaults, ...response.data.data };
|
||||
setUiTexts(merged);
|
||||
setTranslationCache(userLang, merged);
|
||||
}
|
||||
} catch {
|
||||
// API 실패 시 기본 텍스트 유지
|
||||
} finally {
|
||||
if (!cancelled) setLoading(false);
|
||||
}
|
||||
};
|
||||
|
||||
load();
|
||||
return () => { cancelled = true; };
|
||||
}, [userLang]);
|
||||
|
||||
// 동기 텍스트 조회 함수
|
||||
const t = useCallback(
|
||||
(key: string, params?: Record<string, string | number>): string => {
|
||||
let text = uiTexts[key] || defaults[key] || key;
|
||||
|
||||
if (params) {
|
||||
Object.entries(params).forEach(([k, v]) => {
|
||||
text = text.replace(`{${k}}`, String(v));
|
||||
});
|
||||
}
|
||||
|
||||
return text;
|
||||
},
|
||||
[uiTexts, defaults],
|
||||
);
|
||||
|
||||
return { t, userLang, loading };
|
||||
}
|
||||
Reference in New Issue
Block a user