From ac8b8d8c94d5595e2affd8da75f5cf82a1d35b1b Mon Sep 17 00:00:00 2001 From: Jay Sheen Date: Thu, 30 Oct 2025 15:53:09 +0900 Subject: [PATCH] Add localization to transaction filter components MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add i18n support to all transaction filter components - Add translation keys for filter UI elements in ko.json and en.json - Replace hardcoded Korean text with useTranslation hook - Updated components: all-transaction-filter, cash-receipt-filter, billing-filter, escrow-filter ๐Ÿค– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- .../ui/filter/all-transaction-filter.tsx | 70 ++++++++++--------- .../transaction/ui/filter/billing-filter.tsx | 48 +++++++------ .../ui/filter/cash-receipt-filter.tsx | 38 +++++----- .../transaction/ui/filter/escrow-filter.tsx | 42 +++++------ src/locales/en.json | 30 ++++++++ src/locales/ko.json | 30 ++++++++ 6 files changed, 163 insertions(+), 95 deletions(-) diff --git a/src/entities/transaction/ui/filter/all-transaction-filter.tsx b/src/entities/transaction/ui/filter/all-transaction-filter.tsx index 62a0335..bd055a1 100644 --- a/src/entities/transaction/ui/filter/all-transaction-filter.tsx +++ b/src/entities/transaction/ui/filter/all-transaction-filter.tsx @@ -1,22 +1,23 @@ import { useEffect } from 'react'; import { 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 { FilterSelectInput } from '@/shared/ui/filter/select-input'; import { FilterCalendar } from '@/shared/ui/filter/calendar'; import { FilterButtonGroups } from '@/shared/ui/filter/button-groups'; import { FilterRangeAmount } from '@/shared/ui/filter/range-amount'; -import { +import { AllTransactionMoidTidOptionsGroup, AllTracsactionStatusCode, } from '@/entities/transaction/model/contant'; -import { +import { AllTransactionFilterProps, AllTransactionSearchCl, AllTransactionMoidTid } from '../../model/types'; -import { +import { FilterMotionDuration, FilterMotionStyle, FilterMotionVariants @@ -53,6 +54,7 @@ export const AllTransactionFilter = ({ setSearchValue, serviceCodeOptions }: AllTransactionFilterProps) => { + const { t } = useTranslation(); const [filterMid, setFilterMid] = useState(mid); const [filterMoidTidType, setFilterMoidTidType] = useState(AllTransactionMoidTid.MOID); @@ -63,7 +65,7 @@ export const AllTransactionFilter = ({ const [filterServiceCode, setFilterServiceCode] = useState(serviceCode); const [filterMinAmount, setFilterMinAmount] = useState(minAmount); const [filterMaxAmount, setFilterMaxAmount] = useState(maxAmount); - + const [filterCardCode, setFilterCardCode] = useState(cardCode); const [filterBankCode, setFilterBankCode] = useState(bankCode); @@ -120,36 +122,36 @@ export const AllTransactionFilter = ({ } else if(value === '01'){ - options.push({name: '์นด๋“œ๋ฒˆํ˜ธ', value: AllTransactionSearchCl.CARD_NO}); - options.push({name: '์Šน์ธ๋ฒˆํ˜ธ', value: AllTransactionSearchCl.CARD_APPROVAL_NO}); + options.push({name: t('filter.searchOptions.cardNumber'), value: AllTransactionSearchCl.CARD_NO}); + options.push({name: t('filter.searchOptions.approvalNumber'), value: AllTransactionSearchCl.CARD_APPROVAL_NO}); } else if(value === '02'){ - options.push({name: '๊ตฌ๋งค์ž๋ช…', value: AllTransactionSearchCl.BANK_BUYER_NM}); + options.push({name: t('filter.searchOptions.buyerName'), value: AllTransactionSearchCl.BANK_BUYER_NM}); } else if(value === '03'){ - options.push({name: '๊ฐ€์ƒ๊ณ„์ขŒ๋ฒˆํ˜ธ', value: AllTransactionSearchCl.VACCT_NO}); - options.push({name: '์ž…๊ธˆ์ž๋ช…', value: AllTransactionSearchCl.VACCT_DEPOSIT_NM}); + options.push({name: t('filter.searchOptions.virtualAccountNumber'), value: AllTransactionSearchCl.VACCT_NO}); + options.push({name: t('filter.searchOptions.depositorName'), value: AllTransactionSearchCl.VACCT_DEPOSIT_NM}); } else if(value === '05'){ - options.push({name: 'ํœด๋Œ€ํฐ๋ฒˆํ˜ธ', value: AllTransactionSearchCl.TEL_NO}); + options.push({name: t('filter.searchOptions.phoneNumber'), value: AllTransactionSearchCl.TEL_NO}); } else if(value === '14'){ - options.push({name: '์ƒํ’ˆ๊ถŒ๋ฒˆํ˜ธ', value: AllTransactionSearchCl.SSGMONEY_GIFT_NO}); + options.push({name: t('filter.searchOptions.giftCardNumber'), value: AllTransactionSearchCl.SSGMONEY_GIFT_NO}); } else if(value === '21'){ - options.push({name: '์Šน์ธ๋ฒˆํ˜ธ', value: AllTransactionSearchCl.SSGBANK_APPROVAL_NO}); + options.push({name: t('filter.searchOptions.approvalNumber'), value: AllTransactionSearchCl.SSGBANK_APPROVAL_NO}); } else if(value === '24'){ - options.push({name: '๊ณ ๊ฐID', value: AllTransactionSearchCl.CMSBANK_USER_ID}); + options.push({name: t('filter.searchOptions.customerId'), value: AllTransactionSearchCl.CMSBANK_USER_ID}); } else if(value === '26'){ - options.push({name: '์ปฌ์ฒ˜๋žœ๋“œID', value: AllTransactionSearchCl.SSGBANK_APPROVAL_NO}); + options.push({name: t('filter.searchOptions.culturelandId'), value: AllTransactionSearchCl.SSGBANK_APPROVAL_NO}); } else if(value === '31'){ - options.push({name: '์นด๋“œ๋ฒˆํ˜ธ', value: AllTransactionSearchCl.TMONEY_CARD_NO}); + options.push({name: t('filter.searchOptions.tmoneyCardNumber'), value: AllTransactionSearchCl.TMONEY_CARD_NO}); } setSearchClOptionsGroup(options); - + }; const onChangeServiceCode = (val: string) => { @@ -184,29 +186,29 @@ export const AllTransactionFilter = ({ >
-
ํ•„ํ„ฐ
+
{t('filter.filter')}
-
- +
- + - { serviceCodeOptions && + { serviceCodeOptions && } - + */} - +
- + >{t('filter.apply')}
diff --git a/src/entities/transaction/ui/filter/billing-filter.tsx b/src/entities/transaction/ui/filter/billing-filter.tsx index a6ceb1a..8c8f3bc 100644 --- a/src/entities/transaction/ui/filter/billing-filter.tsx +++ b/src/entities/transaction/ui/filter/billing-filter.tsx @@ -1,26 +1,27 @@ import { useEffect } from 'react'; import { 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 { FilterSelectInput } from '@/shared/ui/filter/select-input'; import { FilterCalendar } from '@/shared/ui/filter/calendar'; import { FilterButtonGroups } from '@/shared/ui/filter/button-groups'; import { FilterRangeAmount } from '@/shared/ui/filter/range-amount'; -import { +import { BillingSearchTypeOptionsGroup, - BillingRequestStatusBtnGroup, + BillingRequestStatusBtnGroup, BillingProcessResultBtnGroup, - BillingPaymentMethodBtnGroup + BillingPaymentMethodBtnGroup } from '@/entities/transaction/model/contant'; -import { +import { BillingFilterProps, BillingPaymentMethod, BillingProcessResult, BillingRequestStatus, BillingSearchType } from '../../model/types'; -import { +import { FilterMotionDuration, FilterMotionStyle, FilterMotionVariants @@ -52,6 +53,7 @@ export const BillingFilter = ({ setMinAmount, setMaxAmount }: BillingFilterProps) => { + const { t } = useTranslation(); const [filterMid, setFilterMid] = useState(mid); const [filterSearchType, setFilterSearchType] = useState(searchType); @@ -63,7 +65,7 @@ export const BillingFilter = ({ const [filterPaymentMethod, setFilterPaymentMethod] = useState(paymentMethod); const [filterMinAmount, setFilterMinAmount] = useState(minAmount); const [filterMaxAmount, setFilterMaxAmount] = useState(maxAmount); - + const midOptions = useStore.getState().UserStore.selectOptionsMids; const onClickToClose = () => { @@ -104,29 +106,29 @@ export const BillingFilter = ({ >
-
ํ•„ํ„ฐ
+
{t('filter.filter')}
-
- +
- + - + - +
- + >{t('filter.apply')}
diff --git a/src/entities/transaction/ui/filter/cash-receipt-filter.tsx b/src/entities/transaction/ui/filter/cash-receipt-filter.tsx index d6b0e2d..f651e32 100644 --- a/src/entities/transaction/ui/filter/cash-receipt-filter.tsx +++ b/src/entities/transaction/ui/filter/cash-receipt-filter.tsx @@ -1,6 +1,7 @@ import { useEffect } from 'react'; import { 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 { FilterSelectInput } from '@/shared/ui/filter/select-input'; @@ -11,14 +12,14 @@ import { CashReceiptTransactionTypeBtnGroup, CashReceiptProcessResultBtnGroup } from '@/entities/transaction/model/contant'; -import { +import { CashReceiptFilterProps, CashReceiptPurposeType, CashReceiptTransactionType, CashReceiptProcessResult, CashReceiptSearchNumberType } from '../../model/types'; -import { +import { FilterMotionDuration, FilterMotionStyle, FilterMotionVariants @@ -44,6 +45,7 @@ export const CashReceiptFilter = ({ setProcessResult, setSearchNumberType }: CashReceiptFilterProps) => { + const { t } = useTranslation(); const [filterMid, setFilterMid] = useState(mid); const [filterStartDate, setFilterStartDate] = useState(startDate); @@ -56,8 +58,8 @@ export const CashReceiptFilter = ({ const [filterIssueType, setFilterIssueType] = useState(''); const [filterIssueNumber, setFilterIssueNumber] = useState(''); const issueTypeOptionsGroup = [ - {name: '์Šน์ธ๋ฒˆํ˜ธ', value: 'issue'}, - {name: '๋ฐœํ–‰๋ฒˆํ˜ธ', value: 'issue2'}, + {name: t('filter.searchOptions.approvalNumber'), value: 'issue'}, + {name: t('filter.searchOptions.issueNumber'), value: 'issue2'}, ]; const midOptions = useStore.getState().UserStore.selectOptionsMids; @@ -96,55 +98,55 @@ export const CashReceiptFilter = ({ >
-
ํ•„ํ„ฐ
+
{t('filter.filter')}
-
- +
- +
- + >{t('filter.apply')}
diff --git a/src/entities/transaction/ui/filter/escrow-filter.tsx b/src/entities/transaction/ui/filter/escrow-filter.tsx index 1a09452..3d77831 100644 --- a/src/entities/transaction/ui/filter/escrow-filter.tsx +++ b/src/entities/transaction/ui/filter/escrow-filter.tsx @@ -1,24 +1,25 @@ import { useEffect } from 'react'; import { 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 { FilterSelectInput } from '@/shared/ui/filter/select-input'; import { FilterCalendar } from '@/shared/ui/filter/calendar'; import { FilterButtonGroups } from '@/shared/ui/filter/button-groups'; import { FilterRangeAmount } from '@/shared/ui/filter/range-amount'; -import { +import { EscrowDeliveryStatusBtnGroup, EscrowSettlementStatusBtnGroup, EscrowSearchTypeOptionsGroup } from '@/entities/transaction/model/contant'; -import { +import { EscrowFilterProps, EscrowSearchType, EscrowDeliveryStatus, EscrowSettlementStatus } from '../../model/types'; -import { +import { FilterMotionDuration, FilterMotionStyle, FilterMotionVariants @@ -48,6 +49,7 @@ export const EscrowFilter = ({ setMinAmount, setMaxAmount }: EscrowFilterProps) => { + const { t } = useTranslation(); const [filterMid, setFilterMid] = useState(mid); const [filterSearchType, setFilterSearchType] = useState(searchType); @@ -58,7 +60,7 @@ export const EscrowFilter = ({ const [filterSettlementStatus, setFilterSettlementStatus] = useState(settlementStatus); const [filterMinAmount, setFilterMinAmount] = useState(minAmount); const [filterMaxAmount, setFilterMaxAmount] = useState(maxAmount); - + const midOptions = useStore.getState().UserStore.selectOptionsMids; const onClickToClose = () => { @@ -98,29 +100,29 @@ export const EscrowFilter = ({ >
-
ํ•„ํ„ฐ
+
{t('filter.filter')}
-
- +
- + - + - +
- + >{t('filter.apply')}
diff --git a/src/locales/en.json b/src/locales/en.json index 2493256..50b27b6 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -49,7 +49,37 @@ }, "filter": { "title": "Search Filters", + "filter": "Filter", + "close": "Close", + "apply": "Apply", + "merchant": "Merchant", + "orderNumberTid": "OID/TID", "period": "Period", + "issuanceDate": "Issuance Date", + "transactionStatus": "Transaction Status", + "paymentMethod": "Payment Method", + "transactionAmount": "Transaction Amount", + "detailSearch": "Detail Search", + "purpose": "Purpose", + "transactionCategory": "Transaction Category", + "progressStatus": "Progress Status", + "approvalIssuanceNumber": "Approval/Issuance Number", + "requestStatus": "Request Status", + "processingResult": "Processing Result", + "deliveryStatus": "Delivery Status", + "searchOptions": { + "cardNumber": "Card Number", + "approvalNumber": "Approval Number", + "buyerName": "Buyer 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", + "issueNumber": "Issue Number" + }, "periods": { "1month": "1 Month", "3months": "3 Months", diff --git a/src/locales/ko.json b/src/locales/ko.json index 8fddcf0..866b240 100644 --- a/src/locales/ko.json +++ b/src/locales/ko.json @@ -49,7 +49,37 @@ }, "filter": { "title": "์กฐํšŒ์กฐ๊ฑด ์„ค์ •", + "filter": "ํ•„ํ„ฐ", + "close": "๋‹ซ๊ธฐ", + "apply": "์ ์šฉ", + "merchant": "๊ฐ€๋งน์ ", + "orderNumberTid": "์ฃผ๋ฌธ๋ฒˆํ˜ธ/TID", "period": "์กฐํšŒ๊ธฐ๊ฐ„", + "issuanceDate": "๋ฐœํ–‰์ผ์ž", + "transactionStatus": "๊ฑฐ๋ž˜์ƒํƒœ", + "paymentMethod": "๊ฒฐ์ œ์ˆ˜๋‹จ", + "transactionAmount": "๊ฑฐ๋ž˜๊ธˆ์•ก", + "detailSearch": "์ƒ์„ธ์กฐํšŒ", + "purpose": "์šฉ๋„", + "transactionCategory": "๊ฑฐ๋ž˜๊ตฌ๋ถ„", + "progressStatus": "์ง„ํ–‰์ƒํƒœ", + "approvalIssuanceNumber": "์Šน์ธ๋ฒˆํ˜ธ/๋ฐœํ–‰๋ฒˆํ˜ธ", + "requestStatus": "์š”์ฒญ์ƒํƒœ", + "processingResult": "์ฒ˜๋ฆฌ๊ฒฐ๊ณผ", + "deliveryStatus": "๋ฐฐ์†ก์ƒํƒœ", + "searchOptions": { + "cardNumber": "์นด๋“œ๋ฒˆํ˜ธ", + "approvalNumber": "์Šน์ธ๋ฒˆํ˜ธ", + "buyerName": "๊ตฌ๋งค์ž๋ช…", + "virtualAccountNumber": "๊ฐ€์ƒ๊ณ„์ขŒ๋ฒˆํ˜ธ", + "depositorName": "์ž…๊ธˆ์ž๋ช…", + "phoneNumber": "ํœด๋Œ€ํฐ๋ฒˆํ˜ธ", + "giftCardNumber": "์ƒํ’ˆ๊ถŒ๋ฒˆํ˜ธ", + "customerId": "๊ณ ๊ฐID", + "culturelandId": "์ปฌ์ฒ˜๋žœ๋“œID", + "tmoneyCardNumber": "ํ‹ฐ๋จธ๋‹ˆ ์นด๋“œ๋ฒˆํ˜ธ", + "issueNumber": "๋ฐœํ–‰๋ฒˆํ˜ธ" + }, "periods": { "1month": "1๊ฐœ์›”", "3months": "3๊ฐœ์›”",