diff --git a/.cline-context.md b/.cline-context.md index 4e0e0c4..4b0f2ef 100644 --- a/.cline-context.md +++ b/.cline-context.md @@ -23,9 +23,8 @@ - Standardized all synchronization terminology from brand-specific references to open standards and Android/Apple cross-platform guidelines. - Implemented full-fidelity standard Task Export pair (`/api/export`) supporting RFC 4180 / TickTick-compatible CSV with UTF-8 BOM, and RFC 5545 iCalendar (`.ics` VTODO) format. - Added Export modal in Sidebar user popover menu supporting format selection, target list filtering, completed tasks inclusion toggle, and seamless Demo mode client-side Blob generation. - - Added localized i18n strings for Export across English, Korean, and Japanese. - - Configured production multi-stage `Dockerfile` with standalone Next.js runner, Prisma CLI migrations support, and automated `docker-entrypoint.sh` startup script. - - Added `.dockerignore` for minimal context transfer and fast build times. + - Refined Korean and Japanese localization dictionaries across all keys for natural, polished phrasing and terminology consistency. + - Fixed Docker container runtime Prisma migration dependencies by adding `effect` and ensuring full `node_modules` availability in the production runner stage of `Dockerfile` for seamless entrypoint `prisma migrate deploy`. - Refined `docker-compose.yml` and `.env.example` to support standalone 2-file deployment (`docker-compose.yml` + `.env`) without cloning source code, public registry images (`CHECKFLOW_IMAGE`), Watchtower auto-updating labels, and automated database migrations. - Automated Gitea Actions CI workflow (`.gitea/workflows/docker-build.yaml`) for building & pushing container images to Gitea Container Registry with lowercase repository name normalization (`env.REPO`) and OCI source labels (`org.opencontainers.image.source`) for automatic repository package linkage. - Completely revamped `README.md` to reflect universal 2-file Docker deployment for general users, Watchtower auto-update, architecture, and open-standard CalDAV sync guidelines. diff --git a/Dockerfile b/Dockerfile index 6d37cb7..0f2f261 100644 --- a/Dockerfile +++ b/Dockerfile @@ -27,9 +27,8 @@ COPY --from=builder --chown=nextjs:nodejs /app/public ./public COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./ COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static COPY --from=builder --chown=nextjs:nodejs /app/prisma ./prisma +COPY --from=deps --chown=nextjs:nodejs /app/node_modules ./node_modules COPY --from=builder --chown=nextjs:nodejs /app/node_modules/.prisma ./node_modules/.prisma -COPY --from=builder --chown=nextjs:nodejs /app/node_modules/@prisma ./node_modules/@prisma -COPY --from=builder --chown=nextjs:nodejs /app/node_modules/prisma ./node_modules/prisma COPY --from=builder --chown=nextjs:nodejs /app/package.json ./package.json COPY --chown=nextjs:nodejs docker-entrypoint.sh ./docker-entrypoint.sh diff --git a/package-lock.json b/package-lock.json index 2f17e10..c216a46 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "checkflow", - "version": "0.1.0", + "version": "0.5.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "checkflow", - "version": "0.1.0", + "version": "0.5.0", "dependencies": { "@dnd-kit/core": "^6.3.1", "@dnd-kit/sortable": "^10.0.0", @@ -16,6 +16,7 @@ "bcryptjs": "^3.0.3", "csv-parse": "^7.0.2", "dompurify": "^3.4.14", + "effect": "^3.22.1", "marked": "^18.0.10", "next": "16.3.1", "next-auth": "^4.24.15", @@ -1345,6 +1346,15 @@ "empathic": "2.0.0" } }, + "node_modules/@prisma/config/node_modules/effect": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/effect/-/effect-3.21.0.tgz", + "integrity": "sha512-PPN80qRokCd1f015IANNhrwOnLO7GrrMQfk4/lnZRE/8j7UPWrNNjPV0uBrZutI/nHzernbW+J0hdqQysHiSnQ==", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "fast-check": "^3.23.1" + } + }, "node_modules/@prisma/debug": { "version": "6.19.3", "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-6.19.3.tgz", @@ -3223,9 +3233,9 @@ } }, "node_modules/effect": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/effect/-/effect-3.21.0.tgz", - "integrity": "sha512-PPN80qRokCd1f015IANNhrwOnLO7GrrMQfk4/lnZRE/8j7UPWrNNjPV0uBrZutI/nHzernbW+J0hdqQysHiSnQ==", + "version": "3.22.1", + "resolved": "https://registry.npmjs.org/effect/-/effect-3.22.1.tgz", + "integrity": "sha512-TNoXushmPOBAjJlthF5d2QwnX2xBPEtcNJr5XKNKbRLbDvBcOYkXlYDfvGfSA0zriwLFuCll5MDtNMAdZL17PQ==", "dependencies": { "@standard-schema/spec": "^1.0.0", "fast-check": "^3.23.1" diff --git a/package.json b/package.json index 45ab178..35f50a0 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "bcryptjs": "^3.0.3", "csv-parse": "^7.0.2", "dompurify": "^3.4.14", + "effect": "^3.22.1", "marked": "^18.0.10", "next": "16.3.1", "next-auth": "^4.24.15", diff --git a/src/lib/i18n/index.tsx b/src/lib/i18n/index.tsx index 007abfc..4cf8d17 100644 --- a/src/lib/i18n/index.tsx +++ b/src/lib/i18n/index.tsx @@ -7,7 +7,7 @@ export const translations = { en: { // Auth appName: "CheckFlow", - tagline: "Your Personal Todo", + tagline: "Your Personal Todo & Markdown Workspace", welcomeBack: "Welcome back", signInSubtitle: "Sign in to your account", createAccount: "Create account", @@ -66,7 +66,7 @@ export const translations = { settingsModalTitle: "Settings", profile: "Profile", preferences: "Preferences", - syncIntegrations: "Integrations (DAVx⁵)", + syncIntegrations: "Integrations (CalDAV)", admin: "Admin", trashRetention: "Trash Retention Period", trashRetentionHint: "Deleted tasks will be permanently removed after the specified period.", @@ -187,155 +187,155 @@ export const translations = { ko: { // Auth appName: "CheckFlow", - tagline: "나만의 할 일 관리, 심플하게", - welcomeBack: "다시 돌아오셨네요 👋", - signInSubtitle: "이메일로 로그인해주세요", - createAccount: "새 계정 만들기", - createAccountSubtitle: "오늘부터 할 일을 깔끔하게 정리해볼까요?", - displayName: "이름 (닉네임)", - email: "이메일", + tagline: "나만의 스마트 할 일 & 마크다운 워크스페이스", + welcomeBack: "다시 오신 것을 환영합니다 👋", + signInSubtitle: "이메일 계정으로 로그인하세요", + createAccount: "새 계정 생성", + createAccountSubtitle: "CheckFlow에서 효율적인 할 일 관리를 시작하세요", + displayName: "사용자 이름", + email: "이메일 주소", password: "비밀번호", - min8Chars: "8자 이상 입력해주세요", + min8Chars: "8자 이상 입력", signIn: "로그인", - signingIn: "로그인 중이에요...", - createBtn: "계정 만들기", - creatingBtn: "계정 만드는 중...", + signingIn: "로그인 중...", + createBtn: "계정 생성", + creatingBtn: "계정 생성 중...", alreadyHaveAccount: "이미 계정이 있으신가요?", dontHaveAccount: "아직 계정이 없으신가요?", - tryDemoMode: "로그인 없이 체험해보기", - demoBadge: "체험 중", + tryDemoMode: "체험 모드로 둘러보기 (DB 불필요)", + demoBadge: "체험 모드", signOut: "로그아웃", // Sidebar lists: "목록", newList: "새 목록", - listNamePlaceholder: "목록 이름을 입력해주세요", - create: "만들기", + listNamePlaceholder: "목록 이름 입력", + create: "생성", cancel: "취소", save: "저장", - deleteListConfirm: "이 목록을 삭제할까요? 안에 있는 할 일도 모두 사라져요.", - undoDelete: "되돌리기", - listDeleted: "목록이 삭제됐어요", + deleteListConfirm: "이 목록을 삭제하시겠습니까? 포함된 모든 할 일도 함께 삭제됩니다.", + undoDelete: "실행 취소", + listDeleted: "목록이 삭제되었습니다", importTasks: "가져오기", importModalTitle: "할 일 가져오기", - targetList: "가져올 목록 선택", + targetList: "가져올 대상 목록", fileSelectLabel: "파일 선택 (TickTick CSV 또는 ICS)", - tickTickExportHint: "TickTick: 설정 → 데이터 내보내기 → CSV 또는 iCalendar", + tickTickExportHint: "TickTick: 설정 → 데이터 내보내기 → CSV 또는 iCalendar 선택", importBtn: "가져오기", - importing: "가져오는 중이에요...", + importing: "가져오는 중...", exportTasks: "내보내기", exportModalTitle: "할 일 내보내기", exportFormat: "내보내기 형식", - exportScope: "내보낼 목록", + exportScope: "내보낼 대상 목록", allLists: "모든 목록 (전체 할 일)", includeCompleted: "완료된 항목 포함", exportBtn: "내보내기 및 다운로드", - exportSuccess: "할 일을 성공적으로 내보냈어요!", + exportSuccess: "할 일을 성공적으로 내보냈습니다!", theme: "테마", - themeSystem: "시스템", - themeLight: "라이트", - themeDark: "다크", - language: "언어", + themeSystem: "시스템 설정 동기화", + themeLight: "라이트 모드", + themeDark: "다크 모드", + language: "언어 (Language)", tags: "태그", trash: "휴지통", emptyTrash: "휴지통 비우기", - searchPlaceholder: "검색...", - searchExpandedPlaceholder: "할 일, 메모, 태그 무엇이든 검색해보세요 (Ctrl+K)...", + searchPlaceholder: "할 일, 메모, 태그 검색...", + searchExpandedPlaceholder: "할 일, 메모, 태그 전체 검색 (Ctrl+K)...", // Settings Modal - settingsModalTitle: "설정", + settingsModalTitle: "환경설정", profile: "프로필", - preferences: "환경설정", + preferences: "개인화 설정", syncIntegrations: "외부 연동 (CalDAV)", - admin: "관리자", - trashRetention: "휴지통 자동 비우기", - trashRetentionHint: "설정한 기간이 지나면 휴지통이 자동으로 비워져요.", - days7: "7일 후 자동 삭제", - days14: "14일 후 자동 삭제", - days30: "30일 후 자동 삭제 (권장)", - neverDelete: "자동 삭제 안 함", + admin: "관리자 설정", + trashRetention: "휴지통 자동 보관 기간", + trashRetentionHint: "지정한 보관 기간이 경과한 삭제 항목은 자동으로 영구 삭제됩니다.", + days7: "7일 후 영구 삭제", + days14: "14일 후 영구 삭제", + days30: "30일 후 영구 삭제 (권장)", + neverDelete: "자동 삭제 안 함 (수동 삭제)", // CalDAV & Sync - syncTitle: "CalDAV 모바일 및 외부 동기화 (Android / Apple)", - syncDesc: "안드로이드(DAVx⁵, Tasks), 애플 미리알림, Thunderbird 등 CalDAV 표준을 지원하는 모든 기기 및 앱과 실시간 양방향으로 동기화됩니다.", - syncBaseUrl: "CalDAV 기본 주소 (Base URL)", + syncTitle: "CalDAV 모바일 및 외부 앱 동기화", + syncDesc: "Android(DAVx⁵, Tasks.org), Apple 미리알림, Thunderbird 등 표준 CalDAV를 지원하는 모든 기기 및 앱과 실시간 양방향으로 동기화됩니다.", + syncBaseUrl: "CalDAV 기본 엔드포인트 URL", syncCopyUrl: "URL 복사", syncCopied: "복사 완료!", syncDownloadIcs: ".ICS 피드 다운로드", - syncTestConnection: "엔드포인트 점검", - syncTesting: "점검 중...", + syncTestConnection: "연결 테스트", + syncTesting: "연결 확인 중...", syncTestSuccess: "✓ CalDAV 엔드포인트가 정상적으로 응답합니다 (200 OK)", - syncTabAndroid: "안드로이드 (DAVx⁵)", - syncTabApple: "애플 미리알림 (iOS / macOS)", - syncTabThunderbird: "Thunderbird (PC)", - syncAndroidStep1: "구글 플레이 스토어 또는 F-Droid에서 'DAVx⁵' 앱을 설치합니다.", + syncTabAndroid: "Android (DAVx⁵)", + syncTabApple: "Apple 미리알림 (iOS / macOS)", + syncTabThunderbird: "Thunderbird (Desktop)", + syncAndroidStep1: "Google Play Store 또는 F-Droid에서 'DAVx⁵' 앱을 설치합니다.", syncAndroidStep2: "DAVx⁵ 실행 → 계정 추가(+) → 'URL 및 사용자 이름으로 로그인'을 선택합니다.", - syncAndroidStep3: "위 기본 주소를 붙여넣고, CheckFlow 로그인 이메일과 비밀번호를 입력합니다.", - syncAndroidStep4: "'VTODO (할 일)'을 켜면 안드로이드 할 일 앱(Tasks.org, OpenTasks 등)과 실시간 동기화됩니다.", - syncAppleStep1: "기기 설정 → 미리알림(또는 캘린더) → 계정 → '계정 추가'를 탭합니다.", - syncAppleStep2: "'기타' 선택 → 'CalDAV 계정 추가'를 누릅니다.", - syncAppleStep3: "서버에 위 주소를 입력하고, 사용자 이름/비밀번호에 CheckFlow 계정 정보를 입력합니다.", - syncAppleStep4: "'미리알림' 항목을 활성화하고 저장합니다.", - syncThunderbirdStep1: "Thunderbird 실행 → 캘린더 탭으로 이동 → '새 캘린더'를 클릭합니다.", + syncAndroidStep3: "위 기본 URL을 입력하고, CheckFlow 계정 이메일과 비밀번호를 입력합니다.", + syncAndroidStep4: "'VTODO (할 일)' 컬렉션을 활성화하면 Tasks.org 또는 OpenTasks 앱과 실시간 동기화됩니다.", + syncAppleStep1: "기기 설정 → 미리알림 → 계정 → '계정 추가'를 선택합니다.", + syncAppleStep2: "'기타' 선택 → 'CalDAV 계정 추가'를 선택합니다.", + syncAppleStep3: "서버 주소에 위 URL을 입력하고, 사용자 이름/비밀번호에 CheckFlow 계정 정보를 입력합니다.", + syncAppleStep4: "'미리알림' 항목을 활성화하고 저장을 누릅니다.", + syncThunderbirdStep1: "Thunderbird 실행 → 캘린더 탭으로 이동 → '새 캘린더'를 선택합니다.", syncThunderbirdStep2: "'네트워크에 저장' 선택 → 형식: 'CalDAV'를 선택합니다.", - syncThunderbirdStep3: "위치에 위 기본 주소를 붙여넣고, 사용자 이름에 CheckFlow 이메일을 입력합니다.", - syncThunderbirdStep4: "인증 팝업이 뜨면 비밀번호를 입력하여 완료합니다.", + syncThunderbirdStep3: "위치에 위 기본 URL을 입력하고, 사용자 이름에 CheckFlow 계정 이메일을 입력합니다.", + syncThunderbirdStep4: "인증 대화상자가 표시되면 비밀번호를 입력하여 완료합니다.", // Task List tasks: "할 일", - hideDone: "완료 숨기기", - showDone: "완료 보기", - completedSection: "완료한 항목", - addTaskPlaceholder: "할 일을 추가해보세요...", + hideDone: "완료 항목 숨기기", + showDone: "완료 항목 표시", + completedSection: "완료된 항목", + addTaskPlaceholder: "새 할 일 추가...", add: "추가", - noTasksYet: "아직 할 일이 없어요. 아래에서 추가해볼까요? 😊", - selectListToStart: "왼쪽에서 목록을 선택해주세요", + noTasksYet: "등록된 할 일이 없습니다. 새로운 할 일을 추가해보세요!", + selectListToStart: "목록을 선택하여 할 일을 확인하세요", loading: "불러오는 중...", today: "오늘", tomorrow: "내일", // Task Detail - taskTitlePlaceholder: "할 일 제목을 입력하세요", + taskTitlePlaceholder: "할 일 제목", priority: "우선순위", - priorityNone: "없음", + priorityNone: "지정 안 함", priorityLow: "낮음", priorityMedium: "보통", priorityHigh: "높음", dueDate: "마감일", - clear: "지우기", + clear: "초기화", notes: "메모", - notesPlaceholder: "여기에 자유롭게 메모하세요…\n\n마크다운도 쓸 수 있어요: **굵게**, *기울임*, # 제목, - 리스트, - [ ] 체크박스", - subtasks: "하위 할 일", - addSubtaskPlaceholder: "하위 할 일 추가…", - deleteTaskConfirm: "이 할 일을 삭제할까요?", - autoSaved: "자동 저장됨", + notesPlaceholder: "자유롭게 메모를 작성하세요…\n\n마크다운 문법 지원: **굵게**, *기울임*, # 제목, - 목록, - [ ] 체크박스 등", + subtasks: "하위 작업", + addSubtaskPlaceholder: "하위 작업 추가…", + deleteTaskConfirm: "이 할 일을 삭제하시겠습니까?", + autoSaved: "자동 저장 완료", saving: "저장 중…", - created: "만든 날", - edited: "수정한 날", + created: "생성 일시", + edited: "수정 일시", // Toolbars bold: "굵게", italic: "기울임", heading: "제목", - bulletList: "글머리 기호", - numberedList: "번호 매기기", + bulletList: "글머리 기호 목록", + numberedList: "번호 매기기 목록", checkbox: "체크박스", code: "코드 블록", // TickTick Mode Switcher & Quick Add - textMode: "텍스트 메모 모드", + textMode: "마크다운 메모 모드", subtaskMode: "체크리스트 모드", switchToTextMode: "마크다운 메모 모드로 전환", - switchToSubtaskMode: "체크리스트 모드로 전환", + switchToSubtaskMode: "하위 체크리스트 모드로 전환", moveToList: "다른 목록으로 이동", quickAdd: "빠른 추가", quickToday: "오늘", quickTomorrow: "내일", quickNextWeek: "다음 주", - selectDate: "날짜", - selectPriority: "우선순위", - selectTag: "태그", - copied: "복사했어요!", + selectDate: "마감일 지정", + selectPriority: "우선순위 지정", + selectTag: "태그 지정", + copied: "복사 완료!", // Context Menu editTask: "수정", @@ -344,180 +344,180 @@ export const translations = { deleteTask: "삭제", renameList: "이름 변경", deleteList: "목록 삭제", - taskUndoHint: "삭제했어요. 되돌릴 수 있어요.", - listUndoHint: "목록이 삭제됐어요. 되돌릴 수 있어요.", + taskUndoHint: "삭제되었습니다. 클릭하여 되돌리기", + listUndoHint: "목록이 삭제되었습니다. 클릭하여 되돌리기", // Labs, Kanban & Customization - labs: "실험실 🧪", - labsDesc: "아직 정식 출시 전인 기능들이에요. 원하는 걸 골라서 켜보세요!", + labs: "실험실 (Labs)", + labsDesc: "실험적인 기능들을 개별적으로 활성화하거나 비활성화할 수 있습니다.", kanbanView: "칸반 보드", - listView: "리스트", + listView: "리스트 뷰", enableKanban: "칸반 보드 뷰", - enableKanbanDesc: "할 일을 보드 형태로 볼 수 있어요 (할 일 / 진행 중 / 완료).", - swapBlocks: "순서 바꾸기", - resetDefaults: "기본값으로 되돌리기", - resetConfirm: "모든 커스텀 설정을 기본값으로 되돌릴까요?", + enableKanbanDesc: "할 일을 3컬럼 보드(할 일 / 진행 중 / 완료) 형태로 전환하여 관리합니다.", + swapBlocks: "상하 블록 위치 변경", + resetDefaults: "기본값으로 복원", + resetConfirm: "모든 UI 커스텀 설정을 초기 기본값으로 복원하시겠습니까?", todoCol: "할 일", inProgressCol: "진행 중", doneCol: "완료", - accessRestricted: "접근 권한 없음", - adminRequired: "이 페이지는 관리자만 볼 수 있어요.", + accessRestricted: "접근 권한 제한", + adminRequired: "이 관리 콘솔은 ADMIN 권한이 필요합니다.", }, ja: { // Auth appName: "CheckFlow", - tagline: "シンプルに、毎日のタスクを", - welcomeBack: "おかえりなさい 👋", + tagline: "シンプルで洗練されたパーソナルタスク管理", + welcomeBack: "お帰りなさい 👋", signInSubtitle: "メールアドレスでサインインしてください", - createAccount: "アカウントを作成", - createAccountSubtitle: "さあ、今日からタスクを整理しましょう!", - displayName: "お名前", + createAccount: "アカウント新規登録", + createAccountSubtitle: "CheckFlowでタスクの整理を始めましょう", + displayName: "表示名", email: "メールアドレス", password: "パスワード", - min8Chars: "8文字以上で入力してください", + min8Chars: "8文字以上", signIn: "サインイン", signingIn: "サインイン中...", - createBtn: "アカウントを作成する", - creatingBtn: "作成中...", + createBtn: "アカウントを作成", + creatingBtn: "アカウント作成中...", alreadyHaveAccount: "すでにアカウントをお持ちですか?", dontHaveAccount: "アカウントをお持ちでないですか?", - tryDemoMode: "ログインなしで試してみる", - demoBadge: "体験中", + tryDemoMode: "体験モードで試す(DB不要)", + demoBadge: "体験モード", signOut: "サインアウト", // Sidebar lists: "リスト", - newList: "新しいリスト", - listNamePlaceholder: "リスト名を入力してください", - create: "作成する", + newList: "新規リスト", + listNamePlaceholder: "リスト名を入力", + create: "作成", cancel: "キャンセル", save: "保存", - deleteListConfirm: "このリストを削除しますか?中のタスクもすべて消えます。", + deleteListConfirm: "このリストを削除しますか?含まれるすべてのタスクも削除されます。", undoDelete: "元に戻す", listDeleted: "リストを削除しました", importTasks: "インポート", - importModalTitle: "タスクをインポート", - targetList: "インポート先のリスト", - fileSelectLabel: "ファイルを選択(TickTick CSV または ICS)", - tickTickExportHint: "TickTick: 設定 → エクスポート → CSV または iCalendar", - importBtn: "インポートする", + importModalTitle: "タスクのインポート", + targetList: "インポート先リスト", + fileSelectLabel: "ファイル選択 (TickTick CSV / ICS)", + tickTickExportHint: "TickTick: 設定 → データのエクスポート → CSVまたはiCalendar", + importBtn: "インポート", importing: "インポート中...", exportTasks: "エクスポート", - exportModalTitle: "タスクをエクスポート", + exportModalTitle: "タスクのエクスポート", exportFormat: "エクスポート形式", exportScope: "対象リスト", - allLists: "すべてのリスト(全体)", + allLists: "すべてのリスト (全体)", includeCompleted: "完了したタスクを含める", - exportBtn: "エクスポートして保存", - exportSuccess: "タスクをエクスポートしました!", + exportBtn: "エクスポートしてダウンロード", + exportSuccess: "タスクを正常にエクスポートしました!", theme: "テーマ", - themeSystem: "システム", - themeLight: "ライト", - themeDark: "ダーク", - language: "言語", + themeSystem: "システム設定に同期", + themeLight: "ライトモード", + themeDark: "ダークモード", + language: "言語 (Language)", tags: "タグ", trash: "ゴミ箱", emptyTrash: "ゴミ箱を空にする", - searchPlaceholder: "検索...", - searchExpandedPlaceholder: "タスク、メモ、タグなど何でも検索できます (Ctrl+K)...", + searchPlaceholder: "タスク、メモ、タグを検索...", + searchExpandedPlaceholder: "タスク、メモ、タグをすべて検索 (Ctrl+K)...", // Settings Modal - settingsModalTitle: "設定", + settingsModalTitle: "環境設定", profile: "プロフィール", - preferences: "環境設定", + preferences: "カスタマイズ設定", syncIntegrations: "外部連携 (CalDAV)", - admin: "管理者", - trashRetention: "ゴミ箱の自動削除", - trashRetentionHint: "設定した期間が過ぎると、ゴミ箱が自動的に空になります。", - days7: "7日後に自動削除", - days14: "14日後に自動削除", - days30: "30日後に自動削除(推奨)", - neverDelete: "自動削除しない", + admin: "管理者設定", + trashRetention: "ゴミ箱の自動保持期間", + trashRetentionHint: "指定した期間が経過した削除済みタスクは自動的に完全に削除されます。", + days7: "7日後に完全削除", + days14: "14日後に完全削除", + days30: "30日後に完全削除 (推奨)", + neverDelete: "自動削除しない (手動削除のみ)", // CalDAV & Sync - syncTitle: "CalDAV & 外部同期 (Android / Apple)", - syncDesc: "Android (DAVx⁵, Tasks)、Apple リマインダー、Thunderbird など CalDAV 対応アプリと双方向同期できます。", + syncTitle: "CalDAV モバイルおよび外部アプリ同期", + syncDesc: "Android (DAVx⁵, Tasks.org)、Apple リマインダー、Thunderbird など標準 CalDAV をサポートする各種端末やアプリと双方向同期できます。", syncBaseUrl: "CalDAV サーバー基本 URL", - syncCopyUrl: "URL をコピー", - syncCopied: "コピーしました!", + syncCopyUrl: "URLをコピー", + syncCopied: "コピー完了!", syncDownloadIcs: ".ICS フィードをダウンロード", syncTestConnection: "接続テスト", syncTesting: "テスト中...", syncTestSuccess: "✓ CalDAV エンドポイントは正常に応答しています (200 OK)", syncTabAndroid: "Android (DAVx⁵)", syncTabApple: "Apple リマインダー (iOS / macOS)", - syncTabThunderbird: "Thunderbird (PC)", + syncTabThunderbird: "Thunderbird (Desktop)", syncAndroidStep1: "Google Play または F-Droid から「DAVx⁵」アプリをインストールします。", - syncAndroidStep2: "DAVx⁵ を起動 → アカウント追加 →「URL とユーザー名でログイン」を選択します。", - syncAndroidStep3: "上記の基本 URL を貼り付け、CheckFlow のメールアドレスとパスワードを入力します。", - syncAndroidStep4: "「VTODO (タスク)」を有効にすると、Android Tasks や OpenTasks と連携されます。", - syncAppleStep1: "設定 → リマインダー → アカウント →「アカウントを追加」を開きます。", + syncAndroidStep2: "DAVx⁵ を起動 → アカウント追加(+) →「URL とユーザー名でログイン」を選択します。", + syncAndroidStep3: "上記の基本 URL を入力し、CheckFlow のログインメールアドレスとパスワードを入力します。", + syncAndroidStep4: "「VTODO (タスク)」コレクションを有効にすると、Tasks.org や OpenTasks と双方向同期されます。", + syncAppleStep1: "端末の設定 → リマインダー → アカウント →「アカウントを追加」を開きます。", syncAppleStep2: "「その他」を選択 →「CalDAV アカウントを追加」を選択します。", - syncAppleStep3: "サーバーに上記の URL、ユーザー名/パスワードに CheckFlow のアカウント情報を入力します。", - syncAppleStep4: "「リマインダー」を有効にして保存します。", - syncThunderbirdStep1: "Thunderbird を起動 → カレンダータブ → 新しいカレンダーを作成します。", - syncThunderbirdStep2: "「ネットワーク上」を選択 → 形式: CalDAV を選択します。", - syncThunderbirdStep3: "場所に上記の URL、ユーザー名に CheckFlow のメールアドレスを入力します。", - syncThunderbirdStep4: "ログイン画面でパスワードを入力して完了します。", + syncAppleStep3: "サーバーに上記の URL、ユーザー名とパスワードに CheckFlow のアカウント情報を入力します。", + syncAppleStep4: "「リマインダー」をオンにして保存します。", + syncThunderbirdStep1: "Thunderbird を起動 → カレンダータブ →「新しいカレンダー」を作成します。", + syncThunderbirdStep2: "「ネットワーク上」を選択 → 形式:「CalDAV」を選択します。", + syncThunderbirdStep3: "場所に上記の基本 URL、ユーザー名に CheckFlow のメールアドレスを入力します。", + syncThunderbirdStep4: "認証ダイアログでパスワードを入力して設定を完了します。", // Task List tasks: "タスク", - hideDone: "完了を非表示", - showDone: "完了を表示", - completedSection: "完了済み", - addTaskPlaceholder: "タスクを追加してみましょう...", + hideDone: "完了済みを非表示", + showDone: "完了済みを表示", + completedSection: "完了したタスク", + addTaskPlaceholder: "新しいタスクを入力...", add: "追加", - noTasksYet: "まだタスクがありません。下から追加してみてください 😊", - selectListToStart: "左側からリストを選んでください", + noTasksYet: "タスクがありません。下から新しいタスクを追加してみましょう!", + selectListToStart: "リストを選択してタスクを表示してください", loading: "読み込み中...", today: "今日", tomorrow: "明日", // Task Detail - taskTitlePlaceholder: "タスク名を入力してください", + taskTitlePlaceholder: "タスク名", priority: "優先度", - priorityNone: "なし", - priorityLow: "低め", - priorityMedium: "普通", - priorityHigh: "高め", - dueDate: "期限", + priorityNone: "指定なし", + priorityLow: "低", + priorityMedium: "中", + priorityHigh: "高", + dueDate: "期日", clear: "クリア", notes: "メモ", - notesPlaceholder: "ここに自由にメモしてください…\n\nMarkdownも使えます: **太字**, *斜体*, # 見出し, - リスト, - [ ] チェックボックス", + notesPlaceholder: "自由にメモを記入してください…\n\nMarkdown対応: **太字**, *斜体*, # 見出し, - リスト, - [ ] チェックボックス", subtasks: "サブタスク", addSubtaskPlaceholder: "サブタスクを追加…", deleteTaskConfirm: "このタスクを削除しますか?", - autoSaved: "自動保存しました", + autoSaved: "自動保存済み", saving: "保存中…", - created: "作成日", - edited: "更新日", + created: "作成日時", + edited: "更新日時", // Toolbars bold: "太字", italic: "斜体", heading: "見出し", - bulletList: "箇条書き", + bulletList: "箇条書きリスト", numberedList: "番号付きリスト", checkbox: "チェックボックス", code: "コードブロック", // TickTick Mode Switcher & Quick Add - textMode: "テキストメモ", - subtaskMode: "チェックリスト", - switchToTextMode: "Markdownメモに切り替え", - switchToSubtaskMode: "チェックリストに切り替え", + textMode: "Markdownメモモード", + subtaskMode: "チェックリストモード", + switchToTextMode: "Markdownメモモードに切り替え", + switchToSubtaskMode: "チェックリストモードに切り替え", moveToList: "別のリストに移動", quickAdd: "クイック追加", quickToday: "今日", quickTomorrow: "明日", quickNextWeek: "来週", - selectDate: "日付", - selectPriority: "優先度", - selectTag: "タグ", - copied: "コピーしました!", - accessRestricted: "アクセス制限", - adminRequired: "このページは管理者のみ閲覧できます。", + selectDate: "期日設定", + selectPriority: "優先度設定", + selectTag: "タグ設定", + copied: "コピー完了!", + accessRestricted: "アクセス権限制限", + adminRequired: "この管理コンソールにはADMIN権限が必要です。", // Context Menu editTask: "編集", @@ -526,19 +526,19 @@ export const translations = { deleteTask: "削除", renameList: "名前を変更", deleteList: "リストを削除", - taskUndoHint: "削除しました。元に戻せます。", - listUndoHint: "リストを削除しました。元に戻せます。", + taskUndoHint: "削除しました。クリックして元に戻せます。", + listUndoHint: "リストを削除しました。クリックして元に戻せます。", // Labs, Kanban & Customization - labs: "実験室 🧪", - labsDesc: "まだ正式リリース前の機能です。好きなものを選んでオンにしてみてください!", + labs: "Labs (実験室)", + labsDesc: "開発中の実験的機能を個別に有効化・無効化できます。", kanbanView: "カンバンボード", - listView: "リスト", + listView: "リストビュー", enableKanban: "カンバンボードビュー", - enableKanbanDesc: "タスクをボード形式で表示できます(未着手 / 進行中 / 完了)。", - swapBlocks: "順番を入れ替え", - resetDefaults: "デフォルトに戻す", - resetConfirm: "すべてのカスタム設定をデフォルトに戻しますか?", + enableKanbanDesc: "タスクを3列ボード(未着手 / 進行中 / 完了)形式で管理します。", + swapBlocks: "ブロック配置の入れ替え", + resetDefaults: "初期設定にリセット", + resetConfirm: "すべてのUIカスタマイズを初期デフォルト設定に戻しますか?", todoCol: "未着手", inProgressCol: "進行中", doneCol: "完了", @@ -592,4 +592,4 @@ export function I18nProvider({ children }: { children: React.ReactNode }) { return {children}; } -export const useI18n = () => useContext(I18nContext); \ No newline at end of file +export const useI18n = () => useContext(I18nContext);