Add Korean translation (#169)

This commit is contained in:
Doh
2025-08-14 14:56:09 -04:00
committed by GitHub
parent ad2504dc7f
commit 8dda60b9b1
6 changed files with 434 additions and 2 deletions

1
.gitignore vendored
View File

@@ -46,5 +46,6 @@ next-env.d.ts
Budfile
certificates
/backups/*
CLAUDE.md
CHANGELOG.md.tmp

View File

@@ -1,5 +1,11 @@
# Changelog
## Version 0.2.24
### Added
* 🌍 Added Korean language support (한국어)
## Version 0.2.23
### Fixed

View File

@@ -22,7 +22,7 @@ Want to try HabitTrove before installing? Visit the public [demo instance](https
- 💰 Create a wishlist of rewards to redeem with earned coins
- 📊 View your habit completion streaks and statistics
- 📅 Calendar heatmap to visualize your progress (WIP)
- 🌍 Multi-language support (English, Español, Deutsch, Français, Русский, 简体中文, 日本語)
- 🌍 Multi-language support (English, Español, Deutsch, Français, Русский, 简体中文, 한국어, 日本語)
- 🌙 Dark mode support
- 📲 Progressive Web App (PWA) support
- 💾 Automatic daily backups with rotation

View File

@@ -233,6 +233,7 @@ export default function SettingsPage() {
<option value="fr">Français</option>
<option value="ru">Русский</option>
<option value="zh"></option>
<option value="ko"></option>
<option value="ja"></option>
</select>
</div>

424
messages/ko.json Normal file
View File

@@ -0,0 +1,424 @@
{
"Dashboard": {
"title": "대시보드"
},
"HabitList": {
"myTasks": "내 할 일",
"myHabits": "내 습관",
"addTaskButton": "할 일 추가",
"addHabitButton": "습관 추가",
"searchTasksPlaceholder": "할 일 검색...",
"searchHabitsPlaceholder": "습관 검색...",
"sortByLabel": "정렬 기준:",
"sortByName": "이름",
"sortByCoinReward": "코인 보상",
"sortByDueDate": "마감일",
"sortByFrequency": "빈도",
"toggleSortOrderAriaLabel": "정렬 순서 토글",
"noTasksFoundMessage": "검색과 일치하는 할 일이 없습니다.",
"noHabitsFoundMessage": "검색과 일치하는 습관이 없습니다.",
"emptyStateTasksTitle": "아직 할 일이 없습니다",
"emptyStateHabitsTitle": "아직 습관이 없습니다",
"emptyStateTasksDescription": "첫 할 일을 만들어 진행 상황을 추적해보세요",
"emptyStateHabitsDescription": "첫 습관을 만들어 진행 상황을 추적해보세요",
"archivedSectionTitle": "보관함",
"deleteTaskDialogTitle": "할 일 삭제",
"deleteHabitDialogTitle": "습관 삭제",
"deleteTaskDialogMessage": "이 할 일을 정말로 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다.",
"deleteHabitDialogMessage": "이 습관을 정말로 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다.",
"deleteButton": "삭제"
},
"DailyOverview": {
"addTaskButtonLabel": "할 일 추가",
"addHabitButtonLabel": "습관 추가",
"todaysOverviewTitle": "오늘의 개요",
"dailyTasksTitle": "오늘의 할 일",
"noTasksDueTodayMessage": "오늘 할 일이 없습니다. 할 일을 추가해서 시작하세요!",
"dailyHabitsTitle": "오늘의 습관",
"noHabitsDueTodayMessage": "오늘 습관이 없습니다. 습관을 추가해서 시작하세요!",
"wishlistGoalsTitle": "위시리스트 목표",
"redeemableBadgeLabel": "{count}/{total} 교환 가능",
"noWishlistItemsMessage": "아직 위시리스트 항목이 없습니다. 목표를 추가해서 노력해보세요!",
"readyToRedeemMessage": "교환할 준비 완료!",
"coinsToGoMessage": "{amount} 코인 남음",
"showLessButton": "적게 보기",
"showAllButton": "모두 보기",
"viewButton": "보기",
"deleteTaskDialogTitle": "할 일 삭제",
"deleteHabitDialogTitle": "습관 삭제",
"confirmDeleteDialogMessage": "정말로 \"{name}\"을(를) 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다.",
"deleteButton": "삭제",
"overdueTooltip": "기한이 지남"
},
"HabitContextMenuItems": {
"startPomodoro": "뽀모도로 시작",
"moveToToday": "오늘로 이동",
"moveToTomorrow": "내일로 이동",
"unpin": "고정 해제",
"pin": "고정",
"edit": "수정",
"archive": "보관",
"unarchive": "보관 해제",
"delete": "삭제"
},
"HabitStreak": {
"dailyCompletionStreakTitle": "일일 달성 연속 기록",
"tooltipHabitsLabel": "습관",
"tooltipTasksLabel": "할 일",
"tooltipCompletedLabel": "완료됨"
},
"CoinBalance": {
"coinBalanceTitle": "코인 잔액"
},
"AddEditHabitModal": {
"editTaskTitle": "할 일 수정",
"editHabitTitle": "습관 수정",
"addNewTaskTitle": "새 할 일 추가",
"addNewHabitTitle": "새 습관 추가",
"nameLabel": "이름 *",
"descriptionLabel": "설명",
"whenLabel": "시기 *",
"completeLabel": "완료",
"timesSuffix": "회",
"rewardLabel": "보상",
"coinsSuffix": "코인",
"shareLabel": "공유",
"saveChangesButton": "변경 사항 저장",
"addTaskButton": "할 일 추가",
"addHabitButton": "습관 추가"
},
"ConfirmDialog": {
"confirmButton": "확인",
"cancelButton": "취소"
},
"AddEditWishlistItemModal": {
"editTitle": "보상 수정",
"addTitle": "새 보상 추가",
"nameLabel": "이름 *",
"descriptionLabel": "설명",
"costLabel": "비용",
"coinsSuffix": "코인",
"redeemableLabel": "교환 가능",
"timesSuffix": "회",
"errorNameRequired": "이름은 필수입니다",
"errorCoinCostMin": "코인 비용은 최소 1이어야 합니다",
"errorTargetCompletionsMin": "목표 완료 횟수는 최소 1이어야 합니다",
"errorInvalidUrl": "유효한 URL을 입력하세요",
"linkLabel": "링크",
"shareLabel": "공유",
"saveButton": "변경 사항 저장",
"addButton": "보상 추가"
},
"Navigation": {
"dashboard": "대시보드",
"tasks": "할 일",
"habits": "습관",
"calendar": "캘린더",
"wishlist": "위시리스트",
"coins": "코인"
},
"TodayEarnedCoins": {
"todaySuffix": "오늘"
},
"WishlistItem": {
"usesLeftSingular": "사용 횟수 남음",
"usesLeftPlural": "사용 횟수 남음",
"coinsSuffix": "코인",
"redeem": "교환",
"redeemedDone": "완료",
"redeemedExclamation": "교환 완료!",
"editButton": "수정",
"archiveButton": "보관",
"unarchiveButton": "보관 해제",
"deleteButton": "삭제"
},
"WishlistManager": {
"title": "내 위시리스트",
"addRewardButton": "보상 추가",
"emptyStateTitle": "위시리스트가 비어 있습니다",
"emptyStateDescription": "코인으로 얻고 싶은 보상을 추가하세요",
"archivedSectionTitle": "보관함",
"popupBlockedTitle": "팝업 차단됨",
"popupBlockedDescription": "링크를 열려면 팝업을 허용해주세요",
"deleteDialogTitle": "보상 삭제",
"deleteDialogMessage": "이 보상을 정말로 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다.",
"deleteButton": "삭제"
},
"UserSelectModal": {
"addUserButton": "사용자 추가",
"createNewUserTitle": "새 사용자 생성",
"selectUserTitle": "사용자 선택",
"signInSuccessTitle": "로그인 성공",
"signInSuccessDescription": "환영합니다, {username}님!",
"errorInvalidPassword": "잘못된 비밀번호",
"deleteUserConfirmation": "사용자 {username}을(를) 정말로 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다.",
"confirmDeleteButtonText": "삭제",
"deletingButtonText": "삭제 중...",
"deleteUserSuccessTitle": "사용자 삭제됨",
"deleteUserSuccessDescription": "사용자 {username}이(가) 성공적으로 삭제되었습니다.",
"deleteUserErrorTitle": "삭제 실패",
"genericError": "예기치 않은 오류가 발생했습니다.",
"networkError": "네트워크 오류가 발생했습니다. 다시 시도해주세요.",
"deleteUserTooltip": "사용자 삭제",
"editUserTooltip": "사용자 수정"
},
"CoinsManager": {
"title": "코인 관리",
"currentBalanceLabel": "현재 잔액",
"coinsSuffix": "코인",
"addCoinsButton": "코인 추가",
"removeCoinsButton": "코인 제거",
"statisticsTitle": "통계",
"totalEarnedLabel": "총 획득 코인",
"totalSpentLabel": "총 사용 코인",
"totalTransactionsLabel": "총 거래 횟수",
"todaysEarnedLabel": "오늘 획득 코인",
"todaysSpentLabel": "오늘 사용 코인",
"todaysTransactionsLabel": "오늘 거래 횟수",
"transactionHistoryTitle": "거래 내역",
"showLabel": "표시:",
"entriesSuffix": "개",
"showingEntries": "{from}개부터 {to}개까지 총 {total}개 항목 표시",
"noTransactionsTitle": "아직 거래 내역이 없습니다",
"noTransactionsDescription": "코인을 획득하거나 사용하기 시작하면 거래 내역이 여기에 나타납니다",
"pageLabel": "페이지",
"ofLabel": "중",
"transactionTypeHabitCompletion": "습관 완료",
"transactionTypeTaskCompletion": "할 일 완료",
"transactionTypeHabitUndo": "습관 되돌리기",
"transactionTypeTaskUndo": "할 일 되돌리기",
"transactionTypeWishRedemption": "위시리스트 교환",
"transactionTypeManualAdjustment": "수동 조정",
"transactionTypeCoinReset": "코인 초기화",
"transactionTypeInitialBalance": "초기 잔액"
},
"NotificationBell": {
"errorUpdateTimestamp": "알림 읽은 시각을 업데이트하지 못했습니다:"
},
"PomodoroTimer": {
"focusLabel1": "집중하세요",
"focusLabel2": "할 수 있어요",
"focusLabel3": "계속하세요",
"focusLabel4": "해내세요",
"focusLabel5": "실행하세요",
"focusLabel6": "강하게 유지하세요",
"focusLabel7": "밀어붙이세요",
"focusLabel8": "한 번에 한 걸음씩",
"focusLabel9": "당신은 해낼 수 있어요",
"focusLabel10": "집중하고 정복하세요",
"breakLabel1": "휴식을 취하세요",
"breakLabel2": "편안하게 재충전하세요",
"breakLabel3": "깊게 숨쉬세요",
"breakLabel4": "몸을 쭉 펴세요",
"breakLabel5": "기분 전환하세요",
"breakLabel6": "당신은 그럴 자격이 있어요",
"breakLabel7": "에너지를 재충전하세요",
"breakLabel8": "잠시 벗어나세요",
"breakLabel9": "마음을 비우세요",
"breakLabel10": "휴식하고 활력을 되찾으세요",
"focusType": "집중",
"breakType": "휴식",
"pauseButton": "일시 정지",
"startButton": "시작",
"resetButton": "초기화",
"skipButton": "건너뛰기",
"wakeLockNotSupported": "브라우저가 wakelock을 지원하지 않습니다",
"wakeLockInUse": "Wake lock이 이미 사용 중입니다",
"wakeLockRequestError": "wake lock 요청 오류:",
"wakeLockReleaseError": "wake lock 해제 오류:"
},
"HabitCalendar": {
"title": "습관 캘린더",
"calendarCardTitle": "캘린더",
"selectDatePrompt": "날짜 선택",
"tasksSectionTitle": "할 일",
"habitsSectionTitle": "습관",
"errorCompletingPastHabit": "과거 습관 완료 오류:"
},
"NotificationDropdown": {
"notLoggedIn": "로그인되지 않았습니다.",
"userCompletedItem": "{username}님이 {itemName}을(를) 완료했습니다.",
"userRedeemedItem": "{username}님이 {itemName}을(를) 교환했습니다.",
"activityRelatedToItem": "{username}님의 {itemName} 관련 활동.",
"defaultUsername": "어떤 사용자",
"defaultItemName": "공유된 항목",
"notificationsTitle": "알림",
"notificationsTooltip": "공유한 습관이나 위시리스트에 대해 다른 사용자의 완료 또는 교환 내역을 보여줍니다 (관리자여야 합니다)",
"noNotificationsYet": "아직 알림이 없습니다."
},
"AboutModal": {
"dialogArisLabel": "정보",
"changelogButton": "변경 로그",
"createdByPrefix": "❤️로 제작: ",
"starOnGitHubButton": "GitHub에서 별 누르기"
},
"PermissionSelector": {
"permissionsTitle": "권한",
"adminAccessLabel": "관리자 접근",
"adminAccessDescription": "관리자는 모든 사용자의 모든 데이터에 대한 전체 권한을 가집니다",
"resourceHabitTask": "습관 / 할 일",
"resourceWishlist": "위시리스트",
"resourceCoins": "코인",
"permissionWrite": "쓰기",
"permissionInteract": "상호 작용"
},
"UserForm": {
"toastUserUpdatedTitle": "사용자 업데이트됨",
"toastUserUpdatedDescription": "사용자 {username}이(가) 성공적으로 업데이트되었습니다",
"toastUserCreatedTitle": "사용자 생성됨",
"toastUserCreatedDescription": "사용자 {username}이(가) 성공적으로 생성되었습니다",
"actionUpdate": "업데이트",
"actionCreate": "생성",
"errorFailedUserAction": "사용자 {action} 실패",
"errorTitle": "오류",
"errorFileSizeLimit": "파일 크기는 5MB 미만이어야 합니다",
"toastAvatarUploadedTitle": "아바타 업로드됨",
"toastAvatarUploadedDescription": "아바타가 성공적으로 업로드되었습니다",
"errorFailedAvatarUpload": "아바타 업로드 실패",
"changeAvatarButton": "아바타 변경",
"uploadAvatarButton": "아바타 업로드",
"usernameLabel": "사용자 이름",
"usernamePlaceholder": "사용자 이름",
"newPasswordLabel": "새 비밀번호",
"passwordLabel": "비밀번호",
"passwordPlaceholderEdit": "현재 비밀번호를 유지하려면 비워두세요",
"passwordPlaceholderCreate": "비밀번호를 입력하세요",
"demoPasswordDisabledMessage": "데모 인스턴스에서는 비밀번호가 자동으로 비활성화됩니다",
"disablePasswordLabel": "비밀번호 비활성화",
"cancelButton": "취소",
"saveChangesButton": "변경 사항 저장",
"createUserButton": "사용자 생성",
"deleteAccountButton": "계정 삭제"
},
"ViewToggle": {
"habitsLabel": "습관",
"tasksLabel": "할 일"
},
"HabitItem": {
"overdue": "기한이 지남",
"whenLabel": "시기: {frequency}",
"coinsPerCompletion": "완료당 {count} 코인",
"completedStatus": "완료됨",
"completedStatusCount": "완료됨 ({completed}/{target})",
"completedStatusCountMobile": "{completed}/{target}",
"completeButton": "완료",
"completeButtonCount": "완료 ({completed}/{target})",
"completeButtonCountMobile": "{completed}/{target}",
"undoButton": "실행 취소",
"editButton": "수정"
},
"TransactionNoteEditor": {
"noteTooLongTitle": "메모가 너무 깁니다",
"noteTooLongDescription": "메모는 200자 미만이어야 합니다",
"errorSavingNoteTitle": "메모 저장 오류",
"errorDeletingNoteTitle": "메모 삭제 오류",
"pleaseTryAgainDescription": "다시 시도해주세요",
"addNotePlaceholder": "메모 추가...",
"saveNoteTitle": "메모 저장",
"cancelButtonTitle": "취소",
"deleteNoteTitle": "메모 삭제",
"editNoteAriaLabel": "메모 수정"
},
"Profile": {
"guestUsername": "게스트",
"editProfileButton": "프로필 수정",
"signOutSuccessTitle": "로그아웃 성공",
"signOutSuccessDescription": "계정에서 로그아웃되었습니다",
"signOutErrorTitle": "로그아웃 오류",
"signOutErrorDescription": "로그아웃 실패",
"switchUserButton": "사용자 전환",
"settingsLink": "설정",
"aboutButton": "정보",
"themeLabel": "테마",
"editProfileModalTitle": "프로필 수정"
},
"PasswordEntryForm": {
"notYouButton": "당신이 아닙니까?",
"passwordLabel": "비밀번호",
"passwordPlaceholder": "비밀번호를 입력하세요",
"loginErrorToastTitle": "오류",
"loginFailedErrorToastDescription": "로그인 실패",
"cancelButton": "취소",
"loginButton": "로그인"
},
"CompletionCountBadge": {
"countCompleted": "{completedCount}/{totalCount} 완료됨"
},
"SettingsPage": {
"title": "설정",
"uiSettingsTitle": "UI 설정",
"numberFormattingLabel": "숫자 형식 지정",
"numberFormattingDescription": "큰 숫자 형식 지정 (예: 1K, 1M, 1B)",
"numberGroupingLabel": "숫자 그룹화",
"numberGroupingDescription": "천 단위 구분 기호 사용 (예: 1,000 vs 1000)",
"systemSettingsTitle": "시스템 설정",
"timezoneLabel": "시간대",
"timezoneDescription": "정확한 날짜 추적을 위해 시간대를 선택하세요",
"weekStartDayLabel": "주 시작 요일",
"weekStartDayDescription": "선호하는 주의 첫째 날을 선택하세요",
"weekdays": {
"sunday": "일요일",
"monday": "월요일",
"tuesday": "화요일",
"wednesday": "수요일",
"thursday": "목요일",
"friday": "금요일",
"saturday": "토요일"
},
"autoBackupLabel": "자동 백업",
"autoBackupTooltip": "활성화하면 애플리케이션 데이터(습관, 코인, 설정 등)가 서버 시간으로 매일 새벽 2시경에 자동으로 백업됩니다. 백업은 프로젝트 루트의 `backups/` 디렉터리에 ZIP 파일로 저장됩니다. 최근 7개의 백업만 보관되며, 오래된 백업은 자동으로 삭제됩니다.",
"autoBackupDescription": "매일 데이터 자동 백업",
"languageLabel": "언어",
"languageDescription": "애플리케이션의 표시 언어를 선택하세요.",
"languageChangedTitle": "언어 변경됨",
"languageChangedDescription": "변경 사항을 보려면 페이지를 새로고침하세요",
"languageDisabledInDemoTooltip": "데모 버전에서는 언어 변경이 비활성화됩니다."
},
"Common": {
"authenticationRequiredTitle": "인증 필요",
"authenticationRequiredDescription": "계속하려면 로그인하세요.",
"permissionDeniedTitle": "권한 거부됨",
"permissionDeniedDescription": "{resource}에 대한 {action} 권한이 없습니다.",
"undoButton": "실행 취소",
"redoButton": "다시 실행",
"errorTitle": "오류"
},
"useHabits": {
"alreadyCompletedTitle": "이미 완료됨",
"alreadyCompletedDescription": "오늘 이미 이 습관을 완료했습니다.",
"completedTitle": "완료!",
"earnedCoinsDescription": "{coinReward} 코인을 획득했습니다.",
"progressTitle": "진행 중!",
"progressDescription": "오늘 {count}/{target}회 완료했습니다.",
"completionUndoneTitle": "완료 취소됨",
"completionUndoneDescription": "오늘 {count}/{target}회 완료했습니다.",
"noCompletionsToUndoTitle": "실행 취소할 완료 내역 없음",
"noCompletionsToUndoDescription": "이 습관은 오늘 완료되지 않았습니다.",
"alreadyCompletedPastDateTitle": "이미 완료됨",
"alreadyCompletedPastDateDescription": "이 습관은 {dateKey}에 이미 완료되었습니다.",
"earnedCoinsPastDateDescription": "{dateKey}에 {coinReward} 코인을 획득했습니다.",
"progressPastDateDescription": "{dateKey}에 {count}/{target}회 완료했습니다."
},
"useWishlist": {
"redemptionLimitReachedTitle": "교환 한도 도달",
"redemptionLimitReachedDescription": "\"{itemName}\"에 대한 최대 교환 횟수에 도달했습니다.",
"rewardRedeemedTitle": "🎉 보상 교환됨!",
"rewardRedeemedDescription": "보상 \"{itemName}\"을(를) {itemCoinCost} 코인으로 교환했습니다.",
"notEnoughCoinsTitle": "코인 부족",
"notEnoughCoinsDescription": "이 보상을 교환하려면 {coinsNeeded} 코인이 더 필요합니다."
},
"useCoins": {
"addedCoinsDescription": "{amount} 코인 추가됨",
"invalidAmountTitle": "유효하지 않은 금액",
"invalidAmountDescription": "유효한 양의 숫자를 입력하세요",
"successTitle": "성공",
"transactionNotFoundDescription": "거래를 찾을 수 없습니다",
"maxAmountExceededDescription": "금액은 {max}을(를) 초과할 수 없습니다.",
"transactionNotFoundDescription": "거래를 찾을 수 없습니다",
"maxAmountExceededDescription": "금액은 {max}을(를) 초과할 수 없습니다."
},
"Warning": {
"areYouSure": "확실합니까?",
"cancel": "취소"
}
}

View File

@@ -1,6 +1,6 @@
{
"name": "habittrove",
"version": "0.2.23",
"version": "0.2.24",
"private": true,
"scripts": {
"dev": "next dev --turbopack",