최초커밋

This commit is contained in:
kjs
2025-08-21 09:41:46 +09:00
commit a0e5b57a24
2454 changed files with 1476904 additions and 0 deletions

View File

@@ -0,0 +1,438 @@
import { useMultiLang } from "@/hooks/useMultiLang";
// 메뉴 관리 화면 다국어 키 상수
export const MENU_MANAGEMENT_KEYS = {
// 메뉴 타입 관련
TITLE: "menu.management.title",
DESCRIPTION: "menu.management.description",
MENU_TYPE_TITLE: "menu.type.title",
ADMIN_MENU: "menu.management.admin",
USER_MENU: "menu.management.user",
ADMIN_DESCRIPTION: "menu.management.admin.description",
USER_DESCRIPTION: "menu.management.user.description",
MENU_TYPE_ADMIN: "menu.type.admin",
MENU_TYPE_USER: "menu.type.user",
// 메뉴 목록 관련
LIST_TITLE: "menu.list.title",
LIST_TOTAL: "menu.list.total",
LIST_SEARCH_RESULT: "menu.list.search.result",
// 필터 및 검색 관련
FILTER_COMPANY: "filter.company",
FILTER_COMPANY_ALL: "filter.company.all",
FILTER_COMPANY_COMMON: "filter.company.common",
FILTER_COMPANY_SEARCH: "filter.company.search",
FILTER_SEARCH: "filter.search",
FILTER_SEARCH_PLACEHOLDER: "filter.search.placeholder",
FILTER_RESET: "filter.reset",
// 버튼 관련
BUTTON_ADD: "button.add",
BUTTON_ADD_TOP_LEVEL: "button.add.top.level",
BUTTON_ADD_SUB: "button.add.sub",
BUTTON_EDIT: "button.edit",
BUTTON_DELETE: "button.delete",
BUTTON_DELETE_SELECTED: "button.delete.selected",
BUTTON_DELETE_SELECTED_COUNT: "button.delete.selected.count",
BUTTON_DELETE_PROCESSING: "button.delete.processing",
BUTTON_CANCEL: "button.cancel",
BUTTON_SAVE: "button.save",
BUTTON_SAVE_PROCESSING: "button.save.processing",
BUTTON_REGISTER: "button.register",
BUTTON_MODIFY: "button.modify",
// 메뉴 폼 관련
FORM_MENU_TYPE: "form.menu.type",
FORM_MENU_TYPE_ADMIN: "form.menu.type.admin",
FORM_MENU_TYPE_USER: "form.menu.type.user",
FORM_STATUS: "form.status",
FORM_STATUS_ACTIVE: "form.status.active",
FORM_STATUS_INACTIVE: "form.status.inactive",
FORM_COMPANY: "form.company",
FORM_COMPANY_SELECT: "form.company.select",
FORM_COMPANY_COMMON: "form.company.common",
FORM_COMPANY_SUBMENU_NOTE: "form.company.submenu.note",
FORM_MENU_NAME: "form.menu.name",
FORM_MENU_NAME_PLACEHOLDER: "form.menu.name.placeholder",
FORM_MENU_URL: "form.menu.url",
FORM_MENU_URL_PLACEHOLDER: "form.menu.url.placeholder",
FORM_MENU_DESCRIPTION: "form.menu.description",
FORM_MENU_DESCRIPTION_PLACEHOLDER: "form.menu.description.placeholder",
FORM_MENU_SEQUENCE: "form.menu.sequence",
FORM_LANG_KEY: "form.lang.key",
FORM_LANG_KEY_SELECT: "form.lang.key.select",
FORM_LANG_KEY_NONE: "form.lang.key.none",
FORM_LANG_KEY_SEARCH: "form.lang.key.search",
FORM_LANG_KEY_SELECTED: "form.lang.key.selected",
// 모달 관련
MODAL_MENU_REGISTER_TITLE: "modal.menu.register.title",
MODAL_MENU_MODIFY_TITLE: "modal.menu.modify.title",
MODAL_DELETE_TITLE: "modal.delete.title",
MODAL_DELETE_DESCRIPTION: "modal.delete.description",
MODAL_DELETE_BATCH_DESCRIPTION: "modal.delete.batch.description",
// 테이블 헤더 관련
TABLE_HEADER_SELECT: "table.header.select",
TABLE_HEADER_MENU_NAME: "table.header.menu.name",
TABLE_HEADER_MENU_URL: "table.header.menu.url",
TABLE_HEADER_MENU_TYPE: "table.header.menu.type",
TABLE_HEADER_STATUS: "table.header.status",
TABLE_HEADER_COMPANY: "table.header.company",
TABLE_HEADER_SEQUENCE: "table.header.sequence",
TABLE_HEADER_ACTIONS: "table.header.actions",
// 상태 관련
STATUS_ACTIVE: "status.active",
STATUS_INACTIVE: "status.inactive",
STATUS_UNSPECIFIED: "status.unspecified",
// 메시지 관련
MESSAGE_LOADING: "message.loading",
MESSAGE_MENU_DELETE_PROCESSING: "message.menu.delete.processing",
MESSAGE_MENU_SAVE_SUCCESS: "message.menu.save.success",
MESSAGE_MENU_SAVE_FAILED: "message.menu.save.failed",
MESSAGE_MENU_DELETE_SUCCESS: "message.menu.delete.success",
MESSAGE_MENU_DELETE_FAILED: "message.menu.delete.failed",
MESSAGE_MENU_DELETE_BATCH_SUCCESS: "message.menu.delete.batch.success",
MESSAGE_MENU_DELETE_BATCH_PARTIAL: "message.menu.delete.batch.partial",
MESSAGE_MENU_STATUS_TOGGLE_SUCCESS: "message.menu.status.toggle.success",
MESSAGE_MENU_STATUS_TOGGLE_FAILED: "message.menu.status.toggle.failed",
MESSAGE_VALIDATION_MENU_NAME_REQUIRED: "message.validation.menu.name.required",
MESSAGE_VALIDATION_COMPANY_REQUIRED: "message.validation.company.required",
MESSAGE_VALIDATION_SELECT_MENU_DELETE: "message.validation.select.menu.delete",
MESSAGE_ERROR_LOAD_MENU_LIST: "message.error.load.menu.list",
MESSAGE_ERROR_LOAD_MENU_INFO: "message.error.load.menu.info",
MESSAGE_ERROR_LOAD_COMPANY_LIST: "message.error.load.company.list",
MESSAGE_ERROR_LOAD_LANG_KEY_LIST: "message.error.load.lang.key.list",
// 기타 UI 요소
UI_EXPAND: "ui.expand",
UI_COLLAPSE: "ui.collapse",
UI_MENU_COLLAPSE: "ui.menu.collapse",
UI_LANGUAGE: "ui.language",
} as const;
// 다국어 텍스트 가져오기 함수
export const useMenuManagementText = () => {
const { getText } = useMultiLang({ companyCode: "*" });
const getMenuText = async (key: string, params?: Record<string, string | number>): Promise<string> => {
let text = await getText("MENU_MANAGEMENT", key);
// 파라미터 치환
if (params) {
Object.entries(params).forEach(([paramKey, paramValue]) => {
text = text.replace(new RegExp(`\\{${paramKey}\\}`, "g"), paramValue.toString());
});
}
return text;
};
return {
getMenuText,
keys: MENU_MANAGEMENT_KEYS,
};
};
// 전역 번역 캐시
let translationCache: Record<string, Record<string, string>> = {};
// 번역 캐시 설정 함수
export const setTranslationCache = (lang: string, translations: Record<string, string>) => {
translationCache[lang] = translations;
};
// 번역 캐시 가져오기 함수
export const getTranslationCache = (lang: string): Record<string, string> => {
return translationCache[lang] || {};
};
// 동기적 다국어 텍스트 가져오기 (캐시된 값 사용)
export const getMenuTextSync = (key: string, params?: Record<string, any>): string => {
// 전역 언어 상태 확인
const userLang = (typeof window !== "undefined" && (window as any).__GLOBAL_USER_LANG) || "KR";
// 현재 언어가 한국어가 아니면 캐시에서 번역 텍스트 찾기
if (userLang !== "KR") {
// 1. 먼저 전역 캐시에서 찾기
const cachedTranslations = getTranslationCache(userLang);
if (cachedTranslations[key]) {
let text = cachedTranslations[key];
// 파라미터 치환
if (params) {
Object.entries(params).forEach(([paramKey, paramValue]) => {
text = text.replace(new RegExp(`\\{${paramKey}\\}`, "g"), paramValue.toString());
});
}
return text;
}
// 2. 개별 캐시에서 찾기
const individualCache = (typeof window !== "undefined" && (window as any).__TRANSLATION_CACHE) || {};
const cacheKey = `MENU_MANAGEMENT.${key}`;
if (individualCache[cacheKey]) {
let text = individualCache[cacheKey];
// 파라미터 치환
if (params) {
Object.entries(params).forEach(([paramKey, paramValue]) => {
text = text.replace(new RegExp(`\\{${paramKey}\\}`, "g"), paramValue.toString());
});
}
console.log(`✅ 개별 캐시에서 번역 사용:`, { key, result: text, userLang });
return text;
}
// 3. 캐시에 없으면 비동기적으로 로드 시도
console.log(`⚠️ getMenuTextSync: 캐시에 번역이 없습니다. 키: ${key}, 언어: ${userLang}`);
// 비동기적으로 번역 로드 (백그라운드에서)
if (typeof window !== "undefined") {
const API_BASE_URL = process.env.NEXT_PUBLIC_API_URL || "http://localhost:8080";
const companyCode = "*";
fetch(`${API_BASE_URL}/multilang/user-text/${companyCode}/MENU_MANAGEMENT/${key}?userLang=${userLang}`, {
credentials: "include",
headers: {
"Content-Type": "application/json",
},
})
.then((response) => response.json())
.then((data) => {
if (data.success && data.data) {
// 개별 캐시에 저장
const currentCache = (window as any).__TRANSLATION_CACHE || {};
currentCache[cacheKey] = data.data;
(window as any).__TRANSLATION_CACHE = currentCache;
// 전역 캐시에도 저장
const globalCache = getTranslationCache(userLang);
globalCache[key] = data.data;
setTranslationCache(userLang, globalCache);
// 페이지 리렌더링을 위해 이벤트 발생
window.dispatchEvent(
new CustomEvent("translation-loaded", {
detail: { key, text: data.data, userLang },
}),
);
}
})
.catch((error) => {
console.error(`❌ 백그라운드 번역 로드 실패:`, { key, error });
});
}
// 캐시에 없으면 기본 텍스트에서 찾기
const defaultTexts: Record<string, string> = {
[MENU_MANAGEMENT_KEYS.TITLE]: "메뉴 관리",
[MENU_MANAGEMENT_KEYS.DESCRIPTION]: "시스템의 메뉴 구조와 권한을 관리합니다.",
[MENU_MANAGEMENT_KEYS.MENU_TYPE_TITLE]: "메뉴 타입",
[MENU_MANAGEMENT_KEYS.MENU_TYPE_ADMIN]: "관리자",
[MENU_MANAGEMENT_KEYS.MENU_TYPE_USER]: "사용자",
[MENU_MANAGEMENT_KEYS.ADMIN_MENU]: "관리자 메뉴",
[MENU_MANAGEMENT_KEYS.USER_MENU]: "사용자 메뉴",
[MENU_MANAGEMENT_KEYS.ADMIN_DESCRIPTION]: "시스템 관리 및 설정 메뉴",
[MENU_MANAGEMENT_KEYS.USER_DESCRIPTION]: "일반 사용자 업무 메뉴",
[MENU_MANAGEMENT_KEYS.BUTTON_ADD]: "추가",
[MENU_MANAGEMENT_KEYS.BUTTON_ADD_TOP_LEVEL]: "최상위 메뉴 추가",
[MENU_MANAGEMENT_KEYS.BUTTON_ADD_SUB]: "하위 메뉴 추가",
[MENU_MANAGEMENT_KEYS.BUTTON_EDIT]: "수정",
[MENU_MANAGEMENT_KEYS.BUTTON_DELETE]: "삭제",
[MENU_MANAGEMENT_KEYS.BUTTON_DELETE_SELECTED]: "선택 삭제",
[MENU_MANAGEMENT_KEYS.BUTTON_DELETE_SELECTED_COUNT]: "선택 삭제 ({count})",
[MENU_MANAGEMENT_KEYS.BUTTON_DELETE_PROCESSING]: "삭제 중...",
[MENU_MANAGEMENT_KEYS.BUTTON_CANCEL]: "취소",
[MENU_MANAGEMENT_KEYS.BUTTON_SAVE]: "저장",
[MENU_MANAGEMENT_KEYS.BUTTON_SAVE_PROCESSING]: "저장 중...",
[MENU_MANAGEMENT_KEYS.BUTTON_REGISTER]: "등록",
[MENU_MANAGEMENT_KEYS.BUTTON_MODIFY]: "수정",
[MENU_MANAGEMENT_KEYS.FORM_MENU_TYPE]: "메뉴 타입",
[MENU_MANAGEMENT_KEYS.FORM_MENU_TYPE_ADMIN]: "관리자",
[MENU_MANAGEMENT_KEYS.FORM_MENU_TYPE_USER]: "사용자",
[MENU_MANAGEMENT_KEYS.FORM_STATUS]: "상태",
[MENU_MANAGEMENT_KEYS.FORM_STATUS_ACTIVE]: "활성화",
[MENU_MANAGEMENT_KEYS.FORM_STATUS_INACTIVE]: "비활성화",
[MENU_MANAGEMENT_KEYS.FORM_COMPANY]: "회사",
[MENU_MANAGEMENT_KEYS.FORM_COMPANY_SELECT]: "회사를 선택하세요",
[MENU_MANAGEMENT_KEYS.FORM_COMPANY_COMMON]: "공통",
[MENU_MANAGEMENT_KEYS.FORM_COMPANY_SUBMENU_NOTE]: "하위 메뉴는 상위 메뉴와 동일한 회사를 가져야 합니다.",
[MENU_MANAGEMENT_KEYS.FORM_MENU_NAME]: "메뉴명",
[MENU_MANAGEMENT_KEYS.FORM_MENU_NAME_PLACEHOLDER]: "메뉴명을 입력하세요",
[MENU_MANAGEMENT_KEYS.FORM_MENU_URL]: "URL",
[MENU_MANAGEMENT_KEYS.FORM_MENU_URL_PLACEHOLDER]: "메뉴 URL을 입력하세요",
[MENU_MANAGEMENT_KEYS.FORM_MENU_DESCRIPTION]: "설명",
[MENU_MANAGEMENT_KEYS.FORM_MENU_DESCRIPTION_PLACEHOLDER]: "메뉴 설명을 입력하세요",
[MENU_MANAGEMENT_KEYS.FORM_MENU_SEQUENCE]: "순서",
[MENU_MANAGEMENT_KEYS.FORM_LANG_KEY]: "다국어 키",
[MENU_MANAGEMENT_KEYS.FORM_LANG_KEY_SELECT]: "다국어 키를 선택하세요",
[MENU_MANAGEMENT_KEYS.FORM_LANG_KEY_NONE]: "다국어 키 없음",
[MENU_MANAGEMENT_KEYS.FORM_LANG_KEY_SEARCH]: "다국어 키 검색...",
[MENU_MANAGEMENT_KEYS.FORM_LANG_KEY_SELECTED]: "선택된 키: {key} - {description}",
[MENU_MANAGEMENT_KEYS.MODAL_MENU_REGISTER_TITLE]: "메뉴 등록",
[MENU_MANAGEMENT_KEYS.MODAL_MENU_MODIFY_TITLE]: "메뉴 수정",
[MENU_MANAGEMENT_KEYS.MODAL_DELETE_TITLE]: "메뉴 삭제",
[MENU_MANAGEMENT_KEYS.MODAL_DELETE_DESCRIPTION]: "해당 메뉴를 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다.",
[MENU_MANAGEMENT_KEYS.MODAL_DELETE_BATCH_DESCRIPTION]:
"선택된 {count}개의 메뉴를 영구적으로 삭제하시겠습니까?\n\n⚠ 주의: 상위 메뉴를 삭제하면 하위 메뉴들도 함께 삭제됩니다.\n이 작업은 되돌릴 수 없습니다.",
[MENU_MANAGEMENT_KEYS.TABLE_HEADER_SELECT]: "선택",
[MENU_MANAGEMENT_KEYS.TABLE_HEADER_MENU_NAME]: "메뉴명",
[MENU_MANAGEMENT_KEYS.TABLE_HEADER_MENU_URL]: "URL",
[MENU_MANAGEMENT_KEYS.TABLE_HEADER_MENU_TYPE]: "메뉴 타입",
[MENU_MANAGEMENT_KEYS.TABLE_HEADER_STATUS]: "상태",
[MENU_MANAGEMENT_KEYS.TABLE_HEADER_COMPANY]: "회사",
[MENU_MANAGEMENT_KEYS.TABLE_HEADER_SEQUENCE]: "순서",
[MENU_MANAGEMENT_KEYS.TABLE_HEADER_ACTIONS]: "작업",
[MENU_MANAGEMENT_KEYS.STATUS_ACTIVE]: "활성화",
[MENU_MANAGEMENT_KEYS.STATUS_INACTIVE]: "비활성화",
[MENU_MANAGEMENT_KEYS.STATUS_UNSPECIFIED]: "미지정",
[MENU_MANAGEMENT_KEYS.MESSAGE_LOADING]: "로딩 중...",
[MENU_MANAGEMENT_KEYS.MESSAGE_MENU_DELETE_PROCESSING]: "메뉴 삭제 중...",
[MENU_MANAGEMENT_KEYS.MESSAGE_MENU_SAVE_SUCCESS]: "메뉴가 저장되었습니다.",
[MENU_MANAGEMENT_KEYS.MESSAGE_MENU_SAVE_FAILED]: "메뉴 저장에 실패했습니다.",
[MENU_MANAGEMENT_KEYS.MESSAGE_MENU_DELETE_SUCCESS]: "메뉴가 삭제되었습니다.",
[MENU_MANAGEMENT_KEYS.MESSAGE_MENU_DELETE_FAILED]: "메뉴 삭제에 실패했습니다.",
[MENU_MANAGEMENT_KEYS.MESSAGE_MENU_DELETE_BATCH_SUCCESS]:
"✅ {count}개의 메뉴(및 하위 메뉴)가 성공적으로 삭제되었습니다!",
[MENU_MANAGEMENT_KEYS.MESSAGE_MENU_DELETE_BATCH_PARTIAL]: "⚠️ {success}개 삭제 성공, {failed}개 삭제 실패",
[MENU_MANAGEMENT_KEYS.MESSAGE_MENU_STATUS_TOGGLE_SUCCESS]: "메뉴 상태가 변경되었습니다.",
[MENU_MANAGEMENT_KEYS.MESSAGE_MENU_STATUS_TOGGLE_FAILED]: "메뉴 상태 변경에 실패했습니다.",
[MENU_MANAGEMENT_KEYS.MESSAGE_VALIDATION_MENU_NAME_REQUIRED]: "메뉴명을 입력해주세요.",
[MENU_MANAGEMENT_KEYS.MESSAGE_VALIDATION_COMPANY_REQUIRED]: "회사를 선택해주세요.",
[MENU_MANAGEMENT_KEYS.MESSAGE_VALIDATION_SELECT_MENU_DELETE]: "삭제할 메뉴를 선택해주세요.",
[MENU_MANAGEMENT_KEYS.MESSAGE_ERROR_LOAD_MENU_LIST]: "메뉴 목록을 불러오는데 실패했습니다.",
[MENU_MANAGEMENT_KEYS.MESSAGE_ERROR_LOAD_MENU_INFO]: "메뉴 정보를 불러오는데 실패했습니다.",
[MENU_MANAGEMENT_KEYS.MESSAGE_ERROR_LOAD_COMPANY_LIST]: "회사 목록을 불러오는데 실패했습니다.",
[MENU_MANAGEMENT_KEYS.MESSAGE_ERROR_LOAD_LANG_KEY_LIST]: "다국어 키 목록을 불러오는데 실패했습니다.",
[MENU_MANAGEMENT_KEYS.UI_EXPAND]: "펼치기",
[MENU_MANAGEMENT_KEYS.UI_COLLAPSE]: "접기",
[MENU_MANAGEMENT_KEYS.UI_MENU_COLLAPSE]: "메뉴 접기",
[MENU_MANAGEMENT_KEYS.UI_LANGUAGE]: "언어",
};
let text = defaultTexts[key] || key;
// 파라미터 치환
if (params) {
Object.entries(params).forEach(([paramKey, paramValue]) => {
text = text.replace(new RegExp(`\\{${paramKey}\\}`, "g"), paramValue.toString());
});
}
return text;
}
// 한국어인 경우 기본 텍스트 반환
const defaultTexts: Record<string, string> = {
[MENU_MANAGEMENT_KEYS.TITLE]: "메뉴 관리",
[MENU_MANAGEMENT_KEYS.DESCRIPTION]: "시스템의 메뉴 구조와 권한을 관리합니다.",
[MENU_MANAGEMENT_KEYS.MENU_TYPE_TITLE]: "메뉴 타입",
[MENU_MANAGEMENT_KEYS.MENU_TYPE_ADMIN]: "관리자",
[MENU_MANAGEMENT_KEYS.MENU_TYPE_USER]: "사용자",
[MENU_MANAGEMENT_KEYS.ADMIN_MENU]: "관리자 메뉴",
[MENU_MANAGEMENT_KEYS.USER_MENU]: "사용자 메뉴",
[MENU_MANAGEMENT_KEYS.ADMIN_DESCRIPTION]: "시스템 관리 및 설정 메뉴",
[MENU_MANAGEMENT_KEYS.USER_DESCRIPTION]: "일반 사용자 업무 메뉴",
[MENU_MANAGEMENT_KEYS.LIST_TITLE]: "메뉴 목록",
[MENU_MANAGEMENT_KEYS.LIST_TOTAL]: "총 {count}개의 메뉴가 있습니다.",
[MENU_MANAGEMENT_KEYS.LIST_SEARCH_RESULT]: "검색 결과: {count}개",
[MENU_MANAGEMENT_KEYS.FILTER_COMPANY]: "회사",
[MENU_MANAGEMENT_KEYS.FILTER_COMPANY_ALL]: "전체 회사",
[MENU_MANAGEMENT_KEYS.FILTER_COMPANY_COMMON]: "공통",
[MENU_MANAGEMENT_KEYS.FILTER_COMPANY_SEARCH]: "회사명 검색...",
[MENU_MANAGEMENT_KEYS.FILTER_SEARCH]: "검색어",
[MENU_MANAGEMENT_KEYS.FILTER_SEARCH_PLACEHOLDER]: "메뉴명 또는 URL 검색",
[MENU_MANAGEMENT_KEYS.FILTER_RESET]: "초기화",
[MENU_MANAGEMENT_KEYS.BUTTON_ADD]: "추가",
[MENU_MANAGEMENT_KEYS.BUTTON_ADD_TOP_LEVEL]: "최상위 메뉴 추가",
[MENU_MANAGEMENT_KEYS.BUTTON_ADD_SUB]: "하위 메뉴 추가",
[MENU_MANAGEMENT_KEYS.BUTTON_EDIT]: "수정",
[MENU_MANAGEMENT_KEYS.BUTTON_DELETE]: "삭제",
[MENU_MANAGEMENT_KEYS.BUTTON_DELETE_SELECTED]: "선택 삭제",
[MENU_MANAGEMENT_KEYS.BUTTON_DELETE_SELECTED_COUNT]: "선택 삭제 ({count})",
[MENU_MANAGEMENT_KEYS.BUTTON_DELETE_PROCESSING]: "삭제 중...",
[MENU_MANAGEMENT_KEYS.BUTTON_CANCEL]: "취소",
[MENU_MANAGEMENT_KEYS.BUTTON_SAVE]: "저장",
[MENU_MANAGEMENT_KEYS.BUTTON_SAVE_PROCESSING]: "저장 중...",
[MENU_MANAGEMENT_KEYS.BUTTON_REGISTER]: "등록",
[MENU_MANAGEMENT_KEYS.BUTTON_MODIFY]: "수정",
[MENU_MANAGEMENT_KEYS.FORM_MENU_TYPE]: "메뉴 타입",
[MENU_MANAGEMENT_KEYS.FORM_MENU_TYPE_ADMIN]: "관리자",
[MENU_MANAGEMENT_KEYS.FORM_MENU_TYPE_USER]: "사용자",
[MENU_MANAGEMENT_KEYS.FORM_STATUS]: "상태",
[MENU_MANAGEMENT_KEYS.FORM_STATUS_ACTIVE]: "활성화",
[MENU_MANAGEMENT_KEYS.FORM_STATUS_INACTIVE]: "비활성화",
[MENU_MANAGEMENT_KEYS.FORM_COMPANY]: "회사",
[MENU_MANAGEMENT_KEYS.FORM_COMPANY_SELECT]: "회사를 선택하세요",
[MENU_MANAGEMENT_KEYS.FORM_COMPANY_COMMON]: "공통",
[MENU_MANAGEMENT_KEYS.FORM_COMPANY_SUBMENU_NOTE]: "하위 메뉴는 상위 메뉴와 동일한 회사를 가져야 합니다.",
[MENU_MANAGEMENT_KEYS.FORM_MENU_NAME]: "메뉴명",
[MENU_MANAGEMENT_KEYS.FORM_MENU_NAME_PLACEHOLDER]: "메뉴명을 입력하세요",
[MENU_MANAGEMENT_KEYS.FORM_MENU_URL]: "URL",
[MENU_MANAGEMENT_KEYS.FORM_MENU_URL_PLACEHOLDER]: "메뉴 URL을 입력하세요",
[MENU_MANAGEMENT_KEYS.FORM_MENU_DESCRIPTION]: "설명",
[MENU_MANAGEMENT_KEYS.FORM_MENU_DESCRIPTION_PLACEHOLDER]: "메뉴 설명을 입력하세요",
[MENU_MANAGEMENT_KEYS.FORM_MENU_SEQUENCE]: "순서",
[MENU_MANAGEMENT_KEYS.FORM_LANG_KEY]: "다국어 키",
[MENU_MANAGEMENT_KEYS.FORM_LANG_KEY_SELECT]: "다국어 키를 선택하세요",
[MENU_MANAGEMENT_KEYS.FORM_LANG_KEY_NONE]: "다국어 키 없음",
[MENU_MANAGEMENT_KEYS.FORM_LANG_KEY_SEARCH]: "다국어 키 검색...",
[MENU_MANAGEMENT_KEYS.FORM_LANG_KEY_SELECTED]: "선택된 키: {key} - {description}",
[MENU_MANAGEMENT_KEYS.MODAL_MENU_REGISTER_TITLE]: "메뉴 등록",
[MENU_MANAGEMENT_KEYS.MODAL_MENU_MODIFY_TITLE]: "메뉴 수정",
[MENU_MANAGEMENT_KEYS.MODAL_DELETE_TITLE]: "메뉴 삭제",
[MENU_MANAGEMENT_KEYS.MODAL_DELETE_DESCRIPTION]: "해당 메뉴를 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다.",
[MENU_MANAGEMENT_KEYS.MODAL_DELETE_BATCH_DESCRIPTION]:
"선택된 {count}개의 메뉴를 영구적으로 삭제하시겠습니까?\n\n⚠ 주의: 상위 메뉴를 삭제하면 하위 메뉴들도 함께 삭제됩니다.\n이 작업은 되돌릴 수 없습니다.",
[MENU_MANAGEMENT_KEYS.TABLE_HEADER_SELECT]: "선택",
[MENU_MANAGEMENT_KEYS.TABLE_HEADER_MENU_NAME]: "메뉴명",
[MENU_MANAGEMENT_KEYS.TABLE_HEADER_MENU_URL]: "URL",
[MENU_MANAGEMENT_KEYS.TABLE_HEADER_MENU_TYPE]: "메뉴 타입",
[MENU_MANAGEMENT_KEYS.TABLE_HEADER_STATUS]: "상태",
[MENU_MANAGEMENT_KEYS.TABLE_HEADER_COMPANY]: "회사",
[MENU_MANAGEMENT_KEYS.TABLE_HEADER_SEQUENCE]: "순서",
[MENU_MANAGEMENT_KEYS.TABLE_HEADER_ACTIONS]: "작업",
[MENU_MANAGEMENT_KEYS.STATUS_ACTIVE]: "활성화",
[MENU_MANAGEMENT_KEYS.STATUS_INACTIVE]: "비활성화",
[MENU_MANAGEMENT_KEYS.STATUS_UNSPECIFIED]: "미지정",
[MENU_MANAGEMENT_KEYS.MESSAGE_LOADING]: "로딩 중...",
[MENU_MANAGEMENT_KEYS.MESSAGE_MENU_DELETE_PROCESSING]: "메뉴 삭제 중...",
[MENU_MANAGEMENT_KEYS.MESSAGE_MENU_SAVE_SUCCESS]: "메뉴가 저장되었습니다.",
[MENU_MANAGEMENT_KEYS.MESSAGE_MENU_SAVE_FAILED]: "메뉴 저장에 실패했습니다.",
[MENU_MANAGEMENT_KEYS.MESSAGE_MENU_DELETE_SUCCESS]: "메뉴가 삭제되었습니다.",
[MENU_MANAGEMENT_KEYS.MESSAGE_MENU_DELETE_FAILED]: "메뉴 삭제에 실패했습니다.",
[MENU_MANAGEMENT_KEYS.MESSAGE_MENU_DELETE_BATCH_SUCCESS]:
"✅ {count}개의 메뉴(및 하위 메뉴)가 성공적으로 삭제되었습니다!",
[MENU_MANAGEMENT_KEYS.MESSAGE_MENU_DELETE_BATCH_PARTIAL]: "⚠️ {success}개 삭제 성공, {failed}개 삭제 실패",
[MENU_MANAGEMENT_KEYS.MESSAGE_MENU_STATUS_TOGGLE_SUCCESS]: "메뉴 상태가 변경되었습니다.",
[MENU_MANAGEMENT_KEYS.MESSAGE_MENU_STATUS_TOGGLE_FAILED]: "메뉴 상태 변경에 실패했습니다.",
[MENU_MANAGEMENT_KEYS.MESSAGE_VALIDATION_MENU_NAME_REQUIRED]: "메뉴명을 입력해주세요.",
[MENU_MANAGEMENT_KEYS.MESSAGE_VALIDATION_COMPANY_REQUIRED]: "회사를 선택해주세요.",
[MENU_MANAGEMENT_KEYS.MESSAGE_VALIDATION_SELECT_MENU_DELETE]: "삭제할 메뉴를 선택해주세요.",
[MENU_MANAGEMENT_KEYS.MESSAGE_ERROR_LOAD_MENU_LIST]: "메뉴 목록을 불러오는데 실패했습니다.",
[MENU_MANAGEMENT_KEYS.MESSAGE_ERROR_LOAD_MENU_INFO]: "메뉴 정보를 불러오는데 실패했습니다.",
[MENU_MANAGEMENT_KEYS.MESSAGE_ERROR_LOAD_COMPANY_LIST]: "회사 목록을 불러오는데 실패했습니다.",
[MENU_MANAGEMENT_KEYS.MESSAGE_ERROR_LOAD_LANG_KEY_LIST]: "다국어 키 목록을 불러오는데 실패했습니다.",
[MENU_MANAGEMENT_KEYS.UI_EXPAND]: "펼치기",
[MENU_MANAGEMENT_KEYS.UI_COLLAPSE]: "접기",
[MENU_MANAGEMENT_KEYS.UI_MENU_COLLAPSE]: "메뉴 접기",
[MENU_MANAGEMENT_KEYS.UI_LANGUAGE]: "언어",
};
let text = defaultTexts[key] || key;
// 파라미터 치환
if (params) {
Object.entries(params).forEach(([paramKey, paramValue]) => {
text = text.replace(new RegExp(`\\{${paramKey}\\}`, "g"), paramValue.toString());
});
}
return text;
};