Add comprehensive i18n localization to vat-return entity

- 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 <noreply@anthropic.com>
This commit is contained in:
Jay Sheen
2025-10-30 17:54:43 +09:00
parent 5c5b2069f8
commit e60fe0f014
5 changed files with 53 additions and 32 deletions

View File

@@ -1,19 +1,20 @@
import { TFunction } from 'i18next';
import { VatReturnPayTax, VatReturnReceiptType, VatReturnTargetType } from './types'; import { VatReturnPayTax, VatReturnReceiptType, VatReturnTargetType } from './types';
export const VatReturnReceiptTypeBtnGroup = [ export const getVatReturnReceiptTypeBtnGroup = (t: TFunction) => [
{name: '전체', value: VatReturnReceiptType.ALL }, {name: t('transaction.constants.all'), value: VatReturnReceiptType.ALL },
{name: '영수', value: VatReturnReceiptType.RECEIPT }, {name: t('vatReturn.receipt'), value: VatReturnReceiptType.RECEIPT },
{name: '청구', value: VatReturnReceiptType.BILL } {name: t('vatReturn.bill'), value: VatReturnReceiptType.BILL }
]; ];
export const VatReturnTargetTypeBtnGroup = [ export const getVatReturnTargetTypeBtnGroup = (t: TFunction) => [
{name: '전체', value: VatReturnTargetType.ALL }, {name: t('transaction.constants.all'), value: VatReturnTargetType.ALL },
{name: '일반', value: VatReturnTargetType.GENERAL }, {name: t('vatReturn.general'), value: VatReturnTargetType.GENERAL },
{name: '차액정산', value: VatReturnTargetType.DIFFERENCE_COLLECTION }, {name: t('vatReturn.differenceSettlement'), value: VatReturnTargetType.DIFFERENCE_COLLECTION },
{name: '환급정산', value: VatReturnTargetType.REFUND_SETTLEMENT } {name: t('vatReturn.refundSettlement'), value: VatReturnTargetType.REFUND_SETTLEMENT }
]; ];
export const VatReturnTaxBtnGroups = [ export const getVatReturnTaxBtnGroups = (t: TFunction) => [
{name: '과세', value: VatReturnPayTax.TAX }, {name: t('vatReturn.taxable'), value: VatReturnPayTax.TAX },
{name: '면세', value: VatReturnPayTax.NOTAX }, {name: t('vatReturn.taxExempt'), value: VatReturnPayTax.NOTAX },
]; ];

View File

@@ -1,11 +1,12 @@
import { motion } from 'framer-motion'; import { motion } from 'framer-motion';
import { useTranslation } from 'react-i18next';
import { IMAGE_ROOT } from '@/shared/constants/common'; import { IMAGE_ROOT } from '@/shared/constants/common';
import { VatReturnReceiptType, VatReturnTargetType } from '../../model/types'; import { VatReturnReceiptType, VatReturnTargetType } from '../../model/types';
import { FilterMotionDuration, FilterMotionStyle, FilterMotionVariants } from '@/entities/common/model/constant'; import { FilterMotionDuration, FilterMotionStyle, FilterMotionVariants } from '@/entities/common/model/constant';
import { FilterSelect } from '@/shared/ui/filter/select'; import { FilterSelect } from '@/shared/ui/filter/select';
import { useState } from 'react'; import { useState } from 'react';
import { FilterButtonGroups } from '@/shared/ui/filter/button-groups'; 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 { FilterCalendarMonth } from '@/shared/ui/filter/calendar-month';
import { useStore } from '@/shared/model/store'; import { useStore } from '@/shared/model/store';
import { FilterSelectMid } from '@/shared/ui/filter/select-mid'; import { FilterSelectMid } from '@/shared/ui/filter/select-mid';
@@ -39,6 +40,7 @@ export const ListFilter = ({
setReceiptType, setReceiptType,
setTargetType setTargetType
}: ListFilterProps) => { }: ListFilterProps) => {
const { t } = useTranslation();
const [filterMid, setFilterMid] = useState<string>(mid); const [filterMid, setFilterMid] = useState<string>(mid);
const [filterStartMonth, setFilterStartMonth] = useState<string>(startMonth); const [filterStartMonth, setFilterStartMonth] = useState<string>(startMonth);
@@ -73,7 +75,7 @@ export const ListFilter = ({
> >
<div className="full-menu-container"> <div className="full-menu-container">
<div className="full-menu-header"> <div className="full-menu-header">
<div className="full-menu-title center"></div> <div className="full-menu-title center">{t('filter.filter')}</div>
<div className="full-menu-actions"> <div className="full-menu-actions">
<button <button
className="full-menu-close" className="full-menu-close"
@@ -81,7 +83,7 @@ export const ListFilter = ({
> >
<img <img
src={ IMAGE_ROOT + '/ico_close.svg' } src={ IMAGE_ROOT + '/ico_close.svg' }
alt="닫기" alt={t('common.close')}
/> />
</button> </button>
</div> </div>
@@ -89,27 +91,27 @@ export const ListFilter = ({
<div className="option-list pt-16"> <div className="option-list pt-16">
<FilterSelectMid <FilterSelectMid
title='가맹점' title={t('merchant.title')}
selectSetter={ setMid } selectSetter={ setMid }
showType={ 'GID' } showType={ 'GID' }
></FilterSelectMid> ></FilterSelectMid>
<FilterCalendarMonth <FilterCalendarMonth
title='발행월' title={t('vatReturn.issuanceMonth')}
startMonth={ filterStartMonth } startMonth={ filterStartMonth }
endMonth={ filterEndMonth } endMonth={ filterEndMonth }
setStartMonth={ setFilterStartMonth } setStartMonth={ setFilterStartMonth }
setEndMonth={ setFilterEndMonth } setEndMonth={ setFilterEndMonth }
></FilterCalendarMonth> ></FilterCalendarMonth>
<FilterButtonGroups <FilterButtonGroups
title='영수구분' title={t('vatReturn.receiptType')}
activeValue={ filterReceiptType } activeValue={ filterReceiptType }
btnGroups={ VatReturnReceiptTypeBtnGroup } btnGroups={ getVatReturnReceiptTypeBtnGroup(t) }
setter={ setFIlterReceiptType } setter={ setFIlterReceiptType }
></FilterButtonGroups> ></FilterButtonGroups>
<FilterButtonGroups <FilterButtonGroups
title='발행대상' title={t('vatReturn.issueTarget')}
activeValue={ filterTargetType } activeValue={ filterTargetType }
btnGroups={ VatReturnTargetTypeBtnGroup } btnGroups={ getVatReturnTargetTypeBtnGroup(t) }
setter={ setFilterTargetType } setter={ setFilterTargetType }
></FilterButtonGroups> ></FilterButtonGroups>
</div> </div>
@@ -117,7 +119,7 @@ export const ListFilter = ({
<button <button
className="btn-50 btn-blue flex-1" className="btn-50 btn-blue flex-1"
onClick={ onClickToSetFilter } onClick={ onClickToSetFilter }
></button> >{t('filter.apply')}</button>
</div> </div>
</div> </div>
</motion.div> </motion.div>

View File

@@ -6,7 +6,7 @@ import { FilterSelect } from '@/shared/ui/filter/select';
import { ReferenceRequestSuccess } from './reference-request-success'; import { ReferenceRequestSuccess } from './reference-request-success';
import { ReferenceRequestFail } from './reference-request-fail'; import { ReferenceRequestFail } from './reference-request-fail';
import { FilterButtonGroups } from '@/shared/ui/filter/button-groups'; 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 { VatReturnPayTax, VatReturnReferenceRequestParams, VatReturnReferenceRequestResponse } from '../model/types';
import { useStore } from '@/shared/model/store'; import { useStore } from '@/shared/model/store';
import { useVatReturnReferenceRequestMutation } from '../api/use-vat-return-reference-request-mutation'; import { useVatReturnReferenceRequestMutation } from '../api/use-vat-return-reference-request-mutation';
@@ -41,7 +41,7 @@ export const ReferenceWrap = () => {
vatReturnReferenceRequest(params).then((rs: VatReturnReferenceRequestResponse) => { vatReturnReferenceRequest(params).then((rs: VatReturnReferenceRequestResponse) => {
setSuccessPageOn(true); setSuccessPageOn(true);
}).catch((error) => { }).catch((error) => {
setErrorMsg("[9997] 키인가맹점이 아닙니다.<br/>NICEPAY로 문의하세요."); setErrorMsg(t('vatReturn.keyInMerchantError'));
setFailPageOn(true); setFailPageOn(true);
}); });
}; };
@@ -58,7 +58,7 @@ export const ReferenceWrap = () => {
<FilterButtonGroups <FilterButtonGroups
title={t('vatReturn.taxExemptionType')} title={t('vatReturn.taxExemptionType')}
activeValue={ payTax } activeValue={ payTax }
btnGroups={ VatReturnTaxBtnGroups } btnGroups={ getVatReturnTaxBtnGroups(t) }
setter={ setPayTax } setter={ setPayTax }
addClassName='horizon' addClassName='horizon'
maxBtn={ 2 } maxBtn={ 2 }

View File

@@ -848,9 +848,17 @@
"issueInfo": "Issue Information", "issueInfo": "Issue Information",
"issueTargetDate": "Issue Target Date", "issueTargetDate": "Issue Target Date",
"issueDate": "Issue Date", "issueDate": "Issue Date",
"issuanceMonth": "Issue Month",
"subject": "Subject", "subject": "Subject",
"issueTarget": "Issue Target", "issueTarget": "Issue Target",
"receiptType": "Receipt Type", "receiptType": "Receipt Type",
"receipt": "Receipt",
"bill": "Bill",
"general": "General",
"differenceSettlement": "Difference Settlement",
"refundSettlement": "Refund Settlement",
"taxable": "Taxable",
"taxExempt": "Tax Exempt",
"supplierInfo": "Supplier Information", "supplierInfo": "Supplier Information",
"receiverInfo": "Receiver Information", "receiverInfo": "Receiver Information",
"taxExemptionType": "Tax/Exemption Type", "taxExemptionType": "Tax/Exemption Type",
@@ -864,6 +872,7 @@
"applicationDate": "Application Date", "applicationDate": "Application Date",
"emailAddress": "Email Address", "emailAddress": "Email Address",
"referenceDataNote": "Please compare with internal accounting data\nbefore using this reference material.", "referenceDataNote": "Please compare with internal accounting data\nbefore using this reference material.",
"result": "Result" "result": "Result",
"keyInMerchantError": "[9997] Not a Key-In merchant.<br/>Please contact NICEPAY."
} }
} }

View File

@@ -852,9 +852,17 @@
"issueInfo": "발행 정보", "issueInfo": "발행 정보",
"issueTargetDate": "발행대상일자", "issueTargetDate": "발행대상일자",
"issueDate": "발행일자", "issueDate": "발행일자",
"issuanceMonth": "발행월",
"subject": "적요", "subject": "적요",
"issueTarget": "발행대상", "issueTarget": "발행대상",
"receiptType": "영수구분", "receiptType": "영수구분",
"receipt": "영수",
"bill": "청구",
"general": "일반",
"differenceSettlement": "차액정산",
"refundSettlement": "환급정산",
"taxable": "과세",
"taxExempt": "면세",
"supplierInfo": "공급자 정보", "supplierInfo": "공급자 정보",
"receiverInfo": "공급받는 자 정보", "receiverInfo": "공급받는 자 정보",
"taxExemptionType": "거래 과세/면세 구분", "taxExemptionType": "거래 과세/면세 구분",
@@ -868,6 +876,7 @@
"applicationDate": "신청일", "applicationDate": "신청일",
"emailAddress": "메일주소", "emailAddress": "메일주소",
"referenceDataNote": "참고용 자료이므로 반드시 내부 회계자료 등과\n비교 후 사용해 주세요.", "referenceDataNote": "참고용 자료이므로 반드시 내부 회계자료 등과\n비교 후 사용해 주세요.",
"result": "결과" "result": "결과",
"keyInMerchantError": "[9997] 키인가맹점이 아닙니다.<br/>NICEPAY로 문의하세요."
} }
} }