- app.json: version 0.2.0 / versionCode 2, drop expo-screen-capture plugin - add lib/i18n (ko/en/ja/zh), lib/roleTrack, LanguageContext + LanguageSelector - profile/security hardening across screens (login/register/forgot/profile/tabs) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
205 lines
7.6 KiB
TypeScript
205 lines
7.6 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',
|
||
},
|
||
};
|