diff --git a/.gitignore b/.gitignore
index ec60210..db92f0f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -46,5 +46,6 @@ next-env.d.ts
Budfile
certificates
/backups/*
+CLAUDE.md
CHANGELOG.md.tmp
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 4ca152f..89b9e3d 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,11 @@
# Changelog
+## Version 0.2.24
+
+### Added
+
+* ๐ Added Korean language support (ํ๊ตญ์ด)
+
## Version 0.2.23
### Fixed
diff --git a/README.md b/README.md
index 0aa3aca..9f4958e 100644
--- a/README.md
+++ b/README.md
@@ -27,7 +27,7 @@ Differences (as of writing) are:
- ๐ฐ 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
diff --git a/app/settings/page.tsx b/app/settings/page.tsx
index d45e348..af9bd98 100644
--- a/app/settings/page.tsx
+++ b/app/settings/page.tsx
@@ -231,6 +231,7 @@ export default function SettingsPage() {
+
diff --git a/messages/ko.json b/messages/ko.json
new file mode 100644
index 0000000..987ac5b
--- /dev/null
+++ b/messages/ko.json
@@ -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": "์ทจ์"
+ }
+}
\ No newline at end of file
diff --git a/package.json b/package.json
index 4322f4f..03ae429 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "habittrove",
- "version": "0.2.23",
+ "version": "0.2.24",
"private": true,
"scripts": {
"dev": "next dev --turbopack",