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 03232b7..bf7e777 100644 --- a/README.md +++ b/README.md @@ -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 diff --git a/app/settings/page.tsx b/app/settings/page.tsx index 7f9c529..96892fb 100644 --- a/app/settings/page.tsx +++ b/app/settings/page.tsx @@ -233,6 +233,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 276df73..d163877 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",