fix: resolve Prisma 6 CLI effect dependency in Docker runner and polish Korean/Japanese translations
Build and Push Docker Image / build-and-push (push) Successful in 9m21s

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