@open-mercato/checkout 0.6.7 → 0.6.8-develop.6874.1.982d6097d8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +1 -1
- package/dist/modules/checkout/__integration__/TC-CHKT-042.spec.js +39 -0
- package/dist/modules/checkout/__integration__/TC-CHKT-042.spec.js.map +7 -0
- package/dist/modules/checkout/__integration__/TC-CHKT-043-concurrent-status-update.spec.js +62 -0
- package/dist/modules/checkout/__integration__/TC-CHKT-043-concurrent-status-update.spec.js.map +7 -0
- package/dist/modules/checkout/api/pay/[slug]/submit/route.js +43 -28
- package/dist/modules/checkout/api/pay/[slug]/submit/route.js.map +2 -2
- package/dist/modules/checkout/api/transactions/route.js +23 -6
- package/dist/modules/checkout/api/transactions/route.js.map +2 -2
- package/dist/modules/checkout/backend/checkout/pay-links/page.js +2 -1
- package/dist/modules/checkout/backend/checkout/pay-links/page.js.map +2 -2
- package/dist/modules/checkout/backend/checkout/templates/page.js +2 -1
- package/dist/modules/checkout/backend/checkout/templates/page.js.map +2 -2
- package/dist/modules/checkout/backend/checkout/transactions/page.js +2 -1
- package/dist/modules/checkout/backend/checkout/transactions/page.js.map +2 -2
- package/dist/modules/checkout/commands/links.js +1 -1
- package/dist/modules/checkout/commands/links.js.map +2 -2
- package/dist/modules/checkout/commands/transactions.js +45 -13
- package/dist/modules/checkout/commands/transactions.js.map +2 -2
- package/dist/modules/checkout/components/CustomerFieldsEditor.js +2 -2
- package/dist/modules/checkout/components/CustomerFieldsEditor.js.map +2 -2
- package/dist/modules/checkout/components/GatewaySettingsFields.js +2 -2
- package/dist/modules/checkout/components/GatewaySettingsFields.js.map +2 -2
- package/dist/modules/checkout/components/LinkTemplateForm.js +8 -8
- package/dist/modules/checkout/components/LinkTemplateForm.js.map +2 -2
- package/dist/modules/checkout/components/LogoUploadField.js +1 -1
- package/dist/modules/checkout/components/LogoUploadField.js.map +2 -2
- package/dist/modules/checkout/components/PayPage.js +39 -38
- package/dist/modules/checkout/components/PayPage.js.map +2 -2
- package/dist/modules/checkout/extension-points.js +68 -0
- package/dist/modules/checkout/extension-points.js.map +7 -0
- package/dist/modules/checkout/lib/transaction-status-machine.js +31 -0
- package/dist/modules/checkout/lib/transaction-status-machine.js.map +7 -0
- package/dist/modules/checkout/search.js +44 -6
- package/dist/modules/checkout/search.js.map +2 -2
- package/dist/modules/checkout/setup.js +28 -0
- package/dist/modules/checkout/setup.js.map +2 -2
- package/dist/modules/checkout/subscribers/search-reindex-transaction-created.js +32 -0
- package/dist/modules/checkout/subscribers/search-reindex-transaction-created.js.map +7 -0
- package/dist/modules/checkout/workers/transaction-expiry.worker.js +9 -2
- package/dist/modules/checkout/workers/transaction-expiry.worker.js.map +2 -2
- package/package.json +10 -9
- package/src/modules/checkout/__integration__/TC-CHKT-042.spec.ts +41 -0
- package/src/modules/checkout/__integration__/TC-CHKT-043-concurrent-status-update.spec.ts +112 -0
- package/src/modules/checkout/__tests__/search.test.ts +21 -0
- package/src/modules/checkout/__tests__/setup-schedules.test.ts +99 -0
- package/src/modules/checkout/api/pay/[slug]/submit/__tests__/route.test.ts +77 -0
- package/src/modules/checkout/api/pay/[slug]/submit/route.ts +58 -28
- package/src/modules/checkout/api/transactions/__tests__/route.test.ts +113 -0
- package/src/modules/checkout/api/transactions/route.ts +30 -6
- package/src/modules/checkout/backend/checkout/pay-links/page.tsx +2 -1
- package/src/modules/checkout/backend/checkout/templates/page.tsx +2 -1
- package/src/modules/checkout/backend/checkout/transactions/page.tsx +2 -1
- package/src/modules/checkout/commands/__tests__/update-transaction-status.test.ts +363 -0
- package/src/modules/checkout/commands/links.ts +5 -1
- package/src/modules/checkout/commands/transactions.ts +68 -13
- package/src/modules/checkout/components/CustomerFieldsEditor.tsx +2 -2
- package/src/modules/checkout/components/GatewaySettingsFields.tsx +2 -2
- package/src/modules/checkout/components/LinkTemplateForm.tsx +8 -8
- package/src/modules/checkout/components/LogoUploadField.tsx +1 -1
- package/src/modules/checkout/components/PayPage.tsx +38 -37
- package/src/modules/checkout/extension-points.ts +67 -0
- package/src/modules/checkout/i18n/de.json +1 -0
- package/src/modules/checkout/i18n/en.json +1 -0
- package/src/modules/checkout/i18n/es.json +1 -0
- package/src/modules/checkout/i18n/ko.json +463 -0
- package/src/modules/checkout/i18n/pl.json +1 -0
- package/src/modules/checkout/lib/__tests__/transaction-status-machine.test.ts +152 -0
- package/src/modules/checkout/lib/transaction-status-machine.ts +71 -0
- package/src/modules/checkout/search.ts +44 -6
- package/src/modules/checkout/setup.ts +51 -0
- package/src/modules/checkout/subscribers/__tests__/search-reindex-transaction-created.test.ts +29 -0
- package/src/modules/checkout/subscribers/search-reindex-transaction-created.ts +39 -0
- package/src/modules/checkout/workers/__tests__/transaction-expiry.worker.test.ts +124 -0
- package/src/modules/checkout/workers/transaction-expiry.worker.ts +11 -0
|
@@ -0,0 +1,463 @@
|
|
|
1
|
+
{
|
|
2
|
+
"checkout.admin.payLinks.actions.copyUrl": "링크 URL 복사",
|
|
3
|
+
"checkout.admin.payLinks.actions.create": "링크 생성",
|
|
4
|
+
"checkout.admin.payLinks.actions.deactivate": "비활성화",
|
|
5
|
+
"checkout.admin.payLinks.actions.publish": "게시",
|
|
6
|
+
"checkout.admin.payLinks.actions.showTransactions": "거래 보기",
|
|
7
|
+
"checkout.admin.payLinks.actions.viewPayPage": "결제 페이지 보기",
|
|
8
|
+
"checkout.admin.payLinks.columns.created": "생성됨",
|
|
9
|
+
"checkout.admin.payLinks.columns.name": "이름",
|
|
10
|
+
"checkout.admin.payLinks.columns.pricing": "가격 책정",
|
|
11
|
+
"checkout.admin.payLinks.columns.slug": "슬러그",
|
|
12
|
+
"checkout.admin.payLinks.columns.status": "상태",
|
|
13
|
+
"checkout.admin.payLinks.columns.uses": "사용 횟수",
|
|
14
|
+
"checkout.admin.payLinks.filters.pricing": "가격 책정",
|
|
15
|
+
"checkout.admin.payLinks.filters.status": "상태",
|
|
16
|
+
"checkout.admin.payLinks.flash.deactivateError": "결제 링크를 비활성화하지 못했습니다.",
|
|
17
|
+
"checkout.admin.payLinks.flash.deactivated": "결제 링크가 비활성화되었습니다.",
|
|
18
|
+
"checkout.admin.payLinks.flash.deleteError": "결제 링크를 삭제하지 못했습니다.",
|
|
19
|
+
"checkout.admin.payLinks.flash.deleted": "결제 링크가 삭제되었습니다.",
|
|
20
|
+
"checkout.admin.payLinks.flash.publishError": "결제 링크를 게시하지 못했습니다.",
|
|
21
|
+
"checkout.admin.payLinks.flash.published": "결제 링크가 게시되었습니다.",
|
|
22
|
+
"checkout.admin.payLinks.pricing.customAmount": "사용자 지정 {min}-{max} {currency}",
|
|
23
|
+
"checkout.admin.payLinks.pricing.fixed": "고정 {amount} {currency}",
|
|
24
|
+
"checkout.admin.payLinks.searchPlaceholder": "결제 링크 검색…",
|
|
25
|
+
"checkout.admin.payLinks.title": "결제 링크",
|
|
26
|
+
"checkout.admin.templates.actions.create": "템플릿 생성",
|
|
27
|
+
"checkout.admin.templates.actions.createLinkFromTemplate": "템플릿으로 링크 생성",
|
|
28
|
+
"checkout.admin.templates.columns.created": "생성됨",
|
|
29
|
+
"checkout.admin.templates.columns.gateway": "게이트웨이",
|
|
30
|
+
"checkout.admin.templates.columns.maxUses": "최대 사용 횟수",
|
|
31
|
+
"checkout.admin.templates.columns.name": "이름",
|
|
32
|
+
"checkout.admin.templates.columns.pricingMode": "가격 책정 방식",
|
|
33
|
+
"checkout.admin.templates.filters.pricingMode": "가격 책정 방식",
|
|
34
|
+
"checkout.admin.templates.searchPlaceholder": "템플릿 검색…",
|
|
35
|
+
"checkout.admin.templates.title": "링크 템플릿",
|
|
36
|
+
"checkout.admin.templates.unlimited": "무제한",
|
|
37
|
+
"checkout.admin.transactionDetail.actions.capturePayment": "결제 승인",
|
|
38
|
+
"checkout.admin.transactionDetail.actions.copyJson": "JSON 복사",
|
|
39
|
+
"checkout.admin.transactionDetail.actions.copyMarkdown": "마크다운 복사",
|
|
40
|
+
"checkout.admin.transactionDetail.actions.copySectionJson": "섹션을 JSON으로 복사",
|
|
41
|
+
"checkout.admin.transactionDetail.actions.copySectionMarkdown": "섹션을 마크다운으로 복사",
|
|
42
|
+
"checkout.admin.transactionDetail.actions.viewGatewayTransaction": "게이트웨이 거래 열기",
|
|
43
|
+
"checkout.admin.transactionDetail.actions.viewPayLink": "결제 링크 보기",
|
|
44
|
+
"checkout.admin.transactionDetail.captureError": "결제 승인에 실패했습니다.",
|
|
45
|
+
"checkout.admin.transactionDetail.copyError": "거래 데이터를 복사하지 못했습니다.",
|
|
46
|
+
"checkout.admin.transactionDetail.description": "체크아웃 거래와 관련 결제 링크 데이터를 확인합니다.",
|
|
47
|
+
"checkout.admin.transactionDetail.emptyCustomFields": "이 거래에 대해 캡처된 커스텀 필드가 없습니다.",
|
|
48
|
+
"checkout.admin.transactionDetail.entityType": "체크아웃 거래",
|
|
49
|
+
"checkout.admin.transactionDetail.fields.amount": "금액",
|
|
50
|
+
"checkout.admin.transactionDetail.fields.checkoutTransaction": "체크아웃 거래",
|
|
51
|
+
"checkout.admin.transactionDetail.fields.created": "생성됨",
|
|
52
|
+
"checkout.admin.transactionDetail.fields.email": "이메일",
|
|
53
|
+
"checkout.admin.transactionDetail.fields.firstName": "이름",
|
|
54
|
+
"checkout.admin.transactionDetail.fields.gatewayTransactionId": "게이트웨이 거래 ID",
|
|
55
|
+
"checkout.admin.transactionDetail.fields.lastName": "성",
|
|
56
|
+
"checkout.admin.transactionDetail.fields.linkName": "링크 이름",
|
|
57
|
+
"checkout.admin.transactionDetail.fields.paymentStatus": "결제 상태",
|
|
58
|
+
"checkout.admin.transactionDetail.fields.phone": "전화번호",
|
|
59
|
+
"checkout.admin.transactionDetail.fields.pricingMode": "가격 책정 방식",
|
|
60
|
+
"checkout.admin.transactionDetail.fields.selectedPriceItem": "선택한 가격 항목",
|
|
61
|
+
"checkout.admin.transactionDetail.fields.slug": "슬러그",
|
|
62
|
+
"checkout.admin.transactionDetail.fields.status": "상태",
|
|
63
|
+
"checkout.admin.transactionDetail.fields.transactionId": "거래 ID",
|
|
64
|
+
"checkout.admin.transactionDetail.fields.updated": "업데이트됨",
|
|
65
|
+
"checkout.admin.transactionDetail.flash.captured": "결제가 승인되었습니다.",
|
|
66
|
+
"checkout.admin.transactionDetail.flash.copiedJson": "거래 상세 정보가 JSON으로 복사되었습니다.",
|
|
67
|
+
"checkout.admin.transactionDetail.flash.copiedMarkdown": "거래 상세 정보가 마크다운으로 복사되었습니다.",
|
|
68
|
+
"checkout.admin.transactionDetail.flash.copiedSectionJson": "섹션이 JSON으로 복사되었습니다.",
|
|
69
|
+
"checkout.admin.transactionDetail.flash.copiedSectionMarkdown": "섹션이 마크다운으로 복사되었습니다.",
|
|
70
|
+
"checkout.admin.transactionDetail.sections.customFields": "커스텀 필드",
|
|
71
|
+
"checkout.admin.transactionDetail.sections.customer": "고객 정보",
|
|
72
|
+
"checkout.admin.transactionDetail.sections.gateway": "게이트웨이 거래",
|
|
73
|
+
"checkout.admin.transactionDetail.sections.link": "링크 상세 정보",
|
|
74
|
+
"checkout.admin.transactionDetail.sections.payment": "결제 상세 정보",
|
|
75
|
+
"checkout.admin.transactionDetail.title": "거래 상세 정보",
|
|
76
|
+
"checkout.admin.transactions.actions.viewDetail": "상세 정보 보기",
|
|
77
|
+
"checkout.admin.transactions.columns.amount": "금액",
|
|
78
|
+
"checkout.admin.transactions.columns.customer": "고객",
|
|
79
|
+
"checkout.admin.transactions.columns.date": "날짜",
|
|
80
|
+
"checkout.admin.transactions.columns.email": "이메일",
|
|
81
|
+
"checkout.admin.transactions.columns.link": "링크",
|
|
82
|
+
"checkout.admin.transactions.columns.paymentStatus": "결제 상태",
|
|
83
|
+
"checkout.admin.transactions.columns.status": "상태",
|
|
84
|
+
"checkout.admin.transactions.filters.link": "링크",
|
|
85
|
+
"checkout.admin.transactions.filters.status": "상태",
|
|
86
|
+
"checkout.admin.transactions.searchPlaceholder": "거래 검색…",
|
|
87
|
+
"checkout.admin.transactions.status.cancelled": "취소됨",
|
|
88
|
+
"checkout.admin.transactions.status.completed": "완료됨",
|
|
89
|
+
"checkout.admin.transactions.status.expired": "만료됨",
|
|
90
|
+
"checkout.admin.transactions.status.failed": "실패",
|
|
91
|
+
"checkout.admin.transactions.status.pending": "대기 중",
|
|
92
|
+
"checkout.admin.transactions.status.processing": "처리 중",
|
|
93
|
+
"checkout.admin.transactions.title": "거래",
|
|
94
|
+
"checkout.audit.links.create": "결제 링크 생성",
|
|
95
|
+
"checkout.audit.links.delete": "결제 링크 삭제",
|
|
96
|
+
"checkout.audit.links.update": "결제 링크 업데이트",
|
|
97
|
+
"checkout.audit.templates.create": "결제 링크 템플릿 생성",
|
|
98
|
+
"checkout.audit.templates.delete": "결제 링크 템플릿 삭제",
|
|
99
|
+
"checkout.audit.templates.update": "결제 링크 템플릿 업데이트",
|
|
100
|
+
"checkout.common.actions.delete": "삭제",
|
|
101
|
+
"checkout.common.actions.edit": "편집",
|
|
102
|
+
"checkout.common.actions.preview": "미리보기",
|
|
103
|
+
"checkout.common.actions.remove": "제거",
|
|
104
|
+
"checkout.common.actions.saveAndPublish": "저장 후 게시",
|
|
105
|
+
"checkout.common.emptyValue": "—",
|
|
106
|
+
"checkout.common.enabled": "활성화됨",
|
|
107
|
+
"checkout.common.flash.deleted": "삭제됨",
|
|
108
|
+
"checkout.common.flash.saved": "저장됨",
|
|
109
|
+
"checkout.common.status.active": "활성",
|
|
110
|
+
"checkout.common.status.draft": "임시 저장",
|
|
111
|
+
"checkout.common.status.inactive": "비활성",
|
|
112
|
+
"checkout.currencySelect.errors.load": "통화를 불러오지 못했습니다.",
|
|
113
|
+
"checkout.currencySelect.placeholder": "통화 선택",
|
|
114
|
+
"checkout.customerFieldsEditor.addField": "고객 필드 추가",
|
|
115
|
+
"checkout.customerFieldsEditor.columns.actions": "작업",
|
|
116
|
+
"checkout.customerFieldsEditor.columns.fieldKey": "필드 키",
|
|
117
|
+
"checkout.customerFieldsEditor.columns.label": "라벨",
|
|
118
|
+
"checkout.customerFieldsEditor.columns.placeholder": "플레이스홀더",
|
|
119
|
+
"checkout.customerFieldsEditor.columns.required": "필수",
|
|
120
|
+
"checkout.customerFieldsEditor.columns.type": "유형",
|
|
121
|
+
"checkout.customerFieldsEditor.locked": "잠김",
|
|
122
|
+
"checkout.customerFieldsEditor.newFieldLabel": "새 필드",
|
|
123
|
+
"checkout.customerFieldsEditor.newFieldPlaceholder": "체크아웃 양식에 표시됨",
|
|
124
|
+
"checkout.customerFieldsEditor.notices.defaultFields": "기본 고객 필드는 시작을 위한 제안일 뿐입니다. 양식을 간결하게 유지하기 위해 이름을 바꾸거나, 순서를 변경하거나, 제거할 수 있습니다.",
|
|
125
|
+
"checkout.customerFieldsEditor.notices.empty": "아직 설정된 고객 필드가 없습니다. 결제 페이지에서 구매자 정보를 수집하려면 필드를 하나 이상 추가하세요.",
|
|
126
|
+
"checkout.customerFieldsEditor.options.add": "옵션 추가",
|
|
127
|
+
"checkout.customerFieldsEditor.options.defaultLabel": "옵션 {index}",
|
|
128
|
+
"checkout.customerFieldsEditor.options.label": "라벨",
|
|
129
|
+
"checkout.customerFieldsEditor.options.placeholders.label": "스타터",
|
|
130
|
+
"checkout.customerFieldsEditor.options.placeholders.value": "starter",
|
|
131
|
+
"checkout.customerFieldsEditor.options.title": "옵션",
|
|
132
|
+
"checkout.customerFieldsEditor.options.value": "값",
|
|
133
|
+
"checkout.customerFieldsEditor.placeholders.fieldKey": "referenceCode",
|
|
134
|
+
"checkout.customerFieldsEditor.placeholders.label": "참조 코드",
|
|
135
|
+
"checkout.customerFieldsEditor.placeholders.placeholder": "입력란 안에 표시됨",
|
|
136
|
+
"checkout.customerFieldsEditor.types.boolean": "체크박스",
|
|
137
|
+
"checkout.customerFieldsEditor.types.multiline": "텍스트 영역",
|
|
138
|
+
"checkout.customerFieldsEditor.types.radio": "라디오 버튼",
|
|
139
|
+
"checkout.customerFieldsEditor.types.select": "선택",
|
|
140
|
+
"checkout.customerFieldsEditor.types.text": "텍스트",
|
|
141
|
+
"checkout.defaultCustomerFields.address.label": "주소",
|
|
142
|
+
"checkout.defaultCustomerFields.address.placeholder": "도로명, 도시, 우편번호",
|
|
143
|
+
"checkout.defaultCustomerFields.companyId.label": "사업자 등록번호",
|
|
144
|
+
"checkout.defaultCustomerFields.companyId.placeholder": "부가가치세 / 사업자 등록번호",
|
|
145
|
+
"checkout.defaultCustomerFields.companyName.label": "회사명",
|
|
146
|
+
"checkout.defaultCustomerFields.companyName.placeholder": "Acme Inc.",
|
|
147
|
+
"checkout.defaultCustomerFields.email.label": "이메일",
|
|
148
|
+
"checkout.defaultCustomerFields.email.placeholder": "jane@company.com",
|
|
149
|
+
"checkout.defaultCustomerFields.firstName.label": "이름",
|
|
150
|
+
"checkout.defaultCustomerFields.firstName.placeholder": "Jane",
|
|
151
|
+
"checkout.defaultCustomerFields.lastName.label": "성",
|
|
152
|
+
"checkout.defaultCustomerFields.lastName.placeholder": "Doe",
|
|
153
|
+
"checkout.defaultCustomerFields.phone.label": "전화번호",
|
|
154
|
+
"checkout.defaultCustomerFields.phone.placeholder": "+1 555 123 4567",
|
|
155
|
+
"checkout.gatewaySettings.notices.chooseProvider": "체크아웃 세션 설정을 구성하려면 게이트웨이 제공업체를 선택하세요.",
|
|
156
|
+
"checkout.gatewaySettings.notices.noSettings": "이 제공업체는 추가 세션 설정을 제공하지 않습니다.",
|
|
157
|
+
"checkout.gatewaySettings.selectPlaceholder": "선택…",
|
|
158
|
+
"checkout.link.created": "결제 링크가 생성됨",
|
|
159
|
+
"checkout.link.deleted": "결제 링크가 삭제됨",
|
|
160
|
+
"checkout.link.locked": "결제 링크가 잠김",
|
|
161
|
+
"checkout.link.published": "결제 링크가 게시됨",
|
|
162
|
+
"checkout.link.updated": "결제 링크가 업데이트됨",
|
|
163
|
+
"checkout.link.usageLimitReached": "결제 링크 사용 한도에 도달함",
|
|
164
|
+
"checkout.linkTemplateForm.appearance.fields.backgroundColor": "배경 색상",
|
|
165
|
+
"checkout.linkTemplateForm.appearance.fields.displayCustomFields": "공개 페이지에 커스텀 필드 표시",
|
|
166
|
+
"checkout.linkTemplateForm.appearance.fields.primaryColor": "기본 색상",
|
|
167
|
+
"checkout.linkTemplateForm.appearance.fields.secondaryColor": "보조 색상",
|
|
168
|
+
"checkout.linkTemplateForm.appearance.fields.themeMode": "테마 모드",
|
|
169
|
+
"checkout.linkTemplateForm.appearance.themeModes.auto": "자동",
|
|
170
|
+
"checkout.linkTemplateForm.appearance.themeModes.dark": "다크",
|
|
171
|
+
"checkout.linkTemplateForm.appearance.themeModes.light": "라이트",
|
|
172
|
+
"checkout.linkTemplateForm.customerDetails.description": "권장 사항: 영수증 발급, 부정 거래 검토, 결제 분쟁 대응을 위해 최소한 고객 이메일은 수집하는 것이 좋습니다. 필수는 아닙니다.",
|
|
173
|
+
"checkout.linkTemplateForm.customerDetails.notices.disabled": "고객 정보 수집이 비활성화되어 있습니다. 구매자에게는 결제 섹션과 법적 동의 체크박스만 표시됩니다.",
|
|
174
|
+
"checkout.linkTemplateForm.customerDetails.notices.simpleLink": "고객 양식 없이 단순한 결제 링크 페이지로 만들려면 이 기능을 끄세요.",
|
|
175
|
+
"checkout.linkTemplateForm.customerDetails.title": "고객 정보 수집",
|
|
176
|
+
"checkout.linkTemplateForm.emails.labels.body": "{state} 이메일 본문",
|
|
177
|
+
"checkout.linkTemplateForm.emails.labels.subject": "{state} 이메일 제목",
|
|
178
|
+
"checkout.linkTemplateForm.emails.notice": "이메일 본문은 마크다운과 아래 변수를 지원합니다.",
|
|
179
|
+
"checkout.linkTemplateForm.emails.placeholders.errorBody": "안녕하세요 {{firstName}}님, 결제를 완료하지 못했습니다. {{errorMessage}}",
|
|
180
|
+
"checkout.linkTemplateForm.emails.placeholders.errorSubject": "결제 실패 - {{linkTitle}}",
|
|
181
|
+
"checkout.linkTemplateForm.emails.placeholders.startBody": "안녕하세요 {{firstName}}님, **{{amount}} {{currencyCode}}** 결제 처리를 시작했습니다.",
|
|
182
|
+
"checkout.linkTemplateForm.emails.placeholders.startSubject": "결제 시작 - {{linkTitle}}",
|
|
183
|
+
"checkout.linkTemplateForm.emails.placeholders.successBody": "안녕하세요 {{firstName}}님, 결제가 완료되었습니다. 참조 번호: `{{transactionId}}`.",
|
|
184
|
+
"checkout.linkTemplateForm.emails.placeholders.successSubject": "결제 완료 - {{linkTitle}}",
|
|
185
|
+
"checkout.linkTemplateForm.emails.sendToCustomer": "고객에게 이 이메일 보내기",
|
|
186
|
+
"checkout.linkTemplateForm.emails.tabs.error": "오류",
|
|
187
|
+
"checkout.linkTemplateForm.emails.tabs.start": "시작됨",
|
|
188
|
+
"checkout.linkTemplateForm.emails.tabs.success": "성공",
|
|
189
|
+
"checkout.linkTemplateForm.emails.variableHint": "사용 가능한 변수:",
|
|
190
|
+
"checkout.linkTemplateForm.general.actions.clearTemplate": "빈 양식으로 시작",
|
|
191
|
+
"checkout.linkTemplateForm.general.actions.generateSlug": "생성",
|
|
192
|
+
"checkout.linkTemplateForm.general.fields.description": "설명",
|
|
193
|
+
"checkout.linkTemplateForm.general.fields.name": "이름",
|
|
194
|
+
"checkout.linkTemplateForm.general.fields.slug": "슬러그",
|
|
195
|
+
"checkout.linkTemplateForm.general.fields.subtitle": "부제목",
|
|
196
|
+
"checkout.linkTemplateForm.general.fields.template": "템플릿",
|
|
197
|
+
"checkout.linkTemplateForm.general.fields.title": "제목",
|
|
198
|
+
"checkout.linkTemplateForm.general.hints.description": "공개 페이지 미리보기에서는 마크다운을 사용할 수 있습니다.",
|
|
199
|
+
"checkout.linkTemplateForm.general.hints.slug": "이는 공개 결제 링크 URL이 됩니다.",
|
|
200
|
+
"checkout.linkTemplateForm.general.hints.template": "선택적 시작점입니다. 템플릿을 적용하면 현재 양식 값이 대체됩니다.",
|
|
201
|
+
"checkout.linkTemplateForm.general.notices.templateReplacement": "템플릿을 선택하면 링크가 자동으로 채워지며, 필요한 경우 복사된 값을 조정할 수 있습니다.",
|
|
202
|
+
"checkout.linkTemplateForm.general.placeholders.description": "# 포함 내용\n- 60분 전략 상담\n- 상담 후 요약",
|
|
203
|
+
"checkout.linkTemplateForm.general.placeholders.name": "1월 컨설팅 세션",
|
|
204
|
+
"checkout.linkTemplateForm.general.placeholders.slug": "january-consulting",
|
|
205
|
+
"checkout.linkTemplateForm.general.placeholders.subtitle": "1시간 전략 컨설팅",
|
|
206
|
+
"checkout.linkTemplateForm.general.placeholders.template": "템플릿 검색…",
|
|
207
|
+
"checkout.linkTemplateForm.general.placeholders.title": "컨설팅 세션 결제",
|
|
208
|
+
"checkout.linkTemplateForm.general.slugPreview": "미리보기: `/pay/{slug}`",
|
|
209
|
+
"checkout.linkTemplateForm.general.status.applyingTemplate": "템플릿 적용 중…",
|
|
210
|
+
"checkout.linkTemplateForm.groups.appearance": "외관",
|
|
211
|
+
"checkout.linkTemplateForm.groups.customFields": "커스텀 필드",
|
|
212
|
+
"checkout.linkTemplateForm.groups.customerFields": "고객 필드",
|
|
213
|
+
"checkout.linkTemplateForm.groups.emails": "이메일",
|
|
214
|
+
"checkout.linkTemplateForm.groups.general": "일반",
|
|
215
|
+
"checkout.linkTemplateForm.groups.legal": "법적 고지",
|
|
216
|
+
"checkout.linkTemplateForm.groups.messages": "메시지",
|
|
217
|
+
"checkout.linkTemplateForm.groups.payment": "결제",
|
|
218
|
+
"checkout.linkTemplateForm.groups.pricing": "가격 책정",
|
|
219
|
+
"checkout.linkTemplateForm.groups.settings": "설정",
|
|
220
|
+
"checkout.linkTemplateForm.legal.fields.acceptanceRequired": "동의 필수",
|
|
221
|
+
"checkout.linkTemplateForm.legal.fields.privacyBody": "개인정보 처리방침 본문",
|
|
222
|
+
"checkout.linkTemplateForm.legal.fields.privacyTitle": "개인정보 처리방침 제목",
|
|
223
|
+
"checkout.linkTemplateForm.legal.fields.termsBody": "이용약관 본문",
|
|
224
|
+
"checkout.linkTemplateForm.legal.fields.termsTitle": "이용약관 제목",
|
|
225
|
+
"checkout.linkTemplateForm.legal.notice": "이 탭들은 결제 페이지의 법적 동의 단계 주변에 표시됩니다. 제목, 목록, 링크에는 마크다운을 사용하세요.",
|
|
226
|
+
"checkout.linkTemplateForm.legal.placeholders.privacyBody": "# 개인정보\n\n수집하는 개인정보와 그 이유를 설명하세요.",
|
|
227
|
+
"checkout.linkTemplateForm.legal.placeholders.privacyTitle": "개인정보 처리방침",
|
|
228
|
+
"checkout.linkTemplateForm.legal.placeholders.termsBody": "# 이용약관\n\n결제 전 고객이 동의해야 하는 규칙을 설명하세요.",
|
|
229
|
+
"checkout.linkTemplateForm.legal.placeholders.termsTitle": "이용약관",
|
|
230
|
+
"checkout.linkTemplateForm.legal.tabs.privacy": "개인정보",
|
|
231
|
+
"checkout.linkTemplateForm.legal.tabs.terms": "이용약관",
|
|
232
|
+
"checkout.linkTemplateForm.locked.description": "이 결제 링크에는 이미 활성 거래가 있습니다. 저장된 설정을 확인할 수는 있지만 편집과 삭제는 비활성화되어 있습니다.",
|
|
233
|
+
"checkout.linkTemplateForm.locked.overlayDescription": "이 결제 링크에 활성 거래가 연결되어 있어 결제 무결성을 보호하기 위해 양식이 잠겨 있습니다.",
|
|
234
|
+
"checkout.linkTemplateForm.locked.overlayTitle": "편집 비활성화됨",
|
|
235
|
+
"checkout.linkTemplateForm.locked.title": "이 결제 링크는 읽기 전용입니다",
|
|
236
|
+
"checkout.linkTemplateForm.messages.labels.body": "{state} 메시지",
|
|
237
|
+
"checkout.linkTemplateForm.messages.labels.title": "{state} 제목",
|
|
238
|
+
"checkout.linkTemplateForm.messages.notice": "이 메시지들은 공개 성공, 취소, 오류 상태에 표시됩니다. 본문에는 마크다운을 사용할 수 있습니다.",
|
|
239
|
+
"checkout.linkTemplateForm.messages.placeholders.cancelBody": "결제가 완료되기 전에 취소되었습니다.",
|
|
240
|
+
"checkout.linkTemplateForm.messages.placeholders.cancelTitle": "결제 취소됨",
|
|
241
|
+
"checkout.linkTemplateForm.messages.placeholders.errorBody": "결제를 완료할 수 없었습니다. 다시 시도해 주세요.",
|
|
242
|
+
"checkout.linkTemplateForm.messages.placeholders.errorTitle": "결제 실패",
|
|
243
|
+
"checkout.linkTemplateForm.messages.placeholders.successBody": "결제해 주셔서 감사합니다. 현재 처리 중입니다.",
|
|
244
|
+
"checkout.linkTemplateForm.messages.placeholders.successTitle": "결제 완료됨",
|
|
245
|
+
"checkout.linkTemplateForm.messages.tabs.cancel": "취소",
|
|
246
|
+
"checkout.linkTemplateForm.messages.tabs.error": "오류",
|
|
247
|
+
"checkout.linkTemplateForm.messages.tabs.success": "성공",
|
|
248
|
+
"checkout.linkTemplateForm.notFound.link.description": "이 결제 링크가 더 이상 존재하지 않습니다. 다른 탭이나 다른 사용자가 삭제했을 수 있습니다.",
|
|
249
|
+
"checkout.linkTemplateForm.notFound.link.title": "결제 링크를 찾을 수 없음",
|
|
250
|
+
"checkout.linkTemplateForm.notFound.template.description": "이 템플릿이 더 이상 존재하지 않습니다. 다른 탭이나 다른 사용자가 삭제했을 수 있습니다.",
|
|
251
|
+
"checkout.linkTemplateForm.notFound.template.title": "템플릿을 찾을 수 없음",
|
|
252
|
+
"checkout.linkTemplateForm.payment.fields.gatewayProvider": "게이트웨이 제공업체",
|
|
253
|
+
"checkout.linkTemplateForm.payment.placeholders.provider": "제공업체 선택…",
|
|
254
|
+
"checkout.linkTemplateForm.payment.providerUnavailableSuffix": "(먼저 연동에서 구성하세요)",
|
|
255
|
+
"checkout.linkTemplateForm.priceList.actions.addItem": "항목 추가",
|
|
256
|
+
"checkout.linkTemplateForm.priceList.aria.amount": "금액 {index}",
|
|
257
|
+
"checkout.linkTemplateForm.priceList.aria.description": "설명 {index}",
|
|
258
|
+
"checkout.linkTemplateForm.priceList.aria.itemCode": "항목 코드 {index}",
|
|
259
|
+
"checkout.linkTemplateForm.priceList.columns.actions": "작업",
|
|
260
|
+
"checkout.linkTemplateForm.priceList.columns.amount": "금액",
|
|
261
|
+
"checkout.linkTemplateForm.priceList.columns.currency": "통화",
|
|
262
|
+
"checkout.linkTemplateForm.priceList.columns.description": "설명",
|
|
263
|
+
"checkout.linkTemplateForm.priceList.columns.itemCode": "항목 코드",
|
|
264
|
+
"checkout.linkTemplateForm.priceList.notices.empty": "아직 가격표 항목이 없습니다. 고객이 여러 가격 중에서 선택할 수 있도록 항목을 하나 이상 추가하세요.",
|
|
265
|
+
"checkout.linkTemplateForm.priceList.notices.singleCurrency": "모든 가격표 항목은 동일한 통화로 유지하세요. 첫 번째 통화가 새 행의 기본값이 됩니다.",
|
|
266
|
+
"checkout.linkTemplateForm.priceList.placeholders.description": "스타터 패키지",
|
|
267
|
+
"checkout.linkTemplateForm.priceList.placeholders.itemCode": "starter",
|
|
268
|
+
"checkout.linkTemplateForm.pricing.fields.amount": "금액",
|
|
269
|
+
"checkout.linkTemplateForm.pricing.fields.compareAtPrice": "비교 가격",
|
|
270
|
+
"checkout.linkTemplateForm.pricing.fields.currency": "통화",
|
|
271
|
+
"checkout.linkTemplateForm.pricing.fields.includesTax": "세금 포함 가격",
|
|
272
|
+
"checkout.linkTemplateForm.pricing.fields.maximumAmount": "최대 금액",
|
|
273
|
+
"checkout.linkTemplateForm.pricing.fields.minimumAmount": "최소 금액",
|
|
274
|
+
"checkout.linkTemplateForm.pricing.hints.compareAtPrice": "현재 가격 위에 취소선으로 표시되는 선택적 금액입니다.",
|
|
275
|
+
"checkout.linkTemplateForm.pricing.modes.customAmount": "고객이 금액 입력",
|
|
276
|
+
"checkout.linkTemplateForm.pricing.modes.fixed": "고정 가격",
|
|
277
|
+
"checkout.linkTemplateForm.pricing.modes.priceList": "가격표",
|
|
278
|
+
"checkout.linkTemplateForm.settings.fields.maxCompletions": "최대 완료 횟수",
|
|
279
|
+
"checkout.linkTemplateForm.settings.fields.password": "비밀번호",
|
|
280
|
+
"checkout.linkTemplateForm.settings.fields.status": "상태",
|
|
281
|
+
"checkout.linkTemplateForm.settings.hints.maxCompletions": "링크를 계속 재사용할 수 있게 하려면 비워 두세요.",
|
|
282
|
+
"checkout.linkTemplateForm.settings.hints.password": "결제 페이지를 열기 전에 요구되는 선택적 비밀번호입니다.",
|
|
283
|
+
"checkout.linkTemplateForm.settings.placeholders.password": "페이지를 공개 상태로 유지하려면 비워 두세요",
|
|
284
|
+
"checkout.linkTemplateForm.settings.placeholders.unlimited": "무제한",
|
|
285
|
+
"checkout.linkTemplateForm.titles.createLink": "결제 링크 생성",
|
|
286
|
+
"checkout.linkTemplateForm.titles.createTemplate": "템플릿 생성",
|
|
287
|
+
"checkout.linkTemplateForm.titles.editLink": "결제 링크 편집",
|
|
288
|
+
"checkout.linkTemplateForm.titles.editTemplate": "템플릿 편집",
|
|
289
|
+
"checkout.logoUpload.actions.attach": "로고 첨부",
|
|
290
|
+
"checkout.logoUpload.actions.removeUpload": "업로드 제거",
|
|
291
|
+
"checkout.logoUpload.actions.uploading": "업로드 중…",
|
|
292
|
+
"checkout.logoUpload.description": "로고를 첨부 파일로 업로드하거나 외부 URL을 계속 사용하세요.",
|
|
293
|
+
"checkout.logoUpload.empty": "아직 선택된 로고가 없습니다.",
|
|
294
|
+
"checkout.logoUpload.errors.remove": "업로드된 로고를 제거하지 못했습니다.",
|
|
295
|
+
"checkout.logoUpload.errors.upload": "로고 업로드에 실패했습니다.",
|
|
296
|
+
"checkout.logoUpload.externalUrl": "외부 로고 URL",
|
|
297
|
+
"checkout.logoUpload.externalUrlPlaceholder": "https://example.com/logo.png",
|
|
298
|
+
"checkout.logoUpload.notices.attachmentWins": "업로드된 첨부 파일이 우선 사용됩니다. 외부 URL로 대체하려면 첨부 파일을 제거하세요.",
|
|
299
|
+
"checkout.logoUpload.previewAlt": "체크아웃 로고 미리보기",
|
|
300
|
+
"checkout.logoUpload.title": "로고",
|
|
301
|
+
"checkout.nav.group": "체크아웃",
|
|
302
|
+
"checkout.nav.payLinks": "결제 링크",
|
|
303
|
+
"checkout.nav.root": "체크아웃",
|
|
304
|
+
"checkout.nav.templates": "템플릿",
|
|
305
|
+
"checkout.nav.transactions": "거래",
|
|
306
|
+
"checkout.notifications.link.usageLimitReached.body": "{linkName}이(가) 최대 완료 횟수에 도달했습니다.",
|
|
307
|
+
"checkout.notifications.link.usageLimitReached.title": "사용 한도 도달",
|
|
308
|
+
"checkout.notifications.renderer.viewLink": "결제 링크 보기",
|
|
309
|
+
"checkout.notifications.renderer.viewTransaction": "거래 보기",
|
|
310
|
+
"checkout.notifications.transaction.completed.body": "{customerName}님이 {amount} {currency}를 결제했습니다.",
|
|
311
|
+
"checkout.notifications.transaction.completed.title": "결제 완료됨",
|
|
312
|
+
"checkout.notifications.transaction.failed.body": "{amount} {currency} 결제가 실패했습니다.",
|
|
313
|
+
"checkout.notifications.transaction.failed.title": "결제 실패",
|
|
314
|
+
"checkout.payPage.actions.backToAdmin": "관리자로 돌아가기",
|
|
315
|
+
"checkout.payPage.actions.continue": "계속",
|
|
316
|
+
"checkout.payPage.actions.editDetails": "정보 편집",
|
|
317
|
+
"checkout.payPage.actions.payNow": "지금 결제",
|
|
318
|
+
"checkout.payPage.actions.previewDisabled": "미리보기 전용",
|
|
319
|
+
"checkout.payPage.actions.processingPayment": "결제 처리 중...",
|
|
320
|
+
"checkout.payPage.actions.retry": "재시도",
|
|
321
|
+
"checkout.payPage.actions.verifying": "확인 중...",
|
|
322
|
+
"checkout.payPage.badges.preview": "미리보기",
|
|
323
|
+
"checkout.payPage.badges.secure": "보안 체크아웃",
|
|
324
|
+
"checkout.payPage.description.kicker": "상품 개요",
|
|
325
|
+
"checkout.payPage.errors.embeddedUnavailable": "지금은 결제 양식을 사용할 수 없습니다. 다시 시도하거나 호스팅된 결제 페이지를 이용해 주세요.",
|
|
326
|
+
"checkout.payPage.errors.loadMessage": "이 결제 페이지를 불러올 수 없었습니다. 다시 시도해 주세요.",
|
|
327
|
+
"checkout.payPage.errors.loadTitle": "결제 링크를 불러올 수 없음",
|
|
328
|
+
"checkout.payPage.errors.password": "비밀번호를 확인할 수 없습니다. 다시 시도해 주세요.",
|
|
329
|
+
"checkout.payPage.errors.sessionStart": "결제 세션을 시작할 수 없습니다. 다시 시도해 주세요.",
|
|
330
|
+
"checkout.payPage.errors.submit": "결제를 시작할 수 없습니다. 다시 시도해 주세요.",
|
|
331
|
+
"checkout.payPage.fields.booleanFalse": "아니오",
|
|
332
|
+
"checkout.payPage.fields.booleanTrue": "예",
|
|
333
|
+
"checkout.payPage.fields.customAmount": "금액",
|
|
334
|
+
"checkout.payPage.fields.selectPlaceholder": "선택...",
|
|
335
|
+
"checkout.payPage.footer.subtitle": "체크아웃에서 구성된 공개 결제 페이지입니다.",
|
|
336
|
+
"checkout.payPage.header.autoProvider": "체크아웃에서 구성됨",
|
|
337
|
+
"checkout.payPage.header.pageLabel": "페이지",
|
|
338
|
+
"checkout.payPage.header.providerLabel": "게이트웨이",
|
|
339
|
+
"checkout.payPage.help.customerDetails": "구매자 정보를 한 번 입력한 후 결제를 진행하세요.",
|
|
340
|
+
"checkout.payPage.help.legal": "결제 단계를 시작하기 전에 필수 확인 사항에 동의해야 합니다.",
|
|
341
|
+
"checkout.payPage.help.liveHeadline": "검증이 완료되면 이 패널에 제공업체 위젯이 표시됩니다.",
|
|
342
|
+
"checkout.payPage.help.payment": "금액을 선택하고 요약을 확인한 후 보안 결제 단계로 진행하세요.",
|
|
343
|
+
"checkout.payPage.help.previewHeadline": "이것은 결제 흐름의 미리보기입니다.",
|
|
344
|
+
"checkout.payPage.help.productDetails": "이 결제 링크에 대해 구성된 추가 상품 정보입니다.",
|
|
345
|
+
"checkout.payPage.help.providerFallback": "결제 제공업체는 체크아웃 설정에서 구성됩니다.",
|
|
346
|
+
"checkout.payPage.help.providerLine": "제공업체: {provider}.",
|
|
347
|
+
"checkout.payPage.legal.acceptDocument": "{document}에 동의합니다.",
|
|
348
|
+
"checkout.payPage.legal.defaultPrivacyTitle": "개인정보 처리방침",
|
|
349
|
+
"checkout.payPage.legal.defaultTermsTitle": "이용약관",
|
|
350
|
+
"checkout.payPage.legal.readDocument": "문서 읽기",
|
|
351
|
+
"checkout.payPage.loading": "결제 링크를 불러오는 중...",
|
|
352
|
+
"checkout.payPage.passwordPlaceholder": "비밀번호",
|
|
353
|
+
"checkout.payPage.payment.kicker": "결제 수단",
|
|
354
|
+
"checkout.payPage.payment.liveState": "준비됨",
|
|
355
|
+
"checkout.payPage.payment.previewState": "청구 없음",
|
|
356
|
+
"checkout.payPage.payment.providerHint": "결제는 {provider}에서 처리됩니다.",
|
|
357
|
+
"checkout.payPage.previewBanner": "미리보기 모드입니다. 결제가 비활성화되어 있습니다.",
|
|
358
|
+
"checkout.payPage.pricing.kicker": "결제 설정",
|
|
359
|
+
"checkout.payPage.pricing.title": "결제 방법을 선택하세요",
|
|
360
|
+
"checkout.payPage.protectedTitle": "보호된 결제 링크",
|
|
361
|
+
"checkout.payPage.sections.customerDetails": "고객 정보",
|
|
362
|
+
"checkout.payPage.sections.legal": "법적 동의",
|
|
363
|
+
"checkout.payPage.sections.payment": "결제",
|
|
364
|
+
"checkout.payPage.sections.productDetails": "상품 정보",
|
|
365
|
+
"checkout.payPage.summary.amountDue": "청구 금액",
|
|
366
|
+
"checkout.payPage.summary.awaitingSelection": "금액을 선택하세요",
|
|
367
|
+
"checkout.payPage.summary.checkoutLabel": "체크아웃",
|
|
368
|
+
"checkout.payPage.summary.liveState": "실시간",
|
|
369
|
+
"checkout.payPage.summary.previewState": "미리보기",
|
|
370
|
+
"checkout.payPage.summary.providerLabel": "제공업체",
|
|
371
|
+
"checkout.payPage.unavailable": "이 결제 링크는 더 이상 사용할 수 없습니다.",
|
|
372
|
+
"checkout.payPage.validation.amountMax": "{amount} 이하로 입력하세요.",
|
|
373
|
+
"checkout.payPage.validation.amountMin": "{amount} 이상으로 입력하세요.",
|
|
374
|
+
"checkout.payPage.validation.amountRequired": "계속하려면 금액을 입력하세요.",
|
|
375
|
+
"checkout.payPage.validation.documentRequired": "계속하려면 {field}에 동의하세요.",
|
|
376
|
+
"checkout.payPage.validation.fixErrors": "강조 표시된 필드를 확인하고 다시 시도하세요.",
|
|
377
|
+
"checkout.payPage.validation.invalidEmail": "유효한 이메일 주소를 입력하세요.",
|
|
378
|
+
"checkout.payPage.validation.invalidPhone": "유효한 전화번호를 입력하세요.",
|
|
379
|
+
"checkout.payPage.validation.labels.option": "결제 옵션",
|
|
380
|
+
"checkout.payPage.validation.priceSelectionRequired": "계속하려면 결제 옵션을 선택하세요.",
|
|
381
|
+
"checkout.payPage.validation.requiredField": "{field}을(를) 입력하세요.",
|
|
382
|
+
"checkout.payPage.validation.thisField": "이 필드",
|
|
383
|
+
"checkout.search.subtitle.linkTemplate": "링크 템플릿",
|
|
384
|
+
"checkout.statusPage.backToPayment": "결제 페이지로 돌아가기",
|
|
385
|
+
"checkout.statusPage.cancel.cancelled": "결제 취소됨",
|
|
386
|
+
"checkout.statusPage.cancel.failed": "결제 실패",
|
|
387
|
+
"checkout.statusPage.cancel.message": "결제가 완료되기 전에 취소되었습니다. 언제든지 결제 페이지로 돌아갈 수 있습니다.",
|
|
388
|
+
"checkout.statusPage.checking": "결제 상태 확인 중…",
|
|
389
|
+
"checkout.statusPage.currentStatus": "현재 상태: {status}",
|
|
390
|
+
"checkout.statusPage.defaultLinkTitle": "이 결제",
|
|
391
|
+
"checkout.statusPage.error.message": "결제를 완료할 수 없었습니다. 다시 시도하거나 다른 결제 수단을 사용해 주세요.",
|
|
392
|
+
"checkout.statusPage.processing.message": "결제 제공업체로부터 최종 업데이트를 기다리는 중입니다.",
|
|
393
|
+
"checkout.statusPage.status.cancelled": "취소됨",
|
|
394
|
+
"checkout.statusPage.status.completed": "완료됨",
|
|
395
|
+
"checkout.statusPage.status.expired": "만료됨",
|
|
396
|
+
"checkout.statusPage.status.failed": "실패",
|
|
397
|
+
"checkout.statusPage.status.pending": "대기 중",
|
|
398
|
+
"checkout.statusPage.status.processing": "처리 중",
|
|
399
|
+
"checkout.statusPage.success.completed": "결제 완료됨",
|
|
400
|
+
"checkout.statusPage.success.message": "{linkTitle}에 대한 결제가 확인되었습니다.",
|
|
401
|
+
"checkout.statusPage.success.processing": "결제 처리 중",
|
|
402
|
+
"checkout.systemEmails.common.customerFallback": "고객",
|
|
403
|
+
"checkout.systemEmails.common.linkTitleFallback": "결제",
|
|
404
|
+
"checkout.systemEmails.error.greeting": "안녕하세요 {firstName}님, 안타깝게도 {linkTitle}에 대한 결제를 처리하지 못했습니다.",
|
|
405
|
+
"checkout.systemEmails.error.hint": "계정에 청구된 금액은 없습니다.",
|
|
406
|
+
"checkout.systemEmails.error.preview": "{linkTitle}에 대한 결제를 처리하지 못했습니다",
|
|
407
|
+
"checkout.systemEmails.error.retry": "다시 시도하거나 다른 결제 수단을 사용해 주세요. 문제가 계속되면 고객 지원팀에 문의하세요.",
|
|
408
|
+
"checkout.systemEmails.error.subject": "결제 실패 - {linkTitle}",
|
|
409
|
+
"checkout.systemEmails.error.title": "결제 실패",
|
|
410
|
+
"checkout.systemEmails.start.greeting": "안녕하세요 {firstName}님, {linkTitle}에 대한 결제가 시작되었습니다.",
|
|
411
|
+
"checkout.systemEmails.start.hint": "이 결제를 시작하지 않으셨다면 고객 지원팀에 문의하세요.",
|
|
412
|
+
"checkout.systemEmails.start.message": "결제를 처리하고 있습니다. 완료되면 확인 메일을 받으실 수 있습니다.",
|
|
413
|
+
"checkout.systemEmails.start.preview": "{amount} {currencyCode} 결제가 처리되고 있습니다",
|
|
414
|
+
"checkout.systemEmails.start.subject": "결제 시작 - {linkTitle}",
|
|
415
|
+
"checkout.systemEmails.start.title": "결제 시작됨",
|
|
416
|
+
"checkout.systemEmails.success.greeting": "안녕하세요 {firstName}님, {linkTitle}에 대한 결제가 성공적으로 완료되었습니다.",
|
|
417
|
+
"checkout.systemEmails.success.hint": "이 이메일을 기록용으로 보관해 주세요.",
|
|
418
|
+
"checkout.systemEmails.success.preview": "{amount} {currencyCode} 결제가 완료되었습니다",
|
|
419
|
+
"checkout.systemEmails.success.receipt": "결제해 주셔서 감사합니다. 이 이메일은 영수증 역할을 합니다.",
|
|
420
|
+
"checkout.systemEmails.success.subject": "결제 완료 - {linkTitle}",
|
|
421
|
+
"checkout.systemEmails.success.title": "결제 완료",
|
|
422
|
+
"checkout.systemEmails.success.transactionLabel": "거래",
|
|
423
|
+
"checkout.template.created": "템플릿이 생성됨",
|
|
424
|
+
"checkout.template.deleted": "템플릿이 삭제됨",
|
|
425
|
+
"checkout.template.updated": "템플릿이 업데이트됨",
|
|
426
|
+
"checkout.transaction.cancelled": "거래 취소됨",
|
|
427
|
+
"checkout.transaction.completed": "거래 완료됨",
|
|
428
|
+
"checkout.transaction.created": "거래 생성됨",
|
|
429
|
+
"checkout.transaction.customerDataCaptured": "고객 데이터 캡처됨",
|
|
430
|
+
"checkout.transaction.expired": "거래 만료됨",
|
|
431
|
+
"checkout.transaction.failed": "거래 실패",
|
|
432
|
+
"checkout.transaction.sessionStarted": "결제 세션 시작됨",
|
|
433
|
+
"checkout.validation.common.integer": "정수를 입력하세요.",
|
|
434
|
+
"checkout.validation.common.invalidColor": "#RRGGBB 형식의 유효한 16진수 색상을 입력하세요.",
|
|
435
|
+
"checkout.validation.common.invalidCurrencyCode": "유효한 3자리 통화 코드를 입력하세요.",
|
|
436
|
+
"checkout.validation.common.invalidFieldsetCode": "유효한 필드셋 코드를 입력하세요.",
|
|
437
|
+
"checkout.validation.common.invalidNumber": "유효한 숫자를 입력하세요.",
|
|
438
|
+
"checkout.validation.common.invalidUrl": "유효한 URL을 입력하세요.",
|
|
439
|
+
"checkout.validation.common.invalidUuid": "유효한 식별자를 입력하세요.",
|
|
440
|
+
"checkout.validation.common.nonNegativeInteger": "0 이상의 정수를 입력하세요.",
|
|
441
|
+
"checkout.validation.common.nonNegativeNumber": "0 이상의 숫자를 입력하세요.",
|
|
442
|
+
"checkout.validation.common.positiveInteger": "0보다 큰 정수를 입력하세요.",
|
|
443
|
+
"checkout.validation.common.required": "이 필드는 필수입니다.",
|
|
444
|
+
"checkout.validation.customAmount.range": "최대 금액은 최소 금액보다 크거나 같아야 합니다.",
|
|
445
|
+
"checkout.validation.customAmountCurrencyCode.required": "사용자 지정 금액 가격 책정에는 통화가 필요합니다.",
|
|
446
|
+
"checkout.validation.customAmountMax.required": "최대 금액은 필수입니다.",
|
|
447
|
+
"checkout.validation.customAmountMin.required": "최소 금액은 필수입니다.",
|
|
448
|
+
"checkout.validation.customerFields.key.invalid": "문자로 시작하는 카멜케이스를 사용하세요.",
|
|
449
|
+
"checkout.validation.fixedPriceAmount.required": "고정 가격 책정에는 금액이 필요합니다.",
|
|
450
|
+
"checkout.validation.fixedPriceCurrencyCode.required": "고정 가격 책정에는 통화가 필요합니다.",
|
|
451
|
+
"checkout.validation.gatewayProviderKey.disabled": "이 게이트웨이 제공업체는 연동에서 비활성화되어 있습니다.",
|
|
452
|
+
"checkout.validation.gatewayProviderKey.notConfigured": "이 게이트웨이 제공업체는 연동에서 구성되지 않았습니다.",
|
|
453
|
+
"checkout.validation.gatewayProviderKey.required": "게이트웨이 제공업체는 필수입니다.",
|
|
454
|
+
"checkout.validation.name.required": "이름은 필수입니다.",
|
|
455
|
+
"checkout.validation.priceListItems.required": "가격표 항목을 하나 이상 추가하세요.",
|
|
456
|
+
"checkout.validation.priceListItems.singleCurrency": "모든 가격표 항목은 동일한 통화를 사용해야 합니다.",
|
|
457
|
+
"checkout.widgets.gatewayTransactionLink.actions.openPayPage": "결제 페이지 열기",
|
|
458
|
+
"checkout.widgets.gatewayTransactionLink.actions.openTransaction": "거래 열기",
|
|
459
|
+
"checkout.widgets.gatewayTransactionLink.labels.link": "링크",
|
|
460
|
+
"checkout.widgets.gatewayTransactionLink.labels.transactionId": "거래 ID",
|
|
461
|
+
"checkout.widgets.gatewayTransactionLink.title": "체크아웃 거래",
|
|
462
|
+
"checkout.widgets.paymentGatewayToolbarLink.action": "결제 링크 생성"
|
|
463
|
+
}
|
|
@@ -380,6 +380,7 @@
|
|
|
380
380
|
"checkout.payPage.validation.priceSelectionRequired": "Wybierz opcję płatności, aby kontynuować.",
|
|
381
381
|
"checkout.payPage.validation.requiredField": "Uzupełnij pole {field}.",
|
|
382
382
|
"checkout.payPage.validation.thisField": "to pole",
|
|
383
|
+
"checkout.search.subtitle.linkTemplate": "Szablon linku",
|
|
383
384
|
"checkout.statusPage.backToPayment": "Wróć do strony płatności",
|
|
384
385
|
"checkout.statusPage.cancel.cancelled": "Płatność anulowana",
|
|
385
386
|
"checkout.statusPage.cancel.failed": "Płatność nieudana",
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/** @jest-environment node */
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
VALID_CHECKOUT_TRANSITIONS,
|
|
5
|
+
assertValidCheckoutStatusTransition,
|
|
6
|
+
isValidCheckoutStatusTransition,
|
|
7
|
+
} from '../transaction-status-machine'
|
|
8
|
+
|
|
9
|
+
describe('VALID_CHECKOUT_TRANSITIONS', () => {
|
|
10
|
+
it('pending can transition to processing, completed, failed, cancelled, expired', () => {
|
|
11
|
+
expect(VALID_CHECKOUT_TRANSITIONS.pending).toEqual(
|
|
12
|
+
expect.arrayContaining(['processing', 'completed', 'failed', 'cancelled', 'expired']),
|
|
13
|
+
)
|
|
14
|
+
})
|
|
15
|
+
|
|
16
|
+
it('processing can transition to completed, failed, cancelled, expired', () => {
|
|
17
|
+
expect(VALID_CHECKOUT_TRANSITIONS.processing).toEqual(
|
|
18
|
+
expect.arrayContaining(['completed', 'failed', 'cancelled', 'expired']),
|
|
19
|
+
)
|
|
20
|
+
})
|
|
21
|
+
|
|
22
|
+
it('terminal states have no allowed transitions', () => {
|
|
23
|
+
expect(VALID_CHECKOUT_TRANSITIONS.completed).toHaveLength(0)
|
|
24
|
+
expect(VALID_CHECKOUT_TRANSITIONS.failed).toHaveLength(0)
|
|
25
|
+
expect(VALID_CHECKOUT_TRANSITIONS.cancelled).toHaveLength(0)
|
|
26
|
+
expect(VALID_CHECKOUT_TRANSITIONS.expired).toHaveLength(0)
|
|
27
|
+
})
|
|
28
|
+
})
|
|
29
|
+
|
|
30
|
+
describe('isValidCheckoutStatusTransition', () => {
|
|
31
|
+
it('pending -> processing is valid', () => {
|
|
32
|
+
expect(isValidCheckoutStatusTransition('pending', 'processing')).toBe(true)
|
|
33
|
+
})
|
|
34
|
+
|
|
35
|
+
it('pending -> completed is valid (captured webhook arrives before processing)', () => {
|
|
36
|
+
expect(isValidCheckoutStatusTransition('pending', 'completed')).toBe(true)
|
|
37
|
+
})
|
|
38
|
+
|
|
39
|
+
it('pending -> failed is valid', () => {
|
|
40
|
+
expect(isValidCheckoutStatusTransition('pending', 'failed')).toBe(true)
|
|
41
|
+
})
|
|
42
|
+
|
|
43
|
+
it('pending -> cancelled is valid', () => {
|
|
44
|
+
expect(isValidCheckoutStatusTransition('pending', 'cancelled')).toBe(true)
|
|
45
|
+
})
|
|
46
|
+
|
|
47
|
+
it('pending -> expired is valid', () => {
|
|
48
|
+
expect(isValidCheckoutStatusTransition('pending', 'expired')).toBe(true)
|
|
49
|
+
})
|
|
50
|
+
|
|
51
|
+
it('processing -> completed is valid', () => {
|
|
52
|
+
expect(isValidCheckoutStatusTransition('processing', 'completed')).toBe(true)
|
|
53
|
+
})
|
|
54
|
+
|
|
55
|
+
it('processing -> failed is valid', () => {
|
|
56
|
+
expect(isValidCheckoutStatusTransition('processing', 'failed')).toBe(true)
|
|
57
|
+
})
|
|
58
|
+
|
|
59
|
+
it('processing -> cancelled is valid', () => {
|
|
60
|
+
expect(isValidCheckoutStatusTransition('processing', 'cancelled')).toBe(true)
|
|
61
|
+
})
|
|
62
|
+
|
|
63
|
+
it('processing -> expired is valid', () => {
|
|
64
|
+
expect(isValidCheckoutStatusTransition('processing', 'expired')).toBe(true)
|
|
65
|
+
})
|
|
66
|
+
|
|
67
|
+
it('completed -> processing is INVALID (regression guard)', () => {
|
|
68
|
+
expect(isValidCheckoutStatusTransition('completed', 'processing')).toBe(false)
|
|
69
|
+
})
|
|
70
|
+
|
|
71
|
+
it('completed -> failed is INVALID', () => {
|
|
72
|
+
expect(isValidCheckoutStatusTransition('completed', 'failed')).toBe(false)
|
|
73
|
+
})
|
|
74
|
+
|
|
75
|
+
it('completed -> pending is INVALID', () => {
|
|
76
|
+
expect(isValidCheckoutStatusTransition('completed', 'pending')).toBe(false)
|
|
77
|
+
})
|
|
78
|
+
|
|
79
|
+
it('failed -> processing is INVALID', () => {
|
|
80
|
+
expect(isValidCheckoutStatusTransition('failed', 'processing')).toBe(false)
|
|
81
|
+
})
|
|
82
|
+
|
|
83
|
+
it('failed -> completed is INVALID', () => {
|
|
84
|
+
expect(isValidCheckoutStatusTransition('failed', 'completed')).toBe(false)
|
|
85
|
+
})
|
|
86
|
+
|
|
87
|
+
it('cancelled -> processing is INVALID', () => {
|
|
88
|
+
expect(isValidCheckoutStatusTransition('cancelled', 'processing')).toBe(false)
|
|
89
|
+
})
|
|
90
|
+
|
|
91
|
+
it('expired -> processing is INVALID', () => {
|
|
92
|
+
expect(isValidCheckoutStatusTransition('expired', 'processing')).toBe(false)
|
|
93
|
+
})
|
|
94
|
+
|
|
95
|
+
it('expired -> completed is INVALID', () => {
|
|
96
|
+
expect(isValidCheckoutStatusTransition('expired', 'completed')).toBe(false)
|
|
97
|
+
})
|
|
98
|
+
|
|
99
|
+
it('pending -> pending is valid', () => {
|
|
100
|
+
expect(isValidCheckoutStatusTransition('pending', 'pending')).toBe(true)
|
|
101
|
+
})
|
|
102
|
+
|
|
103
|
+
it('processing -> processing is valid', () => {
|
|
104
|
+
expect(isValidCheckoutStatusTransition('processing', 'processing')).toBe(true)
|
|
105
|
+
})
|
|
106
|
+
|
|
107
|
+
it('completed -> completed is valid', () => {
|
|
108
|
+
expect(isValidCheckoutStatusTransition('completed', 'completed')).toBe(true)
|
|
109
|
+
})
|
|
110
|
+
})
|
|
111
|
+
|
|
112
|
+
describe('assertValidCheckoutStatusTransition', () => {
|
|
113
|
+
it('does not throw for a valid transition (pending -> processing)', () => {
|
|
114
|
+
expect(() => assertValidCheckoutStatusTransition('pending', 'processing')).not.toThrow()
|
|
115
|
+
})
|
|
116
|
+
|
|
117
|
+
it('does not throw for a valid transition (pending -> completed)', () => {
|
|
118
|
+
expect(() => assertValidCheckoutStatusTransition('pending', 'completed')).not.toThrow()
|
|
119
|
+
})
|
|
120
|
+
|
|
121
|
+
it('does not throw for a valid transition (processing -> completed)', () => {
|
|
122
|
+
expect(() => assertValidCheckoutStatusTransition('processing', 'completed')).not.toThrow()
|
|
123
|
+
})
|
|
124
|
+
|
|
125
|
+
it('throws a 409 CrudHttpError for completed -> processing', () => {
|
|
126
|
+
expect.assertions(3)
|
|
127
|
+
try {
|
|
128
|
+
assertValidCheckoutStatusTransition('completed', 'processing')
|
|
129
|
+
} catch (err) {
|
|
130
|
+
const error = err as { status?: number; body?: Record<string, unknown> }
|
|
131
|
+
expect(error.status).toBe(409)
|
|
132
|
+
expect(error.body?.code).toBe('invalid_status_transition')
|
|
133
|
+
expect(error.body?.currentStatus).toBe('completed')
|
|
134
|
+
}
|
|
135
|
+
})
|
|
136
|
+
|
|
137
|
+
it('throws a 409 CrudHttpError for expired -> completed', () => {
|
|
138
|
+
expect.assertions(3)
|
|
139
|
+
try {
|
|
140
|
+
assertValidCheckoutStatusTransition('expired', 'completed')
|
|
141
|
+
} catch (err) {
|
|
142
|
+
const error = err as { status?: number; body?: Record<string, unknown> }
|
|
143
|
+
expect(error.status).toBe(409)
|
|
144
|
+
expect(error.body?.code).toBe('invalid_status_transition')
|
|
145
|
+
expect(error.body?.requestedStatus).toBe('completed')
|
|
146
|
+
}
|
|
147
|
+
})
|
|
148
|
+
|
|
149
|
+
it('does not throw for same-state transition (processing -> processing)', () => {
|
|
150
|
+
expect(() => assertValidCheckoutStatusTransition('processing', 'processing')).not.toThrow()
|
|
151
|
+
})
|
|
152
|
+
})
|