- (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>
292 lines
10 KiB
TypeScript
292 lines
10 KiB
TypeScript
/* English (en). Mirrors ko key shape (enforced by Translations type). */
|
||
import type { Translations } from '../types';
|
||
|
||
export const en: Translations = {
|
||
common: {
|
||
appName: 'KINTEX AI Exhibition',
|
||
loading: 'Checking…',
|
||
retry: 'Retry',
|
||
cancel: 'Cancel',
|
||
close: 'Close',
|
||
user: 'User',
|
||
none: '-',
|
||
unknown: 'Unknown',
|
||
error: 'Error',
|
||
},
|
||
lang: {
|
||
title: 'Language',
|
||
subtitle: 'Choose the app language. Your choice is saved on this device.',
|
||
ko: '한국어',
|
||
en: 'English',
|
||
zh: '中文',
|
||
ja: '日本語',
|
||
},
|
||
roles: {
|
||
ORGANIZER: 'Organizer',
|
||
EXHIBITOR: 'Exhibitor',
|
||
CONTRACTOR: 'Contractor',
|
||
HALL_MANAGER: 'Hall Manager',
|
||
},
|
||
nav: {
|
||
register: 'Sign up',
|
||
forgotPassword: 'Find password',
|
||
profile: 'My Info',
|
||
checklist: 'Site Checklist',
|
||
inspection: 'Site Inspection',
|
||
ticketsIndex: 'My Tickets',
|
||
ticketsSelect: 'Book Ticket',
|
||
tabHome: 'Home',
|
||
tabField: 'Site',
|
||
tabGallery: 'Gallery',
|
||
tabMore: 'More',
|
||
},
|
||
login: {
|
||
brandTitle: 'The moment you apply,\nsee the post-build photo first',
|
||
brandCaption: 'AI-generated preview · may differ from the actual build',
|
||
compromised:
|
||
'This device shows security risks (root/hook/debugger). To protect your data and tickets, please use a normal device.',
|
||
title: 'Sign in',
|
||
email: 'Email',
|
||
emailPlaceholder: 'name@company.com',
|
||
password: 'Password',
|
||
passwordPlaceholder: 'Password',
|
||
otpLabel: 'Two-factor code',
|
||
otpPlaceholder: '6-digit code',
|
||
otpHelper: '6-digit code from your authenticator (TOTP)',
|
||
remember: 'Remember email',
|
||
submit: 'Sign in',
|
||
submitOtp: 'Verify & sign in',
|
||
forgot: 'Find password',
|
||
register: 'Sign up',
|
||
errEmpty: 'Please enter your email and password.',
|
||
errOtpEmpty: 'Please enter the two-factor code.',
|
||
errOtpRequired: 'A two-factor code is required. Enter the code from your authenticator app.',
|
||
errOtpInvalid: 'The code is incorrect or expired.',
|
||
errLocked: 'Account locked after too many attempts. Please try again later.',
|
||
errGeneric: 'Sign in failed.',
|
||
},
|
||
register: {
|
||
title: 'Create account',
|
||
email: 'Email',
|
||
emailPlaceholder: 'name@company.com',
|
||
name: 'Name',
|
||
namePlaceholder: 'John Doe',
|
||
password: 'Password',
|
||
passwordPlaceholder: '8+ characters',
|
||
passwordHelper: '8–100 characters',
|
||
company: 'Company (optional)',
|
||
companyPlaceholder: 'Zioinfo',
|
||
invite: 'Invite code (optional)',
|
||
invitePlaceholder: 'Event invite code',
|
||
submit: 'Sign up',
|
||
goLogin: 'Go to sign in',
|
||
errInvalid: 'Please check email, name and password (8+ characters).',
|
||
errEmailTaken: 'This email is already registered.',
|
||
errGeneric: 'Sign up failed.',
|
||
doneJoined: 'Registration complete and linked to the invited event. Please sign in.',
|
||
done: 'Registration complete. Please sign in.',
|
||
},
|
||
forgot: {
|
||
title: 'Reset password',
|
||
email: 'Email',
|
||
emailPlaceholder: 'name@company.com',
|
||
request: 'Request reset code',
|
||
code: 'Reset code',
|
||
codePlaceholder: '6-digit code',
|
||
newPassword: 'New password',
|
||
newPasswordPlaceholder: '8+ characters',
|
||
newPasswordHelper: '8–100 characters',
|
||
submit: 'Change password',
|
||
errEmail: 'Please enter your email.',
|
||
errFields: 'Please check the reset code and new password (8+ characters).',
|
||
errCode: 'The reset code is incorrect or expired.',
|
||
errRequest: 'Request failed.',
|
||
errReset: 'Reset failed.',
|
||
},
|
||
home: {
|
||
hello: 'Hello, {{name}}',
|
||
noEvent: 'You are not part of any event — check your invite link or code.',
|
||
progress: 'Progress',
|
||
stepApply: 'Apply',
|
||
stepApprove: 'Approve',
|
||
stepBuild: 'Build',
|
||
stepInspect: 'Inspect',
|
||
actionChecklist: 'Site Checklist',
|
||
actionInspection: 'Site Inspection',
|
||
actionGallery: 'Visualization Gallery',
|
||
memberInternal: 'KINTEX internal account (Hall Manager)',
|
||
memberGeneral: 'General account',
|
||
},
|
||
field: {
|
||
title: 'Site Work',
|
||
guide: 'Site features are available to contractors (checklist) and hall managers (inspection).',
|
||
checklistTitle: 'Site Checklist',
|
||
checklistDesc: 'Check work steps · attach photos · request inspection',
|
||
inspectionTitle: 'Site Inspection',
|
||
inspectionDesc: 'Approved drawing vs site photo · pass/fail decision',
|
||
},
|
||
gallery: {
|
||
infoBar: 'AI-generated images cannot be used for contracts or reviews — drawings are the build standard',
|
||
degraded: 'Cannot reach the server image history; showing samples (degraded).',
|
||
empty: 'No images yet — generate preview photos in the design studio.',
|
||
retry: 'Regenerate',
|
||
studioNote: 'Edit the design studio on desktop',
|
||
notice: 'AI-generated images cannot be used for contracts or reviews (drawings are the standard)',
|
||
},
|
||
more: {
|
||
accountInternal: 'KINTEX internal account (Hall Manager)',
|
||
accountGeneral: 'General account',
|
||
openProfile: 'Open my info',
|
||
apiServer: 'API server',
|
||
serverStatus: 'Server status',
|
||
statusUp: 'Healthy (UP)',
|
||
statusDown: 'Unreachable (degraded)',
|
||
signOut: 'Sign out',
|
||
version: 'KINTEX AI Exhibition · v0.1.0',
|
||
},
|
||
profile: {
|
||
sectionInfo: 'My Info',
|
||
sectionEventRoles: 'Event Roles',
|
||
sectionSecurity: 'Account · Security',
|
||
sectionBiometric: 'Biometric Lock',
|
||
sectionNotify: 'Notifications',
|
||
labelName: 'Name',
|
||
labelUserId: 'User ID',
|
||
labelGlobalRole: 'Global role',
|
||
labelTenant: 'Venue (tenant)',
|
||
labelType: 'Type',
|
||
typeInternal: 'KINTEX internal (Hall Manager)',
|
||
typeGeneral: 'General account',
|
||
photoChange: 'Change profile photo',
|
||
photoTitle: 'Profile photo',
|
||
photoSelect: 'Choose a photo',
|
||
photoLibrary: 'Library',
|
||
photoCamera: 'Camera',
|
||
photoApply: 'Apply',
|
||
photoApplying: 'Applying…',
|
||
photoCaption: 'Displayed as a circle.',
|
||
photoPending: 'The selected photo is shown on this device only — server sync is in preparation.',
|
||
photoPickerUnavailable: 'Image selection is not available on this device.',
|
||
loadErr: 'Failed to load your info.',
|
||
uploadErr: 'Photo upload failed.',
|
||
otpTitle: 'Two-factor (OTP)',
|
||
otpOnAuth: 'Enabled · Authenticator (OTP)',
|
||
otpOnMethod: 'Enabled · {{method}}',
|
||
otpOff: 'Not set — 2-step authenticator (TOTP) is used at sign in.',
|
||
on: 'On',
|
||
off: 'Off',
|
||
bioTitle: 'Fingerprint · Face lock',
|
||
bioDesc:
|
||
'When on, you re-authenticate with fingerprint or Face when opening My Info. Sign-in 2FA remains unchanged.',
|
||
bioUnsupported:
|
||
'This device does not support biometrics or has no fingerprint/Face enrolled. Enroll biometrics in device settings and try again.',
|
||
bioFailed: 'Biometric authentication failed. Please try again.',
|
||
biometric: 'Biometrics',
|
||
lockTitle: 'Biometric lock',
|
||
lockHint: 'Unlock with fingerprint or Face.',
|
||
notifyDeadline: 'Deadline D-day alerts',
|
||
notifyApproval: 'Approval · inspection alerts',
|
||
notifyPayment: 'Payment · settlement alerts',
|
||
notifyNote: 'Notification settings are saved on this device. Server sync is in preparation.',
|
||
signOut: 'Sign out',
|
||
signOutConfirm: 'Sign out?',
|
||
version: 'KINTEX AI Exhibition · My Info',
|
||
},
|
||
tickets: {
|
||
offline: 'Offline — showing saved tickets',
|
||
badgeNotice: 'Check in with the ticket QR at the venue to switch to a mobile badge',
|
||
footNote: 'Tickets shown are samples — replaced with live data when the ticket backend (M10) is connected.',
|
||
emptyTitle: 'You have no tickets',
|
||
emptyBody: 'Book an entry pass and your tickets will appear here.',
|
||
emptyBtn: 'Book entry pass',
|
||
detailTitle: 'Booking detail · cancel',
|
||
},
|
||
vnav: {
|
||
tabHome: 'Home',
|
||
tabEvents: 'Events',
|
||
tabTickets: 'Tickets',
|
||
tabOnsite: 'On-site',
|
||
tabMy: 'My',
|
||
},
|
||
vhome: {
|
||
hello: 'Welcome, {{name}}',
|
||
subtitle: "Explore today's exhibition with ease",
|
||
noEvent: 'You are not part of any event — book a pass and it will appear here.',
|
||
tileTickets: 'My Tickets',
|
||
tileTicketsDesc: 'Entry QR · badge',
|
||
tileEvents: 'Events',
|
||
tileEventsDesc: 'Notices · schedule',
|
||
tileOnsite: 'On-site',
|
||
tileOnsiteDesc: 'Crowd · parking',
|
||
aiTitle: 'AI Visit Assistant',
|
||
aiDesc: 'Live crowd, parking and notices. Booth search and wayfinding coming soon.',
|
||
},
|
||
vevents: {
|
||
title: 'Events',
|
||
empty: 'You are not part of any event — showing public notices.',
|
||
},
|
||
notices: {
|
||
title: 'Live Notices',
|
||
live: 'LIVE',
|
||
pinned: 'Pinned',
|
||
empty: 'No notices posted.',
|
||
degraded: 'Could not load notices (check connection).',
|
||
cat: {
|
||
URGENT: 'Urgent',
|
||
PROGRAM: 'Program',
|
||
GENERAL: 'General',
|
||
INFO: 'Info',
|
||
},
|
||
},
|
||
onsite: {
|
||
segCongestion: 'Crowd',
|
||
segParking: 'Parking',
|
||
},
|
||
congestion: {
|
||
overall: 'Overall crowd',
|
||
onSite: 'On-site',
|
||
people: '{{n}} people',
|
||
gates: 'Entry gates',
|
||
parking: 'Parking',
|
||
popular: 'Popular areas',
|
||
empty: 'No crowd data to show.',
|
||
degraded: 'Could not load crowd data (check connection).',
|
||
},
|
||
parking: {
|
||
title: 'Parking status',
|
||
empty: 'No parking data.',
|
||
degraded: 'Could not load parking data (check connection).',
|
||
available: '{{n}} free',
|
||
capacity: '{{n}} total',
|
||
rate: '{{n}} KRW/hr',
|
||
daily: 'daily max {{n}} KRW',
|
||
passPrice: '{{n}} KRW',
|
||
buyPass: 'Buy pass',
|
||
myPasses: 'My passes',
|
||
noPasses: 'You have no parking passes.',
|
||
loginRequired: 'Sign in to buy or view parking passes.',
|
||
purchaseTitle: 'Buy parking pass',
|
||
selectLot: 'Parking lot',
|
||
useDate: 'Use date',
|
||
plate: 'Vehicle plate (optional)',
|
||
platePlaceholder: 'e.g. 123가4567',
|
||
plateNote: 'The plate is masked and not stored.',
|
||
payNote: 'Payment is simulated (mock) — no real charge.',
|
||
confirm: 'Buy',
|
||
purchaseErr: 'Failed to buy the parking pass.',
|
||
prevDay: 'Previous day',
|
||
nextDay: 'Next day',
|
||
passStatus: {
|
||
PAID: 'Paid',
|
||
USED: 'Used',
|
||
CANCELLED: 'Cancelled',
|
||
},
|
||
},
|
||
vmy: {
|
||
tickets: 'My Tickets',
|
||
ticketsDesc: 'Entry QR · badge switch',
|
||
parking: 'My Passes',
|
||
parkingDesc: 'Parking status · pre-pass',
|
||
},
|
||
};
|