From e067fc8d4f1cef5a0fbb5410504fafe1f4a1cda1 Mon Sep 17 00:00:00 2001 From: Jay Sheen Date: Thu, 30 Oct 2025 16:14:25 +0900 Subject: [PATCH 01/15] Add comprehensive i18n localization to transaction UI components MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Localize 23 transaction UI component files - Add 150+ translation keys to ko.json and en.json - Organized translations under transaction namespace: * transaction.bottomSheet - Bottom sheet modals * transaction.sections - Section titles * transaction.fields - Field labels (90+ keys) * transaction.cancel - Cancellation flows * transaction.handWrittenIssuance - Manual issuance forms * transaction.list - List actions Updated files: - Bottom sheets: escrow-mail-resend, cash-receipt-purpose-update - Sections: billing-info, part-cancel-info, detail-info, issue-info, escrow-info, important-info, payment-info, transaction-info, settlement-info, merchant-info, amount-info, cancel-bank-group, cancel-password-group - Lists: list-item, billing-list, cash-receipt-list - Cancel flows: all-cancel, part-cancel, prevent-bond - Issuance: hand-written-issuance-step1, hand-written-issuance-step2 ๐Ÿค– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- .../ui/all-transaction-all-cancel.tsx | 11 +- .../all-transaction-cancel-prevent-bond.tsx | 54 ++--- .../ui/all-transaction-part-cancel.tsx | 34 +-- src/entities/transaction/ui/billing-list.tsx | 12 +- ...sh-receipt-hand-written-issuance-step1.tsx | 44 ++-- ...sh-receipt-hand-written-issuance-step2.tsx | 21 +- .../transaction/ui/cash-receipt-list.tsx | 12 +- ...ash-receit-purpose-update-bottom-sheet.tsx | 22 +- .../ui/escrow-mail-resend-bottom-sheet.tsx | 26 ++- src/entities/transaction/ui/list-item.tsx | 18 +- ...-transaction-cancel-section-bank-group.tsx | 26 ++- ...nsaction-cancel-section-password-group.tsx | 12 +- .../ui/section/amount-info-section.tsx | 127 +++++------ .../ui/section/billing-info-section.tsx | 38 ++-- .../ui/section/detail-info-section.tsx | 24 +- .../ui/section/escrow-info-section.tsx | 26 ++- .../ui/section/important-info-section.tsx | 48 ++-- .../ui/section/issue-info-section.tsx | 20 +- .../ui/section/merchant-info-section.tsx | 12 +- .../ui/section/part-cancel-info-section.tsx | 18 +- .../ui/section/payment-info-section.tsx | 134 +++++------ .../ui/section/settlement-info-section.tsx | 34 +-- .../ui/section/transaction-info-section.tsx | 40 ++-- src/locales/en.json | 209 +++++++++++++++++- src/locales/ko.json | 209 +++++++++++++++++- 25 files changed, 847 insertions(+), 384 deletions(-) diff --git a/src/entities/transaction/ui/all-transaction-all-cancel.tsx b/src/entities/transaction/ui/all-transaction-all-cancel.tsx index a0ef725..7359185 100644 --- a/src/entities/transaction/ui/all-transaction-all-cancel.tsx +++ b/src/entities/transaction/ui/all-transaction-all-cancel.tsx @@ -3,6 +3,7 @@ import { AllTransactionCancelInfoResponse } from '../model/types'; import { AllTransactionCancelSectionPasswordGroup } from './section/all-transaction-cancel-section-password-group'; import { AllTransactionCancelSectionBankGroup } from './section/all-transaction-cancel-section-bank-group'; import { NumericFormat } from 'react-number-format'; +import { useTranslation } from 'react-i18next'; export interface AllTransactionAllCancelProps extends AllTransactionCancelInfoResponse { serviceCode: string; @@ -45,25 +46,27 @@ export const AllTransactionAllCancel = ({ requestSuccess, totalCancelAmount }: AllTransactionAllCancelProps) => { + const { t } = useTranslation(); + return ( <>
  • - ยท  ์ด ์ž”์•ก + ยท  {t('transaction.fields.totalBalance')}
  • - ยท  ์ด ์ทจ์†Œ๊ธˆ์•ก + ยท  {t('transaction.fields.totalCancelAmount')} diff --git a/src/entities/transaction/ui/all-transaction-cancel-prevent-bond.tsx b/src/entities/transaction/ui/all-transaction-cancel-prevent-bond.tsx index 4ca0519..0175a59 100644 --- a/src/entities/transaction/ui/all-transaction-cancel-prevent-bond.tsx +++ b/src/entities/transaction/ui/all-transaction-cancel-prevent-bond.tsx @@ -7,6 +7,7 @@ import { NumericFormat } from 'react-number-format'; import { FilterMotionDuration, FilterMotionStyle, FilterMotionVariants } from '@/entities/common/model/constant'; import { useNavigate } from '@/shared/lib/hooks'; import { PATHS } from '@/shared/constants/paths'; +import { useTranslation } from 'react-i18next'; export interface AllTransactionCancelPreventBondProps { cancelPreventBondOn: boolean; setCancelPreventBondOn: (cancelPreventBondOn: boolean) => void; @@ -22,6 +23,7 @@ export const AllTransactionCancelPreventBond = ({ serviceCode, tid }: AllTransactionCancelPreventBondProps) => { + const { t } = useTranslation(); const { navigate } = useNavigate(); const [item, setItem] = useState(debtPreventionCancelDisplayInfo); const onClickToClose = () => { @@ -48,15 +50,15 @@ export const AllTransactionCancelPreventBond = ({ >
    -
    ๊ฑฐ๋ž˜์ทจ์†Œ(์ž…๊ธˆ ํ›„ ์ทจ์†Œ)
    +
    {t('transaction.cancel.afterDeposit.title')}
    - @@ -64,43 +66,43 @@ export const AllTransactionCancelPreventBond = ({
    -
    ์š”์ฒญํ•˜์‹  ๊ฑฐ๋ž˜์ทจ์†Œ๋Š” ์ž…๊ธˆ ํ›„ ์ทจ์†Œ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
    -
    ์ทจ์†Œ๊ฑฐ๋ž˜๋‚ด์—ญ
    +
    {t('transaction.cancel.afterDeposit.notice')}
    +
    {t('transaction.cancel.afterDeposit.cancelTransactionTitle')}
    • -
      ยท ์Šน์ธ์ผ
      +
      ยท {t('transaction.fields.approvalDay')}
      { item?.approvalDate? moment(item?.approvalDate).format('YYYY.MM.DD'): '' }
    • -
      ยท ์Šน์ธ๋ฒˆํ˜ธ
      +
      ยท {t('transaction.fields.approvalNumber')}
      { item?.approvalNo }
    • -
      ยท ์Šน์ธ๊ธˆ์•ก
      +
      ยท {t('transaction.cancel.afterDeposit.approvalAmount')}
    • -
      ยท ์ด ์ทจ์†Œ๊ธˆ์•ก
      +
      ยท {t('transaction.fields.totalCancelAmount')}
    • -
      ยท ์ž…๊ธˆ์š”์ฒญ๊ธˆ์•ก :
      +
      ยท {t('transaction.cancel.afterDeposit.depositRequestAmount')} :
      @@ -109,40 +111,40 @@ export const AllTransactionCancelPreventBond = ({
    -
    ์ž…๊ธˆ ์ •๋ณด
    +
    {t('transaction.cancel.afterDeposit.depositInfoTitle')}
    • -
      ยท ์€ํ–‰
      +
      ยท {t('transaction.fields.bank')}
      { item?.bankName }
    • -
      ยท ๊ณ„์ขŒ๋ฒˆํ˜ธ
      +
      ยท {t('transaction.fields.accountNo')}
      { item?.accountNo }
    • -
      ยท ์˜ˆ๊ธˆ์ฃผ
      +
      ยท {t('transaction.fields.accountHolder')}
      { item?.accountName }
    -
    [์ทจ์†Œ์š”์ฒญ] ๋ฒ„ํŠผ์„ ํ†ตํ•ด ์ทจ์†Œ ์š”์ฒญ์„ ์ง„ํ–‰ํ•ด์•ผ ์ ‘์ˆ˜๋ฉ๋‹ˆ๋‹ค.
    -
    ์ž…๊ธˆ์ž๋ช…์€ ๊ฐ€๋งน์  ์ƒํ˜ธ๋กœ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”.
    -
    ์ž…๊ธˆ์š”์ฒญ๊ธˆ์•ก๊ณผ ๋™์ผํ•œ ๊ธˆ์•ก์„ ์ž…๊ธˆํ•ด์•ผ ์ทจ์†Œ๊ฐ€ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค.
    -
    ์ทจ์†Œ๋‚ด์—ญ์€ ์ตœ๋Œ€ 3์ผ ์ดํ›„ ํ™•์ธ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
    -
    ์ž…๊ธˆ ํ›„ ์ทจ์†Œ ํ”„๋กœ์„ธ์Šค :
    ๊ฐ€๋งน์ ์˜ ์ทจ์†Œ์š”์ฒญ -> ๊ฐ€๋งน์ ์˜์ž…๊ธˆ -> ์ž…๊ธˆ ํ™•์ธ -> ์ทจ์†Œ ์ฒ˜๋ฆฌ
    -
    ์ •์‚ฐ๋ฐ›์ง€ ์•Š์€ ๊ฑฐ๋ž˜์ธ ๊ฒฝ์šฐ service@nicepay.co.kr๋กœ ๊ฑฐ๋ž˜๋‚ด์—ญ์„ ๋ฐœ์†ก๋ฐ”๋ž๋‹ˆ๋‹ค. (๋‹จ. ์ •์‚ฐ์˜ˆ์ •์ผ์ด 2์ผ ์ด์ƒ ๋‚จ์€ ๊ฑฐ๋ž˜์— ํ•œํ•จ)
    +
    {t('transaction.cancel.afterDeposit.guide1')}
    +
    {t('transaction.cancel.afterDeposit.guide2')}
    +
    {t('transaction.cancel.afterDeposit.guide3')}
    +
    {t('transaction.cancel.afterDeposit.guide4')}
    +
    +
    - + >{t('transaction.submit')}
    diff --git a/src/entities/transaction/ui/all-transaction-part-cancel.tsx b/src/entities/transaction/ui/all-transaction-part-cancel.tsx index dde9e51..85994eb 100644 --- a/src/entities/transaction/ui/all-transaction-part-cancel.tsx +++ b/src/entities/transaction/ui/all-transaction-part-cancel.tsx @@ -3,6 +3,7 @@ import { AllTransactionCancelInfoResponse } from '../model/types'; import { NumericFormat } from 'react-number-format'; import { AllTransactionCancelSectionPasswordGroup } from './section/all-transaction-cancel-section-password-group'; import { AllTransactionCancelSectionBankGroup } from './section/all-transaction-cancel-section-bank-group'; +import { useTranslation } from 'react-i18next'; export interface AllTransactionPartCancelProps extends AllTransactionCancelInfoResponse { serviceCode: string; @@ -63,6 +64,7 @@ export const AllTransactionPartCancel = ({ totalCancelAmount, setTotalCancelAmount }: AllTransactionPartCancelProps) => { + const { t } = useTranslation(); const [cancelTotalCancelAmountReadonly, setCancelTotalCancelAmountReadonly] = useState(true); const [cancelSupplyAmountDisabled, setCancelSupplyAmountDisabled] = useState(false); const [cancelGoodsVatDisabled, setCancelGoodsVatDisabled] = useState(false); @@ -180,20 +182,20 @@ export const AllTransactionPartCancel = ({
    • - ยท  ์ด ์ž”์•ก + ยท  {t('transaction.fields.totalBalance')}
    • - ยท  ์ด ์ทจ์†Œ๊ธˆ์•ก + ยท  {t('transaction.fields.totalCancelAmount')} - ์ž”์•ก - ์ทจ์†Œ๊ธˆ์•ก + {t('transaction.cancel.partCancel.balance')} + {t('transaction.cancel.partCancel.cancelAmount')} - ๊ณผ์„ธ์•ก + {t('transaction.cancel.partCancel.taxableAmount')} + > - ๋ถ€๊ฐ€์„ธ + {t('transaction.cancel.partCancel.taxAmount')} + > - ๋ฉด์„ธ + {t('transaction.cancel.partCancel.taxFree')} @@ -281,10 +283,10 @@ export const AllTransactionPartCancel = ({ - ๋ด‰์‚ฌ๋ฃŒ + {t('transaction.cancel.partCancel.serviceFee')} diff --git a/src/entities/transaction/ui/billing-list.tsx b/src/entities/transaction/ui/billing-list.tsx index 6f35f36..e50aebd 100644 --- a/src/entities/transaction/ui/billing-list.tsx +++ b/src/entities/transaction/ui/billing-list.tsx @@ -2,12 +2,14 @@ import { PATHS } from '@/shared/constants/paths'; import { useNavigate } from '@/shared/lib/hooks/use-navigate'; import { BillingListProps } from '../model/types'; import { ListDateGroup } from './list-date-group'; +import { useTranslation } from 'react-i18next'; -export const BillingList = ({ +export const BillingList = ({ transactionCategory, - listItems + listItems }: BillingListProps) => { const { navigate } = useNavigate(); + const { t } = useTranslation(); const getListDateGroup = () => { let rs = []; @@ -62,10 +64,10 @@ export const BillingList = ({ { getListDateGroup() }
    - + onClick={ () => onClickToNavigate() } + >{ t('transaction.list.paymentRequest') }
    ); diff --git a/src/entities/transaction/ui/cash-receipt-hand-written-issuance-step1.tsx b/src/entities/transaction/ui/cash-receipt-hand-written-issuance-step1.tsx index a6c27d4..46f7f3f 100644 --- a/src/entities/transaction/ui/cash-receipt-hand-written-issuance-step1.tsx +++ b/src/entities/transaction/ui/cash-receipt-hand-written-issuance-step1.tsx @@ -4,6 +4,7 @@ import { useNavigate } from '@/shared/lib/hooks/use-navigate'; import { useSetOnBack } from '@/widgets/sub-layout/use-sub-layout'; import { CashReceiptPurposeType } from '../model/types'; import { PatternFormat } from 'react-number-format'; +import { useTranslation } from 'react-i18next'; export interface CashReceiptHandWrittenIssuanceStep1Props { businessNumber?: string; @@ -38,19 +39,20 @@ export const CashReceiptHandWrittenIssuanceStep1 = ({ setEmail, setPhoneNumber }: CashReceiptHandWrittenIssuanceStep1Props) => { + const { t } = useTranslation(); const { navigate } = useNavigate(); - + useSetOnBack(() => { navigate(PATHS.transaction.cashReceipt.list); }); return ( <> -

    ๋ฐœํ–‰ ์ •๋ณด ์ž…๋ ฅ

    +

    {t('transaction.handWrittenIssuance.step1Title')}

    -
    ์‚ฌ์—…์ž ๋ฒˆํ˜ธ
    +
    {t('transaction.handWrittenIssuance.businessNumber')}
    -
    -
    ์šฉ๋„
    +
    {t('transaction.fields.purpose')}
    + >{t('transaction.handWrittenIssuance.incomeDeduction')} + >{t('transaction.handWrittenIssuance.expenseProof')}
    -
    ์ƒํ’ˆ๋ช…
    +
    {t('transaction.fields.productName')}
    - ) => setProductName(e.target.value) } />
    -
    ๊ตฌ๋งค์ž
    +
    {t('transaction.fields.buyer')}
    - ) => setBuyerName(e.target.value) } />
    -
    ๋ฐœํ–‰๋ฒˆํ˜ธ
    +
    {t('transaction.fields.issueNumber')}
    -
    ์ด๋ฉ”์ผ ์ฃผ์†Œ
    +
    {t('account.emailAddress')}
    ) => setEmail(e.target.value) } />
    -
    ์ „ํ™”๋ฒˆํ˜ธ
    +
    {t('account.phoneNumber')}
    void; @@ -31,17 +32,19 @@ export const CashReceiptHandWrittenIssuanceStep2 = ({ setServiceCharge, onClickToVatCalculate }: CashReceiptHandWrittenIssuanceStep2Props) => { + const { t } = useTranslation(); + useSetOnBack(() => { setProcessStep(ProcessStep.One); }); - + return ( <> -

    ๋ฐœํ–‰ ๊ธˆ์•ก ์ž…๋ ฅ

    +

    {t('transaction.handWrittenIssuance.step2Title')}

    -
    ๋ฐœํ–‰๊ธˆ์•ก
    +
    {t('transaction.handWrittenIssuance.issueAmount')}
    VAT์ž๋™๊ณ„์‚ฐ + >{t('transaction.handWrittenIssuance.vatAutoCalc')}
    -
    ๊ณต๊ธ‰๊ฐ€์•ก
    +
    {t('transaction.fields.supplyAmount')}
    -
    VAT
    +
    {t('transaction.fields.vat')}
    -
    ๋ฉด์„ธ๊ธˆ์•ก
    +
    {t('transaction.fields.taxFreeAmount')}
    -
    ๋ด‰์‚ฌ๋ฃŒ
    +
    {t('transaction.fields.serviceAmount')}
    - ๋ฐœํ–‰๊ธˆ์•ก์€ ๊ณต๊ธ‰๊ฐ€์•ก VAT,๋ฉด์„ธ๊ธˆ์•ก, ๋ด‰์‚ฌ๋ฃŒ์˜ ์ดํ•ฉ๊ณผ ๊ฐ™์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. + {t('transaction.handWrittenIssuance.errorMessage')}
    diff --git a/src/entities/transaction/ui/cash-receipt-list.tsx b/src/entities/transaction/ui/cash-receipt-list.tsx index 785212f..1b5007c 100644 --- a/src/entities/transaction/ui/cash-receipt-list.tsx +++ b/src/entities/transaction/ui/cash-receipt-list.tsx @@ -2,12 +2,14 @@ import { PATHS } from '@/shared/constants/paths'; import { useNavigate } from '@/shared/lib/hooks/use-navigate'; import { CashReceiptListProps } from '../model/types'; import { ListDateGroup } from './list-date-group'; +import { useTranslation } from 'react-i18next'; -export const CashReceiptList = ({ +export const CashReceiptList = ({ transactionCategory, - listItems + listItems }: CashReceiptListProps) => { const { navigate } = useNavigate(); + const { t } = useTranslation(); const getListDateGroup = () => { let rs = []; @@ -62,10 +64,10 @@ export const CashReceiptList = ({ { getListDateGroup() }
    - + onClick={ () => onClickToNavigate() } + >{ t('transaction.list.manualIssuance') }
    ); diff --git a/src/entities/transaction/ui/cash-receit-purpose-update-bottom-sheet.tsx b/src/entities/transaction/ui/cash-receit-purpose-update-bottom-sheet.tsx index 19cf6f3..3bc0b04 100644 --- a/src/entities/transaction/ui/cash-receit-purpose-update-bottom-sheet.tsx +++ b/src/entities/transaction/ui/cash-receit-purpose-update-bottom-sheet.tsx @@ -1,6 +1,7 @@ import { BottomSheetMotionDuration, BottomSheetMotionVaiants } from '@/entities/common/model/constant'; import { IMAGE_ROOT } from '@/shared/constants/common'; import { motion } from 'framer-motion'; +import { useTranslation } from 'react-i18next'; export interface CashReceitPurposeUpdateBottomSheetProps { bottomSheetOn: boolean; @@ -13,20 +14,21 @@ export const CashReceitPurposeUpdateBottomSheet = ({ setBottomSheetOn, callPurposeUpdate }: CashReceitPurposeUpdateBottomSheetProps) => { - + const { t } = useTranslation(); + const onClickToClose = () => { setBottomSheetOn(false); }; const onCliickToPurposeUpdate = () => { callPurposeUpdate(); }; - + return ( <> { (bottomSheetOn) &&
    } -
    -

    ํ˜„๊ธˆ์˜์ˆ˜์ฆ ์šฉ๋„ ๋ณ€๊ฒฝ ์•ˆ๋‚ด

    +

    { t('transaction.bottomSheet.cashReceiptPurposeUpdate.title') }

    @@ -51,10 +53,10 @@ export const CashReceitPurposeUpdateBottomSheet = ({
    -

    ํ˜„๊ธˆ์˜์ˆ˜์ฆ์˜ ์šฉ๋„ ๋ณ€๊ฒฝ ์‹œ ๊ธฐ์กด ๋ฐœ๊ธ‰ ๋‚ด์—ญ์ด ์ทจ์†Œ๋˜๋ฉฐ, ์„ ํƒํ•œ ์šฉ๋„์— ๋งž๊ฒŒ ์ƒˆ๋กœ ๋ฐœ๊ธ‰๋ฉ๋‹ˆ๋‹ค.

    +

    { t('transaction.bottomSheet.cashReceiptPurposeUpdate.description') }

      -
    • ์ง€์ถœ์ฆ๋น™์šฉ โ†’ ์†Œ๋“๊ณต์ œ์šฉ
    • -
    • ์†Œ๋“๊ณต์ œ์šฉ โ†’ ์ง€์ถœ์ฆ๋น™์šฉ
    • +
    • { t('transaction.bottomSheet.cashReceiptPurposeUpdate.expenseToIncome') }
    • +
    • { t('transaction.bottomSheet.cashReceiptPurposeUpdate.incomeToExpense') }
    @@ -64,7 +66,7 @@ export const CashReceitPurposeUpdateBottomSheet = ({ className="btn-50 btn-blue flex-1" type="button" onClick={ () => onCliickToPurposeUpdate() } - >์‹ ์ฒญ + >{ t('transaction.submit') }
    diff --git a/src/entities/transaction/ui/escrow-mail-resend-bottom-sheet.tsx b/src/entities/transaction/ui/escrow-mail-resend-bottom-sheet.tsx index 380cde3..8a98b18 100644 --- a/src/entities/transaction/ui/escrow-mail-resend-bottom-sheet.tsx +++ b/src/entities/transaction/ui/escrow-mail-resend-bottom-sheet.tsx @@ -1,5 +1,6 @@ import { IMAGE_ROOT } from '@/shared/constants/common'; import { motion } from 'framer-motion'; +import { useTranslation } from 'react-i18next'; export interface EscrowMailResendBottomSheetProps { setBottomSheetOn: (bottomSheetOn: boolean) => void; @@ -12,6 +13,7 @@ export const EscrowMailResendBottomSheet = ({ bottomSheetOn, callMailResend }: EscrowMailResendBottomSheetProps) => { + const { t } = useTranslation(); const onClickToClose = () => { setBottomSheetOn(false); @@ -30,7 +32,7 @@ export const EscrowMailResendBottomSheet = ({ { (bottomSheetOn) &&
    } -
    -

    ์ด๋ฉ”์ผ ์ฃผ์†Œ๋ฅผ ์„ ํƒํ•˜์„ธ์š”

    +

    { t('transaction.bottomSheet.escrowMailResend.title') }

    @@ -60,24 +62,24 @@ export const EscrowMailResendBottomSheet = ({
    ๋ฉ”์ผ
    - ๋ฉ”์ผ๋กœ ๋ฐ›๊ธฐ + { t('transaction.bottomSheet.escrowMailResend.mailLabel') }
    - +
    - +
    -

    ๋“ฑ๋ก๋œ ๋ฉ”์ผ ์ •๋ณด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
    ์ด๋ฉ”์ผ ์ธ์ฆ์ •๋ณด๋ฅผ ์‚ฌ์šฉ์ž๊ด€๋ฆฌ ๋ฉ”๋‰ด์—์„œ ์ถ”๊ฐ€ ํ›„ ์‹ ์ฒญํ•˜์„ธ์š”.

    +

    { t('transaction.bottomSheet.escrowMailResend.errorNoEmail') }

    @@ -87,7 +89,7 @@ export const EscrowMailResendBottomSheet = ({ className="btn-50 btn-blue flex-1" type="button" onClick={ () => onClickToMailResend() } - >์‹ ์ฒญ + >{ t('transaction.submit') }
    diff --git a/src/entities/transaction/ui/list-item.tsx b/src/entities/transaction/ui/list-item.tsx index c1f8964..1211681 100644 --- a/src/entities/transaction/ui/list-item.tsx +++ b/src/entities/transaction/ui/list-item.tsx @@ -5,6 +5,7 @@ import { ListItemProps, TransactionCategory } from '../model/types'; import moment from 'moment'; import { useStore } from '@/shared/model/store'; import { AllTracsactionStatusCode } from '../model/contant'; +import { useTranslation } from 'react-i18next'; export const ListItem = ({ transactionCategory, @@ -12,12 +13,13 @@ export const ListItem = ({ installmentMonth, serviceName, serviceCode, serviceDetailName, goodsAmount, amount, customerName, issueNumber, approvalNumber, - paymentMethod, processResult, transactionType, + paymentMethod, processResult, transactionType, transactionDateTime, transactionAmount, - deliveryStatus, settlementStatus, + deliveryStatus, settlementStatus, cancelStatus, billKey, orderNumber }: ListItemProps) => { const { navigate } = useNavigate(); + const { t } = useTranslation(); const getItemClass = () => { let rs = ''; if(statusCode === '0'){ @@ -78,7 +80,7 @@ export const ListItem = ({ }); } else{ - alert('pageType ์ด ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.'); + alert(t('common.error')); } }; @@ -163,7 +165,7 @@ export const ListItem = ({ (!!installmentMonth && parseInt(installmentMonth) > 1) && <> | - { installmentMonth }๊ฐœ์›” ํ• ๋ถ€ + { t('transaction.fields.installmentMonthly', { count: installmentMonth }) } }
    @@ -196,7 +198,7 @@ export const ListItem = ({ (!!installmentMonth && parseInt(installmentMonth) > 1) && <> | - { installmentMonth }๊ฐœ์›” ํ• ๋ถ€ + { t('transaction.fields.installmentMonthly', { count: installmentMonth }) } }
    @@ -231,11 +233,11 @@ export const ListItem = ({
    + suffix={ t('home.currencyWon') } + >
    diff --git a/src/entities/transaction/ui/section/all-transaction-cancel-section-bank-group.tsx b/src/entities/transaction/ui/section/all-transaction-cancel-section-bank-group.tsx index bb65fe8..cf1e5c6 100644 --- a/src/entities/transaction/ui/section/all-transaction-cancel-section-bank-group.tsx +++ b/src/entities/transaction/ui/section/all-transaction-cancel-section-bank-group.tsx @@ -1,3 +1,4 @@ +import { useTranslation } from 'react-i18next'; import { useStore } from "@/shared/model/store"; import { ChangeEvent, useState } from "react"; @@ -17,6 +18,7 @@ export const AllTransactionCancelSectionBankGroup = ({ accountHolder, setAccountHolder }: AllTransactionCancelSectionBankGroupProps ) => { + const { t } = useTranslation(); let bankList = useStore.getState().CommonStore.virtualBankList; bankList = bankList.filter((value, index) => value.code1 !== '****'); @@ -37,14 +39,14 @@ export const AllTransactionCancelSectionBankGroup = ({ return ( <>
    - +
    - ) => onChangeNewAccountNo(e.target.value) } /> @@ -66,11 +68,11 @@ export const AllTransactionCancelSectionBankGroup = ({
    - +
    - ) => onChangeNewAccountHolder(e.target.value) } /> @@ -78,7 +80,7 @@ export const AllTransactionCancelSectionBankGroup = ({
    -

    ํ™˜๋ถˆ์€ ์ž…๋ ฅํ•œ ๊ณ„์ขŒ์ •๋ณด๋กœ ๋ณ„๋„ ํ™•์ธ ์ ˆ์ฐจ์—†์ด ์ง€๊ธ‰๋ฉ๋‹ˆ๋‹ค.
    ์ž…๋ ฅ ์ •๋ณด๋ฅผ ํ•œ๋ฒˆ ๋” ํ™•์ธํ•ด ์ฃผ์„ธ์š”.

    +

    {t('transaction.cancel.bankGroup.notice')}

    ); diff --git a/src/entities/transaction/ui/section/all-transaction-cancel-section-password-group.tsx b/src/entities/transaction/ui/section/all-transaction-cancel-section-password-group.tsx index f8c39dd..ff68d4a 100644 --- a/src/entities/transaction/ui/section/all-transaction-cancel-section-password-group.tsx +++ b/src/entities/transaction/ui/section/all-transaction-cancel-section-password-group.tsx @@ -1,3 +1,4 @@ +import { useTranslation } from 'react-i18next'; import { ChangeEvent, useState } from "react"; export interface AllTransactionCancelSectionPasswordGroupProps { @@ -11,6 +12,7 @@ export const AllTransactionCancelSectionPasswordGroup = ({ setCancelPassword, requestSuccess }: AllTransactionCancelSectionPasswordGroupProps) => { + const { t } = useTranslation(); const [newCancelPassword, setNewCancelPassword] = useState(cancelPassword); @@ -21,18 +23,18 @@ export const AllTransactionCancelSectionPasswordGroup = ({ return ( <>
    - +
    - ) => onChangeNewCancelPassword(e.target.value) } />
    { !requestSuccess && -
    ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ถˆ์ผ์น˜
    +
    {t('transaction.cancel.passwordGroup.passwordMismatch')}
    } ); diff --git a/src/entities/transaction/ui/section/amount-info-section.tsx b/src/entities/transaction/ui/section/amount-info-section.tsx index d762e57..6951e3d 100644 --- a/src/entities/transaction/ui/section/amount-info-section.tsx +++ b/src/entities/transaction/ui/section/amount-info-section.tsx @@ -1,4 +1,5 @@ import moment from 'moment'; +import { useTranslation } from 'react-i18next'; import { NumericFormat } from 'react-number-format'; import { SectionTitleArrow } from '@/entities/common/ui/section-title-arrow'; import { useDownloadConfirmationMutation } from '../../api/use-download-confirmation-mutation'; @@ -7,7 +8,7 @@ import { SlideDown } from 'react-slidedown'; import 'react-slidedown/lib/slidedown.css'; export const AmountInfoSection = ({ - transactionCategory, + transactionCategory, amountInfo, isOpen, tid, @@ -15,23 +16,24 @@ export const AmountInfoSection = ({ onClickToOpenInfo, canDownloadReceipt }: InfoSectionProps) => { + const { t } = useTranslation(); const { mutateAsync: downloadConfirmation } = useDownloadConfirmationMutation(); let newAmountInfo: Record | undefined = amountInfo; const subItems: Record> = { - mid: {name: 'MID', type: 'string'}, - transactionRequestAmount: {name: '๊ฑฐ๋ž˜์š”์ฒญ๊ธˆ์•ก', type: 'number'}, - transactionAmount: {name: '๊ฑฐ๋ž˜๊ธˆ์•ก', type: 'number'}, - pointAmount: {name: 'ํฌ์ธํŠธ๊ธˆ์•ก', type: 'number'}, - couponAmount: {name: '์ฟ ํฐ๊ธˆ์•ก', type: 'number'}, - escrowFee: {name: '์—์Šคํฌ๋กœ์ˆ˜์ˆ˜๋ฃŒ', type: 'number'}, - kakaoMoneyAmount: {name: '์นด์นด์˜ค๋จธ๋‹ˆ', type: 'number'}, - kakaoPointAmount: {name: '์นด์นด์˜คํฌ์ธํŠธ', type: 'number'}, - kakaoDiscountAmount: {name: '์นด์นด์˜ค ์ฆ‰์‹œํ• ์ธ', type: 'number'}, - naverPointAmount: {name: '๋„ค์ด๋ฒ„ ํฌ์ธํŠธ', type: 'number'}, - tossMoneyAmount: {name: 'ํ† ์Šค๋จธ๋‹ˆ', type: 'number'}, - tossDiscountAmount: {name: 'ํ† ์Šคํ• ์ธ', type: 'number'}, - paycoPointAmount: {name: 'ํŽ˜์ด์ฝ”ํฌ์ธํŠธ', type: 'number'}, - paycoCouponAmount: {name: 'ํŽ˜์ด์ฝ”์ฟ ํฐ', type: 'number'}, + mid: {name: t('transaction.fields.mid'), type: 'string'}, + transactionRequestAmount: {name: t('transaction.fields.transactionRequestAmount'), type: 'number'}, + transactionAmount: {name: t('transaction.fields.transactionAmount'), type: 'number'}, + pointAmount: {name: t('transaction.fields.pointAmount'), type: 'number'}, + couponAmount: {name: t('transaction.fields.couponAmount'), type: 'number'}, + escrowFee: {name: t('transaction.fields.escrowFee'), type: 'number'}, + kakaoMoneyAmount: {name: t('transaction.fields.kakaoMoneyAmount'), type: 'number'}, + kakaoPointAmount: {name: t('transaction.fields.kakaoPointAmount'), type: 'number'}, + kakaoDiscountAmount: {name: t('transaction.fields.kakaoDiscountAmount'), type: 'number'}, + naverPointAmount: {name: t('transaction.fields.naverPointAmount'), type: 'number'}, + tossMoneyAmount: {name: t('transaction.fields.tossMoneyAmount'), type: 'number'}, + tossDiscountAmount: {name: t('transaction.fields.tossDiscountAmount'), type: 'number'}, + paycoPointAmount: {name: t('transaction.fields.paycoPointAmount'), type: 'number'}, + paycoCouponAmount: {name: t('transaction.fields.paycoCouponAmount'), type: 'number'}, }; const openSubItems: Record> = { @@ -134,13 +136,14 @@ export const AmountInfoSection = ({ let k = openSubItems[serviceCode][i]; if(!!k){ let name = subItems[k]?.name; - + + if(serviceCode === '01'){ if(k === 'transactionAmount'){ - name = '์‹ ์šฉ์นด๋“œ๊ธˆ์•ก' + name = t('transaction.fields.cardAmount') } if(k === 'transactionRequestAmount'){ - name = '์Šน์ธ์š”์ฒญ๊ธˆ์•ก'; + name = t('transaction.fields.approvalRequestAmount'); } } @@ -223,12 +226,12 @@ export const AmountInfoSection = ({ } ์›
    -
    @@ -239,43 +242,43 @@ export const AmountInfoSection = ({ { (transactionCategory === TransactionCategory.AllTransaction) && subLi() } - { (transactionCategory === TransactionCategory.CashReceipt) && + { (transactionCategory === TransactionCategory.CashReceipt) && <>
  • - ยท  ๊ณต๊ธ‰๊ฐ€์•ก + ยท  {t('transaction.fields.supplyAmount')}
  • - ยท  VAT + ยท  {t('transaction.fields.vat')}
  • - ยท  ๋ด‰์‚ฌ๋ฃŒ + ยท  {t('transaction.fields.serviceAmount')}
  • - ยท  ๋ฉด์„ธ๊ธˆ์•ก + ยท  {t('transaction.fields.taxFreeAmount')} @@ -283,47 +286,47 @@ export const AmountInfoSection = ({
  • } - { (transactionCategory === TransactionCategory.Escrow) && + { (transactionCategory === TransactionCategory.Escrow) && <> { (serviceCode === '02' || serviceCode === '03') &&
  • - ยท  ๊ฑฐ๋ž˜๊ธˆ์•ก + ยท  {t('transaction.fields.transactionAmount')}
  • } - { (serviceCode === '01') && + { (serviceCode === '01') && <>
  • - ยท  ์‹ ์šฉ์นด๋“œ๊ธˆ์•ก + ยท  {t('transaction.fields.cardAmount')}
  • - ยท  ํฌ์ธํŠธ๊ธˆ์•ก + ยท  {t('transaction.fields.pointAmount')}
  • - ยท  ์ฟ ํฐ๊ธˆ์•ก + ยท  {t('transaction.fields.couponAmount')} @@ -333,10 +336,10 @@ export const AmountInfoSection = ({ } { (serviceCode === '01' || serviceCode === '02') &&
  • - ยท  ์—์Šคํฌ๋กœ์ˆ˜์ˆ˜๋ฃŒ + ยท  {t('transaction.fields.escrowFee')} @@ -348,30 +351,30 @@ export const AmountInfoSection = ({ { (amountInfo?.simplePaymentServiceCode === 'E016') && <>
  • - ยท  ์นด์นด์˜ค๋จธ๋‹ˆ + ยท  {t('transaction.fields.kakaoMoneyAmount')}
  • - ยท  ์นด์นด์˜คํฌ์ธํŠธ + ยท  {t('transaction.fields.kakaoPointAmount')}
  • - ยท  ์นด์นด์˜ค์ฆ‰์‹œํ• ์ธ + ยท  {t('transaction.fields.kakaoDiscountAmount')} @@ -381,10 +384,10 @@ export const AmountInfoSection = ({ } { (amountInfo?.simplePaymentServiceCode === 'E020') &&
  • - ยท  ๋„ค์ด๋ฒ„ํฌ์ธํŠธ + ยท  {t('transaction.fields.naverPointAmount')} @@ -394,20 +397,20 @@ export const AmountInfoSection = ({ { (amountInfo?.simplePaymentServiceCode === 'E025') && <>
  • - ยท  ํ† ์Šค๋จธ๋‹ˆ + ยท  {t('transaction.fields.tossMoneyAmount')}
  • - ยท  ํ† ์Šคํ• ์ธ + ยท  {t('transaction.fields.tossDiscountAmount')} @@ -418,20 +421,20 @@ export const AmountInfoSection = ({ { (amountInfo?.simplePaymentServiceCode === 'E015') && <>
  • - ยท  ํŽ˜์ด์ฝ”ํฌ์ธํŠธ + ยท  {t('transaction.fields.paycoPointAmount')}
  • - ยท  ํŽ˜์ด์ฝ”์ฟ ํฐ + ยท  {t('transaction.fields.paycoCouponAmount')} @@ -460,13 +463,13 @@ export const AmountInfoSection = ({ }
    { - (transactionCategory === TransactionCategory.CashReceipt) && + (transactionCategory === TransactionCategory.CashReceipt) && !!canDownloadReceipt && - + >{t('transaction.fields.transactionConfirmation')} }
diff --git a/src/entities/transaction/ui/section/billing-info-section.tsx b/src/entities/transaction/ui/section/billing-info-section.tsx index 75d6dd2..ba30094 100644 --- a/src/entities/transaction/ui/section/billing-info-section.tsx +++ b/src/entities/transaction/ui/section/billing-info-section.tsx @@ -1,32 +1,34 @@ import moment from 'moment'; import { InfoSectionProps } from '../../model/types'; +import { useTranslation } from 'react-i18next'; export const BillingInfoSection = ({ billingInfo, }: InfoSectionProps) => { + const { t } = useTranslation(); const getInstallmentMonth = () => { let rs = []; if((!!billingInfo?.installmentMonth && parseInt(billingInfo?.installmentMonth) > 1)){ rs.push( -
  • - ํ• ๋ถ€๊ฐœ์›” - { billingInfo?.installmentMonth }๊ฐœ์›” ํ• ๋ถ€ -
  • + { t('transaction.fields.installmentMonth') } + { t('transaction.fields.installmentMonthly', { count: billingInfo?.installmentMonth }) } + ); } else{ rs.push( -
  • - ํ• ๋ถ€๊ฐœ์›” - ์ผ์‹œ๋ถˆ -
  • + { t('transaction.fields.installmentMonth') } + { t('transaction.fields.lumpSum') } + ); } return rs; @@ -34,43 +36,43 @@ export const BillingInfoSection = ({ return ( <>
    -
    ์ค‘์š” ์ •๋ณด
    +
    { t('transaction.sections.importantInfo') }
    • - ๋นŒํ‚ค + { t('transaction.fields.billKey') } { billingInfo?.billKey }
    • - TID + { t('transaction.fields.tid') } { billingInfo?.tid }
    • - ์ฃผ๋ถ„๋ฒˆํ˜ธ + { t('transaction.fields.orderNumber') } { billingInfo?.orderNumber }
    • - ์Šน์ธ๋ฒˆํ˜ธ + { t('transaction.fields.approvalNumber') } { billingInfo?.approvalNumber }
    • - ์Šน์ธ์ผ์ž + { t('transaction.fields.approvalDate') } { moment(billingInfo?.approvalDate).format('YYYY.MM.DD') }
    • - ์š”์ฒญ์ƒํƒœ + { t('transaction.fields.requestStatus') } { billingInfo?.requestStatus }
    • - ์ฒ˜๋ฆฌ๊ฒฐ๊ณผ + { t('transaction.fields.processResult') } { billingInfo?.processResult }
    • { getInstallmentMonth() }
    • - ์ƒํ’ˆ๋ช… + { t('transaction.fields.productName') } { billingInfo?.productName }
    • - ๊ตฌ๋งค์ž + { t('transaction.fields.buyer') } { billingInfo?.buyerName }
    diff --git a/src/entities/transaction/ui/section/detail-info-section.tsx b/src/entities/transaction/ui/section/detail-info-section.tsx index 5cde6ab..dd6f7c5 100644 --- a/src/entities/transaction/ui/section/detail-info-section.tsx +++ b/src/entities/transaction/ui/section/detail-info-section.tsx @@ -1,4 +1,5 @@ import moment from 'moment'; +import { useTranslation } from 'react-i18next'; import { SectionTitleArrow } from '@/entities/common/ui/section-title-arrow'; import { InfoSectionKeys, InfoSectionProps } from '../../model/types'; import { SlideDown } from 'react-slidedown'; @@ -10,6 +11,7 @@ export const DetailInfoSection = ({ isOpen, onClickToOpenInfo }: InfoSectionProps) => { + const { t } = useTranslation(); const onClickToSetOpenInfo = () => { if(!!onClickToOpenInfo){ @@ -20,49 +22,49 @@ export const DetailInfoSection = ({ return ( <>
    -
    onClickToSetOpenInfo() } > - ์ƒ์„ธ ์ •๋ณด + {t('transaction.sections.detailInfo')}
    { !!isOpen &&
    • - ์ทจ์†Œ์ผ์ž + {t('transaction.fields.cancelDate')} { detailInfo?.cancelDate? moment(detailInfo?.cancelDate).format('YYYY.MM.DD'): '' }
    • - ์ทจ์†Œ์Šน์ธ๋ฒˆํ˜ธ + {t('transaction.fields.cancelApprovalNumber')} { detailInfo?.cancelApprovalNumber }
    • - ํ˜„๊ธˆ์˜์ˆ˜์ฆ + {t('transaction.fields.receiptInfo')} { detailInfo?.receiptInfo }
    • - TID + {t('transaction.fields.tid')} { detailInfo?.tid }
    • - ๊ฑฐ๋ž˜ID + {t('transaction.fields.transactionId')} { detailInfo?.merchantTid }
    • - ์„œ๋ธŒ๋ชฐ๋ช… + {t('transaction.fields.subMallName')} { detailInfo?.subMallName }
    • - ์„œ๋ธŒ๋ชฐ ์‚ฌ์—…์ž ๋ฒˆํ˜ธ + {t('transaction.fields.subMallBusinessNumber')} { detailInfo?.subMallBusinessNumber }
    • - ๋ฐœํ–‰๊ฒฝ๋กœ + {t('transaction.fields.issueChannel')} { detailInfo?.issueChannel }
    • - ์‹คํŒจ์‚ฌ์œ  + {t('transaction.fields.failureReason')} { detailInfo?.failureReason }
    diff --git a/src/entities/transaction/ui/section/escrow-info-section.tsx b/src/entities/transaction/ui/section/escrow-info-section.tsx index 2a0060c..3c90e88 100644 --- a/src/entities/transaction/ui/section/escrow-info-section.tsx +++ b/src/entities/transaction/ui/section/escrow-info-section.tsx @@ -1,4 +1,5 @@ import moment from 'moment'; +import { useTranslation } from 'react-i18next'; import { SectionTitleArrow } from '@/entities/common/ui/section-title-arrow'; import { InfoSectionKeys, InfoSectionProps } from '../../model/types'; import { SlideDown } from 'react-slidedown'; @@ -9,6 +10,7 @@ export const EscrowInfoSection = ({ isOpen, onClickToOpenInfo }: InfoSectionProps) => { + const { t } = useTranslation(); const onClickToSetOpenInfo = () => { if(!!onClickToOpenInfo){ @@ -19,53 +21,53 @@ export const EscrowInfoSection = ({ return ( <>
    -
    onClickToSetOpenInfo() } > - ์—์Šคํฌ๋กœ ์ •๋ณด + {t('transaction.sections.escrowInfo')}
    { !!isOpen &&
    • - ยท  ๋ฐฐ์†ก์ƒํƒœ + ยท  {t('transaction.fields.deliveryStatus')} { escrowInfo?.deliveryStatus }
    • - ยท  ๋ฐฐ์†ก๋“ฑ๋ก + ยท  {t('transaction.fields.deliveryRegistration')} { escrowInfo?.deliveryRegistrationDate? moment(escrowInfo?.deliveryRegistrationDate).format('YYYY.MM.DD'): '' }
    • - ยท  ๋ฐฐ์†ก์™„๋ฃŒ + ยท  {t('transaction.fields.deliveryComplete')} { escrowInfo?.deliveryCompleteDate? moment(escrowInfo?.deliveryCompleteDate).format('YYYY.MM.DD'): '' }
    • - ยท  ๊ตฌ๋งคํ™•์ธ + ยท  {t('transaction.fields.purchaseConfirm')} { escrowInfo?.purchaseConfirmDate? moment(escrowInfo?.purchaseConfirmDate).format('YYYY.MM.DD'): '' }
    • - ยท  ๊ตฌ๋งค๊ฑฐ์ ˆ + ยท  {t('transaction.fields.purchaseReject')} { escrowInfo?.purchaseRejectReason }
    • - ยท  ๊ฑฐ์ ˆ์‚ฌ์œ  + ยท  {t('transaction.fields.rejectReason')} { escrowInfo?.rejectReason }
    • - ยท  ์—์Šคํฌ๋กœ์ธ์ฆ๋ฒˆํ˜ธ + ยท  {t('transaction.fields.escrowCertNumber')} { escrowInfo?.escrowCertNumber }
    • - ยท  ํƒ๋ฐฐ์‚ฌ + ยท  {t('transaction.fields.deliveryCompany')} { escrowInfo?.deliveryCompany }
    • - ยท  ์šด์†ก์žฅ๋ฒˆํ˜ธ + ยท  {t('transaction.fields.trackingNumber')} { escrowInfo?.trackingNumber }
    • - ยท  ๋ฐฐ์†ก์ฃผ์†Œ + ยท  {t('transaction.fields.deliveryAddress')} { escrowInfo?.deliveryAddress }
    diff --git a/src/entities/transaction/ui/section/important-info-section.tsx b/src/entities/transaction/ui/section/important-info-section.tsx index c694f31..2c606d2 100644 --- a/src/entities/transaction/ui/section/important-info-section.tsx +++ b/src/entities/transaction/ui/section/important-info-section.tsx @@ -1,4 +1,5 @@ import moment from 'moment'; +import { useTranslation } from 'react-i18next'; import { NumericFormat } from 'react-number-format'; import { InfoSectionProps, TransactionCategory } from '../../model/types'; import { useStore } from '@/shared/model/store'; @@ -9,6 +10,7 @@ export const ImportantInfoSection = ({ importantInfo, serviceCode }: InfoSectionProps) => { + const { t } = useTranslation(); let serviceCodes = useStore.getState().CommonStore.serviceCodes; let serviceName = ''; let statusName = ''; @@ -60,15 +62,15 @@ export const ImportantInfoSection = ({ } const subItems: Record> = { - moid: {name: '์ฃผ๋ฌธ๋ฒˆํ˜ธ', type: 'string'}, - tid: {name: 'TID', type: 'string'}, - statusName: {name: '๊ฑฐ๋ž˜์ƒํƒœ', type: 'string'}, - serviceName: {name: '๊ฑฐ๋ž˜์ˆ˜๋‹จ', type: 'string'}, - approvalDate: {name: '์Šน์ธ์ผ', type: 'date'}, - transactionDate: {name: '๊ฑฐ๋ž˜์ผ', type: 'date'}, - requestDate: {name: '์š”์ฒญ์ผ', type: 'date'}, - cancelDate: {name: '์ทจ์†Œ์ผ', type: 'date'}, - goodsName: {name: '์ƒํ’ˆ๋ช…', type: 'string'} + moid: {name: t('transaction.fields.orderNumber'), type: 'string'}, + tid: {name: t('transaction.fields.tid'), type: 'string'}, + statusName: {name: t('transaction.fields.transactionStatus'), type: 'string'}, + serviceName: {name: t('transaction.fields.transactionMethod'), type: 'string'}, + approvalDate: {name: t('transaction.fields.approvalDay'), type: 'date'}, + transactionDate: {name: t('filter.date'), type: 'date'}, + requestDate: {name: t('filter.date'), type: 'date'}, + cancelDate: {name: t('transaction.fields.cancelDate'), type: 'date'}, + goodsName: {name: t('transaction.fields.productName'), type: 'string'} }; const openSubItems: Record> = { @@ -146,54 +148,54 @@ export const ImportantInfoSection = ({ return ( <>
    -
    ์ค‘์š” ์ •๋ณด
    +
    {t('transaction.sections.importantInfo')}
      - { (transactionCategory === TransactionCategory.AllTransaction) && + { (transactionCategory === TransactionCategory.AllTransaction) && subLi() } - { - (transactionCategory === TransactionCategory.Escrow) && + { + (transactionCategory === TransactionCategory.Escrow) && <>
    • - ์ฃผ๋ฌธ๋ฒˆํ˜ธ + {t('transaction.fields.orderNumber')} { importantInfo?.orderNumber }
    • - TID + {t('transaction.fields.tid')} { importantInfo?.tid }
    • - ๊ฑฐ๋ž˜์ƒํƒœ + {t('transaction.fields.transactionStatus')} { importantInfo?.transactionStatus }
    • - ๊ฑฐ๋ž˜์ˆ˜๋‹จ + {t('transaction.fields.transactionMethod')} { importantInfo?.paymentMethod }
    • { serviceCode === '01' &&
    • - ์Šน์ธ์ผ + {t('transaction.fields.approvalDay')} { importantInfo?.approvalDate? moment(importantInfo?.approvalDate).format('YYYY-MM-DD'): '' }
    • } { serviceCode === '02' &&
    • - ๊ฑฐ๋ž˜์ผ + {t('filter.date')} { importantInfo?.approvalDate? moment(importantInfo?.approvalDate).format('YYYY-MM-DD'): '' }
    • } - { serviceCode === '03' && + { serviceCode === '03' &&
    • - ์š”์ฒญ์ผ + {t('filter.date')} { importantInfo?.approvalDate? moment(importantInfo?.approvalDate).format('YYYY-MM-DD'): '' }
    • }
    • - ์ทจ์†Œ์ผ + {t('transaction.fields.cancelDate')} { importantInfo?.cancelDate? moment(importantInfo?.cancelDate).format('YYYY-MM-DD'): '' }
    • - ์ƒํ’ˆ๋ช… + {t('transaction.fields.productName')} { importantInfo?.productName }
    • diff --git a/src/entities/transaction/ui/section/issue-info-section.tsx b/src/entities/transaction/ui/section/issue-info-section.tsx index b711e58..cd4031e 100644 --- a/src/entities/transaction/ui/section/issue-info-section.tsx +++ b/src/entities/transaction/ui/section/issue-info-section.tsx @@ -1,3 +1,4 @@ +import { useTranslation } from 'react-i18next'; import { InfoSectionProps } from '../../model/types'; import moment from 'moment'; import { useEffect, useState } from 'react'; @@ -7,6 +8,7 @@ export const IssueInfoSection = ({ issueInfo, purposeType, }: InfoSectionProps) => { + const { t } = useTranslation(); const [issueDateTime, setIssueDateTime] = useState(''); useEffect(() => { @@ -22,38 +24,38 @@ export const IssueInfoSection = ({ return ( <>
      -
      ๋ฐœ๊ธ‰ ์ •๋ณด
      +
      {t('transaction.sections.issueInfo')}
      • - ์Šน์ธ๋ฒˆํ˜ธ + {t('transaction.fields.approvalNumber')} { issueInfo?.approvalNumber }
      • - ๋ฐœํ–‰๋ฒˆํ˜ธ + {t('transaction.fields.issueNumber')} { issueInfo?.issueNumber }
      • - ๋ฐœํ–‰์ผ์‹œ + {t('transaction.fields.issueDateTime')} { moment(issueDateTime).format('YYYY.MM.DD HH:mm:ss') }
      • - ์šฉ๋„ + {t('transaction.fields.purpose')} { issueInfo?.purpose }
      • - ๊ฒฐ์ œ์ˆ˜๋‹จ + {t('transaction.fields.paymentMethod')} { issueInfo?.paymentMethod }
      • - ์ƒํ’ˆ๋ช… + {t('transaction.fields.productName')} { issueInfo?.productName }
      • - ์ง„ํ–‰์ƒํƒœ + {t('transaction.fields.processResult')} { issueInfo?.processResult }
      • - ๊ฑฐ๋ž˜๊ตฌ๋ถ„ + {t('transaction.fields.transactionType')} { issueInfo?.transactionType }
      diff --git a/src/entities/transaction/ui/section/merchant-info-section.tsx b/src/entities/transaction/ui/section/merchant-info-section.tsx index 18f9499..74d4cb4 100644 --- a/src/entities/transaction/ui/section/merchant-info-section.tsx +++ b/src/entities/transaction/ui/section/merchant-info-section.tsx @@ -1,3 +1,4 @@ +import { useTranslation } from 'react-i18next'; import { SectionTitleArrow } from '@/entities/common/ui/section-title-arrow'; import { InfoSectionKeys, InfoSectionProps } from '../../model/types'; import { SlideDown } from 'react-slidedown'; @@ -8,6 +9,7 @@ export const MerchantInfoSection = ({ isOpen, onClickToOpenInfo }: InfoSectionProps) => { + const { t } = useTranslation(); const onClickToSetOpenInfo = () => { if(!!onClickToOpenInfo){ @@ -18,25 +20,25 @@ export const MerchantInfoSection = ({ return ( <>
      -
      onClickToSetOpenInfo() } > - ์ƒ์  ์ •๋ณด + {t('transaction.sections.merchantInfo')}
      { !!isOpen &&
      • - ยท  ์ƒํ˜ธ + ยท  {t('transaction.fields.companyName')} { merchantInfo?.companyName }
      • - ยท  GID + ยท  {t('transaction.fields.gid')} { merchantInfo?.gid }
      • - ยท  AID + ยท  {t('transaction.fields.aid')} { merchantInfo?.aid }
      diff --git a/src/entities/transaction/ui/section/part-cancel-info-section.tsx b/src/entities/transaction/ui/section/part-cancel-info-section.tsx index c3ed024..075bd7b 100644 --- a/src/entities/transaction/ui/section/part-cancel-info-section.tsx +++ b/src/entities/transaction/ui/section/part-cancel-info-section.tsx @@ -4,6 +4,7 @@ import { SectionTitleArrow } from '@/entities/common/ui/section-title-arrow'; import { InfoSectionKeys, InfoSectionProps } from '../../model/types'; import { SlideDown } from 'react-slidedown'; import 'react-slidedown/lib/slidedown.css'; +import { useTranslation } from 'react-i18next'; export const PartCancelInfoSection = ({ transactionCategory, @@ -12,13 +13,14 @@ export const PartCancelInfoSection = ({ isOpen, onClickToOpenInfo }: InfoSectionProps) => { + const { t } = useTranslation(); const subItems: Record> = { - originalTid: {name: '์›๊ฑฐ๋ž˜ TID', type: 'string'}, - originalAmount: {name: '์›๊ฑฐ๋ž˜ ๊ธˆ์•ก', type: 'number'}, - partCancelTid: {name: (serviceCode === '05')? '์žฌ์Šน์ธ TID': '๋ถ€๋ถ„์ทจ์†Œ TID', type: 'string'}, - partCancelAmount: {name: '๋ถ€๋ถ„์ทจ์†Œ ๊ธˆ์•ก', type: 'number'}, - remainingAmount: {name: (serviceCode === '05')? '์žฌ์Šน์ธ ๊ธˆ์•ก': '๋ถ€๋ถ„์ทจ์†Œ ํ›„ ์ž”์•ก', type: 'number'}, + originalTid: {name: t('transaction.fields.originalTid'), type: 'string'}, + originalAmount: {name: t('transaction.fields.originalAmount'), type: 'number'}, + partCancelTid: {name: (serviceCode === '05')? t('transaction.fields.reApprovalTid'): t('transaction.fields.partCancelTid'), type: 'string'}, + partCancelAmount: {name: t('transaction.fields.partCancelAmount'), type: 'number'}, + remainingAmount: {name: (serviceCode === '05')? t('transaction.fields.reApprovalAmount'): t('transaction.fields.remainingAmount'), type: 'number'}, }; const openSubItems: Record> = { @@ -101,11 +103,11 @@ export const PartCancelInfoSection = ({ return ( <>
      -
      onClickToSetOpenInfo() } > - ๋ถ€๋ถ„์ทจ์†Œ ์ •๋ณด + { t('transaction.sections.partCancelInfo') }
      { !!isOpen && @@ -114,7 +116,7 @@ export const PartCancelInfoSection = ({
    } - +
    ) diff --git a/src/entities/transaction/ui/section/payment-info-section.tsx b/src/entities/transaction/ui/section/payment-info-section.tsx index 0cc5c83..8bab98c 100644 --- a/src/entities/transaction/ui/section/payment-info-section.tsx +++ b/src/entities/transaction/ui/section/payment-info-section.tsx @@ -1,4 +1,5 @@ import moment from 'moment'; +import { useTranslation } from 'react-i18next'; import { SectionTitleArrow } from '@/entities/common/ui/section-title-arrow'; import { InfoSectionKeys, InfoSectionProps, TransactionCategory } from '../../model/types'; import { NumericFormat } from 'react-number-format'; @@ -12,45 +13,46 @@ export const PaymentInfoSection = ({ isOpen, onClickToOpenInfo }: InfoSectionProps) => { + const { t } = useTranslation(); const subItems: Record> = { - approvalPurchase: {name: '์Šน์ธ๋งค์ž…', type: 'string'}, - approvalRejectCount: {name: '์Šน์ธ๋ฐ˜์†ก(ํšŸ์ˆ˜)', type: 'number', addString: '๊ฑด'}, - approvalRepurchaseCount: {name: '์Šน์ธ์žฌ๋งค์ž…(ํšŸ์ˆ˜)', type: 'number', addString: '๊ฑด'}, - approvalVAN: {name: '์Šน์ธVAN', type: 'string'}, - cancelPurchase: {name: '์ทจ์†Œ๋งค์ž…', type: 'string'}, - cancelRejectCount: {name: '์ทจ์†Œ๋ฐ˜์†ก', type: 'number', addString: '๊ฑด'}, - cancelRepurchaseCount: {name: '์ทจ์†Œ์žฌ๋งค์ž…', type: 'number', addString: '๊ฑด'}, - purchaseVan: {name: '๋งค์ž…VAN', type: 'string'}, - purchaseCompany: {name: '๋งค์ž…์‚ฌ(๋ฐœ๊ธ‰์‚ฌ)', type: 'string'}, - cardNo: {name: '์นด๋“œ๋ฒˆํ˜ธ', type: 'string'}, - approvalNo: {name: '์Šน์ธ๋ฒˆํ˜ธ', type: 'string'}, - installmentMonth: {name: 'ํ• ๋ถ€๊ธฐ๊ฐ„', type: 'string', addString: '๊ฐœ์›”'}, - authentication: {name: '์ธ์ฆ', type: 'string'}, + approvalPurchase: {name: t('transaction.fields.approvalPurchase'), type: 'string'}, + approvalRejectCount: {name: t('transaction.fields.approvalRejectCount'), type: 'number', addString: '๊ฑด'}, + approvalRepurchaseCount: {name: t('transaction.fields.approvalRepurchaseCount'), type: 'number', addString: '๊ฑด'}, + approvalVAN: {name: t('transaction.fields.approvalVAN'), type: 'string'}, + cancelPurchase: {name: t('transaction.fields.cancelPurchase'), type: 'string'}, + cancelRejectCount: {name: t('transaction.fields.cancelRejectCount'), type: 'number', addString: '๊ฑด'}, + cancelRepurchaseCount: {name: t('transaction.fields.cancelRepurchaseCount'), type: 'number', addString: '๊ฑด'}, + purchaseVan: {name: t('transaction.fields.purchaseVan'), type: 'string'}, + purchaseCompany: {name: t('transaction.fields.purchaseCompany'), type: 'string'}, + cardNo: {name: t('transaction.fields.cardNo'), type: 'string'}, + approvalNo: {name: t('transaction.fields.approvalNo'), type: 'string'}, + installmentMonth: {name: t('transaction.fields.installmentPeriod'), type: 'string', addString: '๊ฐœ์›”'}, + authentication: {name: t('transaction.fields.authentication'), type: 'string'}, - joinType: {name: '์œ ํ˜•', type: 'string'}, - bankName: {name: '์€ํ–‰๋ช…', type: 'string'}, - accountNo: {name: '๊ณ„์ขŒ๋ฒˆํ˜ธ', type: 'string'}, - refundCompleteDate: {name: 'ํ™˜๋ถˆ์™„๋ฃŒ์ผ', type: 'string'}, - customerId: {name: '๊ณ ๊ฐID', type: 'string'}, - - culturelandId: {name: '์ปฌ์ฒ˜๋žœ๋“œID', type: 'string'}, + joinType: {name: t('transaction.fields.joinType'), type: 'string'}, + bankName: {name: t('transaction.fields.bankName'), type: 'string'}, + accountNo: {name: t('transaction.fields.accountNo'), type: 'string'}, + refundCompleteDate: {name: t('transaction.fields.refundCompleteDate'), type: 'string'}, + customerId: {name: t('transaction.fields.customerId'), type: 'string'}, - partner: {name: '์ œํœด์‚ฌ', type: 'string'}, - cpid: {name: 'CPID', type: 'string'}, - goodsCategory: {name: '์ƒํ’ˆ๊ตฌ๋ถ„', type: 'string'}, - cellphoneNo: {name: 'ํœด๋Œ€ํฐ๋ฒˆํ˜ธ', type: 'string'}, + culturelandId: {name: t('transaction.fields.culturelandId'), type: 'string'}, - giftCardNumber: {name: '์ƒํ’ˆ๊ถŒ๋ฒˆํ˜ธ', type: 'string'}, + partner: {name: t('transaction.fields.partner'), type: 'string'}, + cpid: {name: t('transaction.fields.cpid'), type: 'string'}, + goodsCategory: {name: t('transaction.fields.goodsCategory'), type: 'string'}, + cellphoneNo: {name: t('transaction.fields.cellphoneNo'), type: 'string'}, - depositBankName: {name: '์ž…๊ธˆ๊ธˆ์œต๊ธฐ๊ด€๋ช…', type: 'string'}, - depositorName: {name: '์ž…๊ธˆ์ž๋ช…', type: 'string'}, - depositDeadline: {name: '์ž…๊ธˆ๊ธฐํ•œ', type: 'date'}, - depositDate: {name: '์ž…๊ธˆ์ผ', type: 'date'}, - refundScheduleDate: {name: 'ํ™˜๋ถˆ์˜ˆ์ •์ผ', type: 'date'}, - refundBankName: {name: 'ํ™˜๋ถˆ์€ํ–‰๋ช…', type: 'string'}, - refundAccountNo: {name: 'ํ™˜๋ถˆ๊ณ„์ขŒ๋ฒˆํ˜ธ', type: 'string'}, - accountHolder: {name: '์˜ˆ๊ธˆ์ฃผ', type: 'string'}, + giftCardNumber: {name: t('transaction.fields.giftCardNumber'), type: 'string'}, + + depositBankName: {name: t('transaction.fields.depositBankName'), type: 'string'}, + depositorName: {name: t('transaction.fields.depositorName'), type: 'string'}, + depositDeadline: {name: t('transaction.fields.depositDeadline'), type: 'date'}, + depositDate: {name: t('transaction.fields.depositDate'), type: 'date'}, + refundScheduleDate: {name: t('transaction.fields.refundScheduleDate'), type: 'date'}, + refundBankName: {name: t('transaction.fields.refundBankName'), type: 'string'}, + refundAccountNo: {name: t('transaction.fields.refundAccountNo'), type: 'string'}, + accountHolder: {name: t('transaction.fields.accountHolder'), type: 'string'}, }; const openSubItems: Record> = { @@ -99,7 +101,7 @@ export const PaymentInfoSection = ({ { (checkValue(newPaymentInfo[k]) && subItems[k]?.type === 'string') && (k === 'installmentMonth' && newPaymentInfo[k] === '00') && - '์ผ์‹œ๋ถˆ' + t('transaction.fields.lumpSum') } { (checkValue(newPaymentInfo[k]) && subItems[k]?.type === 'string') && (k === 'installmentMonth' && newPaymentInfo[k] !== '00') && @@ -138,11 +140,11 @@ export const PaymentInfoSection = ({ return ( <>
    -
    onClickToSetOpenInfo() } > - ๊ฒฐ์ œ ์ •๋ณด + {t('transaction.sections.paymentInfo')}
    { !!isOpen && @@ -152,82 +154,82 @@ export const PaymentInfoSection = ({ } { (transactionCategory === TransactionCategory.Escrow) && <> - { (serviceCode === '01') && + { (serviceCode === '01') && <>
  • - ยท  ์Šน์ธ๋งค์ž…์ผ + ยท  {t('transaction.fields.approvalPurchaseDate')} { paymentInfo?.approvalPurchase? moment(paymentInfo?.approvalPurchase).format('YYYY-MM-DD'): '' }
  • - ยท  ์Šน์ธ๋ฐ˜์†ก(ํšŸ์ˆ˜) + ยท  {t('transaction.fields.approvalRejectCount')}
  • - ยท  ์Šน์ธ์žฌ๋งค์ž…(ํšŸ์ˆ˜) + ยท  {t('transaction.fields.approvalRepurchaseCount')}
  • - ยท  ์Šน์ธVAN + ยท  {t('transaction.fields.approvalVAN')} { paymentInfo?.approvalVAN }
  • - ยท  ์ทจ์†Œ๋งค์ž… + ยท  {t('transaction.fields.cancelPurchaseDate')} { paymentInfo?.cancelPurchase? moment(paymentInfo?.cancelPurchase).format('YYYY-MM-DD'): '' }
  • - ยท  ์ทจ์†Œ๋ฐ˜์†ก(ํšŸ์ˆ˜) + ยท  {t('transaction.fields.cancelRejectCount')}
  • - ยท  ์ทจ์†Œ์žฌ๋งค์ž…(ํšŸ์ˆ˜) + ยท  {t('transaction.fields.cancelRepurchaseCount')}
  • - ยท  ๋งค์ž…VAN + ยท  {t('transaction.fields.purchaseVan')} { paymentInfo?.purchaseVan }
  • - ยท  ๋งค์ž…์‚ฌ(๋ฐœ๊ธ‰์‚ฌ) + ยท  {t('transaction.fields.purchaseCompany')} { paymentInfo?.purchaseCompany }
  • - ยท  ์นด๋“œ๋ฒˆํ˜ธ + ยท  {t('transaction.fields.cardNo')} { paymentInfo?.cardNo }
  • - ยท  ์Šน์ธ๋ฒˆํ˜ธ + ยท  {t('transaction.fields.approvalNo')} { paymentInfo?.approvalNo }
  • - ยท  ํ• ๋ถ€๊ธฐ๊ฐ„ - { (paymentInfo?.installmentMonth === '00')? '์ผ์‹œ๋ถˆ': paymentInfo?.installmentMonth } + ยท  {t('transaction.fields.installmentPeriod')} + { (paymentInfo?.installmentMonth === '00')? t('transaction.fields.lumpSum'): paymentInfo?.installmentMonth }
  • - ยท  ์ธ์ฆ + ยท  {t('transaction.fields.authentication')} { paymentInfo?.authentication }
  • @@ -235,7 +237,7 @@ export const PaymentInfoSection = ({ { (serviceCode === '02') && <>
  • - ยท  ์œ ํ˜• + ยท  {t('transaction.fields.joinType')} { paymentInfo?.joinType }
  • @@ -243,43 +245,43 @@ export const PaymentInfoSection = ({ { (serviceCode === '02' || serviceCode === '03') && <>
  • - ยท  ์€ํ–‰๋ช… + ยท  {t('transaction.fields.bankName')} { paymentInfo?.bankName || paymentInfo?.depositBankName }
  • - ยท  ๊ณ„์ขŒ๋ฒˆํ˜ธ + ยท  {t('transaction.fields.accountNo')} { paymentInfo?.accountNo || paymentInfo?.virtualAccountNo }
  • } - { (serviceCode === '03') && + { (serviceCode === '03') && <>
  • - ยท  ์ž…๊ธˆ์ž๋ช… + ยท  {t('transaction.fields.depositorName')} { paymentInfo?.depositorName }
  • - ยท  ์ž…๊ธˆ๊ธฐํ•œ + ยท  {t('transaction.fields.depositDeadline')} { paymentInfo?.depositDeadline? moment(paymentInfo?.depositDeadline).format('YYYY-MM-DD'): '' }
  • - ยท  ์ž…๊ธˆ์ผ + ยท  {t('transaction.fields.depositDate')} { paymentInfo?.depositDate? moment(paymentInfo?.depositDate).format('YYYY-MM-DD'): '' }
  • - ยท  ํ™˜๋ถˆ์˜ˆ์ •์ผ + ยท  {t('transaction.fields.refundScheduleDate')} { paymentInfo?.refundScheduleDate? moment(paymentInfo?.refundScheduleDate).format('YYYY-MM-DD'): '' }
  • - ยท  ํ™˜๋ถˆ์€ํ–‰๋ช… + ยท  {t('transaction.fields.refundBankName')} { paymentInfo?.refundBankName }
  • - ยท  ํ™˜๋ถˆ๊ณ„์ขŒ๋ฒˆํ˜ธ + ยท  {t('transaction.fields.refundAccountNo')} { paymentInfo?.refundAccountNo }
  • - ยท  ์˜ˆ๊ธˆ์ฃผ + ยท  {t('transaction.fields.accountHolder')} { paymentInfo?.accountHolder }
  • diff --git a/src/entities/transaction/ui/section/settlement-info-section.tsx b/src/entities/transaction/ui/section/settlement-info-section.tsx index 94cfab3..8f06568 100644 --- a/src/entities/transaction/ui/section/settlement-info-section.tsx +++ b/src/entities/transaction/ui/section/settlement-info-section.tsx @@ -1,4 +1,5 @@ import moment from 'moment'; +import { useTranslation } from 'react-i18next'; import { NumericFormat } from 'react-number-format'; import { SectionTitleArrow } from '@/entities/common/ui/section-title-arrow'; import { InfoSectionKeys, InfoSectionProps, TransactionCategory } from '../../model/types'; @@ -12,12 +13,13 @@ export const SettlementInfoSection = ({ isOpen, onClickToOpenInfo }: InfoSectionProps) => { - + const { t } = useTranslation(); + const subItems: Record> = { - approvalSettlementDate: {name: '์Šน์ธ์ •์‚ฐ์ผ', type: 'date'}, - approvalSettlementAmount: {name: '์Šน์ธ์ •์‚ฐ๊ธˆ์•ก', type: 'number'}, - cancelSettlementDate: {name: '์ทจ์†Œ์ •์‚ฐ์ผ', type: 'date'}, - cancelSettlementAmount: {name: '์ทจ์†Œ์ •์‚ฐ๊ธˆ์•ก', type: 'number'}, + approvalSettlementDate: {name: t('transaction.fields.approvalSettlementDate'), type: 'date'}, + approvalSettlementAmount: {name: t('transaction.fields.approvalSettlementAmount'), type: 'number'}, + cancelSettlementDate: {name: t('transaction.fields.cancelSettlementDate'), type: 'date'}, + cancelSettlementAmount: {name: t('transaction.fields.cancelSettlementAmount'), type: 'number'}, }; const openSubItems: Record> = { @@ -100,30 +102,30 @@ export const SettlementInfoSection = ({ return ( <>
    -
    onClickToSetOpenInfo() } > - ์ •์‚ฐ ์ •๋ณด + {t('transaction.sections.settlementInfo')}
    - + { !!isOpen &&
      - { (transactionCategory === TransactionCategory.AllTransaction) && + { (transactionCategory === TransactionCategory.AllTransaction) && subLi() } - { (transactionCategory === TransactionCategory.Escrow) && + { (transactionCategory === TransactionCategory.Escrow) && <>
    • - ยท  ์Šน์ธ์ •์‚ฐ์ผ + ยท  {t('transaction.fields.approvalSettlementDate')} { settlementInfo?.approvalSettlementDate? moment(settlementInfo?.approvalSettlementDate).format('YYYY.MM.DD'): '' }
    • - ยท  ์Šน์ธ์ •์‚ฐ๊ธˆ์•ก + ยท  {t('transaction.fields.approvalSettlementAmount')}
    • - ยท  ์ทจ์†Œ์ •์‚ฐ์ผ + ยท  {t('transaction.fields.cancelSettlementDate')} { settlementInfo?.cancelSettlementDate? moment(settlementInfo?.cancelSettlementDate).format('YYYY.MM.DD'): '' }
    • - ยท  ์ทจ์†Œ์ •์‚ฐ๊ธˆ์•ก + ยท  {t('transaction.fields.cancelSettlementAmount')} { + const { t } = useTranslation(); const subItems: Record> = { - buyerName: {name: '๊ตฌ๋งค์ž๋ช…', type: 'string'}, - buyerEmail: {name: '์ด๋ฉ”์ผ', type: 'string'}, - buyerTel: {name: '์ „ํ™”๋ฒˆํ˜ธ', type: 'string'}, - cancelReason: {name: '์ทจ์†Œ์‚ฌ์œ ', type: 'string'}, - cancelRequestor: {name: '์ทจ์†Œ์š”์ฒญ์ž', type: 'string'}, - partialCancel: {name: '๋ถ€๋ถ„์ทจ์†Œ', type: 'string'}, - cashReceiptIssue: {name: 'ํ˜„๊ธˆ์˜์ˆ˜์ฆ๋ฐœํ–‰', type: 'string'}, + buyerName: {name: t('transaction.fields.buyerName'), type: 'string'}, + buyerEmail: {name: t('transaction.fields.buyerEmail'), type: 'string'}, + buyerTel: {name: t('transaction.fields.buyerTel'), type: 'string'}, + cancelReason: {name: t('transaction.fields.cancelReason'), type: 'string'}, + cancelRequestor: {name: t('transaction.fields.cancelRequestor'), type: 'string'}, + partialCancel: {name: t('transaction.fields.partialCancel'), type: 'string'}, + cashReceiptIssue: {name: t('transaction.fields.cashReceiptIssue'), type: 'string'}, }; const openSubItems: Record> = { @@ -106,47 +108,47 @@ export const TransactionInfoSection = ({ return ( <>
      -
      onClickToSetOpenInfo() } > - ๊ฑฐ๋ž˜ ์ •๋ณด + {t('transaction.sections.transactionInfo')}
      - { !!isOpen && + { !!isOpen &&
        - { (transactionCategory === TransactionCategory.AllTransaction) && + { (transactionCategory === TransactionCategory.AllTransaction) && subLi() } - { (transactionCategory === TransactionCategory.Escrow) && + { (transactionCategory === TransactionCategory.Escrow) && <>
      • - ยท  ๊ตฌ๋งค์ž๋ช… + ยท  {t('transaction.fields.buyerName')} { transactionInfo?.buyerName }
      • - ยท  ์ด๋ฉ”์ผ + ยท  {t('transaction.fields.buyerEmail')} { transactionInfo?.buyerEmail }
      • - ยท  ์ „ํ™”๋ฒˆํ˜ธ + ยท  {t('transaction.fields.buyerTel')} { transactionInfo?.buyerTel }
      • - ยท  ์ทจ์†Œ์‚ฌ์œ  + ยท  {t('transaction.fields.cancelReason')} { transactionInfo?.cancelReason }
      • - ยท  ์ทจ์†Œ์š”์ฒญ์ž + ยท  {t('transaction.fields.cancelRequestor')} { transactionInfo?.cancelRequestor }
      • - ยท  ๋ถ€๋ถ„์ทจ์†Œ + ยท  {t('transaction.fields.partialCancel')} { transactionInfo?.partialCancel }
      • { (serviceCode === '02' || serviceCode === '03') &&
      • - ยท  ํ˜„๊ธˆ์˜์ˆ˜์ฆ๋ฐœํ–‰ + ยท  {t('transaction.fields.cashReceiptIssue')} { transactionInfo?.cashReceiptIssue }
      • } diff --git a/src/locales/en.json b/src/locales/en.json index 50b27b6..1aa00a5 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -358,7 +358,214 @@ "searchOptions": "Search Options", "download": "Download", "cancelTransaction": "Cancel Transaction", - "confirmCancel": "Do you want to cancel this transaction?" + "confirmCancel": "Do you want to cancel this transaction?", + "bottomSheet": { + "escrowMailResend": { + "title": "Select Email Address", + "close": "Close", + "mailLabel": "Receive by Email", + "mail": "Mail", + "select": "Select", + "errorNoEmail": "No registered email information.\nPlease add email authentication information from the user management menu before applying." + }, + "cashReceiptPurposeUpdate": { + "title": "Cash Receipt Purpose Change Notice", + "description": "When changing the purpose of a cash receipt, the existing issuance record will be cancelled and a new one will be issued according to the selected purpose.", + "expenseProof": "Expense Proof", + "incomeDeduction": "Income Deduction", + "expenseToIncome": "Expense Proof โ†’ Income Deduction", + "incomeToExpense": "Income Deduction โ†’ Expense Proof" + } + }, + "sections": { + "importantInfo": "Important Information", + "billingInfo": "Billing Information", + "partCancelInfo": "Partial Cancel Information", + "detailInfo": "Detail Information", + "issueInfo": "Issue Information", + "escrowInfo": "Escrow Information", + "paymentInfo": "Payment Information", + "transactionInfo": "Transaction Information", + "settlementInfo": "Settlement Information", + "merchantInfo": "Merchant Information", + "amountDetail": "Amount Details" + }, + "fields": { + "billKey": "Bill Key", + "tid": "TID", + "orderNumber": "Order Number", + "approvalNumber": "Approval Number", + "approvalDate": "Approval Date", + "approvalDay": "Approval Day", + "requestStatus": "Request Status", + "processResult": "Process Result", + "installmentMonth": "Installment Month", + "installmentPeriod": "Installment Period", + "installmentMonthly": "{{count}} Month Installment", + "lumpSum": "Lump Sum", + "productName": "Product Name", + "buyerName": "Buyer Name", + "buyer": "Buyer", + "originalTid": "Original TID", + "originalAmount": "Original Amount", + "partCancelTid": "Partial Cancel TID", + "reApprovalTid": "Re-approval TID", + "partCancelAmount": "Partial Cancel Amount", + "remainingAmount": "Remaining Amount", + "reApprovalAmount": "Re-approval Amount", + "cancelDate": "Cancel Date", + "cancelApprovalNumber": "Cancel Approval Number", + "receiptInfo": "Cash Receipt", + "transactionId": "Transaction ID", + "merchantTid": "Transaction ID", + "subMallName": "Sub Mall Name", + "subMallBusinessNumber": "Sub Mall Business Number", + "issueChannel": "Issue Channel", + "failureReason": "Failure Reason", + "issueNumber": "Issue Number", + "issueDate": "Issue Date", + "issueDateTime": "Issue Date Time", + "purpose": "Purpose", + "paymentMethod": "Payment Method", + "transactionStatus": "Transaction Status", + "transactionMethod": "Transaction Method", + "transactionType": "Transaction Type", + "deliveryStatus": "Delivery Status", + "deliveryRegistration": "Delivery Registration", + "deliveryComplete": "Delivery Complete", + "purchaseConfirm": "Purchase Confirm", + "purchaseReject": "Purchase Reject", + "rejectReason": "Reject Reason", + "escrowCertNumber": "Escrow Cert Number", + "deliveryCompany": "Delivery Company", + "trackingNumber": "Tracking Number", + "deliveryAddress": "Delivery Address", + "approvalPurchase": "Approval Purchase", + "approvalPurchaseDate": "Approval Purchase Date", + "approvalRejectCount": "Approval Reject (Count)", + "approvalRepurchaseCount": "Approval Repurchase (Count)", + "approvalVAN": "Approval VAN", + "cancelPurchase": "Cancel Purchase", + "cancelPurchaseDate": "Cancel Purchase", + "cancelRejectCount": "Cancel Reject (Count)", + "cancelRepurchaseCount": "Cancel Repurchase (Count)", + "purchaseVan": "Purchase VAN", + "purchaseCompany": "Purchase Company (Issuer)", + "cardNo": "Card Number", + "approvalNo": "Approval Number", + "authentication": "Authentication", + "joinType": "Type", + "bankName": "Bank Name", + "bank": "Bank", + "accountNo": "Account Number", + "refundCompleteDate": "Refund Complete Date", + "customerId": "Customer ID", + "culturelandId": "Cultureland ID", + "partner": "Partner", + "cpid": "CPID", + "goodsCategory": "Goods Category", + "cellphoneNo": "Cellphone Number", + "giftCardNumber": "Gift Card Number", + "depositBankName": "Deposit Bank Name", + "depositorName": "Depositor Name", + "depositDeadline": "Deposit Deadline", + "depositDate": "Deposit Date", + "refundScheduleDate": "Refund Schedule Date", + "refundBankName": "Refund Bank Name", + "refundAccountNo": "Refund Account Number", + "accountHolder": "Account Holder", + "buyerEmail": "Email", + "buyerTel": "Phone Number", + "cancelReason": "Cancel Reason", + "cancelRequestor": "Cancel Requestor", + "partialCancel": "Partial Cancel", + "cashReceiptIssue": "Cash Receipt Issue", + "approvalSettlementDate": "Approval Settlement Date", + "approvalSettlementAmount": "Approval Settlement Amount", + "cancelSettlementDate": "Cancel Settlement Date", + "cancelSettlementAmount": "Cancel Settlement Amount", + "companyName": "Company Name", + "gid": "GID", + "aid": "AID", + "mid": "MID", + "transactionRequestAmount": "Transaction Request Amount", + "approvalRequestAmount": "Approval Request Amount", + "transactionAmount": "Transaction Amount", + "creditCardAmount": "Credit Card Amount", + "cardAmount": "Credit Card Amount", + "pointAmount": "Point Amount", + "couponAmount": "Coupon Amount", + "escrowFee": "Escrow Fee", + "kakaoMoneyAmount": "Kakao Money", + "kakaoPointAmount": "Kakao Point", + "kakaoDiscountAmount": "Kakao Instant Discount", + "naverPointAmount": "Naver Point", + "tossMoneyAmount": "Toss Money", + "tossDiscountAmount": "Toss Discount", + "paycoPointAmount": "Payco Point", + "paycoCouponAmount": "Payco Coupon", + "supplyAmount": "Supply Amount", + "vat": "VAT", + "serviceAmount": "Service Charge", + "taxFreeAmount": "Tax Free Amount", + "amount": "Amount", + "totalBalance": "Total Balance", + "totalCancelAmount": "Total Cancel Amount", + "customerName": "Customer Name", + "transactionConfirmation": "Transaction Confirmation" + }, + "handWrittenIssuance": { + "step1Title": "Enter Issue Information", + "step2Title": "Enter Issue Amount", + "businessNumber": "Business Number", + "incomeDeduction": "Income Deduction", + "expenseProof": "Expense Proof", + "productNamePlaceholder": "Product Name", + "buyerNamePlaceholder": "Buyer Name", + "issueNumberPlaceholder": "Business Number OR Phone Number", + "emailPlaceholder": "TEST123@nicepay.com", + "phoneNumberPlaceholder": "01012345678", + "issueAmount": "Issue Amount", + "vatAutoCalc": "VAT Auto Calculate", + "errorMessage": "The issue amount must equal the sum of supply amount, VAT, tax-free amount, and service charge." + }, + "list": { + "paymentRequest": "Payment Request", + "manualIssuance": "Manual Issuance", + "separator": "|" + }, + "cancel": { + "bankGroup": { + "select": "Select", + "notice": "Refunds will be paid to the entered account information without separate verification.\nPlease check the entered information once more." + }, + "passwordGroup": { + "cancelPassword": "Cancel Password", + "passwordMismatch": "Password Mismatch" + }, + "afterDeposit": { + "title": "Transaction Cancel (After Deposit Cancel)", + "notice": "The requested transaction cancellation can be processed after deposit.", + "cancelTransactionTitle": "Cancel Transaction Details", + "approvalAmount": "Approval Amount", + "depositRequestAmount": "Deposit Request Amount", + "depositInfoTitle": "Deposit Information", + "guide1": "Cancellation must be submitted through the [Cancel Request] button.", + "guide2": "Please enter the merchant name as the depositor name.", + "guide3": "Cancellation will proceed only if the same amount as the deposit request amount is deposited.", + "guide4": "Cancellation details can be confirmed after up to 3 days.", + "guide5": "After Deposit Cancellation Process:\nMerchant Cancel Request -> Merchant Deposit -> Confirm Deposit -> Process Cancel", + "guide6": "For transactions that have not been settled, please send transaction details to service@nicepay.co.kr. (Only for transactions with more than 2 days remaining until the settlement date)" + }, + "partCancel": { + "balance": "Balance", + "cancelAmount": "Cancel Amount", + "taxableAmount": "Taxable Amount", + "taxAmount": "Tax Amount", + "taxFree": "Tax Free", + "serviceFee": "Service Fee" + } + } }, "cashReceipt": { "title": "Cash Receipt", diff --git a/src/locales/ko.json b/src/locales/ko.json index 866b240..a82ad38 100644 --- a/src/locales/ko.json +++ b/src/locales/ko.json @@ -362,7 +362,214 @@ "searchOptions": "๊ฒ€์ƒ‰์˜ต์…˜", "download": "๋‹ค์šด๋กœ๋“œ", "cancelTransaction": "๊ฑฐ๋ž˜ ์ทจ์†Œ", - "confirmCancel": "๊ฑฐ๋ž˜๋ฅผ ์ทจ์†Œํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?" + "confirmCancel": "๊ฑฐ๋ž˜๋ฅผ ์ทจ์†Œํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?", + "bottomSheet": { + "escrowMailResend": { + "title": "์ด๋ฉ”์ผ ์ฃผ์†Œ๋ฅผ ์„ ํƒํ•˜์„ธ์š”", + "close": "๋‹ซ๊ธฐ", + "mailLabel": "๋ฉ”์ผ๋กœ ๋ฐ›๊ธฐ", + "mail": "๋ฉ”์ผ", + "select": "์„ ํƒ", + "errorNoEmail": "๋“ฑ๋ก๋œ ๋ฉ”์ผ ์ •๋ณด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.\n์ด๋ฉ”์ผ ์ธ์ฆ์ •๋ณด๋ฅผ ์‚ฌ์šฉ์ž๊ด€๋ฆฌ ๋ฉ”๋‰ด์—์„œ ์ถ”๊ฐ€ ํ›„ ์‹ ์ฒญํ•˜์„ธ์š”." + }, + "cashReceiptPurposeUpdate": { + "title": "ํ˜„๊ธˆ์˜์ˆ˜์ฆ ์šฉ๋„ ๋ณ€๊ฒฝ ์•ˆ๋‚ด", + "description": "ํ˜„๊ธˆ์˜์ˆ˜์ฆ์˜ ์šฉ๋„ ๋ณ€๊ฒฝ ์‹œ ๊ธฐ์กด ๋ฐœ๊ธ‰ ๋‚ด์—ญ์ด ์ทจ์†Œ๋˜๋ฉฐ, ์„ ํƒํ•œ ์šฉ๋„์— ๋งž๊ฒŒ ์ƒˆ๋กœ ๋ฐœ๊ธ‰๋ฉ๋‹ˆ๋‹ค.", + "expenseProof": "์ง€์ถœ์ฆ๋น™์šฉ", + "incomeDeduction": "์†Œ๋“๊ณต์ œ์šฉ", + "expenseToIncome": "์ง€์ถœ์ฆ๋น™์šฉ โ†’ ์†Œ๋“๊ณต์ œ์šฉ", + "incomeToExpense": "์†Œ๋“๊ณต์ œ์šฉ โ†’ ์ง€์ถœ์ฆ๋น™์šฉ" + } + }, + "sections": { + "importantInfo": "์ค‘์š” ์ •๋ณด", + "billingInfo": "๋นŒ๋ง ์ •๋ณด", + "partCancelInfo": "๋ถ€๋ถ„์ทจ์†Œ ์ •๋ณด", + "detailInfo": "์ƒ์„ธ ์ •๋ณด", + "issueInfo": "๋ฐœ๊ธ‰ ์ •๋ณด", + "escrowInfo": "์—์Šคํฌ๋กœ ์ •๋ณด", + "paymentInfo": "๊ฒฐ์ œ ์ •๋ณด", + "transactionInfo": "๊ฑฐ๋ž˜ ์ •๋ณด", + "settlementInfo": "์ •์‚ฐ ์ •๋ณด", + "merchantInfo": "์ƒ์  ์ •๋ณด", + "amountDetail": "๊ธˆ์•ก์ƒ์„ธ" + }, + "fields": { + "billKey": "๋นŒํ‚ค", + "tid": "TID", + "orderNumber": "์ฃผ๋ฌธ๋ฒˆํ˜ธ", + "approvalNumber": "์Šน์ธ๋ฒˆํ˜ธ", + "approvalDate": "์Šน์ธ์ผ์ž", + "approvalDay": "์Šน์ธ์ผ", + "requestStatus": "์š”์ฒญ์ƒํƒœ", + "processResult": "์ฒ˜๋ฆฌ๊ฒฐ๊ณผ", + "installmentMonth": "ํ• ๋ถ€๊ฐœ์›”", + "installmentPeriod": "ํ• ๋ถ€๊ธฐ๊ฐ„", + "installmentMonthly": "{{count}}๊ฐœ์›” ํ• ๋ถ€", + "lumpSum": "์ผ์‹œ๋ถˆ", + "productName": "์ƒํ’ˆ๋ช…", + "buyerName": "๊ตฌ๋งค์ž๋ช…", + "buyer": "๊ตฌ๋งค์ž", + "originalTid": "์›๊ฑฐ๋ž˜ TID", + "originalAmount": "์›๊ฑฐ๋ž˜ ๊ธˆ์•ก", + "partCancelTid": "๋ถ€๋ถ„์ทจ์†Œ TID", + "reApprovalTid": "์žฌ์Šน์ธ TID", + "partCancelAmount": "๋ถ€๋ถ„์ทจ์†Œ ๊ธˆ์•ก", + "remainingAmount": "๋ถ€๋ถ„์ทจ์†Œ ํ›„ ์ž”์•ก", + "reApprovalAmount": "์žฌ์Šน์ธ ๊ธˆ์•ก", + "cancelDate": "์ทจ์†Œ์ผ์ž", + "cancelApprovalNumber": "์ทจ์†Œ์Šน์ธ๋ฒˆํ˜ธ", + "receiptInfo": "ํ˜„๊ธˆ์˜์ˆ˜์ฆ", + "transactionId": "๊ฑฐ๋ž˜ID", + "merchantTid": "๊ฑฐ๋ž˜ID", + "subMallName": "์„œ๋ธŒ๋ชฐ๋ช…", + "subMallBusinessNumber": "์„œ๋ธŒ๋ชฐ ์‚ฌ์—…์ž ๋ฒˆํ˜ธ", + "issueChannel": "๋ฐœํ–‰๊ฒฝ๋กœ", + "failureReason": "์‹คํŒจ์‚ฌ์œ ", + "issueNumber": "๋ฐœํ–‰๋ฒˆํ˜ธ", + "issueDate": "๋ฐœํ–‰์ผ์ž", + "issueDateTime": "๋ฐœํ–‰์ผ์‹œ", + "purpose": "์šฉ๋„", + "paymentMethod": "๊ฒฐ์ œ์ˆ˜๋‹จ", + "transactionStatus": "๊ฑฐ๋ž˜์ƒํƒœ", + "transactionMethod": "๊ฑฐ๋ž˜์ˆ˜๋‹จ", + "transactionType": "๊ฑฐ๋ž˜๊ตฌ๋ถ„", + "deliveryStatus": "๋ฐฐ์†ก์ƒํƒœ", + "deliveryRegistration": "๋ฐฐ์†ก๋“ฑ๋ก", + "deliveryComplete": "๋ฐฐ์†ก์™„๋ฃŒ", + "purchaseConfirm": "๊ตฌ๋งคํ™•์ธ", + "purchaseReject": "๊ตฌ๋งค๊ฑฐ์ ˆ", + "rejectReason": "๊ฑฐ์ ˆ์‚ฌ์œ ", + "escrowCertNumber": "์—์Šคํฌ๋กœ์ธ์ฆ๋ฒˆํ˜ธ", + "deliveryCompany": "ํƒ๋ฐฐ์‚ฌ", + "trackingNumber": "์šด์†ก์žฅ๋ฒˆํ˜ธ", + "deliveryAddress": "๋ฐฐ์†ก์ฃผ์†Œ", + "approvalPurchase": "์Šน์ธ๋งค์ž…", + "approvalPurchaseDate": "์Šน์ธ๋งค์ž…์ผ", + "approvalRejectCount": "์Šน์ธ๋ฐ˜์†ก(ํšŸ์ˆ˜)", + "approvalRepurchaseCount": "์Šน์ธ์žฌ๋งค์ž…(ํšŸ์ˆ˜)", + "approvalVAN": "์Šน์ธVAN", + "cancelPurchase": "์ทจ์†Œ๋งค์ž…", + "cancelPurchaseDate": "์ทจ์†Œ๋งค์ž…", + "cancelRejectCount": "์ทจ์†Œ๋ฐ˜์†ก(ํšŸ์ˆ˜)", + "cancelRepurchaseCount": "์ทจ์†Œ์žฌ๋งค์ž…(ํšŸ์ˆ˜)", + "purchaseVan": "๋งค์ž…VAN", + "purchaseCompany": "๋งค์ž…์‚ฌ(๋ฐœ๊ธ‰์‚ฌ)", + "cardNo": "์นด๋“œ๋ฒˆํ˜ธ", + "approvalNo": "์Šน์ธ๋ฒˆํ˜ธ", + "authentication": "์ธ์ฆ", + "joinType": "์œ ํ˜•", + "bankName": "์€ํ–‰๋ช…", + "bank": "์€ํ–‰", + "accountNo": "๊ณ„์ขŒ๋ฒˆํ˜ธ", + "refundCompleteDate": "ํ™˜๋ถˆ์™„๋ฃŒ์ผ", + "customerId": "๊ณ ๊ฐID", + "culturelandId": "์ปฌ์ฒ˜๋žœ๋“œID", + "partner": "์ œํœด์‚ฌ", + "cpid": "CPID", + "goodsCategory": "์ƒํ’ˆ๊ตฌ๋ถ„", + "cellphoneNo": "ํœด๋Œ€ํฐ๋ฒˆํ˜ธ", + "giftCardNumber": "์ƒํ’ˆ๊ถŒ๋ฒˆํ˜ธ", + "depositBankName": "์ž…๊ธˆ๊ธˆ์œต๊ธฐ๊ด€๋ช…", + "depositorName": "์ž…๊ธˆ์ž๋ช…", + "depositDeadline": "์ž…๊ธˆ๊ธฐํ•œ", + "depositDate": "์ž…๊ธˆ์ผ", + "refundScheduleDate": "ํ™˜๋ถˆ์˜ˆ์ •์ผ", + "refundBankName": "ํ™˜๋ถˆ์€ํ–‰๋ช…", + "refundAccountNo": "ํ™˜๋ถˆ๊ณ„์ขŒ๋ฒˆํ˜ธ", + "accountHolder": "์˜ˆ๊ธˆ์ฃผ", + "buyerEmail": "์ด๋ฉ”์ผ", + "buyerTel": "์ „ํ™”๋ฒˆํ˜ธ", + "cancelReason": "์ทจ์†Œ์‚ฌ์œ ", + "cancelRequestor": "์ทจ์†Œ์š”์ฒญ์ž", + "partialCancel": "๋ถ€๋ถ„์ทจ์†Œ", + "cashReceiptIssue": "ํ˜„๊ธˆ์˜์ˆ˜์ฆ๋ฐœํ–‰", + "approvalSettlementDate": "์Šน์ธ์ •์‚ฐ์ผ", + "approvalSettlementAmount": "์Šน์ธ์ •์‚ฐ๊ธˆ์•ก", + "cancelSettlementDate": "์ทจ์†Œ์ •์‚ฐ์ผ", + "cancelSettlementAmount": "์ทจ์†Œ์ •์‚ฐ๊ธˆ์•ก", + "companyName": "์ƒํ˜ธ", + "gid": "GID", + "aid": "AID", + "mid": "MID", + "transactionRequestAmount": "๊ฑฐ๋ž˜์š”์ฒญ๊ธˆ์•ก", + "approvalRequestAmount": "์Šน์ธ์š”์ฒญ๊ธˆ์•ก", + "transactionAmount": "๊ฑฐ๋ž˜๊ธˆ์•ก", + "creditCardAmount": "์‹ ์šฉ์นด๋“œ๊ธˆ์•ก", + "cardAmount": "์‹ ์šฉ์นด๋“œ๊ธˆ์•ก", + "pointAmount": "ํฌ์ธํŠธ๊ธˆ์•ก", + "couponAmount": "์ฟ ํฐ๊ธˆ์•ก", + "escrowFee": "์—์Šคํฌ๋กœ์ˆ˜์ˆ˜๋ฃŒ", + "kakaoMoneyAmount": "์นด์นด์˜ค๋จธ๋‹ˆ", + "kakaoPointAmount": "์นด์นด์˜คํฌ์ธํŠธ", + "kakaoDiscountAmount": "์นด์นด์˜ค ์ฆ‰์‹œํ• ์ธ", + "naverPointAmount": "๋„ค์ด๋ฒ„ํฌ์ธํŠธ", + "tossMoneyAmount": "ํ† ์Šค๋จธ๋‹ˆ", + "tossDiscountAmount": "ํ† ์Šคํ• ์ธ", + "paycoPointAmount": "ํŽ˜์ด์ฝ”ํฌ์ธํŠธ", + "paycoCouponAmount": "ํŽ˜์ด์ฝ”์ฟ ํฐ", + "supplyAmount": "๊ณต๊ธ‰๊ฐ€์•ก", + "vat": "VAT", + "serviceAmount": "๋ด‰์‚ฌ๋ฃŒ", + "taxFreeAmount": "๋ฉด์„ธ๊ธˆ์•ก", + "amount": "๊ธˆ์•ก", + "totalBalance": "์ด ์ž”์•ก", + "totalCancelAmount": "์ด ์ทจ์†Œ๊ธˆ์•ก", + "customerName": "๊ณ ๊ฐ๋ช…", + "transactionConfirmation": "๊ฑฐ๋ž˜ ํ™•์ธ์„œ" + }, + "handWrittenIssuance": { + "step1Title": "๋ฐœํ–‰ ์ •๋ณด ์ž…๋ ฅ", + "step2Title": "๋ฐœํ–‰ ๊ธˆ์•ก ์ž…๋ ฅ", + "businessNumber": "์‚ฌ์—…์ž ๋ฒˆํ˜ธ", + "incomeDeduction": "์†Œ๋“๊ณต์ œ", + "expenseProof": "์ง€์ถœ์ฆ๋น™", + "productNamePlaceholder": "์ƒํ’ˆ๋ช…", + "buyerNamePlaceholder": "๊ตฌ๋งค์ž๋ช…", + "issueNumberPlaceholder": "์‚ฌ์—…์ž๋ฒˆํ˜ธ OR ํœด๋Œ€ํฐ๋ฒˆํ˜ธ", + "emailPlaceholder": "TEST123@nicepay.com", + "phoneNumberPlaceholder": "01012345678", + "issueAmount": "๋ฐœํ–‰๊ธˆ์•ก", + "vatAutoCalc": "VAT์ž๋™๊ณ„์‚ฐ", + "errorMessage": "๋ฐœํ–‰๊ธˆ์•ก์€ ๊ณต๊ธ‰๊ฐ€์•ก VAT,๋ฉด์„ธ๊ธˆ์•ก, ๋ด‰์‚ฌ๋ฃŒ์˜ ์ดํ•ฉ๊ณผ ๊ฐ™์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค." + }, + "list": { + "paymentRequest": "๊ฒฐ์ œ์‹ ์ฒญ", + "manualIssuance": "์ˆ˜๊ธฐ๋ฐœํ–‰", + "separator": "|" + }, + "cancel": { + "bankGroup": { + "select": "์„ ํƒ", + "notice": "ํ™˜๋ถˆ์€ ์ž…๋ ฅํ•œ ๊ณ„์ขŒ์ •๋ณด๋กœ ๋ณ„๋„ ํ™•์ธ ์ ˆ์ฐจ์—†์ด ์ง€๊ธ‰๋ฉ๋‹ˆ๋‹ค.\n์ž…๋ ฅ ์ •๋ณด๋ฅผ ํ•œ๋ฒˆ ๋” ํ™•์ธํ•ด ์ฃผ์„ธ์š”." + }, + "passwordGroup": { + "cancelPassword": "์ทจ์†Œ ๋น„๋ฐ€๋ฒˆํ˜ธ", + "passwordMismatch": "๋น„๋ฐ€๋ฒˆํ˜ธ ๋ถˆ์ผ์น˜" + }, + "afterDeposit": { + "title": "๊ฑฐ๋ž˜์ทจ์†Œ(์ž…๊ธˆ ํ›„ ์ทจ์†Œ)", + "notice": "์š”์ฒญํ•˜์‹  ๊ฑฐ๋ž˜์ทจ์†Œ๋Š” ์ž…๊ธˆ ํ›„ ์ทจ์†Œ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.", + "cancelTransactionTitle": "์ทจ์†Œ๊ฑฐ๋ž˜๋‚ด์—ญ", + "approvalAmount": "์Šน์ธ๊ธˆ์•ก", + "depositRequestAmount": "์ž…๊ธˆ์š”์ฒญ๊ธˆ์•ก", + "depositInfoTitle": "์ž…๊ธˆ ์ •๋ณด", + "guide1": "[์ทจ์†Œ์š”์ฒญ] ๋ฒ„ํŠผ์„ ํ†ตํ•ด ์ทจ์†Œ ์š”์ฒญ์„ ์ง„ํ–‰ํ•ด์•ผ ์ ‘์ˆ˜๋ฉ๋‹ˆ๋‹ค.", + "guide2": "์ž…๊ธˆ์ž๋ช…์€ ๊ฐ€๋งน์  ์ƒํ˜ธ๋กœ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”.", + "guide3": "์ž…๊ธˆ์š”์ฒญ๊ธˆ์•ก๊ณผ ๋™์ผํ•œ ๊ธˆ์•ก์„ ์ž…๊ธˆํ•ด์•ผ ์ทจ์†Œ๊ฐ€ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค.", + "guide4": "์ทจ์†Œ๋‚ด์—ญ์€ ์ตœ๋Œ€ 3์ผ ์ดํ›„ ํ™•์ธ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.", + "guide5": "์ž…๊ธˆ ํ›„ ์ทจ์†Œ ํ”„๋กœ์„ธ์Šค :\n๊ฐ€๋งน์ ์˜ ์ทจ์†Œ์š”์ฒญ -> ๊ฐ€๋งน์ ์˜์ž…๊ธˆ -> ์ž…๊ธˆ ํ™•์ธ -> ์ทจ์†Œ ์ฒ˜๋ฆฌ", + "guide6": "์ •์‚ฐ๋ฐ›์ง€ ์•Š์€ ๊ฑฐ๋ž˜์ธ ๊ฒฝ์šฐ service@nicepay.co.kr๋กœ ๊ฑฐ๋ž˜๋‚ด์—ญ์„ ๋ฐœ์†ก๋ฐ”๋ž๋‹ˆ๋‹ค. (๋‹จ. ์ •์‚ฐ์˜ˆ์ •์ผ์ด 2์ผ ์ด์ƒ ๋‚จ์€ ๊ฑฐ๋ž˜์— ํ•œํ•จ)" + }, + "partCancel": { + "balance": "์ž”์•ก", + "cancelAmount": "์ทจ์†Œ๊ธˆ์•ก", + "taxableAmount": "๊ณผ์„ธ์•ก", + "taxAmount": "๋ถ€๊ฐ€์„ธ", + "taxFree": "๋ฉด์„ธ", + "serviceFee": "๋ด‰์‚ฌ๋ฃŒ" + } + } }, "cashReceipt": { "title": "ํ˜„๊ธˆ์˜์ˆ˜์ฆ", From 29f69c248cf21e4880bd691e61029d4bd48a9ba8 Mon Sep 17 00:00:00 2001 From: Jay Sheen Date: Thu, 30 Oct 2025 16:36:30 +0900 Subject: [PATCH 02/15] Convert transaction constants to i18n-compatible getter functions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Convert all hardcoded constant arrays to functions accepting TFunction - Add transaction.constants namespace with 40+ translation keys - Update contant.ts: All exports now use get* prefix (e.g., getCashReceiptPurposeTypeBtnGroup) - Replace ko/en properties with single name property using t() function Updated constants: - getAllTransactionMoidTidOptionsGroup(t) - getAllTransactionStatusCodeBtnGroup(t) - getAllTransactionServiceCodeOptionsGroup(t) - getAllTransactionStatusCode(t) - getCashReceiptPurposeTypeBtnGroup(t) - getCashReceiptTransactionTypeBtnGroup(t) - getCashReceiptProcessResultBtnGroup(t) - getEscrowSearchTypeOptionsGroup(t) - getEscrowDeliveryStatusBtnGroup(t) - getEscrowSettlementStatusBtnGroup(t) - getBillingSearchTypeOptionsGroup(t) - getBillingRequestStatusBtnGroup(t) - getBillingProcessResultBtnGroup(t) - getBillingPaymentMethodBtnGroup(t) Updated components (9 files): - Filter components: all-transaction, cash-receipt, billing, escrow - List pages: billing, cash-receipt, escrow - UI components: list-item, important-info-section All constants now properly support Korean/English language switching. ๐Ÿค– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- src/entities/transaction/model/contant.ts | 244 +++++++++--------- .../ui/filter/all-transaction-filter.tsx | 13 +- .../transaction/ui/filter/billing-filter.tsx | 21 +- .../ui/filter/cash-receipt-filter.tsx | 16 +- .../transaction/ui/filter/escrow-filter.tsx | 18 +- src/entities/transaction/ui/list-item.tsx | 13 +- .../ui/section/important-info-section.tsx | 13 +- src/locales/en.json | 40 +++ src/locales/ko.json | 40 +++ src/pages/transaction/billing/list-page.tsx | 6 +- .../transaction/cash-receipt/list-page.tsx | 4 +- src/pages/transaction/escrow/list-page.tsx | 6 +- 12 files changed, 271 insertions(+), 163 deletions(-) diff --git a/src/entities/transaction/model/contant.ts b/src/entities/transaction/model/contant.ts index 7890050..69d994a 100644 --- a/src/entities/transaction/model/contant.ts +++ b/src/entities/transaction/model/contant.ts @@ -1,4 +1,5 @@ -import { +import { TFunction } from 'i18next'; +import { AllTransactionMoidTid, AllTransactionSearchCl, AllTransactionServiceCode, @@ -6,7 +7,7 @@ import { CashReceiptPurposeType, CashReceiptTransactionType, CashReceiptProcessResult, - BillingPaymentMethod, + BillingPaymentMethod, BillingProcessResult, BillingRequestStatus, BillingSearchType, @@ -15,121 +16,121 @@ import { EscrowSettlementStatus } from '@/entities/transaction/model/types'; -export const AllTransactionMoidTidOptionsGroup = [ - {name: '์ฃผ๋ฌธ๋ฒˆํ˜ธ', value: AllTransactionMoidTid.MOID}, - {name: 'TID', value: AllTransactionMoidTid.TID}, +export const getAllTransactionMoidTidOptionsGroup = (t: TFunction) => [ + {name: t('transaction.constants.orderNumber'), value: AllTransactionMoidTid.MOID}, + {name: t('transaction.constants.tid'), value: AllTransactionMoidTid.TID}, ]; -export const AllTransactionStatusCodeBtnGroup = [ - {name: '์ „์ฒด', value: AllTransactionStatusCode.ALL}, - {name: '์Šน์ธ/์ž…๊ธˆ์™„๋ฃŒ', value: AllTransactionStatusCode.APPROVAL}, - {name: '์ „์ทจ์†Œ/์ทจ์†Œ', value: AllTransactionStatusCode.CANCEL}, - {name: 'ํ›„์ทจ์†Œ/ํ™˜๋ถˆ', value: AllTransactionStatusCode.REFUND} -]; -export const AllTransactionServiceCodeOptionsGroup = [ - {name: '์ „์ฒด', value: AllTransactionServiceCode.ALL}, - {name: '์‹ ์šฉ์นด๋“œ', value: AllTransactionServiceCode.CREDIT_CARD}, - {name: '๊ฐ€์ƒ๊ณ„์ขŒ', value: AllTransactionServiceCode.VIRTUAL_ACCOUNT}, - {name: '๊ณ„์ขŒ์ด์ฒด', value: AllTransactionServiceCode.ACCOUNT_TRANSFER}, - {name: '๊ณ„์ขŒ๊ฐ„ํŽธ๊ฒฐ์ œ', value: AllTransactionServiceCode.ACCOUNT_SIMPLE_TRANSFER}, - {name: 'ํœด๋Œ€ํฐ', value: AllTransactionServiceCode.MOBILE_PAYMENT}, - {name: 'SSG ๋จธ๋‹ˆ', value: AllTransactionServiceCode.SSGMONEY}, - {name: 'SSG ์€ํ–‰๊ณ„์ขŒ', value: AllTransactionServiceCode.SSGBANK}, - {name: '๋ฌธํ™”์ƒํ’ˆ๊ถŒ', value: AllTransactionServiceCode.CULT}, - {name: 'ํ‹ฐ๋จธ๋‹ˆํŽ˜์ด', value: AllTransactionServiceCode.TMONEY}, - +export const getAllTransactionStatusCodeBtnGroup = (t: TFunction) => [ + {name: t('transaction.constants.all'), value: AllTransactionStatusCode.ALL}, + {name: t('transaction.constants.approvalComplete'), value: AllTransactionStatusCode.APPROVAL}, + {name: t('transaction.constants.totalCancel'), value: AllTransactionStatusCode.CANCEL}, + {name: t('transaction.constants.refund'), value: AllTransactionStatusCode.REFUND} ]; -export const AllTracsactionStatusCode = [ +export const getAllTransactionServiceCodeOptionsGroup = (t: TFunction) => [ + {name: t('transaction.constants.all'), value: AllTransactionServiceCode.ALL}, + {name: t('transaction.constants.creditCard'), value: AllTransactionServiceCode.CREDIT_CARD}, + {name: t('transaction.constants.virtualAccount'), value: AllTransactionServiceCode.VIRTUAL_ACCOUNT}, + {name: t('transaction.constants.accountTransfer'), value: AllTransactionServiceCode.ACCOUNT_TRANSFER}, + {name: t('transaction.constants.accountSimpleTransfer'), value: AllTransactionServiceCode.ACCOUNT_SIMPLE_TRANSFER}, + {name: t('transaction.constants.mobilePayment'), value: AllTransactionServiceCode.MOBILE_PAYMENT}, + {name: t('transaction.constants.ssgMoney'), value: AllTransactionServiceCode.SSGMONEY}, + {name: t('transaction.constants.ssgBank'), value: AllTransactionServiceCode.SSGBANK}, + {name: t('transaction.constants.cultureLand'), value: AllTransactionServiceCode.CULT}, + {name: t('transaction.constants.tmoneyPay'), value: AllTransactionServiceCode.TMONEY}, +]; + +export const getAllTransactionStatusCode = (t: TFunction) => [ { - serviceCode: '', + serviceCode: '', list: [ - {code: '', ko: '์ „์ฒด', en: 'All'}, - {code: '0', ko: '์Šน์ธ/์ž…๊ธˆ์™„๋ฃŒ', en: 'Approval'}, - {code: '1', ko: '์ „์ทจ์†Œ/์ทจ์†Œ', en: 'Total Cancellation'}, - {code: '2', ko: 'ํ›„์ทจ์†Œ/ํ™˜๋ถˆ', en: 'Cancellation'} + {code: '', name: t('transaction.constants.all')}, + {code: '0', name: t('transaction.constants.approvalComplete')}, + {code: '1', name: t('transaction.constants.totalCancel')}, + {code: '2', name: t('transaction.constants.refund')} ] }, { - serviceCode: '01', + serviceCode: '01', list: [ - {code: '', ko: '์ „์ฒด', en: 'All'}, - {code: '0', ko: '์Šน์ธ', en: 'Approval'}, - {code: '1', ko: '์ „์ทจ์†Œ', en: 'Total Cancellation'}, - {code: '2', ko: 'ํ›„์ทจ์†Œ', en: 'Cancellation'} + {code: '', name: t('transaction.constants.all')}, + {code: '0', name: t('transaction.constants.approval')}, + {code: '1', name: t('transaction.constants.totalCancelShort')}, + {code: '2', name: t('transaction.constants.cancelShort')} ] }, { serviceCode: '02', list: [ - {code: '', ko: '์ „์ฒด', en: 'All'}, - {code: '0', ko: '์Šน์ธ', en: 'Approval'}, - {code: '1', ko: '์ทจ์†Œ', en: 'Cancellation'}, - {code: '2', ko: 'ํ™˜๋ถˆ', en: 'Refund'}, + {code: '', name: t('transaction.constants.all')}, + {code: '0', name: t('transaction.constants.approval')}, + {code: '1', name: t('transaction.constants.cancel')}, + {code: '2', name: t('transaction.constants.refund')}, ] }, { serviceCode: '03', list: [ - {code: '', ko: '์ „์ฒด', en: 'All'}, - {code: '0', ko: '์ž…๊ธˆ', en: 'Payment Complete'}, - {code: '2', ko: 'ํ™˜๋ถˆ', en: 'Refund'}, - {code: '3', ko: '์ž…๊ธˆ๋Œ€๊ธฐ', en: 'Waiting Payment'}, - {code: '4', ko: '์ฑ„๋ฒˆ์ทจ์†Œ', en: 'Cancellation Issue'}, + {code: '', name: t('transaction.constants.all')}, + {code: '0', name: t('transaction.constants.deposit')}, + {code: '2', name: t('transaction.constants.refund')}, + {code: '3', name: t('transaction.constants.waitingDeposit')}, + {code: '4', name: t('transaction.constants.issueCancel')}, ] }, { serviceCode: '05', list: [ - {code: '', ko: '์ „์ฒด', en: 'All'}, - {code: '0', ko: '์Šน์ธ', en: 'Approval'}, - {code: '1', ko: '์ทจ์†Œ', en: 'Cancellation'}, - {code: '2', ko: 'ํ™˜๋ถˆ', en: 'Refund'}, + {code: '', name: t('transaction.constants.all')}, + {code: '0', name: t('transaction.constants.approval')}, + {code: '1', name: t('transaction.constants.cancel')}, + {code: '2', name: t('transaction.constants.refund')}, ] }, { serviceCode: '14', list: [ - {code: '', ko: '์ „์ฒด', en: 'All'}, - {code: '0', ko: '์Šน์ธ', en: 'Approval'}, - {code: '1', ko: '์ทจ์†Œ', en: 'Cancellation'}, - {code: '2', ko: 'ํ™˜๋ถˆ', en: 'Refund'}, + {code: '', name: t('transaction.constants.all')}, + {code: '0', name: t('transaction.constants.approval')}, + {code: '1', name: t('transaction.constants.cancel')}, + {code: '2', name: t('transaction.constants.refund')}, ] }, { serviceCode: '21', list: [ - {code: '', ko: '์ „์ฒด', en: 'All'}, - {code: '0', ko: '์Šน์ธ', en: 'Approval'}, - {code: '1', ko: '์ทจ์†Œ', en: 'Cancellation'}, - {code: '2', ko: 'ํ™˜๋ถˆ', en: 'Refund'}, + {code: '', name: t('transaction.constants.all')}, + {code: '0', name: t('transaction.constants.approval')}, + {code: '1', name: t('transaction.constants.cancel')}, + {code: '2', name: t('transaction.constants.refund')}, ] }, { serviceCode: '24', list: [ - {code: '', ko: '์ „์ฒด', en: 'All'}, - {code: '0', ko: '์Šน์ธ', en: 'Approval'}, - {code: '1', ko: '์ทจ์†Œ', en: 'Cancellation'}, - {code: '2', ko: 'ํ™˜๋ถˆ', en: 'Refund'}, + {code: '', name: t('transaction.constants.all')}, + {code: '0', name: t('transaction.constants.approval')}, + {code: '1', name: t('transaction.constants.cancel')}, + {code: '2', name: t('transaction.constants.refund')}, ] }, { serviceCode: '26', list: [ - {code: '', ko: '์ „์ฒด', en: 'All'}, - {code: '0', ko: '์Šน์ธ', en: 'Approval'}, - {code: '1', ko: '์ทจ์†Œ', en: 'Cancellation'}, - {code: '2', ko: 'ํ™˜๋ถˆ', en: 'Refund'}, + {code: '', name: t('transaction.constants.all')}, + {code: '0', name: t('transaction.constants.approval')}, + {code: '1', name: t('transaction.constants.cancel')}, + {code: '2', name: t('transaction.constants.refund')}, ] }, { serviceCode: '31', list: [ - {code: '', ko: '์ „์ฒด', en: 'All'}, - {code: '0', ko: '์Šน์ธ', en: 'Approval'}, - {code: '1', ko: '์ „์ทจ์†Œ', en: 'Total Cancellation'}, - {code: '2', ko: 'ํ›„์ทจ์†Œ', en: 'Cancellation'}, + {code: '', name: t('transaction.constants.all')}, + {code: '0', name: t('transaction.constants.approval')}, + {code: '1', name: t('transaction.constants.totalCancelShort')}, + {code: '2', name: t('transaction.constants.cancelShort')}, ] }, ]; @@ -140,63 +141,72 @@ export const AllTransactionCardBankCodeOptionsGroup = { -export const CashReceiptPurposeTypeBtnGroup = [ - {name: '์ „์ฒด', value: CashReceiptPurposeType.ALL}, - {name: '์†Œ๋“๊ณต์ œ', value: CashReceiptPurposeType.INCOME_DEDUCTION}, - {name: '์ง€์ถœ์ฆ๋น™', value: CashReceiptPurposeType.EXPENSE_PROOF}, +export const getCashReceiptPurposeTypeBtnGroup = (t: TFunction) => [ + {name: t('transaction.constants.all'), value: CashReceiptPurposeType.ALL}, + {name: t('transaction.handWrittenIssuance.incomeDeduction'), value: CashReceiptPurposeType.INCOME_DEDUCTION}, + {name: t('transaction.handWrittenIssuance.expenseProof'), value: CashReceiptPurposeType.EXPENSE_PROOF}, ]; -export const CashReceiptTransactionTypeBtnGroup = [ - {name: '์ „์ฒด', value: CashReceiptTransactionType.ALL}, - {name: '์Šน์ธ', value: CashReceiptTransactionType.APPROVAL}, - {name: '์ทจ์†Œ', value: CashReceiptTransactionType.CANCEL}, + +export const getCashReceiptTransactionTypeBtnGroup = (t: TFunction) => [ + {name: t('transaction.constants.all'), value: CashReceiptTransactionType.ALL}, + {name: t('transaction.constants.approval'), value: CashReceiptTransactionType.APPROVAL}, + {name: t('transaction.constants.cancel'), value: CashReceiptTransactionType.CANCEL}, ]; -export const CashReceiptProcessResultBtnGroup = [ - {name: '์ „์ฒด', value: CashReceiptProcessResult.ALL}, - {name: '์š”์ฒญ', value: CashReceiptProcessResult.REQUEST}, - {name: '์š”์ฒญ์ทจ์†Œ', value: CashReceiptProcessResult.REQUEST_CANCEL}, - {name: '์š”์ฒญ์™„๋ฃŒ', value: CashReceiptProcessResult.REQUEST_COMPLETE}, - {name: '๋ฐœ๊ธ‰์™„๋ฃŒ', value: CashReceiptProcessResult.ISSUE_COMPLETE}, - {name: '์š”์ฒญ์‹คํŒจ', value: CashReceiptProcessResult.REQUEST_FAIL}, - {name: '๋ฐœ๊ธ‰์‹คํŒจ', value: CashReceiptProcessResult.ISSUE_FAIL}, + +export const getCashReceiptProcessResultBtnGroup = (t: TFunction) => [ + {name: t('transaction.constants.all'), value: CashReceiptProcessResult.ALL}, + {name: t('transaction.constants.request'), value: CashReceiptProcessResult.REQUEST}, + {name: t('transaction.constants.requestCancel'), value: CashReceiptProcessResult.REQUEST_CANCEL}, + {name: t('transaction.constants.requestComplete'), value: CashReceiptProcessResult.REQUEST_COMPLETE}, + {name: t('transaction.constants.issueComplete'), value: CashReceiptProcessResult.ISSUE_COMPLETE}, + {name: t('transaction.constants.requestFail'), value: CashReceiptProcessResult.REQUEST_FAIL}, + {name: t('transaction.constants.issueFail'), value: CashReceiptProcessResult.ISSUE_FAIL}, ]; -export const EscrowSearchTypeOptionsGroup = [ - {name: '์ฃผ๋ฌธ๋ฒˆํ˜ธ', value: EscrowSearchType.ORDER_NUMBER }, - {name: 'TID', value: EscrowSearchType.TID } + +export const getEscrowSearchTypeOptionsGroup = (t: TFunction) => [ + {name: t('transaction.constants.orderNumber'), value: EscrowSearchType.ORDER_NUMBER }, + {name: t('transaction.constants.tid'), value: EscrowSearchType.TID } ]; -export const EscrowDeliveryStatusBtnGroup = [ - {name: '์ „์ฒด', value: EscrowDeliveryStatus.ALL}, - {name: '๊ฒฐ์ œ์™„๋ฃŒ', value: EscrowDeliveryStatus.PAY_COMPLETE}, - {name: '๋ฐฐ์†ก๋“ฑ๋ก', value: EscrowDeliveryStatus.DELIVERY_INSERT}, - {name: '๋ฐฐ์†ก์™„๋ฃŒ', value: EscrowDeliveryStatus.DELIVERY_COMPLETE}, - {name: '๊ตฌ๋งคํ™•์ธ', value: EscrowDeliveryStatus.PURCHASE_CONFIRM}, - {name: '๊ตฌ๋งค๊ฑฐ์ ˆ', value: EscrowDeliveryStatus.PURCHASE_REJECT}, - {name: 'ํ™˜๋ถˆ์ฒ˜๋ฆฌ', value: EscrowDeliveryStatus.RETURN_PROCESSING}, - {name: '์ง€๊ธ‰์™„๋ฃŒ', value: EscrowDeliveryStatus.DEPOSIT_COMPLETE}, + +export const getEscrowDeliveryStatusBtnGroup = (t: TFunction) => [ + {name: t('transaction.constants.all'), value: EscrowDeliveryStatus.ALL}, + {name: t('transaction.constants.paymentComplete'), value: EscrowDeliveryStatus.PAY_COMPLETE}, + {name: t('transaction.constants.deliveryRegistration'), value: EscrowDeliveryStatus.DELIVERY_INSERT}, + {name: t('transaction.constants.deliveryComplete'), value: EscrowDeliveryStatus.DELIVERY_COMPLETE}, + {name: t('transaction.constants.purchaseConfirm'), value: EscrowDeliveryStatus.PURCHASE_CONFIRM}, + {name: t('transaction.constants.purchaseReject'), value: EscrowDeliveryStatus.PURCHASE_REJECT}, + {name: t('transaction.constants.refundProcessing'), value: EscrowDeliveryStatus.RETURN_PROCESSING}, + {name: t('transaction.constants.depositComplete'), value: EscrowDeliveryStatus.DEPOSIT_COMPLETE}, ]; -export const EscrowSettlementStatusBtnGroup = [ - {name: '์ „์ฒด', value: EscrowSettlementStatus.ALL}, - {name: '์‹ ์šฉ์นด๋“œ', value: EscrowSettlementStatus.CREDIT_CARD}, - {name: '๊ฐ€์ƒ๊ณ„์ขŒ', value: EscrowSettlementStatus.REAL_ACCOUNT}, - {name: '๊ณ„์ขŒ์ด์ฒด', value: EscrowSettlementStatus.ACCOUNT_TRANSFER}, + +export const getEscrowSettlementStatusBtnGroup = (t: TFunction) => [ + {name: t('transaction.constants.all'), value: EscrowSettlementStatus.ALL}, + {name: t('transaction.constants.creditCard'), value: EscrowSettlementStatus.CREDIT_CARD}, + {name: t('transaction.constants.virtualAccount'), value: EscrowSettlementStatus.REAL_ACCOUNT}, + {name: t('transaction.constants.accountTransfer'), value: EscrowSettlementStatus.ACCOUNT_TRANSFER}, ]; -export const BillingSearchTypeOptionsGroup = [ - {name: '์ฃผ๋ฌธ๋ฒˆํ˜ธ', value: BillingSearchType.ORDER_NUMBER }, - {name: 'TID', value: BillingSearchType.TID } + +export const getBillingSearchTypeOptionsGroup = (t: TFunction) => [ + {name: t('transaction.constants.orderNumber'), value: BillingSearchType.ORDER_NUMBER }, + {name: t('transaction.constants.tid'), value: BillingSearchType.TID } ]; -export const BillingRequestStatusBtnGroup = [ - {name: '์ „์ฒด', value: BillingRequestStatus.ALL}, - {name: '์ง„ํ–‰์ค‘', value: BillingRequestStatus.IN_PROGRESS}, - {name: '์„ฑ๊ณต', value: BillingRequestStatus.SUCCESS}, - {name: '์š”์ฒญ์ทจ์†Œ', value: BillingRequestStatus.REQUEST_CANCEL}, + +export const getBillingRequestStatusBtnGroup = (t: TFunction) => [ + {name: t('transaction.constants.all'), value: BillingRequestStatus.ALL}, + {name: t('transaction.constants.inProgress'), value: BillingRequestStatus.IN_PROGRESS}, + {name: t('transaction.constants.success'), value: BillingRequestStatus.SUCCESS}, + {name: t('transaction.constants.requestCancel'), value: BillingRequestStatus.REQUEST_CANCEL}, ]; -export const BillingProcessResultBtnGroup = [ - {name: '์ „์ฒด', value: BillingProcessResult.ALL}, - {name: '์„ฑ๊ณต', value: BillingProcessResult.SUCCESS}, - {name: '์‹คํŒจ', value: BillingProcessResult.FAILURE}, + +export const getBillingProcessResultBtnGroup = (t: TFunction) => [ + {name: t('transaction.constants.all'), value: BillingProcessResult.ALL}, + {name: t('transaction.constants.success'), value: BillingProcessResult.SUCCESS}, + {name: t('transaction.constants.failure'), value: BillingProcessResult.FAILURE}, ]; -export const BillingPaymentMethodBtnGroup = [ - {name: '์ „์ฒด', value: BillingPaymentMethod.ALL}, - {name: '์‹ ์šฉ์นด๋“œ', value: BillingPaymentMethod.CREDIT_CARD}, - {name: '๊ฐ€์ƒ๊ณ„์ขŒ', value: BillingPaymentMethod.VIRTUAL_ACCOUNT}, - {name: 'ํœด๋Œ€ํฐ', value: BillingPaymentMethod.MOBILE_PAYMENT}, + +export const getBillingPaymentMethodBtnGroup = (t: TFunction) => [ + {name: t('transaction.constants.all'), value: BillingPaymentMethod.ALL}, + {name: t('transaction.constants.creditCard'), value: BillingPaymentMethod.CREDIT_CARD}, + {name: t('transaction.constants.virtualAccount'), value: BillingPaymentMethod.VIRTUAL_ACCOUNT}, + {name: t('transaction.constants.mobilePayment'), value: BillingPaymentMethod.MOBILE_PAYMENT}, ]; diff --git a/src/entities/transaction/ui/filter/all-transaction-filter.tsx b/src/entities/transaction/ui/filter/all-transaction-filter.tsx index bd055a1..70ec692 100644 --- a/src/entities/transaction/ui/filter/all-transaction-filter.tsx +++ b/src/entities/transaction/ui/filter/all-transaction-filter.tsx @@ -9,8 +9,8 @@ import { FilterCalendar } from '@/shared/ui/filter/calendar'; import { FilterButtonGroups } from '@/shared/ui/filter/button-groups'; import { FilterRangeAmount } from '@/shared/ui/filter/range-amount'; import { - AllTransactionMoidTidOptionsGroup, - AllTracsactionStatusCode, + getAllTransactionMoidTidOptionsGroup, + getAllTransactionStatusCode, } from '@/entities/transaction/model/contant'; import { AllTransactionFilterProps, @@ -80,6 +80,9 @@ export const AllTransactionFilter = ({ const [statusCodeBtns, setStatusCodeBtns] = useState>>(); + const moidTidOptionsGroup = getAllTransactionMoidTidOptionsGroup(t); + const allTransactionStatusCode = getAllTransactionStatusCode(t); + const onClickToClose = () => { setFilterOn(false); }; @@ -155,12 +158,12 @@ export const AllTransactionFilter = ({ }; const onChangeServiceCode = (val: string) => { - let list = AllTracsactionStatusCode.filter((value, index) => { + let list = allTransactionStatusCode.filter((value, index) => { return val === value.serviceCode; })[0]?.list; let btns = list?.map((value, index) => { return { - name: value.ko, + name: value.name, value: value.code } }); @@ -211,7 +214,7 @@ export const AllTransactionFilter = ({ title={t('filter.orderNumberTid')} selectValue={ filterMoidTidType } selectSetter={ setFilterMoidTidType } - selectOptions={ AllTransactionMoidTidOptionsGroup } + selectOptions={ moidTidOptionsGroup } inputValue={ filterMoidTidValue } inputSetter={ setFilterMoidTidValue } > diff --git a/src/entities/transaction/ui/filter/billing-filter.tsx b/src/entities/transaction/ui/filter/billing-filter.tsx index 8c8f3bc..db0205b 100644 --- a/src/entities/transaction/ui/filter/billing-filter.tsx +++ b/src/entities/transaction/ui/filter/billing-filter.tsx @@ -9,10 +9,10 @@ import { FilterCalendar } from '@/shared/ui/filter/calendar'; import { FilterButtonGroups } from '@/shared/ui/filter/button-groups'; import { FilterRangeAmount } from '@/shared/ui/filter/range-amount'; import { - BillingSearchTypeOptionsGroup, - BillingRequestStatusBtnGroup, - BillingProcessResultBtnGroup, - BillingPaymentMethodBtnGroup + getBillingSearchTypeOptionsGroup, + getBillingRequestStatusBtnGroup, + getBillingProcessResultBtnGroup, + getBillingPaymentMethodBtnGroup } from '@/entities/transaction/model/contant'; import { BillingFilterProps, @@ -68,6 +68,11 @@ export const BillingFilter = ({ const midOptions = useStore.getState().UserStore.selectOptionsMids; + const searchTypeOptionsGroup = getBillingSearchTypeOptionsGroup(t); + const requestStatusBtnGroup = getBillingRequestStatusBtnGroup(t); + const processResultBtnGroup = getBillingProcessResultBtnGroup(t); + const paymentMethodBtnGroup = getBillingPaymentMethodBtnGroup(t); + const onClickToClose = () => { setFilterOn(false); }; @@ -131,7 +136,7 @@ export const BillingFilter = ({ title={t('filter.orderNumberTid')} selectValue={ filterSearchType } selectSetter={ setFilterSearchType } - selectOptions={ BillingSearchTypeOptionsGroup } + selectOptions={ searchTypeOptionsGroup } inputValue={ searchKeyword } inputSetter={ setFilterSearchKeyword } > @@ -146,19 +151,19 @@ export const BillingFilter = ({ diff --git a/src/entities/transaction/ui/filter/cash-receipt-filter.tsx b/src/entities/transaction/ui/filter/cash-receipt-filter.tsx index f651e32..111d897 100644 --- a/src/entities/transaction/ui/filter/cash-receipt-filter.tsx +++ b/src/entities/transaction/ui/filter/cash-receipt-filter.tsx @@ -8,9 +8,9 @@ import { FilterSelectInput } from '@/shared/ui/filter/select-input'; import { FilterCalendar } from '@/shared/ui/filter/calendar'; import { FilterButtonGroups } from '@/shared/ui/filter/button-groups'; import { - CashReceiptPurposeTypeBtnGroup, - CashReceiptTransactionTypeBtnGroup, - CashReceiptProcessResultBtnGroup + getCashReceiptPurposeTypeBtnGroup, + getCashReceiptTransactionTypeBtnGroup, + getCashReceiptProcessResultBtnGroup } from '@/entities/transaction/model/contant'; import { CashReceiptFilterProps, @@ -64,6 +64,10 @@ export const CashReceiptFilter = ({ const midOptions = useStore.getState().UserStore.selectOptionsMids; + const purposeTypeBtnGroup = getCashReceiptPurposeTypeBtnGroup(t); + const transactionTypeBtnGroup = getCashReceiptTransactionTypeBtnGroup(t); + const processResultBtnGroup = getCashReceiptProcessResultBtnGroup(t); + const onClickToClose = () => { setFilterOn(false); }; @@ -130,19 +134,19 @@ export const CashReceiptFilter = ({ (maxAmount); const midOptions = useStore.getState().UserStore.selectOptionsMids; - + + const searchTypeOptionsGroup = getEscrowSearchTypeOptionsGroup(t); + const deliveryStatusBtnGroup = getEscrowDeliveryStatusBtnGroup(t); + const settlementStatusBtnGroup = getEscrowSettlementStatusBtnGroup(t); + const onClickToClose = () => { setFilterOn(false); }; @@ -125,7 +129,7 @@ export const EscrowFilter = ({ title={t('filter.orderNumberTid')} selectValue={ filterSearchType } selectSetter={ setSearchType } - selectOptions={ EscrowSearchTypeOptionsGroup } + selectOptions={ searchTypeOptionsGroup } inputValue={ searchKeyword } inputSetter={ setSearchKeyword } > @@ -140,13 +144,13 @@ export const EscrowFilter = ({ diff --git a/src/entities/transaction/ui/list-item.tsx b/src/entities/transaction/ui/list-item.tsx index 1211681..8c79767 100644 --- a/src/entities/transaction/ui/list-item.tsx +++ b/src/entities/transaction/ui/list-item.tsx @@ -4,7 +4,7 @@ import { useNavigate } from '@/shared/lib/hooks/use-navigate'; import { ListItemProps, TransactionCategory } from '../model/types'; import moment from 'moment'; import { useStore } from '@/shared/model/store'; -import { AllTracsactionStatusCode } from '../model/contant'; +import { getAllTransactionStatusCode } from '../model/contant'; import { useTranslation } from 'react-i18next'; export const ListItem = ({ @@ -129,15 +129,16 @@ export const ListItem = ({ const getStatusName = () => { let str; if(transactionCategory === TransactionCategory.AllTransaction){ - Loop1: - for(let i=0;i { let str; if(transactionCategory === TransactionCategory.AllTransaction){ - Loop1: - for(let i=0;i {
        { - BillingRequestStatusBtnGroup.map((value, index) => ( - ( + onClickToRequestStatus(value.value) } diff --git a/src/pages/transaction/cash-receipt/list-page.tsx b/src/pages/transaction/cash-receipt/list-page.tsx index 71dd5d9..1d88067 100644 --- a/src/pages/transaction/cash-receipt/list-page.tsx +++ b/src/pages/transaction/cash-receipt/list-page.tsx @@ -30,7 +30,7 @@ import { useSetHeaderType, useSetFooterMode } from '@/widgets/sub-layout/use-sub-layout'; -import { CashReceiptTransactionTypeBtnGroup } from '@/entities/transaction/model/contant'; +import { getCashReceiptTransactionTypeBtnGroup } from '@/entities/transaction/model/contant'; import { useStore } from '@/shared/model/store'; import { useCashReceiptSummaryMutation } from '@/entities/transaction/api/use-cash-receipt-summary-mutation'; import { EmailBottomSheet } from '@/entities/common/ui/email-bottom-sheet'; @@ -256,7 +256,7 @@ export const CashReceiptListPage = () => {
        { - CashReceiptTransactionTypeBtnGroup.map((value, index) => ( + getCashReceiptTransactionTypeBtnGroup(t).map((value: any, index: number) => ( {
        { - EscrowDeliveryStatusBtnGroup.map((value, index) => ( - ( + onClickToDeliveryStatus(value.value) } From 1dcae928fa6a025d5c5033288587fbf637c30125 Mon Sep 17 00:00:00 2001 From: Jay Sheen Date: Thu, 30 Oct 2025 17:14:02 +0900 Subject: [PATCH 03/15] Fix TypeScript errors in installmentMonthly translation calls MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Convert installmentMonth string to number for count parameter - Fix type mismatch: t() expects count as number, not string - Updated files: list-item.tsx, billing-info-section.tsx Fixes compilation errors where { count: string } was incompatible with TOptionsBase requirement of count: number. ๐Ÿค– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- src/entities/transaction/ui/list-item.tsx | 4 ++-- src/entities/transaction/ui/section/billing-info-section.tsx | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/entities/transaction/ui/list-item.tsx b/src/entities/transaction/ui/list-item.tsx index 8c79767..15edc04 100644 --- a/src/entities/transaction/ui/list-item.tsx +++ b/src/entities/transaction/ui/list-item.tsx @@ -166,7 +166,7 @@ export const ListItem = ({ (!!installmentMonth && parseInt(installmentMonth) > 1) && <> | - { t('transaction.fields.installmentMonthly', { count: installmentMonth }) } + { t('transaction.fields.installmentMonthly', { count: parseInt(installmentMonth) }) } }
        @@ -199,7 +199,7 @@ export const ListItem = ({ (!!installmentMonth && parseInt(installmentMonth) > 1) && <> | - { t('transaction.fields.installmentMonthly', { count: installmentMonth }) } + { t('transaction.fields.installmentMonthly', { count: parseInt(installmentMonth) }) } }
        diff --git a/src/entities/transaction/ui/section/billing-info-section.tsx b/src/entities/transaction/ui/section/billing-info-section.tsx index ba30094..7ac7768 100644 --- a/src/entities/transaction/ui/section/billing-info-section.tsx +++ b/src/entities/transaction/ui/section/billing-info-section.tsx @@ -16,7 +16,7 @@ export const BillingInfoSection = ({ className="kv-row" > { t('transaction.fields.installmentMonth') } - { t('transaction.fields.installmentMonthly', { count: billingInfo?.installmentMonth }) } + { t('transaction.fields.installmentMonthly', { count: parseInt(billingInfo?.installmentMonth || '0') }) } ); } From 04c544554ce843ddd2e8f5d3abaf2fbcb4912d6e Mon Sep 17 00:00:00 2001 From: Jay Sheen Date: Thu, 30 Oct 2025 17:19:53 +0900 Subject: [PATCH 04/15] Add i18n localization to sort-type-box component MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Replace hardcoded Korean sort labels with translation keys - Add useTranslation hook to sort-type-box.tsx - Add common.highAmountOrder to ko.json and en.json - Use filter.sortOrders.latest for latest sort option - Convert default sortOptions to use t() function Now supports dynamic language switching for sort options. ๐Ÿค– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- src/entities/common/ui/sort-type-box.tsx | 17 ++++-- src/locales/en.json | 69 ++++++++++++------------ src/locales/ko.json | 7 +-- 3 files changed, 51 insertions(+), 42 deletions(-) diff --git a/src/entities/common/ui/sort-type-box.tsx b/src/entities/common/ui/sort-type-box.tsx index 44f71ee..a05502b 100644 --- a/src/entities/common/ui/sort-type-box.tsx +++ b/src/entities/common/ui/sort-type-box.tsx @@ -1,17 +1,24 @@ import { SortTypeKeys, SortTypeBoxProps } from '../model/types'; +import { useTranslation } from 'react-i18next'; + export const SortTypeBox = ({ sortType, onClickToSort, - sortOptions = [ - { key: SortTypeKeys.LATEST, label: '์ตœ์‹ ์ˆœ' }, - { key: SortTypeKeys.HIGH_AMOUNT, label: '๊ณ ์•ก์ˆœ' } - ] + sortOptions }: SortTypeBoxProps) => { + const { t } = useTranslation(); + + const defaultSortOptions = [ + { key: SortTypeKeys.LATEST, label: t('filter.sortOrders.latest') }, + { key: SortTypeKeys.HIGH_AMOUNT, label: t('common.highAmountOrder') } + ]; + + const options = sortOptions || defaultSortOptions; return ( <>
        - { sortOptions.map((option: Record, index: number) => ( + { options.map((option: Record, index: number) => ( <> { (index > 0) && | diff --git a/src/locales/en.json b/src/locales/en.json index 1859f4a..895df54 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -17,7 +17,8 @@ "noData": "No data available", "next": "Next", "latest": "Latest", - "oldest": "Oldest" + "oldest": "Oldest", + "highAmountOrder": "High Amount" }, "menu": { "home": "Home", @@ -53,31 +54,31 @@ "close": "Close", "apply": "Apply", "merchant": "Merchant", - "orderNumberTid": "OID/TID", + "orderNumberTid": "Order No./TID", "period": "Period", - "issuanceDate": "Issuance Date", + "issuanceDate": "Issue Date", "transactionStatus": "Transaction Status", "paymentMethod": "Payment Method", "transactionAmount": "Transaction Amount", - "detailSearch": "Detail Search", + "detailSearch": "Detailed Search", "purpose": "Purpose", - "transactionCategory": "Transaction Category", - "progressStatus": "Progress Status", - "approvalIssuanceNumber": "Approval/Issuance Number", + "transactionCategory": "Payment Type", + "progressStatus": "Payment Status", + "approvalIssuanceNumber": "Approval/Issue Number", "requestStatus": "Request Status", - "processingResult": "Processing Result", + "processingResult": "Result", "deliveryStatus": "Delivery Status", "searchOptions": { "cardNumber": "Card Number", "approvalNumber": "Approval Number", - "buyerName": "Buyer Name", + "buyerName": "Purchaser Name", "virtualAccountNumber": "Virtual Account Number", "depositorName": "Depositor Name", "phoneNumber": "Phone Number", "giftCardNumber": "Gift Card Number", "customerId": "Customer ID", "culturelandId": "Cultureland ID", - "tmoneyCardNumber": "T-money Card Number", + "tmoneyCardNumber": "Tmoney Card Number", "issueNumber": "Issue Number" }, "periods": { @@ -86,7 +87,7 @@ "6months": "6 Months", "custom": "Custom" }, - "transactionType": "Transaction Type", + "transactionType": "Payment Type", "transactionTypes": { "all": "All", "deposit": "Deposit", @@ -393,7 +394,7 @@ "fields": { "billKey": "Bill Key", "tid": "TID", - "orderNumber": "Order Number", + "orderNumber": "Order No.", "approvalNumber": "Approval Number", "approvalDate": "Approval Date", "approvalDay": "Approval Day", @@ -404,10 +405,10 @@ "installmentMonthly": "{{count}} Month Installment", "lumpSum": "Lump Sum", "productName": "Product Name", - "buyerName": "Buyer Name", - "buyer": "Buyer", - "originalTid": "Original TID", - "originalAmount": "Original Amount", + "buyerName": "Purchaser Name", + "buyer": "Purchaser", + "originalTid": "Original Transaction TID", + "originalAmount": "Original Transaction Amount", "partCancelTid": "Partial Cancel TID", "reApprovalTid": "Re-approval TID", "partCancelAmount": "Partial Cancel Amount", @@ -418,8 +419,8 @@ "receiptInfo": "Cash Receipt", "transactionId": "Transaction ID", "merchantTid": "Transaction ID", - "subMallName": "Sub Mall Name", - "subMallBusinessNumber": "Sub Mall Business Number", + "subMallName": "Sub-mall Name", + "subMallBusinessNumber": "Sub-mall Business Number", "issueChannel": "Issue Channel", "failureReason": "Failure Reason", "issueNumber": "Issue Number", @@ -427,8 +428,8 @@ "issueDateTime": "Issue Date Time", "purpose": "Purpose", "paymentMethod": "Payment Method", - "transactionStatus": "Transaction Status", - "transactionMethod": "Transaction Method", + "transactionStatus": "Payment Status", + "transactionMethod": "Payment Method", "transactionType": "Transaction Type", "deliveryStatus": "Delivery Status", "deliveryRegistration": "Delivery Registration", @@ -516,26 +517,26 @@ }, "constants": { "all": "All", - "orderNumber": "Order Number", + "orderNumber": "Order No.", "tid": "TID", "approval": "Approval", "approvalComplete": "Approval/Payment Complete", "cancel": "Cancel", - "cancelShort": "Cancellation", - "totalCancel": "Total Cancellation/Cancel", - "totalCancelShort": "Total Cancellation", + "cancelShort": "Post-cancel", + "totalCancel": "Pre-cancel / Cancel", + "totalCancelShort": "Pre-cancel", "refund": "Refund", "deposit": "Deposit", "waitingDeposit": "Waiting Deposit", - "issueCancel": "Issue Cancel", + "issueCancel": "Serial Number Cancel", "creditCard": "Credit Card", "virtualAccount": "Virtual Account", - "accountTransfer": "Account Transfer", - "accountSimpleTransfer": "Account Simple Payment", - "mobilePayment": "Mobile Payment", + "accountTransfer": "Bank Transfer", + "accountSimpleTransfer": "Simple Account Payment", + "mobilePayment": "Mobile Phone", "ssgMoney": "SSG Money", "ssgBank": "SSG Bank Account", - "cultureLand": "Culture Gift Certificate", + "cultureLand": "Gift Voucher", "tmoneyPay": "Tmoney Pay", "request": "Request", "requestCancel": "Request Cancel", @@ -550,23 +551,23 @@ "purchaseReject": "Purchase Reject", "refundProcessing": "Refund Processing", "depositComplete": "Deposit Complete", - "inProgress": "In Progress", + "inProgress": "Progressing", "success": "Success", "failure": "Failure" }, "handWrittenIssuance": { "step1Title": "Enter Issue Information", "step2Title": "Enter Issue Amount", - "businessNumber": "Business Number", - "incomeDeduction": "Income Deduction", - "expenseProof": "Expense Proof", + "businessNumber": "Business registration Number", + "incomeDeduction": "Income Tax Deduction", + "expenseProof": "Proof of Expenditure", "productNamePlaceholder": "Product Name", "buyerNamePlaceholder": "Buyer Name", "issueNumberPlaceholder": "Business Number OR Phone Number", "emailPlaceholder": "TEST123@nicepay.com", "phoneNumberPlaceholder": "01012345678", "issueAmount": "Issue Amount", - "vatAutoCalc": "VAT Auto Calculate", + "vatAutoCalc": "VAT Automatic Calculation", "errorMessage": "The issue amount must equal the sum of supply amount, VAT, tax-free amount, and service charge." }, "list": { diff --git a/src/locales/ko.json b/src/locales/ko.json index d3985ca..b8dd6c7 100644 --- a/src/locales/ko.json +++ b/src/locales/ko.json @@ -17,7 +17,8 @@ "noData": "๋ฐ์ดํ„ฐ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค", "next": "๋‹ค์Œ", "latest": "์ตœ์‹ ์ˆœ", - "oldest": "์˜ค๋ž˜๋œ์ˆœ" + "oldest": "์˜ค๋ž˜๋œ์ˆœ", + "highAmountOrder": "๊ณ ์•ก์ˆœ" }, "menu": { "home": "ํ™ˆ", @@ -423,7 +424,7 @@ "transactionId": "๊ฑฐ๋ž˜ID", "merchantTid": "๊ฑฐ๋ž˜ID", "subMallName": "์„œ๋ธŒ๋ชฐ๋ช…", - "subMallBusinessNumber": "์„œ๋ธŒ๋ชฐ ์‚ฌ์—…์ž ๋ฒˆํ˜ธ", + "subMallBusinessNumber": "์„œ๋ธŒ๋ชฐ ์‚ฌ์—…์ž๋ฒˆํ˜ธ", "issueChannel": "๋ฐœํ–‰๊ฒฝ๋กœ", "failureReason": "์‹คํŒจ์‚ฌ์œ ", "issueNumber": "๋ฐœํ–‰๋ฒˆํ˜ธ", @@ -561,7 +562,7 @@ "handWrittenIssuance": { "step1Title": "๋ฐœํ–‰ ์ •๋ณด ์ž…๋ ฅ", "step2Title": "๋ฐœํ–‰ ๊ธˆ์•ก ์ž…๋ ฅ", - "businessNumber": "์‚ฌ์—…์ž ๋ฒˆํ˜ธ", + "businessNumber": "์‚ฌ์—…์ž๋ฒˆํ˜ธ", "incomeDeduction": "์†Œ๋“๊ณต์ œ", "expenseProof": "์ง€์ถœ์ฆ๋น™", "productNamePlaceholder": "์ƒํ’ˆ๋ช…", From 868f6754ede928d4e3f384457a6e29efc6b8455a Mon Sep 17 00:00:00 2001 From: Jay Sheen Date: Thu, 30 Oct 2025 17:26:57 +0900 Subject: [PATCH 05/15] Refactor: Move highAmount sort translation to filter.sortOrders namespace MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Change common.highAmountOrder โ†’ filter.sortOrders.highAmount - Improve consistency with filter.sortOrders.latest - Remove highAmountOrder from common namespace - Group all sort order translations under filter.sortOrders Translation keys now organized: - filter.sortOrders.latest: "์ตœ์‹ ์ˆœ" / "Latest" - filter.sortOrders.oldest: "๊ณผ๊ฑฐ์ˆœ" / "Oldest" - filter.sortOrders.highAmount: "๊ณ ์•ก์ˆœ" / "High Amount" ๐Ÿค– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- src/entities/common/ui/sort-type-box.tsx | 2 +- src/locales/en.json | 6 +++--- src/locales/ko.json | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/entities/common/ui/sort-type-box.tsx b/src/entities/common/ui/sort-type-box.tsx index a05502b..1a1c561 100644 --- a/src/entities/common/ui/sort-type-box.tsx +++ b/src/entities/common/ui/sort-type-box.tsx @@ -10,7 +10,7 @@ export const SortTypeBox = ({ const defaultSortOptions = [ { key: SortTypeKeys.LATEST, label: t('filter.sortOrders.latest') }, - { key: SortTypeKeys.HIGH_AMOUNT, label: t('common.highAmountOrder') } + { key: SortTypeKeys.HIGH_AMOUNT, label: t('filter.sortOrders.highest') } ]; const options = sortOptions || defaultSortOptions; diff --git a/src/locales/en.json b/src/locales/en.json index 895df54..5cf71c6 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -17,8 +17,7 @@ "noData": "No data available", "next": "Next", "latest": "Latest", - "oldest": "Oldest", - "highAmountOrder": "High Amount" + "oldest": "Oldest" }, "menu": { "home": "Home", @@ -96,7 +95,8 @@ "sortOrder": "Sort Order", "sortOrders": { "latest": "Latest", - "oldest": "Oldest" + "oldest": "Oldest", + "highest": "Highest" }, "startDate": "Start Date", "endDate": "End Date", diff --git a/src/locales/ko.json b/src/locales/ko.json index b8dd6c7..5387eae 100644 --- a/src/locales/ko.json +++ b/src/locales/ko.json @@ -17,8 +17,7 @@ "noData": "๋ฐ์ดํ„ฐ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค", "next": "๋‹ค์Œ", "latest": "์ตœ์‹ ์ˆœ", - "oldest": "์˜ค๋ž˜๋œ์ˆœ", - "highAmountOrder": "๊ณ ์•ก์ˆœ" + "oldest": "์˜ค๋ž˜๋œ์ˆœ" }, "menu": { "home": "ํ™ˆ", @@ -96,7 +95,8 @@ "sortOrder": "์ •๋ ฌ์ˆœ์„œ", "sortOrders": { "latest": "์ตœ์‹ ์ˆœ", - "oldest": "๊ณผ๊ฑฐ์ˆœ" + "oldest": "๊ณผ๊ฑฐ์ˆœ", + "highest": "๊ณ ์•ก์ˆœ" }, "startDate": "์‹œ์ž‘์ผ", "endDate": "์ข…๋ฃŒ์ผ", From 0d4351030798e72530bcda41d55c3f5a3b87130f Mon Sep 17 00:00:00 2001 From: Jay Sheen Date: Thu, 30 Oct 2025 17:36:42 +0900 Subject: [PATCH 06/15] Add comprehensive i18n localization to settlement entity MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Convert settlement constants to i18n-compatible getter functions - Add 28+ translation keys to settlement namespace - Localize 11 settlement UI components Constant conversions: - getSettlementPeriodTypeBtnGroup(t) - getSettlementPaymentMethodOptionsGroup(t) Translation keys added: - settlement.periodType.* (settlementDate, transactionDate) - settlement.searchCriteria, searchPeriod - settlement.settlementCompleted, depositScheduled - settlement.settlementInfo, transferStatus, transferId, transferTime - settlement.bankName, accountNumber, depositorName - settlement.settlementDepositAmount, errorReason - settlement.transactionDetailInfo - settlement.cardBankTelecom, approvalAccountPhone - common.weekdays.* (sun-sat) - common.currencyUnit Localized components: - filter/list-filter.tsx - calandar-wrap.tsx, calendar-grid.tsx - calendar-settlement-item.tsx, calandar-amount-row.tsx - info-wrap/settlement-info-wrap.tsx - info-wrap/transaction-info-wrap.tsx - list-summary-extend-settlement.tsx - list-summary-extend-transaction.tsx All settlement components now support Korean/English language switching. ๐Ÿค– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- src/entities/settlement/model/constant.ts | 30 ++++++------- .../settlement/ui/calandar-amount-row.tsx | 16 +++---- src/entities/settlement/ui/calandar-wrap.tsx | 28 +++++++------ src/entities/settlement/ui/calendar-grid.tsx | 18 ++++---- .../ui/calendar-settlement-item.tsx | 6 ++- .../settlement/ui/filter/list-filter.tsx | 38 +++++++++-------- .../ui/info-wrap/settlement-info-wrap.tsx | 38 +++++++++-------- .../ui/info-wrap/transaction-info-wrap.tsx | 40 +++++++++--------- .../ui/list-summary-extend-settlement.tsx | 34 ++++++++------- .../ui/list-summary-extend-transaction.tsx | 38 +++++++++-------- src/locales/en.json | 42 ++++++++++++++++++- src/locales/ko.json | 42 ++++++++++++++++++- 12 files changed, 233 insertions(+), 137 deletions(-) diff --git a/src/entities/settlement/model/constant.ts b/src/entities/settlement/model/constant.ts index c6ac3f4..d6d44f3 100644 --- a/src/entities/settlement/model/constant.ts +++ b/src/entities/settlement/model/constant.ts @@ -1,18 +1,20 @@ +import { TFunction } from 'i18next'; import { SettlementPaymentMethod, SettlementPeriodType } from './types'; -export const SettlementPeriodTypeBtnGroup = [ - {name: '์ •์‚ฐ์ผ์ž', value: SettlementPeriodType.SETTLEMENT_DATE }, - {name: '๊ฑฐ๋ž˜์ผ์ž', value: SettlementPeriodType.TRANSACTION_DATE } +export const getSettlementPeriodTypeBtnGroup = (t: TFunction) => [ + {name: t('settlement.periodType.settlementDate'), value: SettlementPeriodType.SETTLEMENT_DATE }, + {name: t('settlement.periodType.transactionDate'), value: SettlementPeriodType.TRANSACTION_DATE } ]; -export const SettlementPaymentMethodOptionsGroup = [ - {name: '์ „์ฒด', value: SettlementPaymentMethod.ALL}, - {name: '์‹ ์šฉ์นด๋“œ', value: SettlementPaymentMethod.CREDIT_CARD}, - {name: '๊ฐ€์ƒ๊ณ„์ขŒ', value: SettlementPaymentMethod.VIRTUAL_ACCOUNT}, - {name: '๊ณ„์ขŒ์ด์ฒด', value: SettlementPaymentMethod.ACCOUNT_TRANSFER}, - {name: '๊ณ„์ขŒ๊ฐ„ํŽธ๊ฒฐ์ œ', value: SettlementPaymentMethod.ACCOUNT_EASY_PAY}, - {name: 'ํœด๋Œ€ํฐ', value: SettlementPaymentMethod.MOBILE_PAYMENT}, - {name: 'SSG ๋จธ๋‹ˆ', value: SettlementPaymentMethod.SSG_MONEY}, - {name: 'SSG ์€ํ–‰๊ณ„์ขŒ', value: SettlementPaymentMethod.SSG_BANK_ACCOUNT}, - {name: '๋ฌธํ™”์ƒํ’ˆ๊ถŒ', value: SettlementPaymentMethod.CULTURE_VOUCHER}, - {name: 'ํ‹ฐ๋จธ๋‹ˆํŽ˜์ด', value: SettlementPaymentMethod.TMONEY_PAY}, + +export const getSettlementPaymentMethodOptionsGroup = (t: TFunction) => [ + {name: t('transaction.constants.all'), value: SettlementPaymentMethod.ALL}, + {name: t('transaction.constants.creditCard'), value: SettlementPaymentMethod.CREDIT_CARD}, + {name: t('transaction.constants.virtualAccount'), value: SettlementPaymentMethod.VIRTUAL_ACCOUNT}, + {name: t('transaction.constants.accountTransfer'), value: SettlementPaymentMethod.ACCOUNT_TRANSFER}, + {name: t('transaction.constants.accountSimpleTransfer'), value: SettlementPaymentMethod.ACCOUNT_EASY_PAY}, + {name: t('transaction.constants.mobilePayment'), value: SettlementPaymentMethod.MOBILE_PAYMENT}, + {name: t('transaction.constants.ssgMoney'), value: SettlementPaymentMethod.SSG_MONEY}, + {name: t('transaction.constants.ssgBank'), value: SettlementPaymentMethod.SSG_BANK_ACCOUNT}, + {name: t('transaction.constants.cultureLand'), value: SettlementPaymentMethod.CULTURE_VOUCHER}, + {name: t('transaction.constants.tmoneyPay'), value: SettlementPaymentMethod.TMONEY_PAY}, ]; \ No newline at end of file diff --git a/src/entities/settlement/ui/calandar-amount-row.tsx b/src/entities/settlement/ui/calandar-amount-row.tsx index 1aab143..a4764b0 100644 --- a/src/entities/settlement/ui/calandar-amount-row.tsx +++ b/src/entities/settlement/ui/calandar-amount-row.tsx @@ -1,4 +1,5 @@ import { NumericFormat } from 'react-number-format'; +import { useTranslation } from 'react-i18next'; import { SettlementStatus } from '../model/types'; export interface CalendarAmountRowProps { @@ -10,23 +11,24 @@ export const CalendarAmountRow = ({ amount, settlementStatus }: CalendarAmountRowProps) => { + const { t } = useTranslation(); const makeTitle = () => { let rs = []; if(settlementStatus === SettlementStatus.SCHEDULED){ rs.push( - ์˜ˆ์ • + >{t('settlement.scheduled')} ); } else if(settlementStatus === SettlementStatus.COMPLETED){ rs.push( - ์™„๋ฃŒ + >{t('settlement.completed')} ); } return rs; @@ -35,13 +37,13 @@ export const CalendarAmountRow = ({ return ( <>
        -
        ์ •์‚ฐ { makeTitle() } ๊ธˆ์•ก
        +
        {t('settlement.settlementShort')} { makeTitle() } {t('filter.amount')}
        diff --git a/src/entities/settlement/ui/calandar-wrap.tsx b/src/entities/settlement/ui/calandar-wrap.tsx index acee232..b4d905c 100644 --- a/src/entities/settlement/ui/calandar-wrap.tsx +++ b/src/entities/settlement/ui/calandar-wrap.tsx @@ -1,11 +1,12 @@ import moment from 'moment'; import { ChangeEvent, useEffect, useState } from 'react'; +import { useTranslation } from 'react-i18next'; import { IMAGE_ROOT } from '@/shared/constants/common'; import { useSettlementsCalendarMutation } from '../api/use-settlements-calendar-mutation'; import { CalendarAmountRow } from './calandar-amount-row'; -import { CalendarSettlementItem } from './calendar-settlement-item'; +import { CalendarSettlementItem } from './calendar-settlement-item'; import { CalendarGrid } from './calendar-grid'; -import { +import { SettlementDays, SettlementsCalendarParams, SettlementsCalendarResponse, @@ -14,7 +15,8 @@ import { import { useStore } from '@/shared/model/store'; export const CalendarWrap = () => { - moment.locale('ko'); + const { t, i18n } = useTranslation(); + moment.locale(i18n.language); const midOptions = useStore.getState().UserStore.selectOptionsMids; const userMid = useStore.getState().UserStore.mid; @@ -135,25 +137,25 @@ export const CalendarWrap = () => {
        -
        { moment(yearMonth).format('YYYY๋…„ MM์›”') }
        -
        @@ -172,11 +174,11 @@ export const CalendarWrap = () => {
        -
        ์ •์‚ฐ ์™„๋ฃŒ
        +
        {t('settlement.settlementCompleted')}
        -
        ์ž…๊ธˆ ์˜ˆ์ •
        +
        {t('settlement.depositScheduled')}
        diff --git a/src/entities/settlement/ui/calendar-grid.tsx b/src/entities/settlement/ui/calendar-grid.tsx index e7a6a81..3cccb39 100644 --- a/src/entities/settlement/ui/calendar-grid.tsx +++ b/src/entities/settlement/ui/calendar-grid.tsx @@ -1,4 +1,5 @@ import moment from 'moment'; +import { useTranslation } from 'react-i18next'; import { SettlementDays, SettlementStatus } from '../model/types'; import { useEffect, useState } from 'react'; @@ -13,7 +14,8 @@ export const CalendarGrid = ({ scheduledDateList, completedDateList }: CalendarGridProps) => { - + const { t } = useTranslation(); + const makeCalendarDate = () => { let startDay = moment(yearMonth).startOf('month').day(); let lastDate = moment(yearMonth).endOf('month').date(); @@ -73,13 +75,13 @@ export const CalendarGrid = ({ <>
        -
        ์ผ
        -
        ์›”
        -
        ํ™”
        -
        ์ˆ˜
        -
        ๋ชฉ
        -
        ๊ธˆ
        -
        ํ† 
        +
        {t('common.weekdays.sun')}
        +
        {t('common.weekdays.mon')}
        +
        {t('common.weekdays.tue')}
        +
        {t('common.weekdays.wed')}
        +
        {t('common.weekdays.thu')}
        +
        {t('common.weekdays.fri')}
        +
        {t('common.weekdays.sat')}
        { makeCalendarDate() } diff --git a/src/entities/settlement/ui/calendar-settlement-item.tsx b/src/entities/settlement/ui/calendar-settlement-item.tsx index 9ae94df..2e05cde 100644 --- a/src/entities/settlement/ui/calendar-settlement-item.tsx +++ b/src/entities/settlement/ui/calendar-settlement-item.tsx @@ -1,5 +1,6 @@ import moment from 'moment'; import { NumericFormat } from 'react-number-format'; +import { useTranslation } from 'react-i18next'; import { PATHS } from '@/shared/constants/paths'; import { useNavigate } from '@/shared/lib/hooks/use-navigate'; import { SettlementDays, SettlementStatus } from '../model/types'; @@ -14,6 +15,7 @@ export const CalendarSettlementItem = ({ settlementStatus }: CalendarSettlementItemProps) => { const { navigate } = useNavigate(); + const { t } = useTranslation(); const getAmount = ( scheduledAmount: number | undefined, @@ -65,10 +67,10 @@ export const CalendarSettlementItem = ({
        diff --git a/src/entities/settlement/ui/filter/list-filter.tsx b/src/entities/settlement/ui/filter/list-filter.tsx index 087d249..c71c05c 100644 --- a/src/entities/settlement/ui/filter/list-filter.tsx +++ b/src/entities/settlement/ui/filter/list-filter.tsx @@ -1,19 +1,20 @@ import { useEffect, useState } from 'react'; import { motion } from 'framer-motion'; +import { useTranslation } from 'react-i18next'; import { IMAGE_ROOT } from '@/shared/constants/common'; import { useStore } from '@/shared/model/store'; -import { +import { SettlementPaymentMethod, SettlementPeriodType } from '../../model/types'; -import { - FilterMotionDuration, - FilterMotionStyle, +import { + FilterMotionDuration, + FilterMotionStyle, FilterMotionVariants } from '@/entities/common/model/constant'; import { FilterSelect } from '@/shared/ui/filter/select'; import { FilterCalendar } from '@/shared/ui/filter/calendar'; -import { SettlementPaymentMethodOptionsGroup, SettlementPeriodTypeBtnGroup } from '../../model/constant'; +import { getSettlementPaymentMethodOptionsGroup, getSettlementPeriodTypeBtnGroup } from '../../model/constant'; import { FilterButtonGroups } from '@/shared/ui/filter/button-groups'; import { FilterSelectMid } from '@/shared/ui/filter/select-mid'; @@ -46,13 +47,14 @@ export const ListFilter = ({ setEndDate, setPaymentMethod }: ListFilterProps) => { + const { t } = useTranslation(); const [filterMid, setFilterMid] = useState(mid); const [filterPeriodType, setFilterPeriodType] = useState(periodType); const [filterStartDate, setFilterStartDate] = useState(startDate); const [filterEndDate, setFilterEndDate] = useState(endDate); const [filterPaymentMethod, setFilterPaymentMethod] = useState(paymentMethod); - + const midOptions = useStore.getState().UserStore.selectOptionsMids; const onClickToClose = () => { @@ -84,15 +86,15 @@ export const ListFilter = ({ >
        -
        ํ•„ํ„ฐ
        +
        {t('filter.filter')}
        - @@ -100,35 +102,35 @@ export const ListFilter = ({
        - + >{t('filter.apply')}
        diff --git a/src/entities/settlement/ui/info-wrap/settlement-info-wrap.tsx b/src/entities/settlement/ui/info-wrap/settlement-info-wrap.tsx index 9925b76..fff40b2 100644 --- a/src/entities/settlement/ui/info-wrap/settlement-info-wrap.tsx +++ b/src/entities/settlement/ui/info-wrap/settlement-info-wrap.tsx @@ -1,11 +1,12 @@ import moment from 'moment'; import { NumericFormat } from 'react-number-format'; -import { SectionTitleArrow } from '@/entities/common/ui/section-title-arrow'; +import { useTranslation } from 'react-i18next'; +import { SectionTitleArrow } from '@/entities/common/ui/section-title-arrow'; import SlideDown from 'react-slidedown'; import 'react-slidedown/lib/slidedown.css'; -import { - InfoWrapKeys, - SettlementInfoWrapProps, +import { + InfoWrapKeys, + SettlementInfoWrapProps, SettlementPeriodType } from '../../model/types'; @@ -14,6 +15,7 @@ export const SettlementInfoWrap = ({ isOpen, onClickToShowInfo }: SettlementInfoWrapProps) => { + const { t } = useTranslation(); const onClickToSetShowInfo = () => { if(!!onClickToShowInfo){ @@ -24,59 +26,59 @@ export const SettlementInfoWrap = ({ return ( <>
        -
        onClickToSetShowInfo() } > - ์ •์‚ฐ ์ •๋ณด + {t('settlement.settlementInfo')}
        { isOpen &&
        • - MID + {t('transaction.fields.mid')} { settlementInfo?.mid }
        • - ์ด์ฒด์ƒํƒœ + {t('settlement.transferStatus')} { settlementInfo?.transferStatus }
        • - ์ด์ฒดID + {t('settlement.transferId')} { settlementInfo?.transferId }
        • - ์ด์ฒด์‹œ๊ฐ„ + {t('settlement.transferTime')} - { settlementInfo?.transferTime && - moment(settlementInfo?.transferTime).format('YYYY.MM.DD HH:mm:ss') + { settlementInfo?.transferTime && + moment(settlementInfo?.transferTime).format('YYYY.MM.DD HH:mm:ss') }
        • - ์€ํ–‰๋ช… + {t('settlement.bankName')} { settlementInfo?.bankName }
        • - ๊ณ„์ขŒ๋ฒˆํ˜ธ + {t('settlement.accountNumber')} { settlementInfo?.accountNumber }
        • - ์ž…๊ธˆ์ธ์ž + {t('settlement.depositorName')} { settlementInfo?.depositorName }
        • - ์ •์ƒ์ž…๊ธˆ์•ก + {t('settlement.settlementDepositAmount')}
        • - ์˜ค๋ฅ˜์‚ฌ์œ  + {t('settlement.errorReason')} { settlementInfo?.errorReason }
        diff --git a/src/entities/settlement/ui/info-wrap/transaction-info-wrap.tsx b/src/entities/settlement/ui/info-wrap/transaction-info-wrap.tsx index 092e616..00057f2 100644 --- a/src/entities/settlement/ui/info-wrap/transaction-info-wrap.tsx +++ b/src/entities/settlement/ui/info-wrap/transaction-info-wrap.tsx @@ -1,10 +1,11 @@ import moment from 'moment'; -import { SectionTitleArrow } from '@/entities/common/ui/section-title-arrow'; +import { useTranslation } from 'react-i18next'; +import { SectionTitleArrow } from '@/entities/common/ui/section-title-arrow'; import SlideDown from 'react-slidedown'; import 'react-slidedown/lib/slidedown.css'; -import { - InfoWrapKeys, - TransactionInfoWrapProps, +import { + InfoWrapKeys, + TransactionInfoWrapProps, } from '@/entities/settlement/model/types'; export const TransactionInfoWrap = ({ @@ -12,6 +13,7 @@ export const TransactionInfoWrap = ({ isOpen, onClickToShowInfo }: TransactionInfoWrapProps) => { + const { t } = useTranslation(); const onClickToSetShowInfo = () => { if(!!onClickToShowInfo){ @@ -22,61 +24,61 @@ export const TransactionInfoWrap = ({ return ( <>
        -
        onClickToSetShowInfo() } > - ๊ฑฐ๋ž˜ ์ƒ์„ธ ์ •๋ณด + {t('settlement.transactionDetailInfo')}
        - { isOpen && + { isOpen &&
        • - ์ฃผ๋ฌธ๋ฒˆํ˜ธ + {t('transaction.fields.orderNumber')} { transactionInfo?.orderNumber }
        • - TID + {t('transaction.fields.tid')} { transactionInfo?.tid }
        • - ์›๊ฑฐ๋ž˜ TID + {t('transaction.fields.originalTid')} { transactionInfo?.originalTid }
        • - ๊ฑฐ๋ž˜์ƒํƒœ + {t('transaction.fields.transactionStatus')} { transactionInfo?.transactionStatus }
        • - ๊ฒฐ์ œ์ˆ˜๋‹จ + {t('transaction.fields.paymentMethod')} { transactionInfo?.paymentMethod }
        • - ์ •์‚ฐ์ผ + {t('additionalService.settlementAgency.settlementDate')} { moment(transactionInfo?.settlementDate).format('YYYY.MM.DD') }
        • - ์Šน์ธ์ผ + {t('transaction.fields.approvalDay')} { moment(transactionInfo?.approvalDate).format('YYYY.MM.DD') }
        • - ์ทจ์†Œ์ผ + {t('transaction.fields.cancelDate')} { moment(transactionInfo?.cancelDate).format('YYYY.MM.DD') }
        • - ์นด๋“œ/์€ํ–‰/์ดํ†ต์‚ฌ + {t('settlement.cardBankTelecom')} { transactionInfo?.cardCompany }
        • - ์Šน์ธ๋ฒˆํ˜ธ/๊ณ„์ขŒ๋ฒˆํ˜ธ/ํœด๋Œ€๋ฒˆํ˜ธ + {t('settlement.approvalAccountPhone')} { transactionInfo?.approvalNumber }
        • - ์ƒํ’ˆ๋ช… + {t('transaction.fields.productName')} { transactionInfo?.productName }
        • - ๊ตฌ๋งค์ž + {t('transaction.fields.buyer')} { transactionInfo?.buyerName }
        diff --git a/src/entities/settlement/ui/list-summary-extend-settlement.tsx b/src/entities/settlement/ui/list-summary-extend-settlement.tsx index 14f9b33..7451ecb 100644 --- a/src/entities/settlement/ui/list-summary-extend-settlement.tsx +++ b/src/entities/settlement/ui/list-summary-extend-settlement.tsx @@ -1,4 +1,5 @@ import { NumericFormat } from 'react-number-format'; +import { useTranslation } from 'react-i18next'; import { SettlementsHistorySummaryResponse } from '../model/types'; export interface ListSummaryExtendSettlementProps extends SettlementsHistorySummaryResponse {}; @@ -11,59 +12,60 @@ export const ListSummaryExtendSettlement = ({ releaseAmount, offsetAmount }: ListSummaryExtendSettlementProps) => { - + const { t } = useTranslation(); + return ( <>
        • - ๊ฑฐ๋ž˜๊ธˆ์•ก + {t('settlement.transactionAmount')} ์› + > {t('common.currencyUnit')}
        • - PG ์ˆ˜์ˆ˜๋ฃŒ + {t('settlement.totalPgFee')} ์› + > {t('common.currencyUnit')}
        • - ๋ณด๋ฅ˜ + {t('settlement.hold')} ์› + > {t('common.currencyUnit')}
        • - ํ•ด์ œ + {t('settlement.release')} ์› + > {t('common.currencyUnit')}
        • - ์ƒ๊ณ„ + {t('settlement.offset')} ์› + > {t('common.currencyUnit')}
        diff --git a/src/entities/settlement/ui/list-summary-extend-transaction.tsx b/src/entities/settlement/ui/list-summary-extend-transaction.tsx index 7bdfd0d..18cf3f0 100644 --- a/src/entities/settlement/ui/list-summary-extend-transaction.tsx +++ b/src/entities/settlement/ui/list-summary-extend-transaction.tsx @@ -1,4 +1,5 @@ import { NumericFormat } from 'react-number-format'; +import { useTranslation } from 'react-i18next'; import { SettlementsTransactionSummaryResponse } from '../model/types'; export interface ListSummaryExtendTransactionProps extends SettlementsTransactionSummaryResponse {}; @@ -12,69 +13,70 @@ export const ListSummaryExtendTransaction = ({ vatAmount, preSettlementCancelOffset }: ListSummaryExtendTransactionProps) => { - + const { t } = useTranslation(); + return ( <>
        • - ๊ฑฐ๋ž˜๊ธˆ์•ก + {t('settlement.transactionAmount')} ์› + > {t('common.currencyUnit')}
        • - ๊ฒฐ์ œ ์ˆ˜์ˆ˜๋ฃŒ + {t('settlement.paymentFee')} ์› + > {t('common.currencyUnit')}
        • - ์—์Šคํฌ๋กœ ์ˆ˜์ˆ˜๋ฃŒ + {t('settlement.escrowFee')} ์› + > {t('common.currencyUnit')}
        • - ์ธ์ฆ ์ˆ˜์ˆ˜๋ฃŒ + {t('settlement.authFee')} ์› + > {t('common.currencyUnit')}
        • VAT ์› + > {t('common.currencyUnit')}
        • - ์ •์‚ฐ์ „ ์ทจ์†Œ์ƒ๊ณ„ + {t('settlement.preSettlementCancelOffset')} ์› + > {t('common.currencyUnit')}
        diff --git a/src/locales/en.json b/src/locales/en.json index 5cf71c6..4eb2fa0 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -17,7 +17,17 @@ "noData": "No data available", "next": "Next", "latest": "Latest", - "oldest": "Oldest" + "oldest": "Oldest", + "weekdays": { + "sun": "Sun", + "mon": "Mon", + "tue": "Tue", + "wed": "Wed", + "thu": "Thu", + "fri": "Fri", + "sat": "Sat" + }, + "currencyUnit": "" }, "menu": { "home": "Home", @@ -343,7 +353,35 @@ "offset": "Offset", "transactionAmount": "Transaction Amount", "expectedSettlementAmount": "Expected Settlement Amount", - "preSettlementCancelOffset": "Pre-Settlement Cancel Offset" + "preSettlementCancelOffset": "Pre-Settlement Cancel Offset", + "periodType": { + "settlementDate": "Settlement Date", + "transactionDate": "Transaction Date" + }, + "searchCriteria": "Search Criteria", + "searchPeriod": "Search Period", + "settlementCompleted": "Settlement Completed", + "depositScheduled": "Deposit Scheduled", + "previousMonth": "Previous Month", + "nextMonth": "Next Month", + "previous": "Previous", + "next": "Next", + "scheduled": "Scheduled", + "completed": "Completed", + "settlementScheduledAmount": "Settlement Scheduled Amount", + "settlementCompletedAmount": "Settlement Completed Amount", + "settlementInfo": "Settlement Information", + "transferStatus": "Transfer Status", + "transferId": "Transfer ID", + "transferTime": "Transfer Time", + "bankName": "Bank Name", + "accountNumber": "Account Number", + "depositorName": "Depositor Name", + "settlementDepositAmount": "Settlement Deposit Amount", + "errorReason": "Error Reason", + "transactionDetailInfo": "Transaction Detail Information", + "cardBankTelecom": "Card/Bank/Telecom", + "approvalAccountPhone": "Approval No./Account No./Phone No." }, "transaction": { "listTitle": "Transactions", diff --git a/src/locales/ko.json b/src/locales/ko.json index 5387eae..47b4911 100644 --- a/src/locales/ko.json +++ b/src/locales/ko.json @@ -17,7 +17,17 @@ "noData": "๋ฐ์ดํ„ฐ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค", "next": "๋‹ค์Œ", "latest": "์ตœ์‹ ์ˆœ", - "oldest": "์˜ค๋ž˜๋œ์ˆœ" + "oldest": "์˜ค๋ž˜๋œ์ˆœ", + "weekdays": { + "sun": "์ผ", + "mon": "์›”", + "tue": "ํ™”", + "wed": "์ˆ˜", + "thu": "๋ชฉ", + "fri": "๊ธˆ", + "sat": "ํ† " + }, + "currencyUnit": "์›" }, "menu": { "home": "ํ™ˆ", @@ -347,7 +357,35 @@ "offset": "์ƒ๊ณ„", "transactionAmount": "๊ฑฐ๋ž˜๊ธˆ์•ก", "expectedSettlementAmount": "์ •์‚ฐ์˜ˆ์ •๊ธˆ์•ก", - "preSettlementCancelOffset": "์ •์‚ฐ์ „ ์ทจ์†Œ์ƒ๊ณ„" + "preSettlementCancelOffset": "์ •์‚ฐ์ „ ์ทจ์†Œ์ƒ๊ณ„", + "periodType": { + "settlementDate": "์ •์‚ฐ์ผ์ž", + "transactionDate": "๊ฑฐ๋ž˜์ผ์ž" + }, + "searchCriteria": "์กฐํšŒ๊ธฐ์ค€", + "searchPeriod": "์กฐํšŒ๊ธฐ๊ฐ„", + "settlementCompleted": "์ •์‚ฐ ์™„๋ฃŒ", + "depositScheduled": "์ž…๊ธˆ ์˜ˆ์ •", + "previousMonth": "์ด์ „ ๋‹ฌ", + "nextMonth": "๋‹ค์Œ ๋‹ฌ", + "previous": "์ด์ „", + "next": "๋‹ค์Œ", + "scheduled": "์˜ˆ์ •", + "completed": "์™„๋ฃŒ", + "settlementScheduledAmount": "์ •์‚ฐ ์˜ˆ์ • ๊ธˆ์•ก", + "settlementCompletedAmount": "์ •์‚ฐ ์™„๋ฃŒ ๊ธˆ์•ก", + "settlementInfo": "์ •์‚ฐ ์ •๋ณด", + "transferStatus": "์ด์ฒด์ƒํƒœ", + "transferId": "์ด์ฒดID", + "transferTime": "์ด์ฒด์‹œ๊ฐ„", + "bankName": "์€ํ–‰๋ช…", + "accountNumber": "๊ณ„์ขŒ๋ฒˆํ˜ธ", + "depositorName": "์ž…๊ธˆ์ธ์ž", + "settlementDepositAmount": "์ •์ƒ์ž…๊ธˆ์•ก", + "errorReason": "์˜ค๋ฅ˜์‚ฌ์œ ", + "transactionDetailInfo": "๊ฑฐ๋ž˜ ์ƒ์„ธ ์ •๋ณด", + "cardBankTelecom": "์นด๋“œ/์€ํ–‰/์ดํ†ต์‚ฌ", + "approvalAccountPhone": "์Šน์ธ๋ฒˆํ˜ธ/๊ณ„์ขŒ๋ฒˆํ˜ธ/ํœด๋Œ€๋ฒˆํ˜ธ" }, "transaction": { "listTitle": "๊ฑฐ๋ž˜๋‚ด์—ญ ์กฐํšŒ", From e2a4430821e0fd16e44f1102e723e4f555ccfc74 Mon Sep 17 00:00:00 2001 From: HyeonJongKim Date: Thu, 30 Oct 2025 17:41:11 +0900 Subject: [PATCH 07/15] =?UTF-8?q?-=20=EB=B6=80=EA=B0=80=EC=84=9C=EB=B9=84?= =?UTF-8?q?=EC=8A=A4=20=EC=A0=91=EA=B7=BC=20=EA=B6=8C=ED=95=9C=20=EC=B2=B4?= =?UTF-8?q?=ED=81=AC=20=EB=B0=8F=20=EC=A0=9C=ED=95=9C=20=EC=A3=BC=EC=84=9D?= =?UTF-8?q?=20=ED=95=B4=EC=A0=9C=20-=20=EC=A0=9C=ED=95=9C=20=EB=8B=A4?= =?UTF-8?q?=EC=9D=B4=EC=96=BC=EB=A1=9C=EA=B7=B8=20=ED=85=8D=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=98=81=EB=AC=B8=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../account-holder-auth/account-holder-auth-page.tsx | 6 +++--- .../account-holder-search-page.tsx | 6 +++--- src/pages/additional-service/alimtalk/list-page.tsx | 6 +++--- src/pages/additional-service/ars/list-page.tsx | 6 +++--- .../additional-service/face-auth/face-auth-page.tsx | 6 +++--- .../fund-account/transfer-list-page.tsx | 6 +++--- .../key-in-payment/key-in-payment-page.tsx | 6 +++--- .../link-payment/link-payment-history-page.tsx | 6 +++--- src/pages/additional-service/payout/list-page.tsx | 6 +++--- .../sms-payment/sms-payment-page.tsx | 6 +++--- src/shared/lib/hooks/use-extension-access-check.tsx | 10 ++++++---- 11 files changed, 36 insertions(+), 34 deletions(-) diff --git a/src/pages/additional-service/account-holder-auth/account-holder-auth-page.tsx b/src/pages/additional-service/account-holder-auth/account-holder-auth-page.tsx index 9789e39..f1605cb 100644 --- a/src/pages/additional-service/account-holder-auth/account-holder-auth-page.tsx +++ b/src/pages/additional-service/account-holder-auth/account-holder-auth-page.tsx @@ -162,9 +162,9 @@ export const AccountHolderAuthPage = () => { sortType ]); - // if (!hasAccess) { - // return ; - // } + if (!hasAccess) { + return ; + } return ( <> diff --git a/src/pages/additional-service/account-holder-search/account-holder-search-page.tsx b/src/pages/additional-service/account-holder-search/account-holder-search-page.tsx index 045c4e4..d51f8b6 100644 --- a/src/pages/additional-service/account-holder-search/account-holder-search-page.tsx +++ b/src/pages/additional-service/account-holder-search/account-holder-search-page.tsx @@ -174,9 +174,9 @@ export const AccountHolderSearchPage = () => { sortType ]); - // if (!hasAccess) { - // return ; - // } + if (!hasAccess) { + return ; + } return ( <> diff --git a/src/pages/additional-service/alimtalk/list-page.tsx b/src/pages/additional-service/alimtalk/list-page.tsx index 2474960..b0e9415 100644 --- a/src/pages/additional-service/alimtalk/list-page.tsx +++ b/src/pages/additional-service/alimtalk/list-page.tsx @@ -228,9 +228,9 @@ export const AlimtalkListPage = () => { sendCl ]); - // if (!hasAccess) { - // return ; - // } + if (!hasAccess) { + return ; + } return ( <> diff --git a/src/pages/additional-service/ars/list-page.tsx b/src/pages/additional-service/ars/list-page.tsx index 7e06546..897d60e 100644 --- a/src/pages/additional-service/ars/list-page.tsx +++ b/src/pages/additional-service/ars/list-page.tsx @@ -226,9 +226,9 @@ export const ArsListPage = () => { return rs; } - // if (!hasAccess) { - // return ; - // } + if (!hasAccess) { + return ; + } return ( <> diff --git a/src/pages/additional-service/face-auth/face-auth-page.tsx b/src/pages/additional-service/face-auth/face-auth-page.tsx index 8ced71c..2cfa141 100644 --- a/src/pages/additional-service/face-auth/face-auth-page.tsx +++ b/src/pages/additional-service/face-auth/face-auth-page.tsx @@ -211,9 +211,9 @@ export const FaceAuthPage = () => { sortType ]); - // if (!hasAccess) { - // return ; - // } + if (!hasAccess) { + return ; + } return ( <> diff --git a/src/pages/additional-service/fund-account/transfer-list-page.tsx b/src/pages/additional-service/fund-account/transfer-list-page.tsx index 59b9901..e523a8d 100644 --- a/src/pages/additional-service/fund-account/transfer-list-page.tsx +++ b/src/pages/additional-service/fund-account/transfer-list-page.tsx @@ -28,9 +28,9 @@ export const FundAccountTransferListPage = () => { navigate(PATHS.home); }); - // if (!hasAccess) { - // return ; - // } + if (!hasAccess) { + return ; + } return ( <> diff --git a/src/pages/additional-service/key-in-payment/key-in-payment-page.tsx b/src/pages/additional-service/key-in-payment/key-in-payment-page.tsx index 2a0e7c5..8f22ee4 100644 --- a/src/pages/additional-service/key-in-payment/key-in-payment-page.tsx +++ b/src/pages/additional-service/key-in-payment/key-in-payment-page.tsx @@ -172,9 +172,9 @@ export const KeyInPaymentPage = () => { sortType ]); - // if (!hasAccess) { - // return ; - // } + if (!hasAccess) { + return ; + } return ( diff --git a/src/pages/additional-service/link-payment/link-payment-history-page.tsx b/src/pages/additional-service/link-payment/link-payment-history-page.tsx index 0343901..53d8652 100644 --- a/src/pages/additional-service/link-payment/link-payment-history-page.tsx +++ b/src/pages/additional-service/link-payment/link-payment-history-page.tsx @@ -35,9 +35,9 @@ export const LinkPaymentHistoryPage = () => { navigate(PATHS.home); }); - // if(!hasAccess){ - // return ; - // } + if(!hasAccess){ + return ; + } return ( <> diff --git a/src/pages/additional-service/payout/list-page.tsx b/src/pages/additional-service/payout/list-page.tsx index 7319e06..97e42c6 100644 --- a/src/pages/additional-service/payout/list-page.tsx +++ b/src/pages/additional-service/payout/list-page.tsx @@ -222,9 +222,9 @@ export const PayoutListPage = () => { return rs; }; - // if (!hasAccess) { - // return ; - // } + if (!hasAccess) { + return ; + } return ( <> diff --git a/src/pages/additional-service/sms-payment/sms-payment-page.tsx b/src/pages/additional-service/sms-payment/sms-payment-page.tsx index d4330cd..af48b38 100644 --- a/src/pages/additional-service/sms-payment/sms-payment-page.tsx +++ b/src/pages/additional-service/sms-payment/sms-payment-page.tsx @@ -178,9 +178,9 @@ export const SmsPaymentPage = () => { smsCl ]); - // if (!hasAccess) { - // return ; - // } + if (!hasAccess) { + return ; + } return ( <> diff --git a/src/shared/lib/hooks/use-extension-access-check.tsx b/src/shared/lib/hooks/use-extension-access-check.tsx index 42519a1..d9dcf63 100644 --- a/src/shared/lib/hooks/use-extension-access-check.tsx +++ b/src/shared/lib/hooks/use-extension-access-check.tsx @@ -3,6 +3,7 @@ import { useNavigate } from '@/shared/lib/hooks/use-navigate'; import { useExtensionCheckMutation } from '@/entities/additional-service/api/use-extension-check-mutation'; import { Dialog } from '@/shared/ui/dialogs/dialog'; import { PATHS } from '@/shared/constants/paths'; +import { useTranslation } from 'react-i18next'; interface UseExtensionAccessCheckProps { extensionCode: string; @@ -24,6 +25,7 @@ export const useExtensionAccessCheck = ({ enabled = true }: UseExtensionAccessCheckProps): UseExtensionAccessCheckReturn => { const { navigate } = useNavigate(); + const { t } = useTranslation(); const { mutateAsync: extensionCheck } = useExtensionCheckMutation(); const [hasAccess, setHasAccess] = useState(null); @@ -76,16 +78,16 @@ export const useExtensionAccessCheck = ({ return ( {}} + onClose={() => { }} message={ <> - ์ด์šฉ ์ค‘์ด์ง€ ์•Š์€ ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค.
        - ๊ฐ€์ž… ๋ฌธ์˜๋Š” ์˜์—… ๋‹ด๋‹น์ž ๋˜๋Š” ๊ณ ๊ฐ์„ผํ„ฐ๋กœ ๋ฌธ์˜ํ•ด ์ฃผ์„ธ์š”. + {t('additionalService.notActiveServiceMessage')}
        + {t('additionalService.contactSalesMessage')} } buttonLabel={['ํ™•์ธ']} onConfirmClick={handleConfirm} - afterLeave={() => {}} + afterLeave={() => { }} /> ); }; From 5c5b2069f8d0248ded307449a0ef643c80a1bef5 Mon Sep 17 00:00:00 2001 From: Jay Sheen Date: Thu, 30 Oct 2025 17:49:42 +0900 Subject: [PATCH 08/15] Add i18n localization to payment entity MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Localize payment method names in info-wrap.tsx - Add 23 payment.paymentMethods translation keys Translation keys added: - payment.paymentMethods.kakaoPay, naverPay, samsungPay - payment.paymentMethods.mobilePaymentFull, cultureLandGiftCard - payment.paymentMethods.ssgMoney, tvPay, samsungPayCard - payment.paymentMethods.applePay, tossPay, payco, livePay - payment.paymentMethods.taiwanPayment, tmoneyPay, lPay, payU - payment.paymentMethods.twLinePay, ssgPay, kBankPay - payment.paymentMethods.ssgBankAccount, accountSimplePayment - payment.paymentMethods.skPay, bcCard Replaced 28 Korean payment method strings with t() calls. Files modified: info-wrap.tsx, ko.json, en.json ๐Ÿค– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- src/entities/payment/ui/info-wrap.tsx | 58 +++++++++++++-------------- src/locales/en.json | 29 ++++++++++++-- src/locales/ko.json | 25 +++++++++++- 3 files changed, 79 insertions(+), 33 deletions(-) diff --git a/src/entities/payment/ui/info-wrap.tsx b/src/entities/payment/ui/info-wrap.tsx index 88196ee..8497100 100644 --- a/src/entities/payment/ui/info-wrap.tsx +++ b/src/entities/payment/ui/info-wrap.tsx @@ -48,7 +48,7 @@ export const InfoWrap = () => { const [cardCommissionBottomSheetOn, setCardCommissionBottomSheetOn] = useState(false); const [creditCardListBottomSheetOn, setCreditCardListBottomSheetOn] = useState(false); - const [cardCompany, setCardCompany] = useState('๋น„์”จ'); + const [cardCompany, setCardCompany] = useState(t('payment.paymentMethods.bcCard')); const [cardCompanyOptions, setCardCompanyOptions] = useState>(); const [installmentDetails, setInstallmentDetails] = useState>([]); @@ -76,37 +76,37 @@ export const InfoWrap = () => { const { mutateAsync: paymentInstallmentDetail } = usePaymentInstallmentDetailMutation(); const list1 = [ - {payName: '์‹ ์šฉ์นด๋“œ', payImage: 'pay_01.svg', infoLink: '', payType: 2}, - {payName: '์นด์นด์˜คํŽ˜์ด', payImage: 'pay_02.svg', infoLink: '', payType: 3}, - {payName: '๋„ค์ด๋ฒ„ํŽ˜์ด', payImage: 'pay_03.svg', infoLink: '', payType: 3}, - {payName: '์‚ผ์„ฑํŽ˜์ด', payImage: 'pay_04.svg', infoLink: '', payType: 2}, - {payName: '๊ณ„์ขŒ์ด์ฒด', payImage: 'pay_05.svg', infoLink: '', payType: 1}, - {payName: 'ํœด๋Œ€ํฐ๊ฒฐ์ œ', payImage: 'pay_06.svg', infoLink: '', payType: 1}, - {payName: '๋ฌธํ™”์ƒํ’ˆ๊ถŒ', payImage: 'pay_07.svg', infoLink: '', payType: 1}, - {payName: 'SSG๋จธ๋‹ˆ', payImage: 'pay_08.svg', infoLink: '', payType: 1}, - {payName: 'TVํŽ˜์ด', payImage: 'pay_09.svg', infoLink: '', payType: 1}, - {payName: '์‚ผ์„ฑํŽ˜์ด(์นด๋“œ)', payImage: 'pay_10.svg', infoLink: '', payType: 2}, - {payName: '์• ํ”ŒํŽ˜์ด', payImage: 'pay_11.svg', infoLink: '', payType: 2}, - {payName: 'ํ† ์ŠคํŽ˜์ด', payImage: 'pay_12.svg', infoLink: '', payType: 3}, - {payName: 'PAYCO', payImage: 'pay_13.svg', infoLink: '', payType: 2}, - {payName: '๋ฆฌ๋ธŒํŽ˜์ด', payImage: 'pay_14.svg', infoLink: '', payType: 2}, - {payName: '๋Œ€๋งŒ๊ฒฐ์ œ', payImage: 'pay_15.svg', infoLink: '', payType: 1}, - {payName: 'ํ‹ฐ๋จธ๋‹ˆํŽ˜์ด', payImage: 'pay_16.svg', infoLink: '', payType: 1}, - {payName: 'L.PAY', payImage: 'pay_17.svg', infoLink: '', payType: 2}, - {payName: 'PAYU', payImage: 'pay_18.svg', infoLink: '', payType: 2}, - {payName: 'TW๋ผ์ธํŽ˜์ด', payImage: 'pay_19.svg', infoLink: '', payType: 2}, - {payName: 'SSGํŽ˜์ด', payImage: 'pay_21.svg', infoLink: '', payType: 3}, - {payName: '์ผ€์ด๋ฑ…ํฌํŽ˜์ด', payImage: 'pay_22.svg', infoLink: '', payType: 2}, - {payName: '๊ฐ€์ƒ๊ณ„์ขŒ', payImage: 'pay_23.svg', infoLink: '', payType: 1}, - {payName: 'SSG์€ํ–‰๊ณ„์ขŒ', payImage: 'pay_21.svg', infoLink: '', payType: 1}, - {payName: '๊ณ„์ขŒ๊ฐ„ํŽธ๊ฒฐ์ œ', payImage: 'pay_24.svg', infoLink: '', payType: 1}, + {payName: t('payment.paymentMethods.creditCard'), payImage: 'pay_01.svg', infoLink: '', payType: 2}, + {payName: t('payment.paymentMethods.kakaoPay'), payImage: 'pay_02.svg', infoLink: '', payType: 3}, + {payName: t('payment.paymentMethods.naverPay'), payImage: 'pay_03.svg', infoLink: '', payType: 3}, + {payName: t('payment.paymentMethods.samsungPay'), payImage: 'pay_04.svg', infoLink: '', payType: 2}, + {payName: t('payment.paymentMethods.accountTransfer'), payImage: 'pay_05.svg', infoLink: '', payType: 1}, + {payName: t('payment.paymentMethods.mobilePaymentFull'), payImage: 'pay_06.svg', infoLink: '', payType: 1}, + {payName: t('payment.paymentMethods.cultureLandGiftCard'), payImage: 'pay_07.svg', infoLink: '', payType: 1}, + {payName: t('payment.paymentMethods.ssgMoney'), payImage: 'pay_08.svg', infoLink: '', payType: 1}, + {payName: t('payment.paymentMethods.tvPay'), payImage: 'pay_09.svg', infoLink: '', payType: 1}, + {payName: t('payment.paymentMethods.samsungPayCard'), payImage: 'pay_10.svg', infoLink: '', payType: 2}, + {payName: t('payment.paymentMethods.applePay'), payImage: 'pay_11.svg', infoLink: '', payType: 2}, + {payName: t('payment.paymentMethods.tossPay'), payImage: 'pay_12.svg', infoLink: '', payType: 3}, + {payName: t('payment.paymentMethods.payco'), payImage: 'pay_13.svg', infoLink: '', payType: 2}, + {payName: t('payment.paymentMethods.livePay'), payImage: 'pay_14.svg', infoLink: '', payType: 2}, + {payName: t('payment.paymentMethods.taiwanPayment'), payImage: 'pay_15.svg', infoLink: '', payType: 1}, + {payName: t('payment.paymentMethods.tmoneyPay'), payImage: 'pay_16.svg', infoLink: '', payType: 1}, + {payName: t('payment.paymentMethods.lPay'), payImage: 'pay_17.svg', infoLink: '', payType: 2}, + {payName: t('payment.paymentMethods.payU'), payImage: 'pay_18.svg', infoLink: '', payType: 2}, + {payName: t('payment.paymentMethods.twLinePay'), payImage: 'pay_19.svg', infoLink: '', payType: 2}, + {payName: t('payment.paymentMethods.ssgPay'), payImage: 'pay_21.svg', infoLink: '', payType: 3}, + {payName: t('payment.paymentMethods.kBankPay'), payImage: 'pay_22.svg', infoLink: '', payType: 2}, + {payName: t('payment.paymentMethods.virtualAccount'), payImage: 'pay_23.svg', infoLink: '', payType: 1}, + {payName: t('payment.paymentMethods.ssgBankAccount'), payImage: 'pay_21.svg', infoLink: '', payType: 1}, + {payName: t('payment.paymentMethods.accountSimplePayment'), payImage: 'pay_24.svg', infoLink: '', payType: 1}, ]; const list2 = [ - {payName: '์‹ ์šฉ์นด๋“œ', payImage: 'pay_01.svg', infoLink: ''}, - {payName: 'SK PAY', payImage: 'pay_20.svg', infoLink: ''}, - {payName: 'TVํŽ˜์ด', payImage: 'pay_09.svg', infoLink: ''}, - {payName: '์‚ผ์„ฑํŽ˜์ด(์นด๋“œ)', payImage: 'pay_04.svg', infoLink: ''}, + {payName: t('payment.paymentMethods.creditCard'), payImage: 'pay_01.svg', infoLink: ''}, + {payName: t('payment.paymentMethods.skPay'), payImage: 'pay_20.svg', infoLink: ''}, + {payName: t('payment.paymentMethods.tvPay'), payImage: 'pay_09.svg', infoLink: ''}, + {payName: t('payment.paymentMethods.samsungPayCard'), payImage: 'pay_04.svg', infoLink: ''}, ]; const getList = (type: PaymentInfoItemType) => { diff --git a/src/locales/en.json b/src/locales/en.json index 4eb2fa0..4ecbe08 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -343,7 +343,7 @@ "amountInfo": "Amount Information", "totalTransactionAmount": "Total Transaction Amount", "creditCard": "Credit Card", - "accountTransfer": "Account Transfer", + "accountTransfer": "Bank Transfer", "totalPgFee": "Total PG Fee", "paymentFee": "Payment Fee", "escrowFee": "Escrow Fee", @@ -669,7 +669,7 @@ "notificationData": "Notification Data", "notificationDataInquiry": "Payment Notification Data Inquiry", "serviceUsageCommissionAndSettlement": "Service Usage, Commission & Settlement Period", - "merchantNoInterestInfo": "Merchant No-Interest Info", + "merchantNoInterestInfo": "Interest Free Payment", "commissionAndSettlement": "Commission & Settlement", "settlementPeriod": "Settlement Period", "general": "General", @@ -700,7 +700,30 @@ "accountTransfer": "Account Transfer", "virtualAccount": "Virtual Account", "mobilePayment": "Mobile Payment", - "escrowPayment": "Escrow Payment" + "escrowPayment": "Escrow Payment", + "kakaoPay": "Kakao Pay", + "naverPay": "Naver Pay", + "samsungPay": "Samsung Pay", + "mobilePaymentFull": "Mobile Payment", + "cultureLandGiftCard": "Gift Voucher", + "ssgMoney": "SSG Money", + "tvPay": "TV Pay", + "samsungPayCard": "Samsung Pay (Card)", + "applePay": "Apple Pay", + "tossPay": "Toss Pay", + "payco": "PAYCO", + "livePay": "Live Pay", + "taiwanPayment": "Taiwan Payment", + "tmoneyPay": "Tmoney Pay", + "lPay": "L.PAY", + "payU": "PAYU", + "twLinePay": "TW LINE Pay", + "ssgPay": "SSG Pay", + "kBankPay": "Kbank Pay", + "ssgBankAccount": "SSG Bank Account", + "accountSimplePayment": "Simple Account Payment", + "skPay": "SK PAY", + "bcCard": "BC Card" } }, "additionalService": { diff --git a/src/locales/ko.json b/src/locales/ko.json index 47b4911..6978b9c 100644 --- a/src/locales/ko.json +++ b/src/locales/ko.json @@ -704,7 +704,30 @@ "accountTransfer": "๊ณ„์ขŒ์ด์ฒด", "virtualAccount": "๊ฐ€์ƒ๊ณ„์ขŒ", "mobilePayment": "ํœด๋Œ€ํฐ", - "escrowPayment": "์—์Šคํฌ๋กœ ๊ฒฐ์ œ" + "escrowPayment": "์—์Šคํฌ๋กœ ๊ฒฐ์ œ", + "kakaoPay": "์นด์นด์˜คํŽ˜์ด", + "naverPay": "๋„ค์ด๋ฒ„ํŽ˜์ด", + "samsungPay": "์‚ผ์„ฑํŽ˜์ด", + "mobilePaymentFull": "ํœด๋Œ€ํฐ๊ฒฐ์ œ", + "cultureLandGiftCard": "๋ฌธํ™”์ƒํ’ˆ๊ถŒ", + "ssgMoney": "SSG๋จธ๋‹ˆ", + "tvPay": "TVํŽ˜์ด", + "samsungPayCard": "์‚ผ์„ฑํŽ˜์ด(์นด๋“œ)", + "applePay": "์• ํ”ŒํŽ˜์ด", + "tossPay": "ํ† ์ŠคํŽ˜์ด", + "payco": "PAYCO", + "livePay": "๋ฆฌ๋ธŒํŽ˜์ด", + "taiwanPayment": "๋Œ€๋งŒ๊ฒฐ์ œ", + "tmoneyPay": "ํ‹ฐ๋จธ๋‹ˆํŽ˜์ด", + "lPay": "L.PAY", + "payU": "PAYU", + "twLinePay": "TW๋ผ์ธํŽ˜์ด", + "ssgPay": "SSGํŽ˜์ด", + "kBankPay": "์ผ€์ด๋ฑ…ํฌํŽ˜์ด", + "ssgBankAccount": "SSG์€ํ–‰๊ณ„์ขŒ", + "accountSimplePayment": "๊ณ„์ขŒ๊ฐ„ํŽธ๊ฒฐ์ œ", + "skPay": "SK PAY", + "bcCard": "๋น„์”จ" } }, "additionalService": { From e60fe0f014f8745add7f0b80cef281743ddfe60c Mon Sep 17 00:00:00 2001 From: Jay Sheen Date: Thu, 30 Oct 2025 17:54:43 +0900 Subject: [PATCH 09/15] Add comprehensive i18n localization to vat-return entity MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Convert vat-return constants to i18n-compatible getter functions - Add 10 translation keys to vatReturn namespace - Localize 3 vat-return files Constant conversions: - getVatReturnReceiptTypeBtnGroup(t) - getVatReturnTargetTypeBtnGroup(t) - getVatReturnTaxBtnGroups(t) Translation keys added: - vatReturn.issuanceMonth: "๋ฐœํ–‰์›”" / "Issue Month" - vatReturn.receiptType: "์˜์ˆ˜๊ตฌ๋ถ„" / "Receipt Type" - vatReturn.issueTarget: "๋ฐœํ–‰๋Œ€์ƒ" / "Issue Target" - vatReturn.receipt, bill, general - vatReturn.differenceSettlement, refundSettlement - vatReturn.taxable, taxExempt - vatReturn.keyInMerchantError Localized files: - filter/list-filter.tsx - reference-wrap.tsx - model/contant.ts All vat-return components now support Korean/English language switching. ๐Ÿค– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- src/entities/vat-return/model/contant.ts | 25 ++++++++------- .../vat-return/ui/filter/list-filter.tsx | 32 ++++++++++--------- src/entities/vat-return/ui/reference-wrap.tsx | 6 ++-- src/locales/en.json | 11 ++++++- src/locales/ko.json | 11 ++++++- 5 files changed, 53 insertions(+), 32 deletions(-) diff --git a/src/entities/vat-return/model/contant.ts b/src/entities/vat-return/model/contant.ts index 30c8663..15cb992 100644 --- a/src/entities/vat-return/model/contant.ts +++ b/src/entities/vat-return/model/contant.ts @@ -1,19 +1,20 @@ +import { TFunction } from 'i18next'; import { VatReturnPayTax, VatReturnReceiptType, VatReturnTargetType } from './types'; -export const VatReturnReceiptTypeBtnGroup = [ - {name: '์ „์ฒด', value: VatReturnReceiptType.ALL }, - {name: '์˜์ˆ˜', value: VatReturnReceiptType.RECEIPT }, - {name: '์ฒญ๊ตฌ', value: VatReturnReceiptType.BILL } +export const getVatReturnReceiptTypeBtnGroup = (t: TFunction) => [ + {name: t('transaction.constants.all'), value: VatReturnReceiptType.ALL }, + {name: t('vatReturn.receipt'), value: VatReturnReceiptType.RECEIPT }, + {name: t('vatReturn.bill'), value: VatReturnReceiptType.BILL } ]; -export const VatReturnTargetTypeBtnGroup = [ - {name: '์ „์ฒด', value: VatReturnTargetType.ALL }, - {name: '์ผ๋ฐ˜', value: VatReturnTargetType.GENERAL }, - {name: '์ฐจ์•ก์ •์‚ฐ', value: VatReturnTargetType.DIFFERENCE_COLLECTION }, - {name: 'ํ™˜๊ธ‰์ •์‚ฐ', value: VatReturnTargetType.REFUND_SETTLEMENT } +export const getVatReturnTargetTypeBtnGroup = (t: TFunction) => [ + {name: t('transaction.constants.all'), value: VatReturnTargetType.ALL }, + {name: t('vatReturn.general'), value: VatReturnTargetType.GENERAL }, + {name: t('vatReturn.differenceSettlement'), value: VatReturnTargetType.DIFFERENCE_COLLECTION }, + {name: t('vatReturn.refundSettlement'), value: VatReturnTargetType.REFUND_SETTLEMENT } ]; -export const VatReturnTaxBtnGroups = [ - {name: '๊ณผ์„ธ', value: VatReturnPayTax.TAX }, - {name: '๋ฉด์„ธ', value: VatReturnPayTax.NOTAX }, +export const getVatReturnTaxBtnGroups = (t: TFunction) => [ + {name: t('vatReturn.taxable'), value: VatReturnPayTax.TAX }, + {name: t('vatReturn.taxExempt'), value: VatReturnPayTax.NOTAX }, ]; \ No newline at end of file diff --git a/src/entities/vat-return/ui/filter/list-filter.tsx b/src/entities/vat-return/ui/filter/list-filter.tsx index add5110..91a0919 100644 --- a/src/entities/vat-return/ui/filter/list-filter.tsx +++ b/src/entities/vat-return/ui/filter/list-filter.tsx @@ -1,11 +1,12 @@ import { motion } from 'framer-motion'; +import { useTranslation } from 'react-i18next'; import { IMAGE_ROOT } from '@/shared/constants/common'; import { VatReturnReceiptType, VatReturnTargetType } from '../../model/types'; import { FilterMotionDuration, FilterMotionStyle, FilterMotionVariants } from '@/entities/common/model/constant'; import { FilterSelect } from '@/shared/ui/filter/select'; import { useState } from 'react'; import { FilterButtonGroups } from '@/shared/ui/filter/button-groups'; -import { VatReturnReceiptTypeBtnGroup, VatReturnTargetTypeBtnGroup } from '../../model/contant'; +import { getVatReturnReceiptTypeBtnGroup, getVatReturnTargetTypeBtnGroup } from '../../model/contant'; import { FilterCalendarMonth } from '@/shared/ui/filter/calendar-month'; import { useStore } from '@/shared/model/store'; import { FilterSelectMid } from '@/shared/ui/filter/select-mid'; @@ -39,13 +40,14 @@ export const ListFilter = ({ setReceiptType, setTargetType }: ListFilterProps) => { + const { t } = useTranslation(); const [filterMid, setFilterMid] = useState(mid); const [filterStartMonth, setFilterStartMonth] = useState(startMonth); const [filterEndMonth, setFilterEndMonth] = useState(endMonth); const [filterReceiptType, setFIlterReceiptType] = useState(receiptType); const [filterTargetType, setFilterTargetType] = useState(targetType); - + const midOptions = useStore.getState().UserStore.selectOptionsMids; const onClickToClose = () => { @@ -73,51 +75,51 @@ export const ListFilter = ({ >
        -
        ํ•„ํ„ฐ
        +
        {t('filter.filter')}
        -
        - +
        - + >{t('filter.apply')}
        diff --git a/src/entities/vat-return/ui/reference-wrap.tsx b/src/entities/vat-return/ui/reference-wrap.tsx index 9695d52..8d5c18c 100644 --- a/src/entities/vat-return/ui/reference-wrap.tsx +++ b/src/entities/vat-return/ui/reference-wrap.tsx @@ -6,7 +6,7 @@ import { FilterSelect } from '@/shared/ui/filter/select'; import { ReferenceRequestSuccess } from './reference-request-success'; import { ReferenceRequestFail } from './reference-request-fail'; import { FilterButtonGroups } from '@/shared/ui/filter/button-groups'; -import { VatReturnTaxBtnGroups } from '../model/contant'; +import { getVatReturnTaxBtnGroups } from '../model/contant'; import { VatReturnPayTax, VatReturnReferenceRequestParams, VatReturnReferenceRequestResponse } from '../model/types'; import { useStore } from '@/shared/model/store'; import { useVatReturnReferenceRequestMutation } from '../api/use-vat-return-reference-request-mutation'; @@ -41,7 +41,7 @@ export const ReferenceWrap = () => { vatReturnReferenceRequest(params).then((rs: VatReturnReferenceRequestResponse) => { setSuccessPageOn(true); }).catch((error) => { - setErrorMsg("[9997] ํ‚ค์ธ๊ฐ€๋งน์ ์ด ์•„๋‹™๋‹ˆ๋‹ค.
        NICEPAY๋กœ ๋ฌธ์˜ํ•˜์„ธ์š”."); + setErrorMsg(t('vatReturn.keyInMerchantError')); setFailPageOn(true); }); }; @@ -58,7 +58,7 @@ export const ReferenceWrap = () => { Please contact NICEPAY." } } \ No newline at end of file diff --git a/src/locales/ko.json b/src/locales/ko.json index 6978b9c..8386059 100644 --- a/src/locales/ko.json +++ b/src/locales/ko.json @@ -852,9 +852,17 @@ "issueInfo": "๋ฐœํ–‰ ์ •๋ณด", "issueTargetDate": "๋ฐœํ–‰๋Œ€์ƒ์ผ์ž", "issueDate": "๋ฐœํ–‰์ผ์ž", + "issuanceMonth": "๋ฐœํ–‰์›”", "subject": "์ ์š”", "issueTarget": "๋ฐœํ–‰๋Œ€์ƒ", "receiptType": "์˜์ˆ˜๊ตฌ๋ถ„", + "receipt": "์˜์ˆ˜", + "bill": "์ฒญ๊ตฌ", + "general": "์ผ๋ฐ˜", + "differenceSettlement": "์ฐจ์•ก์ •์‚ฐ", + "refundSettlement": "ํ™˜๊ธ‰์ •์‚ฐ", + "taxable": "๊ณผ์„ธ", + "taxExempt": "๋ฉด์„ธ", "supplierInfo": "๊ณต๊ธ‰์ž ์ •๋ณด", "receiverInfo": "๊ณต๊ธ‰๋ฐ›๋Š” ์ž ์ •๋ณด", "taxExemptionType": "๊ฑฐ๋ž˜ ๊ณผ์„ธ/๋ฉด์„ธ ๊ตฌ๋ถ„", @@ -868,6 +876,7 @@ "applicationDate": "์‹ ์ฒญ์ผ", "emailAddress": "๋ฉ”์ผ์ฃผ์†Œ", "referenceDataNote": "์ฐธ๊ณ ์šฉ ์ž๋ฃŒ์ด๋ฏ€๋กœ ๋ฐ˜๋“œ์‹œ ๋‚ด๋ถ€ ํšŒ๊ณ„์ž๋ฃŒ ๋“ฑ๊ณผ\n๋น„๊ต ํ›„ ์‚ฌ์šฉํ•ด ์ฃผ์„ธ์š”.", - "result": "๊ฒฐ๊ณผ" + "result": "๊ฒฐ๊ณผ", + "keyInMerchantError": "[9997] ํ‚ค์ธ๊ฐ€๋งน์ ์ด ์•„๋‹™๋‹ˆ๋‹ค.
        NICEPAY๋กœ ๋ฌธ์˜ํ•˜์„ธ์š”." } } \ No newline at end of file From ee932f2a46a378f7da8d5890aad6661024e89a1e Mon Sep 17 00:00:00 2001 From: Jay Sheen Date: Thu, 30 Oct 2025 18:06:52 +0900 Subject: [PATCH 10/15] Add i18n localization foundation to additional-service entity MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Convert 10 constant files to i18n-compatible getter functions: - ars/constant.ts: ARS status codes and payment methods - sms-payment/constant.ts: SMS payment status codes - link-pay/constant.ts: Link payment status codes - account-holder-auth/constant.ts: Account holder verification - account-holder-search/constant.ts: Account holder search types - face-auth/constant.ts: Face authentication types - fund-account/constant.ts: Fund account status codes - alimtalk/constant.ts: Alimtalk status and transaction types - payout/constant.ts: Payout search types - key-in/constant.ts: Key-in cancel types - Refactor lib/payment-status-utils.ts to curried functions with TFunction - Add 63 translation keys to additionalService namespace in ko.json/en.json - Localize 2 UI components as examples: - ui/filter/ars-filter.tsx - ui/ars/resend-sms-bottom-sheet.tsx ๐Ÿค– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- .../lib/payment-status-utils.ts | 50 +++++----- .../model/account-holder-auth/constant.ts | 27 +++--- .../model/account-holder-search/constant.ts | 21 ++-- .../model/alimtalk/constant.ts | 95 ++++++++++--------- .../additional-service/model/ars/constant.ts | 33 ++++--- .../model/face-auth/constant.ts | 29 +++--- .../model/fund-account/constant.ts | 45 ++++----- .../model/key-in/constant.ts | 16 ++-- .../model/link-pay/constant.ts | 9 +- .../model/payout/constant.ts | 28 +++--- .../model/sms-payment/constant.ts | 11 ++- .../ui/ars/resend-sms-bottom-sheet.tsx | 13 ++- .../ui/filter/ars-filter.tsx | 41 ++++---- src/locales/en.json | 63 ++++++++++++ src/locales/ko.json | 63 ++++++++++++ 15 files changed, 345 insertions(+), 199 deletions(-) diff --git a/src/entities/additional-service/lib/payment-status-utils.ts b/src/entities/additional-service/lib/payment-status-utils.ts index ab36a85..15a2b1c 100644 --- a/src/entities/additional-service/lib/payment-status-utils.ts +++ b/src/entities/additional-service/lib/payment-status-utils.ts @@ -1,55 +1,57 @@ -export const getPaymentStatusText = (status?: string): string => { +import { TFunction } from 'i18next'; + +export const getPaymentStatusText = (t: TFunction) => (status?: string): string => { if (!status) return ''; const statusMap: Record = { - // ์ˆซ์ž ๋ฌธ์ž์—ด ๋งคํ•‘ - '0': '๋ฏธ์™„๋ฃŒ/ํ™œ์„ฑํ™”', - '1': '์ž…๊ธˆ์š”์ฒญ', - '2': '๊ฒฐ์ œ์™„๋ฃŒ', - '3': '๊ฒฐ์ œ์‹คํŒจ', - '4': '๊ฒฐ์ œ์ค‘๋‹จ', - // ๋ฌธ์ž์—ด ํ‚ค ๋งคํ•‘ (ํ•˜์œ„ ํ˜ธํ™˜์„ฑ) - 'ALL': '์ „์ฒด', - 'ACTIVE': '๋ฏธ์™„๋ฃŒ/ํ™œ์„ฑํ™”', - 'DEPOSIT_REQUEST': '์ž…๊ธˆ์š”์ฒญ', - 'PAYMENT_COMPLETE': '๊ฒฐ์ œ์™„๋ฃŒ', - 'PAYMENT_FAIL': '๊ฒฐ์ œ์‹คํŒจ', - 'INACTIVE': '๊ฒฐ์ œ์ค‘๋‹จ/๋น„ํ™œ์„ฑํ™”' + // Numeric string mapping + '0': t('additionalService.linkPay.incompleteActive'), + '1': t('additionalService.linkPay.depositRequest'), + '2': t('additionalService.linkPay.paymentComplete'), + '3': t('additionalService.linkPay.paymentFail'), + '4': t('additionalService.linkPay.paymentStopped'), + // String key mapping (backward compatibility) + 'ALL': t('transaction.constants.all'), + 'ACTIVE': t('additionalService.linkPay.incompleteActive'), + 'DEPOSIT_REQUEST': t('additionalService.linkPay.depositRequest'), + 'PAYMENT_COMPLETE': t('additionalService.linkPay.paymentComplete'), + 'PAYMENT_FAIL': t('additionalService.linkPay.paymentFail'), + 'INACTIVE': t('additionalService.linkPay.paymentStoppedInactive') }; return statusMap[status] || status; }; -export const getProcessStatusText = (status?: string): string => { +export const getProcessStatusText = (t: TFunction) => (status?: string): string => { if (!status) return ''; const processStatusMap: Record = { - 'SEND_REQUEST': '๋ฐœ์†ก์š”์ฒญ', - 'SEND_CANCEL': '๋ฐœ์†ก์ทจ์†Œ', - 'PENDING': '๋Œ€๊ธฐ์ค‘' + 'SEND_REQUEST': t('additionalService.linkPay.sendRequest'), + 'SEND_CANCEL': t('additionalService.linkPay.sendCancel'), + 'PENDING': t('additionalService.linkPay.pending') }; return processStatusMap[status] || status; }; -export const getSendMethodText = (method?: string): string => { +export const getSendMethodText = (t: TFunction) => (method?: string): string => { if (!method) return ''; const sendMethodMap: Record = { 'SMS': 'SMS', - 'EMAIL': '์ด๋ฉ”์ผ', - 'KAKAO': '์•Œ๋ฆผํ†ก' + 'EMAIL': t('additionalService.linkPay.email'), + 'KAKAO': t('additionalService.linkPay.alimtalk') }; return sendMethodMap[method] || method; }; -export const getResultStatusText = (status?: string): string => { +export const getResultStatusText = (t: TFunction) => (status?: string): string => { if (!status) return ''; const resultStatusMap: Record = { - 'SUCCESS': '์„ฑ๊ณต', - 'FAIL': '์‹คํŒจ' + 'SUCCESS': t('additionalService.common.success'), + 'FAIL': t('additionalService.common.fail') }; return resultStatusMap[status] || status; diff --git a/src/entities/additional-service/model/account-holder-auth/constant.ts b/src/entities/additional-service/model/account-holder-auth/constant.ts index bd963c1..3e032b5 100644 --- a/src/entities/additional-service/model/account-holder-auth/constant.ts +++ b/src/entities/additional-service/model/account-holder-auth/constant.ts @@ -1,31 +1,32 @@ +import { TFunction } from 'i18next'; import { AccountHolderAuthStatus } from "./types"; -export const authStatusBtnGroup = [ - { name: '์ „์ฒด', value: AccountHolderAuthStatus.ALL }, - { name: '์š”์ฒญ', value: AccountHolderAuthStatus.REQUEST}, - { name: '์„ฑ๊ณต', value: AccountHolderAuthStatus.SUCCESS}, - { name: '์‹คํŒจ', value: AccountHolderAuthStatus.FAIL} +export const getAuthStatusBtnGroup = (t: TFunction) => [ + { name: t('transaction.constants.all'), value: AccountHolderAuthStatus.ALL }, + { name: t('additionalService.common.request'), value: AccountHolderAuthStatus.REQUEST}, + { name: t('additionalService.common.success'), value: AccountHolderAuthStatus.SUCCESS}, + { name: t('additionalService.common.fail'), value: AccountHolderAuthStatus.FAIL} ] -export const getAuthStatusText = (status?: string): string => { +export const getAuthStatusText = (t: TFunction) => (status?: string): string => { if (!status) return ''; const AuthStatusMap: Record = { - 'REQUEST' : '์š”์ฒญ', - 'SUCCESS' : '์„ฑ๊ณต', - 'FAIL' : '์‹คํŒจ' + 'REQUEST' : t('additionalService.common.request'), + 'SUCCESS' : t('additionalService.common.success'), + 'FAIL' : t('additionalService.common.fail') } return AuthStatusMap[status] || status; } -export const getAuthResultText = (status?: string): string => { +export const getAuthResultText = (t: TFunction) => (status?: string): string => { if (!status) return ''; const AuthResultMap: Record = { - 'MATCHED' : '์˜ˆ๊ธˆ์ฃผ๋ช… ์ผ์น˜', - 'NOT_MATCHED' : '์˜ˆ๊ธˆ์ฃผ๋ช… ๋ถˆ์ผ์น˜', - 'FAILED' : '์ธ์ฆ์‹คํŒจ (๊ณ„์ขŒ ์˜ค๋ฅ˜ ๋“ฑ)' + 'MATCHED' : t('additionalService.accountHolderAuth.accountHolderNameMatch'), + 'NOT_MATCHED' : t('additionalService.accountHolderAuth.accountHolderNameMismatch'), + 'FAILED' : t('additionalService.accountHolderAuth.authFailedAccountError') } return AuthResultMap[status] || status; diff --git a/src/entities/additional-service/model/account-holder-search/constant.ts b/src/entities/additional-service/model/account-holder-search/constant.ts index 2e4c67f..a90ed5b 100644 --- a/src/entities/additional-service/model/account-holder-search/constant.ts +++ b/src/entities/additional-service/model/account-holder-search/constant.ts @@ -1,25 +1,26 @@ +import { TFunction } from 'i18next'; import { ProcessResult } from "../types"; import { AccountHolderResultStatus, AccountHolderSearchCl } from "./types"; -export const resultStatusBtnGroup = [ - { name: '์ „์ฒด', value: AccountHolderResultStatus.ALL }, - { name: '์„ฑ๊ณต', value: AccountHolderResultStatus.SUCCESS }, - { name: '์‹คํŒจ', value: AccountHolderResultStatus.FAIL }, +export const getResultStatusBtnGroup = (t: TFunction) => [ + { name: t('transaction.constants.all'), value: AccountHolderResultStatus.ALL }, + { name: t('additionalService.common.success'), value: AccountHolderResultStatus.SUCCESS }, + { name: t('additionalService.common.fail'), value: AccountHolderResultStatus.FAIL }, ] -export const SearchTypeOption = [ - { name: '์˜ˆ๊ธˆ์ฃผ', value: AccountHolderSearchCl.ACCOUNT_NAME }, - { name: '๊ณ„์ขŒ๋ฒˆํ˜ธ', value: AccountHolderSearchCl.ACCOUNT_NO }, +export const getSearchTypeOption = (t: TFunction) => [ + { name: t('additionalService.accountHolderSearch.accountHolder'), value: AccountHolderSearchCl.ACCOUNT_NAME }, + { name: t('additionalService.accountHolderSearch.accountNumber'), value: AccountHolderSearchCl.ACCOUNT_NO }, ]; -export const getAccountHolderStatusText = (status?: string): string => { +export const getAccountHolderStatusText = (t: TFunction) => (status?: string): string => { if (!status) return ''; const resultStatusMap: Record = { - 'SUCCESS': '์„ฑ๊ณต', - 'FAIL': '์‹คํŒจ' + 'SUCCESS': t('additionalService.common.success'), + 'FAIL': t('additionalService.common.fail') }; return resultStatusMap[status] || status; } \ No newline at end of file diff --git a/src/entities/additional-service/model/alimtalk/constant.ts b/src/entities/additional-service/model/alimtalk/constant.ts index c70ef47..20c6f6f 100644 --- a/src/entities/additional-service/model/alimtalk/constant.ts +++ b/src/entities/additional-service/model/alimtalk/constant.ts @@ -1,90 +1,91 @@ +import { TFunction } from 'i18next'; import { AlimtalkAlimCl, AlimtalkSearchCl, AlimTalkSendCl, AlimtalkSendType, ServiceCode } from "./types"; -export const AlimtalkSearchClOptionGroup = [ - { name: '์ฃผ๋ฌธ์ž', value: AlimtalkSearchCl.BUYER_NAME }, - { name: 'TID', value: AlimtalkSearchCl.TID }, +export const getAlimtalkSearchClOptionGroup = (t: TFunction) => [ + { name: t('additionalService.alimtalk.buyer'), value: AlimtalkSearchCl.BUYER_NAME }, + { name: t('transaction.constants.tid'), value: AlimtalkSearchCl.TID }, ]; -export const AlimtalkServiceCodeOptionGroup = [ - { name: '์ „์ฒด', value: '' }, - { name: '์นด๋“œ', value: ServiceCode.CARD }, - { name: '๊ณ„์ขŒ์ด์ฒด', value: ServiceCode.BANK }, - { name: '๊ฐ€์ƒ๊ณ„์ขŒ', value: ServiceCode.VBANK }, - { name: 'ํœด๋Œ€ํฐ', value: ServiceCode.PHONE } +export const getAlimtalkServiceCodeOptionGroup = (t: TFunction) => [ + { name: t('transaction.constants.all'), value: '' }, + { name: t('transaction.constants.card'), value: ServiceCode.CARD }, + { name: t('transaction.constants.accountTransfer'), value: ServiceCode.BANK }, + { name: t('transaction.constants.virtualAccount'), value: ServiceCode.VBANK }, + { name: t('transaction.constants.mobilePhone'), value: ServiceCode.PHONE } ] -// ์•Œ๋ฆผ๊ตฌ๋ถ„ - ์นด๋“œ/๊ณ„์ขŒ์ด์ฒด/ํœด๋Œ€ํฐ์šฉ -export const AlimtalkAlimClBtnGroupForGeneral = [ - { name: '์ „์ฒด', value: '' }, - { name: '์Šน์ธ', value: AlimtalkAlimCl.APPROVAL }, - { name: '์ทจ์†Œ', value: AlimtalkAlimCl.CANCEL } +// Notification type - For Card/Account Transfer/Mobile +export const getAlimtalkAlimClBtnGroupForGeneral = (t: TFunction) => [ + { name: t('transaction.constants.all'), value: '' }, + { name: t('transaction.constants.approval'), value: AlimtalkAlimCl.APPROVAL }, + { name: t('transaction.constants.cancel'), value: AlimtalkAlimCl.CANCEL } ] -// ์•Œ๋ฆผ๊ตฌ๋ถ„ - ๊ฐ€์ƒ๊ณ„์ขŒ์šฉ -export const AlimtalkAlimClBtnGroupForVBank = [ - { name: '์ „์ฒด', value: '' }, - { name: '์ž…๊ธˆ์š”์ฒญ', value: AlimtalkAlimCl.DEPOSIT_REQUEST }, - { name: '์ž…๊ธˆ์™„๋ฃŒ', value: AlimtalkAlimCl.DEPOSIT_COMPLETE }, - { name: 'ํ™˜๋ถˆ', value: AlimtalkAlimCl.REFUND } +// Notification type - For Virtual Account +export const getAlimtalkAlimClBtnGroupForVBank = (t: TFunction) => [ + { name: t('transaction.constants.all'), value: '' }, + { name: t('additionalService.alimtalk.depositRequest'), value: AlimtalkAlimCl.DEPOSIT_REQUEST }, + { name: t('additionalService.alimtalk.depositComplete'), value: AlimtalkAlimCl.DEPOSIT_COMPLETE }, + { name: t('transaction.constants.refund'), value: AlimtalkAlimCl.REFUND } ] -export const AlimtalkSendTypeBtnGroup = [ - { name: '์ „์ฒด', value: AlimtalkSendType.ALL }, - { name: '์นด์นด์˜คํ†ก', value: AlimtalkSendType.KAKAOTALK }, - { name: 'FB SMS', value: AlimtalkSendType.FB_SMS } +export const getAlimtalkSendTypeBtnGroup = (t: TFunction) => [ + { name: t('transaction.constants.all'), value: AlimtalkSendType.ALL }, + { name: t('additionalService.alimtalk.kakaotalk'), value: AlimtalkSendType.KAKAOTALK }, + { name: t('additionalService.alimtalk.fbSms'), value: AlimtalkSendType.FB_SMS } ] -export const AlimtalkSendClBtnGroup = [ - { name: '์ „์ฒด', value: AlimTalkSendCl.ALL }, - { name: '์š”์ฒญ', value: AlimTalkSendCl.REQUEST }, - { name: '์„ฑ๊ณต', value: AlimTalkSendCl.SUCCESS }, - { name: '์‹คํŒจ', value: AlimTalkSendCl.FAIL } +export const getAlimtalkSendClBtnGroup = (t: TFunction) => [ + { name: t('transaction.constants.all'), value: AlimTalkSendCl.ALL }, + { name: t('additionalService.common.request'), value: AlimTalkSendCl.REQUEST }, + { name: t('additionalService.common.success'), value: AlimTalkSendCl.SUCCESS }, + { name: t('additionalService.common.fail'), value: AlimTalkSendCl.FAIL } ] -export const getAlimtalkAlimClText = (status?: string): string => { +export const getAlimtalkAlimClText = (t: TFunction) => (status?: string): string => { if (!status) return ''; const alimClMap: Record = { - 'APPROVAL' : '์Šน์ธ', - 'CANCEL' : '์ทจ์†Œ', - 'DEPOSIT_REQUEST' : '์ž…๊ธˆ์š”์ฒญ', - 'DEPOSIT_COMPLETE' : '์ž…๊ธˆ์™„๋ฃŒ', - 'REFUND' : 'ํ™˜๋ถˆ' + 'APPROVAL' : t('transaction.constants.approval'), + 'CANCEL' : t('transaction.constants.cancel'), + 'DEPOSIT_REQUEST' : t('additionalService.alimtalk.depositRequest'), + 'DEPOSIT_COMPLETE' : t('additionalService.alimtalk.depositComplete'), + 'REFUND' : t('transaction.constants.refund') } return alimClMap[status] || status; } -export const getAlimtalkSendTypeText = (status?: string): string => { +export const getAlimtalkSendTypeText = (t: TFunction) => (status?: string): string => { if (!status) return ''; const sendTypeMap: Record = { - "KAKAOTALK": '์นด์นด์˜คํ†ก', - 'FB SMS': 'ํŽ˜์ด์Šค๋ถ', + "KAKAOTALK": t('additionalService.alimtalk.kakaotalk'), + 'FB SMS': t('additionalService.alimtalk.fbSms'), }; return sendTypeMap[status] || status; } -export const getAlimtalkSendClTypeText = (status?: string): string => { +export const getAlimtalkSendClTypeText = (t: TFunction) => (status?: string): string => { if (!status) return ''; const sendClMap: Record = { - 'REQUEST': '์š”์ฒญ', - 'SUCCESS': '์„ฑ๊ณต', - 'FAIL': '์‹คํŒจ' + 'REQUEST': t('additionalService.common.request'), + 'SUCCESS': t('additionalService.common.success'), + 'FAIL': t('additionalService.common.fail') }; return sendClMap[status] || status; } -export const getAlimtalkServiceCodeText = (status?: string): string => { +export const getAlimtalkServiceCodeText = (t: TFunction) => (status?: string): string => { if (!status) return ''; const serviceCodeMap: Record = { - 'CARD': '์‹ ์šฉ์นด๋“œ', - 'BANK': '๊ณ„์ขŒ์ด์ฒด', - 'VBANK': '๊ฐ€์ƒ๊ณ„์ขŒ', - 'PHONE': 'ํœด๋Œ€ํฐ' + 'CARD': t('transaction.constants.creditCard'), + 'BANK': t('transaction.constants.accountTransfer'), + 'VBANK': t('transaction.constants.virtualAccount'), + 'PHONE': t('transaction.constants.mobilePhone') } return serviceCodeMap[status] || status; diff --git a/src/entities/additional-service/model/ars/constant.ts b/src/entities/additional-service/model/ars/constant.ts index 8539456..5233780 100644 --- a/src/entities/additional-service/model/ars/constant.ts +++ b/src/entities/additional-service/model/ars/constant.ts @@ -1,30 +1,33 @@ +import { TFunction } from 'i18next'; import { ArsPaymentMethod, OrderStatus, PaymentStatus } from './types'; -export const ArsPaymentStatusBtnGroup = [ - {name: '์ „์ฒด', value: PaymentStatus.ALL }, - {name: '๊ฒฐ์ œ์™„๋ฃŒ', value: PaymentStatus.COMPLETE }, - {name: '๋ฏธ๊ฒฐ์ œ', value: PaymentStatus.UNPAID } +export const getArsPaymentStatusBtnGroup = (t: TFunction) => [ + {name: t('transaction.constants.all'), value: PaymentStatus.ALL }, + {name: t('additionalService.ars.paymentComplete'), value: PaymentStatus.COMPLETE }, + {name: t('additionalService.ars.unpaid'), value: PaymentStatus.UNPAID } ]; -export const ArsOrderStatusBtnGroup = [ - {name: '์ „์ฒด', value: OrderStatus.ALL }, - {name: '๊ฒฐ์ œ๋Œ€๊ธฐ', value: OrderStatus.PENDING }, - {name: '๊ฒฐ์ œ์„ฑ๊ณต', value: OrderStatus.SUCCESS }, - {name: '๊ธฐ๊ฐ„๋งŒ๋ฃŒ', value: OrderStatus.EXPIRED }, - {name: '์ทจ์†Œ์™„๋ฃŒ', value: OrderStatus.CANCELED }, + +export const getArsOrderStatusBtnGroup = (t: TFunction) => [ + {name: t('transaction.constants.all'), value: OrderStatus.ALL }, + {name: t('additionalService.ars.pendingPayment'), value: OrderStatus.PENDING }, + {name: t('additionalService.ars.paymentSuccess'), value: OrderStatus.SUCCESS }, + {name: t('additionalService.ars.expired'), value: OrderStatus.EXPIRED }, + {name: t('additionalService.ars.canceled'), value: OrderStatus.CANCELED }, ]; -export const ArsPaymentMethodBtnGroup = [ + +export const getArsPaymentMethodBtnGroup = (t: TFunction) => [ {name: 'SMS', value: ArsPaymentMethod.SMS }, {name: 'ARS', value: ArsPaymentMethod.ARS }, ]; -export const getArsPaymentStatusName = (status?: string): string => { +export const getArsPaymentStatusName = (t: TFunction) => (status?: string): string => { if (!status) return ''; - const found = ArsPaymentStatusBtnGroup.find(item => item.value === status); + const found = getArsPaymentStatusBtnGroup(t).find(item => item.value === status); return found ? found.name : status; } -export const getArsOrderStatusName = (status?: string): string => { +export const getArsOrderStatusName = (t: TFunction) => (status?: string): string => { if (!status) return ''; - const found = ArsOrderStatusBtnGroup.find(item => item.value === status); + const found = getArsOrderStatusBtnGroup(t).find(item => item.value === status); return found ? found.name : status; } \ No newline at end of file diff --git a/src/entities/additional-service/model/face-auth/constant.ts b/src/entities/additional-service/model/face-auth/constant.ts index b80f192..698cdaf 100644 --- a/src/entities/additional-service/model/face-auth/constant.ts +++ b/src/entities/additional-service/model/face-auth/constant.ts @@ -1,35 +1,36 @@ +import { TFunction } from 'i18next'; import { FaceAuthResult, FaceAuthTransType } from "./types"; -export const AuthResultBtnGroup = [ - { name: '์ „์ฒด', value: FaceAuthResult.ALL }, - { name: '์„ฑ๊ณต', value: FaceAuthResult.SUCCESS }, - { name: '์‹คํŒจ', value: FaceAuthResult.FAIL }, +export const getAuthResultBtnGroup = (t: TFunction) => [ + { name: t('transaction.constants.all'), value: FaceAuthResult.ALL }, + { name: t('additionalService.common.success'), value: FaceAuthResult.SUCCESS }, + { name: t('additionalService.common.fail'), value: FaceAuthResult.FAIL }, ]; -export const TransactionTypeBtnGroup = [ - { name: '์ „์ฒด', value: FaceAuthTransType.ALL }, - { name: '์ธ์ฆ', value: FaceAuthTransType.AUTH }, - { name: '๋“ฑ๋ก', value: FaceAuthTransType.REGISTER }, +export const getTransactionTypeBtnGroup = (t: TFunction) => [ + { name: t('transaction.constants.all'), value: FaceAuthTransType.ALL }, + { name: t('additionalService.faceAuth.authentication'), value: FaceAuthTransType.AUTH }, + { name: t('additionalService.faceAuth.registration'), value: FaceAuthTransType.REGISTER }, ]; -export const getAuthResultStatusText = (status?: string): string => { +export const getAuthResultStatusText = (t: TFunction) => (status?: string): string => { if (!status) return ''; const authResultMap: Record = { - 'SUCCESS': '์„ฑ๊ณต', - 'FAIL': '์‹คํŒจ' + 'SUCCESS': t('additionalService.common.success'), + 'FAIL': t('additionalService.common.fail') } return authResultMap[status] || status; } -export const getTransTypeText = (transType?: string): string => { +export const getTransTypeText = (t: TFunction) => (transType?: string): string => { if (!transType) return ''; const transTypeMap: Record = { - 'REGISTER': '๋“ฑ๋ก', - 'AUTH': '์ธ์ฆ' + 'REGISTER': t('additionalService.faceAuth.registration'), + 'AUTH': t('additionalService.faceAuth.authentication') } return transTypeMap[transType] || transType; diff --git a/src/entities/additional-service/model/fund-account/constant.ts b/src/entities/additional-service/model/fund-account/constant.ts index 30001f9..befb42f 100644 --- a/src/entities/additional-service/model/fund-account/constant.ts +++ b/src/entities/additional-service/model/fund-account/constant.ts @@ -1,3 +1,4 @@ +import { TFunction } from 'i18next'; import { FundAccountReceiveAccountNameNo, FundAccountResultStatus, @@ -6,41 +7,41 @@ import { FundAccountStatus } from './types'; -export const FundAccountStatusBtnGroup = [ - { name: '์ „์ฒด', value: FundAccountStatus.ALL }, - { name: '๋“ฑ๋ก์™„๋ฃŒ', value: FundAccountStatus.REGIST_COMPLETE }, - { name: '์ด์ฒด์š”์ฒญ', value: FundAccountStatus.TRANSFER_REQUEST }, - { name: '์š”์ฒญ์„ฑ๊ณต', value: FundAccountStatus.REQUEST_SUCCESS }, - { name: '์š”์ฒญ์‹คํŒจ', value: FundAccountStatus.REQUEST_FAIL } +export const getFundAccountStatusBtnGroup = (t: TFunction) => [ + { name: t('transaction.constants.all'), value: FundAccountStatus.ALL }, + { name: t('additionalService.fundAccount.registrationComplete'), value: FundAccountStatus.REGIST_COMPLETE }, + { name: t('additionalService.fundAccount.transferRequest'), value: FundAccountStatus.TRANSFER_REQUEST }, + { name: t('additionalService.fundAccount.requestSuccess'), value: FundAccountStatus.REQUEST_SUCCESS }, + { name: t('additionalService.fundAccount.requestFail'), value: FundAccountStatus.REQUEST_FAIL } ]; -export const FundAccountResultStatusBtnGroup = [ - { name: '์ „์ฒด', value: FundAccountResultStatus.ALL }, - { name: '์š”์ฒญ', value: FundAccountResultStatus.REQUEST }, - { name: '์„ฑ๊ณต', value: FundAccountResultStatus.SUCCESS }, - { name: '์‹คํŒจ', value: FundAccountResultStatus.FAIL }, +export const getFundAccountResultStatusBtnGroup = (t: TFunction) => [ + { name: t('transaction.constants.all'), value: FundAccountResultStatus.ALL }, + { name: t('additionalService.common.request'), value: FundAccountResultStatus.REQUEST }, + { name: t('additionalService.common.success'), value: FundAccountResultStatus.SUCCESS }, + { name: t('additionalService.common.fail'), value: FundAccountResultStatus.FAIL }, ] -export const getFundAccountStatusName = (status?: string): string => { +export const getFundAccountStatusName = (t: TFunction) => (status?: string): string => { if (!status) return ''; - const found = FundAccountStatusBtnGroup.find(item => item.value === status); + const found = getFundAccountStatusBtnGroup(t).find(item => item.value === status); return found ? found.name : status; }; -export const getFundAccountResultStatusName = (status?: string): string => { - +export const getFundAccountResultStatusName = (t: TFunction) => (status?: string): string => { + if (!status) return ''; - const found = FundAccountResultStatusBtnGroup.find(item => item.value === status); + const found = getFundAccountResultStatusBtnGroup(t).find(item => item.value === status); return found ? found.name : status; } -export const FundAccountResultSearchDateTypeBtnGroup = [ - { name: '์š”์ฒญ์ผ์ž', value: FundAccountSearchDateType.REQUEST_DATE }, - { name: '์ด์ฒด์ผ์ž', value: FundAccountSearchDateType.APPLICATION_DATE } +export const getFundAccountResultSearchDateTypeBtnGroup = (t: TFunction) => [ + { name: t('additionalService.fundAccount.requestDate'), value: FundAccountSearchDateType.REQUEST_DATE }, + { name: t('additionalService.fundAccount.transferDate'), value: FundAccountSearchDateType.APPLICATION_DATE } ]; -export const FundAccountSearchClOptionsGroup = [ - { name: '์ˆ˜์ทจ์ธ', value: FundAccountSearchCl.ACCOUNT_NAME }, - { name: '๊ณ„์ขŒ๋ฒˆํ˜ธ', value: FundAccountSearchCl.ACCOUNT_NO }, +export const getFundAccountSearchClOptionsGroup = (t: TFunction) => [ + { name: t('additionalService.fundAccount.recipient'), value: FundAccountSearchCl.ACCOUNT_NAME }, + { name: t('additionalService.fundAccount.accountNumber'), value: FundAccountSearchCl.ACCOUNT_NO }, ]; \ No newline at end of file diff --git a/src/entities/additional-service/model/key-in/constant.ts b/src/entities/additional-service/model/key-in/constant.ts index 89cb73a..b37abbc 100644 --- a/src/entities/additional-service/model/key-in/constant.ts +++ b/src/entities/additional-service/model/key-in/constant.ts @@ -1,15 +1,15 @@ +import { TFunction } from 'i18next'; import { KeyInPaymentTansactionType } from "./types"; -// contant๋กœ ์˜ฎ๊ธฐ๊ธฐ -export const keyInPaymentPaymentStatusBtnGroup = [ - { name: '์ „์ฒด', value: KeyInPaymentTansactionType.ALL }, - { name: '์Šน์ธ', value: KeyInPaymentTansactionType.APPROVAL }, - { name: '์ „์ทจ์†Œ', value: KeyInPaymentTansactionType.FULL_CANCEL }, - { name: 'ํ›„์ทจ์†Œ', value: KeyInPaymentTansactionType.PARTIAL_CANCEL } +export const getKeyInPaymentPaymentStatusBtnGroup = (t: TFunction) => [ + { name: t('transaction.constants.all'), value: KeyInPaymentTansactionType.ALL }, + { name: t('transaction.constants.approval'), value: KeyInPaymentTansactionType.APPROVAL }, + { name: t('additionalService.keyIn.fullCancel'), value: KeyInPaymentTansactionType.FULL_CANCEL }, + { name: t('additionalService.keyIn.partialCancel'), value: KeyInPaymentTansactionType.PARTIAL_CANCEL } ]; -export const getKeyInPaymentPaymentStatusName = (status?: string): string => { +export const getKeyInPaymentPaymentStatusName = (t: TFunction) => (status?: string): string => { if (!status) return ''; - const found = keyInPaymentPaymentStatusBtnGroup.find(item => item.value === status); + const found = getKeyInPaymentPaymentStatusBtnGroup(t).find(item => item.value === status); return found ? found.name : status; } \ No newline at end of file diff --git a/src/entities/additional-service/model/link-pay/constant.ts b/src/entities/additional-service/model/link-pay/constant.ts index e320d7a..a655cb0 100644 --- a/src/entities/additional-service/model/link-pay/constant.ts +++ b/src/entities/additional-service/model/link-pay/constant.ts @@ -1,7 +1,8 @@ +import { TFunction } from 'i18next'; import { LinkPaymentProcessStatus } from "./types"; -export const ProcessStatusBtnGrouup = [ - { name: '์ „์ฒด', value: LinkPaymentProcessStatus.ALL }, - { name: '๋ฐœ์†ก์š”์ฒญ', value: LinkPaymentProcessStatus.SEND_REQUEST }, - { name: '๋ฐœ์†ก์ทจ์†Œ', value: LinkPaymentProcessStatus.SEND_CANCEL } +export const getProcessStatusBtnGroup = (t: TFunction) => [ + { name: t('transaction.constants.all'), value: LinkPaymentProcessStatus.ALL }, + { name: t('additionalService.linkPay.sendRequest'), value: LinkPaymentProcessStatus.SEND_REQUEST }, + { name: t('additionalService.linkPay.sendCancel'), value: LinkPaymentProcessStatus.SEND_CANCEL } ] \ No newline at end of file diff --git a/src/entities/additional-service/model/payout/constant.ts b/src/entities/additional-service/model/payout/constant.ts index d6921b3..656f0f3 100644 --- a/src/entities/additional-service/model/payout/constant.ts +++ b/src/entities/additional-service/model/payout/constant.ts @@ -1,23 +1,25 @@ +import { TFunction } from 'i18next'; import { PayoutSearchDateType, PayoutDisbursementStatus } from './types'; -export const PayoutSearchClBtnGroup = [ - {name: '์š”์ฒญ์ผ์ž', value: PayoutSearchDateType.REQUEST_DATE }, - {name: '์ง€๊ธ‰์ผ์ž', value: PayoutSearchDateType.SETTLEMENT_DATE } -]; -export const PayoutDisbursementStatusBtnGroup = [ - {name: '์ „์ฒด', value: PayoutDisbursementStatus.ALL}, - {name: '์š”์ฒญ', value: PayoutDisbursementStatus.REQUEST}, - {name: '์„ฑ๊ณต', value: PayoutDisbursementStatus.SUCCESS}, - {name: '์‹คํŒจ', value: PayoutDisbursementStatus.FAIL}, +export const getPayoutSearchClBtnGroup = (t: TFunction) => [ + {name: t('additionalService.payout.requestDate'), value: PayoutSearchDateType.REQUEST_DATE }, + {name: t('additionalService.payout.disbursementDate'), value: PayoutSearchDateType.SETTLEMENT_DATE } ]; -export const getPayoutStatusText = (status?: string): string => { +export const getPayoutDisbursementStatusBtnGroup = (t: TFunction) => [ + {name: t('transaction.constants.all'), value: PayoutDisbursementStatus.ALL}, + {name: t('additionalService.common.request'), value: PayoutDisbursementStatus.REQUEST}, + {name: t('additionalService.common.success'), value: PayoutDisbursementStatus.SUCCESS}, + {name: t('additionalService.common.fail'), value: PayoutDisbursementStatus.FAIL}, +]; + +export const getPayoutStatusText = (t: TFunction) => (status?: string): string => { if (!status) return ''; const statusMap: Record = { - "REQUEST" : "์š”์ฒญ", - "SUCCESS" : "์„ฑ๊ณต", - "FAIL" : "์‹คํŒจ" + "REQUEST" : t('additionalService.common.request'), + "SUCCESS" : t('additionalService.common.success'), + "FAIL" : t('additionalService.common.fail') } return statusMap[status] || status; diff --git a/src/entities/additional-service/model/sms-payment/constant.ts b/src/entities/additional-service/model/sms-payment/constant.ts index 16fe94a..633a388 100644 --- a/src/entities/additional-service/model/sms-payment/constant.ts +++ b/src/entities/additional-service/model/sms-payment/constant.ts @@ -1,13 +1,14 @@ +import { TFunction } from 'i18next'; import { SmsCl } from './types'; -export const SmsClBtnGroup = [ +export const getSmsClBtnGroup = (t: TFunction) => [ { name: '', value: SmsCl.ALL }, - { name: '๊ฐ€์ƒ๊ณ„์ขŒ ์š”์ฒญ', value: SmsCl.VACCOUNT_REQ }, - { name: '๊ฐ€์ƒ๊ณ„์ขŒ ์š”์ฒญ + ์ž…๊ธˆ', value: SmsCl.VACCOUNT_REQ_DEPOSIT } + { name: t('additionalService.sms.virtualAccountRequest'), value: SmsCl.VACCOUNT_REQ }, + { name: t('additionalService.sms.virtualAccountRequestDeposit'), value: SmsCl.VACCOUNT_REQ_DEPOSIT } ]; -export const getSmsClName = (smsCl?: string): string => { +export const getSmsClName = (t: TFunction) => (smsCl?: string): string => { if (!smsCl) return ''; - const found = SmsClBtnGroup.find(item => item.value === smsCl); + const found = getSmsClBtnGroup(t).find(item => item.value === smsCl); return found ? found.name : smsCl; }; diff --git a/src/entities/additional-service/ui/ars/resend-sms-bottom-sheet.tsx b/src/entities/additional-service/ui/ars/resend-sms-bottom-sheet.tsx index cdc9182..ff9b0a5 100644 --- a/src/entities/additional-service/ui/ars/resend-sms-bottom-sheet.tsx +++ b/src/entities/additional-service/ui/ars/resend-sms-bottom-sheet.tsx @@ -1,6 +1,8 @@ import { BottomSheetMotionDuration, BottomSheetMotionVaiants } from "@/entities/common/model/constant"; import { IMAGE_ROOT } from '@/shared/constants/common'; import { motion } from 'framer-motion'; +import { useTranslation } from 'react-i18next'; + export interface ArsResendSmsBottomSheetProps { bottomSheetOn: boolean; setBottomSheetOn: (bottomSheetOn: boolean) => void; @@ -14,6 +16,7 @@ export const ArsResendSmsBottomSheet = ({ phoneNumber, callResendSms }: ArsResendSmsBottomSheetProps) => { + const { t } = useTranslation(); const onClickToClose = () => { setBottomSheetOn(false); @@ -40,14 +43,14 @@ export const ArsResendSmsBottomSheet = ({ >
        -

        SMS ์žฌ์ „์†ก

        +

        {t('additionalService.common.resend')} SMS

        @@ -55,7 +58,7 @@ export const ArsResendSmsBottomSheet = ({
        -

        [01095800212] ๋ฒˆํ˜ธ๋กœ SMS๋ฅผ ์žฌ๋ฐœ์†ก ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

        +

        [{phoneNumber}] {t('transaction.sms.resendConfirmMessage')}

        @@ -63,7 +66,7 @@ export const ArsResendSmsBottomSheet = ({ className="btn-50 btn-blue flex-1" type="button" onClick={ () => onCliickToResendSms() } - >์‹ ์ฒญ + >{t('transaction.apply')}
        diff --git a/src/entities/additional-service/ui/filter/ars-filter.tsx b/src/entities/additional-service/ui/filter/ars-filter.tsx index f8ac9e4..8f0d16d 100644 --- a/src/entities/additional-service/ui/filter/ars-filter.tsx +++ b/src/entities/additional-service/ui/filter/ars-filter.tsx @@ -1,19 +1,20 @@ import { useEffect, useState } from 'react'; import { motion } from 'framer-motion'; +import { useTranslation } from 'react-i18next'; import { IMAGE_ROOT } from '@/shared/constants/common'; import { FilterSelect } from '@/shared/ui/filter/select'; import { FilterCalendar } from '@/shared/ui/filter/calendar'; import { FilterButtonGroups } from '@/shared/ui/filter/button-groups'; import { FilterRangeAmount } from '@/shared/ui/filter/range-amount'; -import { - FilterMotionDuration, - FilterMotionStyle, +import { + FilterMotionDuration, + FilterMotionStyle, FilterMotionVariants } from '@/entities/common/model/constant'; import moment from 'moment'; import { FilterInput } from '@/shared/ui/filter/input'; import { OrderStatus, PaymentStatus } from '../../model/ars/types'; -import { ArsOrderStatusBtnGroup, ArsPaymentStatusBtnGroup } from '../../model/ars/constant'; +import { getArsOrderStatusBtnGroup, getArsPaymentStatusBtnGroup } from '../../model/ars/constant'; import { useStore } from '@/shared/model/store'; import { FilterSelectMid } from '@/shared/ui/filter/select-mid'; @@ -67,7 +68,9 @@ export const ArsFilter = ({ const [filterOrderStatus, setFilterOrderStatus] = useState(orderStatus); const [filterMinAmount, setFilterMinAmount] = useState(minAmount); const [filterMaxAmount, setFilterMaxAmount] = useState(maxAmount); - + + const { t } = useTranslation(); + const onClickToClose = () => { setFilterOn(false); }; @@ -100,15 +103,15 @@ export const ArsFilter = ({ >
        -
        ํ•„ํ„ฐ
        +
        {t('filter.filter')}
        - @@ -116,36 +119,36 @@ export const ArsFilter = ({
        - + >{t('filter.apply')}
        diff --git a/src/locales/en.json b/src/locales/en.json index ccf7532..3a8b631 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -786,6 +786,69 @@ "reason": "Reason", "accountError": "Payment Account Error", "agreeOrReject": "Agree/Reject Settlement" + }, + "ars": { + "paymentComplete": "Payment Complete", + "unpaid": "Unpaid", + "pendingPayment": "Pending Payment", + "paymentSuccess": "Payment Success", + "expired": "Expired", + "canceled": "Canceled" + }, + "sms": { + "virtualAccountRequest": "Virtual Account Request", + "virtualAccountRequestDeposit": "Virtual Account Request + Deposit" + }, + "linkPay": { + "sendRequest": "Send Request", + "sendCancel": "Send Cancel", + "incompleteActive": "Incomplete/Active", + "depositRequest": "Deposit Request", + "paymentComplete": "Payment Complete", + "paymentFail": "Payment Failed", + "paymentStopped": "Payment Stopped", + "paymentStoppedInactive": "Payment Stopped/Inactive", + "pending": "Pending", + "email": "Email", + "alimtalk": "Alimtalk" + }, + "accountHolderAuth": { + "accountHolderNameMatch": "Account Holder Name Match", + "accountHolderNameMismatch": "Account Holder Name Mismatch", + "authFailedAccountError": "Authentication Failed (Account Error, etc.)" + }, + "accountHolderSearch": { + "accountHolder": "Account Holder", + "accountNumber": "Account Number" + }, + "faceAuth": { + "authentication": "Authentication", + "registration": "Registration" + }, + "fundAccount": { + "registrationComplete": "Registration Complete", + "transferRequest": "Transfer Request", + "requestSuccess": "Request Success", + "requestFail": "Request Failed", + "requestDate": "Request Date", + "transferDate": "Transfer Date", + "recipient": "Recipient", + "accountNumber": "Account Number" + }, + "alimtalk": { + "buyer": "Buyer", + "depositRequest": "Deposit Request", + "depositComplete": "Deposit Complete", + "kakaotalk": "KakaoTalk", + "fbSms": "FB SMS" + }, + "payout": { + "requestDate": "Request Date", + "disbursementDate": "Disbursement Date" + }, + "keyIn": { + "fullCancel": "Full Cancel", + "partialCancel": "Partial Cancel" } }, "merchant": { diff --git a/src/locales/ko.json b/src/locales/ko.json index 8386059..0e9ca23 100644 --- a/src/locales/ko.json +++ b/src/locales/ko.json @@ -790,6 +790,69 @@ "reason": "์‚ฌ์œ ", "accountError": "์ง€๊ธ‰ ๊ณ„์ขŒ์˜ค๋ฅ˜", "agreeOrReject": "์ •์‚ฐ ๋™์˜/๊ฑฐ์ ˆ" + }, + "ars": { + "paymentComplete": "๊ฒฐ์ œ์™„๋ฃŒ", + "unpaid": "๋ฏธ๊ฒฐ์ œ", + "pendingPayment": "๊ฒฐ์ œ๋Œ€๊ธฐ", + "paymentSuccess": "๊ฒฐ์ œ์„ฑ๊ณต", + "expired": "๊ธฐ๊ฐ„๋งŒ๋ฃŒ", + "canceled": "์ทจ์†Œ์™„๋ฃŒ" + }, + "sms": { + "virtualAccountRequest": "๊ฐ€์ƒ๊ณ„์ขŒ ์š”์ฒญ", + "virtualAccountRequestDeposit": "๊ฐ€์ƒ๊ณ„์ขŒ ์š”์ฒญ + ์ž…๊ธˆ" + }, + "linkPay": { + "sendRequest": "๋ฐœ์†ก์š”์ฒญ", + "sendCancel": "๋ฐœ์†ก์ทจ์†Œ", + "incompleteActive": "๋ฏธ์™„๋ฃŒ/ํ™œ์„ฑํ™”", + "depositRequest": "์ž…๊ธˆ์š”์ฒญ", + "paymentComplete": "๊ฒฐ์ œ์™„๋ฃŒ", + "paymentFail": "๊ฒฐ์ œ์‹คํŒจ", + "paymentStopped": "๊ฒฐ์ œ์ค‘๋‹จ", + "paymentStoppedInactive": "๊ฒฐ์ œ์ค‘๋‹จ/๋น„ํ™œ์„ฑํ™”", + "pending": "๋Œ€๊ธฐ์ค‘", + "email": "์ด๋ฉ”์ผ", + "alimtalk": "์•Œ๋ฆผํ†ก" + }, + "accountHolderAuth": { + "accountHolderNameMatch": "์˜ˆ๊ธˆ์ฃผ๋ช… ์ผ์น˜", + "accountHolderNameMismatch": "์˜ˆ๊ธˆ์ฃผ๋ช… ๋ถˆ์ผ์น˜", + "authFailedAccountError": "์ธ์ฆ์‹คํŒจ (๊ณ„์ขŒ ์˜ค๋ฅ˜ ๋“ฑ)" + }, + "accountHolderSearch": { + "accountHolder": "์˜ˆ๊ธˆ์ฃผ", + "accountNumber": "๊ณ„์ขŒ๋ฒˆํ˜ธ" + }, + "faceAuth": { + "authentication": "์ธ์ฆ", + "registration": "๋“ฑ๋ก" + }, + "fundAccount": { + "registrationComplete": "๋“ฑ๋ก์™„๋ฃŒ", + "transferRequest": "์ด์ฒด์š”์ฒญ", + "requestSuccess": "์š”์ฒญ์„ฑ๊ณต", + "requestFail": "์š”์ฒญ์‹คํŒจ", + "requestDate": "์š”์ฒญ์ผ์ž", + "transferDate": "์ด์ฒด์ผ์ž", + "recipient": "์ˆ˜์ทจ์ธ", + "accountNumber": "๊ณ„์ขŒ๋ฒˆํ˜ธ" + }, + "alimtalk": { + "buyer": "์ฃผ๋ฌธ์ž", + "depositRequest": "์ž…๊ธˆ์š”์ฒญ", + "depositComplete": "์ž…๊ธˆ์™„๋ฃŒ", + "kakaotalk": "์นด์นด์˜คํ†ก", + "fbSms": "FB SMS" + }, + "payout": { + "requestDate": "์š”์ฒญ์ผ์ž", + "disbursementDate": "์ง€๊ธ‰์ผ์ž" + }, + "keyIn": { + "fullCancel": "์ „์ทจ์†Œ", + "partialCancel": "ํ›„์ทจ์†Œ" } }, "merchant": { From 07bb14944471ebbfe219e6d5627f7f67e5b814b3 Mon Sep 17 00:00:00 2001 From: Jay Sheen Date: Thu, 30 Oct 2025 18:12:18 +0900 Subject: [PATCH 11/15] Add i18n localization to home entity MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add translation keys to home namespace: - home.banner.doNotShowToday: Banner "don't show today" button - home.banner.close: Banner close button - home.biometricRegistration.*: Biometric registration dialog - home.notice.goTo: Notice item navigation label - Localize 3 UI components: - ui/home-bottom-banner.tsx: Banner bottom sheet buttons - ui/home-notice-item.tsx: Notice item alt text - ui/auth-reguster.tsx: Biometric registration dialog - All other home components already localized ๐Ÿค– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- src/entities/home/ui/auth-reguster.tsx | 32 ++++++++++++--------- src/entities/home/ui/home-bottom-banner.tsx | 8 ++++-- src/entities/home/ui/home-notice-item.tsx | 6 ++-- src/locales/en.json | 15 +++++++++- src/locales/ko.json | 15 +++++++++- 5 files changed, 55 insertions(+), 21 deletions(-) diff --git a/src/entities/home/ui/auth-reguster.tsx b/src/entities/home/ui/auth-reguster.tsx index 9ff2ed8..d9db7f8 100644 --- a/src/entities/home/ui/auth-reguster.tsx +++ b/src/entities/home/ui/auth-reguster.tsx @@ -3,12 +3,14 @@ import { AuthRegisterProps } from '../model/types'; import { motion } from 'framer-motion'; import { useAppBridge } from '@/hooks/useAppBridge'; import { BottomSheetMotionDuration, BottomSheetMotionVaiants } from '@/entities/common/model/constant'; +import { useTranslation } from 'react-i18next'; export const AuthRegister = ({ setAuthRegisterOn, authRegisterOn, }: AuthRegisterProps) => { const { registerBiometric, closeBiometricRegistrationPopup } = useAppBridge(); + const { t } = useTranslation(); const onClickToClose = () => { closeBiometricRegistrationPopup(); @@ -33,14 +35,14 @@ export const AuthRegister = ({ >
        -

        ๊ฐ„ํŽธ ์ธ์ฆ ๋“ฑ๋ก

        - @@ -49,22 +51,26 @@ export const AuthRegister = ({
        - ๊ฐ„ํŽธ ์ธ์ฆ ๋“ฑ๋ก ํ•œ๋ฒˆ์œผ๋กœ,
        - ๋น„๋ฐ€๋ฒˆํ˜ธ ์—†์ด ํŽธ๋ฆฌํ•˜๊ฒŒ ๋กœ๊ทธ์ธํ•˜์„ธ์š”. + {t('home.biometricRegistration.description').split('\n').map((line, index) => ( + + {line} + {index === 0 &&
        } +
        + ))}
        - - + + >{t('home.biometricRegistration.registerNow')}
        diff --git a/src/entities/home/ui/home-bottom-banner.tsx b/src/entities/home/ui/home-bottom-banner.tsx index bf54b59..c01a53a 100644 --- a/src/entities/home/ui/home-bottom-banner.tsx +++ b/src/entities/home/ui/home-bottom-banner.tsx @@ -11,6 +11,7 @@ import { useEffect, useState } from 'react'; import { Swiper, SwiperSlide } from 'swiper/react'; import 'swiper/css'; import { Autoplay, Pagination } from 'swiper/modules'; +import { useTranslation } from 'react-i18next'; export const HomeBottomBanner = ({ setBottomBannerOn, @@ -18,7 +19,8 @@ export const HomeBottomBanner = ({ bannerList }: HomeBottomBannerProps) => { const { navigate } = useNavigate(); - + const { t } = useTranslation(); + const [isFirstOpen, setIsFirstOpen] = useState(false); const [currentSlide, setCurrentSlide] = useState(1); @@ -109,8 +111,8 @@ export const HomeBottomBanner = ({
        - onClickToCloseDay() }>์˜ค๋Š˜ ํ•˜๋ฃจ ๋ณด์ง€ ์•Š๊ธฐ - onClickToClose() }>๋‹ซ๊ธฐ + onClickToCloseDay() }>{t('home.banner.doNotShowToday')} + onClickToClose() }>{t('home.banner.close')}
        diff --git a/src/entities/home/ui/home-notice-item.tsx b/src/entities/home/ui/home-notice-item.tsx index cd84e3a..0cbe040 100644 --- a/src/entities/home/ui/home-notice-item.tsx +++ b/src/entities/home/ui/home-notice-item.tsx @@ -34,9 +34,9 @@ export const HomeNoticeItem = ({
        { t(`support.notice.categories.${informCl}`) }{ moment(regDt).format('YY๋…„ MM์›” DD์ผ') }
        - ๊ณต์ง€์‚ฌํ•ญ ๋ฐ”๋กœ๊ฐ€๊ธฐ
        diff --git a/src/locales/en.json b/src/locales/en.json index 3a8b631..853b9a3 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -325,7 +325,20 @@ "topSalesDays": "Top Sales Days", "topSalesHours": "Top Sales Hours", "topPaymentMethods": "Top Payment Methods", - "noticesAndUpdates": "Notices & Updates" + "noticesAndUpdates": "Notices & Updates", + "banner": { + "doNotShowToday": "Don't show today", + "close": "Close" + }, + "biometricRegistration": { + "title": "Biometric Authentication Setup", + "description": "Register biometric authentication once,\nand log in conveniently without a password.", + "later": "Later", + "registerNow": "Register Now" + }, + "notice": { + "goTo": "Go to Notice" + } }, "settlement": { "title": "Settlement", diff --git a/src/locales/ko.json b/src/locales/ko.json index 0e9ca23..e5a73d8 100644 --- a/src/locales/ko.json +++ b/src/locales/ko.json @@ -329,7 +329,20 @@ "topSalesDays": "๋งค์ถœ์ด ๊ฐ€์žฅ ๋†’์€ ์š”์ผ", "topSalesHours": "๋งค์ถœ์ด ๊ฐ€์žฅ ๋†’์€ ์‹œ๊ฐ„", "topPaymentMethods": "๊ฐ€์žฅ ๋งŽ์ด์“ฐ์ธ ๊ฒฐ์ œ ์ˆ˜๋‹จ", - "noticesAndUpdates": "๊ณต์ง€ & ์ตœ์‹ ์ •๋ณด" + "noticesAndUpdates": "๊ณต์ง€ & ์ตœ์‹ ์ •๋ณด", + "banner": { + "doNotShowToday": "์˜ค๋Š˜ ํ•˜๋ฃจ ๋ณด์ง€ ์•Š๊ธฐ", + "close": "๋‹ซ๊ธฐ" + }, + "biometricRegistration": { + "title": "๊ฐ„ํŽธ ์ธ์ฆ ๋“ฑ๋ก", + "description": "๊ฐ„ํŽธ ์ธ์ฆ ๋“ฑ๋ก ํ•œ๋ฒˆ์œผ๋กœ,\n๋น„๋ฐ€๋ฒˆํ˜ธ ์—†์ด ํŽธ๋ฆฌํ•˜๊ฒŒ ๋กœ๊ทธ์ธํ•˜์„ธ์š”.", + "later": "๋‹ค์Œ์—", + "registerNow": "์ง€๊ธˆ ๋“ฑ๋กํ•˜๊ธฐ" + }, + "notice": { + "goTo": "๊ณต์ง€์‚ฌํ•ญ ๋ฐ”๋กœ๊ฐ€๊ธฐ" + } }, "settlement": { "title": "์ •์‚ฐ์กฐํšŒ", From 42644f1f676bdb39404a55c082423da4aa5d5932 Mon Sep 17 00:00:00 2001 From: Jay Sheen Date: Thu, 30 Oct 2025 18:15:46 +0900 Subject: [PATCH 12/15] Add i18n localization to support entity MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add translation keys to support.qna namespace: - support.qna.registrationDate: QnA item registration date label - support.qna.status: QnA item status label - Localize ui/qna-item.tsx: - Replace hardcoded "๋“ฑ๋ก์ผ" with translation key - Replace hardcoded "์ƒํƒœ" with translation key - Other support files (notice-item.tsx, faq-item.tsx) already localized ๐Ÿค– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- src/entities/support/ui/qna-item.tsx | 4 ++-- src/locales/en.json | 2 ++ src/locales/ko.json | 2 ++ 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/entities/support/ui/qna-item.tsx b/src/entities/support/ui/qna-item.tsx index 312c9bc..f28cd3e 100644 --- a/src/entities/support/ui/qna-item.tsx +++ b/src/entities/support/ui/qna-item.tsx @@ -48,8 +48,8 @@ export const SupportQnaItem = ({
        { title }
        - ๋“ฑ๋ก์ผ{ moment(requestDate).format('YYYY.MM.DD') } - ใ…ฃ์ƒํƒœ [{t(`support.qna.statusCode.${statusCode}`)}] + {t('support.qna.registrationDate')}{ moment(requestDate).format('YYYY.MM.DD') } + ใ…ฃ{t('support.qna.status')} [{t(`support.qna.statusCode.${statusCode}`)}]
        diff --git a/src/locales/en.json b/src/locales/en.json index 853b9a3..935e894 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -184,6 +184,8 @@ "merchant": "Merchant", "all": "All", "inquiryButton": "Submit Inquiry", + "registrationDate": "Registered", + "status": "Status", "categories": { "all": "All", "choose": "Choose", diff --git a/src/locales/ko.json b/src/locales/ko.json index e5a73d8..e4c1b9c 100644 --- a/src/locales/ko.json +++ b/src/locales/ko.json @@ -189,6 +189,8 @@ "merchant": "๊ฐ€๋งน์ ", "all": "์ „์ฒด", "inquiryButton": "1:1 ๋ฌธ์˜ํ•˜๊ธฐ", + "registrationDate": "๋“ฑ๋ก์ผ", + "status": "์ƒํƒœ", "categories": { "all": "๋ชจ๋‘", "choose": "์„ ํƒ", From d8c25b154cac44724d990ca35a964d403d47401e Mon Sep 17 00:00:00 2001 From: Jay Sheen Date: Thu, 30 Oct 2025 18:19:42 +0900 Subject: [PATCH 13/15] Add i18n localization to calendar-month filter component MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add translation keys to filter namespace: - filter.periods.currentMonth: Current month period option - filter.periods.2months: 2 months period option - filter.selectDate: Date selection placeholder and alt text - Localize shared/ui/filter/calendar-month.tsx: - Replace hardcoded "์กฐํšŒ๊ธฐ๊ฐ„" with filter.period - Replace hardcoded "๋‹น์›”" with filter.periods.currentMonth - Replace hardcoded "2๊ฐœ์›”" with filter.periods.2months - Replace hardcoded "3๊ฐœ์›”" with filter.periods.3months - Replace hardcoded "์ง์ ‘์ž…๋ ฅ" with filter.periods.custom - Replace hardcoded "๋‚ ์งœ ์„ ํƒ" with filter.selectDate ๐Ÿค– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- src/locales/en.json | 3 +++ src/locales/ko.json | 3 +++ src/shared/ui/filter/calendar-month.tsx | 32 +++++++++++++------------ 3 files changed, 23 insertions(+), 15 deletions(-) diff --git a/src/locales/en.json b/src/locales/en.json index 935e894..f67b51d 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -91,11 +91,14 @@ "issueNumber": "Issue Number" }, "periods": { + "currentMonth": "Current Month", "1month": "1 Month", + "2months": "2 Months", "3months": "3 Months", "6months": "6 Months", "custom": "Custom" }, + "selectDate": "Select Date", "transactionType": "Payment Type", "transactionTypes": { "all": "All", diff --git a/src/locales/ko.json b/src/locales/ko.json index e4c1b9c..2c5c95b 100644 --- a/src/locales/ko.json +++ b/src/locales/ko.json @@ -91,11 +91,14 @@ "issueNumber": "๋ฐœํ–‰๋ฒˆํ˜ธ" }, "periods": { + "currentMonth": "๋‹น์›”", "1month": "1๊ฐœ์›”", + "2months": "2๊ฐœ์›”", "3months": "3๊ฐœ์›”", "6months": "6๊ฐœ์›”", "custom": "์ง์ ‘์ž…๋ ฅ" }, + "selectDate": "๋‚ ์งœ ์„ ํƒ", "transactionType": "๊ฑฐ๋ž˜๊ตฌ๋ถ„", "transactionTypes": { "all": "์ „์ฒด", diff --git a/src/shared/ui/filter/calendar-month.tsx b/src/shared/ui/filter/calendar-month.tsx index a392d0b..1481f67 100644 --- a/src/shared/ui/filter/calendar-month.tsx +++ b/src/shared/ui/filter/calendar-month.tsx @@ -4,6 +4,7 @@ import { CalendarType, FilterMonthOptions } from '@/entities/common/model/types' import { IMAGE_ROOT } from '@/shared/constants/common'; import NiceCalendarMonth from '../calendar/nice-calendar-month'; import { useEffect } from 'react'; +import { useTranslation } from 'react-i18next'; interface FilterCalendarMonthProps { title?: string; @@ -20,7 +21,8 @@ export const FilterCalendarMonth = ({ setStartMonth, setEndMonth }: FilterCalendarMonthProps) => { - const [filterTitle, setFilterTitle] = useState(title || '์กฐํšŒ๊ธฐ๊ฐ„'); + const { t } = useTranslation(); + const [filterTitle, setFilterTitle] = useState(title || t('filter.period')); const [monthReadOnly, setMonthReadyOnly] = useState(false); const [filterMonthOptionsBtn, setFilterMonthOptionsBtn] = useState(FilterMonthOptions.Input); const [calendarOpen, setCalendarOpen] = useState(false); @@ -83,22 +85,22 @@ export const FilterCalendarMonth = ({
        { filterTitle }
        - setFilterMonth(FilterMonthOptions.Month1) } - >๋‹น์›” - {t('filter.periods.currentMonth')} + setFilterMonth(FilterMonthOptions.Month2) } - >2๊ฐœ์›” - {t('filter.periods.2months')} + setFilterMonth(FilterMonthOptions.Month3) } - >3๊ฐœ์›” - {t('filter.periods.3months')} + setFilterMonth(FilterMonthOptions.Input) } - >์ง์ ‘์ž…๋ ฅ + >{t('filter.periods.custom')}
        @@ -106,7 +108,7 @@ export const FilterCalendarMonth = ({ id="startDate" className="date-input" type="text" - placeholder="๋‚ ์งœ ์„ ํƒ" + placeholder={t('filter.selectDate')} value={ moment(startMonth).format('YYYY.MM') } onChange={ (e: ChangeEvent) => {} } readOnly={ monthReadOnly } @@ -118,7 +120,7 @@ export const FilterCalendarMonth = ({ > ๋‚ ์งœ ์„ ํƒ
        @@ -128,19 +130,19 @@ export const FilterCalendarMonth = ({ id="endDate" className="date-input" type="text" - placeholder="๋‚ ์งœ ์„ ํƒ" + placeholder={t('filter.selectDate')} value={ moment(endMonth).format('YYYY.MM') } onChange={ (e: ChangeEvent) => {} } readOnly={ monthReadOnly } /> -
        From de4e8ce3c598fa862b80e02ed13f39b14ff10e2d Mon Sep 17 00:00:00 2001 From: Jay Sheen Date: Thu, 30 Oct 2025 18:22:15 +0900 Subject: [PATCH 14/15] Add i18n localization to calendar filter component MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add translation keys to filter.periods namespace: - filter.periods.today: Today period option - filter.periods.week: Week period option - Localize shared/ui/filter/calendar.tsx: - Replace hardcoded "์กฐํšŒ๊ธฐ๊ฐ„" with filter.period - Replace hardcoded "๋‹น์ผ" with filter.periods.today - Replace hardcoded "์ผ์ฃผ์ผ" with filter.periods.week - Replace hardcoded "1๊ฐœ์›”" with filter.periods.1month - Replace hardcoded "์ง์ ‘์ž…๋ ฅ" with filter.periods.custom - Replace hardcoded "๋‚ ์งœ ์„ ํƒ" with filter.selectDate ๐Ÿค– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- src/locales/en.json | 2 ++ src/locales/ko.json | 2 ++ src/shared/ui/filter/calendar.tsx | 32 ++++++++++++++++--------------- 3 files changed, 21 insertions(+), 15 deletions(-) diff --git a/src/locales/en.json b/src/locales/en.json index f67b51d..5faf48b 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -91,6 +91,8 @@ "issueNumber": "Issue Number" }, "periods": { + "today": "Today", + "week": "1 Week", "currentMonth": "Current Month", "1month": "1 Month", "2months": "2 Months", diff --git a/src/locales/ko.json b/src/locales/ko.json index 2c5c95b..63db7b4 100644 --- a/src/locales/ko.json +++ b/src/locales/ko.json @@ -91,6 +91,8 @@ "issueNumber": "๋ฐœํ–‰๋ฒˆํ˜ธ" }, "periods": { + "today": "๋‹น์ผ", + "week": "์ผ์ฃผ์ผ", "currentMonth": "๋‹น์›”", "1month": "1๊ฐœ์›”", "2months": "2๊ฐœ์›”", diff --git a/src/shared/ui/filter/calendar.tsx b/src/shared/ui/filter/calendar.tsx index 164f5f0..4cd5675 100644 --- a/src/shared/ui/filter/calendar.tsx +++ b/src/shared/ui/filter/calendar.tsx @@ -4,6 +4,7 @@ import { CalendarType, FilterDateOptions } from '@/entities/common/model/types'; import { IMAGE_ROOT } from '@/shared/constants/common'; import NiceCalendar from '../calendar/nice-calendar'; import { useEffect } from 'react'; +import { useTranslation } from 'react-i18next'; interface FilterCalendarProps { title?: string; @@ -20,7 +21,8 @@ export const FilterCalendar = ({ setStartDate, setEndDate }: FilterCalendarProps) => { - const [filterTitle, setFilterTitle] = useState(title || '์กฐํšŒ๊ธฐ๊ฐ„'); + const { t } = useTranslation(); + const [filterTitle, setFilterTitle] = useState(title || t('filter.period')); const [dateReadOnly, setDateReadyOnly] = useState(false); const [filterDateOptionsBtn, setFilterDateOptionsBtn] = useState(FilterDateOptions.Input); const [calendarOpen, setCalendarOpen] = useState(false); @@ -106,22 +108,22 @@ export const FilterCalendar = ({
        { filterTitle }
        - setFilterDate(FilterDateOptions.Today) } - >๋‹น์ผ - {t('filter.periods.today')} + setFilterDate(FilterDateOptions.Week) } - >์ผ์ฃผ์ผ - {t('filter.periods.week')} + setFilterDate(FilterDateOptions.Month) } - >1๊ฐœ์›” - {t('filter.periods.1month')} + setFilterDate(FilterDateOptions.Input) } - >์ง์ ‘์ž…๋ ฅ + >{t('filter.periods.custom')}
        @@ -129,7 +131,7 @@ export const FilterCalendar = ({ id="startDate" className="date-input" type="text" - placeholder="๋‚ ์งœ ์„ ํƒ" + placeholder={t('filter.selectDate')} value={ newStartDate } onChange={ (e: ChangeEvent) => {} } readOnly={ dateReadOnly } @@ -141,7 +143,7 @@ export const FilterCalendar = ({ > ๋‚ ์งœ ์„ ํƒ
        @@ -151,19 +153,19 @@ export const FilterCalendar = ({ id="endDate" className="date-input" type="text" - placeholder="๋‚ ์งœ ์„ ํƒ" + placeholder={t('filter.selectDate')} value={ newEndDate } onChange={ (e: ChangeEvent) => {} } readOnly={ dateReadOnly } /> -
        From 2ed93ec742dba4e9af73a05e6017470687188649 Mon Sep 17 00:00:00 2001 From: Jay Sheen Date: Thu, 30 Oct 2025 18:24:45 +0900 Subject: [PATCH 15/15] Update sorting UI spacing and layout MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adjust gap spacing in filter header and sort options for better visual alignment. ๐Ÿค– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- src/shared/ui/assets/css/style.css | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/shared/ui/assets/css/style.css b/src/shared/ui/assets/css/style.css index ddcd9a7..a0ec99c 100644 --- a/src/shared/ui/assets/css/style.css +++ b/src/shared/ui/assets/css/style.css @@ -2090,12 +2090,13 @@ input[type="radio"] { align-items: center; padding: 15px 10px; margin-bottom: 10px; + gap: 10px; } .sort-options { display: flex; align-items: center; - gap: 10px; + gap: 4px; } .sort-btn {