/* * 한국어(ko) — 기본/폴백 로케일. **키 형상(shape)의 단일 출처.** * 다른 로케일(en/zh/ja)은 이 파일의 타입(Resource)을 구현하므로 키 누락 시 tsc가 잡는다. * 새 키는 반드시 여기에 먼저 추가하고 나머지 로케일을 맞춘다(병렬 편집 함정 회피 — 직렬·키 대조). */ export const ko = { common: { appName: 'KINTEX AI 전시관리', loading: '확인 중…', retry: '다시 시도', cancel: '취소', close: '닫기', user: '사용자', none: '-', unknown: '알 수 없음', error: '오류', }, lang: { title: '언어', subtitle: '앱 표시 언어를 선택하세요. 선택은 이 기기에 저장됩니다.', ko: '한국어', en: 'English', zh: '中文', ja: '日本語', }, roles: { ORGANIZER: '주최자', EXHIBITOR: '참가업체', CONTRACTOR: '장치·시공업체', HALL_MANAGER: '홀매니저', }, nav: { register: '회원가입', forgotPassword: '비밀번호 찾기', profile: '내 정보', checklist: '현장 체크리스트', inspection: '현장 검수', ticketsIndex: '내 티켓', ticketsSelect: '티켓 예매', tabHome: '홈', tabField: '현장', tabGallery: '갤러리', tabMore: '더보기', }, login: { brandTitle: '신청서를 내는 순간,\n시공 후 사진을 먼저 봅니다', brandCaption: 'AI 생성 예상 이미지 · 실제 시공 결과와 다를 수 있습니다', compromised: '보안 위험이 감지된 기기입니다(루팅·후킹·디버거). 개인정보·티켓 보호를 위해 정상 기기에서 이용을 권장합니다.', title: '로그인', email: '이메일', emailPlaceholder: 'name@company.co.kr', password: '비밀번호', passwordPlaceholder: '비밀번호', otpLabel: '2차 인증 코드', otpPlaceholder: '6자리 코드', otpHelper: '인증 앱(TOTP)의 6자리 코드', remember: '아이디 기억', submit: '로그인', submitOtp: '인증 후 로그인', forgot: '비밀번호 찾기', register: '회원가입', errEmpty: '이메일과 비밀번호를 입력해 주세요.', errOtpEmpty: '2차 인증 코드를 입력해 주세요.', errOtpRequired: '2차 인증 코드가 필요합니다. 인증 앱의 코드를 입력해 주세요.', errOtpInvalid: '인증 코드가 올바르지 않거나 만료되었습니다.', errLocked: '로그인 시도 초과로 계정이 잠겼습니다. 잠시 후 다시 시도해 주세요.', errGeneric: '로그인에 실패했습니다.', }, register: { title: '계정 만들기', email: '이메일', emailPlaceholder: 'name@company.co.kr', name: '이름', namePlaceholder: '홍길동', password: '비밀번호', passwordPlaceholder: '8자 이상', passwordHelper: '8~100자', company: '회사명 (선택)', companyPlaceholder: '지오인포', invite: '초대 코드 (선택)', invitePlaceholder: '행사 초대 코드', submit: '가입하기', goLogin: '로그인으로 이동', errInvalid: '이메일·이름·비밀번호(8자 이상)를 확인해 주세요.', errEmailTaken: '이미 가입된 이메일입니다.', errGeneric: '회원가입에 실패했습니다.', doneJoined: '가입이 완료되었고 초대 행사에 연결되었습니다. 로그인해 주세요.', done: '가입이 완료되었습니다. 로그인해 주세요.', }, forgot: { title: '비밀번호 재설정', email: '이메일', emailPlaceholder: 'name@company.co.kr', request: '재설정 코드 요청', code: '재설정 코드', codePlaceholder: '6자리 코드', newPassword: '새 비밀번호', newPasswordPlaceholder: '8자 이상', newPasswordHelper: '8~100자', submit: '비밀번호 변경', errEmail: '이메일을 입력해 주세요.', errFields: '재설정 코드와 새 비밀번호(8자 이상)를 확인해 주세요.', errCode: '재설정 코드가 올바르지 않거나 만료되었습니다.', errRequest: '요청에 실패했습니다.', errReset: '초기화에 실패했습니다.', }, home: { hello: '{{name}}님, 안녕하세요', noEvent: '참여 중인 행사가 없습니다 — 초대 링크 또는 초대 코드를 확인해 주세요.', progress: '진행 상태', stepApply: '신청', stepApprove: '승인', stepBuild: '시공', stepInspect: '검수', actionChecklist: '현장 체크리스트', actionInspection: '현장 검수', actionGallery: '시각화 갤러리', memberInternal: '킨텍스 내부 계정 (홀매니저)', memberGeneral: '일반 계정', }, field: { title: '현장 업무', guide: '현장 기능은 장치·시공업체(체크리스트)와 홀매니저(검수) 역할에서 제공됩니다.', checklistTitle: '현장 체크리스트', checklistDesc: '장치 공정 확인 · 사진 첨부 · 검수 요청', inspectionTitle: '현장 검수', inspectionDesc: '승인 도면 vs 현장 사진 · 적합/부적합 판정', }, gallery: { infoBar: 'AI 생성 이미지는 계약·심사 서류에 사용할 수 없습니다 — 시공 기준은 도면입니다', degraded: '서버 이미지 이력에 연결할 수 없어 예시를 표시합니다 (degraded).', empty: '아직 생성된 이미지가 없습니다 — 설계 스튜디오에서 예상 사진을 생성하세요.', retry: '다시 생성', studioNote: '설계 스튜디오는 데스크톱에서 편집', notice: 'AI 생성 이미지는 계약·심사 서류에 사용할 수 없습니다 (시공 기준은 도면)', }, more: { accountInternal: '킨텍스 내부 계정 (홀매니저)', accountGeneral: '일반 계정', openProfile: '내 정보 열기', apiServer: 'API 서버', serverStatus: '서버 상태', statusUp: '정상 (UP)', statusDown: '연결 불가 (degraded)', signOut: '로그아웃', version: 'KINTEX AI 전시관리 · v0.1.0', }, profile: { sectionInfo: '내 정보', sectionEventRoles: '참여 행사 역할', sectionSecurity: '계정 · 보안', sectionBiometric: '생체인식 잠금', sectionNotify: '알림 설정', labelName: '이름', labelUserId: '사용자 ID', labelGlobalRole: '전역 역할', labelTenant: '전시관(테넌트)', labelType: '구분', typeInternal: '킨텍스 내부(홀매니저)', typeGeneral: '일반 계정', photoChange: '프로필 사진 변경', photoTitle: '프로필 사진', photoSelect: '사진을 선택하세요', photoLibrary: '갤러리', photoCamera: '카메라', photoApply: '적용', photoApplying: '적용 중…', photoCaption: '원형으로 표시됩니다.', photoPending: '선택한 사진은 이 기기에만 표시됩니다 — 서버 반영은 준비 중입니다.', photoPickerUnavailable: '이미지 선택 기능을 사용할 수 없는 기기입니다.', loadErr: '내정보를 불러오지 못했습니다.', uploadErr: '사진 업로드에 실패했습니다.', otpTitle: '2차 인증(OTP)', otpOnAuth: '활성화됨 · Authenticator(OTP)', otpOnMethod: '활성화됨 · {{method}}', otpOff: '미설정 — 로그인 시 인증 앱(TOTP) 2단계 인증을 사용합니다.', on: '켜짐', off: '꺼짐', bioTitle: '지문 · Face 잠금', bioDesc: '켜면 내정보 진입 시 지문 또는 Face로 재인증합니다. 로그인 2차 인증은 그대로 유지됩니다.', bioUnsupported: '이 기기는 생체인식을 지원하지 않거나 지문/Face가 등록되어 있지 않습니다. 기기 설정에서 생체 정보를 등록한 뒤 다시 시도해 주세요.', bioFailed: '생체 인증에 실패했습니다. 다시 시도해 주세요.', biometric: '생체인식', lockTitle: '생체인식 잠금', lockHint: '지문 또는 Face로 잠금을 해제하세요.', notifyDeadline: '마감 D-데이 알림', notifyApproval: '승인·검수 알림', notifyPayment: '결제·정산 알림', notifyNote: '알림 설정은 이 기기에 저장됩니다. 서버 동기화는 준비 중입니다.', signOut: '로그아웃', signOutConfirm: '로그아웃하시겠습니까?', version: 'KINTEX AI 전시관리 · 내정보', }, tickets: { offline: '오프라인 — 저장된 티켓 표시 중', badgeNotice: '티켓 QR로 현장 체크인하면 모바일 배지로 전환됩니다', footNote: '표시된 티켓은 샘플입니다 — 티켓 백엔드(M10) 연동 시 실데이터로 대체됩니다.', emptyTitle: '보유한 티켓이 없습니다', emptyBody: '입장권을 예매하면 이곳에 티켓이 표시됩니다.', emptyBtn: '입장권 예매', detailTitle: '예매 상세·취소', }, vnav: { tabHome: '홈', tabEvents: '행사', tabTickets: '티켓', tabOnsite: '현장', tabMy: '마이', }, vhome: { hello: '{{name}}님, 환영합니다', subtitle: '오늘의 전시를 편하게 둘러보세요', noEvent: '참여 중인 행사가 없습니다 — 입장권을 예매하면 여기에 표시됩니다.', tileTickets: '내 티켓', tileTicketsDesc: '입장 QR · 배지', tileEvents: '행사', tileEventsDesc: '공지 · 일정', tileOnsite: '현장', tileOnsiteDesc: '혼잡 · 주차', aiTitle: 'AI 관람 도우미', aiDesc: '혼잡·주차·공지를 실시간으로 안내합니다. 곧 부스 검색·길찾기도 추가됩니다.', }, vevents: { title: '행사', empty: '참여 중인 행사가 없습니다 — 공개 공지를 표시합니다.', }, notices: { title: '라이브 공지', live: 'LIVE', pinned: '고정', empty: '등록된 공지가 없습니다.', degraded: '공지를 불러오지 못했습니다 (연결 확인).', cat: { URGENT: '긴급', PROGRAM: '프로그램', GENERAL: '일반', INFO: '안내', }, }, onsite: { segCongestion: '혼잡도', segParking: '주차', }, congestion: { overall: '종합 혼잡도', onSite: '현장 인원', people: '{{n}}명', gates: '입장 게이트', parking: '주차장', popular: '인기 공간', empty: '표시할 혼잡 정보가 없습니다.', degraded: '혼잡 정보를 불러오지 못했습니다 (연결 확인).', }, parking: { title: '주차 현황', empty: '주차장 정보가 없습니다.', degraded: '주차 정보를 불러오지 못했습니다 (연결 확인).', available: '여유 {{n}}면', capacity: '전체 {{n}}면', rate: '시간당 {{n}}원', daily: '일 최대 {{n}}원', passPrice: '{{n}}원', buyPass: '주차권 구매', myPasses: '내 주차권', noPasses: '보유한 주차권이 없습니다.', loginRequired: '주차권 구매·조회는 로그인이 필요합니다.', purchaseTitle: '사전 주차권 구매', selectLot: '주차장', useDate: '이용일', plate: '차량번호 (선택)', platePlaceholder: '예: 123가4567', plateNote: '차량번호는 마스킹되어 저장되지 않습니다.', payNote: '결제는 시뮬레이션(mock)입니다 — 실제 청구되지 않습니다.', confirm: '구매', purchaseErr: '주차권 구매에 실패했습니다.', prevDay: '이전 날짜', nextDay: '다음 날짜', passStatus: { PAID: '결제완료', USED: '사용됨', CANCELLED: '취소', }, }, vmy: { tickets: '내 티켓', ticketsDesc: '입장 QR · 배지 전환', parking: '내 주차권', parkingDesc: '주차 현황 · 사전 주차권', }, } as const; export type Resource = typeof ko;