* feat(scheduled-messages): add predefined time shortcuts for scheduling
Replace the manual date/time picker with predefined day and time period
chip selectors for faster message scheduling.
Day shortcuts: Today, Tomorrow, This weekend (Sat), Next week (Mon),
Next weekend (next Sat), Next month (1st), Custom (date picker fallback).
Time period shortcuts: Morning (8:00), Afternoon (13:00), Evening (18:00).
Each day chip shows the corresponding date (dd/MM) in secondary color.
Past time periods for 'Today' are automatically disabled.
The existing date picker is preserved as the 'Custom' option.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* refactor(scheduled-messages): use dropdown selectors and remove header
Replace chip/button selectors with native <select> dropdowns for day
and time period selection. Remove the 'Date and time to send' header
from the modal since the dropdown labels serve as placeholders.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* fix(scheduled-messages): close datepicker on confirm and click-outside
Removed manual open/close state management and @click.stop that was
blocking click-outside detection. Added confirm prop so the picker
has an explicit OK button and auto-closes properly.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* fix(scheduled-messages): initialize custom mode when editing existing schedule
When editing a scheduled message, the ScheduleDateShortcuts component
now detects the pre-existing datetime and opens in Custom mode with
the datepicker pre-filled, preserving the original date and time.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* fix(scheduled-messages): use locale-aware date format in shortcuts
Replace hardcoded dd/MM format with Intl.DateTimeFormat using
navigator.language, matching the existing locale-aware pattern
in DatePickerHelper.js. Removes unused date-fns format import.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* fix(scheduled-messages): use app locale for date formatting
Replace navigator.language with the i18n app locale for shortcut date
labels and datepicker calendar. Add getDatePickerLang helper that
generates locale-aware day/month names via Intl.DateTimeFormat.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* fix(scheduled-messages): normalize locale tag to BCP 47 format
Chatwoot uses underscore locale tags (pt_BR) but Intl.DateTimeFormat
requires BCP 47 hyphens (pt-BR). Add toBcp47 normalizer to prevent
RangeError: invalid language tag.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* fix(scheduled-messages): locale-aware time period display
Add formatHour helper using Intl.DateTimeFormat so time periods
show 8:00/13:00/18:00 in pt-BR and 8:00 AM/1:00 PM/6:00 PM in en.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* test(scheduled-messages): add unit tests for scheduleDateShortcutHelpers
Cover getShortcutDate (weekday/Saturday/Sunday edge cases),
applyTimePeriod, isTimePeriodPast, formatShortDate, formatHour,
getDatePickerLang, and getDayShortcutOptions including locale
normalization for underscore tags like pt_BR.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* fix(scheduled-messages): sync customDateTime when modelValue changes in custom mode
Keep DatePicker in sync when the parent changes modelValue while
already in Custom mode (e.g. switching between scheduled messages).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* fix(scheduled-messages): add aria-labels to schedule dropdown selects
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* fix(scheduled-messages): use empty string instead of null for dateTimeError
Avoids Vue prop validation warning since ScheduleDateShortcuts
declares dateTimeError as a String prop.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* refactor(scheduled-messages): simplify to 3 fixed schedule shortcuts
Replace two dropdown selectors (6 day options × 3 time periods) with
3 pre-computed clickable shortcut buttons:
- Tomorrow morning (08:00)
- Tomorrow afternoon (13:00)
- Monday morning (08:00)
Each shortcut shows the exact calendar date and time for clarity.
Special Sunday rule: 'Monday' points to next week's Monday since
'Tomorrow' already covers the immediate Monday.
The 'Custom' option with full DatePicker is preserved.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* feat(scheduled-messages): Gmail-style list design for schedule shortcuts
Replace chip buttons with full-width clickable rows in a bordered
container, matching Gmail's 'Schedule send' dialog pattern:
- Label on left, formatted date/time on right in gray
- Calendar icon for the custom date/time option
- Subtle border separators between rows
- Selected state with blue highlight
Also improves date formatting from '15/03' to '15 de mar.' using
month short names for better readability.
Updates i18n:
- PT_BR: 'Amanhã à tarde', 'Escolher data e hora'
- EN: 'Choose date and time'
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* feat(scheduled-messages): improve modal layout and datepicker positioning
- Add 'Schedule send' / 'Programar envio' section header above the
schedule shortcuts for clear visual identification
- Move attachment/template controls next to the message editor so
content-related actions stay grouped together
- Move datepicker outside the bordered shortcut container to avoid
cramped positioning; add rounded-xl and proper text sizing
- Add i18n key SCHEDULE_LABEL (en: 'Schedule send', pt_BR: 'Programar envio')
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* refactor(schedule): replace popup datepicker with inline calendar
Replace the popup-style vue-datepicker-next with an inline calendar
(same approach used by the snooze feature), rendering the calendar
directly within the modal for a more intuitive UX.
- Switch DatePicker to inline mode (no popup/z-index issues)
- Add disablePastTimes validation (prevents selecting past times)
- Full-width responsive calendar with scoped deep styles
- Remove unused DATETIME_PLACEHOLDER and DATETIME_FORMAT i18n keys
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* feat(schedule): replace datepicker with natural language input
Replace the broken inline datepicker with a natural language text input
powered by chrono-node, similar to Chatwoot's upcoming snooze UX.
Users can now type dates naturally:
- EN: 'tomorrow at 2pm', 'next friday morning', 'in 3 hours'
- PT: 'amanhã às 14h', 'próxima sexta de manhã', '20 de março às 10h'
Changes:
- Add chrono-node dependency for natural language date parsing
- Add preProcessDateInput() to normalize PT time expressions (8h→8:00,
de manhã→8:00, à tarde→13:00, de noite→18:00)
- Add parseNaturalDate() with locale-aware parsing (PT/EN)
- Add formatFullDateTime() for parsed date preview display
- Replace DatePicker with text input + real-time parsed date preview
- Show green checkmark when date is valid, amber warning if in the past,
hint text if input is unrecognizable
- Remove unused getDatePickerLang() and vue-datepicker-next import
- Remove unused DATETIME_PLACEHOLDER/DATETIME_FORMAT i18n keys
- Update i18n: CUSTOM label, placeholder, hint, and past-date warning
- Update tests: 40 tests covering new functions (was 29)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* fix(schedule): improve PT natural language preprocessing
Normalize accent-less input common in casual Brazilian Portuguese:
- 'amanha' → 'amanhã', 'sabado' → 'sábado', 'proxima' → 'próxima'
- 'as' → 'às' before digits or time-of-day words (e.g. 'as 19h')
- Support 'pela manhã/tarde/noite' and 'no período da manhã/tarde/noite'
Previously 'Amanhã as 19h' failed because chrono-node requires 'às'
(with accent) as a time connector. Now all common casual PT patterns
work reliably.
Tests: 50 passing (was 40)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* fix(schedule): use forwardDate to always parse weekdays as upcoming
chrono-node defaults to the *most recent* occurrence of a weekday,
so 'sexta' on Monday returned last Friday (past). Adding
{ forwardDate: true } makes it always return the next occurrence.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* feat(schedule): add datepicker fallback and dual-language parsing
- Add discrete calendar icon button next to text input that toggles
an inline vue-datepicker-next with date+time selection
- Try both chrono.pt and chrono (EN) parsers, pick the one that
matches more of the input text — supports mixed-language input
like 'quarta 10am' or 'friday às 14h'
- Insert 'às' connector between PT weekday names and bare numbers
so 'quarta 10' parses correctly (chrono.pt requires the connector)
- Add DATEPICKER_TOOLTIP i18n key (EN + PT_BR)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* fix(schedule): toggle between text input and datepicker views
When calendar button is clicked, hide the natural language text input
and show the inline datepicker full-width. A small 'Type a date and
time' link below the calendar lets users switch back to text input.
Calendar button is vertically centered with the input field (size-[34px]
matches input height).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* fix(schedule): align calendar button with text input height
Use self-stretch instead of fixed size so the button stretches to
match the input height in the flex row, eliminating misalignment.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* fix(schedule): adjust margin for custom text input in date shortcuts
* fix(schedule): use popup datepicker with datetime and confirm
Replace the inline datepicker toggle with a popup DatePicker that
opens directly from the calendar button. Uses type='datetime' with
confirm mode so users can pick both date and time. On confirm, the
selected datetime populates the natural language text field. The text
input and calendar button are always visible side by side.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* fix(schedule): hide seconds column in datepicker
Add :show-second='false' to only show hour and minute selection.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* fix(schedule): adjust DatePicker width for better responsiveness
* refactor(schedule): use locale for parser priority and add aria-label
- parseNaturalDate now uses locale to call the matching parser first
(chrono.pt for PT, chrono for EN) before falling back to the other,
removing the eslint-disable comment for unused locale param
- Add aria-label to the natural language date input for screen readers
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* chore: remove leftover planning files
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: gabrieljablonski <contact@gabrieljablonski.com>
565 lines
24 KiB
JSON
565 lines
24 KiB
JSON
{
|
||
"CONVERSATION": {
|
||
"SELECT_A_CONVERSATION": "Please select a conversation from left pane",
|
||
"CSAT_REPLY_MESSAGE": "Please rate the conversation",
|
||
"404": "Sorry, we cannot find the conversation. Please try again",
|
||
"SWITCH_VIEW_LAYOUT": "Switch the layout",
|
||
"DASHBOARD_APP_TAB_MESSAGES": "Messages",
|
||
"UNVERIFIED_SESSION": "The identity of this user is not verified",
|
||
"NO_MESSAGE_1": "Uh oh! Looks like there are no messages from customers in your inbox.",
|
||
"NO_MESSAGE_2": " to send a message to your page!",
|
||
"NO_INBOX_1": "Hola! Looks like you haven't added any inboxes yet.",
|
||
"NO_INBOX_2": " to get started",
|
||
"NO_INBOX_AGENT": "Uh Oh! Looks like you are not part of any inbox. Please contact your administrator",
|
||
"SEARCH_MESSAGES": "Search for messages in conversations",
|
||
"VIEW_ORIGINAL": "View original",
|
||
"VIEW_TRANSLATED": "View translated",
|
||
"EMPTY_STATE": {
|
||
"CMD_BAR": "to open command menu",
|
||
"KEYBOARD_SHORTCUTS": "to view keyboard shortcuts"
|
||
},
|
||
"SEARCH": {
|
||
"TITLE": "Search messages",
|
||
"RESULT_TITLE": "Search Results",
|
||
"LOADING_MESSAGE": "Crunching data...",
|
||
"PLACEHOLDER": "Type any text to search messages",
|
||
"NO_MATCHING_RESULTS": "No results found."
|
||
},
|
||
"UNREAD_MESSAGES": "Unread Messages",
|
||
"UNREAD_MESSAGE": "Unread Message",
|
||
"CLICK_HERE": "Click here",
|
||
"LOADING_INBOXES": "Loading inboxes",
|
||
"LOADING_CONVERSATIONS": "Loading Conversations",
|
||
"CANNOT_REPLY": "You cannot reply due to",
|
||
"24_HOURS_WINDOW": "24 hour message window restriction",
|
||
"48_HOURS_WINDOW": "48 hour message window restriction",
|
||
"API_HOURS_WINDOW": "You can only reply to this conversation within {hours} hours",
|
||
"NOT_ASSIGNED_TO_YOU": "This conversation is not assigned to you. Would you like to assign this conversation to yourself?",
|
||
"ASSIGN_TO_ME": "Assign to me",
|
||
"BOT_HANDOFF_MESSAGE": "You are responding to a conversation which is currently handled by an assistant or a bot.",
|
||
"BOT_HANDOFF_ACTION": "Mark open and assign to you",
|
||
"BOT_HANDOFF_REOPEN_ACTION": "Mark conversation open",
|
||
"BOT_HANDOFF_SUCCESS": "Conversation has been handed over to you",
|
||
"BOT_HANDOFF_ERROR": "Failed to take over the conversation. Please try again.",
|
||
"TWILIO_WHATSAPP_CAN_REPLY": "You can only reply to this conversation using a template message due to",
|
||
"TWILIO_WHATSAPP_24_HOURS_WINDOW": "24 hour message window restriction",
|
||
"ANNOUNCEMENT_MODE_BANNER": "Only administrators are allowed to send messages in this group",
|
||
"GROUP_LEFT_BANNER": "You are no longer part of this group and cannot send messages in it",
|
||
"GROUPS_DISABLED_BANNER": "Group messages are disabled. Enable full group support (free) to view and send messages.",
|
||
"GROUPS_DISABLED_CTA": "Learn how to enable (free)",
|
||
"OLD_INSTAGRAM_INBOX_REPLY_BANNER": "This Instagram account was migrated to the new Instagram channel inbox. All new messages will show up there. You won’t be able to send messages from this conversation anymore.",
|
||
"REPLYING_TO": "You are replying to:",
|
||
"REMOVE_SELECTION": "Remove Selection",
|
||
"DOWNLOAD": "Download",
|
||
"UNKNOWN_FILE_TYPE": "Unknown File",
|
||
"SAVE_CONTACT": "Save Contact",
|
||
"NO_CONTENT": "No content to display",
|
||
"SHARED_ATTACHMENT": {
|
||
"CONTACT": "{sender} has shared a contact",
|
||
"LOCATION": "{sender} has shared a location",
|
||
"FILE": "{sender} has shared a file",
|
||
"MEETING": "{sender} has started a meeting"
|
||
},
|
||
"UPLOADING_ATTACHMENTS": "Uploading attachments...",
|
||
"REPLIED_TO_STORY": "Replied to your story",
|
||
"UNSUPPORTED_MESSAGE": "This message is unsupported. You can view this message on the app.",
|
||
"UNSUPPORTED_MESSAGE_WHATSAPP": "This message is unsupported. You can view this message on the WhatsApp app.",
|
||
"UNSUPPORTED_MESSAGE_FACEBOOK": "This message is unsupported. You can view this message on the Facebook Messenger app.",
|
||
"UNSUPPORTED_MESSAGE_INSTAGRAM": "This message is unsupported. You can view this message on the Instagram app.",
|
||
"UNSUPPORTED_MESSAGE_TIKTOK": "This message is unsupported. You can view this message on the TikTok app.",
|
||
"SUCCESS_DELETE_MESSAGE": "Message deleted successfully",
|
||
"FAIL_DELETE_MESSSAGE": "Couldn't delete message! Try again",
|
||
"NO_RESPONSE": "No response",
|
||
"RESPONSE": "Response",
|
||
"RATING_TITLE": "Rating",
|
||
"FEEDBACK_TITLE": "Feedback",
|
||
"REPLY_MESSAGE_NOT_FOUND": "Message not available",
|
||
"CARD": {
|
||
"SHOW_LABELS": "Show labels",
|
||
"HIDE_LABELS": "Hide labels"
|
||
},
|
||
"VOICE_CALL": {
|
||
"INCOMING_CALL": "Incoming call",
|
||
"OUTGOING_CALL": "Outgoing call",
|
||
"CALL_IN_PROGRESS": "Call in progress",
|
||
"NO_ANSWER": "No answer",
|
||
"MISSED_CALL": "Missed call",
|
||
"CALL_ENDED": "Call ended",
|
||
"NOT_ANSWERED_YET": "Not answered yet",
|
||
"THEY_ANSWERED": "They answered",
|
||
"YOU_ANSWERED": "You answered"
|
||
},
|
||
"HEADER": {
|
||
"RESOLVE_ACTION": "Resolve",
|
||
"REOPEN_ACTION": "Reopen",
|
||
"OPEN_ACTION": "Open",
|
||
"MORE_ACTIONS": "More actions",
|
||
"OPEN": "More",
|
||
"CLOSE": "Close",
|
||
"DETAILS": "details",
|
||
"SNOOZED_UNTIL": "Snoozed until",
|
||
"SNOOZED_UNTIL_TOMORROW": "Snoozed until tomorrow",
|
||
"SNOOZED_UNTIL_NEXT_WEEK": "Snoozed until next week",
|
||
"SNOOZED_UNTIL_NEXT_REPLY": "Snoozed until next reply",
|
||
"SLA_STATUS": {
|
||
"FRT": "FRT {status}",
|
||
"NRT": "NRT {status}",
|
||
"RT": "RT {status}",
|
||
"MISSED": "missed",
|
||
"DUE": "due"
|
||
}
|
||
},
|
||
"RESOLVE_DROPDOWN": {
|
||
"MARK_PENDING": "Mark as pending",
|
||
"SNOOZE_UNTIL": "Snooze",
|
||
"SNOOZE": {
|
||
"TITLE": "Snooze until",
|
||
"NEXT_REPLY": "Next reply",
|
||
"TOMORROW": "Tomorrow",
|
||
"NEXT_WEEK": "Next week"
|
||
}
|
||
},
|
||
"MENTION": {
|
||
"AGENTS": "Agents",
|
||
"TEAMS": "Teams"
|
||
},
|
||
"CUSTOM_SNOOZE": {
|
||
"TITLE": "Snooze until",
|
||
"APPLY": "Snooze",
|
||
"CANCEL": "Cancel"
|
||
},
|
||
"PRIORITY": {
|
||
"TITLE": "Priority",
|
||
"OPTIONS": {
|
||
"NONE": "None",
|
||
"URGENT": "Urgent",
|
||
"HIGH": "High",
|
||
"MEDIUM": "Medium",
|
||
"LOW": "Low"
|
||
},
|
||
"CHANGE_PRIORITY": {
|
||
"SELECT_PLACEHOLDER": "None",
|
||
"INPUT_PLACEHOLDER": "Select priority",
|
||
"NO_RESULTS": "No results found",
|
||
"SUCCESSFUL": "Changed priority of conversation id {conversationId} to {priority}",
|
||
"FAILED": "Couldn't change priority. Please try again."
|
||
}
|
||
},
|
||
"DELETE_CONVERSATION": {
|
||
"TITLE": "Delete conversation #{conversationId}",
|
||
"DESCRIPTION": "Are you sure you want to delete this conversation?",
|
||
"CONFIRM": "Delete"
|
||
},
|
||
"CARD_CONTEXT_MENU": {
|
||
"PENDING": "Mark as pending",
|
||
"RESOLVED": "Mark as resolved",
|
||
"MARK_AS_UNREAD": "Mark as unread",
|
||
"MARK_AS_READ": "Mark as read",
|
||
"REOPEN": "Reopen conversation",
|
||
"SNOOZE": {
|
||
"TITLE": "Snooze",
|
||
"NEXT_REPLY": "Until next reply",
|
||
"TOMORROW": "Until tomorrow",
|
||
"NEXT_WEEK": "Until next week"
|
||
},
|
||
"ASSIGN_AGENT": "Assign agent",
|
||
"ASSIGN_LABEL": "Assign label",
|
||
"AGENTS_LOADING": "Loading agents...",
|
||
"ASSIGN_TEAM": "Assign team",
|
||
"DELETE": "Delete conversation",
|
||
"OPEN_IN_NEW_TAB": "Open in new tab",
|
||
"COPY_LINK": "Copy conversation link",
|
||
"COPY_LINK_SUCCESS": "Conversation link copied to clipboard",
|
||
"API": {
|
||
"AGENT_ASSIGNMENT": {
|
||
"SUCCESFUL": "Conversation id {conversationId} assigned to \"{agentName}\"",
|
||
"FAILED": "Couldn't assign agent. Please try again."
|
||
},
|
||
"LABEL_ASSIGNMENT": {
|
||
"SUCCESFUL": "Assigned label #{labelName} to conversation id {conversationId}",
|
||
"FAILED": "Couldn't assign label. Please try again."
|
||
},
|
||
"LABEL_REMOVAL": {
|
||
"SUCCESFUL": "Removed label #{labelName} from conversation id {conversationId}",
|
||
"FAILED": "Couldn't remove label. Please try again."
|
||
},
|
||
"TEAM_ASSIGNMENT": {
|
||
"SUCCESFUL": "Assigned team \"{team}\" to conversation id {conversationId}",
|
||
"FAILED": "Couldn't assign team. Please try again."
|
||
}
|
||
}
|
||
},
|
||
"FOOTER": {
|
||
"MESSAGE_SIGN_TOOLTIP": "Message signature",
|
||
"ENABLE_SIGN_TOOLTIP": "Enable signature",
|
||
"DISABLE_SIGN_TOOLTIP": "Disable signature",
|
||
"SIGNATURE_LABEL_TOP": "↓ Signature",
|
||
"SIGNATURE_LABEL_TOP_TOOLTIP": "The signature will be sent at the top of the message",
|
||
"SIGNATURE_LABEL_BOTTOM": "↑ Signature",
|
||
"SIGNATURE_LABEL_BOTTOM_TOOLTIP": "The signature will be sent at the bottom of the message",
|
||
"MSG_INPUT": "Shift + enter for new line. Start with '/' to select a Canned Response.",
|
||
"PRIVATE_MSG_INPUT": "Shift + enter for new line. This will be visible only to Agents",
|
||
"MESSAGING_RESTRICTED": "You cannot reply to this conversation",
|
||
"MESSAGING_RESTRICTED_WHATSAPP": "You can only reply using a template message due to 24-hour message window restriction",
|
||
"ANNOUNCEMENT_MODE_RESTRICTED": "Only administrators are allowed to send messages in this group",
|
||
"GROUP_LEFT_RESTRICTED": "You are no longer part of this group and cannot send messages in it",
|
||
"GROUPS_DISABLED_RESTRICTED": "Group messages are disabled — enable for free",
|
||
"MESSAGE_SIGNATURE_NOT_CONFIGURED": "Message signature is not configured, please configure it in profile settings.",
|
||
"COPILOT_MSG_INPUT": "Give copilot additional prompts, or ask anything else... Press enter to send follow-up",
|
||
"CLICK_HERE": "Click here to update",
|
||
"WHATSAPP_TEMPLATES": "Whatsapp Templates"
|
||
},
|
||
"REPLYBOX": {
|
||
"REPLY": "Reply",
|
||
"PRIVATE_NOTE": "Private Note",
|
||
"SEND": "Send",
|
||
"CREATE": "Add Note",
|
||
"INSERT_READ_MORE": "Read more",
|
||
"DISMISS_REPLY": "Dismiss reply",
|
||
"REPLYING_TO": "Replying to:",
|
||
"TIP_EMOJI_ICON": "Show emoji selector",
|
||
"TIP_ATTACH_ICON": "Attach files",
|
||
"TIP_AUDIORECORDER_ICON": "Record audio",
|
||
"TIP_AUDIORECORDER_PERMISSION": "Allow access to audio",
|
||
"TIP_AUDIORECORDER_ERROR": "Could not open the audio",
|
||
"AUDIO_CONVERSION_FAILED": "Audio conversion failed. Please try again.",
|
||
"DRAG_DROP": "Drag and drop here to attach",
|
||
"START_AUDIO_RECORDING": "Start audio recording",
|
||
"STOP_AUDIO_RECORDING": "Stop audio recording",
|
||
"COPILOT_THINKING": "Copilot is thinking",
|
||
"EMAIL_HEAD": {
|
||
"TO": "TO",
|
||
"ADD_BCC": "Add bcc",
|
||
"CC": {
|
||
"LABEL": "CC",
|
||
"PLACEHOLDER": "Emails separated by commas",
|
||
"ERROR": "Please enter valid email addresses"
|
||
},
|
||
"BCC": {
|
||
"LABEL": "BCC",
|
||
"PLACEHOLDER": "Emails separated by commas",
|
||
"ERROR": "Please enter valid email addresses"
|
||
}
|
||
},
|
||
"UNDEFINED_VARIABLES": {
|
||
"TITLE": "Undefined variables",
|
||
"MESSAGE": "You have {undefinedVariablesCount} undefined variables in your message: {undefinedVariables}. Would you like to send the message anyway?",
|
||
"CONFIRM": {
|
||
"YES": "Send",
|
||
"CANCEL": "Cancel"
|
||
}
|
||
},
|
||
"QUOTED_REPLY": {
|
||
"ENABLE_TOOLTIP": "Include quoted email thread",
|
||
"DISABLE_TOOLTIP": "Don't include quoted email thread",
|
||
"REMOVE_PREVIEW": "Remove quoted email thread",
|
||
"COLLAPSE": "Collapse preview",
|
||
"EXPAND": "Expand preview"
|
||
},
|
||
"SCHEDULE_SEND": "Schedule send"
|
||
},
|
||
"VISIBLE_TO_AGENTS": "Private Note: Only visible to you and your team",
|
||
"CHANGE_STATUS": "Conversation status changed",
|
||
"CHANGE_STATUS_FAILED": "Conversation status change failed",
|
||
"CHANGE_AGENT": "Conversation Assignee changed",
|
||
"CHANGE_AGENT_FAILED": "Assignee change failed",
|
||
"ASSIGN_LABEL_SUCCESFUL": "Label assigned successfully",
|
||
"ASSIGN_LABEL_FAILED": "Label assignment failed",
|
||
"CHANGE_TEAM": "Conversation team changed",
|
||
"SUCCESS_DELETE_CONVERSATION": "Conversation deleted successfully",
|
||
"FAIL_DELETE_CONVERSATION": "Couldn't delete conversation! Try again",
|
||
"FILE_SIZE_LIMIT": "File exceeds the {MAXIMUM_SUPPORTED_FILE_UPLOAD_SIZE} MB attachment limit",
|
||
"FILE_TYPE_NOT_SUPPORTED": "This {fileName} file type is not supported in this conversation",
|
||
"MESSAGE_ERROR": "Unable to send this message, please try again later",
|
||
"SENT_BY": "Sent by:",
|
||
"BOT": "Bot",
|
||
"NATIVE_APP": "Native app",
|
||
"NATIVE_APP_ADVISORY": "This message was sent from the native app. Reply from Chatwoot to maintain the message window.",
|
||
"WHATSAPP": "WhatsApp",
|
||
"SEND_FAILED": "Couldn't send message! Try again",
|
||
"TRY_AGAIN": "retry",
|
||
"ASSIGNMENT": {
|
||
"SELECT_AGENT": "Select Agent",
|
||
"REMOVE": "Remove",
|
||
"ASSIGN": "Assign"
|
||
},
|
||
"CONTEXT_MENU": {
|
||
"COPY": "Copy",
|
||
"REPLY_TO": "Reply to this message",
|
||
"DELETE": "Delete",
|
||
"CREATE_A_CANNED_RESPONSE": "Add to canned responses",
|
||
"TRANSLATE": "Translate",
|
||
"COPY_PERMALINK": "Copy link to the message",
|
||
"LINK_COPIED": "Message URL copied to the clipboard",
|
||
"DELETE_CONFIRMATION": {
|
||
"TITLE": "Are you sure you want to delete this message?",
|
||
"MESSAGE": "You cannot undo this action",
|
||
"DELETE": "Delete",
|
||
"CANCEL": "Cancel"
|
||
},
|
||
"EDIT": {
|
||
"LABEL": "Edit",
|
||
"TITLE": "Edit message",
|
||
"PLACEHOLDER": "Enter message content",
|
||
"SAVE": "Save",
|
||
"CANCEL": "Cancel",
|
||
"SUCCESS": "Message edited successfully",
|
||
"ERROR": "Failed to edit message",
|
||
"EMPTY_CONTENT": "Message content cannot be empty"
|
||
}
|
||
},
|
||
"SIDEBAR": {
|
||
"CONTACT": "Contact",
|
||
"COPILOT": "Copilot"
|
||
},
|
||
"VOICE_WIDGET": {
|
||
"INCOMING_CALL": "Incoming call",
|
||
"OUTGOING_CALL": "Outgoing call",
|
||
"CALL_IN_PROGRESS": "Call in progress",
|
||
"NOT_ANSWERED_YET": "Not answered yet",
|
||
"HANDLED_IN_ANOTHER_TAB": "Being handled in another tab",
|
||
"REJECT_CALL": "Reject",
|
||
"JOIN_CALL": "Join call",
|
||
"END_CALL": "End call"
|
||
},
|
||
"INBOX": {
|
||
"WHATSAPP_PROVIDER_CONNECTION": {
|
||
"NOT_CONNECTED": "WhatsApp is not connected. Please link your device again.",
|
||
"NOT_CONNECTED_CONTACT_ADMIN": "WhatsApp is not connected. Click this button to try to reconnect, or please contact your administrator to link your device again.",
|
||
"LINK_DEVICE": "Link device",
|
||
"RECONNECT_FAILED": "Failed to reconnect. Please contact your administrator to link your device again."
|
||
}
|
||
}
|
||
},
|
||
"EMAIL_TRANSCRIPT": {
|
||
"TITLE": "Send conversation transcript",
|
||
"DESC": "Send a copy of the conversation transcript to the specified email address",
|
||
"SUBMIT": "Submit",
|
||
"CANCEL": "Cancel",
|
||
"SEND_EMAIL_SUCCESS": "The chat transcript was sent successfully",
|
||
"SEND_EMAIL_ERROR": "There was an error, please try again",
|
||
"FORM": {
|
||
"SEND_TO_CONTACT": "Send the transcript to the customer",
|
||
"SEND_TO_AGENT": "Send the transcript to the assigned agent",
|
||
"SEND_TO_OTHER_EMAIL_ADDRESS": "Send the transcript to another email address",
|
||
"EMAIL": {
|
||
"PLACEHOLDER": "Enter an email address",
|
||
"ERROR": "Please enter a valid email address"
|
||
}
|
||
}
|
||
},
|
||
"ONBOARDING": {
|
||
"TITLE": "Hey 👋, Welcome to {installationName}!",
|
||
"DESCRIPTION": "Thanks for signing up. We want you to get the most out of {installationName}. Here are a few things you can do in {installationName} to make the experience delightful.",
|
||
"GREETING_MORNING": "👋 Good morning, {name}. Welcome to {installationName}.",
|
||
"GREETING_AFTERNOON": "👋 Good afternoon, {name}. Welcome to {installationName}.",
|
||
"GREETING_EVENING": "👋 Good evening, {name}. Welcome to {installationName}.",
|
||
"READ_LATEST_UPDATES": "Read our latest updates",
|
||
"ALL_CONVERSATION": {
|
||
"TITLE": "All your conversations in one place",
|
||
"DESCRIPTION": "View all the conversations from your customers in one single dashboard. You can filter the conversations by the incoming channel, label and status.",
|
||
"NEW_LINK": "Click here to create an inbox"
|
||
},
|
||
"TEAM_MEMBERS": {
|
||
"TITLE": "Invite your team members",
|
||
"DESCRIPTION": "Since you are getting ready to talk to your customer, bring in your teammates to assist you. You can invite your teammates by adding their email addresses to the agent list.",
|
||
"NEW_LINK": "Click here to invite a team member"
|
||
},
|
||
"LABELS": {
|
||
"TITLE": "Organize conversations with labels",
|
||
"DESCRIPTION": "Labels provide an easier way to categorize your conversation. Create some labels like #support-enquiry, #billing-question etc., so that you can use them in a conversation later.",
|
||
"NEW_LINK": "Click here to create tags"
|
||
},
|
||
"CANNED_RESPONSES": {
|
||
"TITLE": "Create canned responses",
|
||
"DESCRIPTION": "Pre-written quick reply templates help you quickly respond to a conversation. Agents can type the '/' character followed by the shortcode to insert a response.",
|
||
"NEW_LINK": "Click here to create a canned response"
|
||
}
|
||
},
|
||
"CONVERSATION_SIDEBAR": {
|
||
"ASSIGNEE_LABEL": "Assigned Agent",
|
||
"SELF_ASSIGN": "Assign to me",
|
||
"TEAM_LABEL": "Assigned Team",
|
||
"SELECT": {
|
||
"PLACEHOLDER": "None"
|
||
},
|
||
"ACCORDION": {
|
||
"CONTACT_DETAILS": "Contact Details",
|
||
"SCHEDULED_MESSAGES": "Scheduled Messages",
|
||
"CONVERSATION_ACTIONS": "Conversation Actions",
|
||
"CONVERSATION_LABELS": "Conversation Labels",
|
||
"CONVERSATION_INFO": "Conversation Information",
|
||
"CONTACT_NOTES": "Contact Notes",
|
||
"CONTACT_ATTRIBUTES": "Contact Attributes",
|
||
"PREVIOUS_CONVERSATION": "Previous Conversations",
|
||
"MACROS": "Macros",
|
||
"LINEAR_ISSUES": "Linked Linear Issues",
|
||
"SHOPIFY_ORDERS": "Shopify Orders"
|
||
},
|
||
"SHOPIFY": {
|
||
"ORDER_ID": "Order #{id}",
|
||
"ERROR": "Error loading orders",
|
||
"NO_SHOPIFY_ORDERS": "No orders found",
|
||
"FINANCIAL_STATUS": {
|
||
"PENDING": "Pending",
|
||
"AUTHORIZED": "Authorized",
|
||
"PARTIALLY_PAID": "Partially Paid",
|
||
"PAID": "Paid",
|
||
"PARTIALLY_REFUNDED": "Partially Refunded",
|
||
"REFUNDED": "Refunded",
|
||
"VOIDED": "Voided"
|
||
},
|
||
"FULFILLMENT_STATUS": {
|
||
"FULFILLED": "Fulfilled",
|
||
"PARTIALLY_FULFILLED": "Partially Fulfilled",
|
||
"UNFULFILLED": "Unfulfilled"
|
||
}
|
||
}
|
||
},
|
||
"SCHEDULED_MESSAGES": {
|
||
"NEW_BUTTON": "Schedule message",
|
||
"PAST_MESSAGES_SECTION": "Sent",
|
||
"EMPTY_STATE": "There are no scheduled messages yet.",
|
||
"STATUS": {
|
||
"DRAFT": "Draft",
|
||
"PENDING": "Pending",
|
||
"SENT": "Sent",
|
||
"FAILED": "Failed"
|
||
},
|
||
"ITEM": {
|
||
"SCHEDULED_FOR": "Scheduled for {time}",
|
||
"NO_SCHEDULE": "No schedule",
|
||
"TEMPLATE_PREVIEW": "Template: {name}",
|
||
"TEMPLATE_LABEL": "Template: {name}",
|
||
"ATTACHMENT_PREVIEW": "Attachment: {filename}",
|
||
"ATTACHMENT_LABEL": "Attachment: {filename}",
|
||
"EMPTY_PREVIEW": "No content",
|
||
"EXPAND": "Expand",
|
||
"COLLAPSE": "Collapse",
|
||
"GO_TO_MESSAGE": "Go to message",
|
||
"SEARCHING_MESSAGE": "Searching for message...",
|
||
"MESSAGE_NOT_FOUND": "The linked message was not found. It may have been deleted."
|
||
},
|
||
"MODAL": {
|
||
"TITLE_NEW": "Schedule a message",
|
||
"TITLE_EDIT": "Edit scheduled message",
|
||
"MESSAGE_LABEL": "Message",
|
||
"MESSAGE_PLACEHOLDER": "Write your message...",
|
||
"DATETIME_LABEL": "Date and time to send",
|
||
"ATTACHMENT_LABEL": "Attachment",
|
||
"ATTACHMENT_ADD": "Attach file",
|
||
"ATTACHMENT_CURRENT": "Current attachment: {filename}",
|
||
"TEMPLATE_SELECT": "Use template",
|
||
"TEMPLATE_SELECTED": "Template: {name}",
|
||
"TEMPLATE_ACTION": "Schedule message",
|
||
"CANCEL": "Cancel",
|
||
"SAVE_DRAFT": "Save as draft",
|
||
"SCHEDULE": "Schedule",
|
||
"SHORTCUTS": {
|
||
"TOMORROW_MORNING": "Tomorrow morning",
|
||
"TOMORROW_AFTERNOON": "Tomorrow afternoon",
|
||
"MONDAY_MORNING": "Monday morning",
|
||
"CUSTOM": "Type a date and time"
|
||
},
|
||
"CUSTOM_INPUT_PLACEHOLDER": "e.g. tomorrow at 2pm, next friday morning",
|
||
"CUSTOM_INPUT_HINT": "Try: tomorrow at 3pm, next monday, in 2 hours",
|
||
"PARSED_DATE_IN_PAST": "This date is in the past",
|
||
"DATEPICKER_TOOLTIP": "Pick from calendar",
|
||
"SCHEDULE_LABEL": "Schedule send"
|
||
},
|
||
"CONFIRM_CLOSE": {
|
||
"TITLE": "Unsaved changes",
|
||
"MESSAGE": "You have unsaved content. Would you like to discard your changes?",
|
||
"CONTINUE_EDITING": "Continue editing",
|
||
"DISCARD": "Discard",
|
||
"CANCEL": "Cancel"
|
||
},
|
||
"CONFIRM_DELETE": {
|
||
"TITLE": "Delete scheduled message",
|
||
"MESSAGE": "Are you sure you want to delete this scheduled message? This action cannot be undone.",
|
||
"CANCEL": "Cancel",
|
||
"DELETE": "Delete"
|
||
},
|
||
"META": {
|
||
"TOOLTIP": "Scheduled at {time} by {author}",
|
||
"YOU": "You",
|
||
"AUTHOR_YOU": "{name} (You)",
|
||
"AUTOMATION": "Automation",
|
||
"UNKNOWN_AUTHOR": "Unknown"
|
||
},
|
||
"ERRORS": {
|
||
"CONTENT_REQUIRED": "Add a message, template, or attachment before saving.",
|
||
"CONTENT_TOO_LONG": "Message is too long. Maximum {maxLength} characters allowed.",
|
||
"DATETIME_REQUIRED": "Select a date and time to schedule the message.",
|
||
"SCHEDULE_IN_PAST": "Scheduled time must be in the future.",
|
||
"SAVE_FAILED": "Unable to save scheduled message. Please try again.",
|
||
"DELETE_FAILED": "Unable to delete scheduled message. Please try again."
|
||
}
|
||
},
|
||
"CONVERSATION_CUSTOM_ATTRIBUTES": {
|
||
"ADD_BUTTON_TEXT": "Create attribute",
|
||
"NO_RECORDS_FOUND": "No attributes found",
|
||
"UPDATE": {
|
||
"SUCCESS": "Attribute updated successfully",
|
||
"ERROR": "Unable to update attribute. Please try again later"
|
||
},
|
||
"ADD": {
|
||
"TITLE": "Add",
|
||
"SUCCESS": "Attribute added successfully",
|
||
"ERROR": "Unable to add attribute. Please try again later"
|
||
},
|
||
"DELETE": {
|
||
"SUCCESS": "Attribute deleted successfully",
|
||
"ERROR": "Unable to delete attribute. Please try again later"
|
||
},
|
||
"ATTRIBUTE_SELECT": {
|
||
"TITLE": "Add attributes",
|
||
"PLACEHOLDER": "Search attributes",
|
||
"NO_RESULT": "No attributes found"
|
||
}
|
||
},
|
||
"EMAIL_HEADER": {
|
||
"FROM": "From",
|
||
"TO": "To",
|
||
"BCC": "Bcc",
|
||
"CC": "Cc",
|
||
"SUBJECT": "Subject",
|
||
"EXPAND": "Expand email"
|
||
},
|
||
"CONVERSATION_PARTICIPANTS": {
|
||
"SIDEBAR_MENU_TITLE": "Participating",
|
||
"SIDEBAR_TITLE": "Conversation participants",
|
||
"NO_RECORDS_FOUND": "No results found",
|
||
"ADD_PARTICIPANTS": "Select participants",
|
||
"REMANING_PARTICIPANTS_TEXT": "+{count} others",
|
||
"REMANING_PARTICIPANT_TEXT": "+{count} other",
|
||
"TOTAL_PARTICIPANTS_TEXT": "{count} people are participating.",
|
||
"TOTAL_PARTICIPANT_TEXT": "{count} person is participating.",
|
||
"NO_PARTICIPANTS_TEXT": "No one is participating!.",
|
||
"WATCH_CONVERSATION": "Join conversation",
|
||
"YOU_ARE_WATCHING": "You are participating",
|
||
"API": {
|
||
"ERROR_MESSAGE": "Could not update, try again!",
|
||
"SUCCESS_MESSAGE": "Participants updated!"
|
||
}
|
||
},
|
||
"TRANSLATE_MODAL": {
|
||
"TITLE": "View translated content",
|
||
"DESC": "You can view the translated content in each langauge.",
|
||
"ORIGINAL_CONTENT": "Original Content",
|
||
"TRANSLATED_CONTENT": "Translated Content",
|
||
"NO_TRANSLATIONS_AVAILABLE": "No translations are available for this content"
|
||
},
|
||
"TYPING": {
|
||
"ONE": "{user} is typing",
|
||
"TWO": "{user} and {secondUser} are typing",
|
||
"MULTIPLE": "{user} and {count} others are typing"
|
||
},
|
||
"COPILOT": {
|
||
"TRY_THESE_PROMPTS": "Try these prompts"
|
||
},
|
||
"GALLERY_VIEW": {
|
||
"ERROR_DOWNLOADING": "Unable to download attachment. Please try again"
|
||
}
|
||
}
|