메뉴 및 슬라이드 메뉴 다국어화
- MenuItems에 영문 메뉴명(menuNameEng) 추가 - MenuCategory 컴포넌트에 i18n 적용하여 언어별 메뉴 표시 - SlideMenu 컴포넌트 다국어 지원 추가 - ko.json, en.json에 slideMenu 번역 키 추가 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -49,92 +49,100 @@ export const MenuItems = [
|
||||
menuId: 30,
|
||||
parent: 30,
|
||||
menuName: '거래조회',
|
||||
menuNameEng: 'Transactions',
|
||||
iconFilePath: 'transaction-icon',
|
||||
subMenu: [
|
||||
{menuId: 31, parent: 30, menuName: '거래내역조회', menuNameEng: '',iconFilePath: '/images/menu_icon_31.svg', programPath: PATHS.transaction.allTransaction.list},
|
||||
{menuId: 32, parent: 30, menuName: '현금영수증발행', menuNameEng: '',iconFilePath: '/images/menu_icon_32.svg', programPath: PATHS.transaction.cashReceipt.list},
|
||||
{menuId: 33, parent: 30, menuName: '에스크로', menuNameEng: '',iconFilePath: '/images/menu_icon_33.svg', programPath: PATHS.transaction.escrow.list},
|
||||
{menuId: 34, parent: 30, menuName: '빌링', menuNameEng: '',iconFilePath: '/images/menu_icon_34.svg', programPath: PATHS.transaction.billing.list}
|
||||
{menuId: 31, parent: 30, menuName: '거래내역조회', menuNameEng: 'Transaction History',iconFilePath: '/images/menu_icon_31.svg', programPath: PATHS.transaction.allTransaction.list},
|
||||
{menuId: 32, parent: 30, menuName: '현금영수증발행', menuNameEng: 'Cash Receipt',iconFilePath: '/images/menu_icon_32.svg', programPath: PATHS.transaction.cashReceipt.list},
|
||||
{menuId: 33, parent: 30, menuName: '에스크로', menuNameEng: 'Escrow',iconFilePath: '/images/menu_icon_33.svg', programPath: PATHS.transaction.escrow.list},
|
||||
{menuId: 34, parent: 30, menuName: '빌링', menuNameEng: 'Billing',iconFilePath: '/images/menu_icon_34.svg', programPath: PATHS.transaction.billing.list}
|
||||
]
|
||||
},
|
||||
{
|
||||
menuId: 35,
|
||||
parent: 35,
|
||||
menuName: '정산조회',
|
||||
menuNameEng: 'Settlement',
|
||||
iconFilePath: 'settlement-icon',
|
||||
subMenu: [
|
||||
{menuId: 36, parent: 35, menuName: '정산달력', menuNameEng: '',iconFilePath: '/images/menu_icon_36.svg', programPath: PATHS.settlement.calendar},
|
||||
{menuId: 37, parent: 35, menuName: '정산내역', menuNameEng: '',iconFilePath: '/images/menu_icon_37.svg', programPath: PATHS.settlement.list}
|
||||
{menuId: 36, parent: 35, menuName: '정산달력', menuNameEng: 'Settlement Calendar',iconFilePath: '/images/menu_icon_36.svg', programPath: PATHS.settlement.calendar},
|
||||
{menuId: 37, parent: 35, menuName: '정산내역', menuNameEng: 'Settlement History',iconFilePath: '/images/menu_icon_37.svg', programPath: PATHS.settlement.list}
|
||||
]
|
||||
},
|
||||
{
|
||||
menuId: 38,
|
||||
parent: 38,
|
||||
menuName: '가맹점관리',
|
||||
menuNameEng: 'Merchant',
|
||||
iconFilePath: 'merchant-icon',
|
||||
subMenu: [
|
||||
{menuId: 39, parent: 38, menuName: '가맹점정보', menuNameEng: '',iconFilePath: '/images/menu_icon_39.svg', programPath: PATHS.merchant.info},
|
||||
{menuId: 40, parent: 38, menuName: '등록현황', menuNameEng: '',iconFilePath: '/images/menu_icon_40.svg', programPath: PATHS.merchant.registrationStatus}
|
||||
{menuId: 39, parent: 38, menuName: '가맹점정보', menuNameEng: 'Merchant Info',iconFilePath: '/images/menu_icon_39.svg', programPath: PATHS.merchant.info},
|
||||
{menuId: 40, parent: 38, menuName: '등록현황', menuNameEng: 'Registration Status',iconFilePath: '/images/menu_icon_40.svg', programPath: PATHS.merchant.registrationStatus}
|
||||
]
|
||||
},
|
||||
{
|
||||
menuId: 41,
|
||||
parent: 41,
|
||||
menuName: '결제관리',
|
||||
menuNameEng: 'Payment',
|
||||
iconFilePath: 'payment-icon',
|
||||
subMenu: [
|
||||
{menuId: 42, parent: 41, menuName: '결제정보', menuNameEng: '',iconFilePath: '/images/menu_icon_42.svg', programPath: PATHS.payment.info},
|
||||
{menuId: 43, parent: 41, menuName: '결제데이터통보', menuNameEng: '',iconFilePath: '/images/menu_icon_43.svg', programPath: PATHS.payment.notificationData},
|
||||
{menuId: 42, parent: 41, menuName: '결제정보', menuNameEng: 'Payment Info',iconFilePath: '/images/menu_icon_42.svg', programPath: PATHS.payment.info},
|
||||
{menuId: 43, parent: 41, menuName: '결제데이터통보', menuNameEng: 'Payment Notification',iconFilePath: '/images/menu_icon_43.svg', programPath: PATHS.payment.notificationData},
|
||||
]
|
||||
},
|
||||
{
|
||||
menuId: 44,
|
||||
parent: 44,
|
||||
menuName: '계정관리',
|
||||
menuNameEng: 'Account',
|
||||
iconFilePath: 'account-icon',
|
||||
subMenu: [
|
||||
{menuId: 45, parent: 44, menuName: '사용자관리', menuNameEng: '',iconFilePath: '/images/menu_icon_45.svg', programPath: PATHS.account.user.manage},
|
||||
{menuId: 46, parent: 44, menuName: '비밀번호관리', menuNameEng: '',iconFilePath: '/images/menu_icon_46.svg', programPath: PATHS.account.password.manage},
|
||||
{menuId: 45, parent: 44, menuName: '사용자관리', menuNameEng: 'User Management',iconFilePath: '/images/menu_icon_45.svg', programPath: PATHS.account.user.manage},
|
||||
{menuId: 46, parent: 44, menuName: '비밀번호관리', menuNameEng: 'Password Management',iconFilePath: '/images/menu_icon_46.svg', programPath: PATHS.account.password.manage},
|
||||
]
|
||||
},
|
||||
{
|
||||
menuId: 47,
|
||||
parent: 47,
|
||||
menuName: '부가세신고자료',
|
||||
menuNameEng: 'VAT',
|
||||
iconFilePath: 'vat-icon',
|
||||
subMenu: [
|
||||
{menuId: 48, parent: 47, menuName: '세금계산서', menuNameEng: '',iconFilePath: '/images/menu_icon_48.svg', programPath: PATHS.vatReturn.list},
|
||||
{menuId: 49, parent: 47, menuName: '부가세참고', menuNameEng: '',iconFilePath: '/images/menu_icon_49.svg', programPath: PATHS.vatReturn.reference},
|
||||
{menuId: 48, parent: 47, menuName: '세금계산서', menuNameEng: 'Tax Invoice',iconFilePath: '/images/menu_icon_48.svg', programPath: PATHS.vatReturn.list},
|
||||
{menuId: 49, parent: 47, menuName: '부가세참고', menuNameEng: 'VAT Reference',iconFilePath: '/images/menu_icon_49.svg', programPath: PATHS.vatReturn.reference},
|
||||
]
|
||||
},
|
||||
{
|
||||
menuId: 50,
|
||||
parent: 50,
|
||||
menuName: '부가서비스',
|
||||
menuNameEng: 'Services',
|
||||
iconFilePath: 'service-icon',
|
||||
subMenu: [
|
||||
{menuId: 51, parent: 50, menuName: '부가서비스소개', menuNameEng: '',iconFilePath: '/images/menu_icon_51.svg', programPath: PATHS.additionalService.list},
|
||||
{menuId: 52, parent: 50, menuName: '신용카드ARS카드결제', menuNameEng: '',iconFilePath: '/images/menu_icon_52.svg', programPath: PATHS.additionalService.ars.list},
|
||||
{menuId: 53, parent: 50, menuName: '지급대행', menuNameEng: '',iconFilePath: '/images/menu_icon_53.svg', programPath: PATHS.additionalService.payout.list},
|
||||
{menuId: 54, parent: 50, menuName: '링크결제', menuNameEng: '',iconFilePath: '/images/menu_icon_54.svg', programPath: PATHS.additionalService.linkPayment.shippingHistory},
|
||||
{menuId: 55, parent: 50, menuName: '자금이체', menuNameEng: '',iconFilePath: '/images/menu_icon_55.svg', programPath: PATHS.additionalService.fundAccount.transferList},
|
||||
{menuId: 56, parent: 50, menuName: 'KEY-IN결제', menuNameEng: '',iconFilePath: '/images/menu_icon_56.svg', programPath: PATHS.additionalService.keyInPayment.list},
|
||||
{menuId: 57, parent: 50, menuName: 'SMS결제통보', menuNameEng: '',iconFilePath: '/images/menu_icon_57.svg', programPath: PATHS.additionalService.smsPaymentNotification},
|
||||
{menuId: 58, parent: 50, menuName: '알림톡결제통보', menuNameEng: '',iconFilePath: '/images/menu_icon_58.svg', programPath: PATHS.additionalService.alimtalk.list},
|
||||
{menuId: 59, parent: 50, menuName: '계좌점유인증', menuNameEng: '',iconFilePath: '/images/menu_icon_59.svg', programPath: PATHS.additionalService.accountHolderAuth.list},
|
||||
{menuId: 60, parent: 50, menuName: '계좌성명조회', menuNameEng: '',iconFilePath: '/images/menu_icon_60.svg', programPath: PATHS.additionalService.accountHolderSearch.list},
|
||||
{menuId: 65, parent: 50, menuName: '안면인증', menuNameEng: '',iconFilePath: '/images/menu_icon_65.svg', programPath: PATHS.additionalService.faceAuth.list},
|
||||
{menuId: 51, parent: 50, menuName: '부가서비스소개', menuNameEng: 'Service Overview',iconFilePath: '/images/menu_icon_51.svg', programPath: PATHS.additionalService.list},
|
||||
{menuId: 52, parent: 50, menuName: '신용카드ARS카드결제', menuNameEng: 'ARS Card Payment',iconFilePath: '/images/menu_icon_52.svg', programPath: PATHS.additionalService.ars.list},
|
||||
{menuId: 53, parent: 50, menuName: '지급대행', menuNameEng: 'Payment Agency',iconFilePath: '/images/menu_icon_53.svg', programPath: PATHS.additionalService.payout.list},
|
||||
{menuId: 54, parent: 50, menuName: '링크결제', menuNameEng: 'Link Payment',iconFilePath: '/images/menu_icon_54.svg', programPath: PATHS.additionalService.linkPayment.shippingHistory},
|
||||
{menuId: 55, parent: 50, menuName: '자금이체', menuNameEng: 'Fund Transfer',iconFilePath: '/images/menu_icon_55.svg', programPath: PATHS.additionalService.fundAccount.transferList},
|
||||
{menuId: 56, parent: 50, menuName: 'KEY-IN결제', menuNameEng: 'KEY-IN Payment',iconFilePath: '/images/menu_icon_56.svg', programPath: PATHS.additionalService.keyInPayment.list},
|
||||
{menuId: 57, parent: 50, menuName: 'SMS결제통보', menuNameEng: 'SMS Notification',iconFilePath: '/images/menu_icon_57.svg', programPath: PATHS.additionalService.smsPaymentNotification},
|
||||
{menuId: 58, parent: 50, menuName: '알림톡결제통보', menuNameEng: 'Alimtalk Notification',iconFilePath: '/images/menu_icon_58.svg', programPath: PATHS.additionalService.alimtalk.list},
|
||||
{menuId: 59, parent: 50, menuName: '계좌점유인증', menuNameEng: 'Account Holder Auth',iconFilePath: '/images/menu_icon_59.svg', programPath: PATHS.additionalService.accountHolderAuth.list},
|
||||
{menuId: 60, parent: 50, menuName: '계좌성명조회', menuNameEng: 'Account Holder Search',iconFilePath: '/images/menu_icon_60.svg', programPath: PATHS.additionalService.accountHolderSearch.list},
|
||||
{menuId: 65, parent: 50, menuName: '안면인증', menuNameEng: 'Face Auth',iconFilePath: '/images/menu_icon_65.svg', programPath: PATHS.additionalService.faceAuth.list},
|
||||
]
|
||||
},
|
||||
{
|
||||
menuId: 61,
|
||||
parent: 61,
|
||||
menuName: '고객지원',
|
||||
menuNameEng: 'Support',
|
||||
iconFilePath: 'support-icon',
|
||||
subMenu: [
|
||||
{menuId: 62, parent: 61, menuName: '공지사항', menuNameEng: '',iconFilePath: '/images/menu_icon_62.svg', programPath: PATHS.support.notice.list},
|
||||
{menuId: 63, parent: 61, menuName: '자주묻는질문', menuNameEng: '',iconFilePath: '/images/menu_icon_63.svg', programPath: PATHS.support.faq.list},
|
||||
{menuId: 64, parent: 61, menuName: '1:1문의', menuNameEng: '',iconFilePath: '/images/menu_icon_64.svg', programPath: PATHS.support.qna.list},
|
||||
{menuId: 62, parent: 61, menuName: '공지사항', menuNameEng: 'Notice',iconFilePath: '/images/menu_icon_62.svg', programPath: PATHS.support.notice.list},
|
||||
{menuId: 63, parent: 61, menuName: '자주묻는질문', menuNameEng: 'FAQ',iconFilePath: '/images/menu_icon_63.svg', programPath: PATHS.support.faq.list},
|
||||
{menuId: 64, parent: 61, menuName: '1:1문의', menuNameEng: 'Q&A',iconFilePath: '/images/menu_icon_64.svg', programPath: PATHS.support.qna.list},
|
||||
]
|
||||
},
|
||||
];
|
||||
@@ -5,6 +5,8 @@ import { UserFavorite } from '@/entities/user/model/types';
|
||||
import { RefObject, useEffect, useState } from 'react';
|
||||
import { useLocation } from 'react-router';
|
||||
import { MenuItem } from '../model/types';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import { MenuItems } from '@/entities/common/model/constant';
|
||||
|
||||
export interface MenuCategoryProps {
|
||||
menuId?: number;
|
||||
@@ -32,6 +34,7 @@ export const MenuCategory = ({
|
||||
itemIndex
|
||||
}: MenuCategoryProps) => {
|
||||
const { navigate } = useNavigate();
|
||||
const { i18n } = useTranslation();
|
||||
// const location = useLocation();
|
||||
|
||||
const [favoriteItems, setFavoriteItems] = useState<Array<UserFavorite>>([]);
|
||||
@@ -115,29 +118,33 @@ export const MenuCategory = ({
|
||||
let rs = [];
|
||||
if(subMenu){
|
||||
for(let i=0;i<subMenu.length;i++){
|
||||
const displayName = i18n.language === 'en' && subMenu[i]?.menuNameEng
|
||||
? subMenu[i]?.menuNameEng
|
||||
: subMenu[i]?.menuName;
|
||||
|
||||
if(!!editMode && subMenu[i] && subMenu[i]?.menuId){
|
||||
rs.push(
|
||||
<li
|
||||
key={ `menu-item-key-${menuId}-${i}` }
|
||||
onClick={ () => onClickToNavigate(subMenu[i]?.programPath) }
|
||||
>
|
||||
<span>{ subMenu[i]?.menuName }</span>
|
||||
<span>{ displayName }</span>
|
||||
<div className="check_box_scrap">
|
||||
<input
|
||||
<input
|
||||
id={ `menu-item-checkbox-${subMenu[i]?.menuId}-${i}` }
|
||||
className="checkbox"
|
||||
type="checkbox"
|
||||
checked={ menuIds.includes(subMenu[i]?.menuId)? true: false }
|
||||
onChange={ (e) => favoriteSetting(
|
||||
e.target.checked,
|
||||
e.target.checked,
|
||||
subMenu[i]?.menuId,
|
||||
subMenu[i]?.menuName,
|
||||
subMenu[i]?.menuNameEng,
|
||||
subMenu[i]?.menuNameEng,
|
||||
subMenu[i]?.iconFilePath,
|
||||
subMenu[i]?.programPath,
|
||||
)}
|
||||
/>
|
||||
<label
|
||||
<label
|
||||
className="gtr"
|
||||
htmlFor={ `menu-item-checkbox-${subMenu[i]?.menuId}-${i}` }
|
||||
></label>
|
||||
@@ -150,16 +157,20 @@ export const MenuCategory = ({
|
||||
<li
|
||||
key={ `menu-item-key-${i}` }
|
||||
onClick={ () => onClickToNavigate(subMenu[i]?.programPath) }
|
||||
>{ subMenu[i]?.menuName }</li>
|
||||
>{ displayName }</li>
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return rs;
|
||||
};
|
||||
|
||||
const displayCategoryName = i18n.language === 'en'
|
||||
? MenuItems.find(item => item.menuId === menuId)?.menuNameEng || menuName
|
||||
: menuName;
|
||||
|
||||
return (
|
||||
<>
|
||||
<div
|
||||
@@ -172,7 +183,7 @@ export const MenuCategory = ({
|
||||
>
|
||||
<div className="category-header">
|
||||
<div className={ 'category-icon ' + iconFilePath }></div>
|
||||
<span>{ menuName }</span>
|
||||
<span>{ displayCategoryName }</span>
|
||||
</div>
|
||||
<ul className="category-items">
|
||||
{ getMenuItems() }
|
||||
|
||||
Reference in New Issue
Block a user