kintex/mobile/lib/i18n/locales/ko.ts
zio 0933dbea41 feat(mobile): B2C visitor tab, congestion pill, live notice feed, ticket wallet, brand logo (v0.2.2 prep)
- (visitor) route group, visitor lib, tickets wallet
- CongestionPill + LiveNoticeFeed components
- login/tickets screens, i18n 4 locales, wordmark assets, splash

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-24 00:41:57 +09:00

296 lines
12 KiB
TypeScript

/*
* 한국어(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;