결제 관리 페이지 및 컴포넌트 다국어화 완료

- 결제 관리 페이지 다국어화 (결제 정보, 통보 데이터)
  * 헤더 타이틀 및 탭 버튼 다국어화
- 결제 엔티티 컴포넌트 전체 다국어화
  * payment-tab: 결제 정보/결제데이터 통보 탭
  * info-wrap: 서비스 이용, 수수료 및 정산주기 섹션
  * notification-data-wrap: 결제데이터 통보 조회 (신용카드, 계좌이체 등 5개 결제수단)
  * info-item: 수수료 및 정산주기 버튼
  * notify-row: 통보 상세 정보 (시작일자, 관리자 메일, URL/IP 등)
- 결제 바텀시트 컴포넌트 다국어화
  * card-commission-bottom-sheet: 카드 수수료 (일반/무이자/머니포인트 탭, 할부개월)
  * transfer-commission-bottom-sheet: 계좌이체 수수료 (통화 표기 포함)
  * credit-card-list-bottom-sheet: 카드사 목록
  * no-interest-info-bottom-sheet: 무이자 정보 (통화 표기 포함)
- 통화 표기 개선 (한국어: 원 suffix / 영어: ₩ prefix)
- 번역 키 추가: payment 네임스페이스 32개 키
- 계정 관리 페이지 헤더 타이틀 다국어화 적용

🤖 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 17:56:37 +09:00
parent 00b0290fa7
commit 8529f501c7
14 changed files with 204 additions and 100 deletions

View File

@@ -1,4 +1,5 @@
import { motion } from 'framer-motion'; import { motion } from 'framer-motion';
import { useTranslation } from 'react-i18next';
import { IMAGE_ROOT } from '@/shared/constants/common'; import { IMAGE_ROOT } from '@/shared/constants/common';
import { BottomSheetMotionDuration, BottomSheetMotionVaiants } from '@/entities/common/model/constant'; import { BottomSheetMotionDuration, BottomSheetMotionVaiants } from '@/entities/common/model/constant';
import { BankFees, CategoryFees, FeeRanges, GeneralTabItems, InstallmentTabItems, MoneyPointTabItems, PaymentFees } from '../model/types'; import { BankFees, CategoryFees, FeeRanges, GeneralTabItems, InstallmentTabItems, MoneyPointTabItems, PaymentFees } from '../model/types';
@@ -34,6 +35,7 @@ export const CardCommissionBottomSheet = ({
categoryFees, categoryFees,
feeRate feeRate
}: CardCommissionBottomSheetProps) => { }: CardCommissionBottomSheetProps) => {
const { t } = useTranslation();
const cardList = useStore.getState().CommonStore.creditCardList; const cardList = useStore.getState().CommonStore.creditCardList;
const [selectedCard, setSelectedCard] = useState<string>(cardList[0].desc1); const [selectedCard, setSelectedCard] = useState<string>(cardList[0].desc1);
@@ -56,14 +58,14 @@ export const CardCommissionBottomSheet = ({
> >
<div className="bottomsheet-header"> <div className="bottomsheet-header">
<div className="bottomsheet-title"> <div className="bottomsheet-title">
<h2> </h2> <h2>{t('payment.commissionAndSettlement')}</h2>
<button <button
className="close-btn" className="close-btn"
type="button" type="button"
> >
<img <img
src={ IMAGE_ROOT + '/ico_close.svg' } src={ IMAGE_ROOT + '/ico_close.svg' }
alt="닫기" alt={t('common.close')}
onClick={ () => onClickToClose() } onClick={ () => onClickToClose() }
/> />
</button> </button>
@@ -72,31 +74,31 @@ export const CardCommissionBottomSheet = ({
<div className="bottomsheet-content"> <div className="bottomsheet-content">
<div className="card-fee"> <div className="card-fee">
<div className="desc"> : { settlementPeriod }</div> <div className="desc">{t('payment.settlementPeriod')} : { settlementPeriod }</div>
<div className="notice-tabs"> <div className="notice-tabs">
{ (payType === 2 || payType === 3) && { (payType === 2 || payType === 3) &&
<button <button
className="tab36 on" className="tab36 on"
type="button" type="button"
></button> >{t('payment.general')}</button>
} }
{ (payType === 2 || payType === 3) && { (payType === 2 || payType === 3) &&
<button <button
className="tab36" className="tab36"
type="button" type="button"
></button> >{t('payment.noInterest')}</button>
} }
{ (payType === 3) && { (payType === 3) &&
<button <button
className="tab36" className="tab36"
type="button" type="button"
>/</button> >{t('payment.moneyPoint')}</button>
} }
</div> </div>
<div className="card-fee-box"> <div className="card-fee-box">
<span className="label"></span> <span className="label">{t('payment.cardCompany')}</span>
<div className="field wid-100"> <div className="field wid-100">
<select <select
value={ selectedCard } value={ selectedCard }
@@ -113,43 +115,43 @@ export const CardCommissionBottomSheet = ({
<div className="card-fee-list"> <div className="card-fee-list">
<div className="card-fee-list-header"> <div className="card-fee-list-header">
<span className="th-left"></span> <span className="th-left">{t('payment.installmentMonths')}</span>
<span className="th-right"></span> <span className="th-right">{t('payment.commission')}</span>
</div> </div>
<div className="card-fee-row"> <div className="card-fee-row">
<span>02 </span> <span>{t('payment.months', { count: 2 })}</span>
<span>2.000%</span> <span>2.000%</span>
</div> </div>
<div className="card-fee-row"> <div className="card-fee-row">
<span>03 </span> <span>{t('payment.months', { count: 3 })}</span>
<span>3.100%</span> <span>3.100%</span>
</div> </div>
<div className="card-fee-row"> <div className="card-fee-row">
<span>04 </span> <span>{t('payment.months', { count: 4 })}</span>
<span>4.400%</span> <span>4.400%</span>
</div> </div>
<div className="card-fee-row"> <div className="card-fee-row">
<span>05 </span> <span>{t('payment.months', { count: 5 })}</span>
<span>5.200%</span> <span>5.200%</span>
</div> </div>
<div className="card-fee-row"> <div className="card-fee-row">
<span>06 </span> <span>{t('payment.months', { count: 6 })}</span>
<span>6.000%</span> <span>6.000%</span>
</div> </div>
<div className="card-fee-row"> <div className="card-fee-row">
<span>07 </span> <span>{t('payment.months', { count: 7 })}</span>
<span>6.600%</span> <span>6.600%</span>
</div> </div>
<div className="card-fee-row"> <div className="card-fee-row">
<span>08 </span> <span>{t('payment.months', { count: 8 })}</span>
<span>7.500%</span> <span>7.500%</span>
</div> </div>
<div className="card-fee-row"> <div className="card-fee-row">
<span>09 </span> <span>{t('payment.months', { count: 9 })}</span>
<span>8.000%</span> <span>8.000%</span>
</div> </div>
<div className="card-fee-row"> <div className="card-fee-row">
<span>10 </span> <span>{t('payment.months', { count: 10 })}</span>
<span>9.000%</span> <span>9.000%</span>
</div> </div>
</div> </div>

View File

@@ -1,4 +1,5 @@
import { motion } from 'framer-motion'; import { motion } from 'framer-motion';
import { useTranslation } from 'react-i18next';
import { IMAGE_ROOT } from '@/shared/constants/common'; import { IMAGE_ROOT } from '@/shared/constants/common';
import { BottomSheetMotionDuration, BottomSheetMotionVaiants } from '@/entities/common/model/constant'; import { BottomSheetMotionDuration, BottomSheetMotionVaiants } from '@/entities/common/model/constant';
import { useStore } from '@/shared/model/store'; import { useStore } from '@/shared/model/store';
@@ -13,6 +14,7 @@ export const CreditCardListBottomSheet = ({
creditCardListBottomSheetOn, creditCardListBottomSheetOn,
setCreditCardListBottomSheetOn setCreditCardListBottomSheetOn
}: CreditCardListBottomSheetProps) => { }: CreditCardListBottomSheetProps) => {
const { t } = useTranslation();
const cardList = useStore.getState().CommonStore.creditCardList; const cardList = useStore.getState().CommonStore.creditCardList;
const [selectedCard, setSelectedCard] = useState<string>(cardList[0].desc1); const [selectedCard, setSelectedCard] = useState<string>(cardList[0].desc1);
@@ -35,14 +37,14 @@ export const CreditCardListBottomSheet = ({
> >
<div className="bottomsheet-header"> <div className="bottomsheet-header">
<div className="bottomsheet-title"> <div className="bottomsheet-title">
<h2></h2> <h2>{t('payment.cardCompany')}</h2>
<button <button
className="close-btn" className="close-btn"
type="button" type="button"
> >
<img <img
src={ IMAGE_ROOT + '/ico_close.svg' } src={ IMAGE_ROOT + '/ico_close.svg' }
alt="닫기" alt={t('common.close')}
onClick={ () => onClickToClose() } onClick={ () => onClickToClose() }
/> />
</button> </button>
@@ -62,10 +64,10 @@ export const CreditCardListBottomSheet = ({
</div> </div>
<div className="bottomsheet-footer"> <div className="bottomsheet-footer">
<button <button
className="btn-50 btn-blue flex-1" className="btn-50 btn-blue flex-1"
type="button" type="button"
></button> >{t('common.confirm')}</button>
</div> </div>
</motion.div> </motion.div>
</> </>

View File

@@ -1,5 +1,6 @@
import { import { useTranslation } from 'react-i18next';
PaymentInfoItemType, import {
PaymentInfoItemType,
} from '../model/types'; } from '../model/types';
export interface InfoItemProps { export interface InfoItemProps {
@@ -21,6 +22,7 @@ export const InfoItem = ({
setPayType, setPayType,
setBottomSheetOn setBottomSheetOn
}: InfoItemProps) => { }: InfoItemProps) => {
const { t } = useTranslation();
const onClickToOpenBottomSheet = () => { const onClickToOpenBottomSheet = () => {
if(setPayType && payType){ if(setPayType && payType){
@@ -42,11 +44,11 @@ export const InfoItem = ({
</div> </div>
<span className="ing-card-name">{ payName }</span> <span className="ing-card-name">{ payName }</span>
</div> </div>
<button <button
className="ing-card-link" className="ing-card-link"
type="button" type="button"
onClick={ () => onClickToOpenBottomSheet() } onClick={ () => onClickToOpenBottomSheet() }
> &gt;</button> >{t('payment.commissionAndSettlement')} &gt;</button>
</li> </li>
</> </>
) )

View File

@@ -1,4 +1,5 @@
import { useEffect, useState } from 'react'; import { useEffect, useState } from 'react';
import { useTranslation } from 'react-i18next';
import { IMAGE_ROOT } from '@/shared/constants/common'; import { IMAGE_ROOT } from '@/shared/constants/common';
import { InfoItem } from './info-item'; import { InfoItem } from './info-item';
import { CardCommissionBottomSheet } from './card-commission-bottom-sheet'; import { CardCommissionBottomSheet } from './card-commission-bottom-sheet';
@@ -33,7 +34,8 @@ import { usePaymentNonCardMutation } from '../api/use-payment-non-card-mutation'
import { usePaymentInstallmentMutation } from '../api/use-payment-installment-mutation'; import { usePaymentInstallmentMutation } from '../api/use-payment-installment-mutation';
export const InfoWrap = () => { export const InfoWrap = () => {
const { t } = useTranslation();
const [mid, setMid] = useState<string>('nictest00g'); const [mid, setMid] = useState<string>('nictest00g');
const [noInterestInfoBottomSheetOn, setNoInterestInfoBottomSheetOn] = useState<boolean>(false); const [noInterestInfoBottomSheetOn, setNoInterestInfoBottomSheetOn] = useState<boolean>(false);
@@ -212,12 +214,12 @@ export const InfoWrap = () => {
return ( return (
<> <>
<div className="ing-list"> <div className="ing-list">
<div className="ing-title"> , </div> <div className="ing-title">{t('payment.serviceUsageCommissionAndSettlement')}</div>
<ul className="ing-card-list"> <ul className="ing-card-list">
{ getList(PaymentInfoItemType.Comission) } { getList(PaymentInfoItemType.Comission) }
</ul> </ul>
<div className="ing-title"> </div> <div className="ing-title">{t('payment.merchantNoInterestInfo')}</div>
<ul className="ing-card-list"> <ul className="ing-card-list">
{ getList(PaymentInfoItemType.NoInterest) } { getList(PaymentInfoItemType.NoInterest) }
</ul> </ul>

View File

@@ -1,4 +1,5 @@
import { motion } from 'framer-motion'; import { motion } from 'framer-motion';
import { useTranslation } from 'react-i18next';
import { IMAGE_ROOT } from '@/shared/constants/common'; import { IMAGE_ROOT } from '@/shared/constants/common';
import { BottomSheetMotionVaiants, BottomSheetMotionDuration } from '@/entities/common/model/constant'; import { BottomSheetMotionVaiants, BottomSheetMotionDuration } from '@/entities/common/model/constant';
import { InstallmentDetails, PaymentInstallmentDetailResponse } from '../model/types'; import { InstallmentDetails, PaymentInstallmentDetailResponse } from '../model/types';
@@ -23,6 +24,7 @@ export const NoInterestInfoBottomSheet = ({
installmentDetails, installmentDetails,
changeToCardCompany changeToCardCompany
}: NoInterestInfoBottomSheetProps) => { }: NoInterestInfoBottomSheetProps) => {
const { t, i18n } = useTranslation();
const cardList = useStore.getState().CommonStore.creditCardList; const cardList = useStore.getState().CommonStore.creditCardList;
const [selectedCard, setSelectedCard] = useState<string>(cardList[0].desc1); const [selectedCard, setSelectedCard] = useState<string>(cardList[0].desc1);
@@ -52,23 +54,23 @@ export const NoInterestInfoBottomSheet = ({
> >
<div className="bottomsheet-header"> <div className="bottomsheet-header">
<div className="bottomsheet-title"> <div className="bottomsheet-title">
<h2> </h2> <h2>{t('payment.noInterestInfo')}</h2>
<button <button
className="close-btn" className="close-btn"
type="button" type="button"
> >
<img <img
src={ IMAGE_ROOT + '/ico_close.svg' } src={ IMAGE_ROOT + '/ico_close.svg' }
alt="닫기" alt={t('common.close')}
onClick={ () => onClickToClose() } onClick={ () => onClickToClose() }
/> />
</button> </button>
</div> </div>
</div> </div>
<div className="fee-cycle"> <div className="fee-cycle">
<div className="card-fee-box"> <div className="card-fee-box">
<span className="label"></span> <span className="label">{t('payment.cardCompany')}</span>
<div className="field wid-100"> <div className="field wid-100">
{ !!cardCompanyOptions && { !!cardCompanyOptions &&
<select onChange={ onChangeToCardCompany }> <select onChange={ onChangeToCardCompany }>
@@ -87,24 +89,26 @@ export const NoInterestInfoBottomSheet = ({
&& installmentDetails.length > 0 && installmentDetails.length > 0
&& installmentDetails.map((value, index) => ( && installmentDetails.map((value, index) => (
<> <>
{ (index > 0) && { (index > 0) &&
<div className="divider"></div> <div className="divider"></div>
} }
<div className="desc dot"> <div className="desc dot">
<span> : </span> <span>{t('payment.installmentMonths')} : </span>
<span>{ value.installmentMonths }</span> <span>{ value.installmentMonths }</span>
</div> </div>
<div className="desc dot"> <div className="desc dot">
<span> : </span> <span>{t('payment.applicationPeriod')} : </span>
<span>{ value.applicationPeriod }</span> <span>{ value.applicationPeriod }</span>
</div> </div>
<div className="desc dot"> <div className="desc dot">
<span> : </span> <span>{t('payment.applicationAmount')} : </span>
<span> <span>
<NumericFormat <NumericFormat
value={ value.applicationAmount } value={ value.applicationAmount }
thousandSeparator thousandSeparator
displayType="text" displayType="text"
prefix={i18n.language === 'en' ? t('home.currencySymbol') : ''}
suffix={i18n.language === 'en' ? '' : t('home.currencyWon')}
></NumericFormat> ></NumericFormat>
</span> </span>
</div> </div>

View File

@@ -1,10 +1,12 @@
import { ChangeEvent, useEffect, useState } from 'react'; import { ChangeEvent, useEffect, useState } from 'react';
import { useTranslation } from 'react-i18next';
import { NotifyRowKeys } from '../model/types'; import { NotifyRowKeys } from '../model/types';
import { usePaymentNotificationDataMutation } from '../api/use-payment-notification-data-mutation'; import { usePaymentNotificationDataMutation } from '../api/use-payment-notification-data-mutation';
import { useStore } from '@/shared/model/store'; import { useStore } from '@/shared/model/store';
import { NotifyRow } from './section/notify-row'; import { NotifyRow } from './section/notify-row';
export const NotificationDataWrap = () => { export const NotificationDataWrap = () => {
const { t } = useTranslation();
const midOptions = useStore.getState().UserStore.selectOptionsMids; const midOptions = useStore.getState().UserStore.selectOptionsMids;
const userMid = useStore.getState().UserStore.mid; const userMid = useStore.getState().UserStore.mid;
@@ -60,12 +62,12 @@ export const NotificationDataWrap = () => {
</div> </div>
<div className="notify-container"> <div className="notify-container">
<div className="notify-header"> <div className="notify-header">
<h3 className="notify-title"> </h3> <h3 className="notify-title">{t('payment.notificationDataInquiry')}</h3>
</div> </div>
<ul className="notify-list"> <ul className="notify-list">
<li> <li>
<NotifyRow <NotifyRow
paymentMethodName='신용카드' paymentMethodName={t('payment.paymentMethods.creditCard')}
type={ NotifyRowKeys.CreditCard } type={ NotifyRowKeys.CreditCard }
startDate={ creditCard?.startDate } startDate={ creditCard?.startDate }
adminEmail={ creditCard?.adminEmail } adminEmail={ creditCard?.adminEmail }
@@ -81,7 +83,7 @@ export const NotificationDataWrap = () => {
<li className="notify-divider"></li> <li className="notify-divider"></li>
<li> <li>
<NotifyRow <NotifyRow
paymentMethodName='계좌이체' paymentMethodName={t('payment.paymentMethods.accountTransfer')}
type={ NotifyRowKeys.AccountTransfer } type={ NotifyRowKeys.AccountTransfer }
startDate={ accountTransfer?.startDate } startDate={ accountTransfer?.startDate }
adminEmail={ accountTransfer?.adminEmail } adminEmail={ accountTransfer?.adminEmail }
@@ -97,7 +99,7 @@ export const NotificationDataWrap = () => {
<li className="notify-divider"></li> <li className="notify-divider"></li>
<li> <li>
<NotifyRow <NotifyRow
paymentMethodName='가상계좌' paymentMethodName={t('payment.paymentMethods.virtualAccount')}
type={ NotifyRowKeys.VirtualAccount } type={ NotifyRowKeys.VirtualAccount }
startDate={ virtualAccount?.startDate } startDate={ virtualAccount?.startDate }
adminEmail={ virtualAccount?.adminEmail } adminEmail={ virtualAccount?.adminEmail }
@@ -113,7 +115,7 @@ export const NotificationDataWrap = () => {
<li className="notify-divider"></li> <li className="notify-divider"></li>
<li> <li>
<NotifyRow <NotifyRow
paymentMethodName='휴대폰' paymentMethodName={t('payment.paymentMethods.mobilePayment')}
type={ NotifyRowKeys.MobilePayment } type={ NotifyRowKeys.MobilePayment }
startDate={ mobilePayment?.startDate } startDate={ mobilePayment?.startDate }
adminEmail={ mobilePayment?.adminEmail } adminEmail={ mobilePayment?.adminEmail }
@@ -129,7 +131,7 @@ export const NotificationDataWrap = () => {
<li className="notify-divider"></li> <li className="notify-divider"></li>
<li> <li>
<NotifyRow <NotifyRow
paymentMethodName='에스크로 결제' paymentMethodName={t('payment.paymentMethods.escrowPayment')}
type={ NotifyRowKeys.EscrowPayment } type={ NotifyRowKeys.EscrowPayment }
startDate={ escrowPayment?.startDate } startDate={ escrowPayment?.startDate }
adminEmail={ escrowPayment?.adminEmail } adminEmail={ escrowPayment?.adminEmail }
@@ -145,8 +147,8 @@ export const NotificationDataWrap = () => {
</ul> </ul>
</div> </div>
<div className="notify-bar"> <div className="notify-bar">
<span> PC에서 .</span> <span>{t('payment.notificationDataSettingInfo')}</span>
<span> .</span> <span>{t('payment.onlyConfiguredPaymentMethodsShown')}</span>
</div> </div>
</div> </div>
</> </>

View File

@@ -1,6 +1,7 @@
import { useTranslation } from 'react-i18next';
import { PATHS } from '@/shared/constants/paths'; import { PATHS } from '@/shared/constants/paths';
import { useNavigate } from '@/shared/lib/hooks/use-navigate'; import { useNavigate } from '@/shared/lib/hooks/use-navigate';
import { import {
PaymentTabKeys, PaymentTabKeys,
PaymentTabProps PaymentTabProps
} from '../model/types'; } from '../model/types';
@@ -8,6 +9,7 @@ import {
export const PaymentTab = ({ export const PaymentTab = ({
activeTab activeTab
}: PaymentTabProps) => { }: PaymentTabProps) => {
const { t } = useTranslation();
const { navigate } = useNavigate(); const { navigate } = useNavigate();
const onClickToNavigation = (tab: PaymentTabKeys) => { const onClickToNavigation = (tab: PaymentTabKeys) => {
@@ -23,14 +25,14 @@ export const PaymentTab = ({
return( return(
<> <>
<div className="subTab"> <div className="subTab">
<button <button
className={`subtab-btn ${(activeTab === PaymentTabKeys.Info)? 'active': ''}` } className={`subtab-btn ${(activeTab === PaymentTabKeys.Info)? 'active': ''}` }
onClick={ () => onClickToNavigation(PaymentTabKeys.Info) } onClick={ () => onClickToNavigation(PaymentTabKeys.Info) }
> </button> >{t('payment.info')}</button>
<button <button
className={`subtab-btn ${(activeTab === PaymentTabKeys.NotificationData)? 'active': ''}` } className={`subtab-btn ${(activeTab === PaymentTabKeys.NotificationData)? 'active': ''}` }
onClick={ () => onClickToNavigation(PaymentTabKeys.NotificationData) } onClick={ () => onClickToNavigation(PaymentTabKeys.NotificationData) }
> </button> >{t('payment.notificationData')}</button>
</div> </div>
</> </>
); );

View File

@@ -1,5 +1,6 @@
import moment from 'moment'; import moment from 'moment';
import { useEffect, useState } from 'react'; import { useEffect, useState } from 'react';
import { useTranslation } from 'react-i18next';
import { SlideDown } from 'react-slidedown'; import { SlideDown } from 'react-slidedown';
import 'react-slidedown/lib/slidedown.css'; import 'react-slidedown/lib/slidedown.css';
import { NotifyRowKeys } from '../../model/types'; import { NotifyRowKeys } from '../../model/types';
@@ -31,6 +32,7 @@ export const NotifyRow = ({
openChild, openChild,
setOpenChild setOpenChild
}: NotifyRowProps) => { }: NotifyRowProps) => {
const { t } = useTranslation();
const [isOpen, setIsOpen] = useState<boolean>(false); const [isOpen, setIsOpen] = useState<boolean>(false);
const openNotifyRow = () => { const openNotifyRow = () => {
@@ -63,13 +65,13 @@ export const NotifyRow = ({
{ isOpen && { isOpen &&
<div className="notify-content"> <div className="notify-content">
<ul className="notify-detail-list"> <ul className="notify-detail-list">
<li className="notify-detail-item"> : { (!!startDate)? moment(startDate).format('YYYY-MM-DD'): '' }</li> <li className="notify-detail-item">{t('payment.startDate')} : { (!!startDate)? moment(startDate).format('YYYY-MM-DD'): '' }</li>
<li className="notify-detail-item"> : { adminEmail } </li> <li className="notify-detail-item">{t('payment.adminEmail')} : { adminEmail } </li>
<li className="notify-detail-item">URL/IP : { urlIp }</li> <li className="notify-detail-item">{t('payment.urlIp')} : { urlIp }</li>
<li className="notify-detail-item"> : { retransmissionInterval }</li> <li className="notify-detail-item">{t('payment.retransmissionInterval')} : { retransmissionInterval }</li>
<li className="notify-detail-item"> : { retransmissionCount }</li> <li className="notify-detail-item">{t('payment.retransmissionCount')} : { retransmissionCount }</li>
<li className="notify-detail-item">OK : { okCheck }</li> <li className="notify-detail-item">{t('payment.okCheck')} : { okCheck }</li>
<li className="notify-detail-item"> : { encryptionStatus }</li> <li className="notify-detail-item">{t('payment.encryptionStatus')} : { encryptionStatus }</li>
</ul> </ul>
</div> </div>
} }

View File

@@ -1,6 +1,8 @@
import { useTranslation } from 'react-i18next';
import { IMAGE_ROOT } from '@/shared/constants/common'; import { IMAGE_ROOT } from '@/shared/constants/common';
export const TransferCommissionBottomSheet = () => { export const TransferCommissionBottomSheet = () => {
const { t, i18n } = useTranslation();
return ( return (
<> <>
@@ -8,43 +10,43 @@ export const TransferCommissionBottomSheet = () => {
<div className="bottomsheet"> <div className="bottomsheet">
<div className="bottomsheet-header"> <div className="bottomsheet-header">
<div className="bottomsheet-title"> <div className="bottomsheet-title">
<h2> </h2> <h2>{t('payment.commissionAndSettlement')}</h2>
<button <button
className="close-btn" className="close-btn"
type="button" type="button"
> >
<img <img
src={ IMAGE_ROOT + '/ico_close.svg' } src={ IMAGE_ROOT + '/ico_close.svg' }
alt="닫기" alt={t('common.close')}
/> />
</button> </button>
</div> </div>
</div> </div>
<div className="fee-cycle"> <div className="fee-cycle">
<div className="desc dot">정산주기 : 일일(+3)</div> <div className="desc dot">{t('payment.settlementPeriod')} : {t('payment.dailyPlus3Days')}</div>
<div className="desc dot"></div> <div className="desc dot">{t('payment.commission')}</div>
<div className="divider"></div> <div className="divider"></div>
<ul className="kv-list"> <ul className="kv-list">
<li className="kv-row pl-10"> <li className="kv-row pl-10">
<span className="k">()</span> <span className="k">{t('payment.paymentFeeMinimum')}</span>
<span className="v">1</span> <span className="v">1{i18n.language === 'en' ? '' : t('home.currencyWon')}</span>
</li> </li>
<li className="kv-row pl-10"> <li className="kv-row pl-10">
<span className="k">(1~)</span> <span className="k">{t('payment.paymentFeeFrom1Won')}</span>
<span className="v">1</span> <span className="v">1{i18n.language === 'en' ? '' : t('home.currencyWon')}</span>
</li> </li>
<li className="kv-row pl-10"> <li className="kv-row pl-10">
<span className="k"></span> <span className="k">{t('payment.cancellationFee')}</span>
<span className="v">1</span> <span className="v">1{i18n.language === 'en' ? '' : t('home.currencyWon')}</span>
</li> </li>
</ul> </ul>
</div> </div>
<div className="bottomsheet-footer"> <div className="bottomsheet-footer">
<button <button
className="btn-50 btn-blue flex-1" className="btn-50 btn-blue flex-1"
type="button" type="button"
></button> >{t('common.confirm')}</button>
</div> </div>
</div> </div>
</> </>

View File

@@ -293,5 +293,45 @@
"title": "Billing", "title": "Billing",
"detailTitle": "Billing Details", "detailTitle": "Billing Details",
"charge": "Billing Charge" "charge": "Billing Charge"
},
"payment": {
"title": "Payment Management",
"info": "Payment Info",
"notificationData": "Notification Data",
"notificationDataInquiry": "Payment Notification Data Inquiry",
"serviceUsageCommissionAndSettlement": "Service Usage, Commission & Settlement Period",
"merchantNoInterestInfo": "Merchant No-Interest Info",
"commissionAndSettlement": "Commission & Settlement",
"settlementPeriod": "Settlement Period",
"general": "General",
"noInterest": "No Interest",
"moneyPoint": "Money/Point",
"cardCompany": "Card Company",
"installmentMonths": "Installment Months",
"commission": "Commission",
"months": "{{count}} Months",
"dailyPlus3Days": "Daily (+3 days)",
"paymentFeeMinimum": "Payment Fee (Minimum)",
"paymentFeeFrom1Won": "Payment Fee (From ₩1)",
"cancellationFee": "Cancellation Fee",
"noInterestInfo": "No-Interest Info",
"applicationPeriod": "Application Period",
"applicationAmount": "Application Amount",
"notificationDataSettingInfo": "Payment notification data settings are available on PC.",
"onlyConfiguredPaymentMethodsShown": "Only configured payment methods are shown.",
"startDate": "Start Date",
"adminEmail": "Admin Email",
"urlIp": "URL/IP",
"retransmissionInterval": "Retransmission Interval",
"retransmissionCount": "Retransmission Count",
"okCheck": "OK Check",
"encryptionStatus": "Encryption Status",
"paymentMethods": {
"creditCard": "Credit Card",
"accountTransfer": "Account Transfer",
"virtualAccount": "Virtual Account",
"mobilePayment": "Mobile Payment",
"escrowPayment": "Escrow Payment"
}
} }
} }

View File

@@ -297,5 +297,45 @@
"title": "빌링", "title": "빌링",
"detailTitle": "빌링 상세", "detailTitle": "빌링 상세",
"charge": "빌링 청구" "charge": "빌링 청구"
},
"payment": {
"title": "결제 관리",
"info": "결제 정보",
"notificationData": "결제데이터 통보",
"notificationDataInquiry": "결제데이터 통보 조회",
"serviceUsageCommissionAndSettlement": "서비스 이용, 수수료 및 정산주기",
"merchantNoInterestInfo": "가맹점 분담 무이자 정보",
"commissionAndSettlement": "수수료 및 정산주기",
"settlementPeriod": "정산주기",
"general": "일반",
"noInterest": "무이자",
"moneyPoint": "머니/포인트",
"cardCompany": "카드사",
"installmentMonths": "할부개월",
"commission": "수수료",
"months": "{{count}} 개월",
"dailyPlus3Days": "일일(+3일)",
"paymentFeeMinimum": "결제수수료(최저수수료)",
"paymentFeeFrom1Won": "결제수수료(1원~)",
"cancellationFee": "취소수수료",
"noInterestInfo": "무이자 정보",
"applicationPeriod": "적용기간",
"applicationAmount": "적용금액",
"notificationDataSettingInfo": "결제데이터 통보 설정은 PC에서 가능합니다.",
"onlyConfiguredPaymentMethodsShown": "전송 설정한 지불수단만 노출됩니다.",
"startDate": "시작일자",
"adminEmail": "관리자 메일",
"urlIp": "URL/IP",
"retransmissionInterval": "재전송 간격",
"retransmissionCount": "재전송 횟수",
"okCheck": "OK 체크",
"encryptionStatus": "암호화 전송여부",
"paymentMethods": {
"creditCard": "신용카드",
"accountTransfer": "계좌이체",
"virtualAccount": "가상계좌",
"mobilePayment": "휴대폰",
"escrowPayment": "에스크로 결제"
}
} }
} }

View File

@@ -16,7 +16,7 @@ export const PasswordManagePage = () => {
const { navigate } = useNavigate(); const { navigate } = useNavigate();
const [activeTab, setActiveTab] = useState<AccountTabKeys>(AccountTabKeys.PasswordManage); const [activeTab, setActiveTab] = useState<AccountTabKeys>(AccountTabKeys.PasswordManage);
useSetHeaderTitle('계정 관리'); useSetHeaderTitle(t('account.manage'));
useSetHeaderType(HeaderType.LeftArrow); useSetHeaderType(HeaderType.LeftArrow);
useSetFooterMode(false); useSetFooterMode(false);
useSetOnBack(() => { useSetOnBack(() => {

View File

@@ -1,11 +1,12 @@
import { useState } from 'react'; import { useState } from 'react';
import { useTranslation } from 'react-i18next';
import { PATHS } from '@/shared/constants/paths'; import { PATHS } from '@/shared/constants/paths';
import { useNavigate } from '@/shared/lib/hooks/use-navigate'; import { useNavigate } from '@/shared/lib/hooks/use-navigate';
import { PaymentTab } from '@/entities/payment/ui/payment-tab'; import { PaymentTab } from '@/entities/payment/ui/payment-tab';
import { InfoWrap } from '@/entities/payment/ui/info-wrap'; import { InfoWrap } from '@/entities/payment/ui/info-wrap';
import { PaymentTabKeys } from '@/entities/payment/model/types'; import { PaymentTabKeys } from '@/entities/payment/model/types';
import { HeaderType } from '@/entities/common/model/types'; import { HeaderType } from '@/entities/common/model/types';
import { import {
useSetHeaderTitle, useSetHeaderTitle,
useSetHeaderType, useSetHeaderType,
useSetFooterMode, useSetFooterMode,
@@ -13,11 +14,12 @@ import {
} from '@/widgets/sub-layout/use-sub-layout'; } from '@/widgets/sub-layout/use-sub-layout';
export const InfoPage = () => { export const InfoPage = () => {
const { t } = useTranslation();
const { navigate } = useNavigate(); const { navigate } = useNavigate();
const [activeTab, setActiveTab] = useState<PaymentTabKeys>(PaymentTabKeys.Info); const [activeTab, setActiveTab] = useState<PaymentTabKeys>(PaymentTabKeys.Info);
useSetHeaderTitle('결제 관리'); useSetHeaderTitle(t('payment.title'));
useSetHeaderType(HeaderType.LeftArrow); useSetHeaderType(HeaderType.LeftArrow);
useSetFooterMode(false); useSetFooterMode(false);
useSetOnBack(() => { useSetOnBack(() => {

View File

@@ -1,11 +1,12 @@
import { useState } from 'react'; import { useState } from 'react';
import { useTranslation } from 'react-i18next';
import { PATHS } from '@/shared/constants/paths'; import { PATHS } from '@/shared/constants/paths';
import { useNavigate } from '@/shared/lib/hooks/use-navigate'; import { useNavigate } from '@/shared/lib/hooks/use-navigate';
import { PaymentTab } from '@/entities/payment/ui/payment-tab'; import { PaymentTab } from '@/entities/payment/ui/payment-tab';
import { NotificationDataWrap } from '@/entities/payment/ui/notification-data-wrap'; import { NotificationDataWrap } from '@/entities/payment/ui/notification-data-wrap';
import { PaymentTabKeys } from '@/entities/payment/model/types'; import { PaymentTabKeys } from '@/entities/payment/model/types';
import { HeaderType } from '@/entities/common/model/types'; import { HeaderType } from '@/entities/common/model/types';
import { import {
useSetHeaderTitle, useSetHeaderTitle,
useSetHeaderType, useSetHeaderType,
useSetFooterMode, useSetFooterMode,
@@ -13,10 +14,11 @@ import {
} from '@/widgets/sub-layout/use-sub-layout'; } from '@/widgets/sub-layout/use-sub-layout';
export const NotificationDataPage = () => { export const NotificationDataPage = () => {
const { t } = useTranslation();
const { navigate } = useNavigate(); const { navigate } = useNavigate();
const [activeTab, setActiveTab] = useState<PaymentTabKeys>(PaymentTabKeys.NotificationData); const [activeTab, setActiveTab] = useState<PaymentTabKeys>(PaymentTabKeys.NotificationData);
useSetHeaderTitle('결제 관리'); useSetHeaderTitle(t('payment.title'));
useSetHeaderType(HeaderType.LeftArrow); useSetHeaderType(HeaderType.LeftArrow);
useSetFooterMode(false); useSetFooterMode(false);
useSetOnBack(() => { useSetOnBack(() => {