@@ -59,7 +62,7 @@ export const PersonalInformationPage = ({ user }: Props) => {
fullWidth
onClick={form.handleSubmit(submitForm)}
>
- 저장하기
+ {t('button.save')}
diff --git a/src/shared/config/internationalization/locales/en/academy-detail.json b/src/shared/config/internationalization/locales/en/academy-detail.json
new file mode 100644
index 00000000..48d5c008
--- /dev/null
+++ b/src/shared/config/internationalization/locales/en/academy-detail.json
@@ -0,0 +1,19 @@
+{
+ "academy-detail": {
+ "title": "Academy",
+ "side-panel": {
+ "title": "Please fill out carefully",
+ "description1": "The information you enter will be reflected in search results.",
+ "description2": "Please make sure you haven't missed any important details."
+ },
+ "button": {
+ "save": "Save"
+ },
+ "success": {
+ "register": "Information saved"
+ },
+ "error": {
+ "register": "An error occurred while saving information"
+ }
+ }
+}
diff --git a/src/shared/config/internationalization/locales/en/applicant-management.json b/src/shared/config/internationalization/locales/en/applicant-management.json
index f3fcd0a8..0dded5ed 100644
--- a/src/shared/config/internationalization/locales/en/applicant-management.json
+++ b/src/shared/config/internationalization/locales/en/applicant-management.json
@@ -7,12 +7,46 @@
"accepted": "Accepted",
"rejected": "Rejected"
},
+ "button": {
+ "edit": "Edit",
+ "copy": "Copy",
+ "preview": "Preview",
+ "copying": "Copying..."
+ },
"table": {
"applicant": "Applicant",
+ "nationality": "Nationality",
"job-title": "Job Title",
"memo": "Memo",
"application-date": "Application Date",
"no-data": "No applications have been received yet"
}
+ },
+ "applicant-management-detail": {
+ "side-panel": {
+ "status": "Status",
+ "status-description": "Changing the status will notify the applicant of the update",
+ "memo": "Memo",
+ "memo-placeholder": "Please note any details you'd like to remember about the applicant (up to 100 characters)"
+ },
+ "status-update-modal": {
+ "title": "Update Status",
+ "description1": "Changed the hiring stage from
to
.",
+ "description2": "Saving will notify the applicant of the outcome.",
+ "description3": "Would you like to save these changes?"
+ },
+ "button": {
+ "cancel": "Cancel",
+ "save": "Save",
+ "downloading": "Downloading...",
+ "download-as-pdf": "Download as PDF"
+ },
+ "success": {
+ "save": "Updated successfully"
+ },
+ "error": {
+ "download-resume": "Failed to download resume",
+ "update": "Failed to update"
+ }
}
}
diff --git a/src/shared/config/internationalization/locales/en/auth.json b/src/shared/config/internationalization/locales/en/auth.json
index 10e1d186..10d2fe0b 100644
--- a/src/shared/config/internationalization/locales/en/auth.json
+++ b/src/shared/config/internationalization/locales/en/auth.json
@@ -43,6 +43,7 @@
"reset-password": {
"title": "Reset Password",
"label": {
+ "current-password": "Current password",
"new-password": "New password",
"confirm-new-password": "Confirm password"
},
@@ -54,9 +55,11 @@
"reset-password": "Reset Password"
},
"success": {
- "reset-password": "Your password has been changed successfully"
+ "reset-password": "Your password has been changed successfully",
+ "update-password": "Your password has been changed successfully. Please sign in again."
},
"error": {
+ "incorrect": "The current password is incorrect",
"reset-password": "An error occurred while resetting the password"
}
},
@@ -89,5 +92,33 @@
"email-not-verified": "This email address is not verified",
"email-verification-code-not-checked": "Please click the verify button to complete email verification"
}
+ },
+ "my-account": {
+ "title": "Personal Information",
+ "delete-account-modal": {
+ "title": "Delete Account",
+ "description1": "If you cancel your membership, all the resumes you have created, your application history and any offers received will be permanently lost.",
+ "description2": "Do you still want to proceed with the cancellation?"
+ },
+ "button": {
+ "save": "Save",
+ "delete-account": "Delete Account",
+ "close": "Close",
+ "cancel": "Cancel",
+ "delete": "Delete",
+ "confirm": "Confirm"
+ },
+ "success": {
+ "save": "Your personal information has been updated",
+ "delete-account": {
+ "title": "Account Deletion Completed",
+ "description": "Thank you for joining Plus82. We support you on your journey ahead!"
+ }
+ },
+ "error": {
+ "save": "An error occurred while updating your personal information",
+ "account-deactivated": "This account has been deactivated",
+ "delete-account": "An error occurred while deleting the account"
+ }
}
}
diff --git a/src/shared/config/internationalization/locales/en/field.json b/src/shared/config/internationalization/locales/en/field.json
index f2da470f..cf4c1382 100644
--- a/src/shared/config/internationalization/locales/en/field.json
+++ b/src/shared/config/internationalization/locales/en/field.json
@@ -42,9 +42,19 @@
"label": "Academy Name (English)",
"placeholder": "Enter the academy name (English)"
},
+ "academy-description": {
+ "label": "Academy Description",
+ "placeholder": "Please enter in English"
+ },
"address": {
"label": "Academy Address",
- "placeholder": "Enter the remaining address"
+ "placeholder": "Enter the remaining address",
+ "button": "Search"
+ },
+ "introduction-image": {
+ "label": "Introduction Image",
+ "placeholder": "Upload Image",
+ "description": "Please upload at least one introduction image."
},
"business-registration-number": {
"label": "Business Registration Number",
@@ -70,6 +80,84 @@
"gyeongnam": "Gyeongsangnam-do",
"jeju": "Jeju"
}
+ },
+ "application-date": {
+ "label": "Application Date"
+ },
+ "nationality": {
+ "label": "Nationality"
+ },
+ "residence-country": {
+ "label": "Current Country of Residence"
+ },
+ "degree": {
+ "label": "Degree"
+ },
+ "visa": {
+ "label": "Visa"
+ },
+ "student-type": {
+ "label": "Student Type"
+ },
+ "application-status": {
+ "option": {
+ "submitted": "Submitted",
+ "reviewed": "Reviewed",
+ "accepted": "Accepted",
+ "rejected": "Rejected"
+ }
+ },
+ "job-posting-title": {
+ "label": "Job Title",
+ "placeholder": "Please enter concisely and clearly. ex) Full-Time ESL Instructor"
+ },
+ "job-posting-description": {
+ "label": "Job Description",
+ "placeholder": "Please provide detailed information about the responsibilities after joining.\nex) Teach [elementary-level] English classes [30 hours per week]. Develop lesson plans and class materials."
+ },
+ "job-posting-required-qualification": {
+ "label": "Required Qualifications",
+ "placeholder": "Please enter the necessary requirements for the applicant.\nex) Native or native-level English speaker. Valid TEFL/TESOL/CELTA certification (preferred)."
+ },
+ "job-posting-preferred-qualification": {
+ "label": "Preferred Qualifications",
+ "placeholder": "If there are any preferred qualifications, please enter them.\nex) Basic Korean language skills for simple communication.\nExperience teaching [elementary students/IELTS/TOEFL]."
+ },
+ "job-posting-benefits": {
+ "label": "Benefits",
+ "placeholder": "Please describe the benefits provided to employees.\nex) Provided housing or housing allowance. Paid vacation days (ex. 10 days) + national holidays. Round-trip airfare reimbursement (depending on contract)."
+ },
+ "job-posting-salary": {
+ "label": "Salary",
+ "placeholder": "Please enter numbers only"
+ },
+ "job-posting-salary-negotiable": {
+ "label": "Negotiable"
+ },
+ "target-student": {
+ "label": "Target Student",
+ "option": {
+ "all": "All",
+ "kindergarten": "Kindergarten",
+ "elementary": "Elementary",
+ "middle-school": "Middle School",
+ "high-school": "High School",
+ "adult": "Adult"
+ }
+ },
+ "job-posting-start-date": {
+ "label": "Start Date",
+ "placeholder": "Please select the start date"
+ },
+ "job-posting-due-date": {
+ "label": "Expiration Date",
+ "placeholder": "Please select the expiration date"
+ },
+ "job-posting-no-expiration-date": {
+ "label": "Open Recruitment"
+ },
+ "currency-unit": {
+ "label": "in 10,000 KRW"
}
}
}
diff --git a/src/shared/config/internationalization/locales/en/job-posting.json b/src/shared/config/internationalization/locales/en/job-posting.json
index e1f2e173..539e64d7 100644
--- a/src/shared/config/internationalization/locales/en/job-posting.json
+++ b/src/shared/config/internationalization/locales/en/job-posting.json
@@ -6,6 +6,8 @@
"saved": "Saved",
"closed": "Closed"
},
+ "application-count": " applicants",
+ "currency-unit": "in 10,000 KRW",
"table": {
"job-title": "Job Title",
"application": "Application",
@@ -22,5 +24,30 @@
"success": {
"job-posting-copy": "Job posting copied successfully"
}
+ },
+ "create-job-posting": {
+ "create-title": "Register Job Posting",
+ "update-title": "Edit Job Posting",
+ "side-panel": {
+ "title": "Please write the job posting in English.",
+ "description1": "The information you enter will be reflected in search results.",
+ "description2": "Please make sure you haven't missed any important details."
+ },
+ "button": {
+ "register-job-posting": "Register",
+ "save-job-posting-draft": "Save"
+ },
+ "error": {
+ "job-posting-register": "An error occurred while registering the job posting",
+ "job-posting-draft-register": "An error occurred while saving the job posting as a draft",
+ "job-posting-draft-update": "An error occurred while updating the job posting draft",
+ "job-posting-update": "An error occurred while updating the job posting"
+ },
+ "success": {
+ "job-posting-draft-register": "Job posting saved as a draft successfully",
+ "job-posting-register": "Job posting registered successfully",
+ "job-posting-draft-update": "Job posting draft updated successfully",
+ "job-posting-update": "Job posting updated successfully"
+ }
}
}
diff --git a/src/shared/config/internationalization/locales/en/validation.json b/src/shared/config/internationalization/locales/en/validation.json
index 0ec19420..778dca28 100644
--- a/src/shared/config/internationalization/locales/en/validation.json
+++ b/src/shared/config/internationalization/locales/en/validation.json
@@ -54,6 +54,13 @@
"required": "Please enter the detailed address",
"maxLength": "Please enter less than 100 characters"
},
+ "academyDescription": {
+ "required": "Please enter the academy description",
+ "maxLength": "Please enter less than 1000 characters"
+ },
+ "images": {
+ "required": "Please upload at least one introduction image"
+ },
"businessRegistrationNumber": {
"required": "Please enter the business registration number",
"length": "Please enter 10 digits",
diff --git a/src/shared/config/internationalization/locales/ko/academy-detail.json b/src/shared/config/internationalization/locales/ko/academy-detail.json
new file mode 100644
index 00000000..6d98428b
--- /dev/null
+++ b/src/shared/config/internationalization/locales/ko/academy-detail.json
@@ -0,0 +1,19 @@
+{
+ "academy-detail": {
+ "title": "학원 상세 정보",
+ "side-panel": {
+ "title": "작성에 유의해 주세요",
+ "description1": "입력한 정보는 검색에 반영돼요.",
+ "description2": "중요한 정보를 빠뜨리지 않았는지 확인해 주세요."
+ },
+ "button": {
+ "save": "저장하기"
+ },
+ "success": {
+ "register": "정보를 저장했어요"
+ },
+ "error": {
+ "register": "정보를 저장하는 중 오류가 발생했습니다"
+ }
+ }
+}
diff --git a/src/shared/config/internationalization/locales/ko/applicant-management.json b/src/shared/config/internationalization/locales/ko/applicant-management.json
index 88b72184..1d6219a5 100644
--- a/src/shared/config/internationalization/locales/ko/applicant-management.json
+++ b/src/shared/config/internationalization/locales/ko/applicant-management.json
@@ -7,12 +7,46 @@
"accepted": "합격",
"rejected": "불합격"
},
+ "button": {
+ "edit": "공고 수정",
+ "copy": "공고 복사",
+ "preview": "미리보기",
+ "copying": "복사 중..."
+ },
"table": {
"applicant": "지원자",
+ "nationality": "국적",
"job-title": "공고 제목",
"memo": "메모",
"application-date": "지원 일자",
"no-data": "아직 접수된 지원자가 없습니다"
}
+ },
+ "applicant-management-detail": {
+ "side-panel": {
+ "status": "현재 채용 단계",
+ "status-description": "채용 단계를 변경하면 지원자에게 알림으로 결과를 알려줘요",
+ "memo": "한 줄 메모",
+ "memo-placeholder": "지원자에 대해 기억하고 싶은 점이 있다면 적어주세요 (최대 100자)"
+ },
+ "status-update-modal": {
+ "title": "채용 단계 변경",
+ "description1": "채용 단계를
에서
(으)로 변경했어요.",
+ "description2": "저장하면 지원자에게 결과가 전달돼요.",
+ "description3": "변경 사항을 저장할까요?"
+ },
+ "button": {
+ "cancel": "취소",
+ "save": "저장하기",
+ "downloading": "다운로드 중...",
+ "download-as-pdf": "PDF로 다운받기"
+ },
+ "success": {
+ "save": "내용을 저장했어요"
+ },
+ "error": {
+ "download-resume": "이력서 다운로드 중 오류가 발생했습니다",
+ "update": "내용을 저장하는 중 오류가 발생했습니다"
+ }
}
}
diff --git a/src/shared/config/internationalization/locales/ko/auth.json b/src/shared/config/internationalization/locales/ko/auth.json
index 9ebfb3dd..830c0389 100644
--- a/src/shared/config/internationalization/locales/ko/auth.json
+++ b/src/shared/config/internationalization/locales/ko/auth.json
@@ -43,6 +43,7 @@
"reset-password": {
"title": "비밀번호 변경",
"label": {
+ "current-password": "현재 비밀번호",
"new-password": "새 비밀번호",
"confirm-new-password": "새 비밀번호 확인"
},
@@ -54,9 +55,11 @@
"reset-password": "변경하기"
},
"success": {
- "reset-password": "비밀번호가 변경되었습니다"
+ "reset-password": "비밀번호가 변경되었습니다",
+ "update-password": "비밀번호가 변경되었어요. 다시 로그인 해주세요."
},
"error": {
+ "incorrect": "현재 비밀번호가 일치하지 않습니다",
"reset-password": "비밀번호 변경 중 오류가 발생했습니다"
}
},
@@ -89,5 +92,33 @@
"email-not-verified": "이메일 주소가 인증되지 않았습니다",
"email-verification-code-not-checked": "이메일 인증 확인 버튼을 눌러주세요"
}
+ },
+ "my-account": {
+ "title": "개인 정보",
+ "delete-account-modal": {
+ "title": "회원 탈퇴",
+ "description1": "만약 회원 탈퇴를 하시면, 등록하신 모든 이력서와 지원 이력이 삭제됩니다. 또한 Plus82는 이력 삭제에 대해 책임지지 않습니다.",
+ "description2": "회원 탈퇴를 진행하시겠습니까?"
+ },
+ "button": {
+ "save": "저장하기",
+ "delete-account": "회원 탈퇴",
+ "close": "닫기",
+ "cancel": "취소",
+ "delete": "회원 탈퇴",
+ "confirm": "확인"
+ },
+ "success": {
+ "save": "정보를 저장했어요",
+ "delete-account": {
+ "title": "회원 탈퇴가 완료되었습니다",
+ "description": "그동안 Plus82를 이용해주셔서 감사합니다. 당신의 여정을 응원합니다!"
+ }
+ },
+ "error": {
+ "save": "정보를 저장하는 중 오류가 발생했습니다",
+ "account-deactivated": "이 계정은 비활성화되었습니다",
+ "delete-account": "회원 탈퇴 중 오류가 발생했습니다"
+ }
}
}
diff --git a/src/shared/config/internationalization/locales/ko/field.json b/src/shared/config/internationalization/locales/ko/field.json
index 8b4660f5..c5439a75 100644
--- a/src/shared/config/internationalization/locales/ko/field.json
+++ b/src/shared/config/internationalization/locales/ko/field.json
@@ -42,9 +42,19 @@
"label": "학원 이름 (영문)",
"placeholder": "영어로 입력해 주세요"
},
+ "academy-description": {
+ "label": "학원 소개",
+ "placeholder": "영어로 입력해 주세요"
+ },
"address": {
"label": "학원 주소",
- "placeholder": "상세 주소 입력"
+ "placeholder": "상세 주소 입력",
+ "button": "주소 검색"
+ },
+ "introduction-image": {
+ "label": "소개 이미지",
+ "placeholder": "이미지 추가",
+ "description": "소개 이미지는 최소 1장 이상 등록해 주세요."
},
"business-registration-number": {
"label": "사업자 등록번호",
@@ -70,6 +80,84 @@
"gyeongnam": "경남",
"jeju": "제주"
}
+ },
+ "application-date": {
+ "label": "지원 일자"
+ },
+ "nationality": {
+ "label": "국적"
+ },
+ "residence-country": {
+ "label": "거주 지역"
+ },
+ "degree": {
+ "label": "학력"
+ },
+ "visa": {
+ "label": "비자"
+ },
+ "student-type": {
+ "label": "학생 유형"
+ },
+ "application-status": {
+ "option": {
+ "submitted": "접수",
+ "reviewed": "검토",
+ "accepted": "합격",
+ "rejected": "불합격"
+ }
+ },
+ "job-posting-title": {
+ "label": "공고 제목",
+ "placeholder": "간결하고 명확하게 입력해 주세요. ex) Full-Time ESL Instructor"
+ },
+ "job-posting-description": {
+ "label": "주요 업무",
+ "placeholder": "입사 후 맡게되는 업무에 대해 자세히 알려주세요\nex) Teach [elementary-level] English classes [30 hours per week]. Develop lesson plans and class materials."
+ },
+ "job-posting-required-qualification": {
+ "label": "자격 요건",
+ "placeholder": "지원자의 필요 조건을 입력해 주세요\nex) Native or native-level English speaker. Valid TEFL/TESOL/CELTA certification (preferred)."
+ },
+ "job-posting-preferred-qualification": {
+ "label": "우대 사항",
+ "placeholder": "채용시 우대되는 사항이 있다면 입력해 주세요\nex) Basic Korean language skills for simple communication.\nExperience teaching [elementary students/IELTS/TOEFL]."
+ },
+ "job-posting-benefits": {
+ "label": "혜택/복지",
+ "placeholder": "근무자에게 제공되는 혜택을 알려주세요\nex) Provided housing or housing allowance. Paid vacation days (ex. 10 days) + national holidays. Round-trip airfare reimbursement (depending on contract)."
+ },
+ "job-posting-salary": {
+ "label": "월급",
+ "placeholder": "숫자만 입력해 주세요"
+ },
+ "job-posting-salary-negotiable": {
+ "label": "협의 가능"
+ },
+ "target-student": {
+ "label": "대상 학생",
+ "option": {
+ "all": "전체",
+ "kindergarten": "유치원",
+ "elementary": "초등학생",
+ "middle-school": "중학생",
+ "high-school": "고등학생",
+ "adult": "성인"
+ }
+ },
+ "job-posting-start-date": {
+ "label": "업무 시작 가능 날짜",
+ "placeholder": "업무 시작 날짜를 선택해 주세요"
+ },
+ "job-posting-due-date": {
+ "label": "공고 마감일",
+ "placeholder": "공고 마감 날짜를 선택해 주세요"
+ },
+ "job-posting-no-expiration-date": {
+ "label": "상시 채용"
+ },
+ "currency-unit": {
+ "label": "만원"
}
}
}
diff --git a/src/shared/config/internationalization/locales/ko/job-posting.json b/src/shared/config/internationalization/locales/ko/job-posting.json
index 100dc6fa..d3f920e8 100644
--- a/src/shared/config/internationalization/locales/ko/job-posting.json
+++ b/src/shared/config/internationalization/locales/ko/job-posting.json
@@ -6,6 +6,8 @@
"saved": "임시 저장",
"closed": "채용 마감"
},
+ "currency-unit": "만원",
+ "application-count": "명",
"table": {
"job-title": "공고명",
"application": "지원 현황",
@@ -22,5 +24,30 @@
"success": {
"job-posting-copy": "공고를 복사했어요"
}
+ },
+ "create-job-posting": {
+ "create-title": "공고 등록",
+ "update-title": "공고 수정",
+ "side-panel": {
+ "title": "공고 내용은 영어로 작성해주세요.",
+ "description1": "입력한 정보는 검색에 반영돼요.",
+ "description2": "중요한 정보를 빠뜨리지 않았는지 확인해 주세요."
+ },
+ "button": {
+ "register-job-posting": "등록하기",
+ "save-job-posting-draft": "임시 저장"
+ },
+ "error": {
+ "job-posting-register": "공고를 등록하는 중 오류가 발생했습니다",
+ "job-posting-draft-register": "공고를 임시 저장하는 중 오류가 발생했습니다",
+ "job-posting-draft-update": "임시 저장된 공고를 수정하는 중 오류가 발생했습니다",
+ "job-posting-update": "공고를 수정하는 중 오류가 발생했습니다"
+ },
+ "success": {
+ "job-posting-draft-register": "공고를 임시 저장했어요",
+ "job-posting-register": "공고를 등록했어요",
+ "job-posting-draft-update": "임시 저장된 공고를 수정했어요",
+ "job-posting-update": "공고를 수정했어요"
+ }
}
}
diff --git a/src/shared/config/internationalization/locales/ko/validation.json b/src/shared/config/internationalization/locales/ko/validation.json
index 6ff93d5e..69c4dae7 100644
--- a/src/shared/config/internationalization/locales/ko/validation.json
+++ b/src/shared/config/internationalization/locales/ko/validation.json
@@ -54,6 +54,13 @@
"required": "상세 주소를 입력해 주세요",
"maxLength": "상세 주소는 최대 100자를 초과할 수 없습니다"
},
+ "academyDescription": {
+ "required": "학원 소개를 입력해 주세요",
+ "maxLength": "학원 소개는 최대 1000자를 초과할 수 없습니다"
+ },
+ "images": {
+ "required": "소개 이미지를 최소 1장 이상 등록해 주세요"
+ },
"businessRegistrationNumber": {
"required": "사업자 등록번호를 입력해 주세요",
"length": "10자를 입력해주세요",
diff --git a/src/shared/config/internationalization/request.ts b/src/shared/config/internationalization/request.ts
index df369981..45fd8674 100644
--- a/src/shared/config/internationalization/request.ts
+++ b/src/shared/config/internationalization/request.ts
@@ -13,6 +13,7 @@ export default getRequestConfig(async () => {
...(await import(`./locales/${locale}/gnb.json`)).default,
...(await import(`./locales/${locale}/job-posting.json`)).default,
...(await import(`./locales/${locale}/validation.json`)).default,
+ ...(await import(`./locales/${locale}/academy-detail.json`)).default,
}
return {
diff --git a/src/shared/ui/gnb/business-button.tsx b/src/shared/ui/gnb/business-button.tsx
index f7ba62b7..04498352 100644
--- a/src/shared/ui/gnb/business-button.tsx
+++ b/src/shared/ui/gnb/business-button.tsx
@@ -1,7 +1,7 @@
import { useQueryClient } from '@tanstack/react-query'
import { useRouter } from 'next/navigation'
import { signOut } from 'next-auth/react'
-import { useLocale } from 'next-intl'
+import { useLocale, useTranslations } from 'next-intl'
import { startTransition } from 'react'
import { businessSignOut } from 'entities/auth'
@@ -17,6 +17,9 @@ export const BusinessButton = () => {
const queryClient = useQueryClient()
const locale = useLocale()
+ const t = useTranslations()
+
+ const isDev = process.env.NODE_ENV === 'development'
const { isOpen, toggleIsOpen, close, dropdownRef } = useDropdown()
const {
@@ -81,33 +84,39 @@ export const BusinessButton = () => {
className="w-[140px] shadow-[0px_2px_8px_0px_rgba(0,0,0,0.08)]"
scrollable={false}
>
-
My Page
-
-
- Language
- {isSubMenuOpen && (
-
-
- English
-
-
- Korean
-
-
- )}
-
+
+ {t('dropdown.my-page')}
+
+ {isDev && (
+
+
+ Language
+ {isSubMenuOpen && (
+
+
+ English
+
+
+ Korean
+
+
+ )}
+
+
+ )}
+
+ {t('dropdown.sign-out')}
- Sign Out
)}
diff --git a/src/shared/ui/gnb/business-gnb.tsx b/src/shared/ui/gnb/business-gnb.tsx
index 6fd9dca8..4ce25f27 100644
--- a/src/shared/ui/gnb/business-gnb.tsx
+++ b/src/shared/ui/gnb/business-gnb.tsx
@@ -35,9 +35,9 @@ export const BusinessGNB = () => {