mirror of
https://github.com/mauriceboe/TREK.git
synced 2026-06-24 07:41:47 +00:00
c0b5d941dd
When the backend or identity provider was unreachable, a returning user with a persisted session landed on the dashboard with an empty trip grid and no error. That looks identical to a logged-in user who simply has no trips, so people assumed their data had been lost. Three client-side layers were quietly swallowing the failure: the auth check only cleared state on a 401, so a 5xx or a network error left the stale session in place and kept rendering the protected route; the offline-first trip repo turned a failed fetch into the empty cache without throwing; and the dashboard had neither an error nor an empty state, so a blank grid meant both "outage" and "no trips". The auth check now tells genuine offline (keep serving the cache silently, the PWA happy path) apart from a server outage while online (keep the session but flag it). The dashboard shows a reassuring "couldn't reach the server, your trips are safe" banner with a retry, and a real zero-trip account finally gets a proper empty state so the two cases never look alike. New strings added across all locales.
167 lines
8.7 KiB
TypeScript
167 lines
8.7 KiB
TypeScript
import type { TranslationStrings } from '../types';
|
|
|
|
const dashboard: TranslationStrings = {
|
|
'dashboard.title': '내 여행',
|
|
'dashboard.subtitle.loading': '여행 불러오는 중...',
|
|
'dashboard.subtitle.trips': '{count}개 여행 ({archived}개 보관됨)',
|
|
'dashboard.subtitle.empty': '첫 번째 여행을 시작하세요',
|
|
'dashboard.subtitle.activeOne': '활성 여행 {count}개',
|
|
'dashboard.subtitle.activeMany': '활성 여행 {count}개',
|
|
'dashboard.subtitle.archivedSuffix': ' · {count}개 보관됨',
|
|
'dashboard.newTrip': '새 여행',
|
|
'dashboard.newTripSub': '새 여행을 처음부터 계획하기',
|
|
'dashboard.gridView': '격자 보기',
|
|
'dashboard.listView': '목록 보기',
|
|
'dashboard.currency': '통화',
|
|
'dashboard.timezone': '시간대',
|
|
'dashboard.localTime': '현지',
|
|
'dashboard.timezoneCustomTitle': '사용자 지정 시간대',
|
|
'dashboard.timezoneCustomLabelPlaceholder': '레이블 (선택)',
|
|
'dashboard.timezoneCustomTzPlaceholder': '예: America/New_York',
|
|
'dashboard.timezoneCustomAdd': '추가',
|
|
'dashboard.timezoneCustomErrorEmpty': '시간대 식별자를 입력하세요',
|
|
'dashboard.timezoneCustomErrorInvalid': '잘못된 시간대입니다. Europe/Berlin 같은 형식을 사용하세요',
|
|
'dashboard.timezoneCustomErrorDuplicate': '이미 추가됨',
|
|
'dashboard.emptyTitle': '아직 여행이 없습니다',
|
|
'dashboard.emptyText': '첫 번째 여행을 만들고 계획을 시작하세요!',
|
|
'dashboard.emptyButton': '첫 번째 여행 만들기',
|
|
'dashboard.nextTrip': '다음 여행',
|
|
'dashboard.shared': '공유됨',
|
|
'dashboard.sharedBy': '{name}이(가) 공유',
|
|
'dashboard.days': '일',
|
|
'dashboard.places': '장소',
|
|
'dashboard.members': '동행자',
|
|
'dashboard.archive': '보관',
|
|
'dashboard.copyTrip': '복사',
|
|
'dashboard.copySuffix': '사본',
|
|
'dashboard.restore': '복원',
|
|
'dashboard.archived': '보관됨',
|
|
'dashboard.status.ongoing': '진행 중',
|
|
'dashboard.status.today': '오늘',
|
|
'dashboard.status.tomorrow': '내일',
|
|
'dashboard.status.past': '지난 여행',
|
|
'dashboard.status.daysLeft': '{count}일 남음',
|
|
'dashboard.toast.loadError': '여행 불러오기 실패',
|
|
'dashboard.loadErrorBanner': '서버에 연결할 수 없습니다. 여행 정보는 안전하게 보관되어 있으니 잠시 후 다시 시도해 주세요.',
|
|
'dashboard.retry': '다시 시도',
|
|
'dashboard.toast.created': '여행이 생성되었습니다!',
|
|
'dashboard.toast.createError': '여행 생성 실패',
|
|
'dashboard.toast.updated': '여행이 업데이트되었습니다!',
|
|
'dashboard.toast.updateError': '여행 업데이트 실패',
|
|
'dashboard.toast.deleted': '여행이 삭제되었습니다',
|
|
'dashboard.toast.deleteError': '여행 삭제 실패',
|
|
'dashboard.toast.archived': '여행이 보관되었습니다',
|
|
'dashboard.toast.archiveError': '여행 보관 실패',
|
|
'dashboard.toast.restored': '여행이 복원되었습니다',
|
|
'dashboard.toast.restoreError': '여행 복원 실패',
|
|
'dashboard.toast.copied': '여행이 복사되었습니다!',
|
|
'dashboard.toast.copyError': '여행 복사 실패',
|
|
'dashboard.confirm.delete': '여행 "{title}"을(를) 삭제할까요? 모든 장소와 계획이 영구 삭제됩니다.',
|
|
'dashboard.confirm.copy.title': '이 여행을 복사할까요?',
|
|
'dashboard.confirm.copy.willCopy': '복사될 항목',
|
|
'dashboard.confirm.copy.will1': '일정, 장소 및 일별 배정',
|
|
'dashboard.confirm.copy.will2': '숙박 및 예약',
|
|
'dashboard.confirm.copy.will3': '예산 항목 및 카테고리 순서',
|
|
'dashboard.confirm.copy.will4': '짐 목록 (체크 해제 상태)',
|
|
'dashboard.confirm.copy.will5': '할 일 (미배정 및 미완료)',
|
|
'dashboard.confirm.copy.will6': '일별 메모',
|
|
'dashboard.confirm.copy.wontCopy': '복사되지 않는 항목',
|
|
'dashboard.confirm.copy.wont1': '공동 작업자 및 멤버 배정',
|
|
'dashboard.confirm.copy.wont2': '공동 작업 메모, 투표 및 메시지',
|
|
'dashboard.confirm.copy.wont3': '파일 및 사진',
|
|
'dashboard.confirm.copy.wont4': '공유 토큰',
|
|
'dashboard.confirm.copy.confirm': '여행 복사',
|
|
'dashboard.editTrip': '여행 편집',
|
|
'dashboard.createTrip': '새 여행 만들기',
|
|
'dashboard.tripTitle': '제목',
|
|
'dashboard.tripTitlePlaceholder': '예: 일본에서의 여름',
|
|
'dashboard.tripDescription': '설명',
|
|
'dashboard.tripDescriptionPlaceholder': '이 여행에 대해 설명해 주세요',
|
|
'dashboard.startDate': '시작일',
|
|
'dashboard.endDate': '종료일',
|
|
'dashboard.dayCount': '일수',
|
|
'dashboard.dayCountHint': '여행 날짜가 설정되지 않은 경우 계획할 일수입니다.',
|
|
'dashboard.noDateHint': '날짜 미설정 — 기본 7일이 생성됩니다. 언제든지 변경할 수 있습니다.',
|
|
'dashboard.coverImage': '커버 이미지',
|
|
'dashboard.addCoverImage': '커버 이미지 추가 (또는 끌어다 놓기)',
|
|
'dashboard.addMembers': '동행자',
|
|
'dashboard.addMember': '멤버 추가',
|
|
'dashboard.coverSaved': '커버 이미지가 저장되었습니다',
|
|
'dashboard.coverUploadError': '업로드 실패',
|
|
'dashboard.coverRemoveError': '삭제 실패',
|
|
'dashboard.titleRequired': '제목을 입력하세요',
|
|
'dashboard.endDateError': '종료일은 시작일 이후여야 합니다',
|
|
'dashboard.greeting.morning': '좋은 아침이에요,',
|
|
'dashboard.greeting.afternoon': '안녕하세요,',
|
|
'dashboard.greeting.evening': '좋은 저녁이에요,',
|
|
'dashboard.mobile.liveNow': '지금 라이브',
|
|
'dashboard.mobile.tripProgress': '여행 진행도',
|
|
'dashboard.mobile.daysLeft': '{count}일 남음',
|
|
'dashboard.mobile.places': '장소',
|
|
'dashboard.mobile.buddies': '동행자',
|
|
'dashboard.mobile.newTrip': '새 여행',
|
|
'dashboard.mobile.currency': '통화',
|
|
'dashboard.mobile.timezone': '시간대',
|
|
'dashboard.mobile.upcomingTrips': '예정된 여행',
|
|
'dashboard.mobile.yourTrips': '내 여행',
|
|
'dashboard.mobile.trips': '개 여행',
|
|
'dashboard.mobile.starts': '시작',
|
|
'dashboard.mobile.duration': '기간',
|
|
'dashboard.mobile.day': '일',
|
|
'dashboard.mobile.days': '일',
|
|
'dashboard.mobile.ongoing': '진행 중',
|
|
'dashboard.mobile.startsToday': '오늘 시작',
|
|
'dashboard.mobile.tomorrow': '내일',
|
|
'dashboard.mobile.inDays': '{count}일 후',
|
|
'dashboard.mobile.inMonths': '{count}개월 후',
|
|
'dashboard.mobile.completed': '완료됨',
|
|
'dashboard.mobile.currencyConverter': '환율 계산기',
|
|
'dashboard.filter.planned': '예정',
|
|
'dashboard.hero.badgeLive': '진행 중',
|
|
'dashboard.hero.badgeToday': '오늘 시작',
|
|
'dashboard.hero.badgeTomorrow': '내일',
|
|
'dashboard.hero.badgeNext': '다음 여행',
|
|
'dashboard.hero.badgeRecent': '최근',
|
|
'dashboard.hero.tripDates': '여행 날짜',
|
|
'dashboard.hero.noDates': '날짜 미설정',
|
|
'dashboard.hero.travelerOne': '여행자 {count}명',
|
|
'dashboard.hero.travelerMany': '여행자 {count}명',
|
|
'dashboard.hero.destinationOne': '목적지 {count}곳',
|
|
'dashboard.hero.destinationMany': '목적지 {count}곳',
|
|
'dashboard.hero.dayUnitOne': '일',
|
|
'dashboard.hero.dayUnitMany': '일',
|
|
'dashboard.hero.dayLeft': '하루 남음',
|
|
'dashboard.hero.daysLeft': '남은 일수',
|
|
'dashboard.hero.lastDay': '마지막 날',
|
|
'dashboard.hero.untilStart': '시작까지',
|
|
'dashboard.hero.startsIn': '출발까지',
|
|
'dashboard.atlas.countriesVisited': '아틀라스 · 방문한 국가',
|
|
'dashboard.atlas.ofTotal': '/ {total}',
|
|
'dashboard.atlas.tripsTotal': '총 여행',
|
|
'dashboard.atlas.placesMapped': '{count}개 장소 기록',
|
|
'dashboard.atlas.daysTraveled': '여행 일수',
|
|
'dashboard.atlas.daysUnit': '일',
|
|
'dashboard.atlas.acrossAllTrips': '모든 여행 통틀어',
|
|
'dashboard.atlas.distanceFlown': '비행 거리',
|
|
'dashboard.atlas.kmUnit': 'km',
|
|
'dashboard.atlas.aroundEquator': '≈ 적도 {count}바퀴',
|
|
'dashboard.card.idea': '아이디어',
|
|
'dashboard.card.buddyOne': '동행자',
|
|
'dashboard.fx.from': '보낼 통화',
|
|
'dashboard.fx.to': '받을 통화',
|
|
'dashboard.fx.unavailable': '환율을 사용할 수 없음',
|
|
'dashboard.tz.searchPlaceholder': '시간대 검색…',
|
|
'dashboard.tz.empty': '다른 시간대가 아직 없습니다 — +로 추가하세요',
|
|
'dashboard.upcoming.title': '예정된 예약',
|
|
'dashboard.upcoming.empty': '아직 예약이 없습니다.',
|
|
'dashboard.aria.toggleView': '보기 전환',
|
|
'dashboard.aria.filter': '필터',
|
|
'dashboard.aria.duplicate': '복제',
|
|
'dashboard.aria.refreshRates': '환율 새로고침',
|
|
'dashboard.aria.swapCurrencies': '통화 바꾸기',
|
|
'dashboard.aria.addTimezone': '시간대 추가',
|
|
'dashboard.aria.removeTimezone': '{city} 제거',
|
|
'dashboard.dayCountRequired': '일수는 필수입니다',
|
|
};
|
|
export default dashboard;
|