Files
th-hotel-simple/client/src/i18n/locales/en-US.ts

1066 lines
42 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: 'Reservation items',
manualInvoice: 'Manual invoice',
roomingList: 'Rooming list',
sourceMessages: 'Source messages',
systemStatus: 'System status',
orderDetail: 'Order overview',
taskDetail: 'Reservation item handling',
sourceMessageConversation: 'Email conversation',
sourceNotificationDetail: 'Source notification detail',
debugEml: 'Debug EML',
systemSettings: 'System settings',
systemUsers: 'Users',
systemRoles: 'Roles',
systemMenus: 'Menus',
systemHotels: 'Hotels',
systemReservationCatalogs: 'Reservation catalogs',
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',
refresh: 'Refresh',
saving: 'Saving',
cancel: 'Cancel',
},
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',
managementTitle: 'Menu management',
managementHint: 'Maintain sidebar menu hierarchy, order, visibility, and permission entry points.',
createTitle: 'Create menu',
editTitle: 'Edit menu',
tableTitle: 'Menus',
totalSuffix: 'menus',
keywordPlaceholder: 'Menu code / name / route',
menuStatus: 'Menu status',
visibleOnly: 'Visible only',
treeWarningTitle: 'Menu tree has configuration warnings',
treeWarningHint: 'The backend returned the menu tree, but these items need administrator review.',
treeTitle: 'Menu tree',
treeDirty: 'Tree changes are not saved',
treeDirtyActionBlocked: 'Save the menu tree before continuing.',
treeWarningSaveBlocked: 'Resolve the menu tree warnings and confirm parent relationships before saving the tree.',
saveTreeOrder: 'Save tree',
menuCode: 'Menu code',
menuName: 'Menu name',
parentMenu: 'Parent menu',
rootMenu: 'Root menu',
componentKey: 'Component key',
iconKey: 'Icon key',
unknownRoute: 'Unknown route',
unknownRouteHint: 'This route is not recognized by the frontend and may open an unavailable page.',
permissionLoadFailed: 'Permission list failed to load. Permission selection and menu config saving are temporarily unavailable.',
moveUp: 'Move up',
moveDown: 'Move down',
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',
},
},
catalogs: {
title: 'Reservation V4 catalog management',
subtitle: 'Maintain Account, Room Type, and Rate Code catalogs for V4 task card lookup and backend confirmation validation.',
typeNavigation: 'Reservation V4 catalog type',
filters: 'Catalog filters',
hotel: 'Hotel',
defaultHotel: 'Current default hotel',
keywordPlaceholder: 'Code / name',
catalogStatus: 'Catalog status',
createTitle: 'Create {type}',
createHint: 'V1 catalogs are maintained by system admins and become active after saving.',
createAction: 'Create catalog',
createSucceeded: 'Catalog created',
statusUpdated: 'Catalog status updated',
disabledLookupNotice: 'Disabled catalog items no longer appear in ordinary V4 task card lookup; confirmed historical cards are not rolled back.',
defaultActiveHint: 'New items are active by default. Account V1 uses fixed Market=LEISURE and Source=TRAVEL_AGENT.',
hotelRequired: 'Select a hotel first.',
tableTitle: '{type} data',
totalSuffix: 'catalog items',
accountCode: 'Account Code',
accountName: 'Account name',
marketCode: 'Market Code',
sourceCode: 'Source Code',
externalAccountId: 'External Account ID',
code: 'Code',
displayName: 'Display name',
externalId: 'External catalog ID',
sortOrder: 'Sort order',
catalogVersion: 'Catalog version',
metadataJson: 'Metadata JSON',
enableAction: 'Enable',
disableAction: 'Disable',
types: {
accounts: 'Account',
roomTypes: 'Room Type',
rateCodes: 'Rate Code',
},
columns: {
catalog: 'Catalog',
status: 'Status',
marketSource: 'Market / Source',
source: 'Source / version',
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 work',
createdAt: 'Created at',
},
},
manualInvoice: {
title: 'Manual invoice',
createTitle: 'Create Invoice',
subtitle: 'Generate a Proforma Invoice PDF by entering fields manually without an order or task.',
sourceBadge: 'Manual generation',
independentHint: 'This V1 page is not linked to an order or task. The backend records generation and audit data.',
documentSection: 'Document',
recipientSection: 'Recipient',
bookingSection: 'Booking',
chargesSection: 'Charges',
previewSection: 'Amount preview',
resultSection: 'Generation result',
invoiceDate: 'Invoice date',
bookingDate: 'Booking date',
dueDate: 'Due date',
companySeed: 'Select company',
contactSeed: 'Select attention',
selectCompany: 'Select company',
selectContact: 'Select attention',
company: 'Company',
attention: 'Attention',
address: 'Address',
companyInputPlaceholder: 'Enter company',
attentionInputPlaceholder: 'Enter attention',
addressInputPlaceholder: 'Enter full billing address',
telephone: 'Tel',
email: 'Email',
groupName: 'Group name',
arrivalDate: 'Arrival date',
departureDate: 'Departure date',
roomRateNote: 'Room rate note',
roomRateNotePlaceholder: 'e.g. including BF',
datePlaceholder: 'yyyy-mm-dd',
extraBedRate: 'Extra bed rate',
description: 'Description',
roomType: 'Room type',
quantity: 'Quantity',
rate: 'Rate',
nights: 'Nights',
amount: 'Amount',
subtotal: 'Sub-total',
vat: 'VAT 7%',
total: 'Total',
addCharge: 'Add row',
removeCharge: 'Remove',
chargeLineLabel: 'Row {index}',
removeChargeLineAria: 'Remove row {index}',
maxChargesReached: 'V1 supports up to 10 charge lines.',
previewDisclaimer: 'The frontend only previews amounts. Backend totals are authoritative.',
manualOverrideHint: 'Selecting company and attention fills contact details; every text field remains editable.',
generate: 'Confirm and generate PDF',
generating: 'Generating',
openPdf: 'Open PDF',
downloadPdf: 'Download PDF',
downloadingPdf: 'Downloading',
downloadFallback: 'The browser could not download the PDF directly, so the PDF page was opened instead.',
technicalDetails: 'Technical details',
generationId: 'Generation ID',
generationStatus: 'Status',
pdfUrl: 'PDF URL',
hotelId: 'Hotel ID',
templateCode: 'Template',
createdAt: 'Created at',
noPdfUrl: 'The backend did not return a PDF URL.',
backendTotals: 'Backend totals',
validationTitle: 'Please fix the form',
fieldErrors: {
required: 'Required',
invalidEmail: 'Invalid email',
dateOrder: 'Invalid date order',
invalidNumber: 'Invalid number',
positiveNumber: 'Must be greater than 0',
nonNegativeNumber: 'Cannot be less than 0',
},
statuses: {
SUCCEEDED: 'Generated',
GENERATED: 'Generated',
FAILED: 'Failed',
PROCESSING: 'Generating',
},
errors: {
FRONTEND_VALIDATION: 'Form validation failed. Check required fields and charge lines.',
RESERVATION_INVOICE_VALIDATION_FAILED: 'Invoice field validation failed. Please check the form.',
RESERVATION_INVOICE_CONTEXT_MISMATCH: 'The order or task context does not match.',
DOCUMENT_CONVERSION_FAILED: 'PDF generation failed. Please retry or contact an administrator.',
DOCUMENT_CONVERSION_TIMEOUT: 'PDF generation timed out. Please retry later.',
AUTH_401: 'Your session has expired. Please sign in again.',
AUTH_403: 'Your account does not have manual invoice permission.',
UNKNOWN: 'Generation failed. Please retry later.',
requiredFields: 'Complete dates, recipient, booking details, and at least one valid charge line.',
invalidEmail: 'Email format is invalid.',
dueDateBeforeBookingDate: 'Due date cannot be earlier than booking date.',
departureBeforeArrival: 'Departure date must be later than arrival date.',
invalidNumber: 'Invalid number. Check amount, quantity, or nights fields.',
extraBedNegative: 'Extra bed rate cannot be less than 0.',
chargePositive: 'Quantity and nights must be greater than 0.',
chargeRateNonNegative: 'Rate cannot be less than 0.',
},
},
roomingList: {
eyebrow: 'Reservation tool',
title: 'Generate Rooming List Excel',
subtitle:
'Upload the travel group list, enter people per room, room type, payment type and nationality. Arrival and departure are derived from the source travel dates.',
currentHotel: 'Current hotel',
sourceSection: 'Source list and required fields',
targetSection: 'Target Excel defaults',
sourceFile: 'Source Excel file',
sourceFileHint: 'Supports .xls / .xlsx. The frontend does not read or log guest list content.',
noFile: 'Choose a .xls / .xlsx file',
peoplePerRoom: 'People per room',
arrival: 'Arrival',
departure: 'Departure',
roomType: 'Room type',
roomTypePlaceholder: 'e.g. DLX / TWN',
titleColumn: 'Title',
rateCode: 'Rate Code',
adults: 'Adults',
children: 'Children',
paymentType: 'Payment Type',
paymentTypeBtqr: 'BTQR',
paymentTypeCa: 'CA',
vip: 'VIP',
nationality: 'Nationality',
nationalityPlaceholder: 'Select nationality',
nationalityKr: 'KR',
nationalityChn: 'CHN',
email: 'Email',
idType: 'ID Type',
idNumber: 'ID Number',
generate: 'Generate and download Excel',
generating: 'Generating',
validationTitle: 'Please fix the form',
resultSuccess: 'Generation result',
resultDownloaded: 'Excel has been generated and the browser download was triggered.',
downloadedFile: 'Downloaded file',
fieldErrors: {
fileRequired: 'Choose a source Excel file.',
fileType: 'Only .xls / .xlsx files are supported.',
positiveInteger: 'People per room must be greater than 0.',
nonNegativeInteger: 'Must be 0 or a positive integer.',
arrivalRequired: 'Enter arrival date.',
departureRequired: 'Enter departure date.',
dateFormat: 'Date format must be yyyy-MM-dd.',
departureAfterArrival: 'Departure must be later than arrival.',
roomTypeRequired: 'Enter room type.',
paymentTypeRequired: 'Select payment type.',
paymentTypeAllowed: 'Only BTQR or CA are currently allowed.',
nationalityRequired: 'Select nationality.',
nationalityAllowed: 'Only KR or CHN are currently allowed.',
invalidEmail: 'Invalid email.',
},
errors: {
FRONTEND_VALIDATION: 'Form validation failed. Check required fields.',
ROOMING_LIST_VALIDATION_FAILED: 'Rooming List field validation failed. Please check the form.',
ROOMING_LIST_SOURCE_FILE_INVALID: 'The source list is invalid. Check the Excel headers and file format.',
FRONTEND_PERMISSION_DENIED: 'Your account does not have Rooming List generation permission.',
HOTEL_ACCESS_DENIED: 'Your account cannot access the selected hotel.',
AUTH_TOKEN_REQUIRED: 'Please sign in before generating a Rooming List.',
AUTH_SESSION_INVALID: 'Your session has expired. Please sign in again.',
UNKNOWN: 'Rooming List generation failed. Please retry later.',
},
},
order: {
summary: 'Order summary',
taskQueue: 'Reservation items for this order',
v4TaskTimeline: 'Processing records',
v4TaskTimelineEmpty: 'No processing records.',
v4TaskTimelineHint: 'Shows source-email processing records and item status summaries only. Complete actions in the reservation item page.',
v4OverviewTitle: 'Order information overview',
v4OverviewSubtitle: 'Derived from confirmed items only, not from unconfirmed suggestions.',
v4OverviewEmpty: 'No confirmed order information yet.',
accountCode: 'Account Code',
accountName: 'Account Name',
marketCode: 'Market Code',
sourceCode: 'Source Code',
departureDate: 'Departure date',
rateCode: 'Rate Code',
roomItems: 'Confirmed room items',
latestConfirmedAt: 'Latest confirmed at',
traceCardStatus: 'Follow-up item status',
roomingListCardStatus: 'Rooming list item status',
paymentCardStatus: 'Payment voucher status',
nextV4ActionTitle: 'Next action',
nextV4ActionSubtitle: 'The order overview only links to the handling page; it does not confirm, review, or edit items.',
nextV4ActionType: 'Next step',
nextV4ActionStatus: 'Handling status',
nextV4CardId: 'Item ID',
openOrderTaskCount: 'Open items',
enterV4Task: 'Open handling page',
nextActionConfirm: 'Confirm item',
nextActionReview: 'Needs review',
nextActionNone: 'No pending item',
nextStep: 'Reservation item',
nextStepConfirm: 'An item needs confirmation',
nextStepReview: 'An item needs review',
nextV4ActionEmpty: 'No next reservation item.',
relatedSourceMessages: 'Related source emails',
relatedSourceMessagesHint: 'Shows headers and conversation summary only. Open the conversation page for full email content.',
relatedSourceMessagesEmpty: 'No related source emails.',
externalConversationId: 'External conversation ID',
latestActivityAt: 'Latest activity',
v4CardsEmpty: 'No item status summaries.',
cardStatusSummary: 'Item status summary',
cardId: 'Item ID',
reviewStatus: 'Review status',
confirmedBy: 'Confirmed by',
confirmedAt: 'Confirmed at',
sourceEventIndex: 'Source email event {index}',
processingRecord: 'Source email processing record',
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: 'Pending reservation items',
subtitle: 'Review reservation items that need confirmation, review, or acknowledgement',
keyword: 'Order / email keyword',
keywordPlaceholder: 'Order no. / email keyword',
taskType: 'Task type',
taskSubtype: 'Task subtype',
tableTitle: 'Reservation items',
totalSuffix: 'items',
noSourceSubject: 'No source subject',
sourceReceivedAt: 'Source time',
businessStatus: 'Item status',
filterPending: 'Pending',
filterReview: 'Needs review',
filterCompleted: 'Completed',
filterSourceNotification: 'Source notification',
noOpenItems: 'No reservation items need handling',
noPendingItems: 'No reservation items are pending confirmation',
noReviewItems: 'No reservation items need review',
noCompletedItems: 'No completed reservation items',
noSourceNotifications: 'No source notifications',
itemType: 'Work item type',
itemTypeOrderTask: 'Reservation item',
itemTypeSourceNotification: 'Source notification',
orderTaskStatus: 'Order task status',
cardStatus: 'Card status',
orderUnresolved: 'Order ownership pending',
sourceNotificationNoOrder: 'No linked order',
sourceNotificationNoOrderHint: 'This email is not linked to an order. Review the email content.',
cardCountsTotal: '{total} items',
cardCountsPending: 'Pending {count}',
cardCountsReview: 'Review {count}',
cardCountsConfirmed: 'Confirmed {count}',
viewNotification: 'View notification',
canProcess: 'Processable',
cannotProcess: 'Not processable',
queueParticipation: 'Queue participation',
queueAll: 'All queue states',
queueIncluded: 'In queue',
queueExcluded: 'Not in queue',
viewTask: 'Handle item',
viewOrder: 'View order',
viewConversation: 'View email conversation',
sourceOnlyOrderLabel: 'Source message only',
hiddenTechnicalOrder: 'No visible order',
columns: {
item: 'Item type',
task: 'Task',
order: 'Order',
card: 'Item',
status: 'Status',
source: 'Source email',
cards: 'Item progress',
queue: 'Queue',
},
},
taskV4: {
title: 'Reservation item handling',
subtitle: 'Handle the current reservation item from the source email.',
orderTaskSummary: 'Item summary',
handlingDesk: 'Handling overview',
handlingDeskHint: 'Check the order clue and source, then confirm each item.',
sourceEmail: 'Source email',
sourceSender: 'Sender',
sourceReceivedAt: 'Received at',
cardProgress: 'Card progress',
totalCards: 'Total',
pendingCards: 'Pending',
reviewCards: 'Review',
readonlyCards: 'View only',
confirmedCards: 'Confirmed',
orderTaskId: 'Item ID',
orderReference: 'Order reference',
targetBookingType: 'Booking type',
targetLocator: 'Order clue',
targetResolutionStatus: 'Order ownership',
cardCounts: 'Item counts',
sourceMessageCard: 'Source email',
basicInformationCard: 'Reservation basics',
roomInformationCard: 'Room and dates',
paymentCard: 'Payment voucher',
businessCards: 'Reservation items',
adapterContractErrors: 'Adapter contract diagnostics',
noAdapterContractErrors: 'No adapter contract errors.',
noBusinessCards: 'No reservation items to handle.',
displayPayload: 'Display summary',
rawCardPayload: 'Safe card summary',
readonlyReason: 'Read-only reason',
blockedReason: 'Blocked reason',
bookingTypeGroup: 'Group booking',
bookingTypeFit: 'FIT booking',
bookingTypeUnknown: 'Booking type pending',
targetResolved: 'Confirmed',
targetUnresolved: 'Pending confirmation',
targetPending: 'Pending confirmation',
confirmCard: 'Confirm card',
confirmingCard: 'Confirming',
resolveReview: 'Submit review',
resolvingReview: 'Submitting',
reviewReason: 'Review note',
reviewReasonPlaceholder: 'Optional note for the manual decision',
confirmedOrderId: 'Confirmed order ID',
confirmedOrderIdPlaceholder: 'Enter when order ownership is unresolved',
confirmedOrderRequired: 'Order ownership is unresolved. Enter the confirmed order ID first.',
cardConfirmed: 'Card confirmed and detail refreshed.',
reviewResolved: 'Review submitted and detail refreshed.',
validationFailed: 'Fix current-card field errors first.',
fieldValidation: {
required: '{field} is required',
positiveInteger: '{field} must be an integer greater than 0',
},
fieldLabels: {
basicInformation: {
accountCode: 'Account Code',
marketCode: 'Market Code',
sourceCode: 'Source Code',
},
},
roomInformation: {
noDisplayModel: 'Room and date information is temporarily unavailable. Refresh later or contact an administrator.',
eventType: {
NEW_BOOKING: 'New booking',
UPDATE_BOOKING: 'Booking update',
CANCEL_BOOKING: 'Booking cancellation',
unknown: 'Reservation item',
},
emptyValues: 'No fields to display.',
changeSummary: 'Change summary',
currentValues: 'Current values',
proposedValues: 'Proposed values',
finalValues: 'Final values',
groupBlockName: 'Group block name',
fitName: 'FIT name',
arrivalDate: 'Arrival date',
departureDate: 'Departure date',
nights: 'Nights',
rateCode: 'Rate Code',
breakfastIncluded: 'Breakfast included',
groupBookingStatus: 'Group booking status',
blockId: 'Block ID',
confirmationNumber: 'Confirmation no.',
roomItems: 'Room items',
roomTypeCode: 'Room type code',
roomCount: 'Room count',
yes: 'Yes',
no: 'No',
},
paymentAttachments: {
title: 'Payment voucher attachments',
loading: 'Loading attachment preview access...',
loadFailed: 'Attachment preview is unavailable right now. Check source email permission and retry.',
empty: 'No payment voucher attachments.',
openPreview: 'Open image preview',
closePreview: 'Close preview',
download: 'Download',
previewUnavailable: 'Preview unavailable',
downloadUnavailable: 'Download unavailable',
noMatchedMedia: 'No matching attachment was found in the current email.',
missingSourceMessage: 'Source email is missing, so preview and download are unavailable.',
unavailableReason: 'Unavailable reason: {reason}',
fileMeta: '{type} · {size}',
},
roomingList: {
title: 'Rooming list item',
targetOrder: 'Target order',
unboundOrder: 'No visible order is bound yet',
description: 'The current source message contains a Rooming List item that needs manual handling.',
confirmHint: 'This first version only confirms that the item has been handled manually. Guest details and attachment content are not displayed or processed here.',
},
trace: {
title: 'Follow-up item',
itemLabel: 'Item {index}',
generalTitle: 'General note',
extraBedTitle: 'Extra bed note',
action: 'Fixed action',
textLabel: 'Follow-up note',
department: 'Department',
targetRoomType: 'Target room type',
extraBedRoomCount: 'Extra bed room count',
},
lookup: {
loading: 'Loading options',
empty: 'No options are available. Contact an administrator to maintain the choices.',
stale: 'This catalog is a stale snapshot. You can still select from it; backend validation remains final.',
warning: 'Catalog note: {warning}',
error: 'Options are temporarily unavailable. Refresh and retry.',
accountDerived: 'Selecting this account fills Market: {market} / Source: {source}.',
currentNotInCatalog: 'Original value "{value}" is not in the current options. Select again.',
},
sourceMessage: {
subject: 'Subject',
sender: 'Sender',
receivedAt: 'Received at',
conversationCount: 'Conversation messages',
attachments: 'Attachments',
excerpt: 'Email excerpt',
body: 'Current email body',
bodyCollapsed: 'The email body is folded. Expand to read the current trigger email.',
bodyLoading: 'Loading current email body...',
bodyLoadFailed: 'Current email body cannot be loaded right now. Open the email conversation to view it.',
noBody: 'No current email body.',
showFullBody: 'Show full body',
collapseBody: 'Collapse body',
noExcerpt: 'No email excerpt',
noAttachments: 'No attachments',
},
field: {
required: 'Required',
readonly: 'Read only',
empty: 'Empty',
hidden: 'Sensitive content hidden',
selectPlaceholder: 'Select',
datePlaceholder: 'yyyy-mm-dd',
},
error: {
loadFailed: 'Failed to load the reservation item handling page.',
actionFailed: 'Action failed. Check backend response details.',
},
},
sourceNotification: {
title: 'Source notification detail',
subtitle: 'S10/S99 read-only source message notification. It does not enter order or task-card handling.',
summary: 'Notification summary',
notificationId: 'Notification ID',
routeCode: 'Route code',
status: 'Notification status',
sourceMessage: 'Source email',
ackReason: 'Handling note',
ackReasonPlaceholder: 'Optional note for acknowledging or handling this notification',
ack: 'Acknowledge',
acking: 'Acknowledging',
acked: 'Acknowledged and detail refreshed.',
noBusinessEntry: 'This notification has no linked order, business card, field editing, review, or OPERA action.',
error: {
loadFailed: 'Failed to load source notification detail.',
ackFailed: 'Failed to acknowledge. Check backend response details.',
},
},
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',
sourceEmailPreview: 'Source email preview',
sourceEmailExcerpt: 'Email excerpt',
sourceEmailAttachments: 'Attachments',
sourceEmailNoExcerpt: 'No email excerpt',
sourceEmailNoAttachments: 'No attachments',
sourceEmailFullConversation: 'View full email conversation',
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.',
unopenedFieldsTitle: 'Fields not opened for editing',
fieldBackendUnopened: 'The backend has not opened this field for editing.',
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',
bookingExcelExtractions: 'Booking Excel attachment extraction',
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',
OPEN: 'Open',
READONLY: 'Read only',
REVIEW_REQUIRED: 'Review required',
CONFIRMED: 'Confirmed',
ACK_REQUIRED: 'Pending acknowledgement',
ACKED: 'Acknowledged',
},
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',
SOURCE_MESSAGE_DISPLAY: 'Source message display card',
SOURCE_MESSAGE_NOTIFICATION: 'Source message notification card',
BASIC_INFORMATION: 'Basic Information card',
ROOM_INFORMATION: 'Room Information card',
TRACE_RESERVATION_NOTES: 'Trace notes card',
PAYMENT: 'Payment card',
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',
},
}