Files
th-hotel-simple/client/src/i18n/locales/en-US.ts
2026-07-12 14:59:03 +08:00

561 lines
20 KiB
TypeScript

export default {
app: {
name: 'Hotel OMS',
theme: 'Theme',
language: 'Language',
navigationAria: 'Reservation navigation',
healthUp: 'Backend connected',
healthDown: 'Backend offline',
healthChecking: 'Checking',
},
auth: {
loginTitle: 'Sign in',
loginSubtitle: 'Use your system account to enter the TH Hotel reservation workspace.',
username: 'Username',
password: 'Password',
loginSubmit: 'Sign in',
loggingIn: 'Signing in',
loginFailed: 'The username or password is incorrect.',
logout: 'Sign out',
currentUser: 'Current user',
currentHotel: 'Current hotel',
unauthorizedTitle: 'No access',
unauthorizedMessage: 'Your account does not have permission to access this page or action.',
backHome: 'Back to available page',
},
nav: {
orders: 'Order list',
taskQueue: 'Task queue',
sourceMessages: 'Source messages',
systemStatus: 'System status',
orderDetail: 'Order detail',
taskDetail: 'Task detail',
sourceMessageConversation: 'Email conversation',
debugEml: 'Debug EML',
systemSettings: 'System settings',
systemUsers: 'Users',
systemRoles: 'Roles',
systemMenus: 'Menus',
systemHotels: 'Hotels',
systemAudits: 'Admin audits',
},
common: {
loading: 'Loading',
noData: 'No data',
endpointPending: 'Endpoint pending',
endpointMissing: 'Endpoint field pending',
all: 'All',
unknownStatus: 'Unknown status',
unknownTaskType: 'Unknown task type',
unknownTaskSubtype: 'Unknown task subtype',
unknownReadonlyReason: 'Not processable yet',
unknownActorType: 'Unknown actor',
unknownAuditAction: 'Unknown action',
unknownOperation: 'Unknown operation',
previousPage: 'Previous',
nextPage: 'Next',
pageStatus: 'Page {current} / {total}',
pageSize: 'Page size',
},
notFound: {
title: 'Page unavailable',
message: 'The frontend page for this menu or link is not available yet.',
backHome: 'Back to available page',
},
systemAdmin: {
title: 'System settings',
subtitle: 'Maintain users, roles, permissions, menus, and hotel records',
navigationAria: 'System settings navigation',
common: {
keyword: 'Keyword',
viewDetail: 'View detail',
selectRow: 'Select a row to view detail',
create: 'Create',
save: 'Save',
edit: 'Edit',
yes: 'Yes',
no: 'No',
},
status: {
ACTIVE: 'Active',
DISABLED: 'Disabled',
},
users: {
title: 'User filters',
tableTitle: 'Users',
detailTitle: 'User detail',
createTitle: 'Create user',
totalSuffix: 'users',
keywordPlaceholder: 'Username / display name / email',
userStatus: 'User status',
username: 'Username',
initialPassword: 'Initial password',
displayName: 'Display name',
email: 'Email',
phone: 'Phone',
roles: 'Roles',
hotels: 'Authorized hotels',
defaultHotel: 'Default hotel',
saveRoles: 'Save roles',
saveHotels: 'Save hotels',
resetPassword: 'Reset password',
temporaryPassword: 'Temporary password:',
created: 'User created',
columns: {
user: 'User',
status: 'Status',
roles: 'Roles',
defaultHotel: 'Default hotel',
},
},
roles: {
title: 'Role filters',
tableTitle: 'Roles',
detailTitle: 'Role detail',
createTitle: 'Create custom role',
totalSuffix: 'roles',
keywordPlaceholder: 'Role code / role name',
roleStatus: 'Role status',
roleCode: 'Role code',
roleName: 'Role name',
builtinReadonly: 'Built-in roles are maintained by the system bootstrap matrix and cannot be edited here.',
savePermissions: 'Save permissions',
columns: {
role: 'Role',
status: 'Status',
builtin: 'Built-in',
permissions: 'Permissions',
users: 'Users',
},
},
menus: {
title: 'Menu filters',
createTitle: 'Create menu',
editTitle: 'Edit menu',
tableTitle: 'Menus',
totalSuffix: 'menus',
keywordPlaceholder: 'Menu code / name / route',
menuStatus: 'Menu status',
menuCode: 'Menu code',
menuName: 'Menu name',
componentKey: 'Component key',
iconKey: 'Icon key',
columns: {
menu: 'Menu',
route: 'Route',
permission: 'Permission',
visible: 'Visible',
status: 'Status',
sort: 'Sort',
knownRoute: 'Known route',
},
},
hotels: {
title: 'Hotel filters',
createTitle: 'Create hotel',
editTitle: 'Edit hotel',
tableTitle: 'Hotels',
totalSuffix: 'hotels',
keywordPlaceholder: 'Hotel ID / hotel name',
hotelStatus: 'Hotel status',
hotelId: 'Hotel ID',
hotelName: 'Hotel name',
saveStatus: 'Save status',
singleActiveRule: 'Single-hotel mode allows only one ACTIVE hotel. Newly created hotels are disabled by default.',
columns: {
hotel: 'Hotel',
status: 'Status',
timeZone: 'Time zone',
authorizedUsers: 'Authorized users',
sort: 'Sort',
},
},
audits: {
title: 'Audit filters',
tableTitle: 'Admin audit data',
totalSuffix: 'audit records',
targetType: 'Target type',
targetId: 'Target ID',
action: 'Action',
columns: {
action: 'Action',
target: 'Target',
actor: 'Actor',
occurredAt: 'Occurred at',
},
},
},
workbench: {
title: 'Order workbench',
subtitle: 'Review, filter, and handle Reservation order tasks',
filters: 'Filters',
dateRange: 'Date range',
businessKey: 'Business key / temporary code',
orderStatus: 'Order status',
taskStatus: 'Task status',
taskCardType: 'Task card type',
reset: 'Reset',
tableTitle: 'Orders / tasks',
columns: {
businessKey: 'Business key',
orderStatus: 'Order status',
currentTask: 'Current task',
taskStatus: 'Task status',
updatedAt: 'Last updated',
operation: 'Action',
},
view: 'View',
totalPrefix: 'Total',
totalSuffix: 'task leads',
},
orderList: {
title: 'Order list',
subtitle: 'Review Reservation work by order',
keyword: 'Group Code / Confirmation No.',
keywordPlaceholder: 'Group code / confirmation no.',
groupCode: 'Group code',
groupCodePlaceholder: 'Enter group code',
confirmationNumber: 'Confirmation no.',
confirmationNumberPlaceholder: 'Enter confirmation no.',
tableTitle: 'Order data',
totalSuffix: 'orders',
viewDetail: 'View detail',
continueTask: 'Continue task',
noOpenTask: 'No open task',
endpointPending: 'The order list endpoint is pending backend implementation. No fixture data is shown.',
columns: {
order: 'Order',
status: 'Status',
openTasks: 'Open tasks',
createdAt: 'Created at',
},
},
order: {
summary: 'Order summary',
taskQueue: 'Order task queue',
sourceMessage: 'Source message',
businessKeySource: 'Business key source',
updatedAt: 'Last updated',
guestName: 'Guest',
arrivalDate: 'Arrival date',
roomType: 'Room type',
amount: 'Amount',
openTask: 'Handle task',
groupCode: 'Group Code',
confirmationNumber: 'Confirmation No.',
temporaryOrderNo: 'Temporary order no.',
blockCode: 'Block Code',
createdAt: 'Created at',
conversationMessageCount: 'Conversation messages',
sourceSummaryPending: 'Source email summary fields for the order task timeline are pending backend support. Open a task for available source details.',
},
taskList: {
title: 'Task list',
subtitle: 'Review Reservation work by task queue',
keyword: 'Order / email keyword',
keywordPlaceholder: 'Order no. / email keyword',
taskType: 'Task type',
taskSubtype: 'Task subtype',
tableTitle: 'Task data',
totalSuffix: 'tasks',
noSourceSubject: 'No source subject',
canProcess: 'Processable',
cannotProcess: 'Not processable',
queueParticipation: 'Queue participation',
queueAll: 'All queue states',
queueIncluded: 'In queue',
queueExcluded: 'Not in queue',
viewTask: 'View task',
viewOrder: 'View order',
viewConversation: 'View email conversation',
sourceOnlyOrderLabel: 'Source message only',
hiddenTechnicalOrder: 'No visible order',
columns: {
task: 'Task',
order: 'Order',
card: 'Task card',
status: 'Status',
source: 'Source email',
queue: 'Queue',
},
},
task: {
title: 'Task card',
fieldContract: 'Field contract',
evidence: 'Evidence',
saveDraft: 'Save draft',
confirm: 'Confirm task',
blocked: 'Blocked',
readOnly: 'Read only',
operaOperations: 'OPERA simulation',
audits: 'Audit timeline',
noOperations: 'OPERA simulation operations are created after confirmation.',
noAudits: 'No audit records yet.',
execute: 'Execute',
retry: 'Retry',
simulateFailure: 'Simulate failure',
fieldNotes: 'Field notes',
emptyValue: 'Empty',
attachments: 'Attachments',
fieldAreaFallback: 'Basic information',
savedLocally: 'Draft saved',
confirmedLocally: 'Task confirmed',
validationFailed: 'Fix field errors first',
validation: {
required: '{field} is required',
enum: '{field} must use one of the allowed options',
date: '{field} must use YYYY-MM-DD',
number: '{field} must be a number',
},
viewOrder: 'View order',
viewConversation: 'View email conversation',
parentGroup: 'Parent Group',
sourceMessageId: 'Source message ID',
sourceSubject: 'Source subject',
sourceSender: 'Sender',
sourceReceivedAt: 'Received at',
sourceSummaryPending: 'Source email summary fields are pending backend support',
sourceOnlyResult: 'Source message entry result',
sourceOnlyReadonly: 'This task only shows the source message entry result. It does not enter order handling, field editing, or OPERA operations.',
sourceOnlyNoOpera: 'This task type does not involve OPERA operations.',
routeInfo: 'Route and processing',
resultType: 'Result type',
aiTaskType: 'AI task type',
systemTaskType: 'System task type',
taskCardType: 'Task card type',
taskSubtype: 'Task subtype',
routeCode: 'Route code',
systemProcessCategory: 'System process category',
reviewStatus: 'Review status',
entryResultCode: 'Entry result code',
entryResultMeaning: 'Result meaning',
entryResultDescription: 'Result description',
entryResultSourceMessageId: 'Result source message ID',
rawAnswer: 'SuperAgent raw answer',
agentAssessment: 'AI raw fields',
sourceNotification: 'Source message notification',
manualReviewData: 'Manual review data',
manualReviewEvidence: 'Manual review evidence',
manualReviewEvidenceFallback: 'Confirm the Parent Group identity from the source email and candidates.',
manualReviewMissingFields: 'Missing fields',
manualReviewBlockingPoints: 'Blocking points',
manualReviewConflictingPoints: 'Conflicting points',
manualReviewSuggestedActions: 'Suggested actions',
manualReviewEvidenceToCheck: 'Evidence to check',
parentIdentityCandidates: 'Parent Group candidates',
parentIdentityCandidate: 'Candidate',
noParentIdentityCandidates: 'No Parent Group candidates yet. Backend should expose context_used.parent_identity_candidates.',
adapterContractErrors: 'Adapter contract errors',
unhandledIntents: 'Unhandled intents',
noSourceOnlyResult: 'No source message entry result is available.',
manualResolution: {
title: 'Manual review resolution',
description: 'Fill missing fields on the original task card. The backend validates and unblocks the task after submission.',
pendingStatus: 'Pending review',
resolvedTitle: 'Review resolved',
reasonCode: 'Reason code',
reviewInstruction: 'Review instruction',
confirmedOrderId: 'Confirmed order ID',
fieldValuePlaceholder: 'Enter the confirmed value',
noSupportedMissingFields: 'The current missing fields are not supported for frontend resolution yet. Confirm field mapping with backend.',
fieldRequired: 'Fill the missing field values and confirmed order ID',
reason: 'Resolution note',
reasonPlaceholder: 'Optional note for the manual decision',
submit: 'Submit review result',
succeeded: 'Manual review resolved. Task status has been refreshed.',
},
manualConversion: {
title: 'Manual conversion',
description: 'Convert a Fallback / manual review task into a processable reservation task.',
targetTaskType: 'Target task type',
targetOrder: 'Target order',
targetOrderHelp: 'Update or cancel tasks must select a non-deleted order.',
targetOrderKeyword: 'Target order search',
targetOrderKeywordPlaceholder: 'Group code, confirmation no., or order keyword',
searchTargetOrders: 'Search orders',
noTargetOrderCandidates: 'Enter a keyword and search for target orders',
orderDeletedDisabled: 'Deleted orders cannot be selected',
newBookingHint: 'New booking conversion does not require a target order; the backend will reassign by task context.',
reason: 'Reason',
reasonPlaceholder: 'Optional note for the manual decision',
submit: 'Convert task',
targetOrderRequired: 'Select a target order',
succeeded: 'Manual conversion completed: {taskType}, target order {orderId}',
orderId: 'Order ID',
},
},
conversation: {
title: 'Email conversation detail',
subtitle: 'Review all messages in the source email conversation',
endpointPending: 'The email conversation detail endpoint is pending backend implementation. No fixture data is shown.',
subject: 'Conversation subject',
messageCount: 'Messages',
channel: 'Channel',
firstReceivedAt: 'First received',
lastReceivedAt: 'Last received',
emptyBody: 'Empty message body',
attachments: 'Attachments / inline images',
unnamedAttachment: 'Unnamed attachment',
relatedOrders: 'Related orders',
relatedTasks: 'Related tasks',
},
debugEml: {
title: 'Debug EML upload',
subtitle: 'Upload one .eml email and review SourceMessage and SuperAgent debug results',
uploadConfig: 'Upload configuration',
hotelId: 'Hotel ID',
debugUploadKey: 'Debug upload key',
runLabel: 'Run label',
emlFile: '.eml file',
submit: 'Submit debug run',
submitting: 'Waiting for SuperAgent',
executionStatus: 'Execution status',
status: 'Status',
debugRunId: 'Debug run ID',
backendStatus: 'Backend status',
backendMessage: 'Backend message',
waitingSuperAgent: 'Parsing the email and waiting for SuperAgent',
systemStages: 'System stages',
superAgentTrace: 'SuperAgent Trace',
traceToolName: 'Tool',
traceInputSummary: 'Input summary',
traceOutputSummary: 'Output summary',
traceStatus: 'Status',
traceTime: 'Time',
sourceTrace: 'SourceMessage trace',
sourceMessageId: 'SourceMessage ID',
sourceProvider: 'Source provider',
externalMessageId: 'External message ID',
externalConversationId: 'External conversation ID',
mailPreview: 'Email preview',
noSafeHtml: 'No safe HTML body is available',
uploadedMedia: 'Uploaded media',
unnamedMedia: 'Unnamed media',
rawHtml: 'Raw processed HTML',
superAgentResult: 'SuperAgent result',
superAgentSessionId: 'SuperAgent session ID',
superAgentRunId: 'SuperAgent run ID',
parsedJson: 'Parsed JSON',
rawAnswer: 'Raw answer',
warnings: 'Warnings',
debugPayload: 'Debug payload',
statuses: {
idle: 'Idle',
uploading: 'Running',
succeeded: 'Succeeded',
failed: 'Failed',
},
errors: {
REQUEST_FIELD_REQUIRED: 'Required fields are missing. Check hotel ID, file, or request parameters',
EML_FILE_REQUIRED: 'Choose an .eml email file',
EML_FILE_TOO_LARGE: 'The email file exceeds the backend limit',
INVALID_FILE_TYPE: 'Only .eml email files are supported',
DEBUG_UPLOAD_KEY_INVALID: 'The debug upload key is missing or invalid',
EML_PARSE_FAILED: 'The email file could not be parsed',
OSS_UPLOAD_FAILED: 'OSS upload failed. Contact backend support',
SUPERAGENT_OPEN_API_FAILED: 'SuperAgent call failed. SourceMessage may already be captured',
DEBUG_EML_RUN_FAILED: 'Debug EML run failed internally',
UNKNOWN: 'Debug EML upload failed',
},
},
status: {
TEMPORARY: 'Temporary',
ACTIVE: 'Active',
ENDED: 'Ended',
LOGIC_DELETED: 'Deleted',
PENDING_CONFIRM: 'Pending confirmation',
READY: 'Ready',
EXECUTING: 'Executing',
FAILED: 'Failed',
COMPLETED: 'Completed',
PENDING: 'Pending',
SUCCEEDED: 'Succeeded',
BLOCKED: 'Blocked',
SKIPPED: 'Skipped',
},
cardType: {
NEW_BOOKING: 'New booking',
UPDATE_BOOKING: 'Update booking',
CANCEL_BOOKING: 'Cancel booking',
CANCEL_ALLOTMENT: 'Cancel Parent Group allotment',
VOUCHER: 'Voucher',
ROOMING_LIST: 'Rooming list',
AMEND_GROUP_CODE: 'Amend group code',
TRACE_NOTE: 'Trace / notes',
TA_RECORD: 'TA record',
MESSAGE_NOTIFICATION: 'Message notification',
INFORMATIONAL_MESSAGE: 'Message notification (legacy)',
SOURCE_MESSAGE_REVIEW_NOTIFICATION: 'Source message notification',
SOURCE_MESSAGE_ONLY: 'Source message only',
MANUAL_REVIEW: 'Manual review',
FALLBACK_REVIEW: 'Manual review',
},
taskSubtype: {
NEW_BOOKING: 'New booking',
UPDATE_BOOKING: 'Update booking',
CANCEL_BOOKING: 'Cancel booking',
RATE_CHANGE: 'Rate change',
UPDATE_STAY_DATES: 'Update stay dates',
UPDATE_ROOM_TYPE: 'Update room type',
UPDATE_FIX_CHARGE: 'Update fixed charge',
CANCEL_ALLOTMENT_CONTROL_BLOCK: 'Cancel Parent Group control block',
NEW_GROUP_BLOCK: 'New group block',
NEW_FIT_RESERVATION: 'New FIT reservation',
MANUAL_REVIEW: 'Manual review',
S10: 'Pure informational email (S10)',
S99: 'Business material package unavailable (S99)',
S000: 'Pure informational email',
S999: 'Business material package unavailable',
},
resultType: {
NORMAL_TASK: 'Normal task',
MANUAL_REVIEW: 'Manual review',
SOURCE_MESSAGE_REVIEW_NOTIFICATION: 'Source message notification',
ADAPTER_CONTRACT_ERROR: 'Adapter contract error',
UNHANDLED_CURRENT_INTENT: 'Unhandled intent',
},
systemProcessCategory: {
BUSINESS_TASK: 'Business task',
SOURCE_MESSAGE_NOTIFICATION: 'Source message notification',
ADAPTER_CONTRACT_ERROR: 'Adapter contract error',
UNHANDLED_CURRENT_INTENT: 'Unhandled intent',
},
readonlyReason: {
PROCESSABLE: 'Processable',
PREVIOUS_TASK_NOT_FINISHED: 'Previous task is not finished',
TASK_FINISHED: 'Task finished',
TASK_READ_ONLY: 'Task is read only',
ORDER_CLOSED: 'Order closed',
QUEUE_EXCLUDED: 'Not in queue',
BLOCKED: 'Blocked',
MANUAL_REVIEW_REQUIRED: 'Manual review required',
},
actorType: {
USER: 'User',
SYSTEM: 'System',
AI: 'AI',
AGENT: 'Agent',
BACKEND: 'Backend service',
},
auditAction: {
TASK_CREATED: 'Task created',
TASK_LOADED: 'Task loaded',
TASK_CONFIRMED: 'Task confirmed',
TASK_CONFIRM: 'Task confirmed',
DRAFT_SAVED: 'Draft saved',
TASK_UPDATED: 'Task updated',
OPERA_EXECUTED: 'OPERA executed',
OPERA_RETRIED: 'OPERA retried',
MANUAL_REVIEW_CREATED: 'Manual review created',
MANUAL_REVIEW_CONVERT: 'Manual conversion',
MANUAL_REVIEW_RESOLVED: 'Manual review resolved',
},
operaOperation: {
CREATE_RESERVATION: 'Create reservation',
UPDATE_RESERVATION: 'Update reservation',
CANCEL_RESERVATION: 'Cancel reservation',
UPDATE_ROOMING_LIST: 'Update rooming list',
ADD_TRACE_NOTE: 'Add trace note',
},
}