288 lines
13 KiB
TypeScript
288 lines
13 KiB
TypeScript
export const app = {
|
|
settings: {
|
|
title: 'Settings',
|
|
focusPreferencesApi: 'Focus Preferences API',
|
|
loading: '저장된 설정을 불러오는 중이에요.',
|
|
saving: '변경 사항을 저장하는 중이에요.',
|
|
synced: '변경 즉시 서버에 저장합니다.',
|
|
reduceMotionTitle: 'Reduce Motion',
|
|
reduceMotionDescription: '전환 애니메이션을 최소화합니다. (UI 토글 목업)',
|
|
notificationIntensityTitle: '알림 강도',
|
|
notificationIntensityDescription: '집중 시작/종료 신호의 존재감을 선택합니다.',
|
|
defaultPresetTitle: '기본 프리셋',
|
|
defaultPresetDescription: '입장 시 자동 선택될 추천 세트를 고릅니다.',
|
|
notificationIntensityOptions: ['조용함', '기본', '강함'],
|
|
defaultPresetOptions: [
|
|
{ id: 'balanced', label: 'Balanced 25/5 + Rain Focus' },
|
|
{ id: 'deep-work', label: 'Deep Work 50/10 + Deep White' },
|
|
{ id: 'gentle', label: 'Gentle 25/5 + Silent' },
|
|
],
|
|
},
|
|
stats: {
|
|
title: 'Weekly Review',
|
|
apiLabel: 'API',
|
|
mockLabel: 'Mock',
|
|
sourceApi: 'API 통계 사용 중',
|
|
sourceMock: 'API 실패로 mock 통계 표시 중',
|
|
loading: '통계를 불러오는 중이에요.',
|
|
loadFailed: '통계를 불러오지 못했어요.',
|
|
synced: '최근 7일 review를 최신 요약으로 동기화합니다.',
|
|
refresh: '새로고침',
|
|
reviewPeriodLabel: '최근 7일 review',
|
|
reviewTitle: '이번 주 집중 리듬',
|
|
reviewSnapshotEmpty: '이번 주에는 아직 집중 기록이 많지 않아요. 다음 세션 하나만 다시 만들면 충분해요.',
|
|
reviewSnapshotStrong: '이번 주에는 시작한 흐름을 끝까지 가져간 편이에요.',
|
|
reviewSnapshotSteady: '이번 주에는 시작은 꾸준했고, 마무리 리듬은 조금 더 다듬을 여지가 있어요.',
|
|
reviewSnapshotRecoveryNeeded: '이번 주에는 시작은 있었지만, 닫힘보다 이월이 더 많았어요.',
|
|
reviewStarted: '시작한 세션',
|
|
reviewStartedHint: '최근 7일 space에 들어간 흐름',
|
|
reviewCompleted: '마무리한 세션',
|
|
reviewCompletedHint: 'goal 또는 timer를 닫은 세션',
|
|
reviewFocusMinutes: '집중 시간',
|
|
reviewFocusMinutesHint: '최근 7일 누적 focus 시간',
|
|
reviewCarriedOver: '이월된 블록',
|
|
reviewCarriedOverHint: '다음 날로 이어진 블록',
|
|
reviewStartTitle: '시작 품질',
|
|
reviewStartEmpty: '아직 시작 기록이 많지 않아요. 다음 주에는 시작 횟수 하나를 더 만드는 것이 우선이에요.',
|
|
reviewStartSummary: (startedSessions: number, bestDayLabel: string, averageDepthLabel: string) =>
|
|
`이번 주엔 ${startedSessions}번 시작했고, ${bestDayLabel}에 가장 길게 이어졌어요. 한 번 시작했을 때 평균 ${averageDepthLabel} 정도 머물렀어요.`,
|
|
reviewAverageDepth: '평균 세션 깊이',
|
|
reviewAverageDepthHint: '한 번 시작했을 때 이어진 평균 시간',
|
|
reviewBestDay: '가장 길게 이어진 날',
|
|
reviewBestDayHint: (minutes: number) => `${minutes}분 동안 가장 오래 집중했어요.`,
|
|
reviewRecoveryTitle: '복귀 품질',
|
|
reviewRecoveryMockSummary: '이번 주에는 pause 뒤에도 다시 올라탄 흐름이 있었어요. 복귀는 적었지만 분명히 존재했어요.',
|
|
reviewRecoveryLimitedSummary: '복귀 패턴은 아직 이 review에 충분히 합쳐지지 않았어요. 지금은 시작과 마무리 흐름을 먼저 봅니다.',
|
|
reviewRecoveryMockNote: 'mock 기준으로 pause 뒤 복귀와 away 뒤 복귀를 함께 보여줍니다.',
|
|
reviewRecoveryLimitedNote: 'pause / away 복귀 집계는 다음 연결 단계에서 이 review에 포함됩니다.',
|
|
reviewPauseRecovery: 'pause 뒤 복귀',
|
|
reviewPauseRecoveryHint: '멈춘 뒤 다시 돌아온 비율',
|
|
reviewAwayRecovery: '자리 비움 뒤 복귀',
|
|
reviewAwayRecoveryHint: '앱을 떠났다가 다시 돌아온 비율',
|
|
reviewCompletionTitle: '마무리 품질',
|
|
reviewCompletionEmpty: '이번 주에는 아직 마무리 흐름을 읽을 만큼 세션이 쌓이지 않았어요.',
|
|
reviewCompletionStrong: '이번 주에는 시작한 세션을 끝까지 가져가는 힘이 비교적 안정적이었어요.',
|
|
reviewCompletionSummary: (completionRate: string, carriedOverCount: number) =>
|
|
`완료율은 ${completionRate}였고, 이월된 블록은 ${carriedOverCount}개였어요. 다음 주에는 닫힘 리듬을 더 분명히 만들 여지가 있어요.`,
|
|
reviewCompletionRate: '완료율',
|
|
reviewCompletionRateHint: '시작한 세션 중 마무리까지 간 비율',
|
|
reviewCarryKeep: (bestDayLabel: string) => `${bestDayLabel}처럼 길게 이어졌던 흐름을 다음 주에도 기본 리듬으로 유지해 보세요.`,
|
|
reviewCarryKeepGeneric: '이번 주에 가장 오래 이어진 흐름의 길이를 다음 주 기본 리듬으로 유지해 보세요.',
|
|
reviewCarryTryDefault: '다음 주 첫 세션은 시간을 늘리기보다, 바로 시작할 한 줄을 더 작게 잡아 보세요.',
|
|
reviewCarryTrySmaller: '이월된 블록이 많았어요. 다음 주에는 목표를 더 작게 잡고 첫 microStep을 더 구체적으로 적어보세요.',
|
|
reviewCarryTryClosure: '시작은 있었지만 마무리가 약했어요. 다음 주에는 완료 직전에 다른 블록으로 넘어가지 않는 흐름을 한 번 만들어 보세요.',
|
|
reviewCarryTryStart: '시작 횟수가 적었어요. 다음 주에는 길이를 늘리기보다 첫 세션을 한 번 더 여는 것에 집중해 보세요.',
|
|
reviewCarryCta: '이 흐름으로 다음 세션 시작',
|
|
reviewCarryKeepTitle: '다음 주에 유지할 것',
|
|
reviewCarryTryTitle: '다음 주에 바꿔볼 것',
|
|
today: '오늘',
|
|
last7Days: '최근 7일',
|
|
chartTitle: '집중 흐름 그래프',
|
|
chartWithTrend: 'trend 응답으로 간단한 막대 그래프를 렌더링합니다.',
|
|
chartWithoutTrend: 'trend 응답이 비어 있어 플레이스홀더 상태입니다.',
|
|
todayFocus: '오늘 집중 시간',
|
|
completedCycles: '완료한 사이클',
|
|
sessionEntries: '입장 횟수',
|
|
last7DaysFocus: '최근 7일 집중 시간',
|
|
startedSessions: '시작한 세션',
|
|
completedSessions: '완료한 세션',
|
|
carriedOverCount: '이월된 계획',
|
|
syncedApi: '동기화됨',
|
|
temporary: '임시값',
|
|
actualAggregate: '실집계',
|
|
mockAggregate: '목업',
|
|
countUnit: '회',
|
|
dayUnit: '일',
|
|
minuteUnit: '분',
|
|
barTitle: (date: string, minutes: number) => `${date} · ${minutes}분`,
|
|
},
|
|
plan: {
|
|
proFeatureCards: [
|
|
{
|
|
id: 'daily-plan',
|
|
name: 'Daily Focus Plan',
|
|
description: '오늘의 집중을 블록 단위로 쪼개고 큐를 운영합니다.',
|
|
},
|
|
{
|
|
id: 'rituals',
|
|
name: 'Rituals',
|
|
description: 'scene + sound + timer 조합을 반복 가능한 시작 방식으로 저장합니다.',
|
|
},
|
|
{
|
|
id: 'weekly-review',
|
|
name: 'Weekly Review',
|
|
description: '총 시간보다 시작 성공률과 복귀 패턴을 먼저 해석합니다.',
|
|
},
|
|
],
|
|
},
|
|
session: {
|
|
todayOneLiner: '오늘의 한 줄: 완벽보다 시작, 한 조각이면 충분해요.',
|
|
goalChips: [
|
|
{ id: 'mail-3', label: '메일 3개' },
|
|
{ id: 'doc-1p', label: '문서 1p' },
|
|
{ id: 'code-1-function', label: '코딩 1함수' },
|
|
{ id: 'tidy-10m', label: '정리 10분' },
|
|
{ id: 'reading-15m', label: '독서 15분' },
|
|
{ id: 'resume-1paragraph', label: '이력서 1문단' },
|
|
],
|
|
checkInPhrases: [
|
|
{ id: 'arrived', text: '지금 들어왔어요' },
|
|
{ id: 'sprint-25', text: '25분만 달릴게요' },
|
|
{ id: 'on-break', text: '휴식 중' },
|
|
{ id: 'back-focus', text: '다시 집중!' },
|
|
{ id: 'slow-day', text: '오늘은 천천히' },
|
|
],
|
|
reactionOptions: [
|
|
{ id: 'thumbs-up', emoji: '👍', label: '응원해요' },
|
|
{ id: 'fire', emoji: '🔥', label: '집중 모드' },
|
|
{ id: 'clap', emoji: '👏', label: '잘하고 있어요' },
|
|
{ id: 'heart-hands', emoji: '🫶', label: '연결되어 있어요' },
|
|
],
|
|
soundPresets: [
|
|
{ id: 'deep-white', label: 'Deep White' },
|
|
{ id: 'rain-focus', label: 'Rain Focus' },
|
|
{ id: 'forest-birds', label: 'Forest Birds' },
|
|
{ id: 'cafe-work', label: 'Cafe Work' },
|
|
{ id: 'ocean-calm', label: 'Ocean Calm' },
|
|
{ id: 'fireplace', label: 'Fireplace' },
|
|
{ id: 'silent', label: 'Silent' },
|
|
],
|
|
timerPresets: [
|
|
{ id: '25-5', label: '25/5', focusMinutes: 25, breakMinutes: 5 },
|
|
{ id: '50-10', label: '50/10', focusMinutes: 50, breakMinutes: 10 },
|
|
{ id: '90-20', label: '90/20', focusMinutes: 90, breakMinutes: 20 },
|
|
{ id: 'custom', label: '커스텀' },
|
|
],
|
|
distractionDumpPlaceholder: ['디자인 QA 요청 확인', '세금계산서 발행 메모', '오후 미팅 질문 1개 정리'],
|
|
todayStats: [
|
|
{ id: 'today-focus', label: '오늘 집중 시간', value: '2h 40m', delta: '+35m' },
|
|
{ id: 'today-cycles', label: '완료한 사이클', value: '5회', delta: '+1' },
|
|
{ id: 'today-entry', label: '입장 횟수', value: '3회', delta: '유지' },
|
|
],
|
|
weeklyStats: [
|
|
{ id: 'week-focus', label: '최근 7일 집중 시간', value: '14h 20m', delta: '+2h 10m' },
|
|
{ id: 'week-best-day', label: '최고 몰입일', value: '수요일', delta: '3h 30m' },
|
|
{ id: 'week-consistency', label: '연속 달성', value: '4일', delta: '+1일' },
|
|
],
|
|
recentThoughts: [
|
|
{
|
|
id: 'thought-1',
|
|
text: '내일 미팅 전에 제안서 첫 문단만 다시 다듬기',
|
|
sceneName: '도서관',
|
|
capturedAt: '방금 전',
|
|
},
|
|
{
|
|
id: 'thought-2',
|
|
text: '기획 문서의 핵심 흐름을 한 문장으로 정리해두기',
|
|
sceneName: '비 오는 창가',
|
|
capturedAt: '24분 전',
|
|
},
|
|
{
|
|
id: 'thought-3',
|
|
text: '오후에 확인할 이슈 번호만 메모하고 지금 작업 복귀',
|
|
sceneName: '숲',
|
|
capturedAt: '1시간 전',
|
|
},
|
|
{
|
|
id: 'thought-4',
|
|
text: '리뷰 코멘트는 오늘 17시 이후에 한 번에 처리',
|
|
sceneName: '벽난로',
|
|
capturedAt: '어제',
|
|
},
|
|
],
|
|
justNow: '방금 전',
|
|
},
|
|
scenes: [
|
|
{
|
|
id: 'rain-window',
|
|
name: '비 오는 창가',
|
|
description: '빗소리 위로 스탠드 조명이 부드럽게 번집니다.',
|
|
tags: ['저자극', '감성'],
|
|
recommendedSound: 'Rain Focus',
|
|
recommendedTime: '밤',
|
|
vibeLabel: '잔잔함',
|
|
},
|
|
{
|
|
id: 'dawn-cafe',
|
|
name: '새벽 카페',
|
|
description: '첫 커피 향처럼 잔잔하고 따뜻한 좌석.',
|
|
tags: ['감성', '딥워크'],
|
|
recommendedSound: 'Cafe Murmur',
|
|
recommendedTime: '새벽',
|
|
vibeLabel: '포근함',
|
|
},
|
|
{
|
|
id: 'quiet-library',
|
|
name: '도서관',
|
|
description: '넘기는 종이 소리만 들리는 정돈된 책상.',
|
|
tags: ['저자극', '딥워크'],
|
|
recommendedSound: 'Deep White',
|
|
recommendedTime: '오후',
|
|
vibeLabel: '몰입',
|
|
},
|
|
{
|
|
id: 'wave-sound',
|
|
name: '파도 소리',
|
|
description: '잔잔한 해변 위로 호흡을 고르는 공간.',
|
|
tags: ['움직임 적음', '감성'],
|
|
recommendedSound: 'Ocean Breath',
|
|
recommendedTime: '밤',
|
|
vibeLabel: '차분함',
|
|
},
|
|
{
|
|
id: 'forest',
|
|
name: '숲',
|
|
description: '바람이 나뭇잎을 스치는 소리로 마음을 낮춥니다.',
|
|
tags: ['저자극', '움직임 적음'],
|
|
recommendedSound: 'Forest Birds',
|
|
recommendedTime: '오전',
|
|
vibeLabel: '맑음',
|
|
},
|
|
{
|
|
id: 'fireplace',
|
|
name: '벽난로',
|
|
description: '작은 불꽃이 주는 리듬으로 집중을 붙잡습니다.',
|
|
tags: ['감성', '저자극'],
|
|
recommendedSound: 'Fireplace',
|
|
recommendedTime: '밤',
|
|
vibeLabel: '온기',
|
|
},
|
|
{
|
|
id: 'city-night',
|
|
name: '도시 야경',
|
|
description: '유리창 너머 야경이 멀리 흐르는 고요한 밤.',
|
|
tags: ['딥워크', '감성'],
|
|
recommendedSound: 'Night Lo-fi',
|
|
recommendedTime: '심야',
|
|
vibeLabel: '고요함',
|
|
},
|
|
{
|
|
id: 'snow-mountain',
|
|
name: '설산',
|
|
description: '차분한 공기와 선명한 수평선이 머리를 맑게 합니다.',
|
|
tags: ['움직임 적음', '딥워크'],
|
|
recommendedSound: 'Cold Wind',
|
|
recommendedTime: '새벽',
|
|
vibeLabel: '선명함',
|
|
},
|
|
{
|
|
id: 'sun-window',
|
|
name: '창가',
|
|
description: '햇살이 들어오는 간결한 책상, 부담 없는 시작.',
|
|
tags: ['저자극', '딥워크'],
|
|
recommendedSound: 'Soft Daylight',
|
|
recommendedTime: '오후',
|
|
vibeLabel: '가벼움',
|
|
},
|
|
{
|
|
id: 'outer-space',
|
|
name: '우주',
|
|
description: '별빛만 남긴 어둠 속에서 깊게 잠수합니다.',
|
|
tags: ['딥워크', '감성'],
|
|
recommendedSound: 'Deep Drone',
|
|
recommendedTime: '심야',
|
|
vibeLabel: '깊음',
|
|
},
|
|
],
|
|
} as const;
|