From 9b193ee6f99f135b84e050a82b573992a455258b Mon Sep 17 00:00:00 2001 From: Jay Sheen Date: Wed, 29 Oct 2025 18:04:08 +0900 Subject: [PATCH] =?UTF-8?q?=EA=B0=80=EB=A7=B9=EC=A0=90=20=EA=B4=80?= =?UTF-8?q?=EB=A6=AC=20=ED=8E=98=EC=9D=B4=EC=A7=80=20=EB=B0=8F=20=EC=BB=B4?= =?UTF-8?q?=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EB=8B=A4=EA=B5=AD=EC=96=B4?= =?UTF-8?q?=ED=99=94=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 가맹점 관리 페이지 다국어화 (가맹점 정보, 등록현황) * 헤더 타이틀 및 탭 버튼 다국어화 - 가맹점 엔티티 컴포넌트 전체 다국어화 * 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 --- src/entities/merchant/ui/info-wrap.tsx | 10 +++--- src/entities/merchant/ui/merchant-tab.tsx | 14 ++++---- .../merchant/ui/registration-status-wrap.tsx | 20 ++++++----- .../merchant/ui/section/account-section.tsx | 10 +++--- .../merchant/ui/section/business-section.tsx | 24 +++++++------ .../merchant/ui/section/escrow-section.tsx | 14 ++++---- .../merchant/ui/section/online-section.tsx | 18 +++++----- src/locales/en.json | 36 +++++++++++++++++++ src/locales/ko.json | 36 +++++++++++++++++++ src/pages/merchant/info/info-page.tsx | 10 +++--- .../registration-status-page.tsx | 8 +++-- 11 files changed, 145 insertions(+), 55 deletions(-) diff --git a/src/entities/merchant/ui/info-wrap.tsx b/src/entities/merchant/ui/info-wrap.tsx index 79bc16f..193b82f 100644 --- a/src/entities/merchant/ui/info-wrap.tsx +++ b/src/entities/merchant/ui/info-wrap.tsx @@ -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 = () => {
{
{
{ data={ data } >
-

※ 가맹점 정보는 앱에서 수정할 수 없습니다.
PC 가맹점 관리자에서 설정해 주세요.

+

{t('merchant.infoNotice')}

diff --git a/src/entities/merchant/ui/merchant-tab.tsx b/src/entities/merchant/ui/merchant-tab.tsx index b7bd1be..886c284 100644 --- a/src/entities/merchant/ui/merchant-tab.tsx +++ b/src/entities/merchant/ui/merchant-tab.tsx @@ -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( <>
- - + + onClick={ () => onClickToNavigation(MerchantTabKeys.RegistrationStatus) } + >{t('merchant.registrationStatus')}
); diff --git a/src/entities/merchant/ui/registration-status-wrap.tsx b/src/entities/merchant/ui/registration-status-wrap.tsx index 9a80aeb..3a4703d 100644 --- a/src/entities/merchant/ui/registration-status-wrap.tsx +++ b/src/entities/merchant/ui/registration-status-wrap.tsx @@ -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 = () => {
{
{ + const { t } = useTranslation(); return ( <>
-
정산계좌
+
{t('merchant.settlementAccount')}
  • - 은행 + {t('merchant.bank')} { data?.bankName }
  • - 계좌번호 + {t('merchant.accountNumber')} { data?.accountNumber }
  • - 예금주 + {t('merchant.accountHolder')} { data?.accountHolderName }
diff --git a/src/entities/merchant/ui/section/business-section.tsx b/src/entities/merchant/ui/section/business-section.tsx index 814cdac..c394ee8 100644 --- a/src/entities/merchant/ui/section/business-section.tsx +++ b/src/entities/merchant/ui/section/business-section.tsx @@ -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 ( <>
-
기본정보
+
{t('merchant.basicInfo')}
  • - 상호 + {t('merchant.companyName')} { data?.businessCompanyName }
  • - 사업자번호 + {t('merchant.businessRegistrationNumber')} { data?.businessRegistrationNumber }
  • - 사업자속성 + {t('merchant.businessAttribute')} { data?.businessScaleTypeName }
  • - 업종 + {t('merchant.businessType')} { data?.businessType }
  • - 업태 + {t('merchant.businessCategory')} { data?.businessCategory }
@@ -39,15 +41,15 @@ export const BusinessSection = ({
  • - 대표자명 + {t('merchant.representativeName')} { data?.representativeName }
  • - 대표 연락처 + {t('merchant.representativePhone')} { data?.telephoneNumber }
  • - 대표 이메일 + {t('merchant.representativeEmail')} { data?.email }
@@ -56,11 +58,11 @@ export const BusinessSection = ({
  • - 사업장주소 + {t('merchant.businessAddress')} { data?.businessAddress }
  • - 홈페이지 주소 + {t('merchant.websiteUrl')} { data?.url }
diff --git a/src/entities/merchant/ui/section/escrow-section.tsx b/src/entities/merchant/ui/section/escrow-section.tsx index 70f117a..0ca5a1c 100644 --- a/src/entities/merchant/ui/section/escrow-section.tsx +++ b/src/entities/merchant/ui/section/escrow-section.tsx @@ -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(false); @@ -55,27 +57,27 @@ export const EscrowSection = ({ { isOpen &&
  • - 상호 + {t('merchant.companyName')} { companyName }
  • - 사업자번호 + {t('merchant.businessRegistrationNumber')} { businessRegistrationNumber }
  • - NICECROW 가입 + {t('merchant.nicecrowJoin')} { escrowStatus }
  • - 소재지 + {t('merchant.location')} { address }
  • - URL + {t('merchant.url')} { merchantUrl }
  • - 서비스 등록번호 + {t('merchant.serviceRegistrationNumber')} { serviceRegistrationNumber }
diff --git a/src/entities/merchant/ui/section/online-section.tsx b/src/entities/merchant/ui/section/online-section.tsx index f30b6f5..3c1e19c 100644 --- a/src/entities/merchant/ui/section/online-section.tsx +++ b/src/entities/merchant/ui/section/online-section.tsx @@ -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 ( <>
-
온라인 등록현황
+
{t('merchant.onlineRegistrationStatus')}
  • - 상태 + {t('merchant.status')} { data?.usageStatus }
  • - 상호 + {t('merchant.companyName')} { data?.companyName }
  • - 사업자 번호 + {t('merchant.businessRegistrationNumber')} { data?.businessRegistrationNumber }
  • - 발급일자 + {t('merchant.issueDate')} { data?.registrationDate }
  • - 계약완료 여부 + {t('merchant.contractStatus')} { data?.contractStatus }
  • - 홈페이지 심사 여부 + {t('merchant.websiteReviewStatus')} { data?.cardAuditStatus }
  • - 보증보험 + {t('merchant.guaranteeInsurance')} { data?.insuranceAmount }
  • diff --git a/src/locales/en.json b/src/locales/en.json index 4a9deb1..576a899 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -333,5 +333,41 @@ "mobilePayment": "Mobile Payment", "escrowPayment": "Escrow Payment" } + }, + "merchant": { + "title": "Merchant Management", + "info": "Merchant Info", + "registrationStatus": "Registration Status", + "contractManager": "Contract Manager", + "technicalManager": "Technical Manager", + "settlementManager": "Settlement Manager", + "infoNotice": "※ Merchant information cannot be modified in the app.\nPlease configure it in the PC merchant admin.", + "cardReviewStatus": "Credit Card Review Status", + "escrowRegistrationStatus": "Escrow Registration Status", + "settlementAccount": "Settlement Account", + "bank": "Bank", + "accountNumber": "Account Number", + "accountHolder": "Account Holder", + "basicInfo": "Basic Information", + "companyName": "Company Name", + "businessRegistrationNumber": "Business Registration Number", + "businessAttribute": "Business Attribute", + "businessType": "Business Type", + "businessCategory": "Business Category", + "representativeName": "Representative Name", + "representativePhone": "Representative Phone", + "representativeEmail": "Representative Email", + "businessAddress": "Business Address", + "websiteUrl": "Website URL", + "onlineRegistrationStatus": "Online Registration Status", + "status": "Status", + "issueDate": "Issue Date", + "contractStatus": "Contract Status", + "websiteReviewStatus": "Website Review Status", + "guaranteeInsurance": "Guarantee Insurance", + "nicecrowJoin": "NICECROW Join", + "location": "Location", + "url": "URL", + "serviceRegistrationNumber": "Service Registration Number" } } \ No newline at end of file diff --git a/src/locales/ko.json b/src/locales/ko.json index 2b93eb1..b9153e3 100644 --- a/src/locales/ko.json +++ b/src/locales/ko.json @@ -337,5 +337,41 @@ "mobilePayment": "휴대폰", "escrowPayment": "에스크로 결제" } + }, + "merchant": { + "title": "가맹점 관리", + "info": "가맹점 정보", + "registrationStatus": "등록현황", + "contractManager": "계약 담당자", + "technicalManager": "기술 담당자", + "settlementManager": "정산 담당자", + "infoNotice": "※ 가맹점 정보는 앱에서 수정할 수 없습니다.\nPC 가맹점 관리자에서 설정해 주세요.", + "cardReviewStatus": "신용카드 심사현황", + "escrowRegistrationStatus": "에스크로 가입현황", + "settlementAccount": "정산계좌", + "bank": "은행", + "accountNumber": "계좌번호", + "accountHolder": "예금주", + "basicInfo": "기본정보", + "companyName": "상호", + "businessRegistrationNumber": "사업자번호", + "businessAttribute": "사업자속성", + "businessType": "업종", + "businessCategory": "업태", + "representativeName": "대표자명", + "representativePhone": "대표 연락처", + "representativeEmail": "대표 이메일", + "businessAddress": "사업장주소", + "websiteUrl": "홈페이지 주소", + "onlineRegistrationStatus": "온라인 등록현황", + "status": "상태", + "issueDate": "발급일자", + "contractStatus": "계약완료 여부", + "websiteReviewStatus": "홈페이지 심사 여부", + "guaranteeInsurance": "보증보험", + "nicecrowJoin": "NICECROW 가입", + "location": "소재지", + "url": "URL", + "serviceRegistrationNumber": "서비스 등록번호" } } \ No newline at end of file diff --git a/src/pages/merchant/info/info-page.tsx b/src/pages/merchant/info/info-page.tsx index 6d2357a..38be574 100644 --- a/src/pages/merchant/info/info-page.tsx +++ b/src/pages/merchant/info/info-page.tsx @@ -1,11 +1,12 @@ import { useState } from 'react'; +import { useTranslation } from 'react-i18next'; import { PATHS } from '@/shared/constants/paths'; import { useNavigate } from '@/shared/lib/hooks/use-navigate'; import { MerchantTab } from '@/entities/merchant/ui/merchant-tab'; import { InfoWrap } from '@/entities/merchant/ui/info-wrap'; -import { MerchantTabKeys } from '@/entities/merchant/model/types'; +import { MerchantTabKeys } from '@/entities/merchant/model/types'; import { HeaderType } from '@/entities/common/model/types'; -import { +import { useSetHeaderTitle, useSetHeaderType, useSetFooterMode, @@ -13,11 +14,12 @@ import { } from '@/widgets/sub-layout/use-sub-layout'; export const InfoPage = () => { + const { t } = useTranslation(); const { navigate } = useNavigate(); - + const [activeTab, setActiveTab] = useState(MerchantTabKeys.Info); - useSetHeaderTitle('가맹점 관리'); + useSetHeaderTitle(t('merchant.title')); useSetHeaderType(HeaderType.LeftArrow); useSetFooterMode(false); useSetOnBack(() => { diff --git a/src/pages/merchant/registration-status/registration-status-page.tsx b/src/pages/merchant/registration-status/registration-status-page.tsx index 46e999b..49f32f3 100644 --- a/src/pages/merchant/registration-status/registration-status-page.tsx +++ b/src/pages/merchant/registration-status/registration-status-page.tsx @@ -1,11 +1,12 @@ import { useState } from 'react'; +import { useTranslation } from 'react-i18next'; import { PATHS } from '@/shared/constants/paths'; import { useNavigate } from '@/shared/lib/hooks/use-navigate'; import { MerchantTab } from '@/entities/merchant/ui/merchant-tab'; import { RegistrationStatusWrap } from '@/entities/merchant/ui/registration-status-wrap'; import { MerchantTabKeys } from '@/entities/merchant/model/types'; import { HeaderType } from '@/entities/common/model/types'; -import { +import { useSetHeaderTitle, useSetHeaderType, useSetFooterMode, @@ -13,11 +14,12 @@ import { } from '@/widgets/sub-layout/use-sub-layout'; export const RegistrationStatusPage = () => { + const { t } = useTranslation(); const { navigate } = useNavigate(); - + const [activeTab, setActiveTab] = useState(MerchantTabKeys.RegistrationStatus); - useSetHeaderTitle('가맹점 관리'); + useSetHeaderTitle(t('merchant.title')); useSetHeaderType(HeaderType.LeftArrow); useSetFooterMode(false); useSetOnBack(() => {