* feat: baileys provider and placeholder for link device modal * chore: drop qrcode.vue in favor of just img tag * chore: update modal props * feat: setup channel provider connection * chore: update .env.example with Baileys API default configuration * feat: add support for Baileys provider in WhatsApp events processing * chore: rename Baileys API default host variable to DEFAULT_BAILEYS_URL * feat: add setup and disconnect methods for Baileys channel provider in inboxes controller that will be implemented * feat: add CHANNEL_CONNECTION_UPDATE event and include it in broadcast data preparation * refactor: simplify channel retrieval logic in WhatsappEventsJob * refactor: revert CHANNEL_UPDATE_EVENTS constant from ActionCableBroadcastJob * feat: add 'baileys' as a provider option in Whatsapp channel model * feat: add provider_connection field to Whatsapp channel model and migration * refactor: remove unnecessary CHANNEL_CONNECTION_UPDATE event type * feat: implement channel provider connection with baileys API * feat: add inbox association to Whatsapp channel model and update webhook URL handling * feat: enhance Baileys service to handle webhook multiple event types * refactor: simplify webhook verification logic in Baileys service * feat: add setup channel provider call, and refactor some logic * chore: adapt logic to new API * refactor: fix typo * refactor: fix import * refactor: fix typo * chore: add fixme comment about race condition * fix: remove double disconnect call * feat: implement message processing for incoming WhatsApp messages * refactor: streamline message type determination and improve readability * chore: increase cache key granularity provider connection info might be updated multiple times within 1 second, so updates might be lost due to cache key not being updated. changing cache key to milliseconds solves this * feat: add `is-loading` to buttons * feat: update send_message method to use 'to' parameter and improve error handling * refactor: simplify test setup and update API key in specs * chore: add setup and disconnect channel provider specs * test: fix spec after increase cache key granularity * feat: handle reconnecting state on modal * style: centered error text * feat: advanced options on create inbox * feat: handle new reconnecting on backend * refactor: update inbox controller specs and leave a FIXME note * test: add specs for Whatsapp::IncomingMessageBaileysService * feat: add baileys configuration page * feat: link device button when disconnected on conversation * chore: refactor .env.example * feat: add TODO for unimplemented methods in IncomingMessageBaileysService * fix: correct method name and update environment variable references in WhatsappBaileysService * refactor: simplify channel lookup by removing redundant method and handling phone number check directly * chore: add TODO for unimplemented event processing methods in IncomingMessageBaileysService * fix: update environment variable references in WhatsappBaileysService tests * chore(webhook): add pt-BR translations * chore: add pt-br translations * chore: inboxname component margin * refactor: inboxname computed prop * feat: enhance WhatsApp provider connection handling and message processing * test: inbox controller * chore: improve baileys connection and messages handling * test: incoming message service baileys * refactor: update provider config validation and improve test setup for WhatsApp Baileys service * fix: ensure only text messages are sent and update message source ID * fix: create message * fix: only update message on success * test: fix broken specs * chore: raise error on unsupported message content type * feat: hide provider connection data from non-admins * fix: update advanced options * chore: move class definition * fix: issue with send_message not returning id --------- Co-authored-by: gabrieljablonski <contact@gabrieljablonski.com>
302 lines
13 KiB
YAML
302 lines
13 KiB
YAML
# Files in the config/locales directory are used for internationalization
|
|
# and are automatically loaded by Rails. If you want to use locales other
|
|
# than English, add the necessary files in this directory.
|
|
#
|
|
# To use the locales, use `I18n.t`:
|
|
#
|
|
# I18n.t 'hello'
|
|
#
|
|
# In views, this is aliased to just `t`:
|
|
#
|
|
# <%= t('hello') %>
|
|
#
|
|
# To use a different locale, set it with `I18n.locale`:
|
|
#
|
|
# I18n.locale = :es
|
|
#
|
|
# This would use the information in config/locales/es.yml.
|
|
#
|
|
# The following keys must be escaped otherwise they will not be retrieved by
|
|
# the default I18n backend:
|
|
#
|
|
# true, false, on, off, yes, no
|
|
#
|
|
# Instead, surround them with single quotes.
|
|
#
|
|
# en:
|
|
# 'true': 'foo'
|
|
#
|
|
# To learn more, please read the Rails Internationalization guide
|
|
# available at https://guides.rubyonrails.org/i18n.html.
|
|
|
|
en:
|
|
hello: 'Hello world'
|
|
messages:
|
|
reset_password_success: Woot! Request for password reset is successful. Check your mail for instructions.
|
|
reset_password_failure: Uh ho! We could not find any user with the specified email.
|
|
inbox_deletetion_response: Your inbox deletion request will be processed in some time.
|
|
|
|
errors:
|
|
validations:
|
|
presence: must not be blank
|
|
webhook:
|
|
invalid: Invalid events
|
|
signup:
|
|
disposable_email: We do not allow disposable emails
|
|
blocked_domain: This domain is not allowed. If you believe this is a mistake, please contact support.
|
|
invalid_email: You have entered an invalid email
|
|
email_already_exists: 'You have already signed up for an account with %{email}'
|
|
invalid_params: 'Invalid, please check the signup paramters and try again'
|
|
failed: Signup failed
|
|
data_import:
|
|
data_type:
|
|
invalid: Invalid data type
|
|
contacts:
|
|
import:
|
|
failed: File is blank
|
|
export:
|
|
success: We will notify you once contacts export file is ready to view.
|
|
email:
|
|
invalid: Invalid email
|
|
phone_number:
|
|
invalid: should be in e164 format
|
|
categories:
|
|
locale:
|
|
unique: should be unique in the category and portal
|
|
dyte:
|
|
invalid_message_type: 'Invalid message type. Action not permitted'
|
|
slack:
|
|
invalid_channel_id: 'Invalid slack channel. Please try again'
|
|
inboxes:
|
|
imap:
|
|
socket_error: Please check the network connection, IMAP address and try again.
|
|
no_response_error: Please check the IMAP credentials and try again.
|
|
host_unreachable_error: Host unreachable, Please check the IMAP address, IMAP port and try again.
|
|
connection_timed_out_error: Connection timed out for %{address}:%{port}
|
|
connection_closed_error: Connection closed.
|
|
validations:
|
|
name: should not start or end with symbols, and it should not have < > / \ @ characters.
|
|
channel:
|
|
provider_connection:
|
|
wrong_phone_number: The phone number you are trying to link is not the same as the one you have configured. Please make sure the phone number is correct before scanning the QR code.
|
|
custom_filters:
|
|
number_of_records: Limit reached. The maximum number of allowed custom filters for a user per account is 50.
|
|
invalid_attribute: Invalid attribute key - [%{key}]. The key should be one of [%{allowed_keys}] or a custom attribute defined in the account.
|
|
invalid_operator: Invalid operator. The allowed operators for %{attribute_name} are [%{allowed_keys}].
|
|
invalid_query_operator: Query operator must be either "AND" or "OR".
|
|
invalid_value: Invalid value. The values provided for %{attribute_name} are invalid
|
|
custom_attribute_definition:
|
|
key_conflict: The provided key is not allowed as it might conflict with default attributes.
|
|
reports:
|
|
period: Reporting period %{since} to %{until}
|
|
utc_warning: The report generated is in UTC timezone
|
|
agent_csv:
|
|
agent_name: Agent name
|
|
conversations_count: Assigned conversations
|
|
avg_first_response_time: Avg first response time
|
|
avg_resolution_time: Avg resolution time
|
|
resolution_count: Resolution Count
|
|
avg_customer_waiting_time: Avg customer waiting time
|
|
inbox_csv:
|
|
inbox_name: Inbox name
|
|
inbox_type: Inbox type
|
|
conversations_count: No. of conversations
|
|
avg_first_response_time: Avg first response time
|
|
avg_resolution_time: Avg resolution time
|
|
label_csv:
|
|
label_title: Label
|
|
conversations_count: No. of conversations
|
|
avg_first_response_time: Avg first response time
|
|
avg_resolution_time: Avg resolution time
|
|
team_csv:
|
|
team_name: Team name
|
|
conversations_count: Conversations count
|
|
avg_first_response_time: Avg first response time
|
|
avg_resolution_time: Avg resolution time
|
|
resolution_count: Resolution Count
|
|
avg_customer_waiting_time: Avg customer waiting time
|
|
conversation_traffic_csv:
|
|
timezone: Timezone
|
|
sla_csv:
|
|
conversation_id: Conversation ID
|
|
sla_policy_breached: SLA Policy
|
|
assignee: Assignee
|
|
team: Team
|
|
inbox: Inbox
|
|
labels: Labels
|
|
conversation_link: Link to the Conversation
|
|
breached_events: Breached Events
|
|
default_group_by: day
|
|
csat:
|
|
headers:
|
|
contact_name: Contact Name
|
|
contact_email_address: Contact Email Address
|
|
contact_phone_number: Contact Phone Number
|
|
link_to_the_conversation: Link to the conversation
|
|
agent_name: Agent Name
|
|
rating: Rating
|
|
feedback: Feedback Comment
|
|
recorded_at: Recorded date
|
|
notifications:
|
|
notification_title:
|
|
conversation_creation: 'A conversation (#%{display_id}) has been created in %{inbox_name}'
|
|
conversation_assignment: 'A conversation (#%{display_id}) has been assigned to you'
|
|
assigned_conversation_new_message: 'A new message is created in conversation (#%{display_id})'
|
|
conversation_mention: 'You have been mentioned in conversation (#%{display_id})'
|
|
sla_missed_first_response: 'SLA target first response missed for conversation (#%{display_id})'
|
|
sla_missed_next_response: 'SLA target next response missed for conversation (#%{display_id})'
|
|
sla_missed_resolution: 'SLA target resolution missed for conversation (#%{display_id})'
|
|
attachment: 'Attachment'
|
|
no_content: 'No content'
|
|
conversations:
|
|
messages:
|
|
instagram_story_content: '%{story_sender} mentioned you in the story: '
|
|
instagram_deleted_story_content: This story is no longer available.
|
|
deleted: This message was deleted
|
|
delivery_status:
|
|
error_code: 'Error code: %{error_code}'
|
|
activity:
|
|
status:
|
|
resolved: 'Conversation was marked resolved by %{user_name}'
|
|
contact_resolved: 'Conversation was resolved by %{contact_name}'
|
|
open: 'Conversation was reopened by %{user_name}'
|
|
pending: 'Conversation was marked as pending by %{user_name}'
|
|
snoozed: 'Conversation was snoozed by %{user_name}'
|
|
auto_resolved: 'Conversation was marked resolved by system due to %{duration} days of inactivity'
|
|
system_auto_open: System reopened the conversation due to a new incoming message.
|
|
priority:
|
|
added: '%{user_name} set the priority to %{new_priority}'
|
|
updated: '%{user_name} changed the priority from %{old_priority} to %{new_priority}'
|
|
removed: '%{user_name} removed the priority'
|
|
assignee:
|
|
self_assigned: '%{user_name} self-assigned this conversation'
|
|
assigned: 'Assigned to %{assignee_name} by %{user_name}'
|
|
removed: 'Conversation unassigned by %{user_name}'
|
|
team:
|
|
assigned: 'Assigned to %{team_name} by %{user_name}'
|
|
assigned_with_assignee: 'Assigned to %{assignee_name} via %{team_name} by %{user_name}'
|
|
removed: 'Unassigned from %{team_name} by %{user_name}'
|
|
labels:
|
|
added: '%{user_name} added %{labels}'
|
|
removed: '%{user_name} removed %{labels}'
|
|
sla:
|
|
added: '%{user_name} added SLA policy %{sla_name}'
|
|
removed: '%{user_name} removed SLA policy %{sla_name}'
|
|
muted: '%{user_name} has muted the conversation'
|
|
unmuted: '%{user_name} has unmuted the conversation'
|
|
auto_resolution_message: 'Resolving the conversation as it has been inactive for a while. Please start a new conversation if you need further assistance.'
|
|
templates:
|
|
greeting_message_body: '%{account_name} typically replies in a few hours.'
|
|
ways_to_reach_you_message_body: 'Give the team a way to reach you.'
|
|
email_input_box_message_body: 'Get notified by email'
|
|
csat_input_message_body: 'Please rate the conversation'
|
|
reply:
|
|
email:
|
|
header:
|
|
from_with_name: '%{assignee_name} from %{inbox_name} <%{from_email}>'
|
|
reply_with_name: '%{assignee_name} from %{inbox_name} <reply+%{reply_email}>'
|
|
friendly_name: '%{sender_name} from %{business_name} <%{from_email}>'
|
|
professional_name: '%{business_name} <%{from_email}>'
|
|
channel_email:
|
|
header:
|
|
reply_with_name: '%{assignee_name} from %{inbox_name} <%{from_email}>'
|
|
reply_with_inbox_name: '%{inbox_name} <%{from_email}>'
|
|
email_subject: 'New messages on this conversation'
|
|
transcript_subject: 'Conversation Transcript'
|
|
survey:
|
|
response: 'Please rate this conversation, %{link}'
|
|
contacts:
|
|
online:
|
|
delete: '%{contact_name} is Online, please try again later'
|
|
integration_apps:
|
|
dashboard_apps:
|
|
name: 'Dashboard Apps'
|
|
description: 'Dashboard Apps allow you to create and embed applications that display user information, orders, or payment history, providing more context to your customer support agents.'
|
|
dyte:
|
|
name: 'Dyte'
|
|
description: 'Dyte is a product that integrates audio and video functionalities into your application. With this integration, your agents can start video/voice calls with your customers directly from Chatwoot.'
|
|
meeting_name: '%{agent_name} has started a meeting'
|
|
slack:
|
|
name: 'Slack'
|
|
description: "Integrate Chatwoot with Slack to keep your team in sync. This integration allows you to receive notifications for new conversations and respond to them directly within Slack's interface."
|
|
webhooks:
|
|
name: 'Webhooks'
|
|
description: 'Webhook events provide real-time updates about activities in your Chatwoot account. You can subscribe to your preferred events, and Chatwoot will send you HTTP callbacks with the updates.'
|
|
dialogflow:
|
|
name: 'Dialogflow'
|
|
description: 'Build chatbots with Dialogflow and easily integrate them into your inbox. These bots can handle initial queries before transferring them to a customer service agent.'
|
|
google_translate:
|
|
name: 'Google Translate'
|
|
description: "Integrate Google Translate to help agents easily translate customer messages. This integration automatically detects the language and converts it to the agent's or admin's preferred language."
|
|
openai:
|
|
name: 'OpenAI'
|
|
description: 'Leverage the power of large language models from OpenAI with the features such as reply suggestions, summarization, message rephrasing, spell-checking, and label classification.'
|
|
linear:
|
|
name: 'Linear'
|
|
description: 'Create issues in Linear directly from your conversation window. Alternatively, link existing Linear issues for a more streamlined and efficient issue tracking process.'
|
|
shopify:
|
|
name: 'Shopify'
|
|
description: 'Connect your Shopify store to access order details, customer information, and product data directly within your conversations and helps your support team provide faster, more contextual assistance to your customers.'
|
|
captain:
|
|
copilot_error: 'Please connect an assistant to this inbox to use Copilot'
|
|
copilot_limit: 'You are out of Copilot credits. You can buy more credits from the billing section.'
|
|
public_portal:
|
|
search:
|
|
search_placeholder: Search for article by title or body...
|
|
empty_placeholder: No results found.
|
|
loading_placeholder: Searching...
|
|
results_title: Search results
|
|
toc_header: 'On this page'
|
|
hero:
|
|
sub_title: Search for the articles here or browse the categories below.
|
|
common:
|
|
home: Home
|
|
last_updated_on: Last updated on %{last_updated_on}
|
|
view_all_articles: View all
|
|
article: article
|
|
articles: articles
|
|
author: author
|
|
authors: authors
|
|
other: other
|
|
others: others
|
|
by: By
|
|
no_articles: There are no articles here
|
|
footer:
|
|
made_with: Made with
|
|
header:
|
|
go_to_homepage: Website
|
|
appearance:
|
|
system: System
|
|
light: Light
|
|
dark: Dark
|
|
featured_articles: Featured Articles
|
|
uncategorized: Uncategorized
|
|
404:
|
|
title: Page not found
|
|
description: We couldn't find the page you were looking for.
|
|
back_to_home: Go to home page
|
|
slack_unfurl:
|
|
fields:
|
|
name: Name
|
|
email: Email
|
|
phone_number: Phone
|
|
company_name: Company
|
|
inbox_name: Inbox
|
|
inbox_type: Inbox Type
|
|
button: Open conversation
|
|
time_units:
|
|
days:
|
|
one: '%{count} day'
|
|
other: '%{count} days'
|
|
hours:
|
|
one: '%{count} hour'
|
|
other: '%{count} hours'
|
|
minutes:
|
|
one: '%{count} minute'
|
|
other: '%{count} minutes'
|
|
seconds:
|
|
one: '%{count} second'
|
|
other: '%{count} seconds'
|
|
automation:
|
|
system_name: 'Automation System'
|