# Localization and UI templating

> \[!NOTE]
>
> For the Flex UI 2.x.x version of this content, see [Overriding language strings](/docs/flex/developer/ui/overview-of-flex-ui-programmability-options#overriding-language-strings) in the overview of Flex UI programmability options.

> \[!NOTE]
>
> [Auto-Generated Documentation for the Flex UI](https://assets.flex.twilio.com/docs/releases/flex-ui/1.33.0) is now available. The auto-generated documentation is accurate and comprehensive, and may differ from what you see in the official Flex UI documentation. Includes [a complete listing of customizable Strings](https://assets.flex.twilio.com/docs/releases/flex-ui/1.33.0/Strings.html).

## What can you do with templated UI strings?

* [Override any string (label) in the UI](#overriding-language-strings).
* [Use Mustache style template variables for dynamic content](#templating-support-with-mustache-style-syntax).
* [Register and use Handlebars helper functions](#helper-functions).

## Overriding language strings

You can override any string by editing the `strings` object on the Flex Manager instance:

```javascript
flex.Manager.getInstance().strings.TaskLineCallAssigned = "I am a content string!";
```

![Two message notifications with icons, timestamps, and response options.](https://docs-resources.prod.twilio.com/b2da681bed484b65ce59b637605e61d669c824f6db38f19a38285965c3eb786c.png)

Language strings can technically contain any HTML tag like `h1`, `h2`, `p`, or even `iframe`. The Flex UI doesn't filter these values.

## Templating support with Mustache-style syntax

Flex uses [Handlebars](https://handlebarsjs.com/guide/expressions.html) for templating and supports Mustache-style syntax and expressions within content strings. For example, embedding value placeholders between double braces. Here's an example:

```javascript
manager.strings.TaskInfoPanelContent = `
<h1>TASK CONTEXT</h1>
<h2>Task type</h2>
<p>1{{task.attributes.title}}</p>
<p>2{{task.title}}</p>
<h2>Task created on</h2>
<p>{{task.dateCreated}}</p>
<h2>Task priority</h2>
<p>{{task.priority}}</p>
<h2>Task queue</h2>
<p>{{task.taskQueueName}}</p>
<hr />
<h1>CUSTOMER CONTEXT</h1>
<h2>Customer name / phone number</h2>
<p>{{task.attributes.name}}</p>
`;

```

Within the context of each component and string, additional dynamic content is available: for example, by accessing Task properties or attributes.

The following strings support Task context.

* `TaskInfoPanelContent`
* `TaskHeaderLine`
* `TaskHeaderComplete`
* `TaskHeaderWrapup`
* `TaskExtraInfo`
* `TaskLineCallReserved`
* `TaskLineCallAssigned`
* `TaskLineCallWrapup`
* `TaskLineChatReserved`
* `TaskLineChatAssigned`
* `TaskLineWebChatAssigned`
* `TaskLineSmsReserved`
* `TaskLineSmsAssigned`
* `LiveCommsMonitoringMessage`
* `LiveCommsOngoingCallMessage`
* `LiveCommsIncomingCallMessage`
* `SupervisorTaskCardHeader`
* `SupervisorTaskHeaderLine`
* `SupervisorTaskViewContentHeader`
* `SupervisorTaskInfoPanelContent`

### Accessing Task context: properties and attributes

Depending on the channel type, TaskRouter Tasks may contain any of the following properties and attributes. Each is listed with an example.

**Voice-related Task attributes**

* `account_sid`: "ACxxxx"
* `api_version`: "2010-04-01"
* `call_sid`: "CAxxxx"
* `called`: "+181xxxx"
* `called_city`: "CITY"
* `called_country`: "COUNTRY"
* `called_state`: "STATE"
* `called_zip`: "60xxxx"
* `caller`: "+372xxxx"
* `caller_city`: "CITY"
* `caller_country`: "COUNTRY"
* `caller_state`: "STATE"
* `caller_zip`: "ZIP"
* `conference`: `{sid: "CFxxxx", participants: {customer: "CAxxxx", worker: "CAxxxx"}}`
* `direction`: "inbound"
* `from`: "+372xxxx"
* `from_city`: "CITY"
* `from_country`: "COUNTRY"
* `from_state`: "STATE"
* `from_zip`: "ZIP"
* `name`: "+372xxxx"
* `to`: "+181xxxx"
* `to_city`: "CITY"
* `to_country`: "COUNTRY"
* `to_state`: "STATE"
* `to_zip`: "60xxxx"
* `type`: "inbound"

**Chat-related Task attributes**

* `channelSid`: "CHxxxx"
* `channelType`: "sms"
* `name`: "+372xxxx"

**Task Properties**

* `age`: 3248
* `channelType`: "voice"
* `dateCreated`: "Mon Jun 10 2018 16:41:12 GMT+0100 (British Summer Time)"
* dateUpdated: "Mon Jun 10 2018 16:43:12 GMT+0100 (British Summer Time)"
* `defaultFrom`: "Anonymous"
* `priority`: 0
* `queueName`: "Sample Queue"
* `queueSid`: "WQxxxx"
* `reason`: null
* `sid`: "WRxxxx"
* `source`: (Object)
* `sourceObject`: (Object)
* `status`: "assigned"
* `taskChannelSid`: "TCxxxx"
* `taskChannelUniqueName`: "sms"
* `taskSid`: "WTxxxx"
* `taskStatus`: "reserved"
* `timeout`: 3600
* `workerSid`: "WKxxxx"
* `workflowName`: "Default Fifo Workflow"
* `workflowSid`: "WWxxxx"

Here's an example that uses some of the previously listed properties and attributes in a template:

```javascript
manager.strings.TaskExtraInfo = "My task {{task.attributes.name}} was created on {{task.dateCreated}}";
```

## Helper functions

Helper functions provide you with a way to customize text with dynamic information. All of these functions are called using dot syntax on the object `helper`, as shown in the example after the list of functions.

| Function                   | Description                                                                                                                                                                           |
| -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `lastChatMessage`          | Returns [a Twilio Chat SDK message object](https://media.twiliocdn.com/sdk/js/chat/releases/2.2.0/docs/Message.html).                                                                 |
| `durationSinceUpdate`      | Returns the time since the Task was last updated, in the format `MM:SS`.                                                                                                              |
| `durationSinceUpdateShort` | Returns the time since the Task was last updated in the largest major time unit. For example, for a Task lasting 0 days 3 hours 49 minutes 17 seconds, the function will return `3h`. |
| `jsonString`               | Returns a string representation of a Task.                                                                                                                                            |
| `isLiveCall`               | Returns `true` if the specified Task is an Accepted Call Task.                                                                                                                        |
| `isCallOnHold`             | Returns `true` if the specified Task is an Accepted Call Task that belongs to a current worker and is currently on hold.                                                              |
| `isLiveChat`               | Returns `true` if the specified Task is an Accepted Chat-based Task.                                                                                                                  |
| `isIncomingCall`           | Returns `true` if the specified Task is pending. For example, waiting to be accepted.                                                                                                 |
| `isChatBasedTask`          | Returns `true` if the specified Task has chat capabilities.                                                                                                                           |
| `isCallTask`               | Returns `true` if the specified Task has call capabilities.                                                                                                                           |
| `isVideoCallTask`          | Returns `true` if the specified Task has video capabilities.                                                                                                                          |
| `getTaskChatChannelSid`    | Retrieve the Channel SID of the Chat Task.                                                                                                                                            |
| `isPending`                | Returns `true` if the specified Task is pending.                                                                                                                                      |
| `isInWrapupMode`           | Returns `true` if the specified Task is in wrapup.                                                                                                                                    |
| `isCompleted`              | Returns `true` if the specified Task has been completed.                                                                                                                              |
| `isMyTask`                 | Returns `true` if the specified Task is assigned to a current user.                                                                                                                   |
| `getTaskByTaskSid`         | Retrieves the Task object associated with the specified Task SID.                                                                                                                     |
| `isTaskAccepted`           | Returns `true` if the specified Task has been accepted by an agent, or is in a wrapup or completed state.                                                                             |
| `chat.isCustomerOnline`    | Returns `true` if customer is online, `false` if not.                                                                                                                                 |

Here is an example of the use of a helper function to enable dynamic updates:

```javascript
manager.strings.TaskExtraInfo = "Time since last update: {{helper.durationSinceUpdate}}";
```

## List of available content strings

> \[!NOTE]
>
> The following is a partial list of available content strings. For a more up-to-date list, see the [latest 1.x.x version](https://assets.flex.twilio.com/docs/releases/flex-ui/1.33.0/Strings.html) of the Flex UI Strings documentation.

* *SetYourStatus* — shown in the right top menu as a label to set your status
* *LogOut* — shown in the menu for log out item
* *SessionExpired* — notification for an expired session
* *SideNavTaskView* — left side navigation, task view link
* *SideNavTeamsView* - sidebar link that navigates to Teams view
* *TaskHeaderLine* - shown in the task list on the first line
* *TaskExtraInfo* - shown in the task list on separate section as bigger text
* *TaskLineCallReserved* - describes an incoming call in the call canvas, task canvas and task list
* *TaskLineCallWrapup* - describes a call in wrapup status in the call canvas, task canvas and task list
* *TaskLineChatReserved* - describes an incoming chat in the task canvas and task list
* *TaskLineSmsReserved* - describes an incoming SMS chat in the task canvas and task list
* *TaskLineChatLineReserved* - describes an incoming Line chat in the task canvas and task list
* *TaskLineChatMessengerReserved* - describes an incoming Facebook Messenger chat in task canvas and task list
* *TaskLineChatWhatsAppReserved* - describes an incoming WhatsApp chat in task canvas and task list
* *TaskLineChatAssigned* - describes an assigned chat task (except webchat) and any chat task in wrapup status at the task list
* *TaskLineWebChatAssigned* - describes an assigned webchat task at the task list
* *TaskReserved* - describes an incoming default generic task in the call canvas, task canvas and task list from the agent perspective
* *TaskAssigned* - describes an assigned default generic task in task card and task list from the agent perspective
* *TaskWrapup* - describes a default generic task in wrapup status in the call canvas, task canvas and task list
* *TaskCompleted* - describes a completed default generic task in call canvas, task canvas and task list
* *TaskCanceled* - describes a canceled default generic task in call canvas, task canvas and task list
* *TaskPending* - describes a pending default generic task in call canvas, task canvas and task list
* *TaskFilterAll* - shown in the task list filter to include all tasks
* *TaskFilterActive* - shown in the task list filter to include only active tasks
* *TaskFilterWrapping* - shown in the task list filter to include only tasks in wrap up state
* *TaskInfoPanelContent* - task-related information displayed on a task information tab
* *NoTasks* - main text on the "No Tasks" panel
* *NoTasksTitle* - string to be shown on the placeholder view when there are no tasks for the agent
* *NoTasksHintNotAvailable* - small hint on the "No Tasks" panel for not available worker
* *NoTasksHintAvailable* - small hint on the "No Tasks" panel for available worker
* *NoCRMTitle* - header shown on the placeholder view when there is no CRM configured
* *NoCRMConfigured* - main text to be shown on the placeholder view when there is no CRM configured
* *NoCRMConfiguredAction* - caption of the button on the "No CRM Configured" panel
* *NoCRMHint* - small hint on the "No CRM Configured" panel
* *TaskHeaderComplete* - button caption to Complete a task in wrapup
* *TaskHeaderEndCall* - button label on Task Header to end call
* *TaskHeaderWrapup* - button to take a task to wrapup
* *TaskHeaderEndChat* - button label on Task Header to end chat and move the task to wrapup
* *ColumnHeaderAgent* - column name for "agents" column in Supervisor table in the Teams view
* *ColumnHeaderCalls* - column name for "live calls" column in Supervisor table in the Teams view
* *ColumnHeaderTasks* - column name for tasks different from calls in Supervisor table in the Teams view
* *SupervisorUserCardFirstLine* - first line displayed for a user card in Supervisor table in the Teams view
* *SupervisorUserCardSecondLine* - second line displayed for a user card in Supervisor table in the Teams view
* *SupervisorTaskHeaderLine* - header of the task detail view in Supervisor UI in the Teams view
* *SupervisorTaskViewContentHeader* - first line of inner content area of task detail view in Supervisor UI in the Teams view
* *SupervisorTaskLive* - default string used by "helper" when calculating detail string for task in live state in the Teams view
* *SupervisorTaskWrapUp* - default string used by "helper" when calculating detail string for task in wrapping up state in the Teams view
* *SupervisorTaskCompleted* - default string used by "helper" when calculating detail string for task in completed state in the Teams view
* *SupervisorTaskCardHeader* - first line of task details card in the Teams view
* *SupervisorTaskInfoPanelContent* - task-related information displayed on a task information tab in the Teams view
* *LiveCommsMonitoringMessage* - text used in Live Comms bar when monitoring a call
* *LiveCommsOngoingCallMessage* - text used in Live Comms bar when on a call
* *LiveCommsBarReturnToCall* - text in Live Comms bar button to return to a call
* *LiveCommsBarStopListening* - text in Live Comms bar button to return to stop monitoring a call
* *LiveCommsBarHold* - text in Live Comms bar button to return to hold a call
* *LiveCommsBarUnHold* - text in Live Comms bar button to return to unhold a call
* *LiveCommsIncomingCallMessage* - text used in Live Comms bar for incoming call task
* *LiveCommsBarAccept* - text used in Live Comms bar to on button to accept incoming call task
* *LiveCommsBarDeny* - text used in Live Comms bar to on button to reject incoming call task
* *WorkerDirectoryItemFirstLine* - first line in an item of a Worker Directory
* *WorkerDirectoryItemSecondLine* - second line in an item of a Worker Directory
* *WorkerDirectoryTitle* - title of the Worker Directory popup
* *WorkerDirectoryAgentsTabLabel* - label of the agents tab in the worker directory popup
* *WorkerDirectoryQueuesTabLabel* - label of the queues tab in the worker directory popup
* *WorkerDirectoryQueueItemText* - displayed info about a queue item in the list of queues on the queues tab in the worker directory popup
* *WorkerDirectorySearchPlaceholder* - placeholder text for the search input
* *ChatInputDisabledText* - text displayed inside a disabled chat input
* *WorkerCanvasHeader* - header for the worker canvas in Supervisor UI in the Teams view
* *WorkerCanvasDetailsHeader* - header for the Worker Details section of the worker canvas in Supervisor UI in the Teams view
* *WorkerCanvasSkillsHeader* - header for the Skills section of the worker canvas in Supervisor UI in the Teams view
* *WorkerSkillLevelInvalid* - message displayed due to failed validation of a provided skill level of the worker canvas in Supervisor UI in the Teams view
* *WorkerSkillPleaseSelect* - text displayed as a placeholder in the skills dropdown menu of the worker canvas in Supervisor UI in the Teams view
* *WorkerSkillsNoSkills* - message displayed in case there are no skills specified within the worker canvas in Supervisor UI in the Teams view
* *WorkerSkillsSchemaMismatch* - message displayed in case skills couldn't be parsed due to schema mismatch within the worker canvas in Supervisor UI in the Teams view
* *WorkerSkillsSaved* - message indicating that the skills has been successfully saved at the worker canvas in Supervisor UI in the Teams view
* *WorkerSkillsError* - message indicating that saving changes to skills have failed at the worker canvas in Supervisor UI in the Teams view
* *WorkerSkillsReverted* - message indicated that the skills were successfully reset
* *Save* - label for a save button displayed in the worker skills section
* *Reset* - label for a reset button displayed in the worker skills section
* *ChatWelcomeText* - chat welcome text for agent
* *InputPlaceHolder* - Text shown in the edit box when no content has been entered
* *TypingIndicator* - Text used for typing indicator, user name is denoted by \{0}. For example "\{0} is typing"
* *Read* - Text below last message that has been read by other party
* *MessageSendingDisabled* - Text shown if sending messages has been disabled
* *Today* - Text shown in message list to group messages from today's date
* *Yesterday* - Text shown in message list to group messages from yesterday's date
* *UiVersionDeprecated* - notification indicating that the current version of Flex is deprecated
* *RuntimeLoginLabel* - header for the runtime login view
* *RuntimeLoginPlaceholder* - placeholder for the runtime login view input field in the runtime login view
* *RuntimeLoginLaunch* - label for the action button in the runtime login view
* *RuntimeLoginWithTwilio* - label in the runtime login view for the link that leads to Twilio login page
* *RuntimeLoginIsAdmin* - a text prepending `RuntimeLoginWithTwilio` link in the runtime login view
* *RuntimeLoginErrorDomain* - an error displayed in case runtime domain couldn't be resolved in the runtime login view
* *RuntimeLoginErrorSso* - an error displayed in the runtime login view in case SSO isn't properly configured for the Flex project within Twilio Console
* *TransferFailedNotification* - a notification displayed in case of failed task transfer to another agent
* *SupervisorTaskCanvasHeader* - a header for the task card in Supervisor UI in the Teams view
* *TaskTabSupervisorCallLabel* - Call task tab label in Supervisor task canvas.
* *TaskTabSupervisorChatLabel* - Chat task tab label in Supervisor task canvas.
* *TaskHeaderStatusPending* - Describes task that is in pending state. It's used in TaskCanvasHeader.
* *TaskHeaderGroupCallAccepted* - Describes conference call task that is in accepted state. It's used in TaskCanvasHeader.
* *TaskHeaderStatusAccepted* - Describes task (except webchat) that is in accepted state. It's used in TaskCanvasHeader.
* *TaskHeaderWebChatStatusAccepted* - Describes WebChat task that is in accepted state. It's used in TaskCanvasHeader.
* *TaskHeaderStatusWrapup* - Describes task that is in wrapup state. It's used in TaskCanvasHeader.
* *TaskHeaderStatusCompleted* - Describes task that is in completed state. It's used in TaskCanvasHeader.

### Current default values

The following template code shows the default values assigned to the above strings:

```bash
{
infoPanelContent: "`
<h1>TASK CONTEXT</h1>
<h2>Task type</h2>
<p>{{task.channelType}}</p>
<h2>Task created on</h2>
<p>{{task.dateCreated}}</p>
<h2>Task priority</h2>
<p>{{task.priority}}</p>
<h2>Task queue</h2>
<p>{{task.queueName}}</p>
<h2>Task Sid</h2>
<p>{{task.taskSid}}</p>
<h2>Reservation Sid</h2>
<p>{{task.sid}}</p>
<hr />
<h1>CUSTOMER CONTEXT</h1>
<h2>Customer name / phone number</h2>
<p>{{task.defaultFrom}}</p>
<h2>Country</h2>
<p>{{task.attributes.caller_country}}</p>`",

    SetYourStatus: "Set your status",
    LogOut: "Log out",
    SigningIn: "Signing in",
    SessionExpired:
        "Your session has expired. " + "<a href='#' onClick='window.location.reload()'>Click here to log in again</a>",
    NoTasksTitle: "Status",
    NoTasks: "No active tasks",
    NoTasksHintNotAvailable: "Change activity state to start receiving tasks.",
    NoTasksHintAvailable: "You are ready to start receiving tasks.",

    NoCRMConfigured: "No CRM configured",
    NoCRMConfiguredAction: "HOW TO CONFIGURE",
    NoCRMTitle: "CRM config",
    NoCRMHint: "Our docs can help you get started.",
    LoginWelcome: "Hi there, welcome to Flex!",
    LoginContinue: "Continue anyway",
    LoginAgain: "Login again",
    LoginLaunch: "Launch",
    LoginTitle: "Twilio Flex",
    LoginErrorDomain: "Oops! Your runtime domain is incorrect.",
    LoginErrorDomainDetails:
        "Find your runtime domain " + "<a href='https://www.twilio.com/console/runtime/overview'>here</a>",
    LoginErrorSso: "Hmm, Single Sign-On has not been configured.",
    LoginErrorSsoDetails:
        "Find out how to configure Single Sign-On " +
        "<a href='https://www.twilio.com/console/flex/users/single-sign-on'>here</a>",
    LoginErrorPopupBlocked: "Sorry, pop-ups are blocked.",
    LoginErrorPopupBlockedDetails:
        "<a href='https://support.google.com/chrome/answer/95472'>" +
        "Find out how to enable pop-ups in your browser</a>",
    LoginErrorInvalidCertificate: "Invalid SSO Settings",
    LoginErrorInvalidCertificateDetails:
        "This may be caused by malformed urls or missing/invalid certificates.  Please reconfigure the " +
        "<a href='https://www.twilio.com/docs/api/errors/70251' target='_blank'>" +
        "SSO settings" +
        "</a>" +
        " and retry.",
    LoginErrorGeneric: "Oops! Well, that didn't work :( Please double check your configuration.",
    LoginIsAdmin: "Flex Admin?",
    LoginWithTwilio: "Login with Twilio.",
    TaskHeaderLeaveCall: "LEAVE CALL",
    TaskHeaderEndCall: "HANG UP",
    TaskHeaderWrapup: "WRAP UP",
    TaskHeaderComplete: "COMPLETE",
    TaskHeaderEndChat: "END CHAT",
    TaskHeaderStatusPending: "",
    TaskHeaderStatusAccepted: "Live | {{helper.durationSinceUpdate}}",
    TaskHeaderWebChatStatusAccepted:
        "{{#if helper.chat.isCustomerOnline}} {{{icon name='GreenIndicator'}}} {{else}} {{{icon name='GreyIndicator'}}} {{/if}} Live | {{helper.durationSinceUpdate}}",
    TaskHeaderGroupCallAccepted:
        "Live | {{helper.durationSinceUpdate}} | {{{icon name='Participant'}}} " +
        "{{task.conference.liveParticipantCount}}",
    TaskHeaderStatusWrapup: "Wrap up | {{helper.durationSinceUpdate}}",
    TaskHeaderStatusCompleted: "Completed | {{helper.durationSinceUpdate}}",
    SideNavTaskView: "Agent Desktop",
    SideNavTeamsView: "Teams",
    SideNavAgentDashboard: "Agent Dashboard",
    SideNavSupervisorInspections: "Supervisor Inspections",
    SideNavSupervisorDashboard: "Supervisor Dashboard",
    SideNavSupervisorReports: "Supervisor Reports",
    SideNavSettings: "Settings",
    SideNavQueuesStatsView: "Queue Stats",
    TaskHeaderLine: "{{task.defaultFrom}}",
    TaskExtraInfo:
        "Lorem ipsum dolor sit amet, consectetur adipiscing elit, " +
        "sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. " +
        "Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip " +
        "ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit " +
        "esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non " +
        "proident, sunt in culpa qui officia deserunt mollit anim id est laborum.",
    TaskLineCallIncomingTitle: "Incoming call",
    TaskLineCallTransferTitle: "Transfer request",
    TaskLineCallEndedTitle: "Call ended",
    TaskLineQueue: "Queue: {{task.queueName}}",
    TaskLineCallDuration: "{{helper.durationSinceUpdate}}",
    TaskLineCallReserved: "Incoming call from queue {{task.queueName}}",
    TaskLineCallAssigned: "Live | {{helper.durationSinceUpdate}}",
    TaskLineCallWrapup: "Wrap up | {{helper.durationSinceUpdate}}",
    TaskLineGroupCallAssigned:
        "Live | {{helper.durationSinceUpdate}} | {{{icon name='Participant'}}} " +
        "{{task.conference.liveParticipantCount}}",
    TaskLineCallTransferWorker: "Request from {{task.incomingTransferObject.worker.fullName}} (direct)",
    TaskLineCallTransferWorkerDetail:
        "From: {{task.incomingTransferObject.worker.fullName}} (direct)<br />" + "Queue: {{task.queueName}}",
    TaskLineCallTransferQueue:
        "Request from {{task.incomingTransferObject.worker.fullName}} ({{task.incomingTransferObject.queue.name}})",
    TaskLineCallTransferQueueDetail:
        "From: {{task.incomingTransferObject.worker.fullName}}<br />" + "Queue: {{task.queueName}}",
    TaskLineChatReserved: "Incoming chat request",
    TaskLineChatLineReserved: "Incoming Line request",
    TaskLineChatMessengerReserved: "Incoming Messenger request",
    TaskLineChatWhatsAppReserved: "Incoming WhatsApp request",
    TaskLineSmsReserved: "Incoming SMS request",
    TaskLineChatAssigned:
        "{{helper.durationSinceUpdate}} | {{#if helper.chat.typers.length}} typing … {{else}} {{#if helper.chat.lastMessage}} " +
        "{{helper.chat.lastMessage.authorName}}: {{helper.chat.lastMessage.body}}" +
        "{{else}}No messages{{/if}}{{/if}}",
    TaskLineWebChatAssigned:
        "{{#if helper.chat.isCustomerOnline}} {{{icon name='GreenIndicator'}}} {{else}} {{{icon name='GreyIndicator'}}} {{/if}}" +
        "{{helper.durationSinceUpdate}} | {{#if helper.chat.typers.length}} typing … {{else}} {{#if helper.chat.lastMessage}} " +
        "{{helper.chat.lastMessage.authorName}}: {{helper.chat.lastMessage.body}}" +
        "{{else}}No messages{{/if}}{{/if}}",
    TaskLineTitle: "",
    TaskReserved: "Reserved",
    TaskAssigned: "Assigned",
    TaskWrapup: "In wrap up",
    TaskCompleted: "Completed",
    TaskCanceled: "Canceled",
    TaskFilterAll: "ALL TASKS",
    TaskFilterActive: "ACTIVE TASKS",
    TaskFilterWrapping: "TASKS IN WRAP UP",
    TaskInfoPanelContent: infoPanelContent,
    ColumnHeaderAgent: "AGENT",
    ColumnHeaderCalls: "CALLS",
    ColumnHeaderTasks: "OTHER TASKS",
    SupervisorUserCardFirstLine: "{{worker.fullName}}",
    SupervisorUserCardSecondLine: "{{worker.activityName}} | {{worker.activityDuration}}",
    SupervisorTaskViewContentHeader: "{{worker.fullName}}, {{task.defaultFrom}}",
    SupervisorTaskHeaderLine: "{{task.defaultFrom}}",
    SupervisorTaskLive: "{{helper.durationSinceUpdateShort}}",
    SupervisorTaskGroupCall: "{{helper.durationSinceUpdateShort}} | ({{task.conference.liveParticipantCount}})",
    SupervisorTaskWrapUp: "Wrap up | {{helper.durationSinceUpdateShort}}",
    SupervisorTaskCompleted: "Completed | {{helper.durationSinceUpdateShort}}",
    SupervisorTaskCardHeader: "{{task.defaultFrom}}",
    SupervisorTaskInfoPanelContent: infoPanelContent,
    LiveCommsMonitoringMessage: "You are listening to a call with {{task.defaultFrom}} and {{worker.fullName}}",
    LiveCommsMonitoringMessageMoreWorkers:
        "You are listening to a call with {{task.defaultFrom}} and {{workers.length}} workers",
    LiveCommsMonitoringMessageNoWorkers: "You are listening to a call with {{task.defaultFrom}}",
    LiveCommsOngoingCallMessage: "You are on a call with {{task.defaultFrom}}",
    LiveCommsIncomingCallMessage: "Incoming call from {{task.defaultFrom}}",
    LiveCommsBarAccept: "accept",
    LiveCommsBarDeny: "reject",
    LiveCommsBarReturnToCall: "RETURN",
    LiveCommsBarStopListening: "STOP LISTENING",
    LiveCommsBarHold: "HOLD",
    LiveCommsBarUnHold: "UNHOLD",
    WorkerDirectoryTitle: "Transfer",
    WorkerDirectoryItemFirstLine: "{{worker.fullName}}",
    WorkerDirectoryItemSecondLine: "{{worker.activityName}}",
    WorkerDirectoryAgentsTabLabel: "AGENTS",
    WorkerDirectoryQueuesTabLabel: "QUEUES",
    WorkerDirectoryQueueItemText: "{{queue.name}}",
    WorkerDirectorySearchPlaceholder: "Search",
    ChatInputDisabledText: "Conversation ended",
    WorkerCanvasHeader: "Profile",
    WorkerCanvasDetailsHeader: "Agent Details",
    WorkerCanvasSkillsHeader: "Skills",
    WorkerSkillLevelInvalid: "Please select a skill level between {{min}} - {{max}}",
    WorkerSkillPleaseSelect: "Add skill",
    WorkerSkillsNoSkills: "No skills attributed",
    WorkerSkillsSchemaMismatch: "Worker skills schema mismatch",
    WorkerSkillsSaved: "Changes saved successfully",
    WorkerSkillsError: "Failed to save changes",
    WorkerSkillsReverted: "Changes reverted",
    ChatWelcomeText: "Conversation started with customer",
    UiVersionDeprecated: "{{message}}",
    RuntimeLoginLabel: "Runtime domain",
    RuntimeLoginPlaceholder: "Your Runtime Domain",
    RuntimeLoginLaunch: "Launch",
    RuntimeLoginWithTwilio: "Login with Twilio.",
    RuntimeLoginIsAdmin: "Flex Admin?",
    RuntimeLoginErrorDomain: "Oops! Well, that didn't work :( Check your <b>domain</b>.",
    RuntimeLoginErrorSso: "Oops! Well, that didn't work :( Check your <b>SSO</b> setup.",
    TransferFailedNotification: "Agent unavailable",
    TaskCannotBeTransferredNotification: "Task cannot be transferred",
    SupervisorTaskCanvasHeader: "TASK DETAILS",
    TaskTabAgentIncomingLabel: "Incoming",
    TaskTabAgentCallLabel: "Call",
    TaskTabAgentChatLabel: "Chat",
    TaskTabAgentInfoLabel: "Info",
    TaskTabSupervisorOverviewLabel: "Overview",
    TaskTabSupervisorCallLabel: "Call",
    TaskTabSupervisorChatLabel: "Chat",
    TaskTabSupervisorInfoLabel: "Info",
    MicNotAvailableNotification: "Unable to access microphone, please check browser settings.",
    BrowserVoiceDisabledNotification: "Call cannot be accepted. Twilio Voice SDK has been disabled.",
    MessageSizeExceeded: "The entered character number exceeds the limit - {{currentCharCount}}/{{maxCharCount}}",
    UserControlWorkerSecondLine: "{{worker.activityName}} | {{worker.activityDuration}}",
    UserLoggedOutSuccess: "You have logged out successfully!",
    CannotChangeOtherWorkerActivity:
        "You cannot change an agent's activity while they have a pending task/reservation.",
    CallCanvasWorkerOnHold: "You are on hold",
    CallCanvasUnholdWorker: "Unhold",
    CallParticipantStatusOnHold: "On Hold",
    CallParticipantStatusLive: "Live",
    CallParticipantStatusConnecting: "Calling...",
    CallParticipantStatusLeft: "Caller left",
    CallParticipantStatusTransferFailed: "No Answer",
    CallParticipantStatusKickConfirmation: "Remove from call?",
    LiveCommsIncomingDirectCallTransfer: "Request from {{task.incomingTransferObject.worker.fullName}} (direct)",
    LiveCommsIncomingQueueCallTransfer:
        "Request from {{task.incomingTransferObject.worker.fullName}} ({{task.incomingTransferObject.queue.name}})",
    CallParticipantCustomerName: "{{task.defaultFrom}}",
    MonitoringFailedNotification: "Monitoring attempt has failed",
    PredefinedChatMessageAuthorName: "Bot",
    PredefinedChatMessageBody: "Hi there! How can we help you today?",
    AgentStatusAvailable: "Available",
    AgentStatusBusy: "Busy",
    AgentStatusUnavailable: "Unavailable",
    AgentStatusOffline: "Offline",
    ActiveTasksTileTitle: "Active tasks",
    WaitingTasksTileTitle: "Waiting tasks",
    AgentsByActivityTileTitle: "Agents",
    LongestWaitTimeTileTitle: "Longest wait",
    QueuesNoDataHeading: "Queues",
    QueuesNoDataBodyForAdmin: "You have no Queues set up. Please configure your Queues.",
    QueuesNoDataBodyForSupervisor: "There are no Queues set up. Please contact your Administrator.",
    QueuesNoDataLinkLabelForAdmin: "Add Queue",
    PendingReservationsOnLogoutNotification: "You cannot logout while you have a pending task/reservation",
    PendingReservationsOnActivityStateChangeNotification:
        "You cannot update your activity while you have a pending task/reservation",
    AcceptTaskTooltip: "Accept",
    RejectTaskTooltip: "Reject",
    HangupCallTooltip: "Hang up",
    LeaveCallTooltip: "Leave",
    MuteCallTooltip: "Mute",
    HoldCustomerTooltip: "Hold Customer",
    UnholdCustomerTooltip: "Unhold Customer",
    HoldAgentTooltip: "Hold {{worker.fullName}}",
    UnholdAgentTooltip: "Unhold {{worker.fullName}}",
    CancelTransferTooltip: "Cancel Consult",
    KickAgentTooltip: "Hang up {{worker.fullName}}",
    ColdTransferTooltip: "Transfer",
    WarmTransferTooltip: "Consult",
    MonitorCallTooltip: "Monitor Call",
    LogToFileStartLoggingText: `<div>
    <h2>Capture logs</h2>
    <ul>
        <li>When you enable logging, your browser will be refreshed and logs capturing will start.</li>
        <li>Once you are ready to finish - stop logging. All captured logs will be saved to a text file.</li>
    </ul>
  </div>`,
    LogToFileStartLoggingLabel: "Refresh and start",
    LogToFileStopLoggingText: `<div>
    <h2>Logging is active</h2>
    <p>
    If you've repeated your actions and reproduced the issue, stop logging to download the file with captured logs.
    </p>
  </div>`,
    LogToFileStopLoggingLabel: "Finish and download",
    ChatOrchestrationAddToChatChannelFailed: "Failed to add worker to the chat channel.",
    ChatOrchestrationDeactivateChatChannelFailed: "Failed to deactivate the chat channel.",
    ChatOrchestrationLeaveChatChannelFailed: "Failed to remove worker from the chat channel.",
    TeamsViewFilterAction: "Filter{{#if filterCount}} ({{filterCount}}){{/if}}",
    TeamsViewClearSearchAction: "Clear search result",
    TeamsViewClearSearchPlaceholder: "Search Agents",
    TeamsViewResultsSummaryNoWorkersDisplayed: "No agents matched your criteria. Refine results via search or filter.",
    TeamsViewResultsSummaryMaxWorkersDisplayed: "Showing maximum number of agents. Refine results via search or ",
    TeamsViewResultsSummaryFilterCTA: "filter",
    TeamFiltersPanelTitle: "Filters",
    TeamFiltersPanelSingularLabel: "Viewing <strong>{{number}}</strong> agent",
    TeamFiltersPanelPluralLabel: "Viewing <strong>{{number}}</strong> agents",
    TeamFiltersApply: "Apply",
    TeamFiltersReset: "Reset",
    InputPlaceHolder: "Type message",
    TypingIndicator: "{0} is typing … ",
    Connecting: "Connecting …",
    Disconnected: "Connection lost",
    Read: "Read",
    MessageSendingDisabled: "Message sending has been disabled",
    Today: "TODAY",
    Yesterday: "YESTERDAY",
    MessageCanvasTrayContent: `
        <h6>Complete</h6>
        <p>This chat is no longer active.</p>`,
    MessageCanvasTrayButton: "START NEW CHAT",
    WelcomeMessage: "Welcome to customer service",
    NotificationMessage: "Unable to perform action: {{message}}",
    Save: "SAVE",
    Reset: "RESET",
    MessageCharacterCountStatus: "{{currentCharCount}} / {{maxCharCount}}",
    MessageCharacterCountReached: "Character count reached - {{currentCharCount}} / {{maxCharCount}}",
    SendMessageTooltip: "Send Message",
    FieldValidationRequiredField: "Field required",
    FieldValidationInvalidEmail: "Please provide a valid email address",
    ChatInputUserNotMemberDisabledText: "You are not a participant of this chat",
    FilterItemAny: "Any",
    FilterItemAmountSelected: "{{amount}} selected",
    FilterItemOnly: "{{item.label}} only"
};
```
