ERP-node/frontend/lib/utils/multilang.ts

434 lines
22 KiB
TypeScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { useMultiLang } from "@/hooks/useMultiLang";
import { apiClient } from "../api/client";
// 메뉴 관리 화면 다국어 키 상수
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 companyCode = "*";
apiClient
.get(`/multilang/user-text/${companyCode}/MENU_MANAGEMENT/${key}?userLang=${userLang}`)
.then((response) => {
if (response.data.success && response.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;
};