가맹점 관리 페이지 및 컴포넌트 다국어화 완료

- 가맹점 관리 페이지 다국어화 (가맹점 정보, 등록현황)
  * 헤더 타이틀 및 탭 버튼 다국어화
- 가맹점 엔티티 컴포넌트 전체 다국어화
  * merchant-tab: 가맹점 정보/등록현황 탭
  * info-wrap: 계약/기술/정산 담당자 섹션, 안내 메시지
  * registration-status-wrap: 신용카드 심사현황, 에스크로 가입현황
- 가맹점 섹션 컴포넌트 다국어화
  * account-section: 정산계좌 정보 (은행, 계좌번호, 예금주)
  * business-section: 기본정보 (상호, 사업자번호, 업종, 업태 등 11개 필드)
  * online-section: 온라인 등록현황 (상태, 계약완료, 심사 여부 등)
  * escrow-section: 에스크로 정보 (NICECROW 가입, 소재지, URL 등)
- 번역 키 추가: merchant 네임스페이스 35개 키
- 모든 가맹점 관리 필드 및 라벨 일관된 다국어 지원

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Jay Sheen
2025-10-29 18:04:08 +09:00
parent 8d67d59d78
commit 9b193ee6f9
11 changed files with 145 additions and 55 deletions

View File

@@ -1,4 +1,5 @@
import { ChangeEvent, useEffect, useState } from 'react';
import { useTranslation } from 'react-i18next';
import { useMerchantMidMutation } from '../api/use-merchant-mid-mutation';
import { BusinessSection } from './section/business-section';
import { ManagerSection } from './section/manager-section';
@@ -11,6 +12,7 @@ import {
import { useStore } from '@/shared/model/store';
export const InfoWrap = () => {
const { t } = useTranslation();
const midOptions = useStore.getState().UserStore.selectOptionsMids;
const userMid = useStore.getState().UserStore.mid;
@@ -61,7 +63,7 @@ export const InfoWrap = () => {
<div className="info-divider mb-16"></div>
<ManagerSection
type={ SectionKeys.Merchant }
title='계약 담당자'
title={t('merchant.contractManager')}
manager={ data?.merchantManager }
managerTelephone={ data?.merchantManagerTelephone }
managetEmail={ data?.merchantManagerEmail }
@@ -71,7 +73,7 @@ export const InfoWrap = () => {
<div className="info-divider mb-16"></div>
<ManagerSection
type={ SectionKeys.Technical }
title='기술 담당자'
title={t('merchant.technicalManager')}
manager={ data?.technicalManager }
managerTelephone={ data?.technicalManagerTelephone }
managetEmail={ data?.technicalManagerEmail }
@@ -81,7 +83,7 @@ export const InfoWrap = () => {
<div className="info-divider mb-16"></div>
<ManagerSection
type={ SectionKeys.Settlement }
title='정산 담당자'
title={t('merchant.settlementManager')}
manager={ data?.settlementManager }
managerTelephone={ data?.settlementManagerTelephone }
managetEmail={ data?.settlementManagerEmail }
@@ -93,7 +95,7 @@ export const InfoWrap = () => {
data={ data }
></AccountSection>
<div className="notice-bottom left-align">
<p className="notice-tip"> .<br/>PC .</p>
<p className="notice-tip">{t('merchant.infoNotice')}</p>
</div>
</div>
</>

View File

@@ -1,3 +1,4 @@
import { useTranslation } from 'react-i18next';
import { PATHS } from '@/shared/constants/paths';
import { useNavigate } from '@/shared/lib/hooks/use-navigate';
import {
@@ -8,6 +9,7 @@ import {
export const MerchantTab = ({
activeTab
}: MerchantTabProps) => {
const { t } = useTranslation();
const { navigate } = useNavigate();
const onClickToNavigation = (tab: MerchantTabKeys) => {
@@ -23,14 +25,14 @@ export const MerchantTab = ({
return(
<>
<div className="subTab">
<button
<button
className={`subtab-btn ${(activeTab === MerchantTabKeys.Info)? 'active': ''}` }
onClick={ () => onClickToNavigation(MerchantTabKeys.Info) }
> </button>
<button
onClick={ () => onClickToNavigation(MerchantTabKeys.Info) }
>{t('merchant.info')}</button>
<button
className={`subtab-btn ${(activeTab === MerchantTabKeys.RegistrationStatus)? 'active': ''}` }
onClick={ () => onClickToNavigation(MerchantTabKeys.RegistrationStatus) }
></button>
onClick={ () => onClickToNavigation(MerchantTabKeys.RegistrationStatus) }
>{t('merchant.registrationStatus')}</button>
</div>
</>
);

View File

@@ -1,13 +1,14 @@
import { ChangeEvent, useEffect, useState } from 'react';
import { useTranslation } from 'react-i18next';
import { useMerchantMidStatusMutation } from '../api/use-merchant-mid-status-mutation';
import {
CardApplications,
Escrow,
SectionKeys,
MerchantMidStatusParams,
MerchantMidStatusResponse,
OfflineInfomation,
OnlineInfomation
CardApplications,
Escrow,
SectionKeys,
MerchantMidStatusParams,
MerchantMidStatusResponse,
OfflineInfomation,
OnlineInfomation
} from '../model/types';
import { OnlineSection } from './section/online-section';
import { CardSection } from './section/card-section';
@@ -15,6 +16,7 @@ import { EscrowSection } from './section/escrow-section';
import { useStore } from '@/shared/model/store';
export const RegistrationStatusWrap = () => {
const { t } = useTranslation();
const midOptions = useStore.getState().UserStore.selectOptionsMids;
const userMid = useStore.getState().UserStore.mid;
@@ -69,7 +71,7 @@ export const RegistrationStatusWrap = () => {
<div className="info-divider mb-16"></div>
<CardSection
type={ SectionKeys.Card }
title='신용카드 심사현황'
title={t('merchant.cardReviewStatus')}
cardApplications={ cardApplications }
openChild={ openChild }
setOpenChild={ setOpenChild }
@@ -77,7 +79,7 @@ export const RegistrationStatusWrap = () => {
<div className="info-divider mb-16"></div>
<EscrowSection
type={ SectionKeys.Escrow }
title='에스크로 가입현황'
title={t('merchant.escrowRegistrationStatus')}
companyName={ escrow?.companyName }
businessRegistrationNumber={ escrow?.businessRegistrationNumber }
escrowStatus={ escrow?.escrowStatus }

View File

@@ -1,3 +1,4 @@
import { useTranslation } from 'react-i18next';
import { MerchantMidResponse } from '../../model/types';
export interface AccountSectionProps {
@@ -7,22 +8,23 @@ export interface AccountSectionProps {
export const AccountSection = ({
data
}: AccountSectionProps) => {
const { t } = useTranslation();
return (
<>
<div className="section">
<div className="section-title"></div>
<div className="section-title">{t('merchant.settlementAccount')}</div>
<ul className="kv-list">
<li className="kv-row">
<span className="k"></span>
<span className="k">{t('merchant.bank')}</span>
<span className="v">{ data?.bankName }</span>
</li>
<li className="kv-row">
<span className="k"></span>
<span className="k">{t('merchant.accountNumber')}</span>
<span className="v">{ data?.accountNumber }</span>
</li>
<li className="kv-row">
<span className="k"></span>
<span className="k">{t('merchant.accountHolder')}</span>
<span className="v">{ data?.accountHolderName }</span>
</li>
</ul>

View File

@@ -1,3 +1,4 @@
import { useTranslation } from 'react-i18next';
import { MerchantMidResponse } from '../../model/types';
export interface BusinessSectionProps {
@@ -7,30 +8,31 @@ export interface BusinessSectionProps {
export const BusinessSection = ({
data
}: BusinessSectionProps) => {
const { t } = useTranslation();
return (
<>
<div className="section">
<div className="section-title"></div>
<div className="section-title">{t('merchant.basicInfo')}</div>
<ul className="kv-list">
<li className="kv-row">
<span className="k"></span>
<span className="k">{t('merchant.companyName')}</span>
<span className="v">{ data?.businessCompanyName }</span>
</li>
<li className="kv-row">
<span className="k"></span>
<span className="k">{t('merchant.businessRegistrationNumber')}</span>
<span className="v">{ data?.businessRegistrationNumber }</span>
</li>
<li className="kv-row">
<span className="k"></span>
<span className="k">{t('merchant.businessAttribute')}</span>
<span className="v">{ data?.businessScaleTypeName }</span>
</li>
<li className="kv-row">
<span className="k"></span>
<span className="k">{t('merchant.businessType')}</span>
<span className="v">{ data?.businessType }</span>
</li>
<li className="kv-row">
<span className="k"></span>
<span className="k">{t('merchant.businessCategory')}</span>
<span className="v">{ data?.businessCategory }</span>
</li>
</ul>
@@ -39,15 +41,15 @@ export const BusinessSection = ({
<div className="section">
<ul className="kv-list">
<li className="kv-row">
<span className="k"></span>
<span className="k">{t('merchant.representativeName')}</span>
<span className="v">{ data?.representativeName }</span>
</li>
<li className="kv-row">
<span className="k"> </span>
<span className="k">{t('merchant.representativePhone')}</span>
<span className="v">{ data?.telephoneNumber }</span>
</li>
<li className="kv-row">
<span className="k"> </span>
<span className="k">{t('merchant.representativeEmail')}</span>
<span className="v">{ data?.email }</span>
</li>
</ul>
@@ -56,11 +58,11 @@ export const BusinessSection = ({
<div className="section">
<ul className="kv-list">
<li className="kv-row">
<span className="k"></span>
<span className="k">{t('merchant.businessAddress')}</span>
<span className="v">{ data?.businessAddress }</span>
</li>
<li className="kv-row">
<span className="k"> </span>
<span className="k">{t('merchant.websiteUrl')}</span>
<span className="v">{ data?.url }</span>
</li>
</ul>

View File

@@ -1,3 +1,4 @@
import { useTranslation } from 'react-i18next';
import { SectionTitleArrow } from '@/entities/common/ui/section-title-arrow';
import { Escrow, SectionKeys } from '../../model/types';
import SlideDown from 'react-slidedown';
@@ -23,6 +24,7 @@ export const EscrowSection = ({
openChild,
setOpenChild
}: EscrowSectionProps) => {
const { t } = useTranslation();
const [isOpen, setIsOpen] = useState<boolean>(false);
@@ -55,27 +57,27 @@ export const EscrowSection = ({
{ isOpen &&
<ul className="kv-list">
<li className="kv-row">
<span className="k"></span>
<span className="k">{t('merchant.companyName')}</span>
<span className="v">{ companyName }</span>
</li>
<li className="kv-row">
<span className="k"></span>
<span className="k">{t('merchant.businessRegistrationNumber')}</span>
<span className="v">{ businessRegistrationNumber }</span>
</li>
<li className="kv-row">
<span className="k">NICECROW </span>
<span className="k">{t('merchant.nicecrowJoin')}</span>
<span className="v">{ escrowStatus }</span>
</li>
<li className="kv-row">
<span className="k"></span>
<span className="k">{t('merchant.location')}</span>
<span className="v">{ address }</span>
</li>
<li className="kv-row">
<span className="k">URL</span>
<span className="k">{t('merchant.url')}</span>
<span className="v">{ merchantUrl }</span>
</li>
<li className="kv-row">
<span className="k"> </span>
<span className="k">{t('merchant.serviceRegistrationNumber')}</span>
<span className="v">{ serviceRegistrationNumber }</span>
</li>
</ul>

View File

@@ -1,4 +1,5 @@
import moment from 'moment';
import { useTranslation } from 'react-i18next';
import { OnlineInfomation } from '../../model/types';
export interface OnlineSectionProps {
@@ -8,38 +9,39 @@ export interface OnlineSectionProps {
export const OnlineSection = ({
data
}: OnlineSectionProps) => {
const { t } = useTranslation();
return (
<>
<div className="section">
<div className="section-title"> </div>
<div className="section-title">{t('merchant.onlineRegistrationStatus')}</div>
<ul className="kv-list">
<li className="kv-row">
<span className="k"></span>
<span className="k">{t('merchant.status')}</span>
<span className="v">{ data?.usageStatus }</span>
</li>
<li className="kv-row">
<span className="k"></span>
<span className="k">{t('merchant.companyName')}</span>
<span className="v">{ data?.companyName }</span>
</li>
<li className="kv-row">
<span className="k"> </span>
<span className="k">{t('merchant.businessRegistrationNumber')}</span>
<span className="v">{ data?.businessRegistrationNumber }</span>
</li>
<li className="kv-row">
<span className="k"></span>
<span className="k">{t('merchant.issueDate')}</span>
<span className="v">{ data?.registrationDate }</span>
</li>
<li className="kv-row">
<span className="k"> </span>
<span className="k">{t('merchant.contractStatus')}</span>
<span className="v">{ data?.contractStatus }</span>
</li>
<li className="kv-row">
<span className="k"> </span>
<span className="k">{t('merchant.websiteReviewStatus')}</span>
<span className="v">{ data?.cardAuditStatus }</span>
</li>
<li className="kv-row">
<span className="k"></span>
<span className="k">{t('merchant.guaranteeInsurance')}</span>
<span className="v">{ data?.insuranceAmount }</span>
</li>
<li className="kv-row">