From 644f07a23d97726d9c80cfab4fd656cd9f53d282 Mon Sep 17 00:00:00 2001 From: Prithvi Tharun Date: Wed, 15 Jun 2022 18:34:24 +0530 Subject: [PATCH 01/70] chore: Copy change for automatic greeting message (#4727) fixes: #4726 --- app/javascript/dashboard/i18n/locale/en/inboxMgmt.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/dashboard/i18n/locale/en/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/en/inboxMgmt.json index 6bc5603b0..54e69c304 100644 --- a/app/javascript/dashboard/i18n/locale/en/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/en/inboxMgmt.json @@ -82,7 +82,7 @@ }, "CHANNEL_GREETING_TOGGLE": { "LABEL": "Enable channel greeting", - "HELP_TEXT": "Send a greeting message to the users when they starts the conversation.", + "HELP_TEXT": "Automatically send a greeting message when a new conversation is created.", "ENABLED": "Enabled", "DISABLED": "Disabled" }, From 205d42e978f38362decd75e4d661f090bfdadcbd Mon Sep 17 00:00:00 2001 From: Fayaz Ahmed <15716057+fayazara@users.noreply.github.com> Date: Thu, 16 Jun 2022 11:02:32 +0530 Subject: [PATCH 02/70] fix: Bulk actions agent loading (#4874) --- .../conversationBulkActions/AgentSelector.vue | 10 +++++++--- .../conversationBulkActions/LabelActions.vue | 10 +++++----- app/javascript/shared/assets/stylesheets/spacing.scss | 3 ++- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/app/javascript/dashboard/components/widgets/conversation/conversationBulkActions/AgentSelector.vue b/app/javascript/dashboard/components/widgets/conversation/conversationBulkActions/AgentSelector.vue index acf23d716..f7777e357 100644 --- a/app/javascript/dashboard/components/widgets/conversation/conversationBulkActions/AgentSelector.vue +++ b/app/javascript/dashboard/components/widgets/conversation/conversationBulkActions/AgentSelector.vue @@ -22,7 +22,10 @@ />
-
+

{{ $t('BULK_ACTION.AGENT_LIST_LOADING') }}

@@ -171,7 +174,7 @@ export default { transform-origin: top right; width: auto; z-index: var(--z-index-twenty); - + min-width: var(--space-giga); .header { padding: var(--space-one); @@ -182,7 +185,7 @@ export default { } .container { - max-height: 24rem; + max-height: var(--space-giga); overflow-y: auto; .agent__list-container { height: 100%; @@ -264,5 +267,6 @@ ul { align-items: center; justify-content: center; flex-direction: column; + padding: var(--space-two); } diff --git a/app/javascript/dashboard/components/widgets/conversation/conversationBulkActions/LabelActions.vue b/app/javascript/dashboard/components/widgets/conversation/conversationBulkActions/LabelActions.vue index eb93586e3..70f74199b 100644 --- a/app/javascript/dashboard/components/widgets/conversation/conversationBulkActions/LabelActions.vue +++ b/app/javascript/dashboard/components/widgets/conversation/conversationBulkActions/LabelActions.vue @@ -110,7 +110,7 @@ export default { .labels-list { display: flex; flex-direction: column; - max-height: 24rem; + max-height: var(--space-giga); min-height: auto; .labels-list__header { @@ -157,8 +157,8 @@ export default { border-radius: var(--border-radius-large); border: 1px solid var(--s-50); box-shadow: var(--shadow-dropdown-pane); - max-width: 24rem; - min-width: 24rem; + max-width: var(--space-giga); + min-width: var(--space-giga); position: absolute; right: 4.5rem; top: var(--space-larger); @@ -176,7 +176,7 @@ export default { } .container { - max-height: 24rem; + max-height: var(--space-giga); overflow-y: auto; .label__list-container { @@ -204,7 +204,7 @@ export default { .triangle { display: block; position: absolute; - right: 2rem; + right: var(--space-two); text-align: left; top: calc(var(--space-slab) * -1); z-index: var(--z-index-one); diff --git a/app/javascript/shared/assets/stylesheets/spacing.scss b/app/javascript/shared/assets/stylesheets/spacing.scss index 9ce5fecb0..c556c65b8 100644 --- a/app/javascript/shared/assets/stylesheets/spacing.scss +++ b/app/javascript/shared/assets/stylesheets/spacing.scss @@ -15,7 +15,8 @@ --space-larger: 4.8rem; --space-jumbo: 6.4rem; --space-mega: 10rem; - + --space-giga: 24rem; + --space-minus-micro: -0.2rem; --space-minus-smaller: -0.4rem; --space-minus-small: -0.8rem; From db8626335368b915667ece05201e2205552c90be Mon Sep 17 00:00:00 2001 From: Sojan Jose Date: Fri, 17 Jun 2022 03:07:07 +0530 Subject: [PATCH 03/70] chore: Codespace Improvements (#4867) - switch to ubuntu base image - use rbenv to manage ruby - add gh to base image --- .devcontainer/Dockerfile | 2 +- .devcontainer/Dockerfile.base | 47 ++++++++++++++++++++++++++------- .devcontainer/devcontainer.json | 9 ++++--- .devcontainer/scripts/setup.sh | 5 ++++ 4 files changed, 48 insertions(+), 15 deletions(-) diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index e3eb2fd01..2418bd621 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -5,4 +5,4 @@ FROM ghcr.io/chatwoot/chatwoot_codespace:latest # Do the set up required for chatwoot app WORKDIR /workspace COPY . /workspace -RUN yarn && gem install bundler && bundle install +RUN yarn && gem install bundler && bundle install diff --git a/.devcontainer/Dockerfile.base b/.devcontainer/Dockerfile.base index de007e202..769be24f8 100644 --- a/.devcontainer/Dockerfile.base +++ b/.devcontainer/Dockerfile.base @@ -1,6 +1,6 @@ -# pre-build stage -ARG VARIANT=3 -FROM mcr.microsoft.com/vscode/devcontainers/ruby:${VARIANT} + +ARG VARIANT=ubuntu-20.04 +FROM mcr.microsoft.com/vscode/devcontainers/base:${VARIANT} # Update args in docker-compose.yaml to set the UID/GID of the "vscode" user. ARG USER_UID=1000 @@ -11,23 +11,36 @@ RUN if [ "$USER_GID" != "1000" ] || [ "$USER_UID" != "1000" ]; then \ && chmod -R $USER_UID:$USER_GID /home/vscode; \ fi -# [Option] Install Node.js -ARG INSTALL_NODE="true" -ARG NODE_VERSION="lts/*" -RUN if [ "${INSTALL_NODE}" = "true" ]; then su vscode -c "source /usr/local/share/nvm/nvm.sh && nvm install ${NODE_VERSION} 2>&1"; fi - RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \ && apt-get -y install --no-install-recommends \ + build-essential \ libssl-dev \ + zlib1g-dev \ + gnupg2 \ tar \ tzdata \ postgresql-client \ + libpq-dev \ yarn \ git \ imagemagick \ tmux \ - zsh + zsh \ + git-flow \ + npm +# Install rbenv and ruby +ARG RUBY_VERSION="3.0.4" +RUN git clone https://github.com/rbenv/rbenv.git ~/.rbenv \ + && echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc \ + && echo 'eval "$(rbenv init -)"' >> ~/.bashrc +ENV PATH "/root/.rbenv/bin/:/root/.rbenv/shims/:$PATH" +RUN git clone https://github.com/rbenv/ruby-build.git && \ + PREFIX=/usr/local ./ruby-build/install.sh + +RUN rbenv install $RUBY_VERSION && \ + rbenv global $RUBY_VERSION && \ + rbenv versions # Install overmind RUN curl -L https://github.com/DarthSim/overmind/releases/download/v2.1.0/overmind-v2.1.0-linux-amd64.gz > overmind.gz \ @@ -35,11 +48,25 @@ RUN curl -L https://github.com/DarthSim/overmind/releases/download/v2.1.0/overmi && sudo mv overmind /usr/local/bin \ && chmod +x /usr/local/bin/overmind + +# Install gh +RUN curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | sudo dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg \ + && echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | sudo tee /etc/apt/sources.list.d/github-cli.list > /dev/null \ + && sudo apt update \ + && sudo apt install gh + + # Do the set up required for chatwoot app WORKDIR /workspace COPY . /workspace -RUN yarn +# set up ruby COPY Gemfile Gemfile.lock ./ RUN gem install bundler && bundle install +# set up node js +RUN npm install npm@latest -g && \ + npm install n -g && \ + n latest +RUN npm install --global yarn +RUN yarn diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index c0301d87b..a70ba3788 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -23,17 +23,18 @@ // 5432 postgres // 6379 redis // 1025,8025 mailhog - "forwardPorts": [8025], - //your application may need to listen on all interfaces (0.0.0.0) not just localhost for it to be available externally. Defaults to [] - "appPort": [3000, 3035], + "forwardPorts": [8025, 3000, 3035], "postCreateCommand": ".devcontainer/scripts/setup.sh && bundle exec rake db:chatwoot_prepare && yarn", "portsAttributes": { "3000": { "label": "Rails Server" }, + "3035": { + "label": "Webpack Dev Server" + }, "8025": { "label": "Mailhog UI" } - }, + } } diff --git a/.devcontainer/scripts/setup.sh b/.devcontainer/scripts/setup.sh index 1b5842603..32ba272a8 100755 --- a/.devcontainer/scripts/setup.sh +++ b/.devcontainer/scripts/setup.sh @@ -6,3 +6,8 @@ sed -i -e "/FRONTEND_URL/ s/=.*/=https:\/\/$CODESPACE_NAME-3000.githubpreview.de sed -i -e "/WEBPACKER_DEV_SERVER_PUBLIC/ s/=.*/=https:\/\/$CODESPACE_NAME-3035.githubpreview.dev/" .env # uncomment the webpacker env variable sed -i -e '/WEBPACKER_DEV_SERVER_PUBLIC/s/^# //' .env +# fix the error with webpacker +echo 'export NODE_OPTIONS=--openssl-legacy-provider' >> ~/.bashrc + +# codespaces make the ports public +gh codespace ports visibility 3000:public 3035:public 8025:public -c $CODESPACE_NAME From 6c6df8661b2b3bf6e4908465065469aa6fa898a7 Mon Sep 17 00:00:00 2001 From: Sojan Jose Date: Fri, 17 Jun 2022 19:12:56 +0530 Subject: [PATCH 04/70] chore: Codespace webpacker fix (#4887) - fixes the webpacker error when running overmind start -f Procfile.dev --- .devcontainer/scripts/setup.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.devcontainer/scripts/setup.sh b/.devcontainer/scripts/setup.sh index 32ba272a8..4ffee2d3a 100755 --- a/.devcontainer/scripts/setup.sh +++ b/.devcontainer/scripts/setup.sh @@ -7,7 +7,7 @@ sed -i -e "/WEBPACKER_DEV_SERVER_PUBLIC/ s/=.*/=https:\/\/$CODESPACE_NAME-3035.g # uncomment the webpacker env variable sed -i -e '/WEBPACKER_DEV_SERVER_PUBLIC/s/^# //' .env # fix the error with webpacker -echo 'export NODE_OPTIONS=--openssl-legacy-provider' >> ~/.bashrc +echo 'export NODE_OPTIONS=--openssl-legacy-provider' >> ~/.zshrc # codespaces make the ports public gh codespace ports visibility 3000:public 3035:public 8025:public -c $CODESPACE_NAME From a8c6cd729b51dfee644da9a8bc1516c53d6f9ea1 Mon Sep 17 00:00:00 2001 From: Muhsin Keloth Date: Mon, 20 Jun 2022 14:16:49 +0530 Subject: [PATCH 05/70] chore: Sync pre-chat fields after custom attribute update (#4692) --- ...pdate_widget_pre_chat_custom_fields_job.rb | 21 +++++++++++++ app/models/custom_attribute_definition.rb | 5 ++++ ..._widget_pre_chat_custom_fields_job_spec.rb | 2 +- ..._widget_pre_chat_custom_fields_job_spec.rb | 30 +++++++++++++++++++ 4 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 app/jobs/inboxes/update_widget_pre_chat_custom_fields_job.rb create mode 100644 spec/jobs/inboxes/update_widget_pre_chat_custom_fields_job_spec.rb diff --git a/app/jobs/inboxes/update_widget_pre_chat_custom_fields_job.rb b/app/jobs/inboxes/update_widget_pre_chat_custom_fields_job.rb new file mode 100644 index 000000000..b17ecdf55 --- /dev/null +++ b/app/jobs/inboxes/update_widget_pre_chat_custom_fields_job.rb @@ -0,0 +1,21 @@ +class Inboxes::UpdateWidgetPreChatCustomFieldsJob < ApplicationJob + queue_as :default + + def perform(account, custom_attribute) + attribute_key = custom_attribute['attribute_key'] + account.web_widgets.all.find_each do |web_widget| + pre_chat_fields = web_widget.pre_chat_form_options['pre_chat_fields'] + pre_chat_fields.each_with_index do |pre_chat_field, index| + next unless pre_chat_field['name'] == attribute_key + + web_widget.pre_chat_form_options['pre_chat_fields'][index] = + pre_chat_field.deep_merge({ + 'label' => custom_attribute['attribute_display_name'], + 'placeholder' => custom_attribute['attribute_display_name'], + 'values' => custom_attribute['attribute_values'] + }) + end + web_widget.save! + end + end +end diff --git a/app/models/custom_attribute_definition.rb b/app/models/custom_attribute_definition.rb index fa0370375..59a314da6 100644 --- a/app/models/custom_attribute_definition.rb +++ b/app/models/custom_attribute_definition.rb @@ -34,6 +34,7 @@ class CustomAttributeDefinition < ApplicationRecord enum attribute_display_type: { text: 0, number: 1, currency: 2, percent: 3, link: 4, date: 5, list: 6, checkbox: 7 } belongs_to :account + after_update :update_widget_pre_chat_custom_fields after_destroy :sync_widget_pre_chat_custom_fields private @@ -41,4 +42,8 @@ class CustomAttributeDefinition < ApplicationRecord def sync_widget_pre_chat_custom_fields ::Inboxes::SyncWidgetPreChatCustomFieldsJob.perform_now(account, attribute_key) end + + def update_widget_pre_chat_custom_fields + ::Inboxes::UpdateWidgetPreChatCustomFieldsJob.perform_now(account, self) + end end diff --git a/spec/jobs/inboxes/sync_widget_pre_chat_custom_fields_job_spec.rb b/spec/jobs/inboxes/sync_widget_pre_chat_custom_fields_job_spec.rb index e6b23dccc..9348754d1 100644 --- a/spec/jobs/inboxes/sync_widget_pre_chat_custom_fields_job_spec.rb +++ b/spec/jobs/inboxes/sync_widget_pre_chat_custom_fields_job_spec.rb @@ -15,7 +15,7 @@ RSpec.describe Inboxes::SyncWidgetPreChatCustomFieldsJob, type: :job do end context 'when called' do - it 'reopens snoozed conversations whose snooze until has passed' do + it 'sync pre chat fields if custom attribute deleted' do described_class.perform_now(account, 'developer_id') expect(web_widget.reload.pre_chat_form_options['pre_chat_fields']).to eq [{ 'label' => 'Full Name', diff --git a/spec/jobs/inboxes/update_widget_pre_chat_custom_fields_job_spec.rb b/spec/jobs/inboxes/update_widget_pre_chat_custom_fields_job_spec.rb new file mode 100644 index 000000000..80a32be34 --- /dev/null +++ b/spec/jobs/inboxes/update_widget_pre_chat_custom_fields_job_spec.rb @@ -0,0 +1,30 @@ +require 'rails_helper' + +RSpec.describe Inboxes::UpdateWidgetPreChatCustomFieldsJob, type: :job do + pre_chat_fields = [{ + 'label' => 'Developer Id', + 'name' => 'developer_id' + }, { + 'label' => 'Full Name', + 'name' => 'full_name' + }] + pre_chat_message = 'Share your queries here.' + custom_attribute = { + 'attribute_key' => 'developer_id', + 'attribute_display_name' => 'Developer Number' + } + let!(:account) { create(:account) } + let!(:web_widget) do + create(:channel_widget, account: account, pre_chat_form_options: { pre_chat_message: pre_chat_message, pre_chat_fields: pre_chat_fields }) + end + + context 'when called' do + it 'sync pre chat fields if custom attribute updated' do + described_class.perform_now(account, custom_attribute) + expect(web_widget.reload.pre_chat_form_options['pre_chat_fields']).to eq [ + { 'label' => 'Developer Number', 'name' => 'developer_id', 'placeholder' => 'Developer Number', + 'values' => nil }, { 'label' => 'Full Name', 'name' => 'full_name' } + ] + end + end +end From f31c6d5de285665aff508d15c6121653b274e09d Mon Sep 17 00:00:00 2001 From: Nithin David Thomas <1277421+nithindavid@users.noreply.github.com> Date: Mon, 20 Jun 2022 15:09:22 +0530 Subject: [PATCH 06/70] feat: Update the design of labels to use a `smooth` theme (#4325) Co-authored-by: Sivin Varghese <64252451+iamsivin@users.noreply.github.com> Co-authored-by: Pranav Raj S --- .../assets/scss/_foundation-settings.scss | 4 +- .../dashboard/components/ui/Label.vue | 59 ++++++++++++++++--- .../components/widgets/LabelSelector.vue | 3 +- .../conversation/labels/LabelBox.vue | 3 +- .../shared/assets/stylesheets/colors.scss | 10 ++-- .../components/ui/dropdown/AddLabel.vue | 26 ++++---- 6 files changed, 71 insertions(+), 34 deletions(-) diff --git a/app/javascript/dashboard/assets/scss/_foundation-settings.scss b/app/javascript/dashboard/assets/scss/_foundation-settings.scss index c6b7f6fd3..d13dcbe5e 100644 --- a/app/javascript/dashboard/assets/scss/_foundation-settings.scss +++ b/app/javascript/dashboard/assets/scss/_foundation-settings.scss @@ -383,8 +383,8 @@ $form-button-radius: var(--border-radius-normal); // 20. Label // --------- -$label-background: $primary-color; -$label-color: $white; +$label-background: $white; +$label-color: $black; $label-color-alt: $black; $label-palette: $foundation-palette; $label-font-size: $font-size-mini; diff --git a/app/javascript/dashboard/components/ui/Label.vue b/app/javascript/dashboard/components/ui/Label.vue index 504f6fc9e..d4059d21c 100644 --- a/app/javascript/dashboard/components/ui/Label.vue +++ b/app/javascript/dashboard/components/ui/Label.vue @@ -1,13 +1,18 @@ @@ -27,16 +31,18 @@ import PageHeader from '../../SettingsSubPageHeader'; import Twilio from './Twilio'; import ThreeSixtyDialogWhatsapp from './360DialogWhatsapp'; +import CloudWhatsapp from './CloudWhatsapp'; export default { components: { PageHeader, Twilio, ThreeSixtyDialogWhatsapp, + CloudWhatsapp, }, data() { return { - provider: 'twilio', + provider: 'whatsapp_cloud', }; }, }; diff --git a/app/jobs/webhooks/whatsapp_events_job.rb b/app/jobs/webhooks/whatsapp_events_job.rb index 315f08907..fabd127a2 100644 --- a/app/jobs/webhooks/whatsapp_events_job.rb +++ b/app/jobs/webhooks/whatsapp_events_job.rb @@ -2,12 +2,39 @@ class Webhooks::WhatsappEventsJob < ApplicationJob queue_as :default def perform(params = {}) + channel = find_channel_from_whatsapp_business_payload(params) || find_channel(params) + return if channel.blank? + + case channel.provider + when 'whatsapp_cloud' + Whatsapp::IncomingMessageWhatsappCloudService.new(inbox: channel.inbox, params: params).perform + else + Whatsapp::IncomingMessageService.new(inbox: channel.inbox, params: params).perform + end + end + + private + + def find_channel(params) return unless params[:phone_number] - channel = Channel::Whatsapp.find_by(phone_number: params[:phone_number]) - return unless channel + Channel::Whatsapp.find_by(phone_number: params[:phone_number]) + end - # TODO: pass to appropriate provider service from here - Whatsapp::IncomingMessageService.new(inbox: channel.inbox, params: params['whatsapp'].with_indifferent_access).perform + def find_channel_from_whatsapp_business_payload(params) + # for the case where facebook cloud api support multiple numbers for a single app + # https://github.com/chatwoot/chatwoot/issues/4712#issuecomment-1173838350 + # we will give priority to the phone_number in the payload + return unless params[:object] == 'whatsapp_business_account' + + get_channel_from_wb_payload(params) + end + + def get_channel_from_wb_payload(wb_params) + phone_number = "+#{wb_params[:entry].first[:changes].first.dig(:value, :metadata, :display_phone_number)}" + phone_number_id = wb_params[:entry].first[:changes].first.dig(:value, :metadata, :phone_number_id) + channel = Channel::Whatsapp.find_by(phone_number: phone_number) + # validate to ensure the phone number id matches the whatsapp channel + return channel if channel && channel.provider_config['phone_number_id'] == phone_number_id end end diff --git a/app/models/channel/whatsapp.rb b/app/models/channel/whatsapp.rb index 1f7a14c39..7be40ab33 100644 --- a/app/models/channel/whatsapp.rb +++ b/app/models/channel/whatsapp.rb @@ -21,135 +21,42 @@ class Channel::Whatsapp < ApplicationRecord include Channelable self.table_name = 'channel_whatsapp' - EDITABLE_ATTRS = [:phone_number, { provider_config: {} }].freeze + EDITABLE_ATTRS = [:phone_number, :provider, { provider_config: {} }].freeze + + # default at the moment is 360dialog lets change later. + PROVIDERS = %w[default whatsapp_cloud].freeze + + validates :provider, inclusion: { in: PROVIDERS } validates :phone_number, presence: true, uniqueness: true - before_save :validate_provider_config + validate :validate_provider_config after_create :sync_templates def name 'Whatsapp' end - # all this should happen in provider service . but hack mode on - def api_base_path - # provide the environment variable when testing against sandbox : 'https://waba-sandbox.360dialog.io/v1' - ENV.fetch('360DIALOG_BASE_URL', 'https://waba.360dialog.io/v1') - end - - # Extract later into provider Service - def send_message(phone_number, message) - if message.attachments.present? - send_attachment_message(phone_number, message) + def provider_service + if provider == 'whatsapp_cloud' + Whatsapp::Providers::WhatsappCloudService.new(whatsapp_channel: self) else - send_text_message(phone_number, message) + Whatsapp::Providers::Whatsapp360DialogService.new(whatsapp_channel: self) end end - def send_template(phone_number, template_info) - send_template_message(phone_number, template_info) - end - - def media_url(media_id) - "#{api_base_path}/media/#{media_id}" - end - - def api_headers - { 'D360-API-KEY' => provider_config['api_key'], 'Content-Type' => 'application/json' } - end - def messaging_window_enabled? true end - def sync_templates - response = HTTParty.get("#{api_base_path}/configs/templates", headers: api_headers) - update(message_templates: response['waba_templates'], message_templates_last_updated: Time.now.utc) if response.success? - end + delegate :send_message, to: :provider_service + delegate :send_template, to: :provider_service + delegate :sync_templates, to: :provider_service + delegate :media_url, to: :provider_service + delegate :api_headers, to: :provider_service private - def send_text_message(phone_number, message) - response = HTTParty.post( - "#{api_base_path}/messages", - headers: api_headers, - body: { - to: phone_number, - text: { body: message.content }, - type: 'text' - }.to_json - ) - - process_response(response) - end - - def send_attachment_message(phone_number, message) - attachment = message.attachments.first - type = %w[image audio video].include?(attachment.file_type) ? attachment.file_type : 'document' - attachment_url = attachment.download_url - response = HTTParty.post( - "#{api_base_path}/messages", - headers: api_headers, - body: { - 'to' => phone_number, - 'type' => type, - type.to_s => { - 'link': attachment_url, - 'caption': message.content - } - }.to_json - ) - - process_response(response) - end - - def send_template_message(phone_number, template_info) - response = HTTParty.post( - "#{api_base_path}/messages", - headers: api_headers, - body: { - to: phone_number, - template: template_body_parameters(template_info), - type: 'template' - }.to_json - ) - - process_response(response) - end - - def process_response(response) - if response.success? - response['messages'].first['id'] - else - Rails.logger.error response.body - nil - end - end - - def template_body_parameters(template_info) - { - name: template_info[:name], - namespace: template_info[:namespace], - language: { - policy: 'deterministic', - code: template_info[:lang_code] - }, - components: [{ - type: 'body', - parameters: template_info[:parameters] - }] - } - end - - # Extract later into provider Service def validate_provider_config - response = HTTParty.post( - "#{api_base_path}/configs/webhook", - headers: { 'D360-API-KEY': provider_config['api_key'], 'Content-Type': 'application/json' }, - body: { - url: "#{ENV['FRONTEND_URL']}/webhooks/whatsapp/#{phone_number}" - }.to_json - ) - errors.add(:provider_config, 'error setting up the webook') unless response.success? + errors.add(:provider_config, 'Invalid Credentials') unless provider_service.validate_provider_config? end end diff --git a/app/models/inbox.rb b/app/models/inbox.rb index bb5c8dba0..d3127b3cf 100644 --- a/app/models/inbox.rb +++ b/app/models/inbox.rb @@ -120,6 +120,8 @@ class Inbox < ApplicationRecord "#{ENV['FRONTEND_URL']}/webhooks/sms/#{channel.phone_number.delete_prefix('+')}" when 'Channel::Line' "#{ENV['FRONTEND_URL']}/webhooks/line/#{channel.line_channel_id}" + when 'Channel::Whatsapp' + "#{ENV['FRONTEND_URL']}/webhooks/whatsapp/#{channel.phone_number}" end end diff --git a/app/services/whatsapp/incoming_message_base_service.rb b/app/services/whatsapp/incoming_message_base_service.rb new file mode 100644 index 000000000..e55d5fd26 --- /dev/null +++ b/app/services/whatsapp/incoming_message_base_service.rb @@ -0,0 +1,110 @@ +# Mostly modeled after the intial implementation of the service based on 360 Dialog +# https://docs.360dialog.com/whatsapp-api/whatsapp-api/media +# https://developers.facebook.com/docs/whatsapp/api/media/ +class Whatsapp::IncomingMessageBaseService + pattr_initialize [:inbox!, :params!] + + def perform + processed_params + + set_contact + return unless @contact + + set_conversation + + return if @processed_params[:messages].blank? + + @message = @conversation.messages.build( + content: message_content(@processed_params[:messages].first), + account_id: @inbox.account_id, + inbox_id: @inbox.id, + message_type: :incoming, + sender: @contact, + source_id: @processed_params[:messages].first[:id].to_s + ) + attach_files + @message.save! + end + + private + + def processed_params + @processed_params ||= params + end + + def message_content(message) + # TODO: map interactive messages back to button messages in chatwoot + message.dig(:text, :body) || + message.dig(:button, :text) || + message.dig(:interactive, :button_reply, :title) || + message.dig(:interactive, :list_reply, :title) + end + + def account + @account ||= inbox.account + end + + def set_contact + contact_params = @processed_params[:contacts]&.first + return if contact_params.blank? + + contact_inbox = ::ContactBuilder.new( + source_id: contact_params[:wa_id], + inbox: inbox, + contact_attributes: { name: contact_params.dig(:profile, :name), phone_number: "+#{@processed_params[:messages].first[:from]}" } + ).perform + + @contact_inbox = contact_inbox + @contact = contact_inbox.contact + end + + def conversation_params + { + account_id: @inbox.account_id, + inbox_id: @inbox.id, + contact_id: @contact.id, + contact_inbox_id: @contact_inbox.id + } + end + + def set_conversation + @conversation = @contact_inbox.conversations.last + return if @conversation + + @conversation = ::Conversation.create!(conversation_params) + end + + def file_content_type(file_type) + return :image if %w[image sticker].include?(file_type) + return :audio if %w[audio voice].include?(file_type) + return :video if ['video'].include?(file_type) + + :file + end + + def message_type + @processed_params[:messages].first[:type] + end + + def attach_files + return if %w[text button interactive].include?(message_type) + + attachment_payload = @processed_params[:messages].first[message_type.to_sym] + attachment_file = download_attachment_file(attachment_payload) + + @message.content ||= attachment_payload[:caption] + @message.attachments.new( + account_id: @message.account_id, + file_type: file_content_type(message_type), + file: { + io: attachment_file, + filename: attachment_file.original_filename, + content_type: attachment_file.content_type + } + ) + end + + def download_attachment_file(attachment_payload) + Down.download(inbox.channel.media_url(attachment_payload[:id]), headers: inbox.channel.api_headers) + end +end diff --git a/app/services/whatsapp/incoming_message_service.rb b/app/services/whatsapp/incoming_message_service.rb index c96e6e771..f619bb269 100644 --- a/app/services/whatsapp/incoming_message_service.rb +++ b/app/services/whatsapp/incoming_message_service.rb @@ -1,100 +1,5 @@ # https://docs.360dialog.com/whatsapp-api/whatsapp-api/media # https://developers.facebook.com/docs/whatsapp/api/media/ -class Whatsapp::IncomingMessageService - pattr_initialize [:inbox!, :params!] - - def perform - set_contact - return unless @contact - - set_conversation - - return if params[:messages].blank? - - @message = @conversation.messages.build( - content: message_content(params[:messages].first), - account_id: @inbox.account_id, - inbox_id: @inbox.id, - message_type: :incoming, - sender: @contact, - source_id: params[:messages].first[:id].to_s - ) - attach_files - @message.save! - end - - private - - def message_content(message) - # TODO: map interactive messages back to button messages in chatwoot - message.dig(:text, :body) || - message.dig(:button, :text) || - message.dig(:interactive, :button_reply, :title) || - message.dig(:interactive, :list_reply, :title) - end - - def account - @account ||= inbox.account - end - - def set_contact - contact_params = params[:contacts]&.first - return if contact_params.blank? - - contact_inbox = ::ContactBuilder.new( - source_id: contact_params[:wa_id], - inbox: inbox, - contact_attributes: { name: contact_params.dig(:profile, :name), phone_number: "+#{params[:messages].first[:from]}" } - ).perform - - @contact_inbox = contact_inbox - @contact = contact_inbox.contact - end - - def conversation_params - { - account_id: @inbox.account_id, - inbox_id: @inbox.id, - contact_id: @contact.id, - contact_inbox_id: @contact_inbox.id - } - end - - def set_conversation - @conversation = @contact_inbox.conversations.last - return if @conversation - - @conversation = ::Conversation.create!(conversation_params) - end - - def file_content_type(file_type) - return :image if %w[image sticker].include?(file_type) - return :audio if %w[audio voice].include?(file_type) - return :video if ['video'].include?(file_type) - - :file - end - - def attach_files - return if %w[text button interactive].include?(message_type) - - attachment_payload = params[:messages].first[message_type.to_sym] - attachment_file = Down.download(inbox.channel.media_url(attachment_payload[:id]), headers: inbox.channel.api_headers) - - @message.content ||= attachment_payload[:caption] - @message.attachments.new( - account_id: @message.account_id, - file_type: file_content_type(message_type), - file: { - io: attachment_file, - filename: attachment_file.original_filename, - content_type: attachment_file.content_type - } - ) - end - - def message_type - params[:messages].first[:type] - end +class Whatsapp::IncomingMessageService < Whatsapp::IncomingMessageBaseService end diff --git a/app/services/whatsapp/incoming_message_whatsapp_cloud_service.rb b/app/services/whatsapp/incoming_message_whatsapp_cloud_service.rb new file mode 100644 index 000000000..4cd93942f --- /dev/null +++ b/app/services/whatsapp/incoming_message_whatsapp_cloud_service.rb @@ -0,0 +1,15 @@ +# https://docs.360dialog.com/whatsapp-api/whatsapp-api/media +# https://developers.facebook.com/docs/whatsapp/api/media/ + +class Whatsapp::IncomingMessageWhatsappCloudService < Whatsapp::IncomingMessageBaseService + private + + def processed_params + @processed_params ||= params[:entry].first['changes'].first['value'] + end + + def download_attachment_file(attachment_payload) + url_response = HTTParty.get(inbox.channel.media_url(attachment_payload[:id]), headers: inbox.channel.api_headers) + Down.download(url_response.parsed_response['url'], headers: inbox.channel.api_headers) + end +end diff --git a/app/services/whatsapp/providers/base_service.rb b/app/services/whatsapp/providers/base_service.rb new file mode 100644 index 000000000..62401337e --- /dev/null +++ b/app/services/whatsapp/providers/base_service.rb @@ -0,0 +1,29 @@ +####################################### +# To create a whatsapp provider +# - Inherit this as the base class. +# - Implement `send_message` method in your child class. +# - Implement `send_template_message` method in your child class. +# - Implement `sync_templates` method in your child class. +# - Implement `validate_provider_config` method in your child class. +# - Use Childclass.new(whatsapp_channel: channel).perform. +###################################### + +class Whatsapp::Providers::BaseService + pattr_initialize [:whatsapp_channel!] + + def send_message(_phone_number, _message) + raise 'Overwrite this method in child class' + end + + def send_template(_phone_number, _template_info) + raise 'Overwrite this method in child class' + end + + def sync_template + raise 'Overwrite this method in child class' + end + + def validate_provider_config + raise 'Overwrite this method in child class' + end +end diff --git a/app/services/whatsapp/providers/whatsapp_360_dialog_service.rb b/app/services/whatsapp/providers/whatsapp_360_dialog_service.rb new file mode 100644 index 000000000..04f4e8f7f --- /dev/null +++ b/app/services/whatsapp/providers/whatsapp_360_dialog_service.rb @@ -0,0 +1,112 @@ +class Whatsapp::Providers::Whatsapp360DialogService < Whatsapp::Providers::BaseService + def send_message(phone_number, message) + if message.attachments.present? + send_attachment_message(phone_number, message) + else + send_text_message(phone_number, message) + end + end + + def send_template(phone_number, template_info) + response = HTTParty.post( + "#{api_base_path}/messages", + headers: api_headers, + body: { + to: phone_number, + template: template_body_parameters(template_info), + type: 'template' + }.to_json + ) + + process_response(response) + end + + def sync_templates + response = HTTParty.get("#{api_base_path}/configs/templates", headers: api_headers) + whatsapp_channel.update(message_templates: response['waba_templates'], message_templates_last_updated: Time.now.utc) if response.success? + end + + def validate_provider_config? + response = HTTParty.post( + "#{api_base_path}/configs/webhook", + headers: { 'D360-API-KEY': whatsapp_channel.provider_config['api_key'], 'Content-Type': 'application/json' }, + body: { + url: "#{ENV['FRONTEND_URL']}/webhooks/whatsapp/#{whatsapp_channel.phone_number}" + }.to_json + ) + response.success? + end + + def api_headers + { 'D360-API-KEY' => whatsapp_channel.provider_config['api_key'], 'Content-Type' => 'application/json' } + end + + def media_url(media_id) + "#{api_base_path}/media/#{media_id}" + end + + private + + def api_base_path + # provide the environment variable when testing against sandbox : 'https://waba-sandbox.360dialog.io/v1' + ENV.fetch('360DIALOG_BASE_URL', 'https://waba.360dialog.io/v1') + end + + def send_text_message(phone_number, message) + response = HTTParty.post( + "#{api_base_path}/messages", + headers: api_headers, + body: { + to: phone_number, + text: { body: message.content }, + type: 'text' + }.to_json + ) + + process_response(response) + end + + def send_attachment_message(phone_number, message) + attachment = message.attachments.first + type = %w[image audio video].include?(attachment.file_type) ? attachment.file_type : 'document' + attachment_url = attachment.download_url + response = HTTParty.post( + "#{api_base_path}/messages", + headers: api_headers, + body: { + 'to' => phone_number, + 'type' => type, + type.to_s => { + 'link': attachment_url, + 'caption': message.content + } + }.to_json + ) + + process_response(response) + end + + def process_response(response) + if response.success? + response['messages'].first['id'] + else + Rails.logger.error response.body + nil + end + end + + def template_body_parameters(template_info) + { + name: template_info[:name], + namespace: template_info[:namespace], + language: { + policy: 'deterministic', + code: template_info[:lang_code] + }, + components: [{ + type: 'body', + parameters: template_info[:parameters] + }] + } + end +end diff --git a/app/services/whatsapp/providers/whatsapp_cloud_service.rb b/app/services/whatsapp/providers/whatsapp_cloud_service.rb new file mode 100644 index 000000000..ea8c01791 --- /dev/null +++ b/app/services/whatsapp/providers/whatsapp_cloud_service.rb @@ -0,0 +1,112 @@ +class Whatsapp::Providers::WhatsappCloudService < Whatsapp::Providers::BaseService + def send_message(phone_number, message) + if message.attachments.present? + send_attachment_message(phone_number, message) + else + send_text_message(phone_number, message) + end + end + + def send_template(phone_number, template_info) + response = HTTParty.post( + "#{phone_id_path}/messages", + headers: api_headers, + body: { + messaging_product: 'whatsapp', + to: phone_number, + template: template_body_parameters(template_info), + type: 'template' + }.to_json + ) + + process_response(response) + end + + def sync_templates + response = HTTParty.get("#{business_account_path}/message_templates?access_token=#{whatsapp_channel.provider_config['api_key']}") + whatsapp_channel.update(message_templates: response['data'], message_templates_last_updated: Time.now.utc) if response.success? + end + + def validate_provider_config? + response = HTTParty.get("#{business_account_path}/message_templates?access_token=#{whatsapp_channel.provider_config['api_key']}") + response.success? + end + + def api_headers + { 'Authorization' => "Bearer #{whatsapp_channel.provider_config['api_key']}", 'Content-Type' => 'application/json' } + end + + def media_url(media_id) + "https://graph.facebook.com/v13.0/#{media_id}" + end + + private + + # TODO: See if we can unify the API versions and for both paths and make it consistent with out facebook app API versions + def phone_id_path + "https://graph.facebook.com/v13.0/#{whatsapp_channel.provider_config['phone_number_id']}" + end + + def business_account_path + "https://graph.facebook.com/v14.0/#{whatsapp_channel.provider_config['business_account_id']}" + end + + def send_text_message(phone_number, message) + response = HTTParty.post( + "#{phone_id_path}/messages", + headers: api_headers, + body: { + messaging_product: 'whatsapp', + to: phone_number, + text: { body: message.content }, + type: 'text' + }.to_json + ) + + process_response(response) + end + + def send_attachment_message(phone_number, message) + attachment = message.attachments.first + type = %w[image audio video].include?(attachment.file_type) ? attachment.file_type : 'document' + attachment_url = attachment.download_url + response = HTTParty.post( + "#{phone_id_path}/messages", + headers: api_headers, + body: { + messaging_product: 'whatsapp', + 'to' => phone_number, + 'type' => type, + type.to_s => { + 'link': attachment_url, + 'caption': message.content + } + }.to_json + ) + + process_response(response) + end + + def process_response(response) + if response.success? + response['messages'].first['id'] + else + Rails.logger.error response.body + nil + end + end + + def template_body_parameters(template_info) + { + name: template_info[:name], + language: { + policy: 'deterministic', + code: template_info[:lang_code] + }, + components: [{ + type: 'body', + parameters: template_info[:parameters] + }] + } + end +end diff --git a/app/services/whatsapp/send_on_whatsapp_service.rb b/app/services/whatsapp/send_on_whatsapp_service.rb index efba78f7e..6b96d1731 100644 --- a/app/services/whatsapp/send_on_whatsapp_service.rb +++ b/app/services/whatsapp/send_on_whatsapp_service.rb @@ -43,7 +43,7 @@ class Whatsapp::SendOnWhatsappService < Base::SendOnChannelService # An example template may look like "Your package has been shipped. It will be delivered in {{1}} business days. # We want to iterate over these templates with our message body and see if we can fit it to any of the templates # Then we use regex to parse the template varibles and convert them into the proper payload - channel.message_templates.each do |template| + channel.message_templates&.each do |template| match_obj = template_match_object(template) next if match_obj.blank? diff --git a/app/views/api/v1/models/_inbox.json.jbuilder b/app/views/api/v1/models/_inbox.json.jbuilder index 7fada86bd..e63576bdb 100644 --- a/app/views/api/v1/models/_inbox.json.jbuilder +++ b/app/views/api/v1/models/_inbox.json.jbuilder @@ -83,6 +83,7 @@ end ### WhatsApp Channel if resource.whatsapp? + json.provider resource.channel.try(:provider) json.message_templates resource.channel.try(:message_templates) - json.provider_config resource.channel.try(:provider_config) + json.provider_config resource.channel.try(:provider_config) if Current.account_user&.administrator? end diff --git a/config/routes.rb b/config/routes.rb index a6a75c8d8..37e435adb 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -285,8 +285,9 @@ Rails.application.routes.draw do post 'webhooks/twitter', to: 'api/v1/webhooks#twitter_events' post 'webhooks/line/:line_channel_id', to: 'webhooks/line#process_payload' post 'webhooks/telegram/:bot_token', to: 'webhooks/telegram#process_payload' - post 'webhooks/whatsapp/:phone_number', to: 'webhooks/whatsapp#process_payload' post 'webhooks/sms/:phone_number', to: 'webhooks/sms#process_payload' + get 'webhooks/whatsapp/:phone_number', to: 'webhooks/whatsapp#verify' + post 'webhooks/whatsapp/:phone_number', to: 'webhooks/whatsapp#process_payload' get 'webhooks/instagram', to: 'webhooks/instagram#verify' post 'webhooks/instagram', to: 'webhooks/instagram#events' diff --git a/spec/controllers/api/v1/accounts/inboxes_controller_spec.rb b/spec/controllers/api/v1/accounts/inboxes_controller_spec.rb index 6cf33e7ad..bea71b6dd 100644 --- a/spec/controllers/api/v1/accounts/inboxes_controller_spec.rb +++ b/spec/controllers/api/v1/accounts/inboxes_controller_spec.rb @@ -41,6 +41,25 @@ RSpec.describe 'Inboxes API', type: :request do expect(response).to have_http_status(:success) expect(JSON.parse(response.body, symbolize_names: true)[:payload].size).to eq(1) end + + context 'when provider_config' do + let(:inbox) { create(:channel_whatsapp, account: account, sync_templates: false, validate_provider_config: false).inbox } + + it 'returns provider config attributes for admin' do + get "/api/v1/accounts/#{account.id}/inboxes", + headers: admin.create_new_auth_token, + as: :json + expect(JSON.parse(response.body)['payload'].last.key?('provider_config')).to eq(true) + end + + it 'will not return provider config for agent' do + get "/api/v1/accounts/#{account.id}/inboxes", + headers: agent.create_new_auth_token, + as: :json + + expect(JSON.parse(response.body)['payload'].last.key?('provider_config')).to eq(false) + end + end end end diff --git a/spec/controllers/webhooks/instagram_controller_spec.rb b/spec/controllers/webhooks/instagram_controller_spec.rb index fce701587..4011489a4 100644 --- a/spec/controllers/webhooks/instagram_controller_spec.rb +++ b/spec/controllers/webhooks/instagram_controller_spec.rb @@ -1,6 +1,27 @@ require 'rails_helper' RSpec.describe 'Webhooks::InstagramController', type: :request do + describe 'GET /webhooks/verify' do + it 'returns 401 when valid params are not present' do + get '/webhooks/instagram/verify' + expect(response).to have_http_status(:not_found) + end + + it 'returns 401 when invalid params' do + with_modified_env IG_VERIFY_TOKEN: '123456' do + get '/webhooks/instagram/verify', params: { 'hub.challenge' => '123456', 'hub.mode' => 'subscribe', 'hub.verify_token' => 'invalid' } + expect(response).to have_http_status(:not_found) + end + end + + it 'returns challenge when valid params' do + with_modified_env IG_VERIFY_TOKEN: '123456' do + get '/webhooks/instagram/verify', params: { 'hub.challenge' => '123456', 'hub.mode' => 'subscribe', 'hub.verify_token' => '123456' } + expect(response.body).to include '123456' + end + end + end + describe 'POST /webhooks/instagram' do let!(:dm_params) { build(:instagram_message_create_event).with_indifferent_access } diff --git a/spec/controllers/webhooks/whatsapp_controller_spec.rb b/spec/controllers/webhooks/whatsapp_controller_spec.rb index bb6947862..4a63f5ba0 100644 --- a/spec/controllers/webhooks/whatsapp_controller_spec.rb +++ b/spec/controllers/webhooks/whatsapp_controller_spec.rb @@ -1,6 +1,27 @@ require 'rails_helper' RSpec.describe 'Webhooks::WhatsappController', type: :request do + let(:channel) { create(:channel_whatsapp, provider: 'whatsapp_cloud', sync_templates: false, validate_provider_config: false) } + + describe 'GET /webhooks/verify' do + it 'returns 401 when valid params are not present' do + get "/webhooks/whatsapp/#{channel.phone_number}" + expect(response).to have_http_status(:unauthorized) + end + + it 'returns 401 when invalid params' do + get "/webhooks/whatsapp/#{channel.phone_number}", + params: { 'hub.challenge' => '123456', 'hub.mode' => 'subscribe', 'hub.verify_token' => 'invalid' } + expect(response).to have_http_status(:unauthorized) + end + + it 'returns challenge when valid params' do + get "/webhooks/whatsapp/#{channel.phone_number}", + params: { 'hub.challenge' => '123456', 'hub.mode' => 'subscribe', 'hub.verify_token' => channel.provider_config['webhook_verify_token'] } + expect(response.body).to include '123456' + end + end + describe 'POST /webhooks/whatsapp/{:phone_number}' do it 'call the whatsapp events job with the params' do allow(Webhooks::WhatsappEventsJob).to receive(:perform_later) diff --git a/spec/factories/channel/channel_whatsapp.rb b/spec/factories/channel/channel_whatsapp.rb index 3db99b47a..a1cd4bee4 100644 --- a/spec/factories/channel/channel_whatsapp.rb +++ b/spec/factories/channel/channel_whatsapp.rb @@ -36,11 +36,17 @@ FactoryBot.define do transient do sync_templates { true } + validate_provider_config { true } end before(:create) do |channel_whatsapp, options| # since factory already has the required message templates, we just need to bypass it getting updated channel_whatsapp.define_singleton_method(:sync_templates) { return } unless options.sync_templates + channel_whatsapp.define_singleton_method(:validate_provider_config) { return } unless options.validate_provider_config + if channel_whatsapp.provider == 'whatsapp_cloud' + channel_whatsapp.provider_config = { 'api_key' => 'test_key', 'phone_number_id' => '123456789', 'business_account_id' => '123456789', + 'webhook_verify_token': 'test_token' } + end end after(:create) do |channel_whatsapp| diff --git a/spec/jobs/webhooks/whatsapp_events_job_spec.rb b/spec/jobs/webhooks/whatsapp_events_job_spec.rb new file mode 100644 index 000000000..2a28fe41f --- /dev/null +++ b/spec/jobs/webhooks/whatsapp_events_job_spec.rb @@ -0,0 +1,91 @@ +require 'rails_helper' + +RSpec.describe Webhooks::WhatsappEventsJob, type: :job do + subject(:job) { described_class } + + let(:channel) { create(:channel_whatsapp, provider: 'whatsapp_cloud', sync_templates: false, validate_provider_config: false) } + let(:params) { { phone_number: channel.phone_number } } + let(:process_service) { double } + + before do + allow(process_service).to receive(:perform) + end + + it 'enqueues the job' do + expect { job.perform_later(params) }.to have_enqueued_job(described_class) + .with(params) + .on_queue('default') + end + + context 'when whatsapp_cloud provider' do + it 'enques Whatsapp::IncomingMessageWhatsappCloudService' do + allow(Whatsapp::IncomingMessageWhatsappCloudService).to receive(:new).and_return(process_service) + expect(Whatsapp::IncomingMessageWhatsappCloudService).to receive(:new) + job.perform_now(params) + end + end + + context 'when default provider' do + it 'enques Whatsapp::IncomingMessageService' do + stub_request(:post, 'https://waba.360dialog.io/v1/configs/webhook') + channel.update(provider: 'default') + allow(Whatsapp::IncomingMessageService).to receive(:new).and_return(process_service) + expect(Whatsapp::IncomingMessageService).to receive(:new) + job.perform_now(params) + end + end + + context 'when whatsapp business params' do + it 'enques Whatsapp::IncomingMessageWhatsappCloudService based on the number in payload' do + other_channel = create(:channel_whatsapp, phone_number: '+1987654', provider: 'whatsapp_cloud', sync_templates: false, + validate_provider_config: false) + wb_params = { + phone_number: channel.phone_number, + object: 'whatsapp_business_account', + entry: [ + { + changes: [ + { + value: { + metadata: { + phone_number_id: other_channel.provider_config['phone_number_id'], + display_phone_number: other_channel.phone_number.delete('+') + } + } + } + ] + } + ] + } + allow(Whatsapp::IncomingMessageWhatsappCloudService).to receive(:new).and_return(process_service) + expect(Whatsapp::IncomingMessageWhatsappCloudService).to receive(:new).with(inbox: other_channel.inbox, params: wb_params) + job.perform_now(wb_params) + end + + it 'will not enque Whatsapp::IncomingMessageWhatsappCloudService when invalid phone number id' do + other_channel = create(:channel_whatsapp, phone_number: '+1987654', provider: 'whatsapp_cloud', sync_templates: false, + validate_provider_config: false) + wb_params = { + phone_number: channel.phone_number, + object: 'whatsapp_business_account', + entry: [ + { + changes: [ + { + value: { + metadata: { + phone_number_id: 'random phone number id', + display_phone_number: other_channel.phone_number.delete('+') + } + } + } + ] + } + ] + } + allow(Whatsapp::IncomingMessageWhatsappCloudService).to receive(:new).and_return(process_service) + expect(Whatsapp::IncomingMessageWhatsappCloudService).not_to receive(:new).with(inbox: other_channel.inbox, params: wb_params) + job.perform_now(wb_params) + end + end +end diff --git a/spec/models/channel/whatsapp_spec.rb b/spec/models/channel/whatsapp_spec.rb new file mode 100644 index 000000000..d38f14d11 --- /dev/null +++ b/spec/models/channel/whatsapp_spec.rb @@ -0,0 +1,23 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe Channel::Whatsapp do + describe 'validate_provider_config' do + let(:channel) { build(:channel_whatsapp, provider: 'whatsapp_cloud', account: create(:account)) } + + it 'validates false when provider config is wrong' do + stub_request(:get, 'https://graph.facebook.com/v14.0//message_templates?access_token=test_key').to_return(status: 401) + expect(channel.save).to eq(false) + end + + it 'validates true when provider config is right' do + stub_request(:get, 'https://graph.facebook.com/v14.0//message_templates?access_token=test_key') + .to_return(status: 200, + body: { data: [{ + id: '123456789', name: 'test_template' + }] }.to_json) + expect(channel.save).to eq(true) + end + end +end diff --git a/spec/services/whatsapp/providers/whatsapp_360_dialog_service_spec.rb b/spec/services/whatsapp/providers/whatsapp_360_dialog_service_spec.rb new file mode 100644 index 000000000..b36a9de56 --- /dev/null +++ b/spec/services/whatsapp/providers/whatsapp_360_dialog_service_spec.rb @@ -0,0 +1 @@ +## the specs are covered in send in spec/services/whatsapp/send_on_whatsapp_service_spec.rb diff --git a/spec/services/whatsapp/providers/whatsapp_cloud_service_spec.rb b/spec/services/whatsapp/providers/whatsapp_cloud_service_spec.rb new file mode 100644 index 000000000..cba8176b6 --- /dev/null +++ b/spec/services/whatsapp/providers/whatsapp_cloud_service_spec.rb @@ -0,0 +1,116 @@ +require 'rails_helper' + +describe Whatsapp::Providers::WhatsappCloudService do + subject(:service) { described_class.new(whatsapp_channel: whatsapp_channel) } + + let(:whatsapp_channel) { create(:channel_whatsapp, provider: 'whatsapp_cloud', validate_provider_config: false, sync_templates: false) } + let(:message) { create(:message, message_type: :outgoing, content: 'test', inbox: whatsapp_channel.inbox) } + let(:response_headers) { { 'Content-Type' => 'application/json' } } + let(:whatsapp_response) { { messages: [{ id: 'message_id' }] } } + + before do + stub_request(:get, 'https://graph.facebook.com/v14.0/123456789/message_templates?access_token=test_key') + end + + describe '#send_message' do + context 'when called' do + it 'calls message endpoints for normal messages' do + stub_request(:post, 'https://graph.facebook.com/v13.0/123456789/messages') + .with( + body: { + messaging_product: 'whatsapp', + to: '+123456789', + text: { body: message.content }, + type: 'text' + }.to_json + ) + .to_return(status: 200, body: whatsapp_response.to_json, headers: response_headers) + expect(service.send_message('+123456789', message)).to eq 'message_id' + end + + it 'calls message endpoints for attachment message messages' do + attachment = message.attachments.new(account_id: message.account_id, file_type: :image) + attachment.file.attach(io: File.open(Rails.root.join('spec/assets/avatar.png')), filename: 'avatar.png', content_type: 'image/png') + + stub_request(:post, 'https://graph.facebook.com/v13.0/123456789/messages') + .with( + body: hash_including({ + messaging_product: 'whatsapp', + to: '+123456789', + type: 'image' + }) + ) + .to_return(status: 200, body: whatsapp_response.to_json, headers: response_headers) + expect(service.send_message('+123456789', message)).to eq 'message_id' + end + end + end + + describe '#send_template' do + let(:template_info) do + { + name: 'test_template', + namespace: 'test_namespace', + lang_code: 'en_US', + parameters: [{ type: 'text', text: 'test' }] + } + end + + let(:template_body) do + { + messaging_product: 'whatsapp', + to: '+123456789', + template: { + name: template_info[:name], + language: { + policy: 'deterministic', + code: template_info[:lang_code] + }, + components: [ + { type: 'body', + parameters: template_info[:parameters] } + ] + }, + type: 'template' + } + end + + context 'when called' do + it 'calls message endpoints with template params for template messages' do + stub_request(:post, 'https://graph.facebook.com/v13.0/123456789/messages') + .with( + body: template_body.to_json + ) + .to_return(status: 200, body: whatsapp_response.to_json, headers: response_headers) + + expect(service.send_template('+123456789', template_info)).to eq('message_id') + end + end + end + + describe '#sync_templates' do + context 'when called' do + it 'updated the message templates' do + stub_request(:get, 'https://graph.facebook.com/v14.0/123456789/message_templates?access_token=test_key') + .to_return(status: 200, headers: response_headers, body: { data: [{ id: '123456789', name: 'test_template' }] }.to_json) + expect(subject.sync_templates).to eq(true) + expect(whatsapp_channel.reload.message_templates).to eq([{ id: '123456789', name: 'test_template' }.stringify_keys]) + end + end + end + + describe '#validate_provider_config' do + context 'when called' do + it 'returns true if valid' do + stub_request(:get, 'https://graph.facebook.com/v14.0/123456789/message_templates?access_token=test_key') + expect(subject.validate_provider_config?).to eq(true) + expect(whatsapp_channel.errors.present?).to eq(false) + end + + it 'returns false if invalid' do + stub_request(:get, 'https://graph.facebook.com/v14.0/123456789/message_templates?access_token=test_key').to_return(status: 401) + expect(subject.validate_provider_config?).to eq(false) + end + end + end +end From 3145492a266ce0154835e09d902b6d35fc7266a4 Mon Sep 17 00:00:00 2001 From: Gautam Kumar Date: Thu, 7 Jul 2022 01:16:23 +0530 Subject: [PATCH 34/70] chore: Copy change for inbox management page (#4868) Copy change for inbox management page Co-authored-by: Hricha Shandily <103104754+Hricha-Shandily@users.noreply.github.com> --- app/javascript/dashboard/i18n/locale/en/inboxMgmt.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/dashboard/i18n/locale/en/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/en/inboxMgmt.json index e6ed1e397..a75679798 100644 --- a/app/javascript/dashboard/i18n/locale/en/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/en/inboxMgmt.json @@ -321,7 +321,7 @@ }, "AUTH": { "TITLE": "Choose a channel", - "DESC": "Chatwoot supports live-chat widget, Facebook page, Twitter profile, WhatsApp, Email etc., as channels. If you want to build a custom channel, you can create it using the API channel. Select one channel from the options below to proceed." + "DESC": "Chatwoot supports live-chat widgets, Facebook Messenger, Twitter profiles, WhatsApp, Emails, etc., as channels. If you want to build a custom channel, you can create it using the API channel. To get started, choose one of the channels below." }, "AGENTS": { "TITLE": "Agents", From 91d9584fcb1de3112dbd2126d567c0638c312304 Mon Sep 17 00:00:00 2001 From: Simon Date: Thu, 7 Jul 2022 02:47:39 +0700 Subject: [PATCH 35/70] feat: show HMAC and enforcement for identity validation for API inbox (#4807) Display HMAC token in Settings of Inbox API and enable enforcement option. I have also adjusted the copy so that it can apply to all inbox types. Fixes: #4804 --- .../dashboard/i18n/locale/en/inboxMgmt.json | 4 ++-- .../inbox/settingsPage/ConfigurationPage.vue | 23 +++++++++++++++++++ app/models/channel/api.rb | 2 +- app/views/api/v1/models/_inbox.json.jbuilder | 1 + 4 files changed, 27 insertions(+), 3 deletions(-) diff --git a/app/javascript/dashboard/i18n/locale/en/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/en/inboxMgmt.json index a75679798..f0ff2c2fe 100644 --- a/app/javascript/dashboard/i18n/locale/en/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/en/inboxMgmt.json @@ -435,9 +435,9 @@ "INBOX_UPDATE_SUB_TEXT": "Update your inbox settings", "AUTO_ASSIGNMENT_SUB_TEXT": "Enable or disable the automatic assignment of new conversations to the agents added to this inbox.", "HMAC_VERIFICATION": "User Identity Validation", - "HMAC_DESCRIPTION": "Inorder to validate the user's identity, the SDK allows you to pass an `identifier_hash` for each user. You can generate HMAC using 'sha256' with the key shown here.", + "HMAC_DESCRIPTION": "In order to validate the user's identity, you can pass an `identifier_hash` for each user. You can generate a HMAC sha256 hash using the `identifier` with the key shown here.", "HMAC_MANDATORY_VERIFICATION": "Enforce User Identity Validation", - "HMAC_MANDATORY_DESCRIPTION": "If enabled, Chatwoot SDKs setUser method will not work unless the `identifier_hash` is provided for each user.", + "HMAC_MANDATORY_DESCRIPTION": "If enabled, requests missing the `identifier_hash` will be rejected.", "INBOX_IDENTIFIER": "Inbox Identifier", "INBOX_IDENTIFIER_SUB_TEXT": "Use the `inbox_identifier` token shown here to authentication your API clients.", "FORWARD_EMAIL_TITLE": "Forward to Email", diff --git a/app/javascript/dashboard/routes/dashboard/settings/inbox/settingsPage/ConfigurationPage.vue b/app/javascript/dashboard/routes/dashboard/settings/inbox/settingsPage/ConfigurationPage.vue index a90c0d13c..d3ac843cf 100644 --- a/app/javascript/dashboard/routes/dashboard/settings/inbox/settingsPage/ConfigurationPage.vue +++ b/app/javascript/dashboard/routes/dashboard/settings/inbox/settingsPage/ConfigurationPage.vue @@ -55,6 +55,29 @@ > + + + + + +
+ + +
+
diff --git a/app/models/channel/api.rb b/app/models/channel/api.rb index eb28d7b03..013a8c17c 100644 --- a/app/models/channel/api.rb +++ b/app/models/channel/api.rb @@ -22,7 +22,7 @@ class Channel::Api < ApplicationRecord include Channelable self.table_name = 'channel_api' - EDITABLE_ATTRS = [:webhook_url, { additional_attributes: {} }].freeze + EDITABLE_ATTRS = [:webhook_url, :hmac_mandatory, { additional_attributes: {} }].freeze has_secure_token :identifier has_secure_token :hmac_token diff --git a/app/views/api/v1/models/_inbox.json.jbuilder b/app/views/api/v1/models/_inbox.json.jbuilder index e63576bdb..b6e5e5a18 100644 --- a/app/views/api/v1/models/_inbox.json.jbuilder +++ b/app/views/api/v1/models/_inbox.json.jbuilder @@ -76,6 +76,7 @@ end ## API Channel Attributes if resource.api? + json.hmac_token resource.channel.try(:hmac_token) json.webhook_url resource.channel.try(:webhook_url) json.inbox_identifier resource.channel.try(:identifier) json.additional_attributes resource.channel.try(:additional_attributes) From 2f3bdbdea23b80aa30f79e45f2e55447f510468e Mon Sep 17 00:00:00 2001 From: Tejaswini Chile Date: Thu, 7 Jul 2022 18:02:18 +0530 Subject: [PATCH 36/70] fix: Handling facebook client error for deleted story (#4984) --- .../messages/messenger/message_builder.rb | 5 +++ config/locales/en.yml | 1 + .../instagram/message_builder_spec.rb | 31 ++++++++++++++++++- .../instagram_message_create_event.rb | 4 +-- .../webhooks/instagram_events_job_spec.rb | 5 ++- 5 files changed, 40 insertions(+), 6 deletions(-) diff --git a/app/builders/messages/messenger/message_builder.rb b/app/builders/messages/messenger/message_builder.rb index 27386c250..3c406f1e0 100644 --- a/app/builders/messages/messenger/message_builder.rb +++ b/app/builders/messages/messenger/message_builder.rb @@ -71,6 +71,11 @@ class Messages::Messenger::MessageBuilder rescue Koala::Facebook::AuthenticationError @inbox.channel.authorization_error! raise + rescue Koala::Facebook::ClientError => e + # The exception occurs when we are trying fetch the deleted story or blocked story. + @message.update(content: I18n.t('conversations.messages.instagram_deleted_story_content')) + Rails.logger.error e + {} rescue StandardError => e ChatwootExceptionTracker.new(e, account: @inbox.account).capture_exception {} diff --git a/config/locales/en.yml b/config/locales/en.yml index dea9f405f..c8315c08c 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -100,6 +100,7 @@ en: 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 activity: status: diff --git a/spec/builders/messages/instagram/message_builder_spec.rb b/spec/builders/messages/instagram/message_builder_spec.rb index 857fefe69..20b7d777d 100644 --- a/spec/builders/messages/instagram/message_builder_spec.rb +++ b/spec/builders/messages/instagram/message_builder_spec.rb @@ -5,12 +5,14 @@ describe ::Messages::Instagram::MessageBuilder do before do stub_request(:post, /graph.facebook.com/) + stub_request(:get, 'https://www.example.com/test.jpeg') end let!(:account) { create(:account) } let!(:instagram_channel) { create(:channel_instagram_fb_page, account: account, instagram_id: 'chatwoot-app-user-id-1') } let!(:instagram_inbox) { create(:inbox, channel: instagram_channel, account: account, greeting_enabled: false) } let!(:dm_params) { build(:instagram_message_create_event).with_indifferent_access } + let!(:story_mention_params) { build(:instagram_story_mention_event).with_indifferent_access } let(:fb_object) { double } let(:contact) { create(:contact, id: 'Sender-id-1', name: 'Jane Dae') } let(:contact_inbox) { create(:contact_inbox, contact_id: contact.id, inbox_id: instagram_inbox.id, source_id: 'Sender-id-1') } @@ -28,7 +30,7 @@ describe ::Messages::Instagram::MessageBuilder do ) messaging = dm_params[:entry][0]['messaging'][0] contact_inbox - instagram_message_builder.new(messaging, instagram_inbox).perform + described_class.new(messaging, instagram_inbox).perform instagram_inbox.reload @@ -41,5 +43,32 @@ describe ::Messages::Instagram::MessageBuilder do expect(contact.name).to eq('Jane Dae') expect(message.content).to eq('This is the first message from the customer') end + + it 'raises exception on deleted story' do + allow(Koala::Facebook::API).to receive(:new).and_return(fb_object) + allow(fb_object).to receive(:get_object).and_raise(Koala::Facebook::ClientError.new( + 190, + 'This Message has been deleted by the user or the business.' + )) + + messaging = story_mention_params[:entry][0][:messaging][0] + contact_inbox + described_class.new(messaging, instagram_inbox, outgoing_echo: false).perform + + instagram_inbox.reload + + # we would have contact created, message created but the empty message because the story mention has been deleted later + # As they show it in instagram that this story is no longer available + # and external attachments link would be reachable + expect(instagram_inbox.conversations.count).to be 1 + expect(instagram_inbox.messages.count).to be 1 + + contact = instagram_channel.inbox.contacts.first + message = instagram_channel.inbox.messages.first + + expect(contact.name).to eq('Jane Dae') + expect(message.content).to eq('This story is no longer available.') + expect(message.attachments.count).to eq(1) + end end end diff --git a/spec/factories/instagram/instagram_message_create_event.rb b/spec/factories/instagram/instagram_message_create_event.rb index b62797630..f52e8f268 100644 --- a/spec/factories/instagram/instagram_message_create_event.rb +++ b/spec/factories/instagram/instagram_message_create_event.rb @@ -104,7 +104,7 @@ FactoryBot.define do { 'type': 'share', 'payload': { - 'url': 'https://imagekit.io/blog/content/images/2020/05/media_library.jpeg' + 'url': 'https://www.example.com/test.jpeg' } } ] @@ -138,7 +138,7 @@ FactoryBot.define do { 'type': 'story_mention', 'payload': { - 'url': 'https://imagekit.io/blog/content/images/2020/05/media_library.jpeg' + 'url': 'https://www.example.com/test.jpeg' } } ] diff --git a/spec/jobs/webhooks/instagram_events_job_spec.rb b/spec/jobs/webhooks/instagram_events_job_spec.rb index 69952920a..850c3730b 100644 --- a/spec/jobs/webhooks/instagram_events_job_spec.rb +++ b/spec/jobs/webhooks/instagram_events_job_spec.rb @@ -6,7 +6,7 @@ describe Webhooks::InstagramEventsJob do before do stub_request(:post, /graph.facebook.com/) - stub_request(:get, 'https://imagekit.io/blog/content/images/2020/05/media_library.jpeg') + stub_request(:get, 'https://www.example.com/test.jpeg') .with( headers: { 'Accept' => '*/*', @@ -102,8 +102,7 @@ describe Webhooks::InstagramEventsJob do { story: { mention: { - link: - 'https://lookaside.fbsbx.com/ig_messaging_cdn/?asset_id=17920786367196703&signature=Aby8EXbvNu4on9efDQecXDasiJX2s0FgWhFGz3mNFB__CsHR22O_1bJiYHkbp3mC1NQeW4jHxls9WyqVgRPcyonUbSJmD44UwLfFhbCK2obesWnFi7VOnisqLu48Xd6KYuNex7uSCQKWM-nw55zQ23bBgfCYw6h5hiJjFHwJDZYm65zXpQ', + link: 'https://www.example.com/test.jpeg', id: '17920786367196703' } }, From f014d9d13bc4290cbee39858399a2abeac387863 Mon Sep 17 00:00:00 2001 From: Sojan Jose Date: Thu, 7 Jul 2022 17:07:05 +0200 Subject: [PATCH 37/70] chore: Ability to Disable Sentry Transactions (#4989) fixes: #4866 --- config/initializers/sentry.rb | 2 +- spec/controllers/api/v1/accounts/inboxes_controller_spec.rb | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/config/initializers/sentry.rb b/config/initializers/sentry.rb index 1b1c557db..098f9bdb4 100644 --- a/config/initializers/sentry.rb +++ b/config/initializers/sentry.rb @@ -5,7 +5,7 @@ if ENV['SENTRY_DSN'] # To activate performance monitoring, set one of these options. # We recommend adjusting the value in production: - config.traces_sample_rate = 0.1 + config.traces_sample_rate = 0.1 if ENV['ENABLE_SENTRY_TRANSACTIONS'] config.excluded_exceptions += ['Rack::Timeout::RequestTimeoutException'] diff --git a/spec/controllers/api/v1/accounts/inboxes_controller_spec.rb b/spec/controllers/api/v1/accounts/inboxes_controller_spec.rb index bea71b6dd..3867aa1fc 100644 --- a/spec/controllers/api/v1/accounts/inboxes_controller_spec.rb +++ b/spec/controllers/api/v1/accounts/inboxes_controller_spec.rb @@ -49,7 +49,7 @@ RSpec.describe 'Inboxes API', type: :request do get "/api/v1/accounts/#{account.id}/inboxes", headers: admin.create_new_auth_token, as: :json - expect(JSON.parse(response.body)['payload'].last.key?('provider_config')).to eq(true) + expect(response.body).to include('provider_config') end it 'will not return provider config for agent' do @@ -57,7 +57,7 @@ RSpec.describe 'Inboxes API', type: :request do headers: agent.create_new_auth_token, as: :json - expect(JSON.parse(response.body)['payload'].last.key?('provider_config')).to eq(false) + expect(response.body).not_to include('provider_config') end end end From 181d7797a28885c8e8e321138f4812e1f6cb8adb Mon Sep 17 00:00:00 2001 From: Sojan Jose Date: Thu, 7 Jul 2022 17:37:19 +0200 Subject: [PATCH 38/70] chore: New translation updates (#4980) New translation updates --- .../dashboard/i18n/locale/ar/bulkActions.json | 40 ++++++---- .../dashboard/i18n/locale/ar/contact.json | 3 +- .../dashboard/i18n/locale/ar/inboxMgmt.json | 48 +++++++++--- .../dashboard/i18n/locale/ar/report.json | 1 + .../dashboard/i18n/locale/bg/bulkActions.json | 40 ++++++---- .../dashboard/i18n/locale/bg/contact.json | 3 +- .../dashboard/i18n/locale/bg/inboxMgmt.json | 48 +++++++++--- .../dashboard/i18n/locale/bg/report.json | 1 + .../dashboard/i18n/locale/ca/bulkActions.json | 40 ++++++---- .../dashboard/i18n/locale/ca/contact.json | 3 +- .../dashboard/i18n/locale/ca/inboxMgmt.json | 48 +++++++++--- .../dashboard/i18n/locale/ca/report.json | 1 + .../dashboard/i18n/locale/cs/bulkActions.json | 40 ++++++---- .../dashboard/i18n/locale/cs/contact.json | 3 +- .../dashboard/i18n/locale/cs/inboxMgmt.json | 48 +++++++++--- .../dashboard/i18n/locale/cs/report.json | 1 + .../dashboard/i18n/locale/da/bulkActions.json | 40 ++++++---- .../dashboard/i18n/locale/da/contact.json | 3 +- .../dashboard/i18n/locale/da/inboxMgmt.json | 48 +++++++++--- .../dashboard/i18n/locale/da/report.json | 1 + .../dashboard/i18n/locale/de/bulkActions.json | 40 ++++++---- .../dashboard/i18n/locale/de/contact.json | 3 +- .../dashboard/i18n/locale/de/inboxMgmt.json | 48 +++++++++--- .../dashboard/i18n/locale/de/report.json | 1 + .../dashboard/i18n/locale/el/bulkActions.json | 40 ++++++---- .../dashboard/i18n/locale/el/contact.json | 3 +- .../dashboard/i18n/locale/el/inboxMgmt.json | 48 +++++++++--- .../dashboard/i18n/locale/el/report.json | 1 + .../i18n/locale/el/whatsappTemplates.json | 26 +++---- .../i18n/locale/es/advancedFilters.json | 2 +- .../dashboard/i18n/locale/es/bulkActions.json | 40 ++++++---- .../dashboard/i18n/locale/es/contact.json | 3 +- .../dashboard/i18n/locale/es/inboxMgmt.json | 48 +++++++++--- .../dashboard/i18n/locale/es/report.json | 1 + .../dashboard/i18n/locale/fa/bulkActions.json | 40 ++++++---- .../dashboard/i18n/locale/fa/contact.json | 3 +- .../dashboard/i18n/locale/fa/inboxMgmt.json | 48 +++++++++--- .../dashboard/i18n/locale/fa/report.json | 1 + .../dashboard/i18n/locale/fa/settings.json | 2 +- .../i18n/locale/fa/whatsappTemplates.json | 14 ++-- .../dashboard/i18n/locale/fi/bulkActions.json | 40 ++++++---- .../dashboard/i18n/locale/fi/contact.json | 3 +- .../dashboard/i18n/locale/fi/inboxMgmt.json | 48 +++++++++--- .../dashboard/i18n/locale/fi/report.json | 1 + .../dashboard/i18n/locale/fr/bulkActions.json | 40 ++++++---- .../dashboard/i18n/locale/fr/contact.json | 3 +- .../dashboard/i18n/locale/fr/inboxMgmt.json | 48 +++++++++--- .../dashboard/i18n/locale/fr/report.json | 1 + .../dashboard/i18n/locale/he/bulkActions.json | 40 ++++++---- .../dashboard/i18n/locale/he/contact.json | 3 +- .../dashboard/i18n/locale/he/inboxMgmt.json | 48 +++++++++--- .../dashboard/i18n/locale/he/report.json | 1 + .../dashboard/i18n/locale/hi/bulkActions.json | 40 ++++++---- .../dashboard/i18n/locale/hi/contact.json | 3 +- .../dashboard/i18n/locale/hi/inboxMgmt.json | 48 +++++++++--- .../dashboard/i18n/locale/hi/report.json | 1 + .../dashboard/i18n/locale/hu/bulkActions.json | 40 ++++++---- .../dashboard/i18n/locale/hu/contact.json | 3 +- .../dashboard/i18n/locale/hu/inboxMgmt.json | 48 +++++++++--- .../dashboard/i18n/locale/hu/report.json | 1 + .../dashboard/i18n/locale/id/bulkActions.json | 40 ++++++---- .../dashboard/i18n/locale/id/contact.json | 3 +- .../dashboard/i18n/locale/id/inboxMgmt.json | 48 +++++++++--- .../dashboard/i18n/locale/id/report.json | 1 + .../dashboard/i18n/locale/it/bulkActions.json | 40 ++++++---- .../dashboard/i18n/locale/it/contact.json | 3 +- .../dashboard/i18n/locale/it/inboxMgmt.json | 48 +++++++++--- .../dashboard/i18n/locale/it/report.json | 1 + .../dashboard/i18n/locale/ja/bulkActions.json | 40 ++++++---- .../dashboard/i18n/locale/ja/contact.json | 3 +- .../dashboard/i18n/locale/ja/inboxMgmt.json | 48 +++++++++--- .../dashboard/i18n/locale/ja/report.json | 1 + .../dashboard/i18n/locale/ko/bulkActions.json | 40 ++++++---- .../dashboard/i18n/locale/ko/contact.json | 3 +- .../dashboard/i18n/locale/ko/inboxMgmt.json | 48 +++++++++--- .../dashboard/i18n/locale/ko/report.json | 1 + .../dashboard/i18n/locale/lv/bulkActions.json | 40 ++++++---- .../dashboard/i18n/locale/lv/contact.json | 3 +- .../dashboard/i18n/locale/lv/inboxMgmt.json | 48 +++++++++--- .../dashboard/i18n/locale/lv/report.json | 1 + .../dashboard/i18n/locale/ml/bulkActions.json | 40 ++++++---- .../dashboard/i18n/locale/ml/contact.json | 3 +- .../dashboard/i18n/locale/ml/inboxMgmt.json | 48 +++++++++--- .../dashboard/i18n/locale/ml/report.json | 1 + .../dashboard/i18n/locale/ne/bulkActions.json | 40 ++++++---- .../dashboard/i18n/locale/ne/contact.json | 3 +- .../dashboard/i18n/locale/ne/inboxMgmt.json | 48 +++++++++--- .../dashboard/i18n/locale/ne/report.json | 1 + .../dashboard/i18n/locale/nl/bulkActions.json | 40 ++++++---- .../dashboard/i18n/locale/nl/contact.json | 3 +- .../dashboard/i18n/locale/nl/inboxMgmt.json | 48 +++++++++--- .../dashboard/i18n/locale/nl/report.json | 1 + .../dashboard/i18n/locale/no/bulkActions.json | 40 ++++++---- .../dashboard/i18n/locale/no/contact.json | 3 +- .../dashboard/i18n/locale/no/inboxMgmt.json | 48 +++++++++--- .../dashboard/i18n/locale/no/report.json | 1 + .../dashboard/i18n/locale/pl/bulkActions.json | 40 ++++++---- .../dashboard/i18n/locale/pl/contact.json | 3 +- .../dashboard/i18n/locale/pl/inboxMgmt.json | 48 +++++++++--- .../dashboard/i18n/locale/pl/report.json | 1 + .../dashboard/i18n/locale/pt/bulkActions.json | 40 ++++++---- .../dashboard/i18n/locale/pt/contact.json | 3 +- .../dashboard/i18n/locale/pt/inboxMgmt.json | 48 +++++++++--- .../dashboard/i18n/locale/pt/report.json | 1 + .../i18n/locale/pt_BR/advancedFilters.json | 2 +- .../i18n/locale/pt_BR/automation.json | 6 +- .../i18n/locale/pt_BR/bulkActions.json | 40 ++++++---- .../dashboard/i18n/locale/pt_BR/contact.json | 3 +- .../i18n/locale/pt_BR/inboxMgmt.json | 50 ++++++++++--- .../dashboard/i18n/locale/pt_BR/report.json | 1 + .../dashboard/i18n/locale/pt_BR/settings.json | 2 +- .../i18n/locale/pt_BR/whatsappTemplates.json | 2 +- .../dashboard/i18n/locale/ro/bulkActions.json | 40 ++++++---- .../dashboard/i18n/locale/ro/contact.json | 3 +- .../dashboard/i18n/locale/ro/inboxMgmt.json | 48 +++++++++--- .../dashboard/i18n/locale/ro/report.json | 1 + .../dashboard/i18n/locale/ru/agentMgmt.json | 2 +- .../dashboard/i18n/locale/ru/bulkActions.json | 40 ++++++---- .../dashboard/i18n/locale/ru/contact.json | 3 +- .../dashboard/i18n/locale/ru/inboxMgmt.json | 44 +++++++++-- .../dashboard/i18n/locale/ru/report.json | 1 + .../dashboard/i18n/locale/sk/bulkActions.json | 40 ++++++---- .../dashboard/i18n/locale/sk/contact.json | 3 +- .../dashboard/i18n/locale/sk/inboxMgmt.json | 48 +++++++++--- .../dashboard/i18n/locale/sk/report.json | 1 + .../dashboard/i18n/locale/sr/bulkActions.json | 40 ++++++---- .../dashboard/i18n/locale/sr/contact.json | 3 +- .../dashboard/i18n/locale/sr/inboxMgmt.json | 48 +++++++++--- .../dashboard/i18n/locale/sr/report.json | 1 + .../dashboard/i18n/locale/sv/bulkActions.json | 40 ++++++---- .../dashboard/i18n/locale/sv/contact.json | 3 +- .../dashboard/i18n/locale/sv/inboxMgmt.json | 48 +++++++++--- .../dashboard/i18n/locale/sv/report.json | 1 + .../dashboard/i18n/locale/ta/bulkActions.json | 40 ++++++---- .../dashboard/i18n/locale/ta/contact.json | 3 +- .../dashboard/i18n/locale/ta/inboxMgmt.json | 48 +++++++++--- .../dashboard/i18n/locale/ta/report.json | 1 + .../dashboard/i18n/locale/th/bulkActions.json | 40 ++++++---- .../dashboard/i18n/locale/th/contact.json | 3 +- .../dashboard/i18n/locale/th/inboxMgmt.json | 48 +++++++++--- .../dashboard/i18n/locale/th/report.json | 1 + .../dashboard/i18n/locale/tr/bulkActions.json | 40 ++++++---- .../dashboard/i18n/locale/tr/contact.json | 3 +- .../dashboard/i18n/locale/tr/inboxMgmt.json | 48 +++++++++--- .../dashboard/i18n/locale/tr/report.json | 1 + .../dashboard/i18n/locale/uk/bulkActions.json | 40 ++++++---- .../dashboard/i18n/locale/uk/contact.json | 3 +- .../i18n/locale/uk/conversation.json | 4 +- .../dashboard/i18n/locale/uk/inboxMgmt.json | 52 ++++++++++--- .../dashboard/i18n/locale/uk/report.json | 3 +- .../dashboard/i18n/locale/uk/settings.json | 6 +- .../i18n/locale/uk/whatsappTemplates.json | 26 +++---- .../dashboard/i18n/locale/ur/bulkActions.json | 40 ++++++---- .../dashboard/i18n/locale/ur/contact.json | 3 +- .../dashboard/i18n/locale/ur/inboxMgmt.json | 48 +++++++++--- .../dashboard/i18n/locale/ur/report.json | 1 + .../i18n/locale/ur_IN/bulkActions.json | 40 ++++++---- .../dashboard/i18n/locale/ur_IN/contact.json | 3 +- .../i18n/locale/ur_IN/inboxMgmt.json | 48 +++++++++--- .../dashboard/i18n/locale/ur_IN/report.json | 1 + .../i18n/locale/vi/advancedFilters.json | 4 +- .../dashboard/i18n/locale/vi/automation.json | 28 +++---- .../dashboard/i18n/locale/vi/bulkActions.json | 40 ++++++---- .../dashboard/i18n/locale/vi/chatlist.json | 4 +- .../dashboard/i18n/locale/vi/contact.json | 7 +- .../i18n/locale/vi/contactFilters.json | 4 +- .../i18n/locale/vi/conversation.json | 18 ++--- .../i18n/locale/vi/generalSettings.json | 14 ++-- .../dashboard/i18n/locale/vi/inboxMgmt.json | 74 +++++++++++++------ .../i18n/locale/vi/integrations.json | 14 ++-- .../dashboard/i18n/locale/vi/report.json | 1 + .../i18n/locale/zh_CN/bulkActions.json | 40 ++++++---- .../dashboard/i18n/locale/zh_CN/contact.json | 3 +- .../i18n/locale/zh_CN/inboxMgmt.json | 48 +++++++++--- .../dashboard/i18n/locale/zh_CN/report.json | 1 + .../i18n/locale/zh_TW/bulkActions.json | 40 ++++++---- .../dashboard/i18n/locale/zh_TW/contact.json | 3 +- .../i18n/locale/zh_TW/inboxMgmt.json | 48 +++++++++--- .../dashboard/i18n/locale/zh_TW/report.json | 1 + app/javascript/survey/i18n/locale/ar.json | 2 +- config/locales/ar.yml | 9 +++ config/locales/bg.yml | 9 +++ config/locales/ca.yml | 9 +++ config/locales/cs.yml | 9 +++ config/locales/da.yml | 9 +++ config/locales/de.yml | 9 +++ config/locales/el.yml | 9 +++ config/locales/es.yml | 9 +++ config/locales/fa.yml | 9 +++ config/locales/fi.yml | 9 +++ config/locales/fr.yml | 9 +++ config/locales/he.yml | 9 +++ config/locales/hi.yml | 9 +++ config/locales/hu.yml | 9 +++ config/locales/id.yml | 9 +++ config/locales/it.yml | 9 +++ config/locales/ja.yml | 9 +++ config/locales/ko.yml | 9 +++ config/locales/lv.yml | 9 +++ config/locales/ml.yml | 9 +++ config/locales/ne.yml | 9 +++ config/locales/nl.yml | 9 +++ config/locales/no.yml | 9 +++ config/locales/pl.yml | 9 +++ config/locales/pt.yml | 9 +++ config/locales/pt_BR.yml | 9 +++ config/locales/ro.yml | 9 +++ config/locales/ru.yml | 9 +++ config/locales/sk.yml | 9 +++ config/locales/sr.yml | 9 +++ config/locales/sv.yml | 9 +++ config/locales/ta.yml | 9 +++ config/locales/th.yml | 9 +++ config/locales/tr.yml | 9 +++ config/locales/uk.yml | 19 +++-- config/locales/ur.yml | 9 +++ config/locales/ur_IN.yml | 9 +++ config/locales/vi.yml | 11 ++- config/locales/zh_CN.yml | 9 +++ config/locales/zh_TW.yml | 9 +++ 220 files changed, 3194 insertions(+), 1074 deletions(-) diff --git a/app/javascript/dashboard/i18n/locale/ar/bulkActions.json b/app/javascript/dashboard/i18n/locale/ar/bulkActions.json index 1b9374212..71954cf64 100644 --- a/app/javascript/dashboard/i18n/locale/ar/bulkActions.json +++ b/app/javascript/dashboard/i18n/locale/ar/bulkActions.json @@ -1,17 +1,29 @@ { - "BULK_ACTION": { - "CONVERSATIONS_SELECTED": "%{conversationCount} المحادثات المحددة", - "AGENT_SELECT_LABEL": "اختر وكيل", - "ASSIGN_CONFIRMATION_LABEL": "هل أنت متأكد من أنك تريد تعيين %{conversationCount} %{conversationLabel} إلى", - "GO_BACK_LABEL": "العودة للخلف", - "ASSIGN_LABEL": "تكليف", - "ASSIGN_AGENT_TOOLTIP": "إسناد وكيل", - "RESOLVE_TOOLTIP": "إغلاق المحادثة", - "ASSIGN_SUCCESFUL": "تم تعيين المحادثات بنجاح", - "ASSIGN_FAILED": "فشل في تعيين المحادثات، الرجاء المحاولة مرة أخرى", - "RESOLVE_SUCCESFUL": "تم تسوية المحادثات بنجاح", - "RESOLVE_FAILED": "فشل في حل المحادثات، يرجى المحاولة مرة أخرى", - "ALL_CONVERSATIONS_SELECTED_ALERT": "المحادثات المرئية في هذه الصفحة هي المحددة فقط.", - "AGENT_LIST_LOADING": "تحميل الوكلاء" + "BULK_ACTION": { + "CONVERSATIONS_SELECTED": "%{conversationCount} المحادثات المحددة", + "AGENT_SELECT_LABEL": "اختر وكيل", + "ASSIGN_CONFIRMATION_LABEL": "هل أنت متأكد من أنك تريد تعيين %{conversationCount} %{conversationLabel} إلى", + "GO_BACK_LABEL": "العودة للخلف", + "ASSIGN_LABEL": "تكليف", + "ASSIGN_AGENT_TOOLTIP": "إسناد وكيل", + "ASSIGN_SUCCESFUL": "تم تعيين المحادثات بنجاح", + "ASSIGN_FAILED": "فشل في تعيين المحادثات، الرجاء المحاولة مرة أخرى", + "RESOLVE_SUCCESFUL": "تم تسوية المحادثات بنجاح", + "RESOLVE_FAILED": "فشل في حل المحادثات، يرجى المحاولة مرة أخرى", + "ALL_CONVERSATIONS_SELECTED_ALERT": "المحادثات المرئية في هذه الصفحة هي المحددة فقط.", + "AGENT_LIST_LOADING": "تحميل الوكلاء", + "UPDATE": { + "CHANGE_STATUS": "تغيير الحالة", + "SNOOZE_UNTIL_NEXT_REPLY": "غفوة حتى الرد القادم", + "UPDATE_SUCCESFUL": "تم تحديث حالة المحادثة بنجاح.", + "UPDATE_FAILED": "فشل تحديث المحادثات، الرجاء المحاولة مرة أخرى" + }, + "LABELS": { + "ASSIGN_LABELS": "تعيين التسميات", + "NO_LABELS_FOUND": "لم يتم العثور على تسميات لـ", + "ASSIGN_SELECTED_LABELS": "تعيين التسميات المحددة", + "ASSIGN_SUCCESFUL": "تم تعيين التسميات بنجاح", + "ASSIGN_FAILED": "فشل في تعيين التسميات ، الرجاء المحاولة مرة أخرى" } + } } diff --git a/app/javascript/dashboard/i18n/locale/ar/contact.json b/app/javascript/dashboard/i18n/locale/ar/contact.json index 90e9d4e93..34208040e 100644 --- a/app/javascript/dashboard/i18n/locale/ar/contact.json +++ b/app/javascript/dashboard/i18n/locale/ar/contact.json @@ -111,7 +111,8 @@ "EMAIL_ADDRESS": { "PLACEHOLDER": "أدخل عنوان البريد الإلكتروني الخاص بجهة الاتصال", "LABEL": "عنوان البريد الإلكتروني", - "DUPLICATE": "عنوان البريد الإلكتروني هذا مستخدم لجهة اتصال أخرى." + "DUPLICATE": "عنوان البريد الإلكتروني هذا مستخدم لجهة اتصال أخرى.", + "ERROR": "الرجاء إدخال عنوان بريد إلكتروني صحيح." }, "PHONE_NUMBER": { "PLACEHOLDER": "أدخل رقم الهاتف الخاص بجهة الاتصال", diff --git a/app/javascript/dashboard/i18n/locale/ar/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ar/inboxMgmt.json index 2b590b411..191c2d195 100644 --- a/app/javascript/dashboard/i18n/locale/ar/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/ar/inboxMgmt.json @@ -30,7 +30,8 @@ "ADD": { "CHANNEL_NAME": { "LABEL": "اسم صندوق الوارد لقناة التواصل", - "PLACEHOLDER": "أدخل اسم صندوق الوارد الخاص بك (مثال: Acme Inc)" + "PLACEHOLDER": "أدخل اسم صندوق الوارد الخاص بك (مثال: Acme Inc)", + "ERROR": "الرجاء إدخال اسم صندوق الوارد صالح" }, "WEBSITE_NAME": { "LABEL": "اسم الموقع", @@ -82,7 +83,7 @@ }, "CHANNEL_GREETING_TOGGLE": { "LABEL": "تفعيل رسالة الترحيب التلقائية", - "HELP_TEXT": "إرسال رسالة ترحيب إلى المستخدم عند بدء المحادثة.", + "HELP_TEXT": "إرسال رسالة تحية تلقائياً عند إنشاء محادثة جديدة.", "ENABLED": "مفعل", "DISABLED": "معطّل" }, @@ -97,7 +98,10 @@ "LABEL": "لون صندوق الدردشة", "PLACEHOLDER": "تحديث اللون الرئيسي لصندوق الدردشة" }, - "SUBMIT_BUTTON": "إنشاء قناة تواصل" + "SUBMIT_BUTTON": "إنشاء قناة تواصل", + "API": { + "ERROR_MESSAGE": "لم نتمكن من إنشاء قناة موقع، الرجاء المحاولة مرة أخرى" + } }, "TWILIO": { "TITLE": "قناة Twilio SMS/WhatsApp", @@ -193,6 +197,7 @@ "PROVIDERS": { "LABEL": "API Provider", "TWILIO": "تويليو", + "WHATSAPP_CLOUD": "WhatsApp Cloud", "360_DIALOG": "360dialog" }, "INBOX_NAME": { @@ -205,13 +210,31 @@ "PLACEHOLDER": "الرجاء إدخال رقم الهاتف الذي سيتم إرسال الرسائل منه.", "ERROR": "الرجاء إدخال قيمة صحيحة. يجب أن يبدأ رقم الهاتف بعلامة `+`." }, + "PHONE_NUMBER_ID": { + "LABEL": "Phone number ID", + "PLACEHOLDER": "Please enter the Phone number ID obtained from Facebook developer dashboard.", + "ERROR": "الرجاء إدخال اسم صالح." + }, + "BUSINESS_ACCOUNT_ID": { + "LABEL": "Business Account ID", + "PLACEHOLDER": "Please enter the Business Account ID obtained from Facebook developer dashboard.", + "ERROR": "الرجاء إدخال اسم صالح." + }, + "WEBHOOK_VERIFY_TOKEN": { + "LABEL": "Webhook Verify Token", + "PLACEHOLDER": "Enter a verify token which you want to configure for facebook webhooks.", + "ERROR": "الرجاء إدخال اسم صالح." + }, "API_KEY": { "LABEL": "مفتاح API", "SUBTITLE": "تكوين مفتاح واتسآب API.", "PLACEHOLDER": "مفتاح API", - "APPLY_FOR_ACCESS": "ليس لديك أي مفتاح API؟ تقدم بطلب الوصول إلى هنا", "ERROR": "الرجاء إدخال اسم صالح." }, + "API_CALLBACK": { + "TITLE": "عنوان Callback URL", + "SUBTITLE": "You have to configure the webhook URL in facebook developer portal with the URL mentioned here." + }, "SUBMIT_BUTTON": "إنشاء قناة واتساب", "API": { "ERROR_MESSAGE": "لم نتمكن من حفظ قناة واتساب" @@ -298,7 +321,7 @@ }, "AUTH": { "TITLE": "اختر قناة", - "DESC": "ندعم أداة الدردشة المباشرة، صفحة الفيسبوك، ملف تويتر الشخصي، واتسب، البريد الإلكتروني وما إلى ذلك، كقنوات. إذا كنت ترغب في إنشاء قناة مخصصة، يمكنك إنشاءها باستخدام قناة API. حدد قناة واحدة من الخيارات أدناه للمتابعة." + "DESC": "Chatwoot supports live-chat widgets, Facebook Messenger, Twitter profiles, WhatsApp, Emails, etc., as channels. If you want to build a custom channel, you can create it using the API channel. To get started, choose one of the channels below." }, "AGENTS": { "TITLE": "موظف الدعم", @@ -339,7 +362,7 @@ "API": { "SUCCESS_MESSAGE": "تم تحديث إعدادات قناة التواصل بنجاح", "AUTO_ASSIGNMENT_SUCCESS_MESSAGE": "تم تحديث إعدادات الإسناد التلقائي بنجاح", - "ERROR_MESSAGE": "تعذر تحديث لون صندوق الدردشة. الرجاء المحاولة مرة أخرى لاحقاً." + "ERROR_MESSAGE": "تعذر تحديث إعدادات صندوق الوارد. الرجاء المحاولة مرة أخرى لاحقاً." }, "EMAIL_COLLECT_BOX": { "ENABLED": "مفعل", @@ -412,15 +435,22 @@ "INBOX_UPDATE_SUB_TEXT": "تحديث إعدادات قناة التواصل", "AUTO_ASSIGNMENT_SUB_TEXT": "تمكين أو تعطيل الإسناد التلقائي للمحادثات الجديدة إلى الموظفين المضافين إلى قناة التواصل هذه.", "HMAC_VERIFICATION": "التحقق من هوية المستخدم", - "HMAC_DESCRIPTION": "من أجل التحقق من هوية المستخدم، يسمح لك SDK بتمرير 'المعرفة_hash' لكل مستخدم. يمكنك إنشاء HMAC باستخدام 'sha256' مع المفتاح المعروض هنا.", + "HMAC_DESCRIPTION": "In order to validate the user's identity, you can pass an `identifier_hash` for each user. You can generate a HMAC sha256 hash using the `identifier` with the key shown here.", "HMAC_MANDATORY_VERIFICATION": "فرض التحقق من هوية المستخدم", - "HMAC_MANDATORY_DESCRIPTION": "في حالة التمكين، لن تعمل طريقة حساب SDKs إلا إذا تم توفير `IDer_hash` لكل مستخدم.", + "HMAC_MANDATORY_DESCRIPTION": "If enabled, requests missing the `identifier_hash` will be rejected.", "INBOX_IDENTIFIER": "معرف صندوق الوارد", "INBOX_IDENTIFIER_SUB_TEXT": "استخدم رمز 'inbox_identifier' المعروض هنا للمصادقة على عملاء API الخاص بك.", "FORWARD_EMAIL_TITLE": "إعادة التوجيه إلى البريد الإلكتروني", "FORWARD_EMAIL_SUB_TEXT": "بدء إعادة توجيه رسائل البريد الإلكتروني الخاصة بك إلى عنوان البريد الإلكتروني التالي.", "ALLOW_MESSAGES_AFTER_RESOLVED": "السماح بالرسائل بعد حل المحادثة", - "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "السماح للمستخدمين النهائيين بإرسال رسائل حتى بعد تسوية المحادثة." + "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "السماح للمستخدمين النهائيين بإرسال رسائل حتى بعد تسوية المحادثة.", + "WHATSAPP_SECTION_SUBHEADER": "This API Key is used for the integration with the WhatsApp APIs.", + "WHATSAPP_SECTION_TITLE": "مفتاح API" + }, + "AUTO_ASSIGNMENT": { + "MAX_ASSIGNMENT_LIMIT": "حد الإسناد التلقائي", + "MAX_ASSIGNMENT_LIMIT_RANGE_ERROR": "الرجاء إدخال قيمة أكبر من 0", + "MAX_ASSIGNMENT_LIMIT_SUB_TEXT": "تحديد الحد الأقصى لعدد المحادثات من علبة الوارد هذه التي يمكن تعيينها تلقائياً إلى وكيل" }, "FACEBOOK_REAUTHORIZE": { "TITLE": "إعادة التصريح", diff --git a/app/javascript/dashboard/i18n/locale/ar/report.json b/app/javascript/dashboard/i18n/locale/ar/report.json index 19180a51a..1e59887c0 100644 --- a/app/javascript/dashboard/i18n/locale/ar/report.json +++ b/app/javascript/dashboard/i18n/locale/ar/report.json @@ -65,6 +65,7 @@ "PLACEHOLDER": "اختر نطاق المدة" }, "GROUP_BY_FILTER_DROPDOWN_LABEL": "تجميع بواسطة", + "DURATION_FILTER_LABEL": "المدة", "GROUP_BY_DAY_OPTIONS": [ { "id": 1, diff --git a/app/javascript/dashboard/i18n/locale/bg/bulkActions.json b/app/javascript/dashboard/i18n/locale/bg/bulkActions.json index bfd688bef..7061e5e70 100644 --- a/app/javascript/dashboard/i18n/locale/bg/bulkActions.json +++ b/app/javascript/dashboard/i18n/locale/bg/bulkActions.json @@ -1,17 +1,29 @@ { - "BULK_ACTION": { - "CONVERSATIONS_SELECTED": "%{conversationCount} conversations selected", - "AGENT_SELECT_LABEL": "Select Agent", - "ASSIGN_CONFIRMATION_LABEL": "Are you sure you want to assign %{conversationCount} %{conversationLabel} to", - "GO_BACK_LABEL": "Go back", - "ASSIGN_LABEL": "Assign", - "ASSIGN_AGENT_TOOLTIP": "Assign Agent", - "RESOLVE_TOOLTIP": "Resolve", - "ASSIGN_SUCCESFUL": "Conversations assigned successfully", - "ASSIGN_FAILED": "Failed to assign conversations, please try again", - "RESOLVE_SUCCESFUL": "Conversations resolved successfully", - "RESOLVE_FAILED": "Failed to resolve conversations, please try again", - "ALL_CONVERSATIONS_SELECTED_ALERT": "Conversations visible on this page are only selected.", - "AGENT_LIST_LOADING": "Loading Agents" + "BULK_ACTION": { + "CONVERSATIONS_SELECTED": "%{conversationCount} conversations selected", + "AGENT_SELECT_LABEL": "Select Agent", + "ASSIGN_CONFIRMATION_LABEL": "Are you sure you want to assign %{conversationCount} %{conversationLabel} to", + "GO_BACK_LABEL": "Go back", + "ASSIGN_LABEL": "Assign", + "ASSIGN_AGENT_TOOLTIP": "Assign Agent", + "ASSIGN_SUCCESFUL": "Conversations assigned successfully", + "ASSIGN_FAILED": "Failed to assign conversations, please try again", + "RESOLVE_SUCCESFUL": "Conversations resolved successfully", + "RESOLVE_FAILED": "Failed to resolve conversations, please try again", + "ALL_CONVERSATIONS_SELECTED_ALERT": "Conversations visible on this page are only selected.", + "AGENT_LIST_LOADING": "Loading Agents", + "UPDATE": { + "CHANGE_STATUS": "Change status", + "SNOOZE_UNTIL_NEXT_REPLY": "Snooze until next reply", + "UPDATE_SUCCESFUL": "Conversation status updated successfully.", + "UPDATE_FAILED": "Failed to update conversations, please try again" + }, + "LABELS": { + "ASSIGN_LABELS": "Assign Labels", + "NO_LABELS_FOUND": "No labels found for", + "ASSIGN_SELECTED_LABELS": "Assign selected labels", + "ASSIGN_SUCCESFUL": "Labels assigned successfully", + "ASSIGN_FAILED": "Failed to assign labels, please try again" } + } } diff --git a/app/javascript/dashboard/i18n/locale/bg/contact.json b/app/javascript/dashboard/i18n/locale/bg/contact.json index 0cec34425..972d3072b 100644 --- a/app/javascript/dashboard/i18n/locale/bg/contact.json +++ b/app/javascript/dashboard/i18n/locale/bg/contact.json @@ -111,7 +111,8 @@ "EMAIL_ADDRESS": { "PLACEHOLDER": "Добавете имейл на контакта", "LABEL": "Имейл адрес", - "DUPLICATE": "Този имейл се използва от друг контакт." + "DUPLICATE": "Този имейл се използва от друг контакт.", + "ERROR": "Please enter a valid email address." }, "PHONE_NUMBER": { "PLACEHOLDER": "Добавете телефона на контакта", diff --git a/app/javascript/dashboard/i18n/locale/bg/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/bg/inboxMgmt.json index 7e4842bd7..62a02e6f6 100644 --- a/app/javascript/dashboard/i18n/locale/bg/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/bg/inboxMgmt.json @@ -30,7 +30,8 @@ "ADD": { "CHANNEL_NAME": { "LABEL": "Inbox Name", - "PLACEHOLDER": "Enter your inbox name (eg: Acme Inc)" + "PLACEHOLDER": "Enter your inbox name (eg: Acme Inc)", + "ERROR": "Please enter a valid inbox name" }, "WEBSITE_NAME": { "LABEL": "Website Name", @@ -82,7 +83,7 @@ }, "CHANNEL_GREETING_TOGGLE": { "LABEL": "Enable channel greeting", - "HELP_TEXT": "Send a greeting message to the users when they starts the conversation.", + "HELP_TEXT": "Automatically send a greeting message when a new conversation is created.", "ENABLED": "Enabled", "DISABLED": "Disabled" }, @@ -97,7 +98,10 @@ "LABEL": "Widget Color", "PLACEHOLDER": "Update the widget color used in widget" }, - "SUBMIT_BUTTON": "Create inbox" + "SUBMIT_BUTTON": "Create inbox", + "API": { + "ERROR_MESSAGE": "We were not able to create a website channel, please try again" + } }, "TWILIO": { "TITLE": "Twilio SMS/WhatsApp Channel", @@ -193,6 +197,7 @@ "PROVIDERS": { "LABEL": "API Provider", "TWILIO": "Twilio", + "WHATSAPP_CLOUD": "WhatsApp Cloud", "360_DIALOG": "360Dialog" }, "INBOX_NAME": { @@ -205,13 +210,31 @@ "PLACEHOLDER": "Please enter the phone number from which message will be sent.", "ERROR": "Please enter a valid value. Phone number should start with `+` sign." }, + "PHONE_NUMBER_ID": { + "LABEL": "Phone number ID", + "PLACEHOLDER": "Please enter the Phone number ID obtained from Facebook developer dashboard.", + "ERROR": "Please enter a valid value." + }, + "BUSINESS_ACCOUNT_ID": { + "LABEL": "Business Account ID", + "PLACEHOLDER": "Please enter the Business Account ID obtained from Facebook developer dashboard.", + "ERROR": "Please enter a valid value." + }, + "WEBHOOK_VERIFY_TOKEN": { + "LABEL": "Webhook Verify Token", + "PLACEHOLDER": "Enter a verify token which you want to configure for facebook webhooks.", + "ERROR": "Please enter a valid value." + }, "API_KEY": { "LABEL": "API key", "SUBTITLE": "Configure the WhatsApp API key.", "PLACEHOLDER": "API key", - "APPLY_FOR_ACCESS": "Don't have any API key? Apply for access here", "ERROR": "Please enter a valid value." }, + "API_CALLBACK": { + "TITLE": "Callback URL", + "SUBTITLE": "You have to configure the webhook URL in facebook developer portal with the URL mentioned here." + }, "SUBMIT_BUTTON": "Create WhatsApp Channel", "API": { "ERROR_MESSAGE": "We were not able to save the WhatsApp channel" @@ -298,7 +321,7 @@ }, "AUTH": { "TITLE": "Choose a channel", - "DESC": "Chatwoot supports live-chat widget, Facebook page, Twitter profile, WhatsApp, Email etc., as channels. If you want to build a custom channel, you can create it using the API channel. Select one channel from the options below to proceed." + "DESC": "Chatwoot supports live-chat widgets, Facebook Messenger, Twitter profiles, WhatsApp, Emails, etc., as channels. If you want to build a custom channel, you can create it using the API channel. To get started, choose one of the channels below." }, "AGENTS": { "TITLE": "Агенти", @@ -339,7 +362,7 @@ "API": { "SUCCESS_MESSAGE": "Inbox settings updated successfully", "AUTO_ASSIGNMENT_SUCCESS_MESSAGE": "Auto assignment updated successfully", - "ERROR_MESSAGE": "Could not update widget color. Please try again later." + "ERROR_MESSAGE": "We couldn't update inbox settings. Please try again later." }, "EMAIL_COLLECT_BOX": { "ENABLED": "Enabled", @@ -412,15 +435,22 @@ "INBOX_UPDATE_SUB_TEXT": "Update your inbox settings", "AUTO_ASSIGNMENT_SUB_TEXT": "Enable or disable the automatic assignment of new conversations to the agents added to this inbox.", "HMAC_VERIFICATION": "User Identity Validation", - "HMAC_DESCRIPTION": "Inorder to validate the user's identity, the SDK allows you to pass an `identifier_hash` for each user. You can generate HMAC using 'sha256' with the key shown here.", + "HMAC_DESCRIPTION": "In order to validate the user's identity, you can pass an `identifier_hash` for each user. You can generate a HMAC sha256 hash using the `identifier` with the key shown here.", "HMAC_MANDATORY_VERIFICATION": "Enforce User Identity Validation", - "HMAC_MANDATORY_DESCRIPTION": "If enabled, Chatwoot SDKs setUser method will not work unless the `identifier_hash` is provided for each user.", + "HMAC_MANDATORY_DESCRIPTION": "If enabled, requests missing the `identifier_hash` will be rejected.", "INBOX_IDENTIFIER": "Inbox Identifier", "INBOX_IDENTIFIER_SUB_TEXT": "Use the `inbox_identifier` token shown here to authentication your API clients.", "FORWARD_EMAIL_TITLE": "Forward to Email", "FORWARD_EMAIL_SUB_TEXT": "Start forwarding your emails to the following email address.", "ALLOW_MESSAGES_AFTER_RESOLVED": "Allow messages after conversation resolved", - "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Allow the end-users to send messages even after the conversation is resolved." + "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Allow the end-users to send messages even after the conversation is resolved.", + "WHATSAPP_SECTION_SUBHEADER": "This API Key is used for the integration with the WhatsApp APIs.", + "WHATSAPP_SECTION_TITLE": "API Key" + }, + "AUTO_ASSIGNMENT": { + "MAX_ASSIGNMENT_LIMIT": "Auto assignment limit", + "MAX_ASSIGNMENT_LIMIT_RANGE_ERROR": "Please enter a value greater than 0", + "MAX_ASSIGNMENT_LIMIT_SUB_TEXT": "Limit the maximum number of conversations from this inbox that can be auto assigned to an agent" }, "FACEBOOK_REAUTHORIZE": { "TITLE": "Reauthorize", diff --git a/app/javascript/dashboard/i18n/locale/bg/report.json b/app/javascript/dashboard/i18n/locale/bg/report.json index 939c9a51b..34116062a 100644 --- a/app/javascript/dashboard/i18n/locale/bg/report.json +++ b/app/javascript/dashboard/i18n/locale/bg/report.json @@ -65,6 +65,7 @@ "PLACEHOLDER": "Select date range" }, "GROUP_BY_FILTER_DROPDOWN_LABEL": "Group By", + "DURATION_FILTER_LABEL": "Duration", "GROUP_BY_DAY_OPTIONS": [ { "id": 1, diff --git a/app/javascript/dashboard/i18n/locale/ca/bulkActions.json b/app/javascript/dashboard/i18n/locale/ca/bulkActions.json index ad225300e..c1cb9d9fd 100644 --- a/app/javascript/dashboard/i18n/locale/ca/bulkActions.json +++ b/app/javascript/dashboard/i18n/locale/ca/bulkActions.json @@ -1,17 +1,29 @@ { - "BULK_ACTION": { - "CONVERSATIONS_SELECTED": "%{conversationCount} conversations selected", - "AGENT_SELECT_LABEL": "Seleccionar Agent", - "ASSIGN_CONFIRMATION_LABEL": "Are you sure you want to assign %{conversationCount} %{conversationLabel} to", - "GO_BACK_LABEL": "Go back", - "ASSIGN_LABEL": "Assignar", - "ASSIGN_AGENT_TOOLTIP": "Assign Agent", - "RESOLVE_TOOLTIP": "Resoldre", - "ASSIGN_SUCCESFUL": "Conversations assigned successfully", - "ASSIGN_FAILED": "Failed to assign conversations, please try again", - "RESOLVE_SUCCESFUL": "Conversations resolved successfully", - "RESOLVE_FAILED": "Failed to resolve conversations, please try again", - "ALL_CONVERSATIONS_SELECTED_ALERT": "Conversations visible on this page are only selected.", - "AGENT_LIST_LOADING": "Loading Agents" + "BULK_ACTION": { + "CONVERSATIONS_SELECTED": "%{conversationCount} conversations selected", + "AGENT_SELECT_LABEL": "Seleccionar Agent", + "ASSIGN_CONFIRMATION_LABEL": "Are you sure you want to assign %{conversationCount} %{conversationLabel} to", + "GO_BACK_LABEL": "Go back", + "ASSIGN_LABEL": "Assignar", + "ASSIGN_AGENT_TOOLTIP": "Assign Agent", + "ASSIGN_SUCCESFUL": "Conversations assigned successfully", + "ASSIGN_FAILED": "Failed to assign conversations, please try again", + "RESOLVE_SUCCESFUL": "Conversations resolved successfully", + "RESOLVE_FAILED": "Failed to resolve conversations, please try again", + "ALL_CONVERSATIONS_SELECTED_ALERT": "Conversations visible on this page are only selected.", + "AGENT_LIST_LOADING": "Loading Agents", + "UPDATE": { + "CHANGE_STATUS": "Change status", + "SNOOZE_UNTIL_NEXT_REPLY": "Snooze until next reply", + "UPDATE_SUCCESFUL": "Conversation status updated successfully.", + "UPDATE_FAILED": "Failed to update conversations, please try again" + }, + "LABELS": { + "ASSIGN_LABELS": "Assign Labels", + "NO_LABELS_FOUND": "No labels found for", + "ASSIGN_SELECTED_LABELS": "Assign selected labels", + "ASSIGN_SUCCESFUL": "Labels assigned successfully", + "ASSIGN_FAILED": "Failed to assign labels, please try again" } + } } diff --git a/app/javascript/dashboard/i18n/locale/ca/contact.json b/app/javascript/dashboard/i18n/locale/ca/contact.json index 6c567213a..bf49a2c02 100644 --- a/app/javascript/dashboard/i18n/locale/ca/contact.json +++ b/app/javascript/dashboard/i18n/locale/ca/contact.json @@ -111,7 +111,8 @@ "EMAIL_ADDRESS": { "PLACEHOLDER": "Introdueix l'adreça de correu electrònic del contacte", "LABEL": "Adreça de correu electrònic", - "DUPLICATE": "Aquesta adreça de correu electrònic s’utilitza per a un altre contacte." + "DUPLICATE": "Aquesta adreça de correu electrònic s’utilitza per a un altre contacte.", + "ERROR": "Introduïu una adreça de correu electrònic vàlida." }, "PHONE_NUMBER": { "PLACEHOLDER": "Introdueix el número de telèfon del contacte", diff --git a/app/javascript/dashboard/i18n/locale/ca/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ca/inboxMgmt.json index 19fa864b0..00b2b6750 100644 --- a/app/javascript/dashboard/i18n/locale/ca/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/ca/inboxMgmt.json @@ -30,7 +30,8 @@ "ADD": { "CHANNEL_NAME": { "LABEL": "Nom de la safata d'entrada", - "PLACEHOLDER": "Enter your inbox name (eg: Acme Inc)" + "PLACEHOLDER": "Enter your inbox name (eg: Acme Inc)", + "ERROR": "Please enter a valid inbox name" }, "WEBSITE_NAME": { "LABEL": "Nom del lloc web", @@ -82,7 +83,7 @@ }, "CHANNEL_GREETING_TOGGLE": { "LABEL": "Activa la salutació del canal", - "HELP_TEXT": "Send a greeting message to the users when they starts the conversation.", + "HELP_TEXT": "Automatically send a greeting message when a new conversation is created.", "ENABLED": "Habilita", "DISABLED": "Inhabilita" }, @@ -97,7 +98,10 @@ "LABEL": "Color del Widget", "PLACEHOLDER": "Actualitza el color del widget" }, - "SUBMIT_BUTTON": "Crea la safata entrada" + "SUBMIT_BUTTON": "Crea la safata entrada", + "API": { + "ERROR_MESSAGE": "We were not able to create a website channel, please try again" + } }, "TWILIO": { "TITLE": "Twilio SMS/WhatsApp Channel", @@ -193,6 +197,7 @@ "PROVIDERS": { "LABEL": "API Provider", "TWILIO": "Twilio", + "WHATSAPP_CLOUD": "WhatsApp Cloud", "360_DIALOG": "360Dialog" }, "INBOX_NAME": { @@ -205,13 +210,31 @@ "PLACEHOLDER": "Introduïu el número de telèfon des del qual serà enviat el missatge.", "ERROR": "Introduïu un valor vàlid. El número de telèfon hauria de començar amb el signe `+`." }, + "PHONE_NUMBER_ID": { + "LABEL": "Phone number ID", + "PLACEHOLDER": "Please enter the Phone number ID obtained from Facebook developer dashboard.", + "ERROR": "Please enter a valid value." + }, + "BUSINESS_ACCOUNT_ID": { + "LABEL": "Business Account ID", + "PLACEHOLDER": "Please enter the Business Account ID obtained from Facebook developer dashboard.", + "ERROR": "Please enter a valid value." + }, + "WEBHOOK_VERIFY_TOKEN": { + "LABEL": "Webhook Verify Token", + "PLACEHOLDER": "Enter a verify token which you want to configure for facebook webhooks.", + "ERROR": "Please enter a valid value." + }, "API_KEY": { "LABEL": "API key", "SUBTITLE": "Configure the WhatsApp API key.", "PLACEHOLDER": "API key", - "APPLY_FOR_ACCESS": "Don't have any API key? Apply for access here", "ERROR": "Please enter a valid value." }, + "API_CALLBACK": { + "TITLE": "Callback URL", + "SUBTITLE": "You have to configure the webhook URL in facebook developer portal with the URL mentioned here." + }, "SUBMIT_BUTTON": "Create WhatsApp Channel", "API": { "ERROR_MESSAGE": "We were not able to save the WhatsApp channel" @@ -298,7 +321,7 @@ }, "AUTH": { "TITLE": "Choose a channel", - "DESC": "Chatwoot supports live-chat widget, Facebook page, Twitter profile, WhatsApp, Email etc., as channels. If you want to build a custom channel, you can create it using the API channel. Select one channel from the options below to proceed." + "DESC": "Chatwoot supports live-chat widgets, Facebook Messenger, Twitter profiles, WhatsApp, Emails, etc., as channels. If you want to build a custom channel, you can create it using the API channel. To get started, choose one of the channels below." }, "AGENTS": { "TITLE": "Agents", @@ -339,7 +362,7 @@ "API": { "SUCCESS_MESSAGE": "El color del widget s'ha actualitzat correctament", "AUTO_ASSIGNMENT_SUCCESS_MESSAGE": "Assignació automàtica actualitzada correctament", - "ERROR_MESSAGE": "No s'ha pogut actualitzar el color del widget. Torneu-ho a provar més endavant." + "ERROR_MESSAGE": "We couldn't update inbox settings. Please try again later." }, "EMAIL_COLLECT_BOX": { "ENABLED": "Habilita", @@ -412,15 +435,22 @@ "INBOX_UPDATE_SUB_TEXT": "Actualitza la configuració de la safata d'entrada", "AUTO_ASSIGNMENT_SUB_TEXT": "Activa o desactiva l'assignació automàtica d'agents disponibles a les noves converses", "HMAC_VERIFICATION": "Validació de la Identitat del Usuari", - "HMAC_DESCRIPTION": "Inorder to validate the user's identity, the SDK allows you to pass an `identifier_hash` for each user. You can generate HMAC using 'sha256' with the key shown here.", + "HMAC_DESCRIPTION": "In order to validate the user's identity, you can pass an `identifier_hash` for each user. You can generate a HMAC sha256 hash using the `identifier` with the key shown here.", "HMAC_MANDATORY_VERIFICATION": "Enforce User Identity Validation", - "HMAC_MANDATORY_DESCRIPTION": "If enabled, Chatwoot SDKs setUser method will not work unless the `identifier_hash` is provided for each user.", + "HMAC_MANDATORY_DESCRIPTION": "If enabled, requests missing the `identifier_hash` will be rejected.", "INBOX_IDENTIFIER": "Inbox Identifier", "INBOX_IDENTIFIER_SUB_TEXT": "Use the `inbox_identifier` token shown here to authentication your API clients.", "FORWARD_EMAIL_TITLE": "Forward to Email", "FORWARD_EMAIL_SUB_TEXT": "Comença a reenviar els teus correus electrònics a la següent adreça electrònica.", "ALLOW_MESSAGES_AFTER_RESOLVED": "Allow messages after conversation resolved", - "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Allow the end-users to send messages even after the conversation is resolved." + "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Allow the end-users to send messages even after the conversation is resolved.", + "WHATSAPP_SECTION_SUBHEADER": "This API Key is used for the integration with the WhatsApp APIs.", + "WHATSAPP_SECTION_TITLE": "API Key" + }, + "AUTO_ASSIGNMENT": { + "MAX_ASSIGNMENT_LIMIT": "Auto assignment limit", + "MAX_ASSIGNMENT_LIMIT_RANGE_ERROR": "Please enter a value greater than 0", + "MAX_ASSIGNMENT_LIMIT_SUB_TEXT": "Limit the maximum number of conversations from this inbox that can be auto assigned to an agent" }, "FACEBOOK_REAUTHORIZE": { "TITLE": "Reautoritza", diff --git a/app/javascript/dashboard/i18n/locale/ca/report.json b/app/javascript/dashboard/i18n/locale/ca/report.json index 6ffcf856f..831891c2b 100644 --- a/app/javascript/dashboard/i18n/locale/ca/report.json +++ b/app/javascript/dashboard/i18n/locale/ca/report.json @@ -65,6 +65,7 @@ "PLACEHOLDER": "Select date range" }, "GROUP_BY_FILTER_DROPDOWN_LABEL": "Group By", + "DURATION_FILTER_LABEL": "Duration", "GROUP_BY_DAY_OPTIONS": [ { "id": 1, diff --git a/app/javascript/dashboard/i18n/locale/cs/bulkActions.json b/app/javascript/dashboard/i18n/locale/cs/bulkActions.json index b7b0c4212..b752fdfa7 100644 --- a/app/javascript/dashboard/i18n/locale/cs/bulkActions.json +++ b/app/javascript/dashboard/i18n/locale/cs/bulkActions.json @@ -1,17 +1,29 @@ { - "BULK_ACTION": { - "CONVERSATIONS_SELECTED": "%{conversationCount} conversations selected", - "AGENT_SELECT_LABEL": "Vybrat agenta", - "ASSIGN_CONFIRMATION_LABEL": "Are you sure you want to assign %{conversationCount} %{conversationLabel} to", - "GO_BACK_LABEL": "Go back", - "ASSIGN_LABEL": "Přiřadit", - "ASSIGN_AGENT_TOOLTIP": "Assign Agent", - "RESOLVE_TOOLTIP": "Vyřešit", - "ASSIGN_SUCCESFUL": "Conversations assigned successfully", - "ASSIGN_FAILED": "Failed to assign conversations, please try again", - "RESOLVE_SUCCESFUL": "Conversations resolved successfully", - "RESOLVE_FAILED": "Failed to resolve conversations, please try again", - "ALL_CONVERSATIONS_SELECTED_ALERT": "Conversations visible on this page are only selected.", - "AGENT_LIST_LOADING": "Loading Agents" + "BULK_ACTION": { + "CONVERSATIONS_SELECTED": "%{conversationCount} conversations selected", + "AGENT_SELECT_LABEL": "Vybrat agenta", + "ASSIGN_CONFIRMATION_LABEL": "Are you sure you want to assign %{conversationCount} %{conversationLabel} to", + "GO_BACK_LABEL": "Go back", + "ASSIGN_LABEL": "Přiřadit", + "ASSIGN_AGENT_TOOLTIP": "Assign Agent", + "ASSIGN_SUCCESFUL": "Conversations assigned successfully", + "ASSIGN_FAILED": "Failed to assign conversations, please try again", + "RESOLVE_SUCCESFUL": "Conversations resolved successfully", + "RESOLVE_FAILED": "Failed to resolve conversations, please try again", + "ALL_CONVERSATIONS_SELECTED_ALERT": "Conversations visible on this page are only selected.", + "AGENT_LIST_LOADING": "Loading Agents", + "UPDATE": { + "CHANGE_STATUS": "Change status", + "SNOOZE_UNTIL_NEXT_REPLY": "Snooze until next reply", + "UPDATE_SUCCESFUL": "Conversation status updated successfully.", + "UPDATE_FAILED": "Failed to update conversations, please try again" + }, + "LABELS": { + "ASSIGN_LABELS": "Assign Labels", + "NO_LABELS_FOUND": "No labels found for", + "ASSIGN_SELECTED_LABELS": "Assign selected labels", + "ASSIGN_SUCCESFUL": "Labels assigned successfully", + "ASSIGN_FAILED": "Failed to assign labels, please try again" } + } } diff --git a/app/javascript/dashboard/i18n/locale/cs/contact.json b/app/javascript/dashboard/i18n/locale/cs/contact.json index b9006fe35..962ba63e8 100644 --- a/app/javascript/dashboard/i18n/locale/cs/contact.json +++ b/app/javascript/dashboard/i18n/locale/cs/contact.json @@ -111,7 +111,8 @@ "EMAIL_ADDRESS": { "PLACEHOLDER": "Zadejte e-mailovou adresu kontaktu", "LABEL": "E-mailová adresa", - "DUPLICATE": "Tuto e-mailovou adresu již používá jiný kontakt." + "DUPLICATE": "Tuto e-mailovou adresu již používá jiný kontakt.", + "ERROR": "Zadejte prosím platnou e-mailovou adresu." }, "PHONE_NUMBER": { "PLACEHOLDER": "Zadejte telefonní číslo kontaktu", diff --git a/app/javascript/dashboard/i18n/locale/cs/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/cs/inboxMgmt.json index c0771d5de..353f9db71 100644 --- a/app/javascript/dashboard/i18n/locale/cs/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/cs/inboxMgmt.json @@ -30,7 +30,8 @@ "ADD": { "CHANNEL_NAME": { "LABEL": "Název schránky", - "PLACEHOLDER": "Enter your inbox name (eg: Acme Inc)" + "PLACEHOLDER": "Enter your inbox name (eg: Acme Inc)", + "ERROR": "Please enter a valid inbox name" }, "WEBSITE_NAME": { "LABEL": "Website Name", @@ -82,7 +83,7 @@ }, "CHANNEL_GREETING_TOGGLE": { "LABEL": "Povolit uvítání", - "HELP_TEXT": "Send a greeting message to the users when they starts the conversation.", + "HELP_TEXT": "Automatically send a greeting message when a new conversation is created.", "ENABLED": "Povoleno", "DISABLED": "Zakázáno" }, @@ -97,7 +98,10 @@ "LABEL": "Barva widgetu", "PLACEHOLDER": "Aktualizovat barvu widgetu použitou ve widgetu" }, - "SUBMIT_BUTTON": "Vytvořit doručenou poštu" + "SUBMIT_BUTTON": "Vytvořit doručenou poštu", + "API": { + "ERROR_MESSAGE": "We were not able to create a website channel, please try again" + } }, "TWILIO": { "TITLE": "Twilio SMS/WhatsApp Channel", @@ -193,6 +197,7 @@ "PROVIDERS": { "LABEL": "API Provider", "TWILIO": "Twilio", + "WHATSAPP_CLOUD": "WhatsApp Cloud", "360_DIALOG": "360Dialog" }, "INBOX_NAME": { @@ -205,13 +210,31 @@ "PLACEHOLDER": "Zadejte prosím telefonní číslo, ze kterého bude zpráva odeslána.", "ERROR": "Zadejte platnou hodnotu. Telefonní číslo by mělo začínat znakem `+`." }, + "PHONE_NUMBER_ID": { + "LABEL": "Phone number ID", + "PLACEHOLDER": "Please enter the Phone number ID obtained from Facebook developer dashboard.", + "ERROR": "Please enter a valid value." + }, + "BUSINESS_ACCOUNT_ID": { + "LABEL": "Business Account ID", + "PLACEHOLDER": "Please enter the Business Account ID obtained from Facebook developer dashboard.", + "ERROR": "Please enter a valid value." + }, + "WEBHOOK_VERIFY_TOKEN": { + "LABEL": "Webhook Verify Token", + "PLACEHOLDER": "Enter a verify token which you want to configure for facebook webhooks.", + "ERROR": "Please enter a valid value." + }, "API_KEY": { "LABEL": "API key", "SUBTITLE": "Configure the WhatsApp API key.", "PLACEHOLDER": "API key", - "APPLY_FOR_ACCESS": "Don't have any API key? Apply for access here", "ERROR": "Please enter a valid value." }, + "API_CALLBACK": { + "TITLE": "Callback URL", + "SUBTITLE": "You have to configure the webhook URL in facebook developer portal with the URL mentioned here." + }, "SUBMIT_BUTTON": "Create WhatsApp Channel", "API": { "ERROR_MESSAGE": "We were not able to save the WhatsApp channel" @@ -298,7 +321,7 @@ }, "AUTH": { "TITLE": "Choose a channel", - "DESC": "Chatwoot supports live-chat widget, Facebook page, Twitter profile, WhatsApp, Email etc., as channels. If you want to build a custom channel, you can create it using the API channel. Select one channel from the options below to proceed." + "DESC": "Chatwoot supports live-chat widgets, Facebook Messenger, Twitter profiles, WhatsApp, Emails, etc., as channels. If you want to build a custom channel, you can create it using the API channel. To get started, choose one of the channels below." }, "AGENTS": { "TITLE": "Agenti", @@ -339,7 +362,7 @@ "API": { "SUCCESS_MESSAGE": "Nastavení doručené pošty bylo úspěšně aktualizováno", "AUTO_ASSIGNMENT_SUCCESS_MESSAGE": "Automatické přiřazení bylo úspěšně aktualizováno", - "ERROR_MESSAGE": "Nelze aktualizovat barvu widgetu. Opakujte akci později." + "ERROR_MESSAGE": "We couldn't update inbox settings. Please try again later." }, "EMAIL_COLLECT_BOX": { "ENABLED": "Povoleno", @@ -412,15 +435,22 @@ "INBOX_UPDATE_SUB_TEXT": "Aktualizujte nastavení doručené pošty", "AUTO_ASSIGNMENT_SUB_TEXT": "Povolit nebo zakázat automatické přiřazování nových konverzací agentům přidaným do této schránky.", "HMAC_VERIFICATION": "User Identity Validation", - "HMAC_DESCRIPTION": "Inorder to validate the user's identity, the SDK allows you to pass an `identifier_hash` for each user. You can generate HMAC using 'sha256' with the key shown here.", + "HMAC_DESCRIPTION": "In order to validate the user's identity, you can pass an `identifier_hash` for each user. You can generate a HMAC sha256 hash using the `identifier` with the key shown here.", "HMAC_MANDATORY_VERIFICATION": "Enforce User Identity Validation", - "HMAC_MANDATORY_DESCRIPTION": "If enabled, Chatwoot SDKs setUser method will not work unless the `identifier_hash` is provided for each user.", + "HMAC_MANDATORY_DESCRIPTION": "If enabled, requests missing the `identifier_hash` will be rejected.", "INBOX_IDENTIFIER": "Inbox Identifier", "INBOX_IDENTIFIER_SUB_TEXT": "Use the `inbox_identifier` token shown here to authentication your API clients.", "FORWARD_EMAIL_TITLE": "Forward to Email", "FORWARD_EMAIL_SUB_TEXT": "Start forwarding your emails to the following email address.", "ALLOW_MESSAGES_AFTER_RESOLVED": "Allow messages after conversation resolved", - "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Allow the end-users to send messages even after the conversation is resolved." + "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Allow the end-users to send messages even after the conversation is resolved.", + "WHATSAPP_SECTION_SUBHEADER": "This API Key is used for the integration with the WhatsApp APIs.", + "WHATSAPP_SECTION_TITLE": "API Key" + }, + "AUTO_ASSIGNMENT": { + "MAX_ASSIGNMENT_LIMIT": "Auto assignment limit", + "MAX_ASSIGNMENT_LIMIT_RANGE_ERROR": "Please enter a value greater than 0", + "MAX_ASSIGNMENT_LIMIT_SUB_TEXT": "Limit the maximum number of conversations from this inbox that can be auto assigned to an agent" }, "FACEBOOK_REAUTHORIZE": { "TITLE": "Znovu autorizovat", diff --git a/app/javascript/dashboard/i18n/locale/cs/report.json b/app/javascript/dashboard/i18n/locale/cs/report.json index 38f86c702..3827e8203 100644 --- a/app/javascript/dashboard/i18n/locale/cs/report.json +++ b/app/javascript/dashboard/i18n/locale/cs/report.json @@ -65,6 +65,7 @@ "PLACEHOLDER": "Select date range" }, "GROUP_BY_FILTER_DROPDOWN_LABEL": "Group By", + "DURATION_FILTER_LABEL": "Duration", "GROUP_BY_DAY_OPTIONS": [ { "id": 1, diff --git a/app/javascript/dashboard/i18n/locale/da/bulkActions.json b/app/javascript/dashboard/i18n/locale/da/bulkActions.json index fd595818f..7061e5e70 100644 --- a/app/javascript/dashboard/i18n/locale/da/bulkActions.json +++ b/app/javascript/dashboard/i18n/locale/da/bulkActions.json @@ -1,17 +1,29 @@ { - "BULK_ACTION": { - "CONVERSATIONS_SELECTED": "%{conversationCount} conversations selected", - "AGENT_SELECT_LABEL": "Select Agent", - "ASSIGN_CONFIRMATION_LABEL": "Are you sure you want to assign %{conversationCount} %{conversationLabel} to", - "GO_BACK_LABEL": "Go back", - "ASSIGN_LABEL": "Assign", - "ASSIGN_AGENT_TOOLTIP": "Assign Agent", - "RESOLVE_TOOLTIP": "Løs", - "ASSIGN_SUCCESFUL": "Conversations assigned successfully", - "ASSIGN_FAILED": "Failed to assign conversations, please try again", - "RESOLVE_SUCCESFUL": "Conversations resolved successfully", - "RESOLVE_FAILED": "Failed to resolve conversations, please try again", - "ALL_CONVERSATIONS_SELECTED_ALERT": "Conversations visible on this page are only selected.", - "AGENT_LIST_LOADING": "Loading Agents" + "BULK_ACTION": { + "CONVERSATIONS_SELECTED": "%{conversationCount} conversations selected", + "AGENT_SELECT_LABEL": "Select Agent", + "ASSIGN_CONFIRMATION_LABEL": "Are you sure you want to assign %{conversationCount} %{conversationLabel} to", + "GO_BACK_LABEL": "Go back", + "ASSIGN_LABEL": "Assign", + "ASSIGN_AGENT_TOOLTIP": "Assign Agent", + "ASSIGN_SUCCESFUL": "Conversations assigned successfully", + "ASSIGN_FAILED": "Failed to assign conversations, please try again", + "RESOLVE_SUCCESFUL": "Conversations resolved successfully", + "RESOLVE_FAILED": "Failed to resolve conversations, please try again", + "ALL_CONVERSATIONS_SELECTED_ALERT": "Conversations visible on this page are only selected.", + "AGENT_LIST_LOADING": "Loading Agents", + "UPDATE": { + "CHANGE_STATUS": "Change status", + "SNOOZE_UNTIL_NEXT_REPLY": "Snooze until next reply", + "UPDATE_SUCCESFUL": "Conversation status updated successfully.", + "UPDATE_FAILED": "Failed to update conversations, please try again" + }, + "LABELS": { + "ASSIGN_LABELS": "Assign Labels", + "NO_LABELS_FOUND": "No labels found for", + "ASSIGN_SELECTED_LABELS": "Assign selected labels", + "ASSIGN_SUCCESFUL": "Labels assigned successfully", + "ASSIGN_FAILED": "Failed to assign labels, please try again" } + } } diff --git a/app/javascript/dashboard/i18n/locale/da/contact.json b/app/javascript/dashboard/i18n/locale/da/contact.json index 9b2cb889c..81f4d4fcf 100644 --- a/app/javascript/dashboard/i18n/locale/da/contact.json +++ b/app/javascript/dashboard/i18n/locale/da/contact.json @@ -111,7 +111,8 @@ "EMAIL_ADDRESS": { "PLACEHOLDER": "Indtast e-mailadressen på kontaktpersonen", "LABEL": "E-Mail Adresse", - "DUPLICATE": "Denne e-mail adresse er i brug for en anden kontakt." + "DUPLICATE": "Denne e-mail adresse er i brug for en anden kontakt.", + "ERROR": "Indtast venligst en gyldig e-mailadresse." }, "PHONE_NUMBER": { "PLACEHOLDER": "Indtast telefonnummeret på kontaktpersonen", diff --git a/app/javascript/dashboard/i18n/locale/da/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/da/inboxMgmt.json index 6c5201ef9..134b23a05 100644 --- a/app/javascript/dashboard/i18n/locale/da/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/da/inboxMgmt.json @@ -30,7 +30,8 @@ "ADD": { "CHANNEL_NAME": { "LABEL": "Indbakke Navn", - "PLACEHOLDER": "Enter your inbox name (eg: Acme Inc)" + "PLACEHOLDER": "Enter your inbox name (eg: Acme Inc)", + "ERROR": "Please enter a valid inbox name" }, "WEBSITE_NAME": { "LABEL": "Websted Navn", @@ -82,7 +83,7 @@ }, "CHANNEL_GREETING_TOGGLE": { "LABEL": "Aktivér kanal start hilsen", - "HELP_TEXT": "Send a greeting message to the users when they starts the conversation.", + "HELP_TEXT": "Automatically send a greeting message when a new conversation is created.", "ENABLED": "Aktiveret", "DISABLED": "Deaktiveret" }, @@ -97,7 +98,10 @@ "LABEL": "Widget Farve", "PLACEHOLDER": "Opdater widget farve der bruges i widget" }, - "SUBMIT_BUTTON": "Opret indbakke" + "SUBMIT_BUTTON": "Opret indbakke", + "API": { + "ERROR_MESSAGE": "We were not able to create a website channel, please try again" + } }, "TWILIO": { "TITLE": "Twilio SMS/WhatsApp Channel", @@ -193,6 +197,7 @@ "PROVIDERS": { "LABEL": "API Provider", "TWILIO": "Twilio", + "WHATSAPP_CLOUD": "WhatsApp Cloud", "360_DIALOG": "360Dialog" }, "INBOX_NAME": { @@ -205,13 +210,31 @@ "PLACEHOLDER": "Indtast venligst det telefonnummer, hvorfra beskeden vil blive sendt.", "ERROR": "Angiv en gyldig værdi. Telefonnummer skal starte med `+` tegn." }, + "PHONE_NUMBER_ID": { + "LABEL": "Phone number ID", + "PLACEHOLDER": "Please enter the Phone number ID obtained from Facebook developer dashboard.", + "ERROR": "Please enter a valid value." + }, + "BUSINESS_ACCOUNT_ID": { + "LABEL": "Business Account ID", + "PLACEHOLDER": "Please enter the Business Account ID obtained from Facebook developer dashboard.", + "ERROR": "Please enter a valid value." + }, + "WEBHOOK_VERIFY_TOKEN": { + "LABEL": "Webhook Verify Token", + "PLACEHOLDER": "Enter a verify token which you want to configure for facebook webhooks.", + "ERROR": "Please enter a valid value." + }, "API_KEY": { "LABEL": "API key", "SUBTITLE": "Configure the WhatsApp API key.", "PLACEHOLDER": "API key", - "APPLY_FOR_ACCESS": "Don't have any API key? Apply for access here", "ERROR": "Please enter a valid value." }, + "API_CALLBACK": { + "TITLE": "Callback URL", + "SUBTITLE": "You have to configure the webhook URL in facebook developer portal with the URL mentioned here." + }, "SUBMIT_BUTTON": "Create WhatsApp Channel", "API": { "ERROR_MESSAGE": "We were not able to save the WhatsApp channel" @@ -298,7 +321,7 @@ }, "AUTH": { "TITLE": "Choose a channel", - "DESC": "Chatwoot supports live-chat widget, Facebook page, Twitter profile, WhatsApp, Email etc., as channels. If you want to build a custom channel, you can create it using the API channel. Select one channel from the options below to proceed." + "DESC": "Chatwoot supports live-chat widgets, Facebook Messenger, Twitter profiles, WhatsApp, Emails, etc., as channels. If you want to build a custom channel, you can create it using the API channel. To get started, choose one of the channels below." }, "AGENTS": { "TITLE": "Agenter", @@ -339,7 +362,7 @@ "API": { "SUCCESS_MESSAGE": "Indbakkeindstillinger opdateret", "AUTO_ASSIGNMENT_SUCCESS_MESSAGE": "Automatisk tildeling opdateret", - "ERROR_MESSAGE": "Kunne ikke opdatere widget farve. Prøv igen senere." + "ERROR_MESSAGE": "We couldn't update inbox settings. Please try again later." }, "EMAIL_COLLECT_BOX": { "ENABLED": "Aktiveret", @@ -412,15 +435,22 @@ "INBOX_UPDATE_SUB_TEXT": "Opdater dine indbakkeindstillinger", "AUTO_ASSIGNMENT_SUB_TEXT": "Aktiver eller deaktiver automatisk tildeling af nye samtaler til agenter tilføjet til denne indbakke.", "HMAC_VERIFICATION": "User Identity Validation", - "HMAC_DESCRIPTION": "Inorder to validate the user's identity, the SDK allows you to pass an `identifier_hash` for each user. You can generate HMAC using 'sha256' with the key shown here.", + "HMAC_DESCRIPTION": "In order to validate the user's identity, you can pass an `identifier_hash` for each user. You can generate a HMAC sha256 hash using the `identifier` with the key shown here.", "HMAC_MANDATORY_VERIFICATION": "Enforce User Identity Validation", - "HMAC_MANDATORY_DESCRIPTION": "If enabled, Chatwoot SDKs setUser method will not work unless the `identifier_hash` is provided for each user.", + "HMAC_MANDATORY_DESCRIPTION": "If enabled, requests missing the `identifier_hash` will be rejected.", "INBOX_IDENTIFIER": "Inbox Identifier", "INBOX_IDENTIFIER_SUB_TEXT": "Use the `inbox_identifier` token shown here to authentication your API clients.", "FORWARD_EMAIL_TITLE": "Forward to Email", "FORWARD_EMAIL_SUB_TEXT": "Begynd at videresende dine e-mails til følgende e-mailadresse.", "ALLOW_MESSAGES_AFTER_RESOLVED": "Allow messages after conversation resolved", - "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Allow the end-users to send messages even after the conversation is resolved." + "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Allow the end-users to send messages even after the conversation is resolved.", + "WHATSAPP_SECTION_SUBHEADER": "This API Key is used for the integration with the WhatsApp APIs.", + "WHATSAPP_SECTION_TITLE": "API Key" + }, + "AUTO_ASSIGNMENT": { + "MAX_ASSIGNMENT_LIMIT": "Auto assignment limit", + "MAX_ASSIGNMENT_LIMIT_RANGE_ERROR": "Please enter a value greater than 0", + "MAX_ASSIGNMENT_LIMIT_SUB_TEXT": "Limit the maximum number of conversations from this inbox that can be auto assigned to an agent" }, "FACEBOOK_REAUTHORIZE": { "TITLE": "Genautorisér", diff --git a/app/javascript/dashboard/i18n/locale/da/report.json b/app/javascript/dashboard/i18n/locale/da/report.json index 2122b1077..ff2528569 100644 --- a/app/javascript/dashboard/i18n/locale/da/report.json +++ b/app/javascript/dashboard/i18n/locale/da/report.json @@ -65,6 +65,7 @@ "PLACEHOLDER": "Select date range" }, "GROUP_BY_FILTER_DROPDOWN_LABEL": "Group By", + "DURATION_FILTER_LABEL": "Duration", "GROUP_BY_DAY_OPTIONS": [ { "id": 1, diff --git a/app/javascript/dashboard/i18n/locale/de/bulkActions.json b/app/javascript/dashboard/i18n/locale/de/bulkActions.json index ba8d8ea56..376a230ae 100644 --- a/app/javascript/dashboard/i18n/locale/de/bulkActions.json +++ b/app/javascript/dashboard/i18n/locale/de/bulkActions.json @@ -1,17 +1,29 @@ { - "BULK_ACTION": { - "CONVERSATIONS_SELECTED": "%{conversationCount} Konversationen ausgewählt", - "AGENT_SELECT_LABEL": "Agent auswählen", - "ASSIGN_CONFIRMATION_LABEL": "Sind Sie sicher, dass Sie %{conversationCount} %{conversationLabel} zuweisen möchten", - "GO_BACK_LABEL": "Zurück", - "ASSIGN_LABEL": "Zuordnen", - "ASSIGN_AGENT_TOOLTIP": "Agent zuweisen", - "RESOLVE_TOOLTIP": "Fall schließen", - "ASSIGN_SUCCESFUL": "Konversationen erfolgreich zugewiesen", - "ASSIGN_FAILED": "Konversationen konnten nicht zugewiesen werden. Bitte versuchen Sie es erneut", - "RESOLVE_SUCCESFUL": "Konversationen erfolgreich gelöst", - "RESOLVE_FAILED": "Konversationen konnten nicht gelöst werden. Bitte versuchen Sie es erneut", - "ALL_CONVERSATIONS_SELECTED_ALERT": "Nur auf dieser Seite sichtbaren Konversationen sind ausgewählt.", - "AGENT_LIST_LOADING": "Agenten werden geladen" + "BULK_ACTION": { + "CONVERSATIONS_SELECTED": "%{conversationCount} Konversationen ausgewählt", + "AGENT_SELECT_LABEL": "Agent auswählen", + "ASSIGN_CONFIRMATION_LABEL": "Sind Sie sicher, dass Sie %{conversationCount} %{conversationLabel} zuweisen möchten", + "GO_BACK_LABEL": "Zurück", + "ASSIGN_LABEL": "Zuordnen", + "ASSIGN_AGENT_TOOLTIP": "Agent zuweisen", + "ASSIGN_SUCCESFUL": "Konversationen erfolgreich zugewiesen", + "ASSIGN_FAILED": "Konversationen konnten nicht zugewiesen werden. Bitte versuchen Sie es erneut", + "RESOLVE_SUCCESFUL": "Konversationen erfolgreich gelöst", + "RESOLVE_FAILED": "Konversationen konnten nicht gelöst werden. Bitte versuchen Sie es erneut", + "ALL_CONVERSATIONS_SELECTED_ALERT": "Nur auf dieser Seite sichtbaren Konversationen sind ausgewählt.", + "AGENT_LIST_LOADING": "Agenten werden geladen", + "UPDATE": { + "CHANGE_STATUS": "Status ändern", + "SNOOZE_UNTIL_NEXT_REPLY": "Bis zur nächsten Antwort zurückstellen", + "UPDATE_SUCCESFUL": "Der Konversationsstatus wurde erfolgreich aktualisiert.", + "UPDATE_FAILED": "Konversationen konnten nicht aktualisiert werden. Bitte versuchen Sie es erneut" + }, + "LABELS": { + "ASSIGN_LABELS": "Labels zuweisen", + "NO_LABELS_FOUND": "Keine Labels gefunden für", + "ASSIGN_SELECTED_LABELS": "Ausgewählte Labels zuweisen", + "ASSIGN_SUCCESFUL": "Labels erfolgreich zugewiesen", + "ASSIGN_FAILED": "Label konnten nicht zugewiesen werden. Bitte versuchen Sie es erneut" } + } } diff --git a/app/javascript/dashboard/i18n/locale/de/contact.json b/app/javascript/dashboard/i18n/locale/de/contact.json index 2ea99f0ae..8562f47b1 100644 --- a/app/javascript/dashboard/i18n/locale/de/contact.json +++ b/app/javascript/dashboard/i18n/locale/de/contact.json @@ -111,7 +111,8 @@ "EMAIL_ADDRESS": { "PLACEHOLDER": "Geben Sie die E-Mail-Adresse des Kontakts ein", "LABEL": "E-Mail-Adresse", - "DUPLICATE": "Diese E-Mail-Adresse wird bereits für einen anderen Kontakt verwendet." + "DUPLICATE": "Diese E-Mail-Adresse wird bereits für einen anderen Kontakt verwendet.", + "ERROR": "Bitte geben Sie eine gültige E-Mail-Adresse ein." }, "PHONE_NUMBER": { "PLACEHOLDER": "Geben Sie die Telefonnummer des Kontakts ein", diff --git a/app/javascript/dashboard/i18n/locale/de/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/de/inboxMgmt.json index 5afc7d0a1..264f9e1c5 100644 --- a/app/javascript/dashboard/i18n/locale/de/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/de/inboxMgmt.json @@ -30,7 +30,8 @@ "ADD": { "CHANNEL_NAME": { "LABEL": "Posteingang-Name", - "PLACEHOLDER": "Geben Sie den Namen für Ihren Posteingang ein (eg: Acme Inc)" + "PLACEHOLDER": "Geben Sie den Namen für Ihren Posteingang ein (eg: Acme Inc)", + "ERROR": "Bitte geben Sie einen gültigen Posteingangsnamen ein" }, "WEBSITE_NAME": { "LABEL": "Webseiten-Name", @@ -82,7 +83,7 @@ }, "CHANNEL_GREETING_TOGGLE": { "LABEL": "Kanal Begrüßung aktivieren", - "HELP_TEXT": "Senden Sie eine Begrüßungsnachricht an die Benutzer, wenn sie das Gespräch beginnen.", + "HELP_TEXT": "Automatisch eine Begrüßungsnachricht senden, wenn eine neue Konversation erstellt wird.", "ENABLED": "Aktiviert", "DISABLED": "Deaktiviert" }, @@ -97,7 +98,10 @@ "LABEL": "Widget Farbe", "PLACEHOLDER": "Aktualisieren Sie die im Widget verwendete Widget-Farbe" }, - "SUBMIT_BUTTON": "Posteingang erstellen" + "SUBMIT_BUTTON": "Posteingang erstellen", + "API": { + "ERROR_MESSAGE": "Wir konnten keinen Website-Kanal erstellen, bitte versuchen Sie es erneut" + } }, "TWILIO": { "TITLE": "Twilio SMS/WhatsApp-Kanal", @@ -193,6 +197,7 @@ "PROVIDERS": { "LABEL": "API-Provider", "TWILIO": "Twilio", + "WHATSAPP_CLOUD": "WhatsApp Cloud", "360_DIALOG": "360Dialog" }, "INBOX_NAME": { @@ -205,13 +210,31 @@ "PLACEHOLDER": "Bitte geben Sie die Telefonnummer ein, von der die Nachricht gesendet wird.", "ERROR": "Bitte geben sie einen gültigen Wert ein. Die Telefonnummer sollte mit dem Pluszeichen beginnen." }, + "PHONE_NUMBER_ID": { + "LABEL": "Telefonnummer-ID", + "PLACEHOLDER": "Bitte geben Sie die Telefonnummern-ID ein, die Sie vom Facebook-Entwickler-Dashboard erhalten haben.", + "ERROR": "Bitte geben Sie einen gültigen Wert ein." + }, + "BUSINESS_ACCOUNT_ID": { + "LABEL": "Geschäftskonto-ID", + "PLACEHOLDER": "Bitte geben Sie die von Facebook Developer Dashboard erhaltene Geschäftskonto -ID ein.", + "ERROR": "Bitte geben Sie einen gültigen Wert ein." + }, + "WEBHOOK_VERIFY_TOKEN": { + "LABEL": "Webhook-Verifizierungstoken", + "PLACEHOLDER": "Geben Sie ein Überprüfungstoken ein, das Sie für Facebook-Webhooks konfigurieren möchten.", + "ERROR": "Bitte geben Sie einen gültigen Wert ein." + }, "API_KEY": { "LABEL": "API-Schlüssel", "SUBTITLE": "Konfigurieren Sie den WhatsApp API-Schlüssel.", "PLACEHOLDER": "API-Schlüssel", - "APPLY_FOR_ACCESS": "Sie haben keinen API-Schlüssel? Für den Zugriff hier beantragen", "ERROR": "Bitte geben Sie einen gültigen Wert ein." }, + "API_CALLBACK": { + "TITLE": "Callback URL", + "SUBTITLE": "Sie müssen die Webhook-URL im Facebook-Entwicklerportal mit der hier genannten URL konfigurieren." + }, "SUBMIT_BUTTON": "WhatsApp-Kanal erstellen", "API": { "ERROR_MESSAGE": "Wir konnten den WhatsApp-Kanal nicht speichern" @@ -298,7 +321,7 @@ }, "AUTH": { "TITLE": "Wählen Sie einen Kanal", - "DESC": "Chatwoot unterstützt Live-Chat-Widget, Facebook-Seite, Twitter-Profil, WhatsApp, E-Mail etc. als Kanäle. Wenn Sie einen eigenen Kanal erstellen möchten, können Sie einen API-Kanal verwenden. Wählen Sie einen Kanal aus den folgenden Optionen aus, um fortzufahren." + "DESC": "Chatwoot unterstützt Live-Chat-Widgets, Facebook Messenger, Twitter-Profile, WhatsApp, E-Mails usw. als Kanäle. Wenn Sie einen benutzerdefinierten Kanal erstellen möchten, können Sie ihn mithilfe des API-Kanals erstellen. Wählen Sie zunächst einen der folgenden Kanäle aus." }, "AGENTS": { "TITLE": "Agenten", @@ -339,7 +362,7 @@ "API": { "SUCCESS_MESSAGE": "Posteingangseinstellungen erfolgreich aktualisiert", "AUTO_ASSIGNMENT_SUCCESS_MESSAGE": "Automatische Zuordnung erfolgreich aktualisiert", - "ERROR_MESSAGE": "Widget-Farbe konnte nicht aktualisiert werden. Bitte versuchen Sie es später noch einmal." + "ERROR_MESSAGE": "Die Posteingangseinstellungen konnten nicht aktualisiert werden. Bitte versuchen Sie es später erneut." }, "EMAIL_COLLECT_BOX": { "ENABLED": "Aktiviert", @@ -412,15 +435,22 @@ "INBOX_UPDATE_SUB_TEXT": "Posteingangseinstellungen aktualisieren", "AUTO_ASSIGNMENT_SUB_TEXT": "Aktivieren oder deaktivieren Sie die automatische Zuweisung verfügbarer Agenten für neue Konversationen", "HMAC_VERIFICATION": "Benutzeridentitätsüberprüfung", - "HMAC_DESCRIPTION": "Um die Benutzer-Identität zu validieren, kann via SDK einen `identity_hash` für jeden Benutzer übergeben werden. Ein Hash kann mithilfe des SH256-Verfahrens mithilfe des nachfolgenden Schlüssels generiert werden.", + "HMAC_DESCRIPTION": "Um die Identität des Benutzers zu validieren, können Sie für jeden Benutzer einen `identifier_hash` übergeben. Sie können einen HMAC sha256-Hash generieren, indem Sie den 'Bezeichner' mit dem hier gezeigten Schlüssel verwenden.", "HMAC_MANDATORY_VERIFICATION": "Erzwinge Benutzer-Identitätsüberprüfung", - "HMAC_MANDATORY_DESCRIPTION": "Wenn aktiviert, funktioniert die setUser Methode der Chatwoot SDK nur, wenn ein `identifier_hash` für jeden Benutzer mitgeliefert wird.", + "HMAC_MANDATORY_DESCRIPTION": "Wenn aktiviert, werden Anfragen, denen der `identifier_hash` fehlt, abgelehnt.", "INBOX_IDENTIFIER": "Identifizierung für Posteingang", "INBOX_IDENTIFIER_SUB_TEXT": "Verwenden Sie den hier angezeigten `inbox_identifier`-Token zur Authentifizierung Ihrer API-Clients.", "FORWARD_EMAIL_TITLE": "Weiterleitung an E-Mail", "FORWARD_EMAIL_SUB_TEXT": "Starten Sie die Weiterleitung Ihrer E-Mails an die folgende E-Mail-Adresse.", "ALLOW_MESSAGES_AFTER_RESOLVED": "Nachrichten zulassen, nachdem die Konversation gelöst wurde", - "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Den Endbenutzern erlauben, Nachrichten zu versenden, auch wenn die Unterhaltung abgeschlossen ist." + "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Den Endbenutzern erlauben, Nachrichten zu versenden, auch wenn die Unterhaltung abgeschlossen ist.", + "WHATSAPP_SECTION_SUBHEADER": "Dieser API Key wird für die Integration mit den WhatsApp APIs verwendet.", + "WHATSAPP_SECTION_TITLE": "API-Schlüssel" + }, + "AUTO_ASSIGNMENT": { + "MAX_ASSIGNMENT_LIMIT": "Limit für automatische Zuweisung", + "MAX_ASSIGNMENT_LIMIT_RANGE_ERROR": "Bitte geben Sie einen Wert größer als 0 ein", + "MAX_ASSIGNMENT_LIMIT_SUB_TEXT": "Beschränken Sie die maximale Anzahl von Konversationen aus diesem Posteingang, die einem Agenten automatisch zugewiesen werden können" }, "FACEBOOK_REAUTHORIZE": { "TITLE": "Neu autorisieren", diff --git a/app/javascript/dashboard/i18n/locale/de/report.json b/app/javascript/dashboard/i18n/locale/de/report.json index 78328b540..695f29093 100644 --- a/app/javascript/dashboard/i18n/locale/de/report.json +++ b/app/javascript/dashboard/i18n/locale/de/report.json @@ -65,6 +65,7 @@ "PLACEHOLDER": "Zeitraum auswählen" }, "GROUP_BY_FILTER_DROPDOWN_LABEL": "Gruppieren nach", + "DURATION_FILTER_LABEL": "Dauer", "GROUP_BY_DAY_OPTIONS": [ { "id": 1, diff --git a/app/javascript/dashboard/i18n/locale/el/bulkActions.json b/app/javascript/dashboard/i18n/locale/el/bulkActions.json index ff508a70b..acf4a2d10 100644 --- a/app/javascript/dashboard/i18n/locale/el/bulkActions.json +++ b/app/javascript/dashboard/i18n/locale/el/bulkActions.json @@ -1,17 +1,29 @@ { - "BULK_ACTION": { - "CONVERSATIONS_SELECTED": "%{conversationCount} σινομιλίες επιλέχθηκαν", - "AGENT_SELECT_LABEL": "Επιλογή πράκτορα", - "ASSIGN_CONFIRMATION_LABEL": "Είσαστε σίγουροι ότι θέλετε να αντιστοιχίσετε %{conversationCount} %{conversationLabel} στον", - "GO_BACK_LABEL": "Πίσω", - "ASSIGN_LABEL": "Αντιστοίχιση", - "ASSIGN_AGENT_TOOLTIP": "Ανάθεση σε πράκτορα", - "RESOLVE_TOOLTIP": "Επίλυση", - "ASSIGN_SUCCESFUL": "Οι σινομιλίες αντιστοιχήθηκαν επιτυχώς", - "ASSIGN_FAILED": "Αποτυχία στην αντιστοίχιση σινομιλιών, παρακαλώ δοκιμάστε αργότερα", - "RESOLVE_SUCCESFUL": "Οι σινομιλίες επιλύθηκαν επιτυχώς", - "RESOLVE_FAILED": "Αποτυχία στην αντιστοίχιση σινομιλιών, παρακαλώ δοκιμάστε αργότερα", - "ALL_CONVERSATIONS_SELECTED_ALERT": "Επιλέχθηκαν μόνο οι σινομιλίες που φαίνονται στην σελίδα.", - "AGENT_LIST_LOADING": "Φόρτωση πρακτόρων" + "BULK_ACTION": { + "CONVERSATIONS_SELECTED": "%{conversationCount} σινομιλίες επιλέχθηκαν", + "AGENT_SELECT_LABEL": "Επιλογή πράκτορα", + "ASSIGN_CONFIRMATION_LABEL": "Είσαστε σίγουροι ότι θέλετε να αντιστοιχίσετε %{conversationCount} %{conversationLabel} στον", + "GO_BACK_LABEL": "Πίσω", + "ASSIGN_LABEL": "Αντιστοίχιση", + "ASSIGN_AGENT_TOOLTIP": "Ανάθεση σε πράκτορα", + "ASSIGN_SUCCESFUL": "Οι σινομιλίες αντιστοιχήθηκαν επιτυχώς", + "ASSIGN_FAILED": "Αποτυχία στην αντιστοίχιση σινομιλιών, παρακαλώ δοκιμάστε αργότερα", + "RESOLVE_SUCCESFUL": "Οι σινομιλίες επιλύθηκαν επιτυχώς", + "RESOLVE_FAILED": "Αποτυχία στην αντιστοίχιση σινομιλιών, παρακαλώ δοκιμάστε αργότερα", + "ALL_CONVERSATIONS_SELECTED_ALERT": "Επιλέχθηκαν μόνο οι σινομιλίες που φαίνονται στην σελίδα.", + "AGENT_LIST_LOADING": "Φόρτωση πρακτόρων", + "UPDATE": { + "CHANGE_STATUS": "Αλλαγή κατάστασης", + "SNOOZE_UNTIL_NEXT_REPLY": "Αναβολή έως την επόμενη απάντηση", + "UPDATE_SUCCESFUL": "Η κατάσταση συνομιλίας ενημερώθηκε με επιτυχία.", + "UPDATE_FAILED": "Αποτυχία ενημέρωσης συνομιλιών, παρακαλώ προσπαθήστε ξανά" + }, + "LABELS": { + "ASSIGN_LABELS": "Ανάθεση Ετικετών", + "NO_LABELS_FOUND": "Δεν βρέθηκαν πρότυπα για", + "ASSIGN_SELECTED_LABELS": "Ανάθεση επιλεγμένων ετικετών", + "ASSIGN_SUCCESFUL": "Επιτυχής ανάθεση ετικετών", + "ASSIGN_FAILED": "Αποτυχία στην ανάθεση ετικετών, παρακαλώ δοκιμάστε αργότερα" } + } } diff --git a/app/javascript/dashboard/i18n/locale/el/contact.json b/app/javascript/dashboard/i18n/locale/el/contact.json index 6e612edc1..026802662 100644 --- a/app/javascript/dashboard/i18n/locale/el/contact.json +++ b/app/javascript/dashboard/i18n/locale/el/contact.json @@ -111,7 +111,8 @@ "EMAIL_ADDRESS": { "PLACEHOLDER": "Εισάγετε την διεύθυνση email της επαφής", "LABEL": "Διεύθυνση Email", - "DUPLICATE": "Η διεύθυνση email είναι σε χρήση από άλλη επαφή." + "DUPLICATE": "Η διεύθυνση email είναι σε χρήση από άλλη επαφή.", + "ERROR": "Παρακαλώ εισάγετε μια έγκυρη διεύθυνση email." }, "PHONE_NUMBER": { "PLACEHOLDER": "Εισάγετε τον αριθμό τηλεφώνου της επαφής", diff --git a/app/javascript/dashboard/i18n/locale/el/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/el/inboxMgmt.json index b23400d4e..6e42be8d5 100644 --- a/app/javascript/dashboard/i18n/locale/el/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/el/inboxMgmt.json @@ -30,7 +30,8 @@ "ADD": { "CHANNEL_NAME": { "LABEL": "Όνομα Κιβωτίου", - "PLACEHOLDER": "Συμπληρώστε την ονομασία του κιβωτίου σας (π. χ: Ελληνικό Μεσογειακό Πανεπιστήμιο)" + "PLACEHOLDER": "Συμπληρώστε την ονομασία του κιβωτίου σας (π. χ: Ελληνικό Μεσογειακό Πανεπιστήμιο)", + "ERROR": "Παρακαλώ εισάγετε έγκυρο όνομα εισερχόμενων" }, "WEBSITE_NAME": { "LABEL": "Όνομα Ιστοσελίδας", @@ -82,7 +83,7 @@ }, "CHANNEL_GREETING_TOGGLE": { "LABEL": "Ενεργοποίηση καλωσορίσματος", - "HELP_TEXT": "Στείλτε ένα χαιρετισμό μήνυμα στους χρήστες που ξεκινούν τη συνομιλία.", + "HELP_TEXT": "Αυτόματη αποστολή χαιρετισμού όταν δημιουργείται μια νέα συνομιλία.", "ENABLED": "Ενεργό", "DISABLED": "Ανενεργό" }, @@ -97,7 +98,10 @@ "LABEL": "Χρώμα Widget", "PLACEHOLDER": "Ενημερώστε το χρώμα του 'widget' που θα εμφανίζεται στους χρήστες" }, - "SUBMIT_BUTTON": "Δημιουργία Κιβωτίου" + "SUBMIT_BUTTON": "Δημιουργία Κιβωτίου", + "API": { + "ERROR_MESSAGE": "Δεν ήμασταν σε θέση να δημιουργήσουμε κανάλι ιστοσελίδας, παρακαλώ προσπαθήστε ξανά" + } }, "TWILIO": { "TITLE": "Κανάλι Twilio SMS/Whatsapp", @@ -193,6 +197,7 @@ "PROVIDERS": { "LABEL": "API Provider", "TWILIO": "Twilio", + "WHATSAPP_CLOUD": "WhatsApp Cloud", "360_DIALOG": "Διάλογος 360" }, "INBOX_NAME": { @@ -205,13 +210,31 @@ "PLACEHOLDER": "Παρακαλώ εισάγετε έναν αριθμό τηλεφώνου από τον οποίο θα σταλεί το μήνυμα.", "ERROR": "Παρακαλώ καταχωρήστε μια έγκυρη τιμή. Ο αριθμός του τηλεφώνου πρέπει να ξεκινά με το σύμβολο `+`." }, + "PHONE_NUMBER_ID": { + "LABEL": "Phone number ID", + "PLACEHOLDER": "Please enter the Phone number ID obtained from Facebook developer dashboard.", + "ERROR": "Παρακαλώ εισάγετε μια έγκυρη τιμή." + }, + "BUSINESS_ACCOUNT_ID": { + "LABEL": "Business Account ID", + "PLACEHOLDER": "Please enter the Business Account ID obtained from Facebook developer dashboard.", + "ERROR": "Παρακαλώ εισάγετε μια έγκυρη τιμή." + }, + "WEBHOOK_VERIFY_TOKEN": { + "LABEL": "Webhook Verify Token", + "PLACEHOLDER": "Enter a verify token which you want to configure for facebook webhooks.", + "ERROR": "Παρακαλώ εισάγετε μια έγκυρη τιμή." + }, "API_KEY": { "LABEL": "API κλειδί", "SUBTITLE": "Ρυθμίστε το κλειδί WhatsApp API.", "PLACEHOLDER": "API κλειδί", - "APPLY_FOR_ACCESS": "Δεν έχετε κανένα κλειδί API? Αίτηση για πρόσβαση εδώ", "ERROR": "Παρακαλώ εισάγετε μια έγκυρη τιμή." }, + "API_CALLBACK": { + "TITLE": "URL επανάκλησης", + "SUBTITLE": "You have to configure the webhook URL in facebook developer portal with the URL mentioned here." + }, "SUBMIT_BUTTON": "Δημιουργία Καναλιού WhatsApp", "API": { "ERROR_MESSAGE": "Δεν ήμασταν σε θέση να αποθηκεύσουμε το κανάλι WhatsApp" @@ -298,7 +321,7 @@ }, "AUTH": { "TITLE": "Επιλογή Καναλιού", - "DESC": "Το Chatwoot υποστηρίζει widget live-chat, σελίδα Facebook, προφίλ Twitter, Whatsapp, Email κλπ., ως κανάλια. Αν θέλετε να δημιουργήσετε ένα προσαρμοσμένο κανάλι, μπορείτε να το δημιουργήσετε χρησιμοποιώντας το κανάλι API. Επιλέξτε ένα κανάλι από τις παρακάτω επιλογές για να συνεχίσετε." + "DESC": "Chatwoot supports live-chat widgets, Facebook Messenger, Twitter profiles, WhatsApp, Emails, etc., as channels. If you want to build a custom channel, you can create it using the API channel. To get started, choose one of the channels below." }, "AGENTS": { "TITLE": "Πράκτορες", @@ -339,7 +362,7 @@ "API": { "SUCCESS_MESSAGE": "Οι ρυθμίσεις του κιβωτίου ενημερώθηκαν", "AUTO_ASSIGNMENT_SUCCESS_MESSAGE": "Η αυτόματη αντιστοίχιση ενημερώθηκε επιτυχώς", - "ERROR_MESSAGE": "Δεν μπορεί να ενημερωθεί το χρώμα του widget. Παρακαλώ προσπαθήστε αργότερα." + "ERROR_MESSAGE": "Δεν μπορέσαμε να ενημερώσουμε τις ρυθμίσεις εισερχομένων. Παρακαλώ δοκιμάστε ξανά αργότερα." }, "EMAIL_COLLECT_BOX": { "ENABLED": "Ενεργό", @@ -412,15 +435,22 @@ "INBOX_UPDATE_SUB_TEXT": "Ενημερώστε τις ρυθμίσεις του κιβωτίου σας", "AUTO_ASSIGNMENT_SUB_TEXT": "Ενεργοποιήστε ή απενεργοποιήστε την αυτόματη αντιστοίχιση των νέων συζητήσεων στους πράκτορες αυτού του κιβωτίου.", "HMAC_VERIFICATION": "Επικύρωση Ταυτότητας Χρήστη", - "HMAC_DESCRIPTION": "Για λόγους επικύρωσης της ταυτότητας των χρηστών, το SDK σας επιτρέπει να περάσετε ένα `identity_hash` για κάθε χρήστη. Μπορείτε να δημιουργήσετε HMAC χρησιμοποιώντας το 'sha256' με το κλειδί που εμφανίζεται εδώ.", + "HMAC_DESCRIPTION": "In order to validate the user's identity, you can pass an `identifier_hash` for each user. You can generate a HMAC sha256 hash using the `identifier` with the key shown here.", "HMAC_MANDATORY_VERIFICATION": "Επιβολή Επαλήθευσης Ταυτότητας Χρήστη", - "HMAC_MANDATORY_DESCRIPTION": "Αν ενεργοποιηθεί, η μέθοδος Chatwoot SDKs setUser δε θα λειτουργήσει παρά μόνο αν το `identifier_hash` παρέχεται για κάθε χρήστη.", + "HMAC_MANDATORY_DESCRIPTION": "If enabled, requests missing the `identifier_hash` will be rejected.", "INBOX_IDENTIFIER": "Αναγνωριστικό Εισερχόμενων", "INBOX_IDENTIFIER_SUB_TEXT": "Χρησιμοποιήστε το διακριτικό `inbox_identifier` που εμφανίζεται εδώ για τον έλεγχο ταυτότητας των πελατών API.", "FORWARD_EMAIL_TITLE": "Προώθηση στο email", "FORWARD_EMAIL_SUB_TEXT": "Προώθηση των email σας στην ακόλουθη διεύθυνση email.", "ALLOW_MESSAGES_AFTER_RESOLVED": "Επιτρέψτε τα μηνύματα μετά την επίλυση της συνομιλίας", - "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Επιτρέψτε στους τελικούς χρήστες να στέλνουν μηνύματα ακόμη και μετά την επίλυση της συζήτησης." + "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Επιτρέψτε στους τελικούς χρήστες να στέλνουν μηνύματα ακόμη και μετά την επίλυση της συζήτησης.", + "WHATSAPP_SECTION_SUBHEADER": "This API Key is used for the integration with the WhatsApp APIs.", + "WHATSAPP_SECTION_TITLE": "Κλειδί API" + }, + "AUTO_ASSIGNMENT": { + "MAX_ASSIGNMENT_LIMIT": "Αυτόματο όριο ανάθεσης", + "MAX_ASSIGNMENT_LIMIT_RANGE_ERROR": "Παρακαλώ εισάγετε μια τιμή μεγαλύτερη από 0", + "MAX_ASSIGNMENT_LIMIT_SUB_TEXT": "Περιορισμός του μέγιστου αριθμού συνομιλιών από αυτά τα εισερχόμενα που μπορούν να εκχωρηθούν αυτόματα σε έναν πράκτορα" }, "FACEBOOK_REAUTHORIZE": { "TITLE": "Εκ νέου εξουσιοδότηση", diff --git a/app/javascript/dashboard/i18n/locale/el/report.json b/app/javascript/dashboard/i18n/locale/el/report.json index f0ad7ad88..788956e43 100644 --- a/app/javascript/dashboard/i18n/locale/el/report.json +++ b/app/javascript/dashboard/i18n/locale/el/report.json @@ -65,6 +65,7 @@ "PLACEHOLDER": "Επιλέξτε εύρος ημερομηνιών" }, "GROUP_BY_FILTER_DROPDOWN_LABEL": "Ομαδοποίηση Κατά", + "DURATION_FILTER_LABEL": "Διάρκεια", "GROUP_BY_DAY_OPTIONS": [ { "id": 1, diff --git a/app/javascript/dashboard/i18n/locale/el/whatsappTemplates.json b/app/javascript/dashboard/i18n/locale/el/whatsappTemplates.json index bbcf28156..b9ac424e2 100644 --- a/app/javascript/dashboard/i18n/locale/el/whatsappTemplates.json +++ b/app/javascript/dashboard/i18n/locale/el/whatsappTemplates.json @@ -1,25 +1,25 @@ { "WHATSAPP_TEMPLATES": { "MODAL": { - "TITLE": "Whatsapp Templates", - "SUBTITLE": "Select the whatsapp template you want to send", - "TEMPLATE_SELECTED_SUBTITLE": "Process %{templateName}" + "TITLE": "Πρότυπα Whatsapp", + "SUBTITLE": "Επιλέξτε το πρότυπο Whatsapp που θέλετε να στείλετε", + "TEMPLATE_SELECTED_SUBTITLE": "Επεξεργασία %{templateName}" }, "PICKER": { - "SEARCH_PLACEHOLDER": "Search Templates", - "NO_TEMPLATES_FOUND": "No templates found for", + "SEARCH_PLACEHOLDER": "Αναζήτηση Προτύπων", + "NO_TEMPLATES_FOUND": "Δεν βρέθηκαν πρότυπα για", "LABELS": { - "LANGUAGE": "Language", - "TEMPLATE_BODY": "Template Body", - "CATEGORY": "Category" + "LANGUAGE": "Γλώσσα", + "TEMPLATE_BODY": "Σώμα Προτύπου", + "CATEGORY": "Κατηγορία" } }, "PARSER": { - "VARIABLES_LABEL": "Variables", - "VARIABLE_PLACEHOLDER": "Enter %{variable} value", - "GO_BACK_LABEL": "Go Back", - "SEND_MESSAGE_LABEL": "Send Message", - "FORM_ERROR_MESSAGE": "Please fill all variables before sending" + "VARIABLES_LABEL": "Μεταβλητές", + "VARIABLE_PLACEHOLDER": "Εισάγετε τιμή για %{variable}", + "GO_BACK_LABEL": "Πίσω", + "SEND_MESSAGE_LABEL": "Αποστολή μηνύματος", + "FORM_ERROR_MESSAGE": "Παρακαλώ συμπληρώστε όλες τις μεταβλητές πριν την αποστολή" } } } diff --git a/app/javascript/dashboard/i18n/locale/es/advancedFilters.json b/app/javascript/dashboard/i18n/locale/es/advancedFilters.json index bbe86dec7..113e4aa37 100644 --- a/app/javascript/dashboard/i18n/locale/es/advancedFilters.json +++ b/app/javascript/dashboard/i18n/locale/es/advancedFilters.json @@ -1,7 +1,7 @@ { "FILTER": { "TITLE": "Filtrar Conversaciones", - "SUBTITLE": "Añada filtros a continuación y pulse 'Aplicar filtros' para las conversaciones de filtro.", + "SUBTITLE": "Añada filtros a continuación y pulse 'Enviar' para filtrar conversaciones.", "ADD_NEW_FILTER": "Añadir Filtro", "FILTER_DELETE_ERROR": "Debes tener al menos un filtro para guardar", "SUBMIT_BUTTON_LABEL": "Aplicar filtros", diff --git a/app/javascript/dashboard/i18n/locale/es/bulkActions.json b/app/javascript/dashboard/i18n/locale/es/bulkActions.json index 28f1ba533..fd8a1448b 100644 --- a/app/javascript/dashboard/i18n/locale/es/bulkActions.json +++ b/app/javascript/dashboard/i18n/locale/es/bulkActions.json @@ -1,17 +1,29 @@ { - "BULK_ACTION": { - "CONVERSATIONS_SELECTED": "%{conversationCount} conversaciones seleccionadas", - "AGENT_SELECT_LABEL": "Seleccionar agente", - "ASSIGN_CONFIRMATION_LABEL": "¿Está seguro que desea asignar %{conversationCount} %{conversationLabel} a", - "GO_BACK_LABEL": "Volver", - "ASSIGN_LABEL": "Asignar", - "ASSIGN_AGENT_TOOLTIP": "Asignar agente", - "RESOLVE_TOOLTIP": "Resolver", - "ASSIGN_SUCCESFUL": "Conversaciones asignadas con éxito", - "ASSIGN_FAILED": "Error al asignar conversaciones, inténtelo de nuevo", - "RESOLVE_SUCCESFUL": "Conversaciones resueltas con éxito", - "RESOLVE_FAILED": "Error al resolver las conversaciones, inténtelo de nuevo", - "ALL_CONVERSATIONS_SELECTED_ALERT": "Las conversaciones visibles en esta página sólo están seleccionadas.", - "AGENT_LIST_LOADING": "Cargando agentes" + "BULK_ACTION": { + "CONVERSATIONS_SELECTED": "%{conversationCount} conversaciones seleccionadas", + "AGENT_SELECT_LABEL": "Seleccionar agente", + "ASSIGN_CONFIRMATION_LABEL": "¿Está seguro que desea asignar %{conversationCount} %{conversationLabel} a", + "GO_BACK_LABEL": "Volver", + "ASSIGN_LABEL": "Asignar", + "ASSIGN_AGENT_TOOLTIP": "Asignar agente", + "ASSIGN_SUCCESFUL": "Conversaciones asignadas con éxito", + "ASSIGN_FAILED": "Error al asignar conversaciones, inténtelo de nuevo", + "RESOLVE_SUCCESFUL": "Conversaciones resueltas con éxito", + "RESOLVE_FAILED": "Error al resolver las conversaciones, inténtelo de nuevo", + "ALL_CONVERSATIONS_SELECTED_ALERT": "Las conversaciones visibles en esta página sólo están seleccionadas.", + "AGENT_LIST_LOADING": "Cargando agentes", + "UPDATE": { + "CHANGE_STATUS": "Cambiar estado", + "SNOOZE_UNTIL_NEXT_REPLY": "Posponer hasta la próxima respuesta", + "UPDATE_SUCCESFUL": "El estado de la conversación se actualizó con éxito.", + "UPDATE_FAILED": "No se han podido actualizar las conversaciones. Inténtalo de nuevo." + }, + "LABELS": { + "ASSIGN_LABELS": "Asignar etiquetas", + "NO_LABELS_FOUND": "No se encontraron etiquetas para", + "ASSIGN_SELECTED_LABELS": "Asignar etiquetas seleccionadas", + "ASSIGN_SUCCESFUL": "Etiquetas asignadas correctamente", + "ASSIGN_FAILED": "Error al asignar etiquetas, inténtalo de nuevo" } + } } diff --git a/app/javascript/dashboard/i18n/locale/es/contact.json b/app/javascript/dashboard/i18n/locale/es/contact.json index 992111d3b..0e7faafec 100644 --- a/app/javascript/dashboard/i18n/locale/es/contact.json +++ b/app/javascript/dashboard/i18n/locale/es/contact.json @@ -111,7 +111,8 @@ "EMAIL_ADDRESS": { "PLACEHOLDER": "Escriba la dirección email del contacto", "LABEL": "Dirección de correo", - "DUPLICATE": "Ésta dirección de correo está siendo utilizada por otro contacto." + "DUPLICATE": "Ésta dirección de correo está siendo utilizada por otro contacto.", + "ERROR": "Por favor, introduzca una dirección de correo válida." }, "PHONE_NUMBER": { "PLACEHOLDER": "Escriba el número de teléfono del contacto", diff --git a/app/javascript/dashboard/i18n/locale/es/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/es/inboxMgmt.json index 044fb4072..5226ff734 100644 --- a/app/javascript/dashboard/i18n/locale/es/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/es/inboxMgmt.json @@ -30,7 +30,8 @@ "ADD": { "CHANNEL_NAME": { "LABEL": "Nombre de la bandeja de entrada", - "PLACEHOLDER": "Introduzca el nombre de la bandeja de entrada (por ejemplo: Acme Inc)" + "PLACEHOLDER": "Introduzca el nombre de la bandeja de entrada (por ejemplo: Acme Inc)", + "ERROR": "Please enter a valid inbox name" }, "WEBSITE_NAME": { "LABEL": "Nombre del sitio web", @@ -82,7 +83,7 @@ }, "CHANNEL_GREETING_TOGGLE": { "LABEL": "Habilitar bienvenida al canal", - "HELP_TEXT": "Enviar un mensaje de bienvenida al usuario cuando inicie la conversación.", + "HELP_TEXT": "Envía automáticamente un mensaje de saludo cuando se crea una nueva conversación.", "ENABLED": "Activado", "DISABLED": "Deshabilitado" }, @@ -97,7 +98,10 @@ "LABEL": "Color del widget", "PLACEHOLDER": "Actualizar el color del widget usado en el widget" }, - "SUBMIT_BUTTON": "Crear bandeja de entrada" + "SUBMIT_BUTTON": "Crear bandeja de entrada", + "API": { + "ERROR_MESSAGE": "We were not able to create a website channel, please try again" + } }, "TWILIO": { "TITLE": "Canal Twilio SMS/WhatsApp", @@ -193,6 +197,7 @@ "PROVIDERS": { "LABEL": "Proveedor de API", "TWILIO": "Twilio", + "WHATSAPP_CLOUD": "WhatsApp Cloud", "360_DIALOG": "360 Diálogo" }, "INBOX_NAME": { @@ -205,13 +210,31 @@ "PLACEHOLDER": "Por favor, introduzca el número de teléfono desde el que se enviará el mensaje.", "ERROR": "Por favor, introduzca un valor válido. El número de teléfono debe comenzar con la firma `+`." }, + "PHONE_NUMBER_ID": { + "LABEL": "Phone number ID", + "PLACEHOLDER": "Please enter the Phone number ID obtained from Facebook developer dashboard.", + "ERROR": "Por favor, introduzca un valor válido." + }, + "BUSINESS_ACCOUNT_ID": { + "LABEL": "Business Account ID", + "PLACEHOLDER": "Please enter the Business Account ID obtained from Facebook developer dashboard.", + "ERROR": "Por favor, introduzca un valor válido." + }, + "WEBHOOK_VERIFY_TOKEN": { + "LABEL": "Webhook Verify Token", + "PLACEHOLDER": "Enter a verify token which you want to configure for facebook webhooks.", + "ERROR": "Por favor, introduzca un valor válido." + }, "API_KEY": { "LABEL": "Clave de API", "SUBTITLE": "Configurar la clave API de WhatsApp.", "PLACEHOLDER": "Clave de API", - "APPLY_FOR_ACCESS": "¿No tiene ninguna clave API? Solicite acceso aquí", "ERROR": "Por favor, introduzca un valor válido." }, + "API_CALLBACK": { + "TITLE": "URL de devolución de llamada", + "SUBTITLE": "You have to configure the webhook URL in facebook developer portal with the URL mentioned here." + }, "SUBMIT_BUTTON": "Crear canal de WhatsApp", "API": { "ERROR_MESSAGE": "No pudimos guardar el canal de WhatsApp" @@ -298,7 +321,7 @@ }, "AUTH": { "TITLE": "Elija un canal", - "DESC": "Chatwoot soporta widget, página de Facebook, perfil de Twitter, WhatsApp, correo electrónico, etc. como canales. Si quieres crear un canal personalizado, puedes crearlo utilizando el canal API. Selecciona un canal de las opciones de abajo para continuar." + "DESC": "Chatwoot supports live-chat widgets, Facebook Messenger, Twitter profiles, WhatsApp, Emails, etc., as channels. If you want to build a custom channel, you can create it using the API channel. To get started, choose one of the channels below." }, "AGENTS": { "TITLE": "Agentes", @@ -339,7 +362,7 @@ "API": { "SUCCESS_MESSAGE": "Configuración de bandeja de entrada actualizada correctamente", "AUTO_ASSIGNMENT_SUCCESS_MESSAGE": "Auto-asignación actualizada correctamente", - "ERROR_MESSAGE": "No se pudo actualizar el color del widget. Inténtalo de nuevo más tarde." + "ERROR_MESSAGE": "We couldn't update inbox settings. Please try again later." }, "EMAIL_COLLECT_BOX": { "ENABLED": "Activado", @@ -412,15 +435,22 @@ "INBOX_UPDATE_SUB_TEXT": "Actualizar la configuración de tu bandeja de entrada", "AUTO_ASSIGNMENT_SUB_TEXT": "Activar o desactivar la asignación automática de nuevas conversaciones a los agentes añadidos a esta bandeja de entrada.", "HMAC_VERIFICATION": "Validación de identidad de usuario", - "HMAC_DESCRIPTION": "Con el fin de validar la identidad de los usuarios, el SDK le permite pasar un `identity_hash` por cada usuario. Puede generar HMAC usando 'sha256' con la clave que se muestra aquí.", + "HMAC_DESCRIPTION": "In order to validate the user's identity, you can pass an `identifier_hash` for each user. You can generate a HMAC sha256 hash using the `identifier` with the key shown here.", "HMAC_MANDATORY_VERIFICATION": "Forzar validación de identidad de usuario", - "HMAC_MANDATORY_DESCRIPTION": "Si está activado, el método setUser de SDKs de Chatwoot no funcionará a menos que se proporcione el `identifier_hash` para cada usuario.", + "HMAC_MANDATORY_DESCRIPTION": "If enabled, requests missing the `identifier_hash` will be rejected.", "INBOX_IDENTIFIER": "Identificador de bandeja de entrada", "INBOX_IDENTIFIER_SUB_TEXT": "Usa el token `inbox_identifier` que se muestra aquí para autenticar tus clientes API.", "FORWARD_EMAIL_TITLE": "Reenviar al correo", "FORWARD_EMAIL_SUB_TEXT": "Empieze a reenviar su emails a la siguiente dirección de email.", "ALLOW_MESSAGES_AFTER_RESOLVED": "Permitir mensajes después de la conversación resuelta", - "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Permitir a los usuarios finales enviar mensajes incluso después de que la conversación sea resuelta." + "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Permitir a los usuarios finales enviar mensajes incluso después de que la conversación sea resuelta.", + "WHATSAPP_SECTION_SUBHEADER": "This API Key is used for the integration with the WhatsApp APIs.", + "WHATSAPP_SECTION_TITLE": "Clave de API" + }, + "AUTO_ASSIGNMENT": { + "MAX_ASSIGNMENT_LIMIT": "Límite de asignación automática", + "MAX_ASSIGNMENT_LIMIT_RANGE_ERROR": "Por favor ingrese un valor mayor a 0", + "MAX_ASSIGNMENT_LIMIT_SUB_TEXT": "Limite la cantidad máxima de conversaciones de esta bandeja de entrada que se pueden asignar automáticamente a un agente" }, "FACEBOOK_REAUTHORIZE": { "TITLE": "Reautorizar", diff --git a/app/javascript/dashboard/i18n/locale/es/report.json b/app/javascript/dashboard/i18n/locale/es/report.json index 81051a66f..af1f16891 100644 --- a/app/javascript/dashboard/i18n/locale/es/report.json +++ b/app/javascript/dashboard/i18n/locale/es/report.json @@ -65,6 +65,7 @@ "PLACEHOLDER": "Seleccione rango de fechas" }, "GROUP_BY_FILTER_DROPDOWN_LABEL": "Agrupar por", + "DURATION_FILTER_LABEL": "Duración", "GROUP_BY_DAY_OPTIONS": [ { "id": 1, diff --git a/app/javascript/dashboard/i18n/locale/fa/bulkActions.json b/app/javascript/dashboard/i18n/locale/fa/bulkActions.json index 68bfd5e47..c9ad83919 100644 --- a/app/javascript/dashboard/i18n/locale/fa/bulkActions.json +++ b/app/javascript/dashboard/i18n/locale/fa/bulkActions.json @@ -1,17 +1,29 @@ { - "BULK_ACTION": { - "CONVERSATIONS_SELECTED": "%{conversationCount} گفتگو انتخاب شده است", - "AGENT_SELECT_LABEL": "انتخاب ایجنت", - "ASSIGN_CONFIRMATION_LABEL": "Are you sure you want to assign %{conversationCount} %{conversationLabel} to", - "GO_BACK_LABEL": "بازگشت", - "ASSIGN_LABEL": "اختصاص دادن", - "ASSIGN_AGENT_TOOLTIP": "Assign Agent", - "RESOLVE_TOOLTIP": "حل شد", - "ASSIGN_SUCCESFUL": "گفتگو با موفقیت اختصاص داده شده", - "ASSIGN_FAILED": "گفتگو اختصاص داده نشد، لطفا دوباره امتحان کنید", - "RESOLVE_SUCCESFUL": "گفتگو با موفقیت حل شد", - "RESOLVE_FAILED": "گفتگو حل نشد، لطفا دوباره امتحان کنید", - "ALL_CONVERSATIONS_SELECTED_ALERT": "گفتگوهای قابل مشاهده در این صفحه فقط انتخاب می‌شوند.", - "AGENT_LIST_LOADING": "Loading Agents" + "BULK_ACTION": { + "CONVERSATIONS_SELECTED": "%{conversationCount} گفتگو انتخاب شده است", + "AGENT_SELECT_LABEL": "انتخاب ایجنت", + "ASSIGN_CONFIRMATION_LABEL": "Are you sure you want to assign %{conversationCount} %{conversationLabel} to", + "GO_BACK_LABEL": "بازگشت", + "ASSIGN_LABEL": "اختصاص دادن", + "ASSIGN_AGENT_TOOLTIP": "تعیین ایجنت", + "ASSIGN_SUCCESFUL": "گفتگو با موفقیت اختصاص داده شده", + "ASSIGN_FAILED": "گفتگو اختصاص داده نشد، لطفا دوباره امتحان کنید", + "RESOLVE_SUCCESFUL": "گفتگو با موفقیت حل شد", + "RESOLVE_FAILED": "گفتگو حل نشد، لطفا دوباره امتحان کنید", + "ALL_CONVERSATIONS_SELECTED_ALERT": "گفتگوهای قابل مشاهده در این صفحه فقط انتخاب می‌شوند.", + "AGENT_LIST_LOADING": "بارگذاری ایجنت", + "UPDATE": { + "CHANGE_STATUS": "تغییر وضعیت", + "SNOOZE_UNTIL_NEXT_REPLY": "تا پاسخ بعدی به تعویق بی‌افتد", + "UPDATE_SUCCESFUL": "وضعیت گفتگو با موفقیت به روز شد.", + "UPDATE_FAILED": "گفتگوها به روز نشد، لطفا دوباره امتحان کنید" + }, + "LABELS": { + "ASSIGN_LABELS": "اختصاص برچسب‌ها", + "NO_LABELS_FOUND": "هیچ برچسبی یافت نشد برای", + "ASSIGN_SELECTED_LABELS": "اختصاص برچسب‌های انتخاب شده", + "ASSIGN_SUCCESFUL": "برچسب‌ها با موفقیت اختصاص یافتند", + "ASSIGN_FAILED": "اختصاص برچسب‌ها به صورت موفق انجام نشد، لطفا دوباره امتحان کنید" } + } } diff --git a/app/javascript/dashboard/i18n/locale/fa/contact.json b/app/javascript/dashboard/i18n/locale/fa/contact.json index bd20d63b7..432e149fe 100644 --- a/app/javascript/dashboard/i18n/locale/fa/contact.json +++ b/app/javascript/dashboard/i18n/locale/fa/contact.json @@ -111,7 +111,8 @@ "EMAIL_ADDRESS": { "PLACEHOLDER": "آدرس ایمیل مخاطب را وارد کنید", "LABEL": "ایمیل", - "DUPLICATE": "این آدرس ایمیل برای مخاطب دیگری در حال استفاده است." + "DUPLICATE": "این آدرس ایمیل برای مخاطب دیگری در حال استفاده است.", + "ERROR": "لطفا ایمیل خود را به شکل صحیح وارد کنید." }, "PHONE_NUMBER": { "PLACEHOLDER": "شماره تلفن مخاطب را وارد کنید", diff --git a/app/javascript/dashboard/i18n/locale/fa/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/fa/inboxMgmt.json index 8cf0f8971..81b54ff77 100644 --- a/app/javascript/dashboard/i18n/locale/fa/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/fa/inboxMgmt.json @@ -30,7 +30,8 @@ "ADD": { "CHANNEL_NAME": { "LABEL": "عنوان صندوق ورودی", - "PLACEHOLDER": "نام صندوق ورودی خود را وارد کنید (به عنوان مثال: Acme Inc)" + "PLACEHOLDER": "نام صندوق ورودی خود را وارد کنید (به عنوان مثال: Acme Inc)", + "ERROR": "لطفاً یک نام صندوق ورودی معتبر وارد کنید" }, "WEBSITE_NAME": { "LABEL": "عنوان سایت", @@ -82,7 +83,7 @@ }, "CHANNEL_GREETING_TOGGLE": { "LABEL": "فعال کردن پیام پاسخگویی", - "HELP_TEXT": "هنگامی که کاربران گفتگو را شروع می‌کند، یک پیام تبریک ارسال کنید.", + "HELP_TEXT": "هنگامی که گفتگو جدیدی ایجاد می‌شود، به صورت خودکار پیام خوش‌آمد ارسال شود.", "ENABLED": "فعال شد", "DISABLED": "غیرفعال شد" }, @@ -97,7 +98,10 @@ "LABEL": "رنگ ویجت", "PLACEHOLDER": "رنگی که در ویجت استفاده می‌شود را تعیین کنید" }, - "SUBMIT_BUTTON": "ساختن صندوق ورودی" + "SUBMIT_BUTTON": "ساختن صندوق ورودی", + "API": { + "ERROR_MESSAGE": "ما نتوانستیم کانال وب‌سایت را ایجاد کنیم، لطفا دوباره امتحان کنید" + } }, "TWILIO": { "TITLE": "Twilio SMS/کانال WhatsApp", @@ -193,6 +197,7 @@ "PROVIDERS": { "LABEL": "ارائه دهنده API", "TWILIO": "Twilio", + "WHATSAPP_CLOUD": "واتس‌اپ ابری", "360_DIALOG": "360Dialog" }, "INBOX_NAME": { @@ -205,13 +210,31 @@ "PLACEHOLDER": "لطفا شماره‌ای که پیام‌ می‌بایست به آن ارسال شود را وارد کنید", "ERROR": "لطفا شماره تلفن را به شکل صحیح وارد کنید. شماره می‌بایست با کاراکتر `+` شروع شود" }, + "PHONE_NUMBER_ID": { + "LABEL": "شناسه شماره تلفن", + "PLACEHOLDER": "لطفا شناسه شماره تلفن دریافت شده از پيشخوان توسعه‌دهنده فیس‌بوک را وارد کنید.", + "ERROR": "لطفا یک مقدار معتبر وارد کنید." + }, + "BUSINESS_ACCOUNT_ID": { + "LABEL": "شناسه حساب تجاری", + "PLACEHOLDER": "لطفا شناسه حساب تجاری دریافت شده از پيشخوان توسعه‌دهنده فیس‌بوک را وارد کنید.", + "ERROR": "لطفا یک مقدار معتبر وارد کنید." + }, + "WEBHOOK_VERIFY_TOKEN": { + "LABEL": "Webhook Verify Token", + "PLACEHOLDER": "Enter a verify token which you want to configure for facebook webhooks.", + "ERROR": "لطفا یک مقدار معتبر وارد کنید." + }, "API_KEY": { "LABEL": "API key", "SUBTITLE": "WhatsApp API key را پیکربندی کنید.", "PLACEHOLDER": "API key", - "APPLY_FOR_ACCESS": "API key ندارید؟ برای دسترسی از اینجا درخواست دهید", "ERROR": "لطفا یک مقدار معتبر وارد کنید." }, + "API_CALLBACK": { + "TITLE": "آدرس URL مربوط به API", + "SUBTITLE": "You have to configure the webhook URL in facebook developer portal with the URL mentioned here." + }, "SUBMIT_BUTTON": "ایجاد کانال واتساپ", "API": { "ERROR_MESSAGE": "ما نتوانستیم کانال WhatsApp را ذخیره کنیم" @@ -298,7 +321,7 @@ }, "AUTH": { "TITLE": "کانالی را انتخاب کنید", - "DESC": "Chatwoot از ویجت چت زنده ، صفحه فیس بوک ، نمایه توییتر ، WhatsApp ، ایمیل و غیره به عنوان کانال پشتیبانی می کند. اگر می خواهید یک کانال سفارشی بسازید ، می توانید آن را با استفاده از کانال API ایجاد کنید. برای ادامه ، یک کانال را از بین گزینه های زیر انتخاب کنید." + "DESC": "Chatwoot supports live-chat widgets, Facebook Messenger, Twitter profiles, WhatsApp, Emails, etc., as channels. If you want to build a custom channel, you can create it using the API channel. To get started, choose one of the channels below." }, "AGENTS": { "TITLE": "ایجنت ها", @@ -339,7 +362,7 @@ "API": { "SUCCESS_MESSAGE": "تنظمیات صندوق ورودی اعمال شد", "AUTO_ASSIGNMENT_SUCCESS_MESSAGE": "واگذاری خودکار گفتگو به ایجنت ها تنظیم شد", - "ERROR_MESSAGE": "در حال حاضر امکان تغییر رنگ ویجت امکان‌پذیر نیست. لطفا بعدا امتحان کنید." + "ERROR_MESSAGE": "ما نمی‌توانیم تنظیمات صندوق ورودی را به‌روزرسانی کنیم. لطفا بعدا دوباره امتحان کنید." }, "EMAIL_COLLECT_BOX": { "ENABLED": "فعال", @@ -412,15 +435,22 @@ "INBOX_UPDATE_SUB_TEXT": "تغییر پارامترهای صندوق ورودی", "AUTO_ASSIGNMENT_SUB_TEXT": "فعال کردن یا غیرفعال کردن واگذاری خودکار گفتگوها به ایجنت های عضو این صندوق ورودی.", "HMAC_VERIFICATION": "اعتبار سنجی کاربر", - "HMAC_DESCRIPTION": "برای اعتبار سنجی کاربران با استفاده از این کلید `identifier_hash` یک هش HMAC sha256 تولید کنید.", + "HMAC_DESCRIPTION": "In order to validate the user's identity, you can pass an `identifier_hash` for each user. You can generate a HMAC sha256 hash using the `identifier` with the key shown here.", "HMAC_MANDATORY_VERIFICATION": "مجبور کردن تأیید اعتبار هویت کاربر", - "HMAC_MANDATORY_DESCRIPTION": "درصورت فعال بودن ، روش Chatwoot SDKs setUser کار نمی کند مگر اینکه `identifier_hash` برای هر کاربر ارائه شود.", + "HMAC_MANDATORY_DESCRIPTION": "If enabled, requests missing the `identifier_hash` will be rejected.", "INBOX_IDENTIFIER": "شناسه صندوق ورودی", "INBOX_IDENTIFIER_SUB_TEXT": "از رمز `inbox_identifier` که در اینجا نشان داده شده است برای احراز هویت کلاینت های API خود استفاده کنید.", "FORWARD_EMAIL_TITLE": "ارسال به ایمیل", "FORWARD_EMAIL_SUB_TEXT": "ایمیل های خود را به این آدرس ها فوروارد کنید.", "ALLOW_MESSAGES_AFTER_RESOLVED": "اجازه دادن به پیام ها پس از حل شدن مکالمه", - "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "به کاربران اجازه دهید حتی پس از حل شدن مکالمه پیام ارسال کنند." + "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "به کاربران اجازه دهید حتی پس از حل شدن مکالمه پیام ارسال کنند.", + "WHATSAPP_SECTION_SUBHEADER": "This API Key is used for the integration with the WhatsApp APIs.", + "WHATSAPP_SECTION_TITLE": "API key" + }, + "AUTO_ASSIGNMENT": { + "MAX_ASSIGNMENT_LIMIT": "محدودیت تخصیص خودکار", + "MAX_ASSIGNMENT_LIMIT_RANGE_ERROR": "لطفا مقداری بزرگ‌تر از عدد 0 وارد کنید", + "MAX_ASSIGNMENT_LIMIT_SUB_TEXT": "حداکثر تعداد مکالماتی را که می توان به طور خودکار به یک نماینده اختصاص داد، از این صندوق ورودی محدود کنید" }, "FACEBOOK_REAUTHORIZE": { "TITLE": "احراز هویت مجدد", diff --git a/app/javascript/dashboard/i18n/locale/fa/report.json b/app/javascript/dashboard/i18n/locale/fa/report.json index 5ef58f275..165e3ed7e 100644 --- a/app/javascript/dashboard/i18n/locale/fa/report.json +++ b/app/javascript/dashboard/i18n/locale/fa/report.json @@ -65,6 +65,7 @@ "PLACEHOLDER": "محدوده تاریخ را انتخاب کنید" }, "GROUP_BY_FILTER_DROPDOWN_LABEL": "دسته بندی بر اساس", + "DURATION_FILTER_LABEL": "مدت زمان", "GROUP_BY_DAY_OPTIONS": [ { "id": 1, diff --git a/app/javascript/dashboard/i18n/locale/fa/settings.json b/app/javascript/dashboard/i18n/locale/fa/settings.json index 26019a3a5..1130220f4 100644 --- a/app/javascript/dashboard/i18n/locale/fa/settings.json +++ b/app/javascript/dashboard/i18n/locale/fa/settings.json @@ -21,7 +21,7 @@ }, "MESSAGE_SIGNATURE_SECTION": { "TITLE": "امضای پیام شخصی", - "NOTE": "Create a personal message signature that would be added to all the messages you send from your email inbox. Use the rich content editor to create a highly personalised signature.", + "NOTE": "یک امضای پیام شخصی ایجاد کنید که به همه پیام‌هایی که از صندوق ورودی ایمیل ارسال می‌کنید اضافه شود. از ویرایشگر محتوای غنی برای ایجاد یک امضای بسیار شخصی استفاده کنید.", "BTN_TEXT": "ذخیره امضای پیام", "API_ERROR": "امضا ذخیره نشد! دوباره امتحان کنید", "API_SUCCESS": "امضا با موفقیت ذخیره شد" diff --git a/app/javascript/dashboard/i18n/locale/fa/whatsappTemplates.json b/app/javascript/dashboard/i18n/locale/fa/whatsappTemplates.json index bbcf28156..a20fe6767 100644 --- a/app/javascript/dashboard/i18n/locale/fa/whatsappTemplates.json +++ b/app/javascript/dashboard/i18n/locale/fa/whatsappTemplates.json @@ -9,17 +9,17 @@ "SEARCH_PLACEHOLDER": "Search Templates", "NO_TEMPLATES_FOUND": "No templates found for", "LABELS": { - "LANGUAGE": "Language", + "LANGUAGE": "زبان", "TEMPLATE_BODY": "Template Body", - "CATEGORY": "Category" + "CATEGORY": "دسته‌بندی" } }, "PARSER": { - "VARIABLES_LABEL": "Variables", - "VARIABLE_PLACEHOLDER": "Enter %{variable} value", - "GO_BACK_LABEL": "Go Back", - "SEND_MESSAGE_LABEL": "Send Message", - "FORM_ERROR_MESSAGE": "Please fill all variables before sending" + "VARIABLES_LABEL": "متغیرها", + "VARIABLE_PLACEHOLDER": "مقدار %{variable} را وارد کنید", + "GO_BACK_LABEL": "بازگشت", + "SEND_MESSAGE_LABEL": "ارسال پیام", + "FORM_ERROR_MESSAGE": "لطفا قبل از ارسال همه متغیرها را پر کنید" } } } diff --git a/app/javascript/dashboard/i18n/locale/fi/bulkActions.json b/app/javascript/dashboard/i18n/locale/fi/bulkActions.json index 19d129eb5..4fd2cb4a1 100644 --- a/app/javascript/dashboard/i18n/locale/fi/bulkActions.json +++ b/app/javascript/dashboard/i18n/locale/fi/bulkActions.json @@ -1,17 +1,29 @@ { - "BULK_ACTION": { - "CONVERSATIONS_SELECTED": "%{conversationCount} conversations selected", - "AGENT_SELECT_LABEL": "Valitse edustaja", - "ASSIGN_CONFIRMATION_LABEL": "Are you sure you want to assign %{conversationCount} %{conversationLabel} to", - "GO_BACK_LABEL": "Go back", - "ASSIGN_LABEL": "Delegoi", - "ASSIGN_AGENT_TOOLTIP": "Assign Agent", - "RESOLVE_TOOLTIP": "Ratkaise", - "ASSIGN_SUCCESFUL": "Conversations assigned successfully", - "ASSIGN_FAILED": "Failed to assign conversations, please try again", - "RESOLVE_SUCCESFUL": "Conversations resolved successfully", - "RESOLVE_FAILED": "Failed to resolve conversations, please try again", - "ALL_CONVERSATIONS_SELECTED_ALERT": "Conversations visible on this page are only selected.", - "AGENT_LIST_LOADING": "Loading Agents" + "BULK_ACTION": { + "CONVERSATIONS_SELECTED": "%{conversationCount} conversations selected", + "AGENT_SELECT_LABEL": "Valitse edustaja", + "ASSIGN_CONFIRMATION_LABEL": "Are you sure you want to assign %{conversationCount} %{conversationLabel} to", + "GO_BACK_LABEL": "Go back", + "ASSIGN_LABEL": "Delegoi", + "ASSIGN_AGENT_TOOLTIP": "Assign Agent", + "ASSIGN_SUCCESFUL": "Conversations assigned successfully", + "ASSIGN_FAILED": "Failed to assign conversations, please try again", + "RESOLVE_SUCCESFUL": "Conversations resolved successfully", + "RESOLVE_FAILED": "Failed to resolve conversations, please try again", + "ALL_CONVERSATIONS_SELECTED_ALERT": "Conversations visible on this page are only selected.", + "AGENT_LIST_LOADING": "Loading Agents", + "UPDATE": { + "CHANGE_STATUS": "Change status", + "SNOOZE_UNTIL_NEXT_REPLY": "Snooze until next reply", + "UPDATE_SUCCESFUL": "Conversation status updated successfully.", + "UPDATE_FAILED": "Failed to update conversations, please try again" + }, + "LABELS": { + "ASSIGN_LABELS": "Assign Labels", + "NO_LABELS_FOUND": "No labels found for", + "ASSIGN_SELECTED_LABELS": "Assign selected labels", + "ASSIGN_SUCCESFUL": "Labels assigned successfully", + "ASSIGN_FAILED": "Failed to assign labels, please try again" } + } } diff --git a/app/javascript/dashboard/i18n/locale/fi/contact.json b/app/javascript/dashboard/i18n/locale/fi/contact.json index c1429ff36..714c3d9b5 100644 --- a/app/javascript/dashboard/i18n/locale/fi/contact.json +++ b/app/javascript/dashboard/i18n/locale/fi/contact.json @@ -111,7 +111,8 @@ "EMAIL_ADDRESS": { "PLACEHOLDER": "Anna yhteyshenkilön sähköpostiosoite", "LABEL": "Sähköpostiosoite", - "DUPLICATE": "Tämä sähköpostiosoite on käytössä toiselle yhteyshenkilölle." + "DUPLICATE": "Tämä sähköpostiosoite on käytössä toiselle yhteyshenkilölle.", + "ERROR": "Ole hyvä ja syötä validi sähköposti." }, "PHONE_NUMBER": { "PLACEHOLDER": "Anna yhteystiedon puhelinnumero", diff --git a/app/javascript/dashboard/i18n/locale/fi/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/fi/inboxMgmt.json index 9d8a4dc70..9b2955401 100644 --- a/app/javascript/dashboard/i18n/locale/fi/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/fi/inboxMgmt.json @@ -30,7 +30,8 @@ "ADD": { "CHANNEL_NAME": { "LABEL": "Kansion nimi", - "PLACEHOLDER": "Enter your inbox name (eg: Acme Inc)" + "PLACEHOLDER": "Enter your inbox name (eg: Acme Inc)", + "ERROR": "Please enter a valid inbox name" }, "WEBSITE_NAME": { "LABEL": "Sivuston nimi", @@ -82,7 +83,7 @@ }, "CHANNEL_GREETING_TOGGLE": { "LABEL": "Ota käyttöön tervetulotoivotus", - "HELP_TEXT": "Send a greeting message to the users when they starts the conversation.", + "HELP_TEXT": "Automatically send a greeting message when a new conversation is created.", "ENABLED": "Käytössä", "DISABLED": "Pois käytöstä" }, @@ -97,7 +98,10 @@ "LABEL": "Widgetin väri", "PLACEHOLDER": "Päivitä widgetissä käytetty pääväri" }, - "SUBMIT_BUTTON": "Luo saapet-kansio" + "SUBMIT_BUTTON": "Luo saapet-kansio", + "API": { + "ERROR_MESSAGE": "We were not able to create a website channel, please try again" + } }, "TWILIO": { "TITLE": "Twilio SMS/WhatsApp Channel", @@ -193,6 +197,7 @@ "PROVIDERS": { "LABEL": "API Provider", "TWILIO": "Twilio", + "WHATSAPP_CLOUD": "WhatsApp Cloud", "360_DIALOG": "360Dialog" }, "INBOX_NAME": { @@ -205,13 +210,31 @@ "PLACEHOLDER": "Ole hyvä ja syötä puhelinnumero, josta viesti lähetetään.", "ERROR": "Anna kelvollinen arvo. Puhelinnumeron pitäisi alkaa `+` merkillä." }, + "PHONE_NUMBER_ID": { + "LABEL": "Phone number ID", + "PLACEHOLDER": "Please enter the Phone number ID obtained from Facebook developer dashboard.", + "ERROR": "Please enter a valid value." + }, + "BUSINESS_ACCOUNT_ID": { + "LABEL": "Business Account ID", + "PLACEHOLDER": "Please enter the Business Account ID obtained from Facebook developer dashboard.", + "ERROR": "Please enter a valid value." + }, + "WEBHOOK_VERIFY_TOKEN": { + "LABEL": "Webhook Verify Token", + "PLACEHOLDER": "Enter a verify token which you want to configure for facebook webhooks.", + "ERROR": "Please enter a valid value." + }, "API_KEY": { "LABEL": "API key", "SUBTITLE": "Configure the WhatsApp API key.", "PLACEHOLDER": "API key", - "APPLY_FOR_ACCESS": "Don't have any API key? Apply for access here", "ERROR": "Please enter a valid value." }, + "API_CALLBACK": { + "TITLE": "Callback URL", + "SUBTITLE": "You have to configure the webhook URL in facebook developer portal with the URL mentioned here." + }, "SUBMIT_BUTTON": "Create WhatsApp Channel", "API": { "ERROR_MESSAGE": "We were not able to save the WhatsApp channel" @@ -298,7 +321,7 @@ }, "AUTH": { "TITLE": "Choose a channel", - "DESC": "Chatwoot supports live-chat widget, Facebook page, Twitter profile, WhatsApp, Email etc., as channels. If you want to build a custom channel, you can create it using the API channel. Select one channel from the options below to proceed." + "DESC": "Chatwoot supports live-chat widgets, Facebook Messenger, Twitter profiles, WhatsApp, Emails, etc., as channels. If you want to build a custom channel, you can create it using the API channel. To get started, choose one of the channels below." }, "AGENTS": { "TITLE": "Edustajat", @@ -339,7 +362,7 @@ "API": { "SUCCESS_MESSAGE": "Saapuneet-kansion asetukset päivitetty onnistuneesti", "AUTO_ASSIGNMENT_SUCCESS_MESSAGE": "Automaattinen delegointi päivitetty onnistuneesti", - "ERROR_MESSAGE": "Widgetin väriä ei voitu päivittää. Yritä myöhemmin uudelleen." + "ERROR_MESSAGE": "We couldn't update inbox settings. Please try again later." }, "EMAIL_COLLECT_BOX": { "ENABLED": "Käytössä", @@ -412,15 +435,22 @@ "INBOX_UPDATE_SUB_TEXT": "Päivitä postilaatikon asetukset", "AUTO_ASSIGNMENT_SUB_TEXT": "Ota käyttöön tai poista käytöstä automaattinen keskusteluiden delegointi edustajille.", "HMAC_VERIFICATION": "User Identity Validation", - "HMAC_DESCRIPTION": "Inorder to validate the user's identity, the SDK allows you to pass an `identifier_hash` for each user. You can generate HMAC using 'sha256' with the key shown here.", + "HMAC_DESCRIPTION": "In order to validate the user's identity, you can pass an `identifier_hash` for each user. You can generate a HMAC sha256 hash using the `identifier` with the key shown here.", "HMAC_MANDATORY_VERIFICATION": "Enforce User Identity Validation", - "HMAC_MANDATORY_DESCRIPTION": "If enabled, Chatwoot SDKs setUser method will not work unless the `identifier_hash` is provided for each user.", + "HMAC_MANDATORY_DESCRIPTION": "If enabled, requests missing the `identifier_hash` will be rejected.", "INBOX_IDENTIFIER": "Inbox Identifier", "INBOX_IDENTIFIER_SUB_TEXT": "Use the `inbox_identifier` token shown here to authentication your API clients.", "FORWARD_EMAIL_TITLE": "Forward to Email", "FORWARD_EMAIL_SUB_TEXT": "Aloita välittämällä sähköpostit seuraavaan osoitteeseen.", "ALLOW_MESSAGES_AFTER_RESOLVED": "Allow messages after conversation resolved", - "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Allow the end-users to send messages even after the conversation is resolved." + "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Allow the end-users to send messages even after the conversation is resolved.", + "WHATSAPP_SECTION_SUBHEADER": "This API Key is used for the integration with the WhatsApp APIs.", + "WHATSAPP_SECTION_TITLE": "API Key" + }, + "AUTO_ASSIGNMENT": { + "MAX_ASSIGNMENT_LIMIT": "Auto assignment limit", + "MAX_ASSIGNMENT_LIMIT_RANGE_ERROR": "Please enter a value greater than 0", + "MAX_ASSIGNMENT_LIMIT_SUB_TEXT": "Limit the maximum number of conversations from this inbox that can be auto assigned to an agent" }, "FACEBOOK_REAUTHORIZE": { "TITLE": "Uudelleenvaltuuta", diff --git a/app/javascript/dashboard/i18n/locale/fi/report.json b/app/javascript/dashboard/i18n/locale/fi/report.json index 9fc8a5b90..f59ad6467 100644 --- a/app/javascript/dashboard/i18n/locale/fi/report.json +++ b/app/javascript/dashboard/i18n/locale/fi/report.json @@ -65,6 +65,7 @@ "PLACEHOLDER": "Select date range" }, "GROUP_BY_FILTER_DROPDOWN_LABEL": "Group By", + "DURATION_FILTER_LABEL": "Duration", "GROUP_BY_DAY_OPTIONS": [ { "id": 1, diff --git a/app/javascript/dashboard/i18n/locale/fr/bulkActions.json b/app/javascript/dashboard/i18n/locale/fr/bulkActions.json index 1833909e2..c462b31f9 100644 --- a/app/javascript/dashboard/i18n/locale/fr/bulkActions.json +++ b/app/javascript/dashboard/i18n/locale/fr/bulkActions.json @@ -1,17 +1,29 @@ { - "BULK_ACTION": { - "CONVERSATIONS_SELECTED": "%{conversationCount} conversations selected", - "AGENT_SELECT_LABEL": "Sélectionner un agent", - "ASSIGN_CONFIRMATION_LABEL": "Are you sure you want to assign %{conversationCount} %{conversationLabel} to", - "GO_BACK_LABEL": "Go back", - "ASSIGN_LABEL": "Assigner", - "ASSIGN_AGENT_TOOLTIP": "Assign Agent", - "RESOLVE_TOOLTIP": "Résoudre", - "ASSIGN_SUCCESFUL": "Conversations assigned successfully", - "ASSIGN_FAILED": "Failed to assign conversations, please try again", - "RESOLVE_SUCCESFUL": "Conversations resolved successfully", - "RESOLVE_FAILED": "Failed to resolve conversations, please try again", - "ALL_CONVERSATIONS_SELECTED_ALERT": "Conversations visible on this page are only selected.", - "AGENT_LIST_LOADING": "Loading Agents" + "BULK_ACTION": { + "CONVERSATIONS_SELECTED": "%{conversationCount} conversations selected", + "AGENT_SELECT_LABEL": "Sélectionner un agent", + "ASSIGN_CONFIRMATION_LABEL": "Are you sure you want to assign %{conversationCount} %{conversationLabel} to", + "GO_BACK_LABEL": "Go back", + "ASSIGN_LABEL": "Assigner", + "ASSIGN_AGENT_TOOLTIP": "Assign Agent", + "ASSIGN_SUCCESFUL": "Conversations assigned successfully", + "ASSIGN_FAILED": "Failed to assign conversations, please try again", + "RESOLVE_SUCCESFUL": "Conversations resolved successfully", + "RESOLVE_FAILED": "Failed to resolve conversations, please try again", + "ALL_CONVERSATIONS_SELECTED_ALERT": "Conversations visible on this page are only selected.", + "AGENT_LIST_LOADING": "Loading Agents", + "UPDATE": { + "CHANGE_STATUS": "Change status", + "SNOOZE_UNTIL_NEXT_REPLY": "Snooze until next reply", + "UPDATE_SUCCESFUL": "Conversation status updated successfully.", + "UPDATE_FAILED": "Failed to update conversations, please try again" + }, + "LABELS": { + "ASSIGN_LABELS": "Assign Labels", + "NO_LABELS_FOUND": "No labels found for", + "ASSIGN_SELECTED_LABELS": "Assign selected labels", + "ASSIGN_SUCCESFUL": "Labels assigned successfully", + "ASSIGN_FAILED": "Failed to assign labels, please try again" } + } } diff --git a/app/javascript/dashboard/i18n/locale/fr/contact.json b/app/javascript/dashboard/i18n/locale/fr/contact.json index e1757bb8b..582faac12 100644 --- a/app/javascript/dashboard/i18n/locale/fr/contact.json +++ b/app/javascript/dashboard/i18n/locale/fr/contact.json @@ -111,7 +111,8 @@ "EMAIL_ADDRESS": { "PLACEHOLDER": "Entrez l'adresse de courriel du contact", "LABEL": "Adresse de courriel", - "DUPLICATE": "Cette adresse de courriel est déjà utilisée pour un autre contact." + "DUPLICATE": "Cette adresse de courriel est déjà utilisée pour un autre contact.", + "ERROR": "Veuillez saisir une adresse de courriel valide." }, "PHONE_NUMBER": { "PLACEHOLDER": "Entrez le numéro de téléphone du contact", diff --git a/app/javascript/dashboard/i18n/locale/fr/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/fr/inboxMgmt.json index 48d1ecb78..a6fdbb73a 100644 --- a/app/javascript/dashboard/i18n/locale/fr/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/fr/inboxMgmt.json @@ -30,7 +30,8 @@ "ADD": { "CHANNEL_NAME": { "LABEL": "Nom de la boîte de réception", - "PLACEHOLDER": "Entrez le nom de votre boîte de réception (ex: Acme Inc)" + "PLACEHOLDER": "Entrez le nom de votre boîte de réception (ex: Acme Inc)", + "ERROR": "Please enter a valid inbox name" }, "WEBSITE_NAME": { "LABEL": "Nom du site web", @@ -82,7 +83,7 @@ }, "CHANNEL_GREETING_TOGGLE": { "LABEL": "Activer l'accueil du canal", - "HELP_TEXT": "Envoyer un message de bienvenue aux utilisateurs lorsqu'ils démarrent la conversation.", + "HELP_TEXT": "Automatically send a greeting message when a new conversation is created.", "ENABLED": "Activé", "DISABLED": "Désactivé" }, @@ -97,7 +98,10 @@ "LABEL": "Couleur du Widget", "PLACEHOLDER": "Mettre à jour la couleur utilisée dans le widget" }, - "SUBMIT_BUTTON": "Créer une boîte de réception" + "SUBMIT_BUTTON": "Créer une boîte de réception", + "API": { + "ERROR_MESSAGE": "We were not able to create a website channel, please try again" + } }, "TWILIO": { "TITLE": "Chaîne Twilio SMS/WhatsApp", @@ -193,6 +197,7 @@ "PROVIDERS": { "LABEL": "API Provider", "TWILIO": "Twilio", + "WHATSAPP_CLOUD": "WhatsApp Cloud", "360_DIALOG": "Fenêtre de dialogue 360" }, "INBOX_NAME": { @@ -205,13 +210,31 @@ "PLACEHOLDER": "Veuillez entrer le numéro de téléphone à partir duquel le message sera envoyé.", "ERROR": "Veuillez entrer une valeur valide. Le numéro de téléphone doit commencer par le signe `+`." }, + "PHONE_NUMBER_ID": { + "LABEL": "Phone number ID", + "PLACEHOLDER": "Please enter the Phone number ID obtained from Facebook developer dashboard.", + "ERROR": "Veuillez saisir une adresse de courriel valide." + }, + "BUSINESS_ACCOUNT_ID": { + "LABEL": "Business Account ID", + "PLACEHOLDER": "Please enter the Business Account ID obtained from Facebook developer dashboard.", + "ERROR": "Veuillez saisir une adresse de courriel valide." + }, + "WEBHOOK_VERIFY_TOKEN": { + "LABEL": "Webhook Verify Token", + "PLACEHOLDER": "Enter a verify token which you want to configure for facebook webhooks.", + "ERROR": "Veuillez saisir une adresse de courriel valide." + }, "API_KEY": { "LABEL": "Clé de l'API", "SUBTITLE": "Configurer la clé API WhatsApp.", "PLACEHOLDER": "Clé de l'API", - "APPLY_FOR_ACCESS": "Vous n'avez pas de clé API ? Demander l'accès ici", "ERROR": "Veuillez saisir une adresse de courriel valide." }, + "API_CALLBACK": { + "TITLE": "URL de rappel (callback)", + "SUBTITLE": "You have to configure the webhook URL in facebook developer portal with the URL mentioned here." + }, "SUBMIT_BUTTON": "Créer le canal WhatsApp", "API": { "ERROR_MESSAGE": "Nous n'avons pas pu enregistrer le canal WhatsApp" @@ -298,7 +321,7 @@ }, "AUTH": { "TITLE": "Choisir un canal", - "DESC": "Chatwoot propose un widget de chat en direct, supporte les pages Facebook, les profils Twitter, Whatsapp, Email etc., en tant que canaux. Si vous voulez construire un canal personnalisé, vous pouvez le créer en utilisant le canal API. Sélectionnez un canal parmi les options ci-dessous pour continuer." + "DESC": "Chatwoot supports live-chat widgets, Facebook Messenger, Twitter profiles, WhatsApp, Emails, etc., as channels. If you want to build a custom channel, you can create it using the API channel. To get started, choose one of the channels below." }, "AGENTS": { "TITLE": "Agents", @@ -339,7 +362,7 @@ "API": { "SUCCESS_MESSAGE": "Paramètres de boîte de réception mis à jour avec succès", "AUTO_ASSIGNMENT_SUCCESS_MESSAGE": "Affectation automatique mise à jour avec succès", - "ERROR_MESSAGE": "Impossible de mettre à jour la couleur du widget. Veuillez réessayer plus tard." + "ERROR_MESSAGE": "We couldn't update inbox settings. Please try again later." }, "EMAIL_COLLECT_BOX": { "ENABLED": "Activé", @@ -412,15 +435,22 @@ "INBOX_UPDATE_SUB_TEXT": "Mettre à jour les paramètres de votre boîte de réception", "AUTO_ASSIGNMENT_SUB_TEXT": "Activer ou désactiver l'affectation automatique de nouvelles conversations aux agents ajoutés à cette boîte de réception.", "HMAC_VERIFICATION": "Validation de l'identité de l'utilisateur", - "HMAC_DESCRIPTION": "Afin de valider l'identité des utilisateurs, le SDK vous permet de passer un `identifier_hash` pour chaque utilisateur. Vous pouvez générer HMAC en utilisant 'sha256' avec la clé indiquée ici.", + "HMAC_DESCRIPTION": "In order to validate the user's identity, you can pass an `identifier_hash` for each user. You can generate a HMAC sha256 hash using the `identifier` with the key shown here.", "HMAC_MANDATORY_VERIFICATION": "Forcer la validation de l'identité de l'utilisateur", - "HMAC_MANDATORY_DESCRIPTION": "Si activé, la méthode setUser du SDK Chatwoot ne fonctionnera pas à moins que le `identifier_hash` soit fourni pour chaque utilisateur.", + "HMAC_MANDATORY_DESCRIPTION": "If enabled, requests missing the `identifier_hash` will be rejected.", "INBOX_IDENTIFIER": "Identificateur de la boîte de réception", "INBOX_IDENTIFIER_SUB_TEXT": "Utilisez le jeton `inbox_identifier` affiché ici pour authentifier vos clients API.", "FORWARD_EMAIL_TITLE": "Transférer par e-mail", "FORWARD_EMAIL_SUB_TEXT": "Commencez à transférer vos courriels à l'adresse suivante.", "ALLOW_MESSAGES_AFTER_RESOLVED": "Autoriser les messages après résolution de la conversation", - "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Autoriser les utilisateurs à envoyer des messages même après la résolution de la conversation." + "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Autoriser les utilisateurs à envoyer des messages même après la résolution de la conversation.", + "WHATSAPP_SECTION_SUBHEADER": "This API Key is used for the integration with the WhatsApp APIs.", + "WHATSAPP_SECTION_TITLE": "Clé de l'API" + }, + "AUTO_ASSIGNMENT": { + "MAX_ASSIGNMENT_LIMIT": "Auto assignment limit", + "MAX_ASSIGNMENT_LIMIT_RANGE_ERROR": "Please enter a value greater than 0", + "MAX_ASSIGNMENT_LIMIT_SUB_TEXT": "Limit the maximum number of conversations from this inbox that can be auto assigned to an agent" }, "FACEBOOK_REAUTHORIZE": { "TITLE": "Réautoriser", diff --git a/app/javascript/dashboard/i18n/locale/fr/report.json b/app/javascript/dashboard/i18n/locale/fr/report.json index d325abcc4..96987bdcb 100644 --- a/app/javascript/dashboard/i18n/locale/fr/report.json +++ b/app/javascript/dashboard/i18n/locale/fr/report.json @@ -65,6 +65,7 @@ "PLACEHOLDER": "Sélectionnez la plage de dates" }, "GROUP_BY_FILTER_DROPDOWN_LABEL": "Par groupe", + "DURATION_FILTER_LABEL": "Duration", "GROUP_BY_DAY_OPTIONS": [ { "id": 1, diff --git a/app/javascript/dashboard/i18n/locale/he/bulkActions.json b/app/javascript/dashboard/i18n/locale/he/bulkActions.json index 434dff926..fa9986db2 100644 --- a/app/javascript/dashboard/i18n/locale/he/bulkActions.json +++ b/app/javascript/dashboard/i18n/locale/he/bulkActions.json @@ -1,17 +1,29 @@ { - "BULK_ACTION": { - "CONVERSATIONS_SELECTED": "%{conversationCount} conversations selected", - "AGENT_SELECT_LABEL": "בחר סוכן", - "ASSIGN_CONFIRMATION_LABEL": "Are you sure you want to assign %{conversationCount} %{conversationLabel} to", - "GO_BACK_LABEL": "Go back", - "ASSIGN_LABEL": "שייך", - "ASSIGN_AGENT_TOOLTIP": "Assign Agent", - "RESOLVE_TOOLTIP": "פתרון", - "ASSIGN_SUCCESFUL": "Conversations assigned successfully", - "ASSIGN_FAILED": "Failed to assign conversations, please try again", - "RESOLVE_SUCCESFUL": "Conversations resolved successfully", - "RESOLVE_FAILED": "Failed to resolve conversations, please try again", - "ALL_CONVERSATIONS_SELECTED_ALERT": "Conversations visible on this page are only selected.", - "AGENT_LIST_LOADING": "Loading Agents" + "BULK_ACTION": { + "CONVERSATIONS_SELECTED": "%{conversationCount} conversations selected", + "AGENT_SELECT_LABEL": "בחר סוכן", + "ASSIGN_CONFIRMATION_LABEL": "Are you sure you want to assign %{conversationCount} %{conversationLabel} to", + "GO_BACK_LABEL": "Go back", + "ASSIGN_LABEL": "שייך", + "ASSIGN_AGENT_TOOLTIP": "Assign Agent", + "ASSIGN_SUCCESFUL": "Conversations assigned successfully", + "ASSIGN_FAILED": "Failed to assign conversations, please try again", + "RESOLVE_SUCCESFUL": "Conversations resolved successfully", + "RESOLVE_FAILED": "Failed to resolve conversations, please try again", + "ALL_CONVERSATIONS_SELECTED_ALERT": "Conversations visible on this page are only selected.", + "AGENT_LIST_LOADING": "Loading Agents", + "UPDATE": { + "CHANGE_STATUS": "Change status", + "SNOOZE_UNTIL_NEXT_REPLY": "Snooze until next reply", + "UPDATE_SUCCESFUL": "Conversation status updated successfully.", + "UPDATE_FAILED": "Failed to update conversations, please try again" + }, + "LABELS": { + "ASSIGN_LABELS": "Assign Labels", + "NO_LABELS_FOUND": "No labels found for", + "ASSIGN_SELECTED_LABELS": "Assign selected labels", + "ASSIGN_SUCCESFUL": "Labels assigned successfully", + "ASSIGN_FAILED": "Failed to assign labels, please try again" } + } } diff --git a/app/javascript/dashboard/i18n/locale/he/contact.json b/app/javascript/dashboard/i18n/locale/he/contact.json index f9c9f5375..bd51a22ed 100644 --- a/app/javascript/dashboard/i18n/locale/he/contact.json +++ b/app/javascript/dashboard/i18n/locale/he/contact.json @@ -111,7 +111,8 @@ "EMAIL_ADDRESS": { "PLACEHOLDER": "הזן את כתובת האימייל של איש הקשר", "LABEL": "כתובת מייל", - "DUPLICATE": "כתובת דוא\"ל זו נמצאת בשימוש עבור איש קשר אחר." + "DUPLICATE": "כתובת דוא\"ל זו נמצאת בשימוש עבור איש קשר אחר.", + "ERROR": "בבקשה הכנס כתוכת אימייל תקינה." }, "PHONE_NUMBER": { "PLACEHOLDER": "הזן את מספר הטלפון של איש הקשר", diff --git a/app/javascript/dashboard/i18n/locale/he/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/he/inboxMgmt.json index fa71fca8e..a4c4a2a27 100644 --- a/app/javascript/dashboard/i18n/locale/he/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/he/inboxMgmt.json @@ -30,7 +30,8 @@ "ADD": { "CHANNEL_NAME": { "LABEL": "שם תיבת הדואר הנכנס", - "PLACEHOLDER": "הזן את שם תיבת הדואר הנכנס שלך (למשל: Acme Inc)" + "PLACEHOLDER": "הזן את שם תיבת הדואר הנכנס שלך (למשל: Acme Inc)", + "ERROR": "Please enter a valid inbox name" }, "WEBSITE_NAME": { "LABEL": "שם האתר", @@ -82,7 +83,7 @@ }, "CHANNEL_GREETING_TOGGLE": { "LABEL": "אפשר ברכה בערוץ", - "HELP_TEXT": "Send a greeting message to the users when they starts the conversation.", + "HELP_TEXT": "Automatically send a greeting message when a new conversation is created.", "ENABLED": "מופעל", "DISABLED": "כבוי" }, @@ -97,7 +98,10 @@ "LABEL": "צבע יישומון", "PLACEHOLDER": "עדכן את צבע הווידג'ט המשמש בווידג'ט" }, - "SUBMIT_BUTTON": "צור תיבת דואר נכנס" + "SUBMIT_BUTTON": "צור תיבת דואר נכנס", + "API": { + "ERROR_MESSAGE": "We were not able to create a website channel, please try again" + } }, "TWILIO": { "TITLE": "ערוץ SMS/ווטסאפ של Twilio", @@ -193,6 +197,7 @@ "PROVIDERS": { "LABEL": "ספק API", "TWILIO": "Twilio", + "WHATSAPP_CLOUD": "WhatsApp Cloud", "360_DIALOG": "360Dialog" }, "INBOX_NAME": { @@ -205,13 +210,31 @@ "PLACEHOLDER": "נא להזין את מספר הטלפון שממנו תישלח ההודעה.", "ERROR": "אנא הכנס ערך תקין. מספר הטלפון צריך להתחיל בסימן '+'." }, + "PHONE_NUMBER_ID": { + "LABEL": "Phone number ID", + "PLACEHOLDER": "Please enter the Phone number ID obtained from Facebook developer dashboard.", + "ERROR": "אנא הכנס ערך תקין." + }, + "BUSINESS_ACCOUNT_ID": { + "LABEL": "Business Account ID", + "PLACEHOLDER": "Please enter the Business Account ID obtained from Facebook developer dashboard.", + "ERROR": "אנא הכנס ערך תקין." + }, + "WEBHOOK_VERIFY_TOKEN": { + "LABEL": "Webhook Verify Token", + "PLACEHOLDER": "Enter a verify token which you want to configure for facebook webhooks.", + "ERROR": "אנא הכנס ערך תקין." + }, "API_KEY": { "LABEL": "API key", "SUBTITLE": "הגדר את מפתח ה-API של וואטסאפ.", "PLACEHOLDER": "API key", - "APPLY_FOR_ACCESS": "אין לך מפתח API? הגש בקשה לגישה כאן", "ERROR": "אנא הכנס ערך תקין." }, + "API_CALLBACK": { + "TITLE": "כתובת אתר להתקשרות חוזרת", + "SUBTITLE": "You have to configure the webhook URL in facebook developer portal with the URL mentioned here." + }, "SUBMIT_BUTTON": "צור ערוץ וואטסאפ", "API": { "ERROR_MESSAGE": "לא הצלחנו לשמור את ערוץ הוואטסאפ" @@ -298,7 +321,7 @@ }, "AUTH": { "TITLE": "בחר ערוץ", - "DESC": "Chatwoot תומך בווידג'ט של צ'אט חי, עמוד פייסבוק, פרופיל טוויטר, וואטסאפ, דוא\"ל וכו', כערוצים. אם אתה רוצה לבנות ערוץ מותאם אישית, אתה יכול ליצור אותו באמצעות ערוץ ה-API. בחר ערוץ אחד מהאפשרויות למטה כדי להמשיך." + "DESC": "Chatwoot supports live-chat widgets, Facebook Messenger, Twitter profiles, WhatsApp, Emails, etc., as channels. If you want to build a custom channel, you can create it using the API channel. To get started, choose one of the channels below." }, "AGENTS": { "TITLE": "סוכנים", @@ -339,7 +362,7 @@ "API": { "SUCCESS_MESSAGE": "הגדרות תיבת הדואר הנכנס עודכנו בהצלחה", "AUTO_ASSIGNMENT_SUCCESS_MESSAGE": "ההקצאה האוטומטית עודכנה בהצלחה", - "ERROR_MESSAGE": "לא ניתן היה לעדכן את צבע הווידג'ט. בבקשה נסה שוב מאוחר יותר." + "ERROR_MESSAGE": "We couldn't update inbox settings. Please try again later." }, "EMAIL_COLLECT_BOX": { "ENABLED": "מופעל", @@ -412,15 +435,22 @@ "INBOX_UPDATE_SUB_TEXT": "עדכן את הגדרות תיבת הדואר הנכנס שלך", "AUTO_ASSIGNMENT_SUB_TEXT": "אפשר או השבת את ההקצאה האוטומטית של שיחות חדשות לסוכנים שנוספו לתיבת הדואר הנכנס הזו.", "HMAC_VERIFICATION": "אימות זהות משתמש", - "HMAC_DESCRIPTION": "על מנת לאמת את זהות המשתמש, ה-SDK מאפשר לך להעביר `hash מזהה` עבור כל משתמש. אתה יכול ליצור HMAC באמצעות 'sha256' עם המפתח המוצג כאן.", + "HMAC_DESCRIPTION": "In order to validate the user's identity, you can pass an `identifier_hash` for each user. You can generate a HMAC sha256 hash using the `identifier` with the key shown here.", "HMAC_MANDATORY_VERIFICATION": "אכיפת אימות זהות משתמש", - "HMAC_MANDATORY_DESCRIPTION": "אם מופעלת, שיטת setUser של Chatwoot SDKs לא תעבוד אלא אם ה-'identifier_hash' מסופק עבור כל משתמש.", + "HMAC_MANDATORY_DESCRIPTION": "If enabled, requests missing the `identifier_hash` will be rejected.", "INBOX_IDENTIFIER": "מזהה תיבת דואר נכנס", "INBOX_IDENTIFIER_SUB_TEXT": "השתמש ב-'inbox_identifier' המוצג כאן כדי לאמת את לקוחות ה-API שלך.", "FORWARD_EMAIL_TITLE": "העבר לדואר אלקטרוני", "FORWARD_EMAIL_SUB_TEXT": "התחל להעביר את המיילים שלך לכתובת הדוא\"ל הבאה.", "ALLOW_MESSAGES_AFTER_RESOLVED": "Allow messages after conversation resolved", - "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Allow the end-users to send messages even after the conversation is resolved." + "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Allow the end-users to send messages even after the conversation is resolved.", + "WHATSAPP_SECTION_SUBHEADER": "This API Key is used for the integration with the WhatsApp APIs.", + "WHATSAPP_SECTION_TITLE": "API Key" + }, + "AUTO_ASSIGNMENT": { + "MAX_ASSIGNMENT_LIMIT": "Auto assignment limit", + "MAX_ASSIGNMENT_LIMIT_RANGE_ERROR": "Please enter a value greater than 0", + "MAX_ASSIGNMENT_LIMIT_SUB_TEXT": "Limit the maximum number of conversations from this inbox that can be auto assigned to an agent" }, "FACEBOOK_REAUTHORIZE": { "TITLE": "הרשאה מחדש", diff --git a/app/javascript/dashboard/i18n/locale/he/report.json b/app/javascript/dashboard/i18n/locale/he/report.json index 3bb7fc7b2..93055d7f2 100644 --- a/app/javascript/dashboard/i18n/locale/he/report.json +++ b/app/javascript/dashboard/i18n/locale/he/report.json @@ -65,6 +65,7 @@ "PLACEHOLDER": "Select date range" }, "GROUP_BY_FILTER_DROPDOWN_LABEL": "Group By", + "DURATION_FILTER_LABEL": "Duration", "GROUP_BY_DAY_OPTIONS": [ { "id": 1, diff --git a/app/javascript/dashboard/i18n/locale/hi/bulkActions.json b/app/javascript/dashboard/i18n/locale/hi/bulkActions.json index bfd688bef..7061e5e70 100644 --- a/app/javascript/dashboard/i18n/locale/hi/bulkActions.json +++ b/app/javascript/dashboard/i18n/locale/hi/bulkActions.json @@ -1,17 +1,29 @@ { - "BULK_ACTION": { - "CONVERSATIONS_SELECTED": "%{conversationCount} conversations selected", - "AGENT_SELECT_LABEL": "Select Agent", - "ASSIGN_CONFIRMATION_LABEL": "Are you sure you want to assign %{conversationCount} %{conversationLabel} to", - "GO_BACK_LABEL": "Go back", - "ASSIGN_LABEL": "Assign", - "ASSIGN_AGENT_TOOLTIP": "Assign Agent", - "RESOLVE_TOOLTIP": "Resolve", - "ASSIGN_SUCCESFUL": "Conversations assigned successfully", - "ASSIGN_FAILED": "Failed to assign conversations, please try again", - "RESOLVE_SUCCESFUL": "Conversations resolved successfully", - "RESOLVE_FAILED": "Failed to resolve conversations, please try again", - "ALL_CONVERSATIONS_SELECTED_ALERT": "Conversations visible on this page are only selected.", - "AGENT_LIST_LOADING": "Loading Agents" + "BULK_ACTION": { + "CONVERSATIONS_SELECTED": "%{conversationCount} conversations selected", + "AGENT_SELECT_LABEL": "Select Agent", + "ASSIGN_CONFIRMATION_LABEL": "Are you sure you want to assign %{conversationCount} %{conversationLabel} to", + "GO_BACK_LABEL": "Go back", + "ASSIGN_LABEL": "Assign", + "ASSIGN_AGENT_TOOLTIP": "Assign Agent", + "ASSIGN_SUCCESFUL": "Conversations assigned successfully", + "ASSIGN_FAILED": "Failed to assign conversations, please try again", + "RESOLVE_SUCCESFUL": "Conversations resolved successfully", + "RESOLVE_FAILED": "Failed to resolve conversations, please try again", + "ALL_CONVERSATIONS_SELECTED_ALERT": "Conversations visible on this page are only selected.", + "AGENT_LIST_LOADING": "Loading Agents", + "UPDATE": { + "CHANGE_STATUS": "Change status", + "SNOOZE_UNTIL_NEXT_REPLY": "Snooze until next reply", + "UPDATE_SUCCESFUL": "Conversation status updated successfully.", + "UPDATE_FAILED": "Failed to update conversations, please try again" + }, + "LABELS": { + "ASSIGN_LABELS": "Assign Labels", + "NO_LABELS_FOUND": "No labels found for", + "ASSIGN_SELECTED_LABELS": "Assign selected labels", + "ASSIGN_SUCCESFUL": "Labels assigned successfully", + "ASSIGN_FAILED": "Failed to assign labels, please try again" } + } } diff --git a/app/javascript/dashboard/i18n/locale/hi/contact.json b/app/javascript/dashboard/i18n/locale/hi/contact.json index 2257b4573..fa6bb6ce7 100644 --- a/app/javascript/dashboard/i18n/locale/hi/contact.json +++ b/app/javascript/dashboard/i18n/locale/hi/contact.json @@ -111,7 +111,8 @@ "EMAIL_ADDRESS": { "PLACEHOLDER": "Enter the email address of the contact", "LABEL": "Email Address", - "DUPLICATE": "This email address is in use for another contact." + "DUPLICATE": "This email address is in use for another contact.", + "ERROR": "Please enter a valid email address." }, "PHONE_NUMBER": { "PLACEHOLDER": "Enter the phone number of the contact", diff --git a/app/javascript/dashboard/i18n/locale/hi/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/hi/inboxMgmt.json index e9ee9c5b8..09f918351 100644 --- a/app/javascript/dashboard/i18n/locale/hi/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/hi/inboxMgmt.json @@ -30,7 +30,8 @@ "ADD": { "CHANNEL_NAME": { "LABEL": "Inbox Name", - "PLACEHOLDER": "Enter your inbox name (eg: Acme Inc)" + "PLACEHOLDER": "Enter your inbox name (eg: Acme Inc)", + "ERROR": "Please enter a valid inbox name" }, "WEBSITE_NAME": { "LABEL": "Website Name", @@ -82,7 +83,7 @@ }, "CHANNEL_GREETING_TOGGLE": { "LABEL": "Enable channel greeting", - "HELP_TEXT": "Send a greeting message to the users when they starts the conversation.", + "HELP_TEXT": "Automatically send a greeting message when a new conversation is created.", "ENABLED": "Enabled", "DISABLED": "Disabled" }, @@ -97,7 +98,10 @@ "LABEL": "Widget Color", "PLACEHOLDER": "Update the widget color used in widget" }, - "SUBMIT_BUTTON": "Create inbox" + "SUBMIT_BUTTON": "Create inbox", + "API": { + "ERROR_MESSAGE": "We were not able to create a website channel, please try again" + } }, "TWILIO": { "TITLE": "Twilio SMS/WhatsApp Channel", @@ -193,6 +197,7 @@ "PROVIDERS": { "LABEL": "API Provider", "TWILIO": "Twilio", + "WHATSAPP_CLOUD": "WhatsApp Cloud", "360_DIALOG": "360Dialog" }, "INBOX_NAME": { @@ -205,13 +210,31 @@ "PLACEHOLDER": "Please enter the phone number from which message will be sent.", "ERROR": "Please enter a valid value. Phone number should start with `+` sign." }, + "PHONE_NUMBER_ID": { + "LABEL": "Phone number ID", + "PLACEHOLDER": "Please enter the Phone number ID obtained from Facebook developer dashboard.", + "ERROR": "Please enter a valid value." + }, + "BUSINESS_ACCOUNT_ID": { + "LABEL": "Business Account ID", + "PLACEHOLDER": "Please enter the Business Account ID obtained from Facebook developer dashboard.", + "ERROR": "Please enter a valid value." + }, + "WEBHOOK_VERIFY_TOKEN": { + "LABEL": "Webhook Verify Token", + "PLACEHOLDER": "Enter a verify token which you want to configure for facebook webhooks.", + "ERROR": "Please enter a valid value." + }, "API_KEY": { "LABEL": "API key", "SUBTITLE": "Configure the WhatsApp API key.", "PLACEHOLDER": "API key", - "APPLY_FOR_ACCESS": "Don't have any API key? Apply for access here", "ERROR": "Please enter a valid value." }, + "API_CALLBACK": { + "TITLE": "Callback URL", + "SUBTITLE": "You have to configure the webhook URL in facebook developer portal with the URL mentioned here." + }, "SUBMIT_BUTTON": "Create WhatsApp Channel", "API": { "ERROR_MESSAGE": "We were not able to save the WhatsApp channel" @@ -298,7 +321,7 @@ }, "AUTH": { "TITLE": "Choose a channel", - "DESC": "Chatwoot supports live-chat widget, Facebook page, Twitter profile, WhatsApp, Email etc., as channels. If you want to build a custom channel, you can create it using the API channel. Select one channel from the options below to proceed." + "DESC": "Chatwoot supports live-chat widgets, Facebook Messenger, Twitter profiles, WhatsApp, Emails, etc., as channels. If you want to build a custom channel, you can create it using the API channel. To get started, choose one of the channels below." }, "AGENTS": { "TITLE": "Agents", @@ -339,7 +362,7 @@ "API": { "SUCCESS_MESSAGE": "Inbox settings updated successfully", "AUTO_ASSIGNMENT_SUCCESS_MESSAGE": "Auto assignment updated successfully", - "ERROR_MESSAGE": "Could not update widget color. Please try again later." + "ERROR_MESSAGE": "We couldn't update inbox settings. Please try again later." }, "EMAIL_COLLECT_BOX": { "ENABLED": "Enabled", @@ -412,15 +435,22 @@ "INBOX_UPDATE_SUB_TEXT": "Update your inbox settings", "AUTO_ASSIGNMENT_SUB_TEXT": "Enable or disable the automatic assignment of new conversations to the agents added to this inbox.", "HMAC_VERIFICATION": "User Identity Validation", - "HMAC_DESCRIPTION": "Inorder to validate the user's identity, the SDK allows you to pass an `identifier_hash` for each user. You can generate HMAC using 'sha256' with the key shown here.", + "HMAC_DESCRIPTION": "In order to validate the user's identity, you can pass an `identifier_hash` for each user. You can generate a HMAC sha256 hash using the `identifier` with the key shown here.", "HMAC_MANDATORY_VERIFICATION": "Enforce User Identity Validation", - "HMAC_MANDATORY_DESCRIPTION": "If enabled, Chatwoot SDKs setUser method will not work unless the `identifier_hash` is provided for each user.", + "HMAC_MANDATORY_DESCRIPTION": "If enabled, requests missing the `identifier_hash` will be rejected.", "INBOX_IDENTIFIER": "Inbox Identifier", "INBOX_IDENTIFIER_SUB_TEXT": "Use the `inbox_identifier` token shown here to authentication your API clients.", "FORWARD_EMAIL_TITLE": "Forward to Email", "FORWARD_EMAIL_SUB_TEXT": "Start forwarding your emails to the following email address.", "ALLOW_MESSAGES_AFTER_RESOLVED": "Allow messages after conversation resolved", - "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Allow the end-users to send messages even after the conversation is resolved." + "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Allow the end-users to send messages even after the conversation is resolved.", + "WHATSAPP_SECTION_SUBHEADER": "This API Key is used for the integration with the WhatsApp APIs.", + "WHATSAPP_SECTION_TITLE": "API Key" + }, + "AUTO_ASSIGNMENT": { + "MAX_ASSIGNMENT_LIMIT": "Auto assignment limit", + "MAX_ASSIGNMENT_LIMIT_RANGE_ERROR": "Please enter a value greater than 0", + "MAX_ASSIGNMENT_LIMIT_SUB_TEXT": "Limit the maximum number of conversations from this inbox that can be auto assigned to an agent" }, "FACEBOOK_REAUTHORIZE": { "TITLE": "Reauthorize", diff --git a/app/javascript/dashboard/i18n/locale/hi/report.json b/app/javascript/dashboard/i18n/locale/hi/report.json index 2388e913a..0bd9b544d 100644 --- a/app/javascript/dashboard/i18n/locale/hi/report.json +++ b/app/javascript/dashboard/i18n/locale/hi/report.json @@ -65,6 +65,7 @@ "PLACEHOLDER": "Select date range" }, "GROUP_BY_FILTER_DROPDOWN_LABEL": "Group By", + "DURATION_FILTER_LABEL": "Duration", "GROUP_BY_DAY_OPTIONS": [ { "id": 1, diff --git a/app/javascript/dashboard/i18n/locale/hu/bulkActions.json b/app/javascript/dashboard/i18n/locale/hu/bulkActions.json index 9d8010b0a..268b2feb8 100644 --- a/app/javascript/dashboard/i18n/locale/hu/bulkActions.json +++ b/app/javascript/dashboard/i18n/locale/hu/bulkActions.json @@ -1,17 +1,29 @@ { - "BULK_ACTION": { - "CONVERSATIONS_SELECTED": "%{conversationCount} conversations selected", - "AGENT_SELECT_LABEL": "Ügynök kiválasztása", - "ASSIGN_CONFIRMATION_LABEL": "Are you sure you want to assign %{conversationCount} %{conversationLabel} to", - "GO_BACK_LABEL": "Go back", - "ASSIGN_LABEL": "Hozzárendelés", - "ASSIGN_AGENT_TOOLTIP": "Assign Agent", - "RESOLVE_TOOLTIP": "Megoldva", - "ASSIGN_SUCCESFUL": "Conversations assigned successfully", - "ASSIGN_FAILED": "Failed to assign conversations, please try again", - "RESOLVE_SUCCESFUL": "Conversations resolved successfully", - "RESOLVE_FAILED": "Failed to resolve conversations, please try again", - "ALL_CONVERSATIONS_SELECTED_ALERT": "Conversations visible on this page are only selected.", - "AGENT_LIST_LOADING": "Loading Agents" + "BULK_ACTION": { + "CONVERSATIONS_SELECTED": "%{conversationCount} conversations selected", + "AGENT_SELECT_LABEL": "Ügynök kiválasztása", + "ASSIGN_CONFIRMATION_LABEL": "Are you sure you want to assign %{conversationCount} %{conversationLabel} to", + "GO_BACK_LABEL": "Go back", + "ASSIGN_LABEL": "Hozzárendelés", + "ASSIGN_AGENT_TOOLTIP": "Assign Agent", + "ASSIGN_SUCCESFUL": "Conversations assigned successfully", + "ASSIGN_FAILED": "Failed to assign conversations, please try again", + "RESOLVE_SUCCESFUL": "Conversations resolved successfully", + "RESOLVE_FAILED": "Failed to resolve conversations, please try again", + "ALL_CONVERSATIONS_SELECTED_ALERT": "Conversations visible on this page are only selected.", + "AGENT_LIST_LOADING": "Loading Agents", + "UPDATE": { + "CHANGE_STATUS": "Change status", + "SNOOZE_UNTIL_NEXT_REPLY": "Snooze until next reply", + "UPDATE_SUCCESFUL": "Conversation status updated successfully.", + "UPDATE_FAILED": "Failed to update conversations, please try again" + }, + "LABELS": { + "ASSIGN_LABELS": "Assign Labels", + "NO_LABELS_FOUND": "No labels found for", + "ASSIGN_SELECTED_LABELS": "Assign selected labels", + "ASSIGN_SUCCESFUL": "Labels assigned successfully", + "ASSIGN_FAILED": "Failed to assign labels, please try again" } + } } diff --git a/app/javascript/dashboard/i18n/locale/hu/contact.json b/app/javascript/dashboard/i18n/locale/hu/contact.json index 5866ea1c4..26ba45e05 100644 --- a/app/javascript/dashboard/i18n/locale/hu/contact.json +++ b/app/javascript/dashboard/i18n/locale/hu/contact.json @@ -111,7 +111,8 @@ "EMAIL_ADDRESS": { "PLACEHOLDER": "A kontakt e-mailjének megadása", "LABEL": "Email cím", - "DUPLICATE": "Az e-mailcím már egy másik kontakthoz tartozik." + "DUPLICATE": "Az e-mailcím már egy másik kontakthoz tartozik.", + "ERROR": "Kérjük helyes e-mailcímet adj meg." }, "PHONE_NUMBER": { "PLACEHOLDER": "A kontakt telefonszámának megadása", diff --git a/app/javascript/dashboard/i18n/locale/hu/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/hu/inboxMgmt.json index d03a98b66..dfc32d383 100644 --- a/app/javascript/dashboard/i18n/locale/hu/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/hu/inboxMgmt.json @@ -30,7 +30,8 @@ "ADD": { "CHANNEL_NAME": { "LABEL": "Fiók név", - "PLACEHOLDER": "Enter your inbox name (eg: Acme Inc)" + "PLACEHOLDER": "Enter your inbox name (eg: Acme Inc)", + "ERROR": "Please enter a valid inbox name" }, "WEBSITE_NAME": { "LABEL": "Website név", @@ -82,7 +83,7 @@ }, "CHANNEL_GREETING_TOGGLE": { "LABEL": "Csatorna köszöntés engedélyezése", - "HELP_TEXT": "Send a greeting message to the users when they starts the conversation.", + "HELP_TEXT": "Automatically send a greeting message when a new conversation is created.", "ENABLED": "Engedélyezve", "DISABLED": "Letiltva" }, @@ -97,7 +98,10 @@ "LABEL": "Widget szín", "PLACEHOLDER": "Frissítsd a widget színét" }, - "SUBMIT_BUTTON": "Fiók létrehozása" + "SUBMIT_BUTTON": "Fiók létrehozása", + "API": { + "ERROR_MESSAGE": "We were not able to create a website channel, please try again" + } }, "TWILIO": { "TITLE": "Twilio SMS/WhatsApp Channel", @@ -193,6 +197,7 @@ "PROVIDERS": { "LABEL": "API Provider", "TWILIO": "Twilio", + "WHATSAPP_CLOUD": "WhatsApp Cloud", "360_DIALOG": "360Dialog" }, "INBOX_NAME": { @@ -205,13 +210,31 @@ "PLACEHOLDER": "Kérjük add meg a telefonszámot, amire az üzeneteket küldjük.", "ERROR": "Kérjük helyes értéket adj meg. A telefonszám a '+' jellel kezdődjön." }, + "PHONE_NUMBER_ID": { + "LABEL": "Phone number ID", + "PLACEHOLDER": "Please enter the Phone number ID obtained from Facebook developer dashboard.", + "ERROR": "Please enter a valid value." + }, + "BUSINESS_ACCOUNT_ID": { + "LABEL": "Business Account ID", + "PLACEHOLDER": "Please enter the Business Account ID obtained from Facebook developer dashboard.", + "ERROR": "Please enter a valid value." + }, + "WEBHOOK_VERIFY_TOKEN": { + "LABEL": "Webhook Verify Token", + "PLACEHOLDER": "Enter a verify token which you want to configure for facebook webhooks.", + "ERROR": "Please enter a valid value." + }, "API_KEY": { "LABEL": "API key", "SUBTITLE": "Configure the WhatsApp API key.", "PLACEHOLDER": "API key", - "APPLY_FOR_ACCESS": "Don't have any API key? Apply for access here", "ERROR": "Please enter a valid value." }, + "API_CALLBACK": { + "TITLE": "Visszahívás URL", + "SUBTITLE": "You have to configure the webhook URL in facebook developer portal with the URL mentioned here." + }, "SUBMIT_BUTTON": "Create WhatsApp Channel", "API": { "ERROR_MESSAGE": "We were not able to save the WhatsApp channel" @@ -298,7 +321,7 @@ }, "AUTH": { "TITLE": "Choose a channel", - "DESC": "Chatwoot supports live-chat widget, Facebook page, Twitter profile, WhatsApp, Email etc., as channels. If you want to build a custom channel, you can create it using the API channel. Select one channel from the options below to proceed." + "DESC": "Chatwoot supports live-chat widgets, Facebook Messenger, Twitter profiles, WhatsApp, Emails, etc., as channels. If you want to build a custom channel, you can create it using the API channel. To get started, choose one of the channels below." }, "AGENTS": { "TITLE": "Ügynökök", @@ -339,7 +362,7 @@ "API": { "SUCCESS_MESSAGE": "Inbox beállítások sikeresen frissítve", "AUTO_ASSIGNMENT_SUCCESS_MESSAGE": "Automatikus hozzárendelés sikeresen frissítve", - "ERROR_MESSAGE": "Nem sikerült a widget szín változtatása. Kérjük próbáld később." + "ERROR_MESSAGE": "We couldn't update inbox settings. Please try again later." }, "EMAIL_COLLECT_BOX": { "ENABLED": "Engedélyezve", @@ -412,15 +435,22 @@ "INBOX_UPDATE_SUB_TEXT": "Frissítsd az inbox beállításaidat", "AUTO_ASSIGNMENT_SUB_TEXT": "Bekapcsolása vagy kikapcsolása az inboxhoz kapcsolódó automatikus ügynökhozzárendelésnek új beszélgetések esetén.", "HMAC_VERIFICATION": "Felhasználói fiók validálás", - "HMAC_DESCRIPTION": "Inorder to validate the user's identity, the SDK allows you to pass an `identifier_hash` for each user. You can generate HMAC using 'sha256' with the key shown here.", + "HMAC_DESCRIPTION": "In order to validate the user's identity, you can pass an `identifier_hash` for each user. You can generate a HMAC sha256 hash using the `identifier` with the key shown here.", "HMAC_MANDATORY_VERIFICATION": "Enforce User Identity Validation", - "HMAC_MANDATORY_DESCRIPTION": "If enabled, Chatwoot SDKs setUser method will not work unless the `identifier_hash` is provided for each user.", + "HMAC_MANDATORY_DESCRIPTION": "If enabled, requests missing the `identifier_hash` will be rejected.", "INBOX_IDENTIFIER": "Inbox Identifier", "INBOX_IDENTIFIER_SUB_TEXT": "Use the `inbox_identifier` token shown here to authentication your API clients.", "FORWARD_EMAIL_TITLE": "Forward to Email", "FORWARD_EMAIL_SUB_TEXT": "Kezdd el továbbítani az e-maileket a következő e-mail címekre.", "ALLOW_MESSAGES_AFTER_RESOLVED": "Allow messages after conversation resolved", - "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Allow the end-users to send messages even after the conversation is resolved." + "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Allow the end-users to send messages even after the conversation is resolved.", + "WHATSAPP_SECTION_SUBHEADER": "This API Key is used for the integration with the WhatsApp APIs.", + "WHATSAPP_SECTION_TITLE": "API Key" + }, + "AUTO_ASSIGNMENT": { + "MAX_ASSIGNMENT_LIMIT": "Auto assignment limit", + "MAX_ASSIGNMENT_LIMIT_RANGE_ERROR": "Please enter a value greater than 0", + "MAX_ASSIGNMENT_LIMIT_SUB_TEXT": "Limit the maximum number of conversations from this inbox that can be auto assigned to an agent" }, "FACEBOOK_REAUTHORIZE": { "TITLE": "Újraengedélyezés", diff --git a/app/javascript/dashboard/i18n/locale/hu/report.json b/app/javascript/dashboard/i18n/locale/hu/report.json index 915cf5e4b..3a52f511a 100644 --- a/app/javascript/dashboard/i18n/locale/hu/report.json +++ b/app/javascript/dashboard/i18n/locale/hu/report.json @@ -65,6 +65,7 @@ "PLACEHOLDER": "Select date range" }, "GROUP_BY_FILTER_DROPDOWN_LABEL": "Group By", + "DURATION_FILTER_LABEL": "Duration", "GROUP_BY_DAY_OPTIONS": [ { "id": 1, diff --git a/app/javascript/dashboard/i18n/locale/id/bulkActions.json b/app/javascript/dashboard/i18n/locale/id/bulkActions.json index b01c4daa4..93ac7f420 100644 --- a/app/javascript/dashboard/i18n/locale/id/bulkActions.json +++ b/app/javascript/dashboard/i18n/locale/id/bulkActions.json @@ -1,17 +1,29 @@ { - "BULK_ACTION": { - "CONVERSATIONS_SELECTED": "%{conversationCount} conversations selected", - "AGENT_SELECT_LABEL": "Pilih Agen", - "ASSIGN_CONFIRMATION_LABEL": "Are you sure you want to assign %{conversationCount} %{conversationLabel} to", - "GO_BACK_LABEL": "Go back", - "ASSIGN_LABEL": "Tugaskan", - "ASSIGN_AGENT_TOOLTIP": "Assign Agent", - "RESOLVE_TOOLTIP": "Menyelesaikan", - "ASSIGN_SUCCESFUL": "Conversations assigned successfully", - "ASSIGN_FAILED": "Failed to assign conversations, please try again", - "RESOLVE_SUCCESFUL": "Conversations resolved successfully", - "RESOLVE_FAILED": "Failed to resolve conversations, please try again", - "ALL_CONVERSATIONS_SELECTED_ALERT": "Conversations visible on this page are only selected.", - "AGENT_LIST_LOADING": "Loading Agents" + "BULK_ACTION": { + "CONVERSATIONS_SELECTED": "%{conversationCount} conversations selected", + "AGENT_SELECT_LABEL": "Pilih Agen", + "ASSIGN_CONFIRMATION_LABEL": "Are you sure you want to assign %{conversationCount} %{conversationLabel} to", + "GO_BACK_LABEL": "Go back", + "ASSIGN_LABEL": "Tugaskan", + "ASSIGN_AGENT_TOOLTIP": "Assign Agent", + "ASSIGN_SUCCESFUL": "Conversations assigned successfully", + "ASSIGN_FAILED": "Failed to assign conversations, please try again", + "RESOLVE_SUCCESFUL": "Conversations resolved successfully", + "RESOLVE_FAILED": "Failed to resolve conversations, please try again", + "ALL_CONVERSATIONS_SELECTED_ALERT": "Conversations visible on this page are only selected.", + "AGENT_LIST_LOADING": "Loading Agents", + "UPDATE": { + "CHANGE_STATUS": "Change status", + "SNOOZE_UNTIL_NEXT_REPLY": "Snooze until next reply", + "UPDATE_SUCCESFUL": "Conversation status updated successfully.", + "UPDATE_FAILED": "Failed to update conversations, please try again" + }, + "LABELS": { + "ASSIGN_LABELS": "Assign Labels", + "NO_LABELS_FOUND": "No labels found for", + "ASSIGN_SELECTED_LABELS": "Assign selected labels", + "ASSIGN_SUCCESFUL": "Labels assigned successfully", + "ASSIGN_FAILED": "Failed to assign labels, please try again" } + } } diff --git a/app/javascript/dashboard/i18n/locale/id/contact.json b/app/javascript/dashboard/i18n/locale/id/contact.json index 8f34af96a..e0792aca7 100644 --- a/app/javascript/dashboard/i18n/locale/id/contact.json +++ b/app/javascript/dashboard/i18n/locale/id/contact.json @@ -111,7 +111,8 @@ "EMAIL_ADDRESS": { "PLACEHOLDER": "Masukkan alamat email kontak", "LABEL": "Alamat email", - "DUPLICATE": "Alamat email ini digunakan untuk kontak lain." + "DUPLICATE": "Alamat email ini digunakan untuk kontak lain.", + "ERROR": "Harap masukkan alamat email yang valid." }, "PHONE_NUMBER": { "PLACEHOLDER": "Masukkan nomor telepon kontak tersebut", diff --git a/app/javascript/dashboard/i18n/locale/id/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/id/inboxMgmt.json index 705db8869..aafa88d9d 100644 --- a/app/javascript/dashboard/i18n/locale/id/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/id/inboxMgmt.json @@ -30,7 +30,8 @@ "ADD": { "CHANNEL_NAME": { "LABEL": "Nama Kotak Masuk", - "PLACEHOLDER": "Masukkan nama kotak masuk anda (mis: Acme Inc)" + "PLACEHOLDER": "Masukkan nama kotak masuk anda (mis: Acme Inc)", + "ERROR": "Please enter a valid inbox name" }, "WEBSITE_NAME": { "LABEL": "Nama Website", @@ -82,7 +83,7 @@ }, "CHANNEL_GREETING_TOGGLE": { "LABEL": "Aktifkan sambutan channel", - "HELP_TEXT": "Send a greeting message to the users when they starts the conversation.", + "HELP_TEXT": "Automatically send a greeting message when a new conversation is created.", "ENABLED": "Diaktifkan", "DISABLED": "Nonaktif" }, @@ -97,7 +98,10 @@ "LABEL": "Warna Widget", "PLACEHOLDER": "Perbarui warna yang digunakan di widget" }, - "SUBMIT_BUTTON": "Buat Kotak Masuk" + "SUBMIT_BUTTON": "Buat Kotak Masuk", + "API": { + "ERROR_MESSAGE": "We were not able to create a website channel, please try again" + } }, "TWILIO": { "TITLE": "Twilio SMS/WhatsApp Channel", @@ -193,6 +197,7 @@ "PROVIDERS": { "LABEL": "API Provider", "TWILIO": "Twilio", + "WHATSAPP_CLOUD": "WhatsApp Cloud", "360_DIALOG": "360Dialog" }, "INBOX_NAME": { @@ -205,13 +210,31 @@ "PLACEHOLDER": "Silakan masukkan nomor telepon dari mana pesan akan dikirim.", "ERROR": "Harap masukkan nomor yang valid. Nomor telepon harus dimulai dengan tanda `+`." }, + "PHONE_NUMBER_ID": { + "LABEL": "Phone number ID", + "PLACEHOLDER": "Please enter the Phone number ID obtained from Facebook developer dashboard.", + "ERROR": "Please enter a valid value." + }, + "BUSINESS_ACCOUNT_ID": { + "LABEL": "Business Account ID", + "PLACEHOLDER": "Please enter the Business Account ID obtained from Facebook developer dashboard.", + "ERROR": "Please enter a valid value." + }, + "WEBHOOK_VERIFY_TOKEN": { + "LABEL": "Webhook Verify Token", + "PLACEHOLDER": "Enter a verify token which you want to configure for facebook webhooks.", + "ERROR": "Please enter a valid value." + }, "API_KEY": { "LABEL": "API key", "SUBTITLE": "Configure the WhatsApp API key.", "PLACEHOLDER": "API key", - "APPLY_FOR_ACCESS": "Don't have any API key? Apply for access here", "ERROR": "Please enter a valid value." }, + "API_CALLBACK": { + "TITLE": "URL Callback", + "SUBTITLE": "You have to configure the webhook URL in facebook developer portal with the URL mentioned here." + }, "SUBMIT_BUTTON": "Create WhatsApp Channel", "API": { "ERROR_MESSAGE": "We were not able to save the WhatsApp channel" @@ -298,7 +321,7 @@ }, "AUTH": { "TITLE": "Pilih sebuah channel", - "DESC": "Chatwoot supports live-chat widget, Facebook page, Twitter profile, WhatsApp, Email etc., as channels. If you want to build a custom channel, you can create it using the API channel. Select one channel from the options below to proceed." + "DESC": "Chatwoot supports live-chat widgets, Facebook Messenger, Twitter profiles, WhatsApp, Emails, etc., as channels. If you want to build a custom channel, you can create it using the API channel. To get started, choose one of the channels below." }, "AGENTS": { "TITLE": "Agen", @@ -339,7 +362,7 @@ "API": { "SUCCESS_MESSAGE": "Pengaturan kotak masuk berhasil diperbarui", "AUTO_ASSIGNMENT_SUCCESS_MESSAGE": "Penugasan otomatis berhasil diperbarui", - "ERROR_MESSAGE": "Tidak dapat memperbarui warna widget. Silakan coba lagi nanti." + "ERROR_MESSAGE": "We couldn't update inbox settings. Please try again later." }, "EMAIL_COLLECT_BOX": { "ENABLED": "Diaktifkan", @@ -412,15 +435,22 @@ "INBOX_UPDATE_SUB_TEXT": "Perbarui pengaturan kotak masuk Anda", "AUTO_ASSIGNMENT_SUB_TEXT": "Mengaktifkan atau menonaktifkan penugasan otomatis percakapan baru ke agen yang ditambahkan ke kotak masuk ini.", "HMAC_VERIFICATION": "Validasi Identitas Pengguna", - "HMAC_DESCRIPTION": "Untuk memvalidasi identitas pengguna, SDK mengizinkan Anda untuk memberikan sebuah `identifier_hash` kepada setiap pengguna. Anda dapat menghasilkan HMAC menggunakan 'sha256' dengan kunci yang terlihat disini.", + "HMAC_DESCRIPTION": "In order to validate the user's identity, you can pass an `identifier_hash` for each user. You can generate a HMAC sha256 hash using the `identifier` with the key shown here.", "HMAC_MANDATORY_VERIFICATION": "Enforce User Identity Validation", - "HMAC_MANDATORY_DESCRIPTION": "If enabled, Chatwoot SDKs setUser method will not work unless the `identifier_hash` is provided for each user.", + "HMAC_MANDATORY_DESCRIPTION": "If enabled, requests missing the `identifier_hash` will be rejected.", "INBOX_IDENTIFIER": "Pengenal Kotak Masuk", "INBOX_IDENTIFIER_SUB_TEXT": "Gunakan token inbox_identifier` yang terlihat disini untuk mengautentikasi klien API Anda.", "FORWARD_EMAIL_TITLE": "Teruskan ke Email", "FORWARD_EMAIL_SUB_TEXT": "Mulailah meneruskan email Anda ke alamat email berikut.", "ALLOW_MESSAGES_AFTER_RESOLVED": "Allow messages after conversation resolved", - "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Allow the end-users to send messages even after the conversation is resolved." + "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Allow the end-users to send messages even after the conversation is resolved.", + "WHATSAPP_SECTION_SUBHEADER": "This API Key is used for the integration with the WhatsApp APIs.", + "WHATSAPP_SECTION_TITLE": "API Key" + }, + "AUTO_ASSIGNMENT": { + "MAX_ASSIGNMENT_LIMIT": "Auto assignment limit", + "MAX_ASSIGNMENT_LIMIT_RANGE_ERROR": "Please enter a value greater than 0", + "MAX_ASSIGNMENT_LIMIT_SUB_TEXT": "Limit the maximum number of conversations from this inbox that can be auto assigned to an agent" }, "FACEBOOK_REAUTHORIZE": { "TITLE": "Otorisasi ulang", diff --git a/app/javascript/dashboard/i18n/locale/id/report.json b/app/javascript/dashboard/i18n/locale/id/report.json index 44619155b..ef61be51f 100644 --- a/app/javascript/dashboard/i18n/locale/id/report.json +++ b/app/javascript/dashboard/i18n/locale/id/report.json @@ -65,6 +65,7 @@ "PLACEHOLDER": "Pilih rentang tanggal" }, "GROUP_BY_FILTER_DROPDOWN_LABEL": "Group By", + "DURATION_FILTER_LABEL": "Duration", "GROUP_BY_DAY_OPTIONS": [ { "id": 1, diff --git a/app/javascript/dashboard/i18n/locale/it/bulkActions.json b/app/javascript/dashboard/i18n/locale/it/bulkActions.json index a98e133bc..d5afa79e9 100644 --- a/app/javascript/dashboard/i18n/locale/it/bulkActions.json +++ b/app/javascript/dashboard/i18n/locale/it/bulkActions.json @@ -1,17 +1,29 @@ { - "BULK_ACTION": { - "CONVERSATIONS_SELECTED": "%{conversationCount} conversazioni selezionate", - "AGENT_SELECT_LABEL": "Seleziona agente", - "ASSIGN_CONFIRMATION_LABEL": "Sei sicuro di voler assegnare %{conversationCount} %{conversationLabel} a", - "GO_BACK_LABEL": "Torna indietro", - "ASSIGN_LABEL": "Assegna", - "ASSIGN_AGENT_TOOLTIP": "Assegna agente", - "RESOLVE_TOOLTIP": "Risolvi", - "ASSIGN_SUCCESFUL": "Conversazioni assegnate correttamente", - "ASSIGN_FAILED": "Assegnazione delle conversazioni non riuscita, riprova", - "RESOLVE_SUCCESFUL": "Conversazioni risolte correttamente", - "RESOLVE_FAILED": "Risoluzione delle conversazioni non riuscita, riprova", - "ALL_CONVERSATIONS_SELECTED_ALERT": "Le conversazioni visibili in questa pagina sono selezionate.", - "AGENT_LIST_LOADING": "Caricamento agenti" + "BULK_ACTION": { + "CONVERSATIONS_SELECTED": "%{conversationCount} conversazioni selezionate", + "AGENT_SELECT_LABEL": "Seleziona agente", + "ASSIGN_CONFIRMATION_LABEL": "Sei sicuro di voler assegnare %{conversationCount} %{conversationLabel} a", + "GO_BACK_LABEL": "Torna indietro", + "ASSIGN_LABEL": "Assegna", + "ASSIGN_AGENT_TOOLTIP": "Assegna agente", + "ASSIGN_SUCCESFUL": "Conversazioni assegnate correttamente", + "ASSIGN_FAILED": "Assegnazione delle conversazioni non riuscita, riprova", + "RESOLVE_SUCCESFUL": "Conversazioni risolte correttamente", + "RESOLVE_FAILED": "Risoluzione delle conversazioni non riuscita, riprova", + "ALL_CONVERSATIONS_SELECTED_ALERT": "Le conversazioni visibili in questa pagina sono selezionate.", + "AGENT_LIST_LOADING": "Caricamento agenti", + "UPDATE": { + "CHANGE_STATUS": "Cambia stato", + "SNOOZE_UNTIL_NEXT_REPLY": "Posticipa fino alla prossima risposta", + "UPDATE_SUCCESFUL": "Stato della conversazione aggiornata correttamente.", + "UPDATE_FAILED": "Impossibile aggiornare le conversazioni, riprova" + }, + "LABELS": { + "ASSIGN_LABELS": "Assegna etichette", + "NO_LABELS_FOUND": "Nessuna etichetta trovata per", + "ASSIGN_SELECTED_LABELS": "Assegna etichette selezeionate", + "ASSIGN_SUCCESFUL": "Etichette assegnate correttamente", + "ASSIGN_FAILED": "Impossibile assegnare le etichette, riprova" } + } } diff --git a/app/javascript/dashboard/i18n/locale/it/contact.json b/app/javascript/dashboard/i18n/locale/it/contact.json index 5429d2d1d..a4f3fc388 100644 --- a/app/javascript/dashboard/i18n/locale/it/contact.json +++ b/app/javascript/dashboard/i18n/locale/it/contact.json @@ -111,7 +111,8 @@ "EMAIL_ADDRESS": { "PLACEHOLDER": "Inserisci l'indirizzo email del contatto", "LABEL": "Indirizzo email", - "DUPLICATE": "Questo indirizzo email è in uso per un altro contatto." + "DUPLICATE": "Questo indirizzo email è in uso per un altro contatto.", + "ERROR": "Inserisci un indirizzo email valido." }, "PHONE_NUMBER": { "PLACEHOLDER": "Inserisci il numero di telefono del contatto", diff --git a/app/javascript/dashboard/i18n/locale/it/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/it/inboxMgmt.json index 9aa37e0e0..630c86b87 100644 --- a/app/javascript/dashboard/i18n/locale/it/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/it/inboxMgmt.json @@ -30,7 +30,8 @@ "ADD": { "CHANNEL_NAME": { "LABEL": "Nome casella", - "PLACEHOLDER": "Inserisci il nome della tua casella di posta (ad esempio: Acme Inc)" + "PLACEHOLDER": "Inserisci il nome della tua casella di posta (ad esempio: Acme Inc)", + "ERROR": "Inserisci un nome per la casella valido" }, "WEBSITE_NAME": { "LABEL": "Nome sito web", @@ -82,7 +83,7 @@ }, "CHANNEL_GREETING_TOGGLE": { "LABEL": "Abilita messaggio di benvenuto sul canale", - "HELP_TEXT": "Invia un messaggio di saluto agli utenti quando iniziano la conversazione.", + "HELP_TEXT": "Invia automaticamente un messaggio di benvenuto quando viene creata una nuova conversazione.", "ENABLED": "Abilitato", "DISABLED": "Disabilitato" }, @@ -97,7 +98,10 @@ "LABEL": "Colore del widget", "PLACEHOLDER": "Aggiorna il colore del widget utilizzato nel widget" }, - "SUBMIT_BUTTON": "Crea casella" + "SUBMIT_BUTTON": "Crea casella", + "API": { + "ERROR_MESSAGE": "Non siamo stati in grado di creare un canale del sito web, si prega di riprovare" + } }, "TWILIO": { "TITLE": "Canale Twilio SMS/WhatsApp", @@ -193,6 +197,7 @@ "PROVIDERS": { "LABEL": "Provider API", "TWILIO": "Twilio", + "WHATSAPP_CLOUD": "WhatsApp Cloud", "360_DIALOG": "360Dialog" }, "INBOX_NAME": { @@ -205,13 +210,31 @@ "PLACEHOLDER": "Inserisci il numero di telefono dal quale verrà inviato il messaggio.", "ERROR": "Inserisci un valore valido. Il numero di telefono dovrebbe iniziare con segno `+`." }, + "PHONE_NUMBER_ID": { + "LABEL": "Phone number ID", + "PLACEHOLDER": "Please enter the Phone number ID obtained from Facebook developer dashboard.", + "ERROR": "Inserisci un valore valido." + }, + "BUSINESS_ACCOUNT_ID": { + "LABEL": "Business Account ID", + "PLACEHOLDER": "Please enter the Business Account ID obtained from Facebook developer dashboard.", + "ERROR": "Inserisci un valore valido." + }, + "WEBHOOK_VERIFY_TOKEN": { + "LABEL": "Webhook Verify Token", + "PLACEHOLDER": "Enter a verify token which you want to configure for facebook webhooks.", + "ERROR": "Inserisci un valore valido." + }, "API_KEY": { "LABEL": "Chiave API", "SUBTITLE": "Configura la chiave API di WhatsApp.", "PLACEHOLDER": "Chiave API", - "APPLY_FOR_ACCESS": "Non hai alcuna chiave API? Richiedi l'accesso qui", "ERROR": "Inserisci un valore valido." }, + "API_CALLBACK": { + "TITLE": "URL di callback", + "SUBTITLE": "You have to configure the webhook URL in facebook developer portal with the URL mentioned here." + }, "SUBMIT_BUTTON": "Crea un canale WhatsApp", "API": { "ERROR_MESSAGE": "Non siamo stati in grado di salvare il canale WhatsApp" @@ -298,7 +321,7 @@ }, "AUTH": { "TITLE": "Scegli un canale", - "DESC": "Chatwoot supporta il widget chat live, pagina Facebook, profilo Twitter, WhatsApp, Email ecc., come canali. Se si desidera costruire un canale personalizzato, è possibile crearlo utilizzando il canale API. Selezionare un canale dalle opzioni sottostanti per procedere." + "DESC": "Chatwoot supports live-chat widgets, Facebook Messenger, Twitter profiles, WhatsApp, Emails, etc., as channels. If you want to build a custom channel, you can create it using the API channel. To get started, choose one of the channels below." }, "AGENTS": { "TITLE": "Agenti", @@ -339,7 +362,7 @@ "API": { "SUCCESS_MESSAGE": "Impostazioni della casella, aggiornate con successo", "AUTO_ASSIGNMENT_SUCCESS_MESSAGE": "Assegnazione automatica aggiornata correttamente", - "ERROR_MESSAGE": "Impossibile aggiornare il colore del widget. Riprova più tardi." + "ERROR_MESSAGE": "Impossibile aggiornare le impostazioni della casella. Riprova più tardi." }, "EMAIL_COLLECT_BOX": { "ENABLED": "Abilitato", @@ -412,15 +435,22 @@ "INBOX_UPDATE_SUB_TEXT": "Aggiorna le impostazioni della casella", "AUTO_ASSIGNMENT_SUB_TEXT": "Abilita o disabilita l'assegnazione automatica di nuove conversazioni agli agenti aggiunti a questa casella.", "HMAC_VERIFICATION": "Convalida identità utente", - "HMAC_DESCRIPTION": "Inorder to validate the user identity, the SDK allows you to pass an `identifier_hash` for each user. Puoi generare HMAC usando 'sha256' con la chiave mostrata qui.", + "HMAC_DESCRIPTION": "In order to validate the user's identity, you can pass an `identifier_hash` for each user. You can generate a HMAC sha256 hash using the `identifier` with the key shown here.", "HMAC_MANDATORY_VERIFICATION": "Forza la convalida identità utente", - "HMAC_MANDATORY_DESCRIPTION": "Se abilitato, il metodo setUser di Chatwoot SDKs non funzionerà a meno che il file `identifier_hash` non sia fornito per ogni utente.", + "HMAC_MANDATORY_DESCRIPTION": "If enabled, requests missing the `identifier_hash` will be rejected.", "INBOX_IDENTIFIER": "Identificatore casella", "INBOX_IDENTIFIER_SUB_TEXT": "Usa il token `inbox_identifier` mostrato qui per l'autenticazione dei tuoi client API.", "FORWARD_EMAIL_TITLE": "Inoltra all'email", "FORWARD_EMAIL_SUB_TEXT": "Inizia a inoltrare le tue email al seguente indirizzo email.", "ALLOW_MESSAGES_AFTER_RESOLVED": "Consenti messaggi dopo la risoluzione della conversazione", - "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Consenti agli utenti finali di inviare messaggi anche dopo la risoluzione della conversazione." + "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Consenti agli utenti finali di inviare messaggi anche dopo la risoluzione della conversazione.", + "WHATSAPP_SECTION_SUBHEADER": "This API Key is used for the integration with the WhatsApp APIs.", + "WHATSAPP_SECTION_TITLE": "Chiave API" + }, + "AUTO_ASSIGNMENT": { + "MAX_ASSIGNMENT_LIMIT": "Limite assegnazione automatica", + "MAX_ASSIGNMENT_LIMIT_RANGE_ERROR": "Inserisci un valore maggiore di 0", + "MAX_ASSIGNMENT_LIMIT_SUB_TEXT": "Limita il numero massimo di conversazioni da questa casella di posta che possono essere assegnate automaticamente ad un agente" }, "FACEBOOK_REAUTHORIZE": { "TITLE": "Riautorizza", diff --git a/app/javascript/dashboard/i18n/locale/it/report.json b/app/javascript/dashboard/i18n/locale/it/report.json index 081c5cc4f..15d1eaee2 100644 --- a/app/javascript/dashboard/i18n/locale/it/report.json +++ b/app/javascript/dashboard/i18n/locale/it/report.json @@ -65,6 +65,7 @@ "PLACEHOLDER": "Seleziona intervallo di date" }, "GROUP_BY_FILTER_DROPDOWN_LABEL": "Raggruppa per", + "DURATION_FILTER_LABEL": "Durata", "GROUP_BY_DAY_OPTIONS": [ { "id": 1, diff --git a/app/javascript/dashboard/i18n/locale/ja/bulkActions.json b/app/javascript/dashboard/i18n/locale/ja/bulkActions.json index 86f088286..7061e5e70 100644 --- a/app/javascript/dashboard/i18n/locale/ja/bulkActions.json +++ b/app/javascript/dashboard/i18n/locale/ja/bulkActions.json @@ -1,17 +1,29 @@ { - "BULK_ACTION": { - "CONVERSATIONS_SELECTED": "%{conversationCount} conversations selected", - "AGENT_SELECT_LABEL": "Select Agent", - "ASSIGN_CONFIRMATION_LABEL": "Are you sure you want to assign %{conversationCount} %{conversationLabel} to", - "GO_BACK_LABEL": "Go back", - "ASSIGN_LABEL": "Assign", - "ASSIGN_AGENT_TOOLTIP": "Assign Agent", - "RESOLVE_TOOLTIP": "解決する", - "ASSIGN_SUCCESFUL": "Conversations assigned successfully", - "ASSIGN_FAILED": "Failed to assign conversations, please try again", - "RESOLVE_SUCCESFUL": "Conversations resolved successfully", - "RESOLVE_FAILED": "Failed to resolve conversations, please try again", - "ALL_CONVERSATIONS_SELECTED_ALERT": "Conversations visible on this page are only selected.", - "AGENT_LIST_LOADING": "Loading Agents" + "BULK_ACTION": { + "CONVERSATIONS_SELECTED": "%{conversationCount} conversations selected", + "AGENT_SELECT_LABEL": "Select Agent", + "ASSIGN_CONFIRMATION_LABEL": "Are you sure you want to assign %{conversationCount} %{conversationLabel} to", + "GO_BACK_LABEL": "Go back", + "ASSIGN_LABEL": "Assign", + "ASSIGN_AGENT_TOOLTIP": "Assign Agent", + "ASSIGN_SUCCESFUL": "Conversations assigned successfully", + "ASSIGN_FAILED": "Failed to assign conversations, please try again", + "RESOLVE_SUCCESFUL": "Conversations resolved successfully", + "RESOLVE_FAILED": "Failed to resolve conversations, please try again", + "ALL_CONVERSATIONS_SELECTED_ALERT": "Conversations visible on this page are only selected.", + "AGENT_LIST_LOADING": "Loading Agents", + "UPDATE": { + "CHANGE_STATUS": "Change status", + "SNOOZE_UNTIL_NEXT_REPLY": "Snooze until next reply", + "UPDATE_SUCCESFUL": "Conversation status updated successfully.", + "UPDATE_FAILED": "Failed to update conversations, please try again" + }, + "LABELS": { + "ASSIGN_LABELS": "Assign Labels", + "NO_LABELS_FOUND": "No labels found for", + "ASSIGN_SELECTED_LABELS": "Assign selected labels", + "ASSIGN_SUCCESFUL": "Labels assigned successfully", + "ASSIGN_FAILED": "Failed to assign labels, please try again" } + } } diff --git a/app/javascript/dashboard/i18n/locale/ja/contact.json b/app/javascript/dashboard/i18n/locale/ja/contact.json index 0f9c139ae..fefcc1551 100644 --- a/app/javascript/dashboard/i18n/locale/ja/contact.json +++ b/app/javascript/dashboard/i18n/locale/ja/contact.json @@ -111,7 +111,8 @@ "EMAIL_ADDRESS": { "PLACEHOLDER": "連絡先のEメールアドレスを入力してください", "LABEL": "Eメールアドレス", - "DUPLICATE": "このメールアドレスは別の連絡先に使用されています。" + "DUPLICATE": "このメールアドレスは別の連絡先に使用されています。", + "ERROR": "正しいメールアドレスを入力してください." }, "PHONE_NUMBER": { "PLACEHOLDER": "連絡先の電話番号を入力してください", diff --git a/app/javascript/dashboard/i18n/locale/ja/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ja/inboxMgmt.json index 1aa3f28a2..f3bbecfc4 100644 --- a/app/javascript/dashboard/i18n/locale/ja/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/ja/inboxMgmt.json @@ -30,7 +30,8 @@ "ADD": { "CHANNEL_NAME": { "LABEL": "受信トレイ名", - "PLACEHOLDER": "Enter your inbox name (eg: Acme Inc)" + "PLACEHOLDER": "Enter your inbox name (eg: Acme Inc)", + "ERROR": "Please enter a valid inbox name" }, "WEBSITE_NAME": { "LABEL": "ウェブサイト名", @@ -82,7 +83,7 @@ }, "CHANNEL_GREETING_TOGGLE": { "LABEL": "チャンネルグリーティングを有効にする", - "HELP_TEXT": "Send a greeting message to the users when they starts the conversation.", + "HELP_TEXT": "Automatically send a greeting message when a new conversation is created.", "ENABLED": "有効です", "DISABLED": "無効です" }, @@ -97,7 +98,10 @@ "LABEL": "ウィジェットの色", "PLACEHOLDER": "ウィジェットで使用されている色を更新" }, - "SUBMIT_BUTTON": "受信トレイを作成" + "SUBMIT_BUTTON": "受信トレイを作成", + "API": { + "ERROR_MESSAGE": "We were not able to create a website channel, please try again" + } }, "TWILIO": { "TITLE": "Twilio SMS/WhatsApp Channel", @@ -193,6 +197,7 @@ "PROVIDERS": { "LABEL": "API Provider", "TWILIO": "Twilio", + "WHATSAPP_CLOUD": "WhatsApp Cloud", "360_DIALOG": "360Dialog" }, "INBOX_NAME": { @@ -205,13 +210,31 @@ "PLACEHOLDER": "送信先の電話番号を入力してください。", "ERROR": "正しい値を入力してください。電話番号は `+` 記号で始める必要があります。" }, + "PHONE_NUMBER_ID": { + "LABEL": "Phone number ID", + "PLACEHOLDER": "Please enter the Phone number ID obtained from Facebook developer dashboard.", + "ERROR": "Please enter a valid value." + }, + "BUSINESS_ACCOUNT_ID": { + "LABEL": "Business Account ID", + "PLACEHOLDER": "Please enter the Business Account ID obtained from Facebook developer dashboard.", + "ERROR": "Please enter a valid value." + }, + "WEBHOOK_VERIFY_TOKEN": { + "LABEL": "Webhook Verify Token", + "PLACEHOLDER": "Enter a verify token which you want to configure for facebook webhooks.", + "ERROR": "Please enter a valid value." + }, "API_KEY": { "LABEL": "API key", "SUBTITLE": "Configure the WhatsApp API key.", "PLACEHOLDER": "API key", - "APPLY_FOR_ACCESS": "Don't have any API key? Apply for access here", "ERROR": "Please enter a valid value." }, + "API_CALLBACK": { + "TITLE": "コールバック URL", + "SUBTITLE": "You have to configure the webhook URL in facebook developer portal with the URL mentioned here." + }, "SUBMIT_BUTTON": "Create WhatsApp Channel", "API": { "ERROR_MESSAGE": "We were not able to save the WhatsApp channel" @@ -298,7 +321,7 @@ }, "AUTH": { "TITLE": "Choose a channel", - "DESC": "Chatwoot supports live-chat widget, Facebook page, Twitter profile, WhatsApp, Email etc., as channels. If you want to build a custom channel, you can create it using the API channel. Select one channel from the options below to proceed." + "DESC": "Chatwoot supports live-chat widgets, Facebook Messenger, Twitter profiles, WhatsApp, Emails, etc., as channels. If you want to build a custom channel, you can create it using the API channel. To get started, choose one of the channels below." }, "AGENTS": { "TITLE": "担当者", @@ -339,7 +362,7 @@ "API": { "SUCCESS_MESSAGE": "受信トレイの設定が正常に更新されました", "AUTO_ASSIGNMENT_SUCCESS_MESSAGE": "自動割り当ての更新に成功しました", - "ERROR_MESSAGE": "ウィジェットの色を更新できませんでした。後でもう一度お試しください" + "ERROR_MESSAGE": "We couldn't update inbox settings. Please try again later." }, "EMAIL_COLLECT_BOX": { "ENABLED": "有効です", @@ -412,15 +435,22 @@ "INBOX_UPDATE_SUB_TEXT": "受信トレイの設定を更新する", "AUTO_ASSIGNMENT_SUB_TEXT": "この受信トレイに追加された担当者への新しい会話の自動割り当てを有効または無効にします。", "HMAC_VERIFICATION": "User Identity Validation", - "HMAC_DESCRIPTION": "Inorder to validate the user's identity, the SDK allows you to pass an `identifier_hash` for each user. You can generate HMAC using 'sha256' with the key shown here.", + "HMAC_DESCRIPTION": "In order to validate the user's identity, you can pass an `identifier_hash` for each user. You can generate a HMAC sha256 hash using the `identifier` with the key shown here.", "HMAC_MANDATORY_VERIFICATION": "Enforce User Identity Validation", - "HMAC_MANDATORY_DESCRIPTION": "If enabled, Chatwoot SDKs setUser method will not work unless the `identifier_hash` is provided for each user.", + "HMAC_MANDATORY_DESCRIPTION": "If enabled, requests missing the `identifier_hash` will be rejected.", "INBOX_IDENTIFIER": "Inbox Identifier", "INBOX_IDENTIFIER_SUB_TEXT": "Use the `inbox_identifier` token shown here to authentication your API clients.", "FORWARD_EMAIL_TITLE": "Forward to Email", "FORWARD_EMAIL_SUB_TEXT": "以下のメールアドレスにメールを転送します。", "ALLOW_MESSAGES_AFTER_RESOLVED": "Allow messages after conversation resolved", - "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Allow the end-users to send messages even after the conversation is resolved." + "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Allow the end-users to send messages even after the conversation is resolved.", + "WHATSAPP_SECTION_SUBHEADER": "This API Key is used for the integration with the WhatsApp APIs.", + "WHATSAPP_SECTION_TITLE": "API Key" + }, + "AUTO_ASSIGNMENT": { + "MAX_ASSIGNMENT_LIMIT": "Auto assignment limit", + "MAX_ASSIGNMENT_LIMIT_RANGE_ERROR": "Please enter a value greater than 0", + "MAX_ASSIGNMENT_LIMIT_SUB_TEXT": "Limit the maximum number of conversations from this inbox that can be auto assigned to an agent" }, "FACEBOOK_REAUTHORIZE": { "TITLE": "再認証", diff --git a/app/javascript/dashboard/i18n/locale/ja/report.json b/app/javascript/dashboard/i18n/locale/ja/report.json index 14475a5b5..e9ce752ce 100644 --- a/app/javascript/dashboard/i18n/locale/ja/report.json +++ b/app/javascript/dashboard/i18n/locale/ja/report.json @@ -65,6 +65,7 @@ "PLACEHOLDER": "Select date range" }, "GROUP_BY_FILTER_DROPDOWN_LABEL": "Group By", + "DURATION_FILTER_LABEL": "Duration", "GROUP_BY_DAY_OPTIONS": [ { "id": 1, diff --git a/app/javascript/dashboard/i18n/locale/ko/bulkActions.json b/app/javascript/dashboard/i18n/locale/ko/bulkActions.json index 2ec3b87be..ee83d0d2a 100644 --- a/app/javascript/dashboard/i18n/locale/ko/bulkActions.json +++ b/app/javascript/dashboard/i18n/locale/ko/bulkActions.json @@ -1,17 +1,29 @@ { - "BULK_ACTION": { - "CONVERSATIONS_SELECTED": "%{conversationCount} conversations selected", - "AGENT_SELECT_LABEL": "에이전트 선택", - "ASSIGN_CONFIRMATION_LABEL": "Are you sure you want to assign %{conversationCount} %{conversationLabel} to", - "GO_BACK_LABEL": "Go back", - "ASSIGN_LABEL": "할당하다", - "ASSIGN_AGENT_TOOLTIP": "Assign Agent", - "RESOLVE_TOOLTIP": "해결함", - "ASSIGN_SUCCESFUL": "Conversations assigned successfully", - "ASSIGN_FAILED": "Failed to assign conversations, please try again", - "RESOLVE_SUCCESFUL": "Conversations resolved successfully", - "RESOLVE_FAILED": "Failed to resolve conversations, please try again", - "ALL_CONVERSATIONS_SELECTED_ALERT": "Conversations visible on this page are only selected.", - "AGENT_LIST_LOADING": "Loading Agents" + "BULK_ACTION": { + "CONVERSATIONS_SELECTED": "%{conversationCount} conversations selected", + "AGENT_SELECT_LABEL": "에이전트 선택", + "ASSIGN_CONFIRMATION_LABEL": "Are you sure you want to assign %{conversationCount} %{conversationLabel} to", + "GO_BACK_LABEL": "Go back", + "ASSIGN_LABEL": "할당하다", + "ASSIGN_AGENT_TOOLTIP": "Assign Agent", + "ASSIGN_SUCCESFUL": "Conversations assigned successfully", + "ASSIGN_FAILED": "Failed to assign conversations, please try again", + "RESOLVE_SUCCESFUL": "Conversations resolved successfully", + "RESOLVE_FAILED": "Failed to resolve conversations, please try again", + "ALL_CONVERSATIONS_SELECTED_ALERT": "Conversations visible on this page are only selected.", + "AGENT_LIST_LOADING": "Loading Agents", + "UPDATE": { + "CHANGE_STATUS": "Change status", + "SNOOZE_UNTIL_NEXT_REPLY": "Snooze until next reply", + "UPDATE_SUCCESFUL": "Conversation status updated successfully.", + "UPDATE_FAILED": "Failed to update conversations, please try again" + }, + "LABELS": { + "ASSIGN_LABELS": "Assign Labels", + "NO_LABELS_FOUND": "No labels found for", + "ASSIGN_SELECTED_LABELS": "Assign selected labels", + "ASSIGN_SUCCESFUL": "Labels assigned successfully", + "ASSIGN_FAILED": "Failed to assign labels, please try again" } + } } diff --git a/app/javascript/dashboard/i18n/locale/ko/contact.json b/app/javascript/dashboard/i18n/locale/ko/contact.json index 3c2ac7cab..220c83469 100644 --- a/app/javascript/dashboard/i18n/locale/ko/contact.json +++ b/app/javascript/dashboard/i18n/locale/ko/contact.json @@ -111,7 +111,8 @@ "EMAIL_ADDRESS": { "PLACEHOLDER": "연락처의 이메일 주소 입력", "LABEL": "이메일 주소", - "DUPLICATE": "이 이메일 주소는 다른 연락처에 사용 중입니다." + "DUPLICATE": "이 이메일 주소는 다른 연락처에 사용 중입니다.", + "ERROR": "Please enter a valid email address." }, "PHONE_NUMBER": { "PLACEHOLDER": "연락처의 전화 번호 입력", diff --git a/app/javascript/dashboard/i18n/locale/ko/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ko/inboxMgmt.json index 7b974a3e1..10c1db751 100644 --- a/app/javascript/dashboard/i18n/locale/ko/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/ko/inboxMgmt.json @@ -30,7 +30,8 @@ "ADD": { "CHANNEL_NAME": { "LABEL": "받은 메시지함 이름", - "PLACEHOLDER": "Enter your inbox name (eg: Acme Inc)" + "PLACEHOLDER": "Enter your inbox name (eg: Acme Inc)", + "ERROR": "Please enter a valid inbox name" }, "WEBSITE_NAME": { "LABEL": "웹사이트 이름", @@ -82,7 +83,7 @@ }, "CHANNEL_GREETING_TOGGLE": { "LABEL": "채널 인사말 사용", - "HELP_TEXT": "Send a greeting message to the users when they starts the conversation.", + "HELP_TEXT": "Automatically send a greeting message when a new conversation is created.", "ENABLED": "사용함", "DISABLED": "사용 안 함" }, @@ -97,7 +98,10 @@ "LABEL": "위젯 색깔", "PLACEHOLDER": "위젯에 사용된 위젯 색상 업데이트" }, - "SUBMIT_BUTTON": "받은 메시지함 만들기" + "SUBMIT_BUTTON": "받은 메시지함 만들기", + "API": { + "ERROR_MESSAGE": "We were not able to create a website channel, please try again" + } }, "TWILIO": { "TITLE": "Twilio SMS/WhatsApp Channel", @@ -193,6 +197,7 @@ "PROVIDERS": { "LABEL": "API Provider", "TWILIO": "Twilio", + "WHATSAPP_CLOUD": "WhatsApp Cloud", "360_DIALOG": "360Dialog" }, "INBOX_NAME": { @@ -205,13 +210,31 @@ "PLACEHOLDER": "메시지를 보낼 전화 번호를 입력하십시오.", "ERROR": "올바른 값을 입력하십시오. 전화번호는 + 기호로 시작해야 한다." }, + "PHONE_NUMBER_ID": { + "LABEL": "Phone number ID", + "PLACEHOLDER": "Please enter the Phone number ID obtained from Facebook developer dashboard.", + "ERROR": "Please enter a valid value." + }, + "BUSINESS_ACCOUNT_ID": { + "LABEL": "Business Account ID", + "PLACEHOLDER": "Please enter the Business Account ID obtained from Facebook developer dashboard.", + "ERROR": "Please enter a valid value." + }, + "WEBHOOK_VERIFY_TOKEN": { + "LABEL": "Webhook Verify Token", + "PLACEHOLDER": "Enter a verify token which you want to configure for facebook webhooks.", + "ERROR": "Please enter a valid value." + }, "API_KEY": { "LABEL": "API key", "SUBTITLE": "Configure the WhatsApp API key.", "PLACEHOLDER": "API key", - "APPLY_FOR_ACCESS": "Don't have any API key? Apply for access here", "ERROR": "Please enter a valid value." }, + "API_CALLBACK": { + "TITLE": "콜백 URL", + "SUBTITLE": "You have to configure the webhook URL in facebook developer portal with the URL mentioned here." + }, "SUBMIT_BUTTON": "Create WhatsApp Channel", "API": { "ERROR_MESSAGE": "We were not able to save the WhatsApp channel" @@ -298,7 +321,7 @@ }, "AUTH": { "TITLE": "Choose a channel", - "DESC": "Chatwoot supports live-chat widget, Facebook page, Twitter profile, WhatsApp, Email etc., as channels. If you want to build a custom channel, you can create it using the API channel. Select one channel from the options below to proceed." + "DESC": "Chatwoot supports live-chat widgets, Facebook Messenger, Twitter profiles, WhatsApp, Emails, etc., as channels. If you want to build a custom channel, you can create it using the API channel. To get started, choose one of the channels below." }, "AGENTS": { "TITLE": "에이전트", @@ -339,7 +362,7 @@ "API": { "SUCCESS_MESSAGE": "받은 메시지함 설정이 성공적으로 업데이트됨", "AUTO_ASSIGNMENT_SUCCESS_MESSAGE": "자동 할당 업데이트 완료", - "ERROR_MESSAGE": "위젯 색상을 업데이트할 수 없음. 나중에 다시 시도해 주십시오." + "ERROR_MESSAGE": "We couldn't update inbox settings. Please try again later." }, "EMAIL_COLLECT_BOX": { "ENABLED": "사용함", @@ -412,15 +435,22 @@ "INBOX_UPDATE_SUB_TEXT": "받은 메시지함 설정 업데이트", "AUTO_ASSIGNMENT_SUB_TEXT": "받은 메시지에 추가된 에이전트에 새 대화를 자동으로 할당하거나 할당하지 않도록 설정하십시오.", "HMAC_VERIFICATION": "사용자 신원 검증", - "HMAC_DESCRIPTION": "Inorder to validate the user's identity, the SDK allows you to pass an `identifier_hash` for each user. You can generate HMAC using 'sha256' with the key shown here.", + "HMAC_DESCRIPTION": "In order to validate the user's identity, you can pass an `identifier_hash` for each user. You can generate a HMAC sha256 hash using the `identifier` with the key shown here.", "HMAC_MANDATORY_VERIFICATION": "Enforce User Identity Validation", - "HMAC_MANDATORY_DESCRIPTION": "If enabled, Chatwoot SDKs setUser method will not work unless the `identifier_hash` is provided for each user.", + "HMAC_MANDATORY_DESCRIPTION": "If enabled, requests missing the `identifier_hash` will be rejected.", "INBOX_IDENTIFIER": "Inbox Identifier", "INBOX_IDENTIFIER_SUB_TEXT": "Use the `inbox_identifier` token shown here to authentication your API clients.", "FORWARD_EMAIL_TITLE": "Forward to Email", "FORWARD_EMAIL_SUB_TEXT": "당신의 이메일 주소로 이메일 전달을 시작하십시오.", "ALLOW_MESSAGES_AFTER_RESOLVED": "Allow messages after conversation resolved", - "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Allow the end-users to send messages even after the conversation is resolved." + "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Allow the end-users to send messages even after the conversation is resolved.", + "WHATSAPP_SECTION_SUBHEADER": "This API Key is used for the integration with the WhatsApp APIs.", + "WHATSAPP_SECTION_TITLE": "API Key" + }, + "AUTO_ASSIGNMENT": { + "MAX_ASSIGNMENT_LIMIT": "Auto assignment limit", + "MAX_ASSIGNMENT_LIMIT_RANGE_ERROR": "Please enter a value greater than 0", + "MAX_ASSIGNMENT_LIMIT_SUB_TEXT": "Limit the maximum number of conversations from this inbox that can be auto assigned to an agent" }, "FACEBOOK_REAUTHORIZE": { "TITLE": "재승인", diff --git a/app/javascript/dashboard/i18n/locale/ko/report.json b/app/javascript/dashboard/i18n/locale/ko/report.json index 24c3a2734..49abca501 100644 --- a/app/javascript/dashboard/i18n/locale/ko/report.json +++ b/app/javascript/dashboard/i18n/locale/ko/report.json @@ -65,6 +65,7 @@ "PLACEHOLDER": "Select date range" }, "GROUP_BY_FILTER_DROPDOWN_LABEL": "Group By", + "DURATION_FILTER_LABEL": "Duration", "GROUP_BY_DAY_OPTIONS": [ { "id": 1, diff --git a/app/javascript/dashboard/i18n/locale/lv/bulkActions.json b/app/javascript/dashboard/i18n/locale/lv/bulkActions.json index bfd688bef..7061e5e70 100644 --- a/app/javascript/dashboard/i18n/locale/lv/bulkActions.json +++ b/app/javascript/dashboard/i18n/locale/lv/bulkActions.json @@ -1,17 +1,29 @@ { - "BULK_ACTION": { - "CONVERSATIONS_SELECTED": "%{conversationCount} conversations selected", - "AGENT_SELECT_LABEL": "Select Agent", - "ASSIGN_CONFIRMATION_LABEL": "Are you sure you want to assign %{conversationCount} %{conversationLabel} to", - "GO_BACK_LABEL": "Go back", - "ASSIGN_LABEL": "Assign", - "ASSIGN_AGENT_TOOLTIP": "Assign Agent", - "RESOLVE_TOOLTIP": "Resolve", - "ASSIGN_SUCCESFUL": "Conversations assigned successfully", - "ASSIGN_FAILED": "Failed to assign conversations, please try again", - "RESOLVE_SUCCESFUL": "Conversations resolved successfully", - "RESOLVE_FAILED": "Failed to resolve conversations, please try again", - "ALL_CONVERSATIONS_SELECTED_ALERT": "Conversations visible on this page are only selected.", - "AGENT_LIST_LOADING": "Loading Agents" + "BULK_ACTION": { + "CONVERSATIONS_SELECTED": "%{conversationCount} conversations selected", + "AGENT_SELECT_LABEL": "Select Agent", + "ASSIGN_CONFIRMATION_LABEL": "Are you sure you want to assign %{conversationCount} %{conversationLabel} to", + "GO_BACK_LABEL": "Go back", + "ASSIGN_LABEL": "Assign", + "ASSIGN_AGENT_TOOLTIP": "Assign Agent", + "ASSIGN_SUCCESFUL": "Conversations assigned successfully", + "ASSIGN_FAILED": "Failed to assign conversations, please try again", + "RESOLVE_SUCCESFUL": "Conversations resolved successfully", + "RESOLVE_FAILED": "Failed to resolve conversations, please try again", + "ALL_CONVERSATIONS_SELECTED_ALERT": "Conversations visible on this page are only selected.", + "AGENT_LIST_LOADING": "Loading Agents", + "UPDATE": { + "CHANGE_STATUS": "Change status", + "SNOOZE_UNTIL_NEXT_REPLY": "Snooze until next reply", + "UPDATE_SUCCESFUL": "Conversation status updated successfully.", + "UPDATE_FAILED": "Failed to update conversations, please try again" + }, + "LABELS": { + "ASSIGN_LABELS": "Assign Labels", + "NO_LABELS_FOUND": "No labels found for", + "ASSIGN_SELECTED_LABELS": "Assign selected labels", + "ASSIGN_SUCCESFUL": "Labels assigned successfully", + "ASSIGN_FAILED": "Failed to assign labels, please try again" } + } } diff --git a/app/javascript/dashboard/i18n/locale/lv/contact.json b/app/javascript/dashboard/i18n/locale/lv/contact.json index 2257b4573..fa6bb6ce7 100644 --- a/app/javascript/dashboard/i18n/locale/lv/contact.json +++ b/app/javascript/dashboard/i18n/locale/lv/contact.json @@ -111,7 +111,8 @@ "EMAIL_ADDRESS": { "PLACEHOLDER": "Enter the email address of the contact", "LABEL": "Email Address", - "DUPLICATE": "This email address is in use for another contact." + "DUPLICATE": "This email address is in use for another contact.", + "ERROR": "Please enter a valid email address." }, "PHONE_NUMBER": { "PLACEHOLDER": "Enter the phone number of the contact", diff --git a/app/javascript/dashboard/i18n/locale/lv/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/lv/inboxMgmt.json index e9ee9c5b8..09f918351 100644 --- a/app/javascript/dashboard/i18n/locale/lv/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/lv/inboxMgmt.json @@ -30,7 +30,8 @@ "ADD": { "CHANNEL_NAME": { "LABEL": "Inbox Name", - "PLACEHOLDER": "Enter your inbox name (eg: Acme Inc)" + "PLACEHOLDER": "Enter your inbox name (eg: Acme Inc)", + "ERROR": "Please enter a valid inbox name" }, "WEBSITE_NAME": { "LABEL": "Website Name", @@ -82,7 +83,7 @@ }, "CHANNEL_GREETING_TOGGLE": { "LABEL": "Enable channel greeting", - "HELP_TEXT": "Send a greeting message to the users when they starts the conversation.", + "HELP_TEXT": "Automatically send a greeting message when a new conversation is created.", "ENABLED": "Enabled", "DISABLED": "Disabled" }, @@ -97,7 +98,10 @@ "LABEL": "Widget Color", "PLACEHOLDER": "Update the widget color used in widget" }, - "SUBMIT_BUTTON": "Create inbox" + "SUBMIT_BUTTON": "Create inbox", + "API": { + "ERROR_MESSAGE": "We were not able to create a website channel, please try again" + } }, "TWILIO": { "TITLE": "Twilio SMS/WhatsApp Channel", @@ -193,6 +197,7 @@ "PROVIDERS": { "LABEL": "API Provider", "TWILIO": "Twilio", + "WHATSAPP_CLOUD": "WhatsApp Cloud", "360_DIALOG": "360Dialog" }, "INBOX_NAME": { @@ -205,13 +210,31 @@ "PLACEHOLDER": "Please enter the phone number from which message will be sent.", "ERROR": "Please enter a valid value. Phone number should start with `+` sign." }, + "PHONE_NUMBER_ID": { + "LABEL": "Phone number ID", + "PLACEHOLDER": "Please enter the Phone number ID obtained from Facebook developer dashboard.", + "ERROR": "Please enter a valid value." + }, + "BUSINESS_ACCOUNT_ID": { + "LABEL": "Business Account ID", + "PLACEHOLDER": "Please enter the Business Account ID obtained from Facebook developer dashboard.", + "ERROR": "Please enter a valid value." + }, + "WEBHOOK_VERIFY_TOKEN": { + "LABEL": "Webhook Verify Token", + "PLACEHOLDER": "Enter a verify token which you want to configure for facebook webhooks.", + "ERROR": "Please enter a valid value." + }, "API_KEY": { "LABEL": "API key", "SUBTITLE": "Configure the WhatsApp API key.", "PLACEHOLDER": "API key", - "APPLY_FOR_ACCESS": "Don't have any API key? Apply for access here", "ERROR": "Please enter a valid value." }, + "API_CALLBACK": { + "TITLE": "Callback URL", + "SUBTITLE": "You have to configure the webhook URL in facebook developer portal with the URL mentioned here." + }, "SUBMIT_BUTTON": "Create WhatsApp Channel", "API": { "ERROR_MESSAGE": "We were not able to save the WhatsApp channel" @@ -298,7 +321,7 @@ }, "AUTH": { "TITLE": "Choose a channel", - "DESC": "Chatwoot supports live-chat widget, Facebook page, Twitter profile, WhatsApp, Email etc., as channels. If you want to build a custom channel, you can create it using the API channel. Select one channel from the options below to proceed." + "DESC": "Chatwoot supports live-chat widgets, Facebook Messenger, Twitter profiles, WhatsApp, Emails, etc., as channels. If you want to build a custom channel, you can create it using the API channel. To get started, choose one of the channels below." }, "AGENTS": { "TITLE": "Agents", @@ -339,7 +362,7 @@ "API": { "SUCCESS_MESSAGE": "Inbox settings updated successfully", "AUTO_ASSIGNMENT_SUCCESS_MESSAGE": "Auto assignment updated successfully", - "ERROR_MESSAGE": "Could not update widget color. Please try again later." + "ERROR_MESSAGE": "We couldn't update inbox settings. Please try again later." }, "EMAIL_COLLECT_BOX": { "ENABLED": "Enabled", @@ -412,15 +435,22 @@ "INBOX_UPDATE_SUB_TEXT": "Update your inbox settings", "AUTO_ASSIGNMENT_SUB_TEXT": "Enable or disable the automatic assignment of new conversations to the agents added to this inbox.", "HMAC_VERIFICATION": "User Identity Validation", - "HMAC_DESCRIPTION": "Inorder to validate the user's identity, the SDK allows you to pass an `identifier_hash` for each user. You can generate HMAC using 'sha256' with the key shown here.", + "HMAC_DESCRIPTION": "In order to validate the user's identity, you can pass an `identifier_hash` for each user. You can generate a HMAC sha256 hash using the `identifier` with the key shown here.", "HMAC_MANDATORY_VERIFICATION": "Enforce User Identity Validation", - "HMAC_MANDATORY_DESCRIPTION": "If enabled, Chatwoot SDKs setUser method will not work unless the `identifier_hash` is provided for each user.", + "HMAC_MANDATORY_DESCRIPTION": "If enabled, requests missing the `identifier_hash` will be rejected.", "INBOX_IDENTIFIER": "Inbox Identifier", "INBOX_IDENTIFIER_SUB_TEXT": "Use the `inbox_identifier` token shown here to authentication your API clients.", "FORWARD_EMAIL_TITLE": "Forward to Email", "FORWARD_EMAIL_SUB_TEXT": "Start forwarding your emails to the following email address.", "ALLOW_MESSAGES_AFTER_RESOLVED": "Allow messages after conversation resolved", - "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Allow the end-users to send messages even after the conversation is resolved." + "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Allow the end-users to send messages even after the conversation is resolved.", + "WHATSAPP_SECTION_SUBHEADER": "This API Key is used for the integration with the WhatsApp APIs.", + "WHATSAPP_SECTION_TITLE": "API Key" + }, + "AUTO_ASSIGNMENT": { + "MAX_ASSIGNMENT_LIMIT": "Auto assignment limit", + "MAX_ASSIGNMENT_LIMIT_RANGE_ERROR": "Please enter a value greater than 0", + "MAX_ASSIGNMENT_LIMIT_SUB_TEXT": "Limit the maximum number of conversations from this inbox that can be auto assigned to an agent" }, "FACEBOOK_REAUTHORIZE": { "TITLE": "Reauthorize", diff --git a/app/javascript/dashboard/i18n/locale/lv/report.json b/app/javascript/dashboard/i18n/locale/lv/report.json index 2388e913a..0bd9b544d 100644 --- a/app/javascript/dashboard/i18n/locale/lv/report.json +++ b/app/javascript/dashboard/i18n/locale/lv/report.json @@ -65,6 +65,7 @@ "PLACEHOLDER": "Select date range" }, "GROUP_BY_FILTER_DROPDOWN_LABEL": "Group By", + "DURATION_FILTER_LABEL": "Duration", "GROUP_BY_DAY_OPTIONS": [ { "id": 1, diff --git a/app/javascript/dashboard/i18n/locale/ml/bulkActions.json b/app/javascript/dashboard/i18n/locale/ml/bulkActions.json index 4ed56109e..74a4e54be 100644 --- a/app/javascript/dashboard/i18n/locale/ml/bulkActions.json +++ b/app/javascript/dashboard/i18n/locale/ml/bulkActions.json @@ -1,17 +1,29 @@ { - "BULK_ACTION": { - "CONVERSATIONS_SELECTED": "%{conversationCount} conversations selected", - "AGENT_SELECT_LABEL": "ഏജന്റ് തിരഞ്ഞെടുക്കുക", - "ASSIGN_CONFIRMATION_LABEL": "Are you sure you want to assign %{conversationCount} %{conversationLabel} to", - "GO_BACK_LABEL": "Go back", - "ASSIGN_LABEL": "നിയോഗിക്കുക", - "ASSIGN_AGENT_TOOLTIP": "Assign Agent", - "RESOLVE_TOOLTIP": "പരിഹരിക്കുക", - "ASSIGN_SUCCESFUL": "Conversations assigned successfully", - "ASSIGN_FAILED": "Failed to assign conversations, please try again", - "RESOLVE_SUCCESFUL": "Conversations resolved successfully", - "RESOLVE_FAILED": "Failed to resolve conversations, please try again", - "ALL_CONVERSATIONS_SELECTED_ALERT": "Conversations visible on this page are only selected.", - "AGENT_LIST_LOADING": "Loading Agents" + "BULK_ACTION": { + "CONVERSATIONS_SELECTED": "%{conversationCount} conversations selected", + "AGENT_SELECT_LABEL": "ഏജന്റ് തിരഞ്ഞെടുക്കുക", + "ASSIGN_CONFIRMATION_LABEL": "Are you sure you want to assign %{conversationCount} %{conversationLabel} to", + "GO_BACK_LABEL": "Go back", + "ASSIGN_LABEL": "നിയോഗിക്കുക", + "ASSIGN_AGENT_TOOLTIP": "Assign Agent", + "ASSIGN_SUCCESFUL": "Conversations assigned successfully", + "ASSIGN_FAILED": "Failed to assign conversations, please try again", + "RESOLVE_SUCCESFUL": "Conversations resolved successfully", + "RESOLVE_FAILED": "Failed to resolve conversations, please try again", + "ALL_CONVERSATIONS_SELECTED_ALERT": "Conversations visible on this page are only selected.", + "AGENT_LIST_LOADING": "Loading Agents", + "UPDATE": { + "CHANGE_STATUS": "Change status", + "SNOOZE_UNTIL_NEXT_REPLY": "Snooze until next reply", + "UPDATE_SUCCESFUL": "Conversation status updated successfully.", + "UPDATE_FAILED": "Failed to update conversations, please try again" + }, + "LABELS": { + "ASSIGN_LABELS": "Assign Labels", + "NO_LABELS_FOUND": "No labels found for", + "ASSIGN_SELECTED_LABELS": "Assign selected labels", + "ASSIGN_SUCCESFUL": "Labels assigned successfully", + "ASSIGN_FAILED": "Failed to assign labels, please try again" } + } } diff --git a/app/javascript/dashboard/i18n/locale/ml/contact.json b/app/javascript/dashboard/i18n/locale/ml/contact.json index 1ea1f75ee..d6522d772 100644 --- a/app/javascript/dashboard/i18n/locale/ml/contact.json +++ b/app/javascript/dashboard/i18n/locale/ml/contact.json @@ -111,7 +111,8 @@ "EMAIL_ADDRESS": { "PLACEHOLDER": "കോൺ‌ടാക്റ്റിന്റെ ഇമെയിൽ വിലാസം നൽകുക", "LABEL": "ഇമെയിൽ വിലാസം", - "DUPLICATE": "ഈ ഇമെയിൽ വിലാസം മറ്റൊരു കോൺ‌ടാക്റ്റിനായി ഉപയോഗത്തിലാണ്." + "DUPLICATE": "ഈ ഇമെയിൽ വിലാസം മറ്റൊരു കോൺ‌ടാക്റ്റിനായി ഉപയോഗത്തിലാണ്.", + "ERROR": "ദയവായി സാധുവായ ഒരു ഇമെയിൽ വിലാസം നൽകുക." }, "PHONE_NUMBER": { "PLACEHOLDER": "കോൺടാക്റ്റിന്റെ ഫോൺ നമ്പർ നൽകുക", diff --git a/app/javascript/dashboard/i18n/locale/ml/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ml/inboxMgmt.json index 76c9e0db5..fdcf4267c 100644 --- a/app/javascript/dashboard/i18n/locale/ml/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/ml/inboxMgmt.json @@ -30,7 +30,8 @@ "ADD": { "CHANNEL_NAME": { "LABEL": "ഇൻ‌ബോക്സ് നാമം", - "PLACEHOLDER": "Enter your inbox name (eg: Acme Inc)" + "PLACEHOLDER": "Enter your inbox name (eg: Acme Inc)", + "ERROR": "Please enter a valid inbox name" }, "WEBSITE_NAME": { "LABEL": "വെബ്‌സൈറ്റിന്റെ പേര്", @@ -82,7 +83,7 @@ }, "CHANNEL_GREETING_TOGGLE": { "LABEL": "ചാനൽ അഭിവാദ്യം പ്രവർത്തനക്ഷമമാക്കുക", - "HELP_TEXT": "Send a greeting message to the users when they starts the conversation.", + "HELP_TEXT": "Automatically send a greeting message when a new conversation is created.", "ENABLED": "പ്രവർത്തനക്ഷമമാക്കി", "DISABLED": "പ്രവർത്തനരഹിതമാക്കി" }, @@ -97,7 +98,10 @@ "LABEL": "വിജറ്റ് നിറം", "PLACEHOLDER": "വിജറ്റിൽ ഉപയോഗിച്ച വിജറ്റ് നിറം അപ്‌ഡേറ്റ് ചെയ്യുക" }, - "SUBMIT_BUTTON": "ഇൻ‌ബോക്സ് സൃഷ്ടിക്കുക" + "SUBMIT_BUTTON": "ഇൻ‌ബോക്സ് സൃഷ്ടിക്കുക", + "API": { + "ERROR_MESSAGE": "We were not able to create a website channel, please try again" + } }, "TWILIO": { "TITLE": "Twilio SMS/WhatsApp Channel", @@ -193,6 +197,7 @@ "PROVIDERS": { "LABEL": "API Provider", "TWILIO": "Twilio", + "WHATSAPP_CLOUD": "WhatsApp Cloud", "360_DIALOG": "360Dialog" }, "INBOX_NAME": { @@ -205,13 +210,31 @@ "PLACEHOLDER": "ദയവായി സന്ദേശം അയയ്‌ക്കുന്ന ഫോൺ നമ്പർ നൽകുക.", "ERROR": "ദയവായി സാധുവായ ഒരു ഫോൺ നമ്പർ നൽകുക. ഫോൺ നമ്പർ `+`ചിഹ്നത്തിൽ ആരംഭിക്കണം." }, + "PHONE_NUMBER_ID": { + "LABEL": "Phone number ID", + "PLACEHOLDER": "Please enter the Phone number ID obtained from Facebook developer dashboard.", + "ERROR": "Please enter a valid value." + }, + "BUSINESS_ACCOUNT_ID": { + "LABEL": "Business Account ID", + "PLACEHOLDER": "Please enter the Business Account ID obtained from Facebook developer dashboard.", + "ERROR": "Please enter a valid value." + }, + "WEBHOOK_VERIFY_TOKEN": { + "LABEL": "Webhook Verify Token", + "PLACEHOLDER": "Enter a verify token which you want to configure for facebook webhooks.", + "ERROR": "Please enter a valid value." + }, "API_KEY": { "LABEL": "API key", "SUBTITLE": "Configure the WhatsApp API key.", "PLACEHOLDER": "API key", - "APPLY_FOR_ACCESS": "Don't have any API key? Apply for access here", "ERROR": "Please enter a valid value." }, + "API_CALLBACK": { + "TITLE": "Callback URL", + "SUBTITLE": "You have to configure the webhook URL in facebook developer portal with the URL mentioned here." + }, "SUBMIT_BUTTON": "Create WhatsApp Channel", "API": { "ERROR_MESSAGE": "We were not able to save the WhatsApp channel" @@ -298,7 +321,7 @@ }, "AUTH": { "TITLE": "Choose a channel", - "DESC": "Chatwoot supports live-chat widget, Facebook page, Twitter profile, WhatsApp, Email etc., as channels. If you want to build a custom channel, you can create it using the API channel. Select one channel from the options below to proceed." + "DESC": "Chatwoot supports live-chat widgets, Facebook Messenger, Twitter profiles, WhatsApp, Emails, etc., as channels. If you want to build a custom channel, you can create it using the API channel. To get started, choose one of the channels below." }, "AGENTS": { "TITLE": "ഏജന്റുമാർ", @@ -339,7 +362,7 @@ "API": { "SUCCESS_MESSAGE": "വിജറ്റ് നിറം വിജയകരമായി അപ്‌ഡേറ്റു ചെയ്‌തു", "AUTO_ASSIGNMENT_SUCCESS_MESSAGE": "ഓട്ടോമാറ്റിക് അസൈൻമെന്റ് വിജയകരമായി അപ്‌ഡേറ്റുചെയ്‌തു", - "ERROR_MESSAGE": "വിജറ്റ് നിറം അപ്‌ഡേറ്റ് ചെയ്യാൻ കഴിഞ്ഞില്ല. ദയവായി പിന്നീട് വീണ്ടും ശ്രമിക്കുക." + "ERROR_MESSAGE": "We couldn't update inbox settings. Please try again later." }, "EMAIL_COLLECT_BOX": { "ENABLED": "പ്രവർത്തനക്ഷമമാക്കി", @@ -412,15 +435,22 @@ "INBOX_UPDATE_SUB_TEXT": "Update your inbox settings", "AUTO_ASSIGNMENT_SUB_TEXT": "പുതിയ സംഭാഷണങ്ങളിൽ ലഭ്യമായ ഏജന്റുമാരുടെ ഓട്ടോമാറ്റിക് അസൈൻമെന്റ് പ്രാപ്തമാക്കുകയോ അപ്രാപ്തമാക്കുകയോ ചെയ്യുക", "HMAC_VERIFICATION": "User Identity Validation", - "HMAC_DESCRIPTION": "Inorder to validate the user's identity, the SDK allows you to pass an `identifier_hash` for each user. You can generate HMAC using 'sha256' with the key shown here.", + "HMAC_DESCRIPTION": "In order to validate the user's identity, you can pass an `identifier_hash` for each user. You can generate a HMAC sha256 hash using the `identifier` with the key shown here.", "HMAC_MANDATORY_VERIFICATION": "Enforce User Identity Validation", - "HMAC_MANDATORY_DESCRIPTION": "If enabled, Chatwoot SDKs setUser method will not work unless the `identifier_hash` is provided for each user.", + "HMAC_MANDATORY_DESCRIPTION": "If enabled, requests missing the `identifier_hash` will be rejected.", "INBOX_IDENTIFIER": "Inbox Identifier", "INBOX_IDENTIFIER_SUB_TEXT": "Use the `inbox_identifier` token shown here to authentication your API clients.", "FORWARD_EMAIL_TITLE": "Forward to Email", "FORWARD_EMAIL_SUB_TEXT": "Start forwarding your emails to the following email address.", "ALLOW_MESSAGES_AFTER_RESOLVED": "സംഭാഷണം പരിഹരിച്ചതിന് ശേഷം സന്ദേശങ്ങൾ അനുവദിക്കുക", - "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "സംഭാഷണം പരിഹരിച്ചതിന് ശേഷവും സന്ദേശങ്ങൾ അയയ്ക്കാൻ അന്തിമ ഉപയോക്താക്കളെ അനുവദിക്കുക." + "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "സംഭാഷണം പരിഹരിച്ചതിന് ശേഷവും സന്ദേശങ്ങൾ അയയ്ക്കാൻ അന്തിമ ഉപയോക്താക്കളെ അനുവദിക്കുക.", + "WHATSAPP_SECTION_SUBHEADER": "This API Key is used for the integration with the WhatsApp APIs.", + "WHATSAPP_SECTION_TITLE": "API Key" + }, + "AUTO_ASSIGNMENT": { + "MAX_ASSIGNMENT_LIMIT": "Auto assignment limit", + "MAX_ASSIGNMENT_LIMIT_RANGE_ERROR": "Please enter a value greater than 0", + "MAX_ASSIGNMENT_LIMIT_SUB_TEXT": "Limit the maximum number of conversations from this inbox that can be auto assigned to an agent" }, "FACEBOOK_REAUTHORIZE": { "TITLE": "വീണ്ടും അംഗീകാരം നൽകുക", diff --git a/app/javascript/dashboard/i18n/locale/ml/report.json b/app/javascript/dashboard/i18n/locale/ml/report.json index 4afb8d383..fa23e9634 100644 --- a/app/javascript/dashboard/i18n/locale/ml/report.json +++ b/app/javascript/dashboard/i18n/locale/ml/report.json @@ -65,6 +65,7 @@ "PLACEHOLDER": "തീയതി ശ്രേണി തിരഞ്ഞെടുക്കുക" }, "GROUP_BY_FILTER_DROPDOWN_LABEL": "ഗ്രൂപ്പ് പ്രകാരം", + "DURATION_FILTER_LABEL": "Duration", "GROUP_BY_DAY_OPTIONS": [ { "id": 1, diff --git a/app/javascript/dashboard/i18n/locale/ne/bulkActions.json b/app/javascript/dashboard/i18n/locale/ne/bulkActions.json index bfd688bef..7061e5e70 100644 --- a/app/javascript/dashboard/i18n/locale/ne/bulkActions.json +++ b/app/javascript/dashboard/i18n/locale/ne/bulkActions.json @@ -1,17 +1,29 @@ { - "BULK_ACTION": { - "CONVERSATIONS_SELECTED": "%{conversationCount} conversations selected", - "AGENT_SELECT_LABEL": "Select Agent", - "ASSIGN_CONFIRMATION_LABEL": "Are you sure you want to assign %{conversationCount} %{conversationLabel} to", - "GO_BACK_LABEL": "Go back", - "ASSIGN_LABEL": "Assign", - "ASSIGN_AGENT_TOOLTIP": "Assign Agent", - "RESOLVE_TOOLTIP": "Resolve", - "ASSIGN_SUCCESFUL": "Conversations assigned successfully", - "ASSIGN_FAILED": "Failed to assign conversations, please try again", - "RESOLVE_SUCCESFUL": "Conversations resolved successfully", - "RESOLVE_FAILED": "Failed to resolve conversations, please try again", - "ALL_CONVERSATIONS_SELECTED_ALERT": "Conversations visible on this page are only selected.", - "AGENT_LIST_LOADING": "Loading Agents" + "BULK_ACTION": { + "CONVERSATIONS_SELECTED": "%{conversationCount} conversations selected", + "AGENT_SELECT_LABEL": "Select Agent", + "ASSIGN_CONFIRMATION_LABEL": "Are you sure you want to assign %{conversationCount} %{conversationLabel} to", + "GO_BACK_LABEL": "Go back", + "ASSIGN_LABEL": "Assign", + "ASSIGN_AGENT_TOOLTIP": "Assign Agent", + "ASSIGN_SUCCESFUL": "Conversations assigned successfully", + "ASSIGN_FAILED": "Failed to assign conversations, please try again", + "RESOLVE_SUCCESFUL": "Conversations resolved successfully", + "RESOLVE_FAILED": "Failed to resolve conversations, please try again", + "ALL_CONVERSATIONS_SELECTED_ALERT": "Conversations visible on this page are only selected.", + "AGENT_LIST_LOADING": "Loading Agents", + "UPDATE": { + "CHANGE_STATUS": "Change status", + "SNOOZE_UNTIL_NEXT_REPLY": "Snooze until next reply", + "UPDATE_SUCCESFUL": "Conversation status updated successfully.", + "UPDATE_FAILED": "Failed to update conversations, please try again" + }, + "LABELS": { + "ASSIGN_LABELS": "Assign Labels", + "NO_LABELS_FOUND": "No labels found for", + "ASSIGN_SELECTED_LABELS": "Assign selected labels", + "ASSIGN_SUCCESFUL": "Labels assigned successfully", + "ASSIGN_FAILED": "Failed to assign labels, please try again" } + } } diff --git a/app/javascript/dashboard/i18n/locale/ne/contact.json b/app/javascript/dashboard/i18n/locale/ne/contact.json index 0e716bed4..f0b3a9f36 100644 --- a/app/javascript/dashboard/i18n/locale/ne/contact.json +++ b/app/javascript/dashboard/i18n/locale/ne/contact.json @@ -111,7 +111,8 @@ "EMAIL_ADDRESS": { "PLACEHOLDER": "Enter the email address of the contact", "LABEL": "Email Address", - "DUPLICATE": "This email address is in use for another contact." + "DUPLICATE": "This email address is in use for another contact.", + "ERROR": "Please enter a valid email address." }, "PHONE_NUMBER": { "PLACEHOLDER": "Enter the phone number of the contact", diff --git a/app/javascript/dashboard/i18n/locale/ne/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ne/inboxMgmt.json index e9ee9c5b8..09f918351 100644 --- a/app/javascript/dashboard/i18n/locale/ne/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/ne/inboxMgmt.json @@ -30,7 +30,8 @@ "ADD": { "CHANNEL_NAME": { "LABEL": "Inbox Name", - "PLACEHOLDER": "Enter your inbox name (eg: Acme Inc)" + "PLACEHOLDER": "Enter your inbox name (eg: Acme Inc)", + "ERROR": "Please enter a valid inbox name" }, "WEBSITE_NAME": { "LABEL": "Website Name", @@ -82,7 +83,7 @@ }, "CHANNEL_GREETING_TOGGLE": { "LABEL": "Enable channel greeting", - "HELP_TEXT": "Send a greeting message to the users when they starts the conversation.", + "HELP_TEXT": "Automatically send a greeting message when a new conversation is created.", "ENABLED": "Enabled", "DISABLED": "Disabled" }, @@ -97,7 +98,10 @@ "LABEL": "Widget Color", "PLACEHOLDER": "Update the widget color used in widget" }, - "SUBMIT_BUTTON": "Create inbox" + "SUBMIT_BUTTON": "Create inbox", + "API": { + "ERROR_MESSAGE": "We were not able to create a website channel, please try again" + } }, "TWILIO": { "TITLE": "Twilio SMS/WhatsApp Channel", @@ -193,6 +197,7 @@ "PROVIDERS": { "LABEL": "API Provider", "TWILIO": "Twilio", + "WHATSAPP_CLOUD": "WhatsApp Cloud", "360_DIALOG": "360Dialog" }, "INBOX_NAME": { @@ -205,13 +210,31 @@ "PLACEHOLDER": "Please enter the phone number from which message will be sent.", "ERROR": "Please enter a valid value. Phone number should start with `+` sign." }, + "PHONE_NUMBER_ID": { + "LABEL": "Phone number ID", + "PLACEHOLDER": "Please enter the Phone number ID obtained from Facebook developer dashboard.", + "ERROR": "Please enter a valid value." + }, + "BUSINESS_ACCOUNT_ID": { + "LABEL": "Business Account ID", + "PLACEHOLDER": "Please enter the Business Account ID obtained from Facebook developer dashboard.", + "ERROR": "Please enter a valid value." + }, + "WEBHOOK_VERIFY_TOKEN": { + "LABEL": "Webhook Verify Token", + "PLACEHOLDER": "Enter a verify token which you want to configure for facebook webhooks.", + "ERROR": "Please enter a valid value." + }, "API_KEY": { "LABEL": "API key", "SUBTITLE": "Configure the WhatsApp API key.", "PLACEHOLDER": "API key", - "APPLY_FOR_ACCESS": "Don't have any API key? Apply for access here", "ERROR": "Please enter a valid value." }, + "API_CALLBACK": { + "TITLE": "Callback URL", + "SUBTITLE": "You have to configure the webhook URL in facebook developer portal with the URL mentioned here." + }, "SUBMIT_BUTTON": "Create WhatsApp Channel", "API": { "ERROR_MESSAGE": "We were not able to save the WhatsApp channel" @@ -298,7 +321,7 @@ }, "AUTH": { "TITLE": "Choose a channel", - "DESC": "Chatwoot supports live-chat widget, Facebook page, Twitter profile, WhatsApp, Email etc., as channels. If you want to build a custom channel, you can create it using the API channel. Select one channel from the options below to proceed." + "DESC": "Chatwoot supports live-chat widgets, Facebook Messenger, Twitter profiles, WhatsApp, Emails, etc., as channels. If you want to build a custom channel, you can create it using the API channel. To get started, choose one of the channels below." }, "AGENTS": { "TITLE": "Agents", @@ -339,7 +362,7 @@ "API": { "SUCCESS_MESSAGE": "Inbox settings updated successfully", "AUTO_ASSIGNMENT_SUCCESS_MESSAGE": "Auto assignment updated successfully", - "ERROR_MESSAGE": "Could not update widget color. Please try again later." + "ERROR_MESSAGE": "We couldn't update inbox settings. Please try again later." }, "EMAIL_COLLECT_BOX": { "ENABLED": "Enabled", @@ -412,15 +435,22 @@ "INBOX_UPDATE_SUB_TEXT": "Update your inbox settings", "AUTO_ASSIGNMENT_SUB_TEXT": "Enable or disable the automatic assignment of new conversations to the agents added to this inbox.", "HMAC_VERIFICATION": "User Identity Validation", - "HMAC_DESCRIPTION": "Inorder to validate the user's identity, the SDK allows you to pass an `identifier_hash` for each user. You can generate HMAC using 'sha256' with the key shown here.", + "HMAC_DESCRIPTION": "In order to validate the user's identity, you can pass an `identifier_hash` for each user. You can generate a HMAC sha256 hash using the `identifier` with the key shown here.", "HMAC_MANDATORY_VERIFICATION": "Enforce User Identity Validation", - "HMAC_MANDATORY_DESCRIPTION": "If enabled, Chatwoot SDKs setUser method will not work unless the `identifier_hash` is provided for each user.", + "HMAC_MANDATORY_DESCRIPTION": "If enabled, requests missing the `identifier_hash` will be rejected.", "INBOX_IDENTIFIER": "Inbox Identifier", "INBOX_IDENTIFIER_SUB_TEXT": "Use the `inbox_identifier` token shown here to authentication your API clients.", "FORWARD_EMAIL_TITLE": "Forward to Email", "FORWARD_EMAIL_SUB_TEXT": "Start forwarding your emails to the following email address.", "ALLOW_MESSAGES_AFTER_RESOLVED": "Allow messages after conversation resolved", - "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Allow the end-users to send messages even after the conversation is resolved." + "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Allow the end-users to send messages even after the conversation is resolved.", + "WHATSAPP_SECTION_SUBHEADER": "This API Key is used for the integration with the WhatsApp APIs.", + "WHATSAPP_SECTION_TITLE": "API Key" + }, + "AUTO_ASSIGNMENT": { + "MAX_ASSIGNMENT_LIMIT": "Auto assignment limit", + "MAX_ASSIGNMENT_LIMIT_RANGE_ERROR": "Please enter a value greater than 0", + "MAX_ASSIGNMENT_LIMIT_SUB_TEXT": "Limit the maximum number of conversations from this inbox that can be auto assigned to an agent" }, "FACEBOOK_REAUTHORIZE": { "TITLE": "Reauthorize", diff --git a/app/javascript/dashboard/i18n/locale/ne/report.json b/app/javascript/dashboard/i18n/locale/ne/report.json index 2388e913a..0bd9b544d 100644 --- a/app/javascript/dashboard/i18n/locale/ne/report.json +++ b/app/javascript/dashboard/i18n/locale/ne/report.json @@ -65,6 +65,7 @@ "PLACEHOLDER": "Select date range" }, "GROUP_BY_FILTER_DROPDOWN_LABEL": "Group By", + "DURATION_FILTER_LABEL": "Duration", "GROUP_BY_DAY_OPTIONS": [ { "id": 1, diff --git a/app/javascript/dashboard/i18n/locale/nl/bulkActions.json b/app/javascript/dashboard/i18n/locale/nl/bulkActions.json index 8f2df27fd..7061e5e70 100644 --- a/app/javascript/dashboard/i18n/locale/nl/bulkActions.json +++ b/app/javascript/dashboard/i18n/locale/nl/bulkActions.json @@ -1,17 +1,29 @@ { - "BULK_ACTION": { - "CONVERSATIONS_SELECTED": "%{conversationCount} conversations selected", - "AGENT_SELECT_LABEL": "Select Agent", - "ASSIGN_CONFIRMATION_LABEL": "Are you sure you want to assign %{conversationCount} %{conversationLabel} to", - "GO_BACK_LABEL": "Go back", - "ASSIGN_LABEL": "Assign", - "ASSIGN_AGENT_TOOLTIP": "Assign Agent", - "RESOLVE_TOOLTIP": "Oplossen", - "ASSIGN_SUCCESFUL": "Conversations assigned successfully", - "ASSIGN_FAILED": "Failed to assign conversations, please try again", - "RESOLVE_SUCCESFUL": "Conversations resolved successfully", - "RESOLVE_FAILED": "Failed to resolve conversations, please try again", - "ALL_CONVERSATIONS_SELECTED_ALERT": "Conversations visible on this page are only selected.", - "AGENT_LIST_LOADING": "Loading Agents" + "BULK_ACTION": { + "CONVERSATIONS_SELECTED": "%{conversationCount} conversations selected", + "AGENT_SELECT_LABEL": "Select Agent", + "ASSIGN_CONFIRMATION_LABEL": "Are you sure you want to assign %{conversationCount} %{conversationLabel} to", + "GO_BACK_LABEL": "Go back", + "ASSIGN_LABEL": "Assign", + "ASSIGN_AGENT_TOOLTIP": "Assign Agent", + "ASSIGN_SUCCESFUL": "Conversations assigned successfully", + "ASSIGN_FAILED": "Failed to assign conversations, please try again", + "RESOLVE_SUCCESFUL": "Conversations resolved successfully", + "RESOLVE_FAILED": "Failed to resolve conversations, please try again", + "ALL_CONVERSATIONS_SELECTED_ALERT": "Conversations visible on this page are only selected.", + "AGENT_LIST_LOADING": "Loading Agents", + "UPDATE": { + "CHANGE_STATUS": "Change status", + "SNOOZE_UNTIL_NEXT_REPLY": "Snooze until next reply", + "UPDATE_SUCCESFUL": "Conversation status updated successfully.", + "UPDATE_FAILED": "Failed to update conversations, please try again" + }, + "LABELS": { + "ASSIGN_LABELS": "Assign Labels", + "NO_LABELS_FOUND": "No labels found for", + "ASSIGN_SELECTED_LABELS": "Assign selected labels", + "ASSIGN_SUCCESFUL": "Labels assigned successfully", + "ASSIGN_FAILED": "Failed to assign labels, please try again" } + } } diff --git a/app/javascript/dashboard/i18n/locale/nl/contact.json b/app/javascript/dashboard/i18n/locale/nl/contact.json index 13b9ee127..89d742d2d 100644 --- a/app/javascript/dashboard/i18n/locale/nl/contact.json +++ b/app/javascript/dashboard/i18n/locale/nl/contact.json @@ -111,7 +111,8 @@ "EMAIL_ADDRESS": { "PLACEHOLDER": "Voer het e-mailadres van de contactpersoon in", "LABEL": "Uw e-mailadres", - "DUPLICATE": "Dit e-mailadres is reeds in gebruik voor een ander contact." + "DUPLICATE": "Dit e-mailadres is reeds in gebruik voor een ander contact.", + "ERROR": "Voer een geldig e-mailadres in." }, "PHONE_NUMBER": { "PLACEHOLDER": "Voer het telefoonnummer van de contactpersoon in", diff --git a/app/javascript/dashboard/i18n/locale/nl/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/nl/inboxMgmt.json index 52ee1e374..8e148051d 100644 --- a/app/javascript/dashboard/i18n/locale/nl/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/nl/inboxMgmt.json @@ -30,7 +30,8 @@ "ADD": { "CHANNEL_NAME": { "LABEL": "Inbox Name", - "PLACEHOLDER": "Enter your inbox name (eg: Acme Inc)" + "PLACEHOLDER": "Enter your inbox name (eg: Acme Inc)", + "ERROR": "Please enter a valid inbox name" }, "WEBSITE_NAME": { "LABEL": "Website naam", @@ -82,7 +83,7 @@ }, "CHANNEL_GREETING_TOGGLE": { "LABEL": "Enable channel greeting", - "HELP_TEXT": "Send a greeting message to the users when they starts the conversation.", + "HELP_TEXT": "Automatically send a greeting message when a new conversation is created.", "ENABLED": "Ingeschakeld", "DISABLED": "Uitgeschakeld" }, @@ -97,7 +98,10 @@ "LABEL": "Kleur van widget", "PLACEHOLDER": "Update de widget kleur gebruikt in widget" }, - "SUBMIT_BUTTON": "Postvak in maken" + "SUBMIT_BUTTON": "Postvak in maken", + "API": { + "ERROR_MESSAGE": "We were not able to create a website channel, please try again" + } }, "TWILIO": { "TITLE": "Twilio SMS/WhatsApp Channel", @@ -193,6 +197,7 @@ "PROVIDERS": { "LABEL": "API Provider", "TWILIO": "Twilio", + "WHATSAPP_CLOUD": "WhatsApp Cloud", "360_DIALOG": "360Dialog" }, "INBOX_NAME": { @@ -205,13 +210,31 @@ "PLACEHOLDER": "Voer het telefoonnummer in waaruit het bericht wordt verzonden.", "ERROR": "Voer een geldige waarde in. Telefoonnummer moet beginnen met `+` teken." }, + "PHONE_NUMBER_ID": { + "LABEL": "Phone number ID", + "PLACEHOLDER": "Please enter the Phone number ID obtained from Facebook developer dashboard.", + "ERROR": "Please enter a valid value." + }, + "BUSINESS_ACCOUNT_ID": { + "LABEL": "Business Account ID", + "PLACEHOLDER": "Please enter the Business Account ID obtained from Facebook developer dashboard.", + "ERROR": "Please enter a valid value." + }, + "WEBHOOK_VERIFY_TOKEN": { + "LABEL": "Webhook Verify Token", + "PLACEHOLDER": "Enter a verify token which you want to configure for facebook webhooks.", + "ERROR": "Please enter a valid value." + }, "API_KEY": { "LABEL": "API key", "SUBTITLE": "Configure the WhatsApp API key.", "PLACEHOLDER": "API key", - "APPLY_FOR_ACCESS": "Don't have any API key? Apply for access here", "ERROR": "Please enter a valid value." }, + "API_CALLBACK": { + "TITLE": "Callback URL", + "SUBTITLE": "You have to configure the webhook URL in facebook developer portal with the URL mentioned here." + }, "SUBMIT_BUTTON": "Create WhatsApp Channel", "API": { "ERROR_MESSAGE": "We were not able to save the WhatsApp channel" @@ -298,7 +321,7 @@ }, "AUTH": { "TITLE": "Choose a channel", - "DESC": "Chatwoot supports live-chat widget, Facebook page, Twitter profile, WhatsApp, Email etc., as channels. If you want to build a custom channel, you can create it using the API channel. Select one channel from the options below to proceed." + "DESC": "Chatwoot supports live-chat widgets, Facebook Messenger, Twitter profiles, WhatsApp, Emails, etc., as channels. If you want to build a custom channel, you can create it using the API channel. To get started, choose one of the channels below." }, "AGENTS": { "TITLE": "Agenten", @@ -339,7 +362,7 @@ "API": { "SUCCESS_MESSAGE": "Inbox instellingen succesvol bijgewerkt", "AUTO_ASSIGNMENT_SUCCESS_MESSAGE": "Automatische toewijzing succesvol bijgewerkt", - "ERROR_MESSAGE": "Kan de kleur van de widget niet bijwerken. Probeer het later opnieuw." + "ERROR_MESSAGE": "We couldn't update inbox settings. Please try again later." }, "EMAIL_COLLECT_BOX": { "ENABLED": "Ingeschakeld", @@ -412,15 +435,22 @@ "INBOX_UPDATE_SUB_TEXT": "Update uw inbox instellingen", "AUTO_ASSIGNMENT_SUB_TEXT": "In- of uitschakelen van de automatische toewijzing van nieuwe gesprekken aan de agenten die aan deze inbox zijn toegevoegd.", "HMAC_VERIFICATION": "User Identity Validation", - "HMAC_DESCRIPTION": "Inorder to validate the user's identity, the SDK allows you to pass an `identifier_hash` for each user. You can generate HMAC using 'sha256' with the key shown here.", + "HMAC_DESCRIPTION": "In order to validate the user's identity, you can pass an `identifier_hash` for each user. You can generate a HMAC sha256 hash using the `identifier` with the key shown here.", "HMAC_MANDATORY_VERIFICATION": "Enforce User Identity Validation", - "HMAC_MANDATORY_DESCRIPTION": "If enabled, Chatwoot SDKs setUser method will not work unless the `identifier_hash` is provided for each user.", + "HMAC_MANDATORY_DESCRIPTION": "If enabled, requests missing the `identifier_hash` will be rejected.", "INBOX_IDENTIFIER": "Inbox Identifier", "INBOX_IDENTIFIER_SUB_TEXT": "Use the `inbox_identifier` token shown here to authentication your API clients.", "FORWARD_EMAIL_TITLE": "Forward to Email", "FORWARD_EMAIL_SUB_TEXT": "Start forwarding your emails to the following email address.", "ALLOW_MESSAGES_AFTER_RESOLVED": "Allow messages after conversation resolved", - "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Allow the end-users to send messages even after the conversation is resolved." + "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Allow the end-users to send messages even after the conversation is resolved.", + "WHATSAPP_SECTION_SUBHEADER": "This API Key is used for the integration with the WhatsApp APIs.", + "WHATSAPP_SECTION_TITLE": "API Key" + }, + "AUTO_ASSIGNMENT": { + "MAX_ASSIGNMENT_LIMIT": "Auto assignment limit", + "MAX_ASSIGNMENT_LIMIT_RANGE_ERROR": "Please enter a value greater than 0", + "MAX_ASSIGNMENT_LIMIT_SUB_TEXT": "Limit the maximum number of conversations from this inbox that can be auto assigned to an agent" }, "FACEBOOK_REAUTHORIZE": { "TITLE": "Autoriseer", diff --git a/app/javascript/dashboard/i18n/locale/nl/report.json b/app/javascript/dashboard/i18n/locale/nl/report.json index ebb230146..1f8337af4 100644 --- a/app/javascript/dashboard/i18n/locale/nl/report.json +++ b/app/javascript/dashboard/i18n/locale/nl/report.json @@ -65,6 +65,7 @@ "PLACEHOLDER": "Select date range" }, "GROUP_BY_FILTER_DROPDOWN_LABEL": "Group By", + "DURATION_FILTER_LABEL": "Duration", "GROUP_BY_DAY_OPTIONS": [ { "id": 1, diff --git a/app/javascript/dashboard/i18n/locale/no/bulkActions.json b/app/javascript/dashboard/i18n/locale/no/bulkActions.json index 3b13324cd..04d00c929 100644 --- a/app/javascript/dashboard/i18n/locale/no/bulkActions.json +++ b/app/javascript/dashboard/i18n/locale/no/bulkActions.json @@ -1,17 +1,29 @@ { - "BULK_ACTION": { - "CONVERSATIONS_SELECTED": "%{conversationCount} conversations selected", - "AGENT_SELECT_LABEL": "Velg agent", - "ASSIGN_CONFIRMATION_LABEL": "Are you sure you want to assign %{conversationCount} %{conversationLabel} to", - "GO_BACK_LABEL": "Go back", - "ASSIGN_LABEL": "Tildel", - "ASSIGN_AGENT_TOOLTIP": "Assign Agent", - "RESOLVE_TOOLTIP": "Løs", - "ASSIGN_SUCCESFUL": "Conversations assigned successfully", - "ASSIGN_FAILED": "Failed to assign conversations, please try again", - "RESOLVE_SUCCESFUL": "Conversations resolved successfully", - "RESOLVE_FAILED": "Failed to resolve conversations, please try again", - "ALL_CONVERSATIONS_SELECTED_ALERT": "Conversations visible on this page are only selected.", - "AGENT_LIST_LOADING": "Loading Agents" + "BULK_ACTION": { + "CONVERSATIONS_SELECTED": "%{conversationCount} conversations selected", + "AGENT_SELECT_LABEL": "Velg agent", + "ASSIGN_CONFIRMATION_LABEL": "Are you sure you want to assign %{conversationCount} %{conversationLabel} to", + "GO_BACK_LABEL": "Go back", + "ASSIGN_LABEL": "Tildel", + "ASSIGN_AGENT_TOOLTIP": "Assign Agent", + "ASSIGN_SUCCESFUL": "Conversations assigned successfully", + "ASSIGN_FAILED": "Failed to assign conversations, please try again", + "RESOLVE_SUCCESFUL": "Conversations resolved successfully", + "RESOLVE_FAILED": "Failed to resolve conversations, please try again", + "ALL_CONVERSATIONS_SELECTED_ALERT": "Conversations visible on this page are only selected.", + "AGENT_LIST_LOADING": "Loading Agents", + "UPDATE": { + "CHANGE_STATUS": "Change status", + "SNOOZE_UNTIL_NEXT_REPLY": "Snooze until next reply", + "UPDATE_SUCCESFUL": "Conversation status updated successfully.", + "UPDATE_FAILED": "Failed to update conversations, please try again" + }, + "LABELS": { + "ASSIGN_LABELS": "Assign Labels", + "NO_LABELS_FOUND": "No labels found for", + "ASSIGN_SELECTED_LABELS": "Assign selected labels", + "ASSIGN_SUCCESFUL": "Labels assigned successfully", + "ASSIGN_FAILED": "Failed to assign labels, please try again" } + } } diff --git a/app/javascript/dashboard/i18n/locale/no/contact.json b/app/javascript/dashboard/i18n/locale/no/contact.json index b7ee0a1e8..9ef23b102 100644 --- a/app/javascript/dashboard/i18n/locale/no/contact.json +++ b/app/javascript/dashboard/i18n/locale/no/contact.json @@ -111,7 +111,8 @@ "EMAIL_ADDRESS": { "PLACEHOLDER": "Skriv inn e-postadressen til kontakten", "LABEL": "E-postadresse", - "DUPLICATE": "Denne e-postadressen er allerede i bruk av en annen kontakt." + "DUPLICATE": "Denne e-postadressen er allerede i bruk av en annen kontakt.", + "ERROR": "Vennligst skriv inn en gyldig e-postadresse." }, "PHONE_NUMBER": { "PLACEHOLDER": "Skriv inn telefonnummeret til kontakten", diff --git a/app/javascript/dashboard/i18n/locale/no/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/no/inboxMgmt.json index 16c744474..57f27d935 100644 --- a/app/javascript/dashboard/i18n/locale/no/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/no/inboxMgmt.json @@ -30,7 +30,8 @@ "ADD": { "CHANNEL_NAME": { "LABEL": "Navn på innboks", - "PLACEHOLDER": "Enter your inbox name (eg: Acme Inc)" + "PLACEHOLDER": "Enter your inbox name (eg: Acme Inc)", + "ERROR": "Please enter a valid inbox name" }, "WEBSITE_NAME": { "LABEL": "Nettstedsnavn", @@ -82,7 +83,7 @@ }, "CHANNEL_GREETING_TOGGLE": { "LABEL": "Aktiver kanalhilsen", - "HELP_TEXT": "Send a greeting message to the users when they starts the conversation.", + "HELP_TEXT": "Automatically send a greeting message when a new conversation is created.", "ENABLED": "Aktivert", "DISABLED": "Deaktivert" }, @@ -97,7 +98,10 @@ "LABEL": "Widget farge", "PLACEHOLDER": "Oppdater fargen brukt i widgeten" }, - "SUBMIT_BUTTON": "Opprett innboks" + "SUBMIT_BUTTON": "Opprett innboks", + "API": { + "ERROR_MESSAGE": "We were not able to create a website channel, please try again" + } }, "TWILIO": { "TITLE": "Twilio SMS/WhatsApp Channel", @@ -193,6 +197,7 @@ "PROVIDERS": { "LABEL": "API Provider", "TWILIO": "Twilio", + "WHATSAPP_CLOUD": "WhatsApp Cloud", "360_DIALOG": "360Dialog" }, "INBOX_NAME": { @@ -205,13 +210,31 @@ "PLACEHOLDER": "Vennligst angi telefonnummeret som meldinger skal sendes fra.", "ERROR": "Skriv inn en gyldig verdi. Telefonnummeret skal starte med `+`-tegn." }, + "PHONE_NUMBER_ID": { + "LABEL": "Phone number ID", + "PLACEHOLDER": "Please enter the Phone number ID obtained from Facebook developer dashboard.", + "ERROR": "Please enter a valid value." + }, + "BUSINESS_ACCOUNT_ID": { + "LABEL": "Business Account ID", + "PLACEHOLDER": "Please enter the Business Account ID obtained from Facebook developer dashboard.", + "ERROR": "Please enter a valid value." + }, + "WEBHOOK_VERIFY_TOKEN": { + "LABEL": "Webhook Verify Token", + "PLACEHOLDER": "Enter a verify token which you want to configure for facebook webhooks.", + "ERROR": "Please enter a valid value." + }, "API_KEY": { "LABEL": "API key", "SUBTITLE": "Configure the WhatsApp API key.", "PLACEHOLDER": "API key", - "APPLY_FOR_ACCESS": "Don't have any API key? Apply for access here", "ERROR": "Please enter a valid value." }, + "API_CALLBACK": { + "TITLE": "Callback URL", + "SUBTITLE": "You have to configure the webhook URL in facebook developer portal with the URL mentioned here." + }, "SUBMIT_BUTTON": "Create WhatsApp Channel", "API": { "ERROR_MESSAGE": "We were not able to save the WhatsApp channel" @@ -298,7 +321,7 @@ }, "AUTH": { "TITLE": "Choose a channel", - "DESC": "Chatwoot supports live-chat widget, Facebook page, Twitter profile, WhatsApp, Email etc., as channels. If you want to build a custom channel, you can create it using the API channel. Select one channel from the options below to proceed." + "DESC": "Chatwoot supports live-chat widgets, Facebook Messenger, Twitter profiles, WhatsApp, Emails, etc., as channels. If you want to build a custom channel, you can create it using the API channel. To get started, choose one of the channels below." }, "AGENTS": { "TITLE": "Agenter", @@ -339,7 +362,7 @@ "API": { "SUCCESS_MESSAGE": "Innboksinnstillinger ble oppdatert", "AUTO_ASSIGNMENT_SUCCESS_MESSAGE": "Autotildeling ble oppdatert", - "ERROR_MESSAGE": "Kunne ikke oppdatere widget-fargen. Prøv igjen senere." + "ERROR_MESSAGE": "We couldn't update inbox settings. Please try again later." }, "EMAIL_COLLECT_BOX": { "ENABLED": "Aktivert", @@ -412,15 +435,22 @@ "INBOX_UPDATE_SUB_TEXT": "Oppdater innboksinnstillinger", "AUTO_ASSIGNMENT_SUB_TEXT": "Aktiver eller deaktiver automatisk tildeling av nye samtaler til agenter som er lagt til i denne innboksen.", "HMAC_VERIFICATION": "Brukeridentitetsvalidering", - "HMAC_DESCRIPTION": "Inorder to validate the user's identity, the SDK allows you to pass an `identifier_hash` for each user. You can generate HMAC using 'sha256' with the key shown here.", + "HMAC_DESCRIPTION": "In order to validate the user's identity, you can pass an `identifier_hash` for each user. You can generate a HMAC sha256 hash using the `identifier` with the key shown here.", "HMAC_MANDATORY_VERIFICATION": "Enforce User Identity Validation", - "HMAC_MANDATORY_DESCRIPTION": "If enabled, Chatwoot SDKs setUser method will not work unless the `identifier_hash` is provided for each user.", + "HMAC_MANDATORY_DESCRIPTION": "If enabled, requests missing the `identifier_hash` will be rejected.", "INBOX_IDENTIFIER": "Inbox Identifier", "INBOX_IDENTIFIER_SUB_TEXT": "Use the `inbox_identifier` token shown here to authentication your API clients.", "FORWARD_EMAIL_TITLE": "Forward to Email", "FORWARD_EMAIL_SUB_TEXT": "Begynn å videresende e-post til følgende e-postadresse.", "ALLOW_MESSAGES_AFTER_RESOLVED": "Allow messages after conversation resolved", - "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Allow the end-users to send messages even after the conversation is resolved." + "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Allow the end-users to send messages even after the conversation is resolved.", + "WHATSAPP_SECTION_SUBHEADER": "This API Key is used for the integration with the WhatsApp APIs.", + "WHATSAPP_SECTION_TITLE": "API Key" + }, + "AUTO_ASSIGNMENT": { + "MAX_ASSIGNMENT_LIMIT": "Auto assignment limit", + "MAX_ASSIGNMENT_LIMIT_RANGE_ERROR": "Please enter a value greater than 0", + "MAX_ASSIGNMENT_LIMIT_SUB_TEXT": "Limit the maximum number of conversations from this inbox that can be auto assigned to an agent" }, "FACEBOOK_REAUTHORIZE": { "TITLE": "Reautoriser", diff --git a/app/javascript/dashboard/i18n/locale/no/report.json b/app/javascript/dashboard/i18n/locale/no/report.json index 4ddd7089b..cbb49f9e2 100644 --- a/app/javascript/dashboard/i18n/locale/no/report.json +++ b/app/javascript/dashboard/i18n/locale/no/report.json @@ -65,6 +65,7 @@ "PLACEHOLDER": "Select date range" }, "GROUP_BY_FILTER_DROPDOWN_LABEL": "Group By", + "DURATION_FILTER_LABEL": "Duration", "GROUP_BY_DAY_OPTIONS": [ { "id": 1, diff --git a/app/javascript/dashboard/i18n/locale/pl/bulkActions.json b/app/javascript/dashboard/i18n/locale/pl/bulkActions.json index f99d9e323..661e4161c 100644 --- a/app/javascript/dashboard/i18n/locale/pl/bulkActions.json +++ b/app/javascript/dashboard/i18n/locale/pl/bulkActions.json @@ -1,17 +1,29 @@ { - "BULK_ACTION": { - "CONVERSATIONS_SELECTED": "%{conversationCount} conversations selected", - "AGENT_SELECT_LABEL": "Wybierz Agenta", - "ASSIGN_CONFIRMATION_LABEL": "Are you sure you want to assign %{conversationCount} %{conversationLabel} to", - "GO_BACK_LABEL": "Go back", - "ASSIGN_LABEL": "Przypisz", - "ASSIGN_AGENT_TOOLTIP": "Assign Agent", - "RESOLVE_TOOLTIP": "Rozwiąż", - "ASSIGN_SUCCESFUL": "Conversations assigned successfully", - "ASSIGN_FAILED": "Failed to assign conversations, please try again", - "RESOLVE_SUCCESFUL": "Conversations resolved successfully", - "RESOLVE_FAILED": "Failed to resolve conversations, please try again", - "ALL_CONVERSATIONS_SELECTED_ALERT": "Conversations visible on this page are only selected.", - "AGENT_LIST_LOADING": "Loading Agents" + "BULK_ACTION": { + "CONVERSATIONS_SELECTED": "%{conversationCount} conversations selected", + "AGENT_SELECT_LABEL": "Wybierz Agenta", + "ASSIGN_CONFIRMATION_LABEL": "Are you sure you want to assign %{conversationCount} %{conversationLabel} to", + "GO_BACK_LABEL": "Go back", + "ASSIGN_LABEL": "Przypisz", + "ASSIGN_AGENT_TOOLTIP": "Assign Agent", + "ASSIGN_SUCCESFUL": "Conversations assigned successfully", + "ASSIGN_FAILED": "Failed to assign conversations, please try again", + "RESOLVE_SUCCESFUL": "Conversations resolved successfully", + "RESOLVE_FAILED": "Failed to resolve conversations, please try again", + "ALL_CONVERSATIONS_SELECTED_ALERT": "Conversations visible on this page are only selected.", + "AGENT_LIST_LOADING": "Loading Agents", + "UPDATE": { + "CHANGE_STATUS": "Change status", + "SNOOZE_UNTIL_NEXT_REPLY": "Snooze until next reply", + "UPDATE_SUCCESFUL": "Conversation status updated successfully.", + "UPDATE_FAILED": "Failed to update conversations, please try again" + }, + "LABELS": { + "ASSIGN_LABELS": "Assign Labels", + "NO_LABELS_FOUND": "No labels found for", + "ASSIGN_SELECTED_LABELS": "Assign selected labels", + "ASSIGN_SUCCESFUL": "Labels assigned successfully", + "ASSIGN_FAILED": "Failed to assign labels, please try again" } + } } diff --git a/app/javascript/dashboard/i18n/locale/pl/contact.json b/app/javascript/dashboard/i18n/locale/pl/contact.json index c215aae28..ca329f415 100644 --- a/app/javascript/dashboard/i18n/locale/pl/contact.json +++ b/app/javascript/dashboard/i18n/locale/pl/contact.json @@ -111,7 +111,8 @@ "EMAIL_ADDRESS": { "PLACEHOLDER": "Podaj adres e-mail kontaktu", "LABEL": "Adres e-mail", - "DUPLICATE": "Ten adres e-mail jest już zajęty przez inny kontakt." + "DUPLICATE": "Ten adres e-mail jest już zajęty przez inny kontakt.", + "ERROR": "Wprowadź poprawny adres e-mail." }, "PHONE_NUMBER": { "PLACEHOLDER": "Wprowadź numer telefonu kontaktu", diff --git a/app/javascript/dashboard/i18n/locale/pl/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/pl/inboxMgmt.json index e544a552f..69ecb76cc 100644 --- a/app/javascript/dashboard/i18n/locale/pl/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/pl/inboxMgmt.json @@ -30,7 +30,8 @@ "ADD": { "CHANNEL_NAME": { "LABEL": "Nazwa skrzynki odbiorczej", - "PLACEHOLDER": "Wprowadź nazwę skrzynki odbiorczej (np. Acme Inc)" + "PLACEHOLDER": "Wprowadź nazwę skrzynki odbiorczej (np. Acme Inc)", + "ERROR": "Please enter a valid inbox name" }, "WEBSITE_NAME": { "LABEL": "Nazwa strony", @@ -82,7 +83,7 @@ }, "CHANNEL_GREETING_TOGGLE": { "LABEL": "Włącz powitanie dla kanału", - "HELP_TEXT": "Wyślij wiadomość powitalną użytkownikowi, gdy rozpocznie rozmowę.", + "HELP_TEXT": "Automatically send a greeting message when a new conversation is created.", "ENABLED": "Włączone", "DISABLED": "Wyłączone" }, @@ -97,7 +98,10 @@ "LABEL": "Kolor widżetu", "PLACEHOLDER": "Aktualizuj kolor widżetu używany w widżecie" }, - "SUBMIT_BUTTON": "Utwórz skrzynkę odbiorczą" + "SUBMIT_BUTTON": "Utwórz skrzynkę odbiorczą", + "API": { + "ERROR_MESSAGE": "We were not able to create a website channel, please try again" + } }, "TWILIO": { "TITLE": "Kanał Twilio SMS/WhatsApp", @@ -193,6 +197,7 @@ "PROVIDERS": { "LABEL": "API Provider", "TWILIO": "Twilio", + "WHATSAPP_CLOUD": "WhatsApp Cloud", "360_DIALOG": "360Dialog" }, "INBOX_NAME": { @@ -205,13 +210,31 @@ "PLACEHOLDER": "Wprowadź numer telefonu, z którego zostanie wysłana wiadomość.", "ERROR": "Wprowadź prawidłową wartość. Numer telefonu powinien zaczynać się od znaku `+`." }, + "PHONE_NUMBER_ID": { + "LABEL": "Phone number ID", + "PLACEHOLDER": "Please enter the Phone number ID obtained from Facebook developer dashboard.", + "ERROR": "Please enter a valid value." + }, + "BUSINESS_ACCOUNT_ID": { + "LABEL": "Business Account ID", + "PLACEHOLDER": "Please enter the Business Account ID obtained from Facebook developer dashboard.", + "ERROR": "Please enter a valid value." + }, + "WEBHOOK_VERIFY_TOKEN": { + "LABEL": "Webhook Verify Token", + "PLACEHOLDER": "Enter a verify token which you want to configure for facebook webhooks.", + "ERROR": "Please enter a valid value." + }, "API_KEY": { "LABEL": "API key", "SUBTITLE": "Configure the WhatsApp API key.", "PLACEHOLDER": "API key", - "APPLY_FOR_ACCESS": "Don't have any API key? Apply for access here", "ERROR": "Please enter a valid value." }, + "API_CALLBACK": { + "TITLE": "Callback URL", + "SUBTITLE": "You have to configure the webhook URL in facebook developer portal with the URL mentioned here." + }, "SUBMIT_BUTTON": "Create WhatsApp Channel", "API": { "ERROR_MESSAGE": "We were not able to save the WhatsApp channel" @@ -298,7 +321,7 @@ }, "AUTH": { "TITLE": "Choose a channel", - "DESC": "Chatwoot supports live-chat widget, Facebook page, Twitter profile, WhatsApp, Email etc., as channels. If you want to build a custom channel, you can create it using the API channel. Select one channel from the options below to proceed." + "DESC": "Chatwoot supports live-chat widgets, Facebook Messenger, Twitter profiles, WhatsApp, Emails, etc., as channels. If you want to build a custom channel, you can create it using the API channel. To get started, choose one of the channels below." }, "AGENTS": { "TITLE": "Agenci", @@ -339,7 +362,7 @@ "API": { "SUCCESS_MESSAGE": "Ustawienia skrzynki odbiorczej zostały zaktualizowane", "AUTO_ASSIGNMENT_SUCCESS_MESSAGE": "Automatyczne przypisanie zaktualizowane pomyślnie", - "ERROR_MESSAGE": "Nie można zaktualizować koloru widżetu. Spróbuj ponownie później." + "ERROR_MESSAGE": "We couldn't update inbox settings. Please try again later." }, "EMAIL_COLLECT_BOX": { "ENABLED": "Włączone", @@ -412,15 +435,22 @@ "INBOX_UPDATE_SUB_TEXT": "Zaktualizuj ustawienia skrzynki odbiorczej", "AUTO_ASSIGNMENT_SUB_TEXT": "Włącz lub wyłącz automatyczne przypisywanie nowych rozmów do agentów dodanych do tej skrzynki odbiorczej.", "HMAC_VERIFICATION": "Weryfikacja tożsamości użytkownika", - "HMAC_DESCRIPTION": "Polecenie weryfikacji tożsamości użytkownika, SDK pozwala na przekazanie pliku `identifier_hash` dla każdego użytkownika. Możesz wygenerować HMAC używając 'sha256' z kluczem pokazanym tutaj.", + "HMAC_DESCRIPTION": "In order to validate the user's identity, you can pass an `identifier_hash` for each user. You can generate a HMAC sha256 hash using the `identifier` with the key shown here.", "HMAC_MANDATORY_VERIFICATION": "Wymuś sprawdzanie tożsamości użytkownika", - "HMAC_MANDATORY_DESCRIPTION": "Jeśli włączone, chatwoot SDKs setUser nie będzie działać, chyba że `identifier_hash` jest dostarczony dla każdego użytkownika.", + "HMAC_MANDATORY_DESCRIPTION": "If enabled, requests missing the `identifier_hash` will be rejected.", "INBOX_IDENTIFIER": "Identyfikator skrzynki odbiorczej", "INBOX_IDENTIFIER_SUB_TEXT": "Use the `inbox_identifier` token shown here to authentication your API clients.", "FORWARD_EMAIL_TITLE": "Przekaż do wiadomości e-mail", "FORWARD_EMAIL_SUB_TEXT": "Zacznij przekierowywać swoje wiadomości na następujący adres e-mail.", "ALLOW_MESSAGES_AFTER_RESOLVED": "Allow messages after conversation resolved", - "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Allow the end-users to send messages even after the conversation is resolved." + "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Allow the end-users to send messages even after the conversation is resolved.", + "WHATSAPP_SECTION_SUBHEADER": "This API Key is used for the integration with the WhatsApp APIs.", + "WHATSAPP_SECTION_TITLE": "Klucz API" + }, + "AUTO_ASSIGNMENT": { + "MAX_ASSIGNMENT_LIMIT": "Auto assignment limit", + "MAX_ASSIGNMENT_LIMIT_RANGE_ERROR": "Please enter a value greater than 0", + "MAX_ASSIGNMENT_LIMIT_SUB_TEXT": "Limit the maximum number of conversations from this inbox that can be auto assigned to an agent" }, "FACEBOOK_REAUTHORIZE": { "TITLE": "Ponowna autoryzacja", diff --git a/app/javascript/dashboard/i18n/locale/pl/report.json b/app/javascript/dashboard/i18n/locale/pl/report.json index c88a46795..59e8650c6 100644 --- a/app/javascript/dashboard/i18n/locale/pl/report.json +++ b/app/javascript/dashboard/i18n/locale/pl/report.json @@ -65,6 +65,7 @@ "PLACEHOLDER": "Select date range" }, "GROUP_BY_FILTER_DROPDOWN_LABEL": "Grupuj według", + "DURATION_FILTER_LABEL": "Duration", "GROUP_BY_DAY_OPTIONS": [ { "id": 1, diff --git a/app/javascript/dashboard/i18n/locale/pt/bulkActions.json b/app/javascript/dashboard/i18n/locale/pt/bulkActions.json index f2b4ed562..2335ac443 100644 --- a/app/javascript/dashboard/i18n/locale/pt/bulkActions.json +++ b/app/javascript/dashboard/i18n/locale/pt/bulkActions.json @@ -1,17 +1,29 @@ { - "BULK_ACTION": { - "CONVERSATIONS_SELECTED": "%{conversationCount} conversations selected", - "AGENT_SELECT_LABEL": "Escolher Agente", - "ASSIGN_CONFIRMATION_LABEL": "Are you sure you want to assign %{conversationCount} %{conversationLabel} to", - "GO_BACK_LABEL": "Go back", - "ASSIGN_LABEL": "Atribuir", - "ASSIGN_AGENT_TOOLTIP": "Assign Agent", - "RESOLVE_TOOLTIP": "Resolver", - "ASSIGN_SUCCESFUL": "Conversations assigned successfully", - "ASSIGN_FAILED": "Failed to assign conversations, please try again", - "RESOLVE_SUCCESFUL": "Conversations resolved successfully", - "RESOLVE_FAILED": "Failed to resolve conversations, please try again", - "ALL_CONVERSATIONS_SELECTED_ALERT": "Conversations visible on this page are only selected.", - "AGENT_LIST_LOADING": "Loading Agents" + "BULK_ACTION": { + "CONVERSATIONS_SELECTED": "%{conversationCount} conversations selected", + "AGENT_SELECT_LABEL": "Escolher Agente", + "ASSIGN_CONFIRMATION_LABEL": "Are you sure you want to assign %{conversationCount} %{conversationLabel} to", + "GO_BACK_LABEL": "Go back", + "ASSIGN_LABEL": "Atribuir", + "ASSIGN_AGENT_TOOLTIP": "Assign Agent", + "ASSIGN_SUCCESFUL": "Conversations assigned successfully", + "ASSIGN_FAILED": "Failed to assign conversations, please try again", + "RESOLVE_SUCCESFUL": "Conversations resolved successfully", + "RESOLVE_FAILED": "Failed to resolve conversations, please try again", + "ALL_CONVERSATIONS_SELECTED_ALERT": "Conversations visible on this page are only selected.", + "AGENT_LIST_LOADING": "Loading Agents", + "UPDATE": { + "CHANGE_STATUS": "Change status", + "SNOOZE_UNTIL_NEXT_REPLY": "Snooze until next reply", + "UPDATE_SUCCESFUL": "Conversation status updated successfully.", + "UPDATE_FAILED": "Failed to update conversations, please try again" + }, + "LABELS": { + "ASSIGN_LABELS": "Assign Labels", + "NO_LABELS_FOUND": "No labels found for", + "ASSIGN_SELECTED_LABELS": "Assign selected labels", + "ASSIGN_SUCCESFUL": "Labels assigned successfully", + "ASSIGN_FAILED": "Failed to assign labels, please try again" } + } } diff --git a/app/javascript/dashboard/i18n/locale/pt/contact.json b/app/javascript/dashboard/i18n/locale/pt/contact.json index 9ae54c705..4ed39091a 100644 --- a/app/javascript/dashboard/i18n/locale/pt/contact.json +++ b/app/javascript/dashboard/i18n/locale/pt/contact.json @@ -111,7 +111,8 @@ "EMAIL_ADDRESS": { "PLACEHOLDER": "Digite o endereço de e-mail do contato", "LABEL": "Endereço de e-mail", - "DUPLICATE": "Esse e-mail está a ser utilizado por outro contato." + "DUPLICATE": "Esse e-mail está a ser utilizado por outro contato.", + "ERROR": "Por favor, insira um endereço de e-mail válido." }, "PHONE_NUMBER": { "PLACEHOLDER": "Digite o número de telefone do contato", diff --git a/app/javascript/dashboard/i18n/locale/pt/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/pt/inboxMgmt.json index 036b9a5ef..d3f56c32e 100644 --- a/app/javascript/dashboard/i18n/locale/pt/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/pt/inboxMgmt.json @@ -30,7 +30,8 @@ "ADD": { "CHANNEL_NAME": { "LABEL": "Nome da Caixa de Entrada", - "PLACEHOLDER": "Digite o nome da caixa de entrada (ex: Informatico. pt)" + "PLACEHOLDER": "Digite o nome da caixa de entrada (ex: Informatico. pt)", + "ERROR": "Please enter a valid inbox name" }, "WEBSITE_NAME": { "LABEL": "Nome do site", @@ -82,7 +83,7 @@ }, "CHANNEL_GREETING_TOGGLE": { "LABEL": "Ativar mensagem de Boas-vindas do canal", - "HELP_TEXT": "Send a greeting message to the users when they starts the conversation.", + "HELP_TEXT": "Automatically send a greeting message when a new conversation is created.", "ENABLED": "Ativado", "DISABLED": "Desabilitado" }, @@ -97,7 +98,10 @@ "LABEL": "Cor do widget", "PLACEHOLDER": "Atualizar a cor do widget usada no widget" }, - "SUBMIT_BUTTON": "Criar caixa de entrada" + "SUBMIT_BUTTON": "Criar caixa de entrada", + "API": { + "ERROR_MESSAGE": "We were not able to create a website channel, please try again" + } }, "TWILIO": { "TITLE": "Twilio SMS/WhatsApp Channel", @@ -193,6 +197,7 @@ "PROVIDERS": { "LABEL": "API Provider", "TWILIO": "Twilio", + "WHATSAPP_CLOUD": "WhatsApp Cloud", "360_DIALOG": "360Dialog" }, "INBOX_NAME": { @@ -205,13 +210,31 @@ "PLACEHOLDER": "Por favor, insira o número de telefone do qual a mensagem será enviada.", "ERROR": "Por favor, insira um valor válido. O número de telefone deve começar com o sinal `+`." }, + "PHONE_NUMBER_ID": { + "LABEL": "Phone number ID", + "PLACEHOLDER": "Please enter the Phone number ID obtained from Facebook developer dashboard.", + "ERROR": "Por favor, insira um valor válido." + }, + "BUSINESS_ACCOUNT_ID": { + "LABEL": "Business Account ID", + "PLACEHOLDER": "Please enter the Business Account ID obtained from Facebook developer dashboard.", + "ERROR": "Por favor, insira um valor válido." + }, + "WEBHOOK_VERIFY_TOKEN": { + "LABEL": "Webhook Verify Token", + "PLACEHOLDER": "Enter a verify token which you want to configure for facebook webhooks.", + "ERROR": "Por favor, insira um valor válido." + }, "API_KEY": { "LABEL": "Chave da API", "SUBTITLE": "Configure a chave API do WhatsApp.", "PLACEHOLDER": "Chave da API", - "APPLY_FOR_ACCESS": "Não tem nenhuma chave de API? Solicite acesso aqui", "ERROR": "Por favor, insira um valor válido." }, + "API_CALLBACK": { + "TITLE": "Link de retorno de ligação", + "SUBTITLE": "You have to configure the webhook URL in facebook developer portal with the URL mentioned here." + }, "SUBMIT_BUTTON": "Criar Canal do WhatsApp", "API": { "ERROR_MESSAGE": "Não foi possível gravar o canal do WhatsApp" @@ -298,7 +321,7 @@ }, "AUTH": { "TITLE": "Escolher um canal", - "DESC": "O Chatwoot suporta o widget de chat ao vivo, página do Facebook, perfil do Twitter, WhatsApp, E-mail, etc., como canais. Se quiser criar um canal personalizado, poderá criá-lo usando o canal API. Selecione um canal entre as opções abaixo para prosseguir." + "DESC": "Chatwoot supports live-chat widgets, Facebook Messenger, Twitter profiles, WhatsApp, Emails, etc., as channels. If you want to build a custom channel, you can create it using the API channel. To get started, choose one of the channels below." }, "AGENTS": { "TITLE": "agentes", @@ -339,7 +362,7 @@ "API": { "SUCCESS_MESSAGE": "Configurações da caixa de entrada atualizadas com sucesso", "AUTO_ASSIGNMENT_SUCCESS_MESSAGE": "Atribuição automática atualizada com sucesso", - "ERROR_MESSAGE": "Não foi possível atualizar a cor do widget. Por favor, tente novamente mais tarde." + "ERROR_MESSAGE": "We couldn't update inbox settings. Please try again later." }, "EMAIL_COLLECT_BOX": { "ENABLED": "Ativado", @@ -412,15 +435,22 @@ "INBOX_UPDATE_SUB_TEXT": "Atualize suas configurações da caixa de entrada", "AUTO_ASSIGNMENT_SUB_TEXT": "Ativar ou desativar a atribuição automática de novas conversas aos agentes adicionados a essa caixa de entrada.", "HMAC_VERIFICATION": "Validação da identidade do utilizador", - "HMAC_DESCRIPTION": "Para validar a identidade dos utilizadores, através do SDK, basta utilizar um `identifier_hash` para cada um deles. Pode gerar um HMAC com base numa 'sha256' e a chave que aparece a seguir.", + "HMAC_DESCRIPTION": "In order to validate the user's identity, you can pass an `identifier_hash` for each user. You can generate a HMAC sha256 hash using the `identifier` with the key shown here.", "HMAC_MANDATORY_VERIFICATION": "Forçar Validação de Identidade do Usuário", - "HMAC_MANDATORY_DESCRIPTION": "If enabled, Chatwoot SDKs setUser method will not work unless the `identifier_hash` is provided for each user.", + "HMAC_MANDATORY_DESCRIPTION": "If enabled, requests missing the `identifier_hash` will be rejected.", "INBOX_IDENTIFIER": "Identificador da Caixa de Entrada", "INBOX_IDENTIFIER_SUB_TEXT": "Use the `inbox_identifier` token shown here to authentication your API clients.", "FORWARD_EMAIL_TITLE": "Encaminhar para Email", "FORWARD_EMAIL_SUB_TEXT": "Comece a encaminhar as suas mensagens de email para o seguinte endereço.", "ALLOW_MESSAGES_AFTER_RESOLVED": "Allow messages after conversation resolved", - "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Allow the end-users to send messages even after the conversation is resolved." + "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Allow the end-users to send messages even after the conversation is resolved.", + "WHATSAPP_SECTION_SUBHEADER": "This API Key is used for the integration with the WhatsApp APIs.", + "WHATSAPP_SECTION_TITLE": "Chave da API" + }, + "AUTO_ASSIGNMENT": { + "MAX_ASSIGNMENT_LIMIT": "Auto assignment limit", + "MAX_ASSIGNMENT_LIMIT_RANGE_ERROR": "Please enter a value greater than 0", + "MAX_ASSIGNMENT_LIMIT_SUB_TEXT": "Limit the maximum number of conversations from this inbox that can be auto assigned to an agent" }, "FACEBOOK_REAUTHORIZE": { "TITLE": "Reautorizar", diff --git a/app/javascript/dashboard/i18n/locale/pt/report.json b/app/javascript/dashboard/i18n/locale/pt/report.json index 0021dbd82..d1957abed 100644 --- a/app/javascript/dashboard/i18n/locale/pt/report.json +++ b/app/javascript/dashboard/i18n/locale/pt/report.json @@ -65,6 +65,7 @@ "PLACEHOLDER": "Escolher intervalo de tempo" }, "GROUP_BY_FILTER_DROPDOWN_LABEL": "Agrupar Por", + "DURATION_FILTER_LABEL": "Duration", "GROUP_BY_DAY_OPTIONS": [ { "id": 1, diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/advancedFilters.json b/app/javascript/dashboard/i18n/locale/pt_BR/advancedFilters.json index 229914f0a..dce657554 100644 --- a/app/javascript/dashboard/i18n/locale/pt_BR/advancedFilters.json +++ b/app/javascript/dashboard/i18n/locale/pt_BR/advancedFilters.json @@ -10,7 +10,7 @@ "EMPTY_VALUE_ERROR": "Valor obrigatório", "TOOLTIP_LABEL": "Filtrar conversas", "QUERY_DROPDOWN_LABELS": { - "AND": "OU", + "AND": "E", "OR": "ou" }, "OPERATOR_LABELS": { diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/automation.json b/app/javascript/dashboard/i18n/locale/pt_BR/automation.json index 5d67f894f..4bd1f730b 100644 --- a/app/javascript/dashboard/i18n/locale/pt_BR/automation.json +++ b/app/javascript/dashboard/i18n/locale/pt_BR/automation.json @@ -1,9 +1,9 @@ { "AUTOMATION": { - "HEADER": "Automatizações", + "HEADER": "Automação", "HEADER_BTN_TXT": "Adicionar regra de automação", "LOADING": "Buscando regras de automação", - "SIDEBAR_TXT": "

Regras de automação

A automação pode substituir e automatizar processos existentes que requerem esforço manual. Você pode fazer muitas coisas com automação, incluindo adicionar rótulos e atribuir a conversa ao melhor agente. Então, a equipe se concentra no que faz melhor e passa mais pouco tempo em tarefas manuais.

", + "SIDEBAR_TXT": "

Regras de automação

A automação pode substituir e automatizar processos existentes que requerem esforço manual. Você pode fazer muitas coisas com automação, incluindo adicionar marcadores e atribuir a conversa ao melhor agente. \n\nEntão, a equipe se concentra no que faz melhor e passa mais pouco tempo em tarefas manuais.

", "ADD": { "TITLE": "Adicionar regra de automação", "SUBMIT": "Criar", @@ -22,7 +22,7 @@ "EVENT": { "LABEL": "Evento", "PLACEHOLDER": "Por favor, selecione um", - "ERROR": "Evento é requerido" + "ERROR": "Evento é obrigatório" }, "CONDITIONS": { "LABEL": "Condições" diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/bulkActions.json b/app/javascript/dashboard/i18n/locale/pt_BR/bulkActions.json index 868fd40b3..f3f54ea9f 100644 --- a/app/javascript/dashboard/i18n/locale/pt_BR/bulkActions.json +++ b/app/javascript/dashboard/i18n/locale/pt_BR/bulkActions.json @@ -1,17 +1,29 @@ { - "BULK_ACTION": { - "CONVERSATIONS_SELECTED": "%{conversationCount} conversas selecionadas", - "AGENT_SELECT_LABEL": "Selecione Agente", - "ASSIGN_CONFIRMATION_LABEL": "Você tem certeza que deseja atribuir %{conversationCount} %{conversationLabel} para", - "GO_BACK_LABEL": "Voltar atrás", - "ASSIGN_LABEL": "Atribua", - "ASSIGN_AGENT_TOOLTIP": "Atribuir Agente", - "RESOLVE_TOOLTIP": "Resolver", - "ASSIGN_SUCCESFUL": "Conversas atribuídas com sucesso", - "ASSIGN_FAILED": "Falha ao atribuir conversas, por favor, tente novamente", - "RESOLVE_SUCCESFUL": "Conversas resolvidas com sucesso", - "RESOLVE_FAILED": "Falha ao resolver conversas, por favor, tente novamente", - "ALL_CONVERSATIONS_SELECTED_ALERT": "Conversas visíveis nesta página só estão selecionadas.", - "AGENT_LIST_LOADING": "Carregando agentes" + "BULK_ACTION": { + "CONVERSATIONS_SELECTED": "%{conversationCount} conversas selecionadas", + "AGENT_SELECT_LABEL": "Selecione Agente", + "ASSIGN_CONFIRMATION_LABEL": "Você tem certeza que deseja atribuir %{conversationCount} %{conversationLabel} para", + "GO_BACK_LABEL": "Voltar atrás", + "ASSIGN_LABEL": "Atribua", + "ASSIGN_AGENT_TOOLTIP": "Atribuir Agente", + "ASSIGN_SUCCESFUL": "Conversas atribuídas com sucesso", + "ASSIGN_FAILED": "Falha ao atribuir conversas, por favor, tente novamente", + "RESOLVE_SUCCESFUL": "Conversas resolvidas com sucesso", + "RESOLVE_FAILED": "Falha ao resolver conversas, por favor, tente novamente", + "ALL_CONVERSATIONS_SELECTED_ALERT": "Conversas visíveis nesta página só estão selecionadas.", + "AGENT_LIST_LOADING": "Carregando agentes", + "UPDATE": { + "CHANGE_STATUS": "Alterar status", + "SNOOZE_UNTIL_NEXT_REPLY": "Adiar até a próxima resposta", + "UPDATE_SUCCESFUL": "Status da conversa atualizado com sucesso.", + "UPDATE_FAILED": "Falha ao atualizar as conversas. Por favor, tente novamente" + }, + "LABELS": { + "ASSIGN_LABELS": "Atribuir rótulo", + "NO_LABELS_FOUND": "Não há rótulos encontrados para", + "ASSIGN_SELECTED_LABELS": "Atribuir rótulos selecionados", + "ASSIGN_SUCCESFUL": "Rótulos atribuídos com sucesso", + "ASSIGN_FAILED": "Falha ao atribuir rótulos, por favor, tente novamente" } + } } diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/contact.json b/app/javascript/dashboard/i18n/locale/pt_BR/contact.json index c7c8a9eeb..6ce0c8a00 100644 --- a/app/javascript/dashboard/i18n/locale/pt_BR/contact.json +++ b/app/javascript/dashboard/i18n/locale/pt_BR/contact.json @@ -111,7 +111,8 @@ "EMAIL_ADDRESS": { "PLACEHOLDER": "Insira o endereço de e-mail do contato", "LABEL": "Endereço de e-mail", - "DUPLICATE": "Esse endereço de e-mail já está sendo usado para outro contato." + "DUPLICATE": "Esse endereço de e-mail já está sendo usado para outro contato.", + "ERROR": "Por favor, insira um endereço de e-mail válido." }, "PHONE_NUMBER": { "PLACEHOLDER": "Adicione o número de telefone do contato", diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/pt_BR/inboxMgmt.json index f3ff32c77..332bc7485 100644 --- a/app/javascript/dashboard/i18n/locale/pt_BR/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/pt_BR/inboxMgmt.json @@ -30,7 +30,8 @@ "ADD": { "CHANNEL_NAME": { "LABEL": "Nome da Caixa de Entrada", - "PLACEHOLDER": "Digite o nome da caixa de entrada (ex: Acme Inc)" + "PLACEHOLDER": "Digite o nome da caixa de entrada (ex: Acme Inc)", + "ERROR": "Por favor, insira um nome completo válido" }, "WEBSITE_NAME": { "LABEL": "Nome do site", @@ -82,7 +83,7 @@ }, "CHANNEL_GREETING_TOGGLE": { "LABEL": "Ativar saudação do canal", - "HELP_TEXT": "Enviar uma mensagem de saudação aos usuários quando eles iniciarem a conversa.", + "HELP_TEXT": "Enviar automaticamente uma mensagem de saudação quando uma nova conversa é criada.", "ENABLED": "Ativado", "DISABLED": "Desativado" }, @@ -97,7 +98,10 @@ "LABEL": "Cor do Widget", "PLACEHOLDER": "Atualize a cor do widget" }, - "SUBMIT_BUTTON": "Criar caixa de entrada" + "SUBMIT_BUTTON": "Criar caixa de entrada", + "API": { + "ERROR_MESSAGE": "Não conseguimos criar um canal de site, por favor, tente novamente" + } }, "TWILIO": { "TITLE": "Canal Twilio SMS/WhatsApp", @@ -193,7 +197,8 @@ "PROVIDERS": { "LABEL": "API Provider", "TWILIO": "Twilio", - "360_DIALOG": "360Diálogo" + "WHATSAPP_CLOUD": "Cloud do WhatsApp", + "360_DIALOG": "360Dialog" }, "INBOX_NAME": { "LABEL": "Nome da Caixa de Entrada", @@ -205,13 +210,31 @@ "PLACEHOLDER": "Por favor, insira o número de telefone do qual a mensagem será enviada.", "ERROR": "Por favor, insira um valor válido. O número de telefone deve começar com o sinal `+`." }, + "PHONE_NUMBER_ID": { + "LABEL": "ID do número de telefone", + "PLACEHOLDER": "Por favor, insira o ID do número de telefone obtido do painel do desenvolvedor do Facebook.", + "ERROR": "Por favor, insira um valor válido." + }, + "BUSINESS_ACCOUNT_ID": { + "LABEL": "ID da Conta de Negócios", + "PLACEHOLDER": "Por favor, insira o ID da Conta de Negócios obtido do painel do desenvolvedor do Facebook.", + "ERROR": "Por favor, insira um valor válido." + }, + "WEBHOOK_VERIFY_TOKEN": { + "LABEL": "Token de verificação do Webhook", + "PLACEHOLDER": "Digite um token de verificação que você deseja configurar para webhooks do Facebook.", + "ERROR": "Por favor, insira um valor válido." + }, "API_KEY": { "LABEL": "Chave da API", "SUBTITLE": "Configure a chave API do WhatsApp.", "PLACEHOLDER": "Chave da API", - "APPLY_FOR_ACCESS": "Não tem nenhuma chave de API? ", "ERROR": "Por favor, insira um valor válido." }, + "API_CALLBACK": { + "TITLE": "URL de retorno", + "SUBTITLE": "Você tem que configurar a URL do webhook no portal de desenvolvedor do Facebook com a URL mencionada aqui." + }, "SUBMIT_BUTTON": "Criar canal do WhatsApp", "API": { "ERROR_MESSAGE": "Não foi possível salvar o canal do WhatsApp" @@ -298,7 +321,7 @@ }, "AUTH": { "TITLE": "Escolha um canal", - "DESC": "Suporte o widget de chat ao vivo, página do Facebook, perfil do Twitter, WhatsApp, E-mail, etc., como canais. Se você quiser criar um canal personalizado, você pode criá-lo usando o canal API. Selecione um canal entre as opções abaixo para prosseguir." + "DESC": "O Chatwoot suporta widgets de chats ao vivo, Facebook Messenger, perfis do Twitter, WhatsApp, E-mails, etc., como canais. Se você quiser criar um canal personalizado, você pode criá-lo usando o canal API. Para começar, escolha um dos canais abaixo." }, "AGENTS": { "TITLE": "Agentes", @@ -339,7 +362,7 @@ "API": { "SUCCESS_MESSAGE": "Configurações de caixa de entrada atualizadas com sucesso", "AUTO_ASSIGNMENT_SUCCESS_MESSAGE": "Agente atualizado com sucesso", - "ERROR_MESSAGE": "Não foi possível atualizar a cor do widget. Por favor, tente novamente mais tarde." + "ERROR_MESSAGE": "Não foi possível atualizar as configurações da caixa de entrada. Por favor, tente novamente mais tarde." }, "EMAIL_COLLECT_BOX": { "ENABLED": "Ativado", @@ -412,15 +435,22 @@ "INBOX_UPDATE_SUB_TEXT": "Atualize suas configurações de caixa de entrada", "AUTO_ASSIGNMENT_SUB_TEXT": "Ativar ou desativar a atribuição automática de novas conversas aos agentes adicionados a essa caixa de entrada.", "HMAC_VERIFICATION": "Validação de Identidade do Usuário", - "HMAC_DESCRIPTION": "Para validar a identidade do usuário, o SDK permite que você passe um `identifier_hash` para cada usuário. Você pode gerar HMAC usando 'sha256' com a chave mostrada aqui.", + "HMAC_DESCRIPTION": "Para validar a identidade do usuário, você pode passar um `identifier_hash` para cada usuário. Você pode gerar um hash HMAC sha256 usando o `identifier` com a chave mostrada aqui.", "HMAC_MANDATORY_VERIFICATION": "Forçar validação de identidade do usuário", - "HMAC_MANDATORY_DESCRIPTION": "Se habilitado, o método SDKs não funcionará a menos que o `identifier_hash` seja fornecido para cada usuário.", + "HMAC_MANDATORY_DESCRIPTION": "Se ativado, as solicitações sem o 'identifier_hash' serão rejeitadas.", "INBOX_IDENTIFIER": "Identificador da caixa de entrada", "INBOX_IDENTIFIER_SUB_TEXT": "Use o token 'inbox_identifier' mostrado aqui para autenticar os seus clientes API.", "FORWARD_EMAIL_TITLE": "Encaminhar para o E-mail", "FORWARD_EMAIL_SUB_TEXT": "Comece a encaminhar seus e-mails para o seguinte endereço de e-mail.", "ALLOW_MESSAGES_AFTER_RESOLVED": "Permitir mensagens após a resolução da conversa", - "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Permite que os usuários finais enviem mensagens mesmo depois que a conversa for resolvida." + "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Permite que os usuários finais enviem mensagens mesmo depois que a conversa for resolvida.", + "WHATSAPP_SECTION_SUBHEADER": "Esta chave de API é usada para a integração com as APIs do WhatsApp.", + "WHATSAPP_SECTION_TITLE": "Chave API" + }, + "AUTO_ASSIGNMENT": { + "MAX_ASSIGNMENT_LIMIT": "Limite de atribuição automática", + "MAX_ASSIGNMENT_LIMIT_RANGE_ERROR": "Por favor, insira um valor maior que 0", + "MAX_ASSIGNMENT_LIMIT_SUB_TEXT": "Limitar o número máximo de conversas desta caixa de entrada que pode ser atribuído automaticamente a um agente" }, "FACEBOOK_REAUTHORIZE": { "TITLE": "Reautorizar", diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/report.json b/app/javascript/dashboard/i18n/locale/pt_BR/report.json index ac7200c0c..e92887e7c 100644 --- a/app/javascript/dashboard/i18n/locale/pt_BR/report.json +++ b/app/javascript/dashboard/i18n/locale/pt_BR/report.json @@ -65,6 +65,7 @@ "PLACEHOLDER": "Selecionar intervalo de datas" }, "GROUP_BY_FILTER_DROPDOWN_LABEL": "Agrupar por", + "DURATION_FILTER_LABEL": "Duração", "GROUP_BY_DAY_OPTIONS": [ { "id": 1, diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/settings.json b/app/javascript/dashboard/i18n/locale/pt_BR/settings.json index 710afb5d1..ed53f32a7 100644 --- a/app/javascript/dashboard/i18n/locale/pt_BR/settings.json +++ b/app/javascript/dashboard/i18n/locale/pt_BR/settings.json @@ -21,7 +21,7 @@ }, "MESSAGE_SIGNATURE_SECTION": { "TITLE": "Assinatura de mensagens pessoais", - "NOTE": "Create a personal message signature that would be added to all the messages you send from your email inbox. Use the rich content editor to create a highly personalised signature.", + "NOTE": "Crie uma assinatura de mensagem pessoal que será adicionada a todas as mensagens enviadas a partir da sua caixa de entrada. Use o editor de conteúdo para criar uma assinatura altamente personalizada.", "BTN_TEXT": "Salvar assinatura da mensagem", "API_ERROR": "Não foi possível salvar a assinatura! Tente novamente", "API_SUCCESS": "Assinatura salva com sucesso" diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/whatsappTemplates.json b/app/javascript/dashboard/i18n/locale/pt_BR/whatsappTemplates.json index feeb37502..6b4fa57ab 100644 --- a/app/javascript/dashboard/i18n/locale/pt_BR/whatsappTemplates.json +++ b/app/javascript/dashboard/i18n/locale/pt_BR/whatsappTemplates.json @@ -10,7 +10,7 @@ "NO_TEMPLATES_FOUND": "Não há templates encontrados para", "LABELS": { "LANGUAGE": "Idioma", - "TEMPLATE_BODY": "Corpo do Template", + "TEMPLATE_BODY": "Conteúdo do Template", "CATEGORY": "Categoria" } }, diff --git a/app/javascript/dashboard/i18n/locale/ro/bulkActions.json b/app/javascript/dashboard/i18n/locale/ro/bulkActions.json index ba613d258..b1905e603 100644 --- a/app/javascript/dashboard/i18n/locale/ro/bulkActions.json +++ b/app/javascript/dashboard/i18n/locale/ro/bulkActions.json @@ -1,17 +1,29 @@ { - "BULK_ACTION": { - "CONVERSATIONS_SELECTED": "%{conversationCount} conversations selected", - "AGENT_SELECT_LABEL": "Selectează agent", - "ASSIGN_CONFIRMATION_LABEL": "Are you sure you want to assign %{conversationCount} %{conversationLabel} to", - "GO_BACK_LABEL": "Go back", - "ASSIGN_LABEL": "Atribuiți", - "ASSIGN_AGENT_TOOLTIP": "Assign Agent", - "RESOLVE_TOOLTIP": "Rezolvă", - "ASSIGN_SUCCESFUL": "Conversations assigned successfully", - "ASSIGN_FAILED": "Failed to assign conversations, please try again", - "RESOLVE_SUCCESFUL": "Conversations resolved successfully", - "RESOLVE_FAILED": "Failed to resolve conversations, please try again", - "ALL_CONVERSATIONS_SELECTED_ALERT": "Conversations visible on this page are only selected.", - "AGENT_LIST_LOADING": "Loading Agents" + "BULK_ACTION": { + "CONVERSATIONS_SELECTED": "%{conversationCount} conversations selected", + "AGENT_SELECT_LABEL": "Selectează agent", + "ASSIGN_CONFIRMATION_LABEL": "Are you sure you want to assign %{conversationCount} %{conversationLabel} to", + "GO_BACK_LABEL": "Go back", + "ASSIGN_LABEL": "Atribuiți", + "ASSIGN_AGENT_TOOLTIP": "Assign Agent", + "ASSIGN_SUCCESFUL": "Conversations assigned successfully", + "ASSIGN_FAILED": "Failed to assign conversations, please try again", + "RESOLVE_SUCCESFUL": "Conversations resolved successfully", + "RESOLVE_FAILED": "Failed to resolve conversations, please try again", + "ALL_CONVERSATIONS_SELECTED_ALERT": "Conversations visible on this page are only selected.", + "AGENT_LIST_LOADING": "Loading Agents", + "UPDATE": { + "CHANGE_STATUS": "Change status", + "SNOOZE_UNTIL_NEXT_REPLY": "Snooze until next reply", + "UPDATE_SUCCESFUL": "Conversation status updated successfully.", + "UPDATE_FAILED": "Failed to update conversations, please try again" + }, + "LABELS": { + "ASSIGN_LABELS": "Assign Labels", + "NO_LABELS_FOUND": "No labels found for", + "ASSIGN_SELECTED_LABELS": "Assign selected labels", + "ASSIGN_SUCCESFUL": "Labels assigned successfully", + "ASSIGN_FAILED": "Failed to assign labels, please try again" } + } } diff --git a/app/javascript/dashboard/i18n/locale/ro/contact.json b/app/javascript/dashboard/i18n/locale/ro/contact.json index 2bb6a438a..ce697ed1f 100644 --- a/app/javascript/dashboard/i18n/locale/ro/contact.json +++ b/app/javascript/dashboard/i18n/locale/ro/contact.json @@ -111,7 +111,8 @@ "EMAIL_ADDRESS": { "PLACEHOLDER": "Introduceți adresa de e-mail a persoanei de contact", "LABEL": "Adresa Email", - "DUPLICATE": "Această adresă de e-mail este folosită pentru un alt contact." + "DUPLICATE": "Această adresă de e-mail este folosită pentru un alt contact.", + "ERROR": "Vă rugăm să introduceți o adresă de e-mail validă." }, "PHONE_NUMBER": { "PLACEHOLDER": "Introduceți numărul de telefon al persoanei de contact", diff --git a/app/javascript/dashboard/i18n/locale/ro/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ro/inboxMgmt.json index 25f0335ac..c60570252 100644 --- a/app/javascript/dashboard/i18n/locale/ro/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/ro/inboxMgmt.json @@ -30,7 +30,8 @@ "ADD": { "CHANNEL_NAME": { "LABEL": "Nume Inbox", - "PLACEHOLDER": "Introduceți numele inboxului (de exemplu: Acme Inc)" + "PLACEHOLDER": "Introduceți numele inboxului (de exemplu: Acme Inc)", + "ERROR": "Please enter a valid inbox name" }, "WEBSITE_NAME": { "LABEL": "Nume website", @@ -82,7 +83,7 @@ }, "CHANNEL_GREETING_TOGGLE": { "LABEL": "Activare salut canal", - "HELP_TEXT": "Trimiteți un mesaj de salut utilizatorilor atunci când încep conversația.", + "HELP_TEXT": "Automatically send a greeting message when a new conversation is created.", "ENABLED": "Activat", "DISABLED": "Dezactivat" }, @@ -97,7 +98,10 @@ "LABEL": "Culoare widget", "PLACEHOLDER": "Actualizează culoarea folosită în widget" }, - "SUBMIT_BUTTON": "Crează inbox" + "SUBMIT_BUTTON": "Crează inbox", + "API": { + "ERROR_MESSAGE": "We were not able to create a website channel, please try again" + } }, "TWILIO": { "TITLE": "Twilio SMS/Canal WhatsApp", @@ -193,6 +197,7 @@ "PROVIDERS": { "LABEL": "Furnizor API", "TWILIO": "Twilio", + "WHATSAPP_CLOUD": "WhatsApp Cloud", "360_DIALOG": "360Dialog" }, "INBOX_NAME": { @@ -205,13 +210,31 @@ "PLACEHOLDER": "Introduceți numărul de telefon de la care va fi trimis mesajul.", "ERROR": "Introduceți o valoare validă. Numărul de telefon ar trebui să înceapă cu semnul `+`." }, + "PHONE_NUMBER_ID": { + "LABEL": "Phone number ID", + "PLACEHOLDER": "Please enter the Phone number ID obtained from Facebook developer dashboard.", + "ERROR": "Vă rugăm să introduceți o valoare validă." + }, + "BUSINESS_ACCOUNT_ID": { + "LABEL": "Business Account ID", + "PLACEHOLDER": "Please enter the Business Account ID obtained from Facebook developer dashboard.", + "ERROR": "Vă rugăm să introduceți o valoare validă." + }, + "WEBHOOK_VERIFY_TOKEN": { + "LABEL": "Webhook Verify Token", + "PLACEHOLDER": "Enter a verify token which you want to configure for facebook webhooks.", + "ERROR": "Vă rugăm să introduceți o valoare validă." + }, "API_KEY": { "LABEL": "Cheie API", "SUBTITLE": "Configurați cheia API WhatsApp.", "PLACEHOLDER": "Cheie API", - "APPLY_FOR_ACCESS": "Nu aveți nicio cheie API? Aplicați pentru acces aici", "ERROR": "Vă rugăm să introduceți o valoare validă." }, + "API_CALLBACK": { + "TITLE": "Callback URL", + "SUBTITLE": "You have to configure the webhook URL in facebook developer portal with the URL mentioned here." + }, "SUBMIT_BUTTON": "Creați canalul WhatsApp", "API": { "ERROR_MESSAGE": "Nu am reușit să salvăm canalul WhatsApp" @@ -298,7 +321,7 @@ }, "AUTH": { "TITLE": "Alege un canal", - "DESC": "Chatwoot acceptă widget live-chat, pagina de Facebook, profilul Twitter, WhatsApp, e-mail etc., ca și canale. Dacă doriți să construiți un canal personalizat, îl puteți crea folosind canalul API. Selectați un canal din opțiunile de mai jos pentru a continua." + "DESC": "Chatwoot supports live-chat widgets, Facebook Messenger, Twitter profiles, WhatsApp, Emails, etc., as channels. If you want to build a custom channel, you can create it using the API channel. To get started, choose one of the channels below." }, "AGENTS": { "TITLE": "Agenți", @@ -339,7 +362,7 @@ "API": { "SUCCESS_MESSAGE": "Setări Inbox actualizate cu succes", "AUTO_ASSIGNMENT_SUCCESS_MESSAGE": "Atribuire automată actualizată cu succes", - "ERROR_MESSAGE": "Nu s-a putut actualiza culoarea widgetului. Vă rugăm să încercați din nou mai târziu." + "ERROR_MESSAGE": "We couldn't update inbox settings. Please try again later." }, "EMAIL_COLLECT_BOX": { "ENABLED": "Activat", @@ -412,15 +435,22 @@ "INBOX_UPDATE_SUB_TEXT": "Actualizează setările de inbox", "AUTO_ASSIGNMENT_SUB_TEXT": "Activează sau dezactivează atribuirea automată a conversațiilor noi la agenții adăugați la această căsuță poștală.", "HMAC_VERIFICATION": "Validarea identității utilizatorului", - "HMAC_DESCRIPTION": "Pentru a valida identitatea utilizatorului, SDK-ul vă permite să treceți un \"identifier_hash\" pentru fiecare utilizator. Puteți genera HMAC folosind \"sha256\" cu cheia afișată aici.", + "HMAC_DESCRIPTION": "In order to validate the user's identity, you can pass an `identifier_hash` for each user. You can generate a HMAC sha256 hash using the `identifier` with the key shown here.", "HMAC_MANDATORY_VERIFICATION": "Impuneți validarea identității utilizatorului", - "HMAC_MANDATORY_DESCRIPTION": "Dacă este activată, metoda chatwoot SDK setUser nu va funcționa decât dacă \"identifier_hash\" este furnizată pentru fiecare utilizator.", + "HMAC_MANDATORY_DESCRIPTION": "If enabled, requests missing the `identifier_hash` will be rejected.", "INBOX_IDENTIFIER": "Identificator inbox", "INBOX_IDENTIFIER_SUB_TEXT": "Utilizați simbolul \"inbox_identifier\" afișat aici pentru a vă autentifica clienții API.", "FORWARD_EMAIL_TITLE": "Redirecționare către e-mail", "FORWARD_EMAIL_SUB_TEXT": "Începeți să vă trimiteți e-mailuri la următoarea adresă de e-mail.", "ALLOW_MESSAGES_AFTER_RESOLVED": "Permiteți rezolvarea mesajelor după ce conversația a fost rezolvată", - "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Permiteți utilizatorilor finali să trimită mesaje chiar și după rezolvarea conversației." + "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Permiteți utilizatorilor finali să trimită mesaje chiar și după rezolvarea conversației.", + "WHATSAPP_SECTION_SUBHEADER": "This API Key is used for the integration with the WhatsApp APIs.", + "WHATSAPP_SECTION_TITLE": "Cheie API" + }, + "AUTO_ASSIGNMENT": { + "MAX_ASSIGNMENT_LIMIT": "Auto assignment limit", + "MAX_ASSIGNMENT_LIMIT_RANGE_ERROR": "Please enter a value greater than 0", + "MAX_ASSIGNMENT_LIMIT_SUB_TEXT": "Limit the maximum number of conversations from this inbox that can be auto assigned to an agent" }, "FACEBOOK_REAUTHORIZE": { "TITLE": "Reautorizează", diff --git a/app/javascript/dashboard/i18n/locale/ro/report.json b/app/javascript/dashboard/i18n/locale/ro/report.json index 869db122c..8f153fd84 100644 --- a/app/javascript/dashboard/i18n/locale/ro/report.json +++ b/app/javascript/dashboard/i18n/locale/ro/report.json @@ -65,6 +65,7 @@ "PLACEHOLDER": "Selectarea intervalului de date" }, "GROUP_BY_FILTER_DROPDOWN_LABEL": "Nu sunt conversații active în acest grup.", + "DURATION_FILTER_LABEL": "Duration", "GROUP_BY_DAY_OPTIONS": [ { "id": 1, diff --git a/app/javascript/dashboard/i18n/locale/ru/agentMgmt.json b/app/javascript/dashboard/i18n/locale/ru/agentMgmt.json index 325f72b8b..b8347e3ef 100644 --- a/app/javascript/dashboard/i18n/locale/ru/agentMgmt.json +++ b/app/javascript/dashboard/i18n/locale/ru/agentMgmt.json @@ -95,7 +95,7 @@ "MULTI_SELECTOR": { "PLACEHOLDER": "Ничего", "TITLE": { - "AGENT": "Выберите агента", + "AGENT": "Выбрать Агента", "TEAM": "Выберите команду" }, "SEARCH": { diff --git a/app/javascript/dashboard/i18n/locale/ru/bulkActions.json b/app/javascript/dashboard/i18n/locale/ru/bulkActions.json index 0b6180a42..4256d17d8 100644 --- a/app/javascript/dashboard/i18n/locale/ru/bulkActions.json +++ b/app/javascript/dashboard/i18n/locale/ru/bulkActions.json @@ -1,17 +1,29 @@ { - "BULK_ACTION": { - "CONVERSATIONS_SELECTED": "%{conversationCount} бесед выбрано", - "AGENT_SELECT_LABEL": "Выбрать Агента", - "ASSIGN_CONFIRMATION_LABEL": "Вы уверены, что хотите назначить %{conversationCount} %{conversationLabel}", - "GO_BACK_LABEL": "Вернуться", - "ASSIGN_LABEL": "Назначить", - "ASSIGN_AGENT_TOOLTIP": "Назначенный оператор", - "RESOLVE_TOOLTIP": "Завершить", - "ASSIGN_SUCCESFUL": "Беседы успешно назначены", - "ASSIGN_FAILED": "Не удалось назначить беседы, попробуйте еще раз", - "RESOLVE_SUCCESFUL": "Беседы успешно завершены", - "RESOLVE_FAILED": "Не удалось завершить беседы, попробуйте еще раз", - "ALL_CONVERSATIONS_SELECTED_ALERT": "Беседы, видимые на этой странице, выбраны.", - "AGENT_LIST_LOADING": "Загрузка Операторов" + "BULK_ACTION": { + "CONVERSATIONS_SELECTED": "%{conversationCount} бесед выбрано", + "AGENT_SELECT_LABEL": "Выбрать Агента", + "ASSIGN_CONFIRMATION_LABEL": "Вы уверены, что хотите назначить %{conversationCount} %{conversationLabel}", + "GO_BACK_LABEL": "Вернуться", + "ASSIGN_LABEL": "Назначить", + "ASSIGN_AGENT_TOOLTIP": "Назначенный оператор", + "ASSIGN_SUCCESFUL": "Беседы успешно назначены", + "ASSIGN_FAILED": "Не удалось назначить беседы, попробуйте еще раз", + "RESOLVE_SUCCESFUL": "Беседы успешно завершены", + "RESOLVE_FAILED": "Не удалось завершить беседы, попробуйте еще раз", + "ALL_CONVERSATIONS_SELECTED_ALERT": "Беседы, видимые на этой странице, выбраны.", + "AGENT_LIST_LOADING": "Загрузка Операторов", + "UPDATE": { + "CHANGE_STATUS": "Изменить статус", + "SNOOZE_UNTIL_NEXT_REPLY": "Отложить до следующего ответа", + "UPDATE_SUCCESFUL": "Статус беседы успешно обновлен.", + "UPDATE_FAILED": "Не удалось обновить беседы, попробуйте еще раз" + }, + "LABELS": { + "ASSIGN_LABELS": "Назначить метки", + "NO_LABELS_FOUND": "Нет меток для", + "ASSIGN_SELECTED_LABELS": "Назначить выбранные метки", + "ASSIGN_SUCCESFUL": "Метки успешно назначены", + "ASSIGN_FAILED": "Не удалось присвоить метки, пожалуйста, попробуйте снова" } + } } diff --git a/app/javascript/dashboard/i18n/locale/ru/contact.json b/app/javascript/dashboard/i18n/locale/ru/contact.json index 79d522295..33c8fa1fe 100644 --- a/app/javascript/dashboard/i18n/locale/ru/contact.json +++ b/app/javascript/dashboard/i18n/locale/ru/contact.json @@ -111,7 +111,8 @@ "EMAIL_ADDRESS": { "PLACEHOLDER": "Введите email контакта", "LABEL": "Email", - "DUPLICATE": "Этот адрес электронной почты используется для другого контакта." + "DUPLICATE": "Этот адрес электронной почты используется для другого контакта.", + "ERROR": "Пожалуйста, введите действительный адрес электронной почты." }, "PHONE_NUMBER": { "PLACEHOLDER": "Введите номер телефона контакта", diff --git a/app/javascript/dashboard/i18n/locale/ru/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ru/inboxMgmt.json index 0eebc9430..04ab7cc7f 100644 --- a/app/javascript/dashboard/i18n/locale/ru/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/ru/inboxMgmt.json @@ -30,7 +30,8 @@ "ADD": { "CHANNEL_NAME": { "LABEL": "Имя источника", - "PLACEHOLDER": "Введите имя папки \"Входящие\" (например: Acme Inc)" + "PLACEHOLDER": "Введите имя папки \"Входящие\" (например: Acme Inc)", + "ERROR": "Пожалуйста, введите правильное имя" }, "WEBSITE_NAME": { "LABEL": "Имя сайта", @@ -82,7 +83,7 @@ }, "CHANNEL_GREETING_TOGGLE": { "LABEL": "Включить приветствие", - "HELP_TEXT": "Отправьте приветствие пользователю при начале диалога.", + "HELP_TEXT": "Автоматически отправлять приветственное сообщение при создании нового разговора.", "ENABLED": "Включено", "DISABLED": "Выключено" }, @@ -97,7 +98,10 @@ "LABEL": "Цвет виджета", "PLACEHOLDER": "Изменить цвет виджета" }, - "SUBMIT_BUTTON": "Создать источник" + "SUBMIT_BUTTON": "Создать источник", + "API": { + "ERROR_MESSAGE": "Не удалось создать канал сайта, попробуйте еще раз" + } }, "TWILIO": { "TITLE": "Twilio SMS/WhatsApp канал", @@ -193,6 +197,7 @@ "PROVIDERS": { "LABEL": "Поставщик API", "TWILIO": "Twilio", + "WHATSAPP_CLOUD": "WhatsApp Cloud", "360_DIALOG": "360Dialog" }, "INBOX_NAME": { @@ -205,13 +210,31 @@ "PLACEHOLDER": "Введите номер телефона, с которого будет отправлено сообщение.", "ERROR": "Пожалуйста, введите правильный номер телефона, начинающийся с «+»." }, + "PHONE_NUMBER_ID": { + "LABEL": "ID номера телефона", + "PLACEHOLDER": "Пожалуйста, введите номер телефона, полученный от Facebook разработчика панели управления.", + "ERROR": "Пожалуйста, введите правильное значение." + }, + "BUSINESS_ACCOUNT_ID": { + "LABEL": "ID бизнес-аккаунта", + "PLACEHOLDER": "Пожалуйста, введите ID Личного кабинета для разработчиков Facebook.", + "ERROR": "Пожалуйста, введите правильное значение." + }, + "WEBHOOK_VERIFY_TOKEN": { + "LABEL": "Вебхук верифицировать токен", + "PLACEHOLDER": "Введите контрольный токен, который вы хотите настроить для вебхуков Facebook.", + "ERROR": "Пожалуйста, введите правильное значение." + }, "API_KEY": { "LABEL": "Ключ API", "SUBTITLE": "Настройте ключ API WhatsApp.", "PLACEHOLDER": "Ключ API", - "APPLY_FOR_ACCESS": "У вас нет ключа API? Примените здесь", "ERROR": "Пожалуйста, введите правильное значение." }, + "API_CALLBACK": { + "TITLE": "URL", + "SUBTITLE": "Вы должны настроить URL webhook в портале разработчиков Facebook с URL-адресом, указанным здесь." + }, "SUBMIT_BUTTON": "Создать канал WhatsApp", "API": { "ERROR_MESSAGE": "Не удалось сохранить канал WhatsApp" @@ -339,7 +362,7 @@ "API": { "SUCCESS_MESSAGE": "Настройки источника сохранены", "AUTO_ASSIGNMENT_SUCCESS_MESSAGE": "Автоназначение сохранено", - "ERROR_MESSAGE": "Не удалось сохранить цвет виджета. Пожалуйста, повторите попытку позже." + "ERROR_MESSAGE": "Не удалось обновить настройки входящих сообщений. Пожалуйста, повторите попытку позже." }, "EMAIL_COLLECT_BOX": { "ENABLED": "Включено", @@ -414,13 +437,20 @@ "HMAC_VERIFICATION": "Проверка личности пользователя", "HMAC_DESCRIPTION": "Для проверки личности пользователя SDK предлагает вам передать параметр `identity_hash` для каждого пользователя. Вы можете сгенерировать HMAC с помощью шифрования методом 'sha256' с ключом, который указан ниже.", "HMAC_MANDATORY_VERIFICATION": "Принудительная проверка личности пользователя", - "HMAC_MANDATORY_DESCRIPTION": "Если включено, метод Chatwoot SDK setUser не будет работать до тех пор, пока для каждого пользователя не будет указан метод `identifier_hash`.", + "HMAC_MANDATORY_DESCRIPTION": "Если этот параметр включен, запросы на пропуск `identifier_hash` будут отклонены.", "INBOX_IDENTIFIER": "Идентификатор входящего канала", "INBOX_IDENTIFIER_SUB_TEXT": "Используйте токен `inbox_identifier` для аутентификации ваших клиентов API.", "FORWARD_EMAIL_TITLE": "Переслать на Email", "FORWARD_EMAIL_SUB_TEXT": "Начните пересылать свои письма на этот email.", "ALLOW_MESSAGES_AFTER_RESOLVED": "Разрешить отправлять сообщения после завершения разговора", - "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Разрешить пользователям отправлять сообщения даже после того, как разговор будет завершен." + "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Разрешить пользователям отправлять сообщения даже после того, как разговор будет завершен.", + "WHATSAPP_SECTION_SUBHEADER": "Этот ключ API используется для интеграции с API WhatsApp.", + "WHATSAPP_SECTION_TITLE": "Ключ API" + }, + "AUTO_ASSIGNMENT": { + "MAX_ASSIGNMENT_LIMIT": "Авто распределение лимита", + "MAX_ASSIGNMENT_LIMIT_RANGE_ERROR": "Пожалуйста, введите значение больше 0", + "MAX_ASSIGNMENT_LIMIT_SUB_TEXT": "Ограничьте максимальное количество разговоров из этого почтового ящика, которые могут быть автоматически назначены агенту" }, "FACEBOOK_REAUTHORIZE": { "TITLE": "Войти заново", diff --git a/app/javascript/dashboard/i18n/locale/ru/report.json b/app/javascript/dashboard/i18n/locale/ru/report.json index dd763da32..5caaf585a 100644 --- a/app/javascript/dashboard/i18n/locale/ru/report.json +++ b/app/javascript/dashboard/i18n/locale/ru/report.json @@ -65,6 +65,7 @@ "PLACEHOLDER": "Выберите диапазон дат" }, "GROUP_BY_FILTER_DROPDOWN_LABEL": "Группировать по", + "DURATION_FILTER_LABEL": "Продолжительность", "GROUP_BY_DAY_OPTIONS": [ { "id": 1, diff --git a/app/javascript/dashboard/i18n/locale/sk/bulkActions.json b/app/javascript/dashboard/i18n/locale/sk/bulkActions.json index df41f8819..462d98283 100644 --- a/app/javascript/dashboard/i18n/locale/sk/bulkActions.json +++ b/app/javascript/dashboard/i18n/locale/sk/bulkActions.json @@ -1,17 +1,29 @@ { - "BULK_ACTION": { - "CONVERSATIONS_SELECTED": "%{conversationCount} conversations selected", - "AGENT_SELECT_LABEL": "Vybrat agenta", - "ASSIGN_CONFIRMATION_LABEL": "Are you sure you want to assign %{conversationCount} %{conversationLabel} to", - "GO_BACK_LABEL": "Go back", - "ASSIGN_LABEL": "Assign", - "ASSIGN_AGENT_TOOLTIP": "Assign Agent", - "RESOLVE_TOOLTIP": "Vyriešiť", - "ASSIGN_SUCCESFUL": "Conversations assigned successfully", - "ASSIGN_FAILED": "Failed to assign conversations, please try again", - "RESOLVE_SUCCESFUL": "Conversations resolved successfully", - "RESOLVE_FAILED": "Failed to resolve conversations, please try again", - "ALL_CONVERSATIONS_SELECTED_ALERT": "Conversations visible on this page are only selected.", - "AGENT_LIST_LOADING": "Loading Agents" + "BULK_ACTION": { + "CONVERSATIONS_SELECTED": "%{conversationCount} conversations selected", + "AGENT_SELECT_LABEL": "Vybrat agenta", + "ASSIGN_CONFIRMATION_LABEL": "Are you sure you want to assign %{conversationCount} %{conversationLabel} to", + "GO_BACK_LABEL": "Go back", + "ASSIGN_LABEL": "Assign", + "ASSIGN_AGENT_TOOLTIP": "Assign Agent", + "ASSIGN_SUCCESFUL": "Conversations assigned successfully", + "ASSIGN_FAILED": "Failed to assign conversations, please try again", + "RESOLVE_SUCCESFUL": "Conversations resolved successfully", + "RESOLVE_FAILED": "Failed to resolve conversations, please try again", + "ALL_CONVERSATIONS_SELECTED_ALERT": "Conversations visible on this page are only selected.", + "AGENT_LIST_LOADING": "Loading Agents", + "UPDATE": { + "CHANGE_STATUS": "Change status", + "SNOOZE_UNTIL_NEXT_REPLY": "Snooze until next reply", + "UPDATE_SUCCESFUL": "Conversation status updated successfully.", + "UPDATE_FAILED": "Failed to update conversations, please try again" + }, + "LABELS": { + "ASSIGN_LABELS": "Assign Labels", + "NO_LABELS_FOUND": "No labels found for", + "ASSIGN_SELECTED_LABELS": "Assign selected labels", + "ASSIGN_SUCCESFUL": "Labels assigned successfully", + "ASSIGN_FAILED": "Failed to assign labels, please try again" } + } } diff --git a/app/javascript/dashboard/i18n/locale/sk/contact.json b/app/javascript/dashboard/i18n/locale/sk/contact.json index c25bcbf4c..eabd5a27d 100644 --- a/app/javascript/dashboard/i18n/locale/sk/contact.json +++ b/app/javascript/dashboard/i18n/locale/sk/contact.json @@ -111,7 +111,8 @@ "EMAIL_ADDRESS": { "PLACEHOLDER": "Zadajte e-mailovú adresu kontaktu", "LABEL": "E-mailová adresa", - "DUPLICATE": "Táto e-mailová adresa sa používa pre iný kontakt." + "DUPLICATE": "Táto e-mailová adresa sa používa pre iný kontakt.", + "ERROR": "Prosím zadajte platnú e-mailovú adresu." }, "PHONE_NUMBER": { "PLACEHOLDER": "Zadajte telefónne číslo kontaktu", diff --git a/app/javascript/dashboard/i18n/locale/sk/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/sk/inboxMgmt.json index 22a02353e..940176b13 100644 --- a/app/javascript/dashboard/i18n/locale/sk/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/sk/inboxMgmt.json @@ -30,7 +30,8 @@ "ADD": { "CHANNEL_NAME": { "LABEL": "Meno schránky", - "PLACEHOLDER": "Enter your inbox name (eg: Acme Inc)" + "PLACEHOLDER": "Enter your inbox name (eg: Acme Inc)", + "ERROR": "Please enter a valid inbox name" }, "WEBSITE_NAME": { "LABEL": "Website Name", @@ -82,7 +83,7 @@ }, "CHANNEL_GREETING_TOGGLE": { "LABEL": "Povoliť pozdav v kanáli", - "HELP_TEXT": "Send a greeting message to the users when they starts the conversation.", + "HELP_TEXT": "Automatically send a greeting message when a new conversation is created.", "ENABLED": "Zapnuté", "DISABLED": "Vypnuté" }, @@ -97,7 +98,10 @@ "LABEL": "Farba widgetu", "PLACEHOLDER": "Zmeniť farbu widgetu použitej vo widgete" }, - "SUBMIT_BUTTON": "Vytvoriť schránku" + "SUBMIT_BUTTON": "Vytvoriť schránku", + "API": { + "ERROR_MESSAGE": "We were not able to create a website channel, please try again" + } }, "TWILIO": { "TITLE": "Kanál Twilio SMS/WhatsApp", @@ -193,6 +197,7 @@ "PROVIDERS": { "LABEL": "API Provider", "TWILIO": "Twilio", + "WHATSAPP_CLOUD": "WhatsApp Cloud", "360_DIALOG": "360Dialog" }, "INBOX_NAME": { @@ -205,13 +210,31 @@ "PLACEHOLDER": "Zadajte telefónne číslo, z ktorého bude správa odoslaná.", "ERROR": "Zadajte platnú hodnotu. Telefónne číslo by malo začínať znakom `+`." }, + "PHONE_NUMBER_ID": { + "LABEL": "Phone number ID", + "PLACEHOLDER": "Please enter the Phone number ID obtained from Facebook developer dashboard.", + "ERROR": "Please enter a valid value." + }, + "BUSINESS_ACCOUNT_ID": { + "LABEL": "Business Account ID", + "PLACEHOLDER": "Please enter the Business Account ID obtained from Facebook developer dashboard.", + "ERROR": "Please enter a valid value." + }, + "WEBHOOK_VERIFY_TOKEN": { + "LABEL": "Webhook Verify Token", + "PLACEHOLDER": "Enter a verify token which you want to configure for facebook webhooks.", + "ERROR": "Please enter a valid value." + }, "API_KEY": { "LABEL": "API key", "SUBTITLE": "Configure the WhatsApp API key.", "PLACEHOLDER": "API key", - "APPLY_FOR_ACCESS": "Don't have any API key? Apply for access here", "ERROR": "Please enter a valid value." }, + "API_CALLBACK": { + "TITLE": "Callback URL", + "SUBTITLE": "You have to configure the webhook URL in facebook developer portal with the URL mentioned here." + }, "SUBMIT_BUTTON": "Create WhatsApp Channel", "API": { "ERROR_MESSAGE": "We were not able to save the WhatsApp channel" @@ -298,7 +321,7 @@ }, "AUTH": { "TITLE": "Vybrať kanál", - "DESC": "Chatwoot podporuje live-chat widget, Facebook stránku, Twitter profil, WhatsApp, E-mail atď., ako kanály. Ak chcete vytvoriť vlastný kanál, môžete ho vytvoriť pomocou kanála API. Ak chcete pokračovať, vyberte jeden kanál z nižšie uvedených možností." + "DESC": "Chatwoot supports live-chat widgets, Facebook Messenger, Twitter profiles, WhatsApp, Emails, etc., as channels. If you want to build a custom channel, you can create it using the API channel. To get started, choose one of the channels below." }, "AGENTS": { "TITLE": "Agenti", @@ -339,7 +362,7 @@ "API": { "SUCCESS_MESSAGE": "Inbox settings updated successfully", "AUTO_ASSIGNMENT_SUCCESS_MESSAGE": "Auto assignment updated successfully", - "ERROR_MESSAGE": "Could not update widget color. Please try again later." + "ERROR_MESSAGE": "We couldn't update inbox settings. Please try again later." }, "EMAIL_COLLECT_BOX": { "ENABLED": "Zapnuté", @@ -412,15 +435,22 @@ "INBOX_UPDATE_SUB_TEXT": "Update your inbox settings", "AUTO_ASSIGNMENT_SUB_TEXT": "Enable or disable the automatic assignment of new conversations to the agents added to this inbox.", "HMAC_VERIFICATION": "User Identity Validation", - "HMAC_DESCRIPTION": "Na overenie identity používateľa umožňuje SDK odovzdať pre každého používateľa `identifier_hash`. HMAC môžete vygenerovať pomocou 'sha256' s kľúčom uvedeným tu.", + "HMAC_DESCRIPTION": "In order to validate the user's identity, you can pass an `identifier_hash` for each user. You can generate a HMAC sha256 hash using the `identifier` with the key shown here.", "HMAC_MANDATORY_VERIFICATION": "Vynucovanie overovania totožnosti používateľa", - "HMAC_MANDATORY_DESCRIPTION": "Ak je táto funkcia zapnutá, metóda setUser nebude fungovať, pokiaľ nebude pre každého používateľa zadaný `identifier_hash`.", + "HMAC_MANDATORY_DESCRIPTION": "If enabled, requests missing the `identifier_hash` will be rejected.", "INBOX_IDENTIFIER": "Indetifikátor schránky", "INBOX_IDENTIFIER_SUB_TEXT": "Na overenie klientov API použite tu uvedený token `inbox_identifier`.", "FORWARD_EMAIL_TITLE": "Preposlanť na e-mail", "FORWARD_EMAIL_SUB_TEXT": "Začnite preposielať e-maily na túto e-mailovú adresu.", "ALLOW_MESSAGES_AFTER_RESOLVED": "Allow messages after conversation resolved", - "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Allow the end-users to send messages even after the conversation is resolved." + "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Allow the end-users to send messages even after the conversation is resolved.", + "WHATSAPP_SECTION_SUBHEADER": "This API Key is used for the integration with the WhatsApp APIs.", + "WHATSAPP_SECTION_TITLE": "API Key" + }, + "AUTO_ASSIGNMENT": { + "MAX_ASSIGNMENT_LIMIT": "Auto assignment limit", + "MAX_ASSIGNMENT_LIMIT_RANGE_ERROR": "Please enter a value greater than 0", + "MAX_ASSIGNMENT_LIMIT_SUB_TEXT": "Limit the maximum number of conversations from this inbox that can be auto assigned to an agent" }, "FACEBOOK_REAUTHORIZE": { "TITLE": "Znova autorizovať", diff --git a/app/javascript/dashboard/i18n/locale/sk/report.json b/app/javascript/dashboard/i18n/locale/sk/report.json index 27cb2b1b5..b87a396cc 100644 --- a/app/javascript/dashboard/i18n/locale/sk/report.json +++ b/app/javascript/dashboard/i18n/locale/sk/report.json @@ -65,6 +65,7 @@ "PLACEHOLDER": "Vybrať rozsah dátumov" }, "GROUP_BY_FILTER_DROPDOWN_LABEL": "Group By", + "DURATION_FILTER_LABEL": "Duration", "GROUP_BY_DAY_OPTIONS": [ { "id": 1, diff --git a/app/javascript/dashboard/i18n/locale/sr/bulkActions.json b/app/javascript/dashboard/i18n/locale/sr/bulkActions.json index bfd688bef..7061e5e70 100644 --- a/app/javascript/dashboard/i18n/locale/sr/bulkActions.json +++ b/app/javascript/dashboard/i18n/locale/sr/bulkActions.json @@ -1,17 +1,29 @@ { - "BULK_ACTION": { - "CONVERSATIONS_SELECTED": "%{conversationCount} conversations selected", - "AGENT_SELECT_LABEL": "Select Agent", - "ASSIGN_CONFIRMATION_LABEL": "Are you sure you want to assign %{conversationCount} %{conversationLabel} to", - "GO_BACK_LABEL": "Go back", - "ASSIGN_LABEL": "Assign", - "ASSIGN_AGENT_TOOLTIP": "Assign Agent", - "RESOLVE_TOOLTIP": "Resolve", - "ASSIGN_SUCCESFUL": "Conversations assigned successfully", - "ASSIGN_FAILED": "Failed to assign conversations, please try again", - "RESOLVE_SUCCESFUL": "Conversations resolved successfully", - "RESOLVE_FAILED": "Failed to resolve conversations, please try again", - "ALL_CONVERSATIONS_SELECTED_ALERT": "Conversations visible on this page are only selected.", - "AGENT_LIST_LOADING": "Loading Agents" + "BULK_ACTION": { + "CONVERSATIONS_SELECTED": "%{conversationCount} conversations selected", + "AGENT_SELECT_LABEL": "Select Agent", + "ASSIGN_CONFIRMATION_LABEL": "Are you sure you want to assign %{conversationCount} %{conversationLabel} to", + "GO_BACK_LABEL": "Go back", + "ASSIGN_LABEL": "Assign", + "ASSIGN_AGENT_TOOLTIP": "Assign Agent", + "ASSIGN_SUCCESFUL": "Conversations assigned successfully", + "ASSIGN_FAILED": "Failed to assign conversations, please try again", + "RESOLVE_SUCCESFUL": "Conversations resolved successfully", + "RESOLVE_FAILED": "Failed to resolve conversations, please try again", + "ALL_CONVERSATIONS_SELECTED_ALERT": "Conversations visible on this page are only selected.", + "AGENT_LIST_LOADING": "Loading Agents", + "UPDATE": { + "CHANGE_STATUS": "Change status", + "SNOOZE_UNTIL_NEXT_REPLY": "Snooze until next reply", + "UPDATE_SUCCESFUL": "Conversation status updated successfully.", + "UPDATE_FAILED": "Failed to update conversations, please try again" + }, + "LABELS": { + "ASSIGN_LABELS": "Assign Labels", + "NO_LABELS_FOUND": "No labels found for", + "ASSIGN_SELECTED_LABELS": "Assign selected labels", + "ASSIGN_SUCCESFUL": "Labels assigned successfully", + "ASSIGN_FAILED": "Failed to assign labels, please try again" } + } } diff --git a/app/javascript/dashboard/i18n/locale/sr/contact.json b/app/javascript/dashboard/i18n/locale/sr/contact.json index 182ed3211..fbc4f0e85 100644 --- a/app/javascript/dashboard/i18n/locale/sr/contact.json +++ b/app/javascript/dashboard/i18n/locale/sr/contact.json @@ -111,7 +111,8 @@ "EMAIL_ADDRESS": { "PLACEHOLDER": "Enter the email address of the contact", "LABEL": "E-mail adresa", - "DUPLICATE": "This email address is in use for another contact." + "DUPLICATE": "This email address is in use for another contact.", + "ERROR": "Please enter a valid email address." }, "PHONE_NUMBER": { "PLACEHOLDER": "Enter the phone number of the contact", diff --git a/app/javascript/dashboard/i18n/locale/sr/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/sr/inboxMgmt.json index a40b4aee5..a17a85663 100644 --- a/app/javascript/dashboard/i18n/locale/sr/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/sr/inboxMgmt.json @@ -30,7 +30,8 @@ "ADD": { "CHANNEL_NAME": { "LABEL": "Inbox Name", - "PLACEHOLDER": "Enter your inbox name (eg: Acme Inc)" + "PLACEHOLDER": "Enter your inbox name (eg: Acme Inc)", + "ERROR": "Please enter a valid inbox name" }, "WEBSITE_NAME": { "LABEL": "Website Name", @@ -82,7 +83,7 @@ }, "CHANNEL_GREETING_TOGGLE": { "LABEL": "Enable channel greeting", - "HELP_TEXT": "Send a greeting message to the users when they starts the conversation.", + "HELP_TEXT": "Automatically send a greeting message when a new conversation is created.", "ENABLED": "Enabled", "DISABLED": "Disabled" }, @@ -97,7 +98,10 @@ "LABEL": "Widget Color", "PLACEHOLDER": "Update the widget color used in widget" }, - "SUBMIT_BUTTON": "Create inbox" + "SUBMIT_BUTTON": "Create inbox", + "API": { + "ERROR_MESSAGE": "We were not able to create a website channel, please try again" + } }, "TWILIO": { "TITLE": "Twilio SMS/WhatsApp Channel", @@ -193,6 +197,7 @@ "PROVIDERS": { "LABEL": "API Provider", "TWILIO": "Twilio", + "WHATSAPP_CLOUD": "WhatsApp Cloud", "360_DIALOG": "360Dialog" }, "INBOX_NAME": { @@ -205,13 +210,31 @@ "PLACEHOLDER": "Please enter the phone number from which message will be sent.", "ERROR": "Please enter a valid value. Phone number should start with `+` sign." }, + "PHONE_NUMBER_ID": { + "LABEL": "Phone number ID", + "PLACEHOLDER": "Please enter the Phone number ID obtained from Facebook developer dashboard.", + "ERROR": "Please enter a valid value." + }, + "BUSINESS_ACCOUNT_ID": { + "LABEL": "Business Account ID", + "PLACEHOLDER": "Please enter the Business Account ID obtained from Facebook developer dashboard.", + "ERROR": "Please enter a valid value." + }, + "WEBHOOK_VERIFY_TOKEN": { + "LABEL": "Webhook Verify Token", + "PLACEHOLDER": "Enter a verify token which you want to configure for facebook webhooks.", + "ERROR": "Please enter a valid value." + }, "API_KEY": { "LABEL": "API key", "SUBTITLE": "Configure the WhatsApp API key.", "PLACEHOLDER": "API key", - "APPLY_FOR_ACCESS": "Don't have any API key? Apply for access here", "ERROR": "Please enter a valid value." }, + "API_CALLBACK": { + "TITLE": "Callback URL", + "SUBTITLE": "You have to configure the webhook URL in facebook developer portal with the URL mentioned here." + }, "SUBMIT_BUTTON": "Create WhatsApp Channel", "API": { "ERROR_MESSAGE": "We were not able to save the WhatsApp channel" @@ -298,7 +321,7 @@ }, "AUTH": { "TITLE": "Choose a channel", - "DESC": "Chatwoot supports live-chat widget, Facebook page, Twitter profile, WhatsApp, Email etc., as channels. If you want to build a custom channel, you can create it using the API channel. Select one channel from the options below to proceed." + "DESC": "Chatwoot supports live-chat widgets, Facebook Messenger, Twitter profiles, WhatsApp, Emails, etc., as channels. If you want to build a custom channel, you can create it using the API channel. To get started, choose one of the channels below." }, "AGENTS": { "TITLE": "Agenti", @@ -339,7 +362,7 @@ "API": { "SUCCESS_MESSAGE": "Inbox settings updated successfully", "AUTO_ASSIGNMENT_SUCCESS_MESSAGE": "Auto assignment updated successfully", - "ERROR_MESSAGE": "Could not update widget color. Please try again later." + "ERROR_MESSAGE": "We couldn't update inbox settings. Please try again later." }, "EMAIL_COLLECT_BOX": { "ENABLED": "Enabled", @@ -412,15 +435,22 @@ "INBOX_UPDATE_SUB_TEXT": "Update your inbox settings", "AUTO_ASSIGNMENT_SUB_TEXT": "Enable or disable the automatic assignment of new conversations to the agents added to this inbox.", "HMAC_VERIFICATION": "User Identity Validation", - "HMAC_DESCRIPTION": "Inorder to validate the user's identity, the SDK allows you to pass an `identifier_hash` for each user. You can generate HMAC using 'sha256' with the key shown here.", + "HMAC_DESCRIPTION": "In order to validate the user's identity, you can pass an `identifier_hash` for each user. You can generate a HMAC sha256 hash using the `identifier` with the key shown here.", "HMAC_MANDATORY_VERIFICATION": "Enforce User Identity Validation", - "HMAC_MANDATORY_DESCRIPTION": "If enabled, Chatwoot SDKs setUser method will not work unless the `identifier_hash` is provided for each user.", + "HMAC_MANDATORY_DESCRIPTION": "If enabled, requests missing the `identifier_hash` will be rejected.", "INBOX_IDENTIFIER": "Inbox Identifier", "INBOX_IDENTIFIER_SUB_TEXT": "Use the `inbox_identifier` token shown here to authentication your API clients.", "FORWARD_EMAIL_TITLE": "Forward to Email", "FORWARD_EMAIL_SUB_TEXT": "Start forwarding your emails to the following email address.", "ALLOW_MESSAGES_AFTER_RESOLVED": "Allow messages after conversation resolved", - "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Allow the end-users to send messages even after the conversation is resolved." + "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Allow the end-users to send messages even after the conversation is resolved.", + "WHATSAPP_SECTION_SUBHEADER": "This API Key is used for the integration with the WhatsApp APIs.", + "WHATSAPP_SECTION_TITLE": "API Key" + }, + "AUTO_ASSIGNMENT": { + "MAX_ASSIGNMENT_LIMIT": "Auto assignment limit", + "MAX_ASSIGNMENT_LIMIT_RANGE_ERROR": "Please enter a value greater than 0", + "MAX_ASSIGNMENT_LIMIT_SUB_TEXT": "Limit the maximum number of conversations from this inbox that can be auto assigned to an agent" }, "FACEBOOK_REAUTHORIZE": { "TITLE": "Reauthorize", diff --git a/app/javascript/dashboard/i18n/locale/sr/report.json b/app/javascript/dashboard/i18n/locale/sr/report.json index f9fabfe4b..b0d38af02 100644 --- a/app/javascript/dashboard/i18n/locale/sr/report.json +++ b/app/javascript/dashboard/i18n/locale/sr/report.json @@ -65,6 +65,7 @@ "PLACEHOLDER": "Select date range" }, "GROUP_BY_FILTER_DROPDOWN_LABEL": "Group By", + "DURATION_FILTER_LABEL": "Duration", "GROUP_BY_DAY_OPTIONS": [ { "id": 1, diff --git a/app/javascript/dashboard/i18n/locale/sv/bulkActions.json b/app/javascript/dashboard/i18n/locale/sv/bulkActions.json index 41266b53b..b30697b3c 100644 --- a/app/javascript/dashboard/i18n/locale/sv/bulkActions.json +++ b/app/javascript/dashboard/i18n/locale/sv/bulkActions.json @@ -1,17 +1,29 @@ { - "BULK_ACTION": { - "CONVERSATIONS_SELECTED": "%{conversationCount} conversations selected", - "AGENT_SELECT_LABEL": "Välj agent", - "ASSIGN_CONFIRMATION_LABEL": "Are you sure you want to assign %{conversationCount} %{conversationLabel} to", - "GO_BACK_LABEL": "Go back", - "ASSIGN_LABEL": "Tilldela", - "ASSIGN_AGENT_TOOLTIP": "Assign Agent", - "RESOLVE_TOOLTIP": "Lös", - "ASSIGN_SUCCESFUL": "Conversations assigned successfully", - "ASSIGN_FAILED": "Failed to assign conversations, please try again", - "RESOLVE_SUCCESFUL": "Conversations resolved successfully", - "RESOLVE_FAILED": "Failed to resolve conversations, please try again", - "ALL_CONVERSATIONS_SELECTED_ALERT": "Conversations visible on this page are only selected.", - "AGENT_LIST_LOADING": "Loading Agents" + "BULK_ACTION": { + "CONVERSATIONS_SELECTED": "%{conversationCount} conversations selected", + "AGENT_SELECT_LABEL": "Välj agent", + "ASSIGN_CONFIRMATION_LABEL": "Are you sure you want to assign %{conversationCount} %{conversationLabel} to", + "GO_BACK_LABEL": "Go back", + "ASSIGN_LABEL": "Tilldela", + "ASSIGN_AGENT_TOOLTIP": "Assign Agent", + "ASSIGN_SUCCESFUL": "Conversations assigned successfully", + "ASSIGN_FAILED": "Failed to assign conversations, please try again", + "RESOLVE_SUCCESFUL": "Conversations resolved successfully", + "RESOLVE_FAILED": "Failed to resolve conversations, please try again", + "ALL_CONVERSATIONS_SELECTED_ALERT": "Conversations visible on this page are only selected.", + "AGENT_LIST_LOADING": "Loading Agents", + "UPDATE": { + "CHANGE_STATUS": "Change status", + "SNOOZE_UNTIL_NEXT_REPLY": "Snooze until next reply", + "UPDATE_SUCCESFUL": "Conversation status updated successfully.", + "UPDATE_FAILED": "Failed to update conversations, please try again" + }, + "LABELS": { + "ASSIGN_LABELS": "Assign Labels", + "NO_LABELS_FOUND": "No labels found for", + "ASSIGN_SELECTED_LABELS": "Assign selected labels", + "ASSIGN_SUCCESFUL": "Labels assigned successfully", + "ASSIGN_FAILED": "Failed to assign labels, please try again" } + } } diff --git a/app/javascript/dashboard/i18n/locale/sv/contact.json b/app/javascript/dashboard/i18n/locale/sv/contact.json index 37199503e..7b2bd6fd1 100644 --- a/app/javascript/dashboard/i18n/locale/sv/contact.json +++ b/app/javascript/dashboard/i18n/locale/sv/contact.json @@ -111,7 +111,8 @@ "EMAIL_ADDRESS": { "PLACEHOLDER": "Ange e-postadressen till kontakten", "LABEL": "E-postadress", - "DUPLICATE": "Den här e-postadressen används för en annan kontakt." + "DUPLICATE": "Den här e-postadressen används för en annan kontakt.", + "ERROR": "Ange en giltig e-postadress." }, "PHONE_NUMBER": { "PLACEHOLDER": "Ange telefonnummer till kontakten", diff --git a/app/javascript/dashboard/i18n/locale/sv/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/sv/inboxMgmt.json index 57820e445..221fddda3 100644 --- a/app/javascript/dashboard/i18n/locale/sv/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/sv/inboxMgmt.json @@ -30,7 +30,8 @@ "ADD": { "CHANNEL_NAME": { "LABEL": "Inkorgsnamn", - "PLACEHOLDER": "Enter your inbox name (eg: Acme Inc)" + "PLACEHOLDER": "Enter your inbox name (eg: Acme Inc)", + "ERROR": "Please enter a valid inbox name" }, "WEBSITE_NAME": { "LABEL": "Website Name", @@ -82,7 +83,7 @@ }, "CHANNEL_GREETING_TOGGLE": { "LABEL": "Aktivera kanalhälsning", - "HELP_TEXT": "Send a greeting message to the users when they starts the conversation.", + "HELP_TEXT": "Automatically send a greeting message when a new conversation is created.", "ENABLED": "Aktiverad", "DISABLED": "Inaktiverad" }, @@ -97,7 +98,10 @@ "LABEL": "Widgetfärg", "PLACEHOLDER": "Uppdatera den widgetfärg som används i widget" }, - "SUBMIT_BUTTON": "Skapa inkorg" + "SUBMIT_BUTTON": "Skapa inkorg", + "API": { + "ERROR_MESSAGE": "We were not able to create a website channel, please try again" + } }, "TWILIO": { "TITLE": "Twilio SMS/WhatsApp Channel", @@ -193,6 +197,7 @@ "PROVIDERS": { "LABEL": "API Provider", "TWILIO": "Twilio", + "WHATSAPP_CLOUD": "WhatsApp Cloud", "360_DIALOG": "360Dialog" }, "INBOX_NAME": { @@ -205,13 +210,31 @@ "PLACEHOLDER": "Ange telefonnummer från vilket meddelande som ska skickas.", "ERROR": "Ange ett giltigt värde. Telefonnummer bör börja med `+`-tecken." }, + "PHONE_NUMBER_ID": { + "LABEL": "Phone number ID", + "PLACEHOLDER": "Please enter the Phone number ID obtained from Facebook developer dashboard.", + "ERROR": "Ange ett giltigt värde." + }, + "BUSINESS_ACCOUNT_ID": { + "LABEL": "Business Account ID", + "PLACEHOLDER": "Please enter the Business Account ID obtained from Facebook developer dashboard.", + "ERROR": "Ange ett giltigt värde." + }, + "WEBHOOK_VERIFY_TOKEN": { + "LABEL": "Webhook Verify Token", + "PLACEHOLDER": "Enter a verify token which you want to configure for facebook webhooks.", + "ERROR": "Ange ett giltigt värde." + }, "API_KEY": { "LABEL": "API key", "SUBTITLE": "Configure the WhatsApp API key.", "PLACEHOLDER": "API key", - "APPLY_FOR_ACCESS": "Don't have any API key? Apply for access here", "ERROR": "Ange ett giltigt värde." }, + "API_CALLBACK": { + "TITLE": "Callback-URL", + "SUBTITLE": "You have to configure the webhook URL in facebook developer portal with the URL mentioned here." + }, "SUBMIT_BUTTON": "Skapa WhatsApp-kanal", "API": { "ERROR_MESSAGE": "Vi kunde inte spara WhatsApp-kanalen" @@ -298,7 +321,7 @@ }, "AUTH": { "TITLE": "Välj en kanal", - "DESC": "Chatwoot stöder live-chat widget, Facebook-sida, Twitter-profil, WhatsApp, E-post etc., som kanaler. Om du vill bygga en anpassad kanal kan du skapa den med hjälp av API-kanalen. Välj en kanal från alternativen nedan för att fortsätta." + "DESC": "Chatwoot supports live-chat widgets, Facebook Messenger, Twitter profiles, WhatsApp, Emails, etc., as channels. If you want to build a custom channel, you can create it using the API channel. To get started, choose one of the channels below." }, "AGENTS": { "TITLE": "Agenter", @@ -339,7 +362,7 @@ "API": { "SUCCESS_MESSAGE": "Inkorgen har uppdaterats", "AUTO_ASSIGNMENT_SUCCESS_MESSAGE": "Automatisk tilldelning har uppdaterats", - "ERROR_MESSAGE": "Kunde inte uppdatera widgetens färg. Försök igen senare." + "ERROR_MESSAGE": "We couldn't update inbox settings. Please try again later." }, "EMAIL_COLLECT_BOX": { "ENABLED": "Aktiverad", @@ -412,15 +435,22 @@ "INBOX_UPDATE_SUB_TEXT": "Uppdatera inställningarna för din inkorg", "AUTO_ASSIGNMENT_SUB_TEXT": "Aktivera eller inaktivera automatisk tilldelning av nya konversationer till de agenter som lagts till den här inkorgen.", "HMAC_VERIFICATION": "Validering av användaridentitet", - "HMAC_DESCRIPTION": "För att validera användarens identitet låter SDKn dig att skicka en `identity_hash` för varje användare. Du kan generera HMAC med 'sha256' med nyckeln som visas här.", + "HMAC_DESCRIPTION": "In order to validate the user's identity, you can pass an `identifier_hash` for each user. You can generate a HMAC sha256 hash using the `identifier` with the key shown here.", "HMAC_MANDATORY_VERIFICATION": "Validering av användaridentitet", - "HMAC_MANDATORY_DESCRIPTION": "Om aktiverad, kommer Chatwoot SDKs setUser metod inte att fungera om inte `identifier_hash` tillhandahålls för varje användare.", + "HMAC_MANDATORY_DESCRIPTION": "If enabled, requests missing the `identifier_hash` will be rejected.", "INBOX_IDENTIFIER": "Identifierare för inkorgen", "INBOX_IDENTIFIER_SUB_TEXT": "Använd `inbox_identifier`-token som visas här för att autentisera dina API-klienter.", "FORWARD_EMAIL_TITLE": "Vidarebefordra till e-post", "FORWARD_EMAIL_SUB_TEXT": "Börja vidarebefordra dina e-postmeddelanden till följande e-postadress.", "ALLOW_MESSAGES_AFTER_RESOLVED": "Allow messages after conversation resolved", - "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Allow the end-users to send messages even after the conversation is resolved." + "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Allow the end-users to send messages even after the conversation is resolved.", + "WHATSAPP_SECTION_SUBHEADER": "This API Key is used for the integration with the WhatsApp APIs.", + "WHATSAPP_SECTION_TITLE": "API Key" + }, + "AUTO_ASSIGNMENT": { + "MAX_ASSIGNMENT_LIMIT": "Auto assignment limit", + "MAX_ASSIGNMENT_LIMIT_RANGE_ERROR": "Please enter a value greater than 0", + "MAX_ASSIGNMENT_LIMIT_SUB_TEXT": "Limit the maximum number of conversations from this inbox that can be auto assigned to an agent" }, "FACEBOOK_REAUTHORIZE": { "TITLE": "Återauktorisera", diff --git a/app/javascript/dashboard/i18n/locale/sv/report.json b/app/javascript/dashboard/i18n/locale/sv/report.json index ae03214a4..3ff560b7d 100644 --- a/app/javascript/dashboard/i18n/locale/sv/report.json +++ b/app/javascript/dashboard/i18n/locale/sv/report.json @@ -65,6 +65,7 @@ "PLACEHOLDER": "Select date range" }, "GROUP_BY_FILTER_DROPDOWN_LABEL": "Group By", + "DURATION_FILTER_LABEL": "Duration", "GROUP_BY_DAY_OPTIONS": [ { "id": 1, diff --git a/app/javascript/dashboard/i18n/locale/ta/bulkActions.json b/app/javascript/dashboard/i18n/locale/ta/bulkActions.json index b67a47d02..7061e5e70 100644 --- a/app/javascript/dashboard/i18n/locale/ta/bulkActions.json +++ b/app/javascript/dashboard/i18n/locale/ta/bulkActions.json @@ -1,17 +1,29 @@ { - "BULK_ACTION": { - "CONVERSATIONS_SELECTED": "%{conversationCount} conversations selected", - "AGENT_SELECT_LABEL": "Select Agent", - "ASSIGN_CONFIRMATION_LABEL": "Are you sure you want to assign %{conversationCount} %{conversationLabel} to", - "GO_BACK_LABEL": "Go back", - "ASSIGN_LABEL": "Assign", - "ASSIGN_AGENT_TOOLTIP": "Assign Agent", - "RESOLVE_TOOLTIP": "தீர்", - "ASSIGN_SUCCESFUL": "Conversations assigned successfully", - "ASSIGN_FAILED": "Failed to assign conversations, please try again", - "RESOLVE_SUCCESFUL": "Conversations resolved successfully", - "RESOLVE_FAILED": "Failed to resolve conversations, please try again", - "ALL_CONVERSATIONS_SELECTED_ALERT": "Conversations visible on this page are only selected.", - "AGENT_LIST_LOADING": "Loading Agents" + "BULK_ACTION": { + "CONVERSATIONS_SELECTED": "%{conversationCount} conversations selected", + "AGENT_SELECT_LABEL": "Select Agent", + "ASSIGN_CONFIRMATION_LABEL": "Are you sure you want to assign %{conversationCount} %{conversationLabel} to", + "GO_BACK_LABEL": "Go back", + "ASSIGN_LABEL": "Assign", + "ASSIGN_AGENT_TOOLTIP": "Assign Agent", + "ASSIGN_SUCCESFUL": "Conversations assigned successfully", + "ASSIGN_FAILED": "Failed to assign conversations, please try again", + "RESOLVE_SUCCESFUL": "Conversations resolved successfully", + "RESOLVE_FAILED": "Failed to resolve conversations, please try again", + "ALL_CONVERSATIONS_SELECTED_ALERT": "Conversations visible on this page are only selected.", + "AGENT_LIST_LOADING": "Loading Agents", + "UPDATE": { + "CHANGE_STATUS": "Change status", + "SNOOZE_UNTIL_NEXT_REPLY": "Snooze until next reply", + "UPDATE_SUCCESFUL": "Conversation status updated successfully.", + "UPDATE_FAILED": "Failed to update conversations, please try again" + }, + "LABELS": { + "ASSIGN_LABELS": "Assign Labels", + "NO_LABELS_FOUND": "No labels found for", + "ASSIGN_SELECTED_LABELS": "Assign selected labels", + "ASSIGN_SUCCESFUL": "Labels assigned successfully", + "ASSIGN_FAILED": "Failed to assign labels, please try again" } + } } diff --git a/app/javascript/dashboard/i18n/locale/ta/contact.json b/app/javascript/dashboard/i18n/locale/ta/contact.json index f0599bf96..ac650e7fb 100644 --- a/app/javascript/dashboard/i18n/locale/ta/contact.json +++ b/app/javascript/dashboard/i18n/locale/ta/contact.json @@ -111,7 +111,8 @@ "EMAIL_ADDRESS": { "PLACEHOLDER": "Enter the email address of the contact", "LABEL": "ஈ-மெயில் முகவரி", - "DUPLICATE": "This email address is in use for another contact." + "DUPLICATE": "This email address is in use for another contact.", + "ERROR": "Please enter a valid email address." }, "PHONE_NUMBER": { "PLACEHOLDER": "Enter the phone number of the contact", diff --git a/app/javascript/dashboard/i18n/locale/ta/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ta/inboxMgmt.json index f8d9d34d6..080cd8f32 100644 --- a/app/javascript/dashboard/i18n/locale/ta/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/ta/inboxMgmt.json @@ -30,7 +30,8 @@ "ADD": { "CHANNEL_NAME": { "LABEL": "இன்பாக்ஸ் பெயர்", - "PLACEHOLDER": "Enter your inbox name (eg: Acme Inc)" + "PLACEHOLDER": "Enter your inbox name (eg: Acme Inc)", + "ERROR": "Please enter a valid inbox name" }, "WEBSITE_NAME": { "LABEL": "Website Name", @@ -82,7 +83,7 @@ }, "CHANNEL_GREETING_TOGGLE": { "LABEL": "சேனல் வாழ்த்தை இயக்கு", - "HELP_TEXT": "Send a greeting message to the users when they starts the conversation.", + "HELP_TEXT": "Automatically send a greeting message when a new conversation is created.", "ENABLED": "இயக்கப்பட்டது", "DISABLED": "முடக்கப்பட்டது" }, @@ -97,7 +98,10 @@ "LABEL": "விட்ஜெட் நிறம்", "PLACEHOLDER": "விட்ஜெட்டில் பயன்படுத்தப்படும் விட்ஜெட் நிறத்தைப் புதுப்பிக்கவும்" }, - "SUBMIT_BUTTON": "இன்பாக்ஸை உருவாக்கவும்" + "SUBMIT_BUTTON": "இன்பாக்ஸை உருவாக்கவும்", + "API": { + "ERROR_MESSAGE": "We were not able to create a website channel, please try again" + } }, "TWILIO": { "TITLE": "Twilio SMS/WhatsApp Channel", @@ -193,6 +197,7 @@ "PROVIDERS": { "LABEL": "API Provider", "TWILIO": "Twilio", + "WHATSAPP_CLOUD": "WhatsApp Cloud", "360_DIALOG": "360Dialog" }, "INBOX_NAME": { @@ -205,13 +210,31 @@ "PLACEHOLDER": "செய்தி அனுப்பப்படும் தொலைபேசி எண்ணை உள்ளிடவும்.", "ERROR": "சரியான நம்பரை உள்ளிடவும். தொலைபேசி எண் `+` அடையாளத்துடன் தொடங்க வேண்டும்." }, + "PHONE_NUMBER_ID": { + "LABEL": "Phone number ID", + "PLACEHOLDER": "Please enter the Phone number ID obtained from Facebook developer dashboard.", + "ERROR": "Please enter a valid value." + }, + "BUSINESS_ACCOUNT_ID": { + "LABEL": "Business Account ID", + "PLACEHOLDER": "Please enter the Business Account ID obtained from Facebook developer dashboard.", + "ERROR": "Please enter a valid value." + }, + "WEBHOOK_VERIFY_TOKEN": { + "LABEL": "Webhook Verify Token", + "PLACEHOLDER": "Enter a verify token which you want to configure for facebook webhooks.", + "ERROR": "Please enter a valid value." + }, "API_KEY": { "LABEL": "API key", "SUBTITLE": "Configure the WhatsApp API key.", "PLACEHOLDER": "API key", - "APPLY_FOR_ACCESS": "Don't have any API key? Apply for access here", "ERROR": "Please enter a valid value." }, + "API_CALLBACK": { + "TITLE": "கால்பேக் URL", + "SUBTITLE": "You have to configure the webhook URL in facebook developer portal with the URL mentioned here." + }, "SUBMIT_BUTTON": "Create WhatsApp Channel", "API": { "ERROR_MESSAGE": "We were not able to save the WhatsApp channel" @@ -298,7 +321,7 @@ }, "AUTH": { "TITLE": "Choose a channel", - "DESC": "Chatwoot supports live-chat widget, Facebook page, Twitter profile, WhatsApp, Email etc., as channels. If you want to build a custom channel, you can create it using the API channel. Select one channel from the options below to proceed." + "DESC": "Chatwoot supports live-chat widgets, Facebook Messenger, Twitter profiles, WhatsApp, Emails, etc., as channels. If you want to build a custom channel, you can create it using the API channel. To get started, choose one of the channels below." }, "AGENTS": { "TITLE": "ஏஜென்ட்கள்", @@ -339,7 +362,7 @@ "API": { "SUCCESS_MESSAGE": "இன்பாக்ஸ் அமைப்புகள் வெற்றிகரமாக புதுப்பிக்கப்பட்டன", "AUTO_ASSIGNMENT_SUCCESS_MESSAGE": "தானியங்கு பணி வெற்றிகரமாக புதுப்பிக்கப்பட்டது", - "ERROR_MESSAGE": "விட்ஜெட் நிறத்தை புதுப்பிக்க முடியவில்லை. மீண்டும் முயற்சிக்கவும்." + "ERROR_MESSAGE": "We couldn't update inbox settings. Please try again later." }, "EMAIL_COLLECT_BOX": { "ENABLED": "இயக்கப்பட்டது", @@ -412,15 +435,22 @@ "INBOX_UPDATE_SUB_TEXT": "உங்கள் இன்பாக்ஸ் அமைப்புகளைப் புதுப்பிக்கவும்", "AUTO_ASSIGNMENT_SUB_TEXT": "இந்த இன்பாக்ஸில் சேர்க்கப்பட்ட ஏஜென்ட்களுக்கு புதிய உரையாடல்களின் தானியங்கி ஒதுக்கீட்டை இயக்கவும் அல்லது முடக்கவும்.", "HMAC_VERIFICATION": "User Identity Validation", - "HMAC_DESCRIPTION": "Inorder to validate the user's identity, the SDK allows you to pass an `identifier_hash` for each user. You can generate HMAC using 'sha256' with the key shown here.", + "HMAC_DESCRIPTION": "In order to validate the user's identity, you can pass an `identifier_hash` for each user. You can generate a HMAC sha256 hash using the `identifier` with the key shown here.", "HMAC_MANDATORY_VERIFICATION": "Enforce User Identity Validation", - "HMAC_MANDATORY_DESCRIPTION": "If enabled, Chatwoot SDKs setUser method will not work unless the `identifier_hash` is provided for each user.", + "HMAC_MANDATORY_DESCRIPTION": "If enabled, requests missing the `identifier_hash` will be rejected.", "INBOX_IDENTIFIER": "Inbox Identifier", "INBOX_IDENTIFIER_SUB_TEXT": "Use the `inbox_identifier` token shown here to authentication your API clients.", "FORWARD_EMAIL_TITLE": "Forward to Email", "FORWARD_EMAIL_SUB_TEXT": "Start forwarding your emails to the following email address.", "ALLOW_MESSAGES_AFTER_RESOLVED": "Allow messages after conversation resolved", - "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Allow the end-users to send messages even after the conversation is resolved." + "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Allow the end-users to send messages even after the conversation is resolved.", + "WHATSAPP_SECTION_SUBHEADER": "This API Key is used for the integration with the WhatsApp APIs.", + "WHATSAPP_SECTION_TITLE": "API Key" + }, + "AUTO_ASSIGNMENT": { + "MAX_ASSIGNMENT_LIMIT": "Auto assignment limit", + "MAX_ASSIGNMENT_LIMIT_RANGE_ERROR": "Please enter a value greater than 0", + "MAX_ASSIGNMENT_LIMIT_SUB_TEXT": "Limit the maximum number of conversations from this inbox that can be auto assigned to an agent" }, "FACEBOOK_REAUTHORIZE": { "TITLE": "மறு அங்கீகாரம்", diff --git a/app/javascript/dashboard/i18n/locale/ta/report.json b/app/javascript/dashboard/i18n/locale/ta/report.json index ad9fd7104..f00d26ea0 100644 --- a/app/javascript/dashboard/i18n/locale/ta/report.json +++ b/app/javascript/dashboard/i18n/locale/ta/report.json @@ -65,6 +65,7 @@ "PLACEHOLDER": "Select date range" }, "GROUP_BY_FILTER_DROPDOWN_LABEL": "Group By", + "DURATION_FILTER_LABEL": "Duration", "GROUP_BY_DAY_OPTIONS": [ { "id": 1, diff --git a/app/javascript/dashboard/i18n/locale/th/bulkActions.json b/app/javascript/dashboard/i18n/locale/th/bulkActions.json index 6c8d8c579..d1accc46a 100644 --- a/app/javascript/dashboard/i18n/locale/th/bulkActions.json +++ b/app/javascript/dashboard/i18n/locale/th/bulkActions.json @@ -1,17 +1,29 @@ { - "BULK_ACTION": { - "CONVERSATIONS_SELECTED": "%{conversationCount} conversations selected", - "AGENT_SELECT_LABEL": "เลือกพนักงาน", - "ASSIGN_CONFIRMATION_LABEL": "Are you sure you want to assign %{conversationCount} %{conversationLabel} to", - "GO_BACK_LABEL": "Go back", - "ASSIGN_LABEL": "มอบหมาย", - "ASSIGN_AGENT_TOOLTIP": "Assign Agent", - "RESOLVE_TOOLTIP": "เสร็จสิ้น", - "ASSIGN_SUCCESFUL": "Conversations assigned successfully", - "ASSIGN_FAILED": "Failed to assign conversations, please try again", - "RESOLVE_SUCCESFUL": "Conversations resolved successfully", - "RESOLVE_FAILED": "Failed to resolve conversations, please try again", - "ALL_CONVERSATIONS_SELECTED_ALERT": "Conversations visible on this page are only selected.", - "AGENT_LIST_LOADING": "Loading Agents" + "BULK_ACTION": { + "CONVERSATIONS_SELECTED": "%{conversationCount} conversations selected", + "AGENT_SELECT_LABEL": "เลือกพนักงาน", + "ASSIGN_CONFIRMATION_LABEL": "Are you sure you want to assign %{conversationCount} %{conversationLabel} to", + "GO_BACK_LABEL": "Go back", + "ASSIGN_LABEL": "มอบหมาย", + "ASSIGN_AGENT_TOOLTIP": "Assign Agent", + "ASSIGN_SUCCESFUL": "Conversations assigned successfully", + "ASSIGN_FAILED": "Failed to assign conversations, please try again", + "RESOLVE_SUCCESFUL": "Conversations resolved successfully", + "RESOLVE_FAILED": "Failed to resolve conversations, please try again", + "ALL_CONVERSATIONS_SELECTED_ALERT": "Conversations visible on this page are only selected.", + "AGENT_LIST_LOADING": "Loading Agents", + "UPDATE": { + "CHANGE_STATUS": "Change status", + "SNOOZE_UNTIL_NEXT_REPLY": "Snooze until next reply", + "UPDATE_SUCCESFUL": "Conversation status updated successfully.", + "UPDATE_FAILED": "Failed to update conversations, please try again" + }, + "LABELS": { + "ASSIGN_LABELS": "Assign Labels", + "NO_LABELS_FOUND": "No labels found for", + "ASSIGN_SELECTED_LABELS": "Assign selected labels", + "ASSIGN_SUCCESFUL": "Labels assigned successfully", + "ASSIGN_FAILED": "Failed to assign labels, please try again" } + } } diff --git a/app/javascript/dashboard/i18n/locale/th/contact.json b/app/javascript/dashboard/i18n/locale/th/contact.json index 718b71c5e..261052212 100644 --- a/app/javascript/dashboard/i18n/locale/th/contact.json +++ b/app/javascript/dashboard/i18n/locale/th/contact.json @@ -111,7 +111,8 @@ "EMAIL_ADDRESS": { "PLACEHOLDER": "กรอกที่อยู่อีเมล์ผู้ติดต่อ", "LABEL": "ที่อยู่อีเมล์", - "DUPLICATE": "อีเมล์นี้ถูกใช้ในผู้ติดต่อคนอื่นเเล้ว" + "DUPLICATE": "อีเมล์นี้ถูกใช้ในผู้ติดต่อคนอื่นเเล้ว", + "ERROR": "กรุณากรอกที่อยู่อีเมล์ให้ถูกต้อง." }, "PHONE_NUMBER": { "PLACEHOLDER": "กรอกหมายเลขโทรศัพท์ผู้ติดต่อ", diff --git a/app/javascript/dashboard/i18n/locale/th/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/th/inboxMgmt.json index 20f5d478f..ced771066 100644 --- a/app/javascript/dashboard/i18n/locale/th/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/th/inboxMgmt.json @@ -30,7 +30,8 @@ "ADD": { "CHANNEL_NAME": { "LABEL": "ชื่อกล่องข้อความ", - "PLACEHOLDER": "กรอกชื่อกล่องข้อความ (เช่น Acme Inc)" + "PLACEHOLDER": "กรอกชื่อกล่องข้อความ (เช่น Acme Inc)", + "ERROR": "Please enter a valid inbox name" }, "WEBSITE_NAME": { "LABEL": "ชื่อเว็บไซต์", @@ -82,7 +83,7 @@ }, "CHANNEL_GREETING_TOGGLE": { "LABEL": "เปิดข้อความต้อนรับ", - "HELP_TEXT": "ส่งข้อความต้อนรับให้ผู้ใช้ เมื่อพวกเขาเริ่มต้นการสนทนา", + "HELP_TEXT": "Automatically send a greeting message when a new conversation is created.", "ENABLED": "เปิด", "DISABLED": "ปิด" }, @@ -97,7 +98,10 @@ "LABEL": "สีของวิดเจ็ต", "PLACEHOLDER": "อัพเดทสีที่ใช้ในวิดเจ็ต" }, - "SUBMIT_BUTTON": "สร้างกล่องข้อความ" + "SUBMIT_BUTTON": "สร้างกล่องข้อความ", + "API": { + "ERROR_MESSAGE": "We were not able to create a website channel, please try again" + } }, "TWILIO": { "TITLE": "ช่องทาง Twilio SMS/WhatsApp", @@ -193,6 +197,7 @@ "PROVIDERS": { "LABEL": "ผู้ให้บริการ API", "TWILIO": "Twilio", + "WHATSAPP_CLOUD": "WhatsApp Cloud", "360_DIALOG": "360Dialog" }, "INBOX_NAME": { @@ -205,13 +210,31 @@ "PLACEHOLDER": "กรุณากรอกหมายเลขโทรศัพท์ที่จะส่งข้อความ", "ERROR": "กรุณากรอกหมายเลขโทรศัพท์ให้ถูกต้องต้องเริ่มด้วย \"+\"" }, + "PHONE_NUMBER_ID": { + "LABEL": "Phone number ID", + "PLACEHOLDER": "Please enter the Phone number ID obtained from Facebook developer dashboard.", + "ERROR": "โปรดกรอกค่าที่ถูกต้อง" + }, + "BUSINESS_ACCOUNT_ID": { + "LABEL": "Business Account ID", + "PLACEHOLDER": "Please enter the Business Account ID obtained from Facebook developer dashboard.", + "ERROR": "โปรดกรอกค่าที่ถูกต้อง" + }, + "WEBHOOK_VERIFY_TOKEN": { + "LABEL": "Webhook Verify Token", + "PLACEHOLDER": "Enter a verify token which you want to configure for facebook webhooks.", + "ERROR": "โปรดกรอกค่าที่ถูกต้อง" + }, "API_KEY": { "LABEL": "API key", "SUBTITLE": "ตั้งค่า WhatsApp API key", "PLACEHOLDER": "API key", - "APPLY_FOR_ACCESS": "ไม่มี API key ใช่ไหม? สมัครเปิดใช้ที่นี่", "ERROR": "โปรดกรอกค่าที่ถูกต้อง" }, + "API_CALLBACK": { + "TITLE": "ลิ้งเรียกกลับ", + "SUBTITLE": "You have to configure the webhook URL in facebook developer portal with the URL mentioned here." + }, "SUBMIT_BUTTON": "สร้างช่องทาง WhatsApp", "API": { "ERROR_MESSAGE": "เราไม่สามารถบันทึกช่องทาง WhatsApp ได้" @@ -298,7 +321,7 @@ }, "AUTH": { "TITLE": "เลือกช่องทาง", - "DESC": "Chatwoot รองรับ live-chat widget, Facebook, Twitter, WhatsApp, Email และช่องทางอื่น ๆ ถ้าคุณต้องการสร้างช่องทางพิเศษ คุณสามารถสร้างได้โดยใช้ API channel เลือกช่องทางด้านล่างนี้เพื่อดำเนินการต่อ" + "DESC": "Chatwoot supports live-chat widgets, Facebook Messenger, Twitter profiles, WhatsApp, Emails, etc., as channels. If you want to build a custom channel, you can create it using the API channel. To get started, choose one of the channels below." }, "AGENTS": { "TITLE": "พนักงาน", @@ -339,7 +362,7 @@ "API": { "SUCCESS_MESSAGE": "อัปเดตการตั้งค่ากล่องข้อความเรียบร้อยแล้ว", "AUTO_ASSIGNMENT_SUCCESS_MESSAGE": "อัปเดตการมอบหมายอัตโนมัติเรียบร้อยแล้ว", - "ERROR_MESSAGE": "ไม่สามารถอัปเดตสี widget โปรดลองใหม่อีกครั้งในภายหลัง" + "ERROR_MESSAGE": "We couldn't update inbox settings. Please try again later." }, "EMAIL_COLLECT_BOX": { "ENABLED": "เปิด", @@ -412,15 +435,22 @@ "INBOX_UPDATE_SUB_TEXT": "อัปเดตกล่องข้อความ", "AUTO_ASSIGNMENT_SUB_TEXT": "เปิดหรือปิดระบบมอบหมายงานอัตโนมัติสำหรับข้อความใหม่ให้กับพนักงานในกล่องสนทนานี้", "HMAC_VERIFICATION": "การตรวจสอบตัวตนผู้ใช้งาน", - "HMAC_DESCRIPTION": "SDK อนุญาตให้คุณส่งต่อ `identifier_hash` สำหรับผู้ใช้งานแค่ละคนเพื่อที่ตรวจสอบตัวตนผู้ใช้งาน คุณสามารถสร้าง HMAC โดยใช้ 'sha256' ร่วมกับคีย์ที่ปรากฎอยู่", + "HMAC_DESCRIPTION": "In order to validate the user's identity, you can pass an `identifier_hash` for each user. You can generate a HMAC sha256 hash using the `identifier` with the key shown here.", "HMAC_MANDATORY_VERIFICATION": "บังคับใช้การตรวจสอบตัวตนผู้ใช้งาน", - "HMAC_MANDATORY_DESCRIPTION": "หากเปิดใช้งาน วิธี SDKs setUser ของ Chatwoot จะไม่สามารถใช้งานได้ นอกจากจะมีการสร้าง `identifier_hash` สำหรับแต่ละผู้ใช้งาน", + "HMAC_MANDATORY_DESCRIPTION": "If enabled, requests missing the `identifier_hash` will be rejected.", "INBOX_IDENTIFIER": "ตัวระบุกล่องข้อความ", "INBOX_IDENTIFIER_SUB_TEXT": "ใช้ 'ตัวระบุกล่องข้อความ' ที่ปรากฎที่นี่เพื่อรับรองสิทธิ์ API clients ของคุณ", "FORWARD_EMAIL_TITLE": "ส่งต่อไปยังอีเมล", "FORWARD_EMAIL_SUB_TEXT": "เริ่มส่งต่ออีเมลของคุณไปยังที่อยู่ตามนี้", "ALLOW_MESSAGES_AFTER_RESOLVED": "อนุญาตให้รับข้อความหลังจากจบการสนทนาแล้ว", - "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "อนุญาตให้ลูกค้าส่งข้อความหลังจากจบการสนทนาแล้ว" + "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "อนุญาตให้ลูกค้าส่งข้อความหลังจากจบการสนทนาแล้ว", + "WHATSAPP_SECTION_SUBHEADER": "This API Key is used for the integration with the WhatsApp APIs.", + "WHATSAPP_SECTION_TITLE": "API Key" + }, + "AUTO_ASSIGNMENT": { + "MAX_ASSIGNMENT_LIMIT": "Auto assignment limit", + "MAX_ASSIGNMENT_LIMIT_RANGE_ERROR": "Please enter a value greater than 0", + "MAX_ASSIGNMENT_LIMIT_SUB_TEXT": "Limit the maximum number of conversations from this inbox that can be auto assigned to an agent" }, "FACEBOOK_REAUTHORIZE": { "TITLE": "ขอสิทธิ์อีกครั้ง", diff --git a/app/javascript/dashboard/i18n/locale/th/report.json b/app/javascript/dashboard/i18n/locale/th/report.json index b0b2a56d3..06ab2a40a 100644 --- a/app/javascript/dashboard/i18n/locale/th/report.json +++ b/app/javascript/dashboard/i18n/locale/th/report.json @@ -65,6 +65,7 @@ "PLACEHOLDER": "เลือกช่วงเวลา" }, "GROUP_BY_FILTER_DROPDOWN_LABEL": "จัดกลุ่มโดย", + "DURATION_FILTER_LABEL": "Duration", "GROUP_BY_DAY_OPTIONS": [ { "id": 1, diff --git a/app/javascript/dashboard/i18n/locale/tr/bulkActions.json b/app/javascript/dashboard/i18n/locale/tr/bulkActions.json index e639e2220..6af64bba9 100644 --- a/app/javascript/dashboard/i18n/locale/tr/bulkActions.json +++ b/app/javascript/dashboard/i18n/locale/tr/bulkActions.json @@ -1,17 +1,29 @@ { - "BULK_ACTION": { - "CONVERSATIONS_SELECTED": "%{conversationCount} görüşme seçildi", - "AGENT_SELECT_LABEL": "Temsilci Seçin", - "ASSIGN_CONFIRMATION_LABEL": "Are you sure you want to assign %{conversationCount} %{conversationLabel} to", - "GO_BACK_LABEL": "Geri git", - "ASSIGN_LABEL": "Atama yap", - "ASSIGN_AGENT_TOOLTIP": "Temsilci Atama", - "RESOLVE_TOOLTIP": "Çözüldü", - "ASSIGN_SUCCESFUL": "Görüşmeler başarıyla atandı", - "ASSIGN_FAILED": "Görüşmeler atanamadı, lütfen tekrar deneyin", - "RESOLVE_SUCCESFUL": "Görüşmeler başarıyla çözüldü", - "RESOLVE_FAILED": "Görüşmeler çözülemedi, lütfen tekrar deneyin", - "ALL_CONVERSATIONS_SELECTED_ALERT": "Bu sayfada yalnızca seçili konuşmalar gözükür.", - "AGENT_LIST_LOADING": "Temsilciler Yükleniyor" + "BULK_ACTION": { + "CONVERSATIONS_SELECTED": "%{conversationCount} görüşme seçildi", + "AGENT_SELECT_LABEL": "Temsilci Seçin", + "ASSIGN_CONFIRMATION_LABEL": "Are you sure you want to assign %{conversationCount} %{conversationLabel} to", + "GO_BACK_LABEL": "Geri git", + "ASSIGN_LABEL": "Atama yap", + "ASSIGN_AGENT_TOOLTIP": "Temsilci Atama", + "ASSIGN_SUCCESFUL": "Görüşmeler başarıyla atandı", + "ASSIGN_FAILED": "Görüşmeler atanamadı, lütfen tekrar deneyin", + "RESOLVE_SUCCESFUL": "Görüşmeler başarıyla çözüldü", + "RESOLVE_FAILED": "Görüşmeler çözülemedi, lütfen tekrar deneyin", + "ALL_CONVERSATIONS_SELECTED_ALERT": "Bu sayfada yalnızca seçili konuşmalar gözükür.", + "AGENT_LIST_LOADING": "Temsilciler Yükleniyor", + "UPDATE": { + "CHANGE_STATUS": "Change status", + "SNOOZE_UNTIL_NEXT_REPLY": "Snooze until next reply", + "UPDATE_SUCCESFUL": "Conversation status updated successfully.", + "UPDATE_FAILED": "Failed to update conversations, please try again" + }, + "LABELS": { + "ASSIGN_LABELS": "Assign Labels", + "NO_LABELS_FOUND": "No labels found for", + "ASSIGN_SELECTED_LABELS": "Assign selected labels", + "ASSIGN_SUCCESFUL": "Labels assigned successfully", + "ASSIGN_FAILED": "Failed to assign labels, please try again" } + } } diff --git a/app/javascript/dashboard/i18n/locale/tr/contact.json b/app/javascript/dashboard/i18n/locale/tr/contact.json index 6c5eab31d..93d50f95d 100644 --- a/app/javascript/dashboard/i18n/locale/tr/contact.json +++ b/app/javascript/dashboard/i18n/locale/tr/contact.json @@ -111,7 +111,8 @@ "EMAIL_ADDRESS": { "PLACEHOLDER": "Kişinin e-posta adresini girin", "LABEL": "E-posta adresi", - "DUPLICATE": "Bu e-posta adresi başka bir kişi için kullanılıyor." + "DUPLICATE": "Bu e-posta adresi başka bir kişi için kullanılıyor.", + "ERROR": "Lütfen geçerli bir tam e-posta adresi." }, "PHONE_NUMBER": { "PLACEHOLDER": "Kişinin telefon numarasını girin", diff --git a/app/javascript/dashboard/i18n/locale/tr/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/tr/inboxMgmt.json index 6af86660c..fcd544944 100644 --- a/app/javascript/dashboard/i18n/locale/tr/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/tr/inboxMgmt.json @@ -30,7 +30,8 @@ "ADD": { "CHANNEL_NAME": { "LABEL": "Gelen Kutusu Adı", - "PLACEHOLDER": "Enter your inbox name (eg: Acme Inc)" + "PLACEHOLDER": "Enter your inbox name (eg: Acme Inc)", + "ERROR": "Please enter a valid inbox name" }, "WEBSITE_NAME": { "LABEL": "Web Sitesi Adı", @@ -82,7 +83,7 @@ }, "CHANNEL_GREETING_TOGGLE": { "LABEL": "Kanal karşılamasını etkinleştir", - "HELP_TEXT": "Send a greeting message to the users when they starts the conversation.", + "HELP_TEXT": "Automatically send a greeting message when a new conversation is created.", "ENABLED": "Etkin", "DISABLED": "Devre dışı" }, @@ -97,7 +98,10 @@ "LABEL": "Widget Rengi", "PLACEHOLDER": "Widget'ta kullanılan widget rengini güncelleyin" }, - "SUBMIT_BUTTON": "Gelen Kutusu Oluştur" + "SUBMIT_BUTTON": "Gelen Kutusu Oluştur", + "API": { + "ERROR_MESSAGE": "We were not able to create a website channel, please try again" + } }, "TWILIO": { "TITLE": "Twilio SMS/WhatsApp Channel", @@ -193,6 +197,7 @@ "PROVIDERS": { "LABEL": "API Provider", "TWILIO": "Twilio", + "WHATSAPP_CLOUD": "WhatsApp Cloud", "360_DIALOG": "360Dialog" }, "INBOX_NAME": { @@ -205,13 +210,31 @@ "PLACEHOLDER": "Lütfen mesajın gönderileceği telefon numarasını giriniz.", "ERROR": "Lütfen geçerli bir değer girin. Telefon numarası '+' işaretiyle başlamalıdır." }, + "PHONE_NUMBER_ID": { + "LABEL": "Phone number ID", + "PLACEHOLDER": "Please enter the Phone number ID obtained from Facebook developer dashboard.", + "ERROR": "Please enter a valid value." + }, + "BUSINESS_ACCOUNT_ID": { + "LABEL": "Business Account ID", + "PLACEHOLDER": "Please enter the Business Account ID obtained from Facebook developer dashboard.", + "ERROR": "Please enter a valid value." + }, + "WEBHOOK_VERIFY_TOKEN": { + "LABEL": "Webhook Verify Token", + "PLACEHOLDER": "Enter a verify token which you want to configure for facebook webhooks.", + "ERROR": "Please enter a valid value." + }, "API_KEY": { "LABEL": "API key", "SUBTITLE": "Configure the WhatsApp API key.", "PLACEHOLDER": "API key", - "APPLY_FOR_ACCESS": "Don't have any API key? Apply for access here", "ERROR": "Please enter a valid value." }, + "API_CALLBACK": { + "TITLE": "Geri arama URL'si", + "SUBTITLE": "You have to configure the webhook URL in facebook developer portal with the URL mentioned here." + }, "SUBMIT_BUTTON": "Create WhatsApp Channel", "API": { "ERROR_MESSAGE": "We were not able to save the WhatsApp channel" @@ -298,7 +321,7 @@ }, "AUTH": { "TITLE": "Choose a channel", - "DESC": "Chatwoot supports live-chat widget, Facebook page, Twitter profile, WhatsApp, Email etc., as channels. If you want to build a custom channel, you can create it using the API channel. Select one channel from the options below to proceed." + "DESC": "Chatwoot supports live-chat widgets, Facebook Messenger, Twitter profiles, WhatsApp, Emails, etc., as channels. If you want to build a custom channel, you can create it using the API channel. To get started, choose one of the channels below." }, "AGENTS": { "TITLE": "Kullanıcılar", @@ -339,7 +362,7 @@ "API": { "SUCCESS_MESSAGE": "Gelen kutusu ayarları başarıyla güncellendi", "AUTO_ASSIGNMENT_SUCCESS_MESSAGE": "Otomatik atama başarıyla güncellendi", - "ERROR_MESSAGE": "Widget rengi güncellenemedi. Lütfen daha sonra tekrar deneyiniz." + "ERROR_MESSAGE": "We couldn't update inbox settings. Please try again later." }, "EMAIL_COLLECT_BOX": { "ENABLED": "Etkin", @@ -412,15 +435,22 @@ "INBOX_UPDATE_SUB_TEXT": "Gelen kutusu ayarlarınızı güncelleyin", "AUTO_ASSIGNMENT_SUB_TEXT": "Bu gelen kutusuna eklenen aracılara yeni görüşmelerin otomatik olarak atanmasını etkinleştirin veya devre dışı bırakın.", "HMAC_VERIFICATION": "User Identity Validation", - "HMAC_DESCRIPTION": "Inorder to validate the user's identity, the SDK allows you to pass an `identifier_hash` for each user. You can generate HMAC using 'sha256' with the key shown here.", + "HMAC_DESCRIPTION": "In order to validate the user's identity, you can pass an `identifier_hash` for each user. You can generate a HMAC sha256 hash using the `identifier` with the key shown here.", "HMAC_MANDATORY_VERIFICATION": "Enforce User Identity Validation", - "HMAC_MANDATORY_DESCRIPTION": "If enabled, Chatwoot SDKs setUser method will not work unless the `identifier_hash` is provided for each user.", + "HMAC_MANDATORY_DESCRIPTION": "If enabled, requests missing the `identifier_hash` will be rejected.", "INBOX_IDENTIFIER": "Inbox Identifier", "INBOX_IDENTIFIER_SUB_TEXT": "Use the `inbox_identifier` token shown here to authentication your API clients.", "FORWARD_EMAIL_TITLE": "Forward to Email", "FORWARD_EMAIL_SUB_TEXT": "E-postalarınızı aşağıdaki e-posta adresine iletmeye başlayın.", "ALLOW_MESSAGES_AFTER_RESOLVED": "Allow messages after conversation resolved", - "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Allow the end-users to send messages even after the conversation is resolved." + "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Allow the end-users to send messages even after the conversation is resolved.", + "WHATSAPP_SECTION_SUBHEADER": "This API Key is used for the integration with the WhatsApp APIs.", + "WHATSAPP_SECTION_TITLE": "API Key" + }, + "AUTO_ASSIGNMENT": { + "MAX_ASSIGNMENT_LIMIT": "Auto assignment limit", + "MAX_ASSIGNMENT_LIMIT_RANGE_ERROR": "Please enter a value greater than 0", + "MAX_ASSIGNMENT_LIMIT_SUB_TEXT": "Limit the maximum number of conversations from this inbox that can be auto assigned to an agent" }, "FACEBOOK_REAUTHORIZE": { "TITLE": "Yeniden yetkilendir", diff --git a/app/javascript/dashboard/i18n/locale/tr/report.json b/app/javascript/dashboard/i18n/locale/tr/report.json index 5b535f729..b437c4405 100644 --- a/app/javascript/dashboard/i18n/locale/tr/report.json +++ b/app/javascript/dashboard/i18n/locale/tr/report.json @@ -65,6 +65,7 @@ "PLACEHOLDER": "Select date range" }, "GROUP_BY_FILTER_DROPDOWN_LABEL": "Group By", + "DURATION_FILTER_LABEL": "Duration", "GROUP_BY_DAY_OPTIONS": [ { "id": 1, diff --git a/app/javascript/dashboard/i18n/locale/uk/bulkActions.json b/app/javascript/dashboard/i18n/locale/uk/bulkActions.json index 9c84885d9..a17eb601b 100644 --- a/app/javascript/dashboard/i18n/locale/uk/bulkActions.json +++ b/app/javascript/dashboard/i18n/locale/uk/bulkActions.json @@ -1,17 +1,29 @@ { - "BULK_ACTION": { - "CONVERSATIONS_SELECTED": "%{conversationCount} conversations selected", - "AGENT_SELECT_LABEL": "Виберіть агента", - "ASSIGN_CONFIRMATION_LABEL": "Are you sure you want to assign %{conversationCount} %{conversationLabel} to", - "GO_BACK_LABEL": "Go back", - "ASSIGN_LABEL": "Призначити", - "ASSIGN_AGENT_TOOLTIP": "Assign Agent", - "RESOLVE_TOOLTIP": "Вирішити", - "ASSIGN_SUCCESFUL": "Conversations assigned successfully", - "ASSIGN_FAILED": "Failed to assign conversations, please try again", - "RESOLVE_SUCCESFUL": "Conversations resolved successfully", - "RESOLVE_FAILED": "Failed to resolve conversations, please try again", - "ALL_CONVERSATIONS_SELECTED_ALERT": "Conversations visible on this page are only selected.", - "AGENT_LIST_LOADING": "Loading Agents" + "BULK_ACTION": { + "CONVERSATIONS_SELECTED": "Обрано %{conversationCount} розмов", + "AGENT_SELECT_LABEL": "Виберіть агента", + "ASSIGN_CONFIRMATION_LABEL": "Ви впевнені, що бажаєте призначити %{conversationCount} %{conversationLabel} до", + "GO_BACK_LABEL": "Повернутися назад", + "ASSIGN_LABEL": "Призначити", + "ASSIGN_AGENT_TOOLTIP": "Призначити агента", + "ASSIGN_SUCCESFUL": "Розмови успішно призначені", + "ASSIGN_FAILED": "Не вдалося призначити розмови, будь ласка, спробуйте ще раз", + "RESOLVE_SUCCESFUL": "Розмови успішно закриті", + "RESOLVE_FAILED": "Не вдалося закрити розмови, будь ласка, спробуйте ще раз", + "ALL_CONVERSATIONS_SELECTED_ALERT": "Розмови, які відображаються на цій сторінці, обрані.", + "AGENT_LIST_LOADING": "Завантаження Агентів", + "UPDATE": { + "CHANGE_STATUS": "Змінити статус", + "SNOOZE_UNTIL_NEXT_REPLY": "Відкласти до наступної відповіді", + "UPDATE_SUCCESFUL": "Статус розмови успішно оновлено.", + "UPDATE_FAILED": "Не вдалося оновити розмови, будь ласка, спробуйте ще раз" + }, + "LABELS": { + "ASSIGN_LABELS": "Призначити мітки", + "NO_LABELS_FOUND": "Міток не знайдено для", + "ASSIGN_SELECTED_LABELS": "Призначити вибрані мітки", + "ASSIGN_SUCCESFUL": "Мітки додано успішно", + "ASSIGN_FAILED": "Не вдалося призначити мітки, будь ласка, спробуйте ще раз" } + } } diff --git a/app/javascript/dashboard/i18n/locale/uk/contact.json b/app/javascript/dashboard/i18n/locale/uk/contact.json index 39a4fa96f..58b81f587 100644 --- a/app/javascript/dashboard/i18n/locale/uk/contact.json +++ b/app/javascript/dashboard/i18n/locale/uk/contact.json @@ -111,7 +111,8 @@ "EMAIL_ADDRESS": { "PLACEHOLDER": "Введіть адресу електронної пошти контакту", "LABEL": "Адреса електронної пошти", - "DUPLICATE": "Ця електронна адреса вже використовується для іншого контакту." + "DUPLICATE": "Ця електронна адреса вже використовується для іншого контакту.", + "ERROR": "Будь ласка, введіть коректну адресу електронної пошти." }, "PHONE_NUMBER": { "PLACEHOLDER": "Введіть номер телефону контакту", diff --git a/app/javascript/dashboard/i18n/locale/uk/conversation.json b/app/javascript/dashboard/i18n/locale/uk/conversation.json index 7401c0e14..9629514e0 100644 --- a/app/javascript/dashboard/i18n/locale/uk/conversation.json +++ b/app/javascript/dashboard/i18n/locale/uk/conversation.json @@ -1,7 +1,7 @@ { "CONVERSATION": { "404": "Будь ласка, виберіть бесіду з лівої панелі", - "DASHBOARD_APP_TAB_MESSAGES": "Messages", + "DASHBOARD_APP_TAB_MESSAGES": "Текст повідомлень", "UNVERIFIED_SESSION": "Користувач не верифікований", "NO_MESSAGE_1": "Ой! Схоже, у вашій поштовій скринці немає ніяких повідомлень.", "NO_MESSAGE_2": " щоб надіслати повідомлення на вашу сторінку!", @@ -31,7 +31,7 @@ "REPLYING_TO": "Ви відповідаєте:", "REMOVE_SELECTION": "Видалити вибране", "DOWNLOAD": "Звантажити", - "UNKNOWN_FILE_TYPE": "Unknown File", + "UNKNOWN_FILE_TYPE": "Невідомий файл", "UPLOADING_ATTACHMENTS": "Завантаження вкладень...", "SUCCESS_DELETE_MESSAGE": "Повідомлення успішно видалено", "FAIL_DELETE_MESSSAGE": "Не вдалося видалити повідомлення! Спробуйте ще раз", diff --git a/app/javascript/dashboard/i18n/locale/uk/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/uk/inboxMgmt.json index e23830084..3cf67c3ad 100644 --- a/app/javascript/dashboard/i18n/locale/uk/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/uk/inboxMgmt.json @@ -30,7 +30,8 @@ "ADD": { "CHANNEL_NAME": { "LABEL": "Назва Джерела", - "PLACEHOLDER": "Введіть назву свого Джерела (наприклад: Acme Inc)" + "PLACEHOLDER": "Введіть назву свого Джерела (наприклад: Acme Inc)", + "ERROR": "Please enter a valid inbox name" }, "WEBSITE_NAME": { "LABEL": "Назва сайту", @@ -82,7 +83,7 @@ }, "CHANNEL_GREETING_TOGGLE": { "LABEL": "Увімкнути вітання каналу", - "HELP_TEXT": "Відправляйте вітальне повідомлення користувачам, коли вони розпочинають розмову.", + "HELP_TEXT": "Автоматично надсилати привітальне повідомлення після створення нової розмови.", "ENABLED": "Увімкнено", "DISABLED": "Вимкнено" }, @@ -97,7 +98,10 @@ "LABEL": "Колір віджета", "PLACEHOLDER": "Оновити колір віджета" }, - "SUBMIT_BUTTON": "Створити скриньку \"Вхідні\"" + "SUBMIT_BUTTON": "Створити скриньку \"Вхідні\"", + "API": { + "ERROR_MESSAGE": "We were not able to create a website channel, please try again" + } }, "TWILIO": { "TITLE": "Twilio SMS/WhatsApp канал", @@ -193,6 +197,7 @@ "PROVIDERS": { "LABEL": "API Provider", "TWILIO": "Twilio", + "WHATSAPP_CLOUD": "WhatsApp Cloud", "360_DIALOG": "360Dialog" }, "INBOX_NAME": { @@ -205,13 +210,31 @@ "PLACEHOLDER": "Будь ласка, введіть номер телефону, з якого будуть надсилатися повідомлення.", "ERROR": "Номер телефону повинен починатися з символу `+'." }, + "PHONE_NUMBER_ID": { + "LABEL": "Phone number ID", + "PLACEHOLDER": "Please enter the Phone number ID obtained from Facebook developer dashboard.", + "ERROR": "Будь ласка введіть правильне значення." + }, + "BUSINESS_ACCOUNT_ID": { + "LABEL": "Business Account ID", + "PLACEHOLDER": "Please enter the Business Account ID obtained from Facebook developer dashboard.", + "ERROR": "Будь ласка введіть правильне значення." + }, + "WEBHOOK_VERIFY_TOKEN": { + "LABEL": "Webhook Verify Token", + "PLACEHOLDER": "Enter a verify token which you want to configure for facebook webhooks.", + "ERROR": "Будь ласка введіть правильне значення." + }, "API_KEY": { "LABEL": "API ключ", "SUBTITLE": "Налаштуйте ключ WhatsApp API.", "PLACEHOLDER": "API ключ", - "APPLY_FOR_ACCESS": "У вас немає жодного ключа API? Він потрібен для доступу", "ERROR": "Будь ласка введіть правильне значення." }, + "API_CALLBACK": { + "TITLE": "Callback URL", + "SUBTITLE": "You have to configure the webhook URL in facebook developer portal with the URL mentioned here." + }, "SUBMIT_BUTTON": "Створити канал WhatsApp", "API": { "ERROR_MESSAGE": "Ми не змогли зберегти канал WhatsApp" @@ -298,7 +321,7 @@ }, "AUTH": { "TITLE": "Оберіть канал", - "DESC": "Chatwoot підтримує віджет live-Chat, сторінку Facebook, профіль Twitter, WhatsApp, Email і т. п., як канали. Якщо ви хочете створити користувацький канал, ви можете створити його за допомогою каналу API. Виберіть один канал з параметрів нижче, щоб продовжити." + "DESC": "Chatwoot supports live-chat widgets, Facebook Messenger, Twitter profiles, WhatsApp, Emails, etc., as channels. If you want to build a custom channel, you can create it using the API channel. To get started, choose one of the channels below." }, "AGENTS": { "TITLE": "Агенти", @@ -339,7 +362,7 @@ "API": { "SUCCESS_MESSAGE": "Налаштування вхідних повідомлень успішно оновлені", "AUTO_ASSIGNMENT_SUCCESS_MESSAGE": "Автопризначення успішно оновлено", - "ERROR_MESSAGE": "Не вдалося оновити колір віджету. Будь ласка, спробуйте ще раз." + "ERROR_MESSAGE": "We couldn't update inbox settings. Please try again later." }, "EMAIL_COLLECT_BOX": { "ENABLED": "Увімкнено", @@ -398,8 +421,8 @@ "MESSENGER_SUB_HEAD": "Добавте кнопку на сторінки вашого сайту", "INBOX_AGENTS": "Агенти", "INBOX_AGENTS_SUB_TEXT": "Додати або вилучити агентів з скриньки Вхідні", - "AGENT_ASSIGNMENT": "Conversation Assignment", - "AGENT_ASSIGNMENT_SUB_TEXT": "Update conversation assignment settings", + "AGENT_ASSIGNMENT": "Призначення до розмови", + "AGENT_ASSIGNMENT_SUB_TEXT": "Оновити налаштування призначення для бесіди", "UPDATE": "Оновити", "ENABLE_EMAIL_COLLECT_BOX": "Включити збір електронної пошти", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Увімкнути або вимкнути ящик збору повідомлень в новій розмові", @@ -412,15 +435,22 @@ "INBOX_UPDATE_SUB_TEXT": "Оновіть параметри каналу", "AUTO_ASSIGNMENT_SUB_TEXT": "Увімкнення або вимкнення автоматичного призначення нових розмов до агентів, доданих до цього каналу.", "HMAC_VERIFICATION": "Перевірка ідентифікації користувача", - "HMAC_DESCRIPTION": "Щоб підтвердити ідентифікацію користувача, SDK дозволяє вам передати `identifier_hash` для кожного користувача. Тут можна згенерувати HMAC за допомогою 'sha256'.", + "HMAC_DESCRIPTION": "In order to validate the user's identity, you can pass an `identifier_hash` for each user. You can generate a HMAC sha256 hash using the `identifier` with the key shown here.", "HMAC_MANDATORY_VERIFICATION": "Застосувати примусову перевірку особистості користувача", - "HMAC_MANDATORY_DESCRIPTION": "Якщо увімкнено, метод Chatwoot SDKs setUser не буде працювати, якщо тільки для кожного користувача не надається `identifier_hash'.", + "HMAC_MANDATORY_DESCRIPTION": "If enabled, requests missing the `identifier_hash` will be rejected.", "INBOX_IDENTIFIER": "Ідентифікатор каналу", "INBOX_IDENTIFIER_SUB_TEXT": "Використовуйте токен `inbox_identifier`, показаний тут для аутентифікації ваших API клієнтів.", "FORWARD_EMAIL_TITLE": "Переслати на ел. пошту", "FORWARD_EMAIL_SUB_TEXT": "Почніть перенаправляти листи до наступної адреси електронної пошти.", "ALLOW_MESSAGES_AFTER_RESOLVED": "Дозволити повідомлення після закінчення розмови", - "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Дозволити кінцевим користувачам надсилати повідомлення навіть після закриття розмови." + "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Дозволити кінцевим користувачам надсилати повідомлення навіть після закриття розмови.", + "WHATSAPP_SECTION_SUBHEADER": "This API Key is used for the integration with the WhatsApp APIs.", + "WHATSAPP_SECTION_TITLE": "API ключ" + }, + "AUTO_ASSIGNMENT": { + "MAX_ASSIGNMENT_LIMIT": "Ліміт автопризначення", + "MAX_ASSIGNMENT_LIMIT_RANGE_ERROR": "Будь ласка, введіть значення, більше за 0", + "MAX_ASSIGNMENT_LIMIT_SUB_TEXT": "Обмеження максимальної кількості розмов із цього джерела, яку можна автоматично призначити агенту" }, "FACEBOOK_REAUTHORIZE": { "TITLE": "Повторна авторизація", diff --git a/app/javascript/dashboard/i18n/locale/uk/report.json b/app/javascript/dashboard/i18n/locale/uk/report.json index cda566237..eee4c378d 100644 --- a/app/javascript/dashboard/i18n/locale/uk/report.json +++ b/app/javascript/dashboard/i18n/locale/uk/report.json @@ -65,6 +65,7 @@ "PLACEHOLDER": "Виберіть діапазон дат" }, "GROUP_BY_FILTER_DROPDOWN_LABEL": "Групувати за", + "DURATION_FILTER_LABEL": "Duration", "GROUP_BY_DAY_OPTIONS": [ { "id": 1, @@ -386,7 +387,7 @@ "CSAT_REPORTS": { "HEADER": "Звіти CSAT", "NO_RECORDS": "Немає доступних відповідей для опитувань CSAT.", - "DOWNLOAD": "Download CSAT Reports", + "DOWNLOAD": "Завантажити CSAT звіти", "FILTERS": { "AGENTS": { "PLACEHOLDER": "Виберіть Агентів" diff --git a/app/javascript/dashboard/i18n/locale/uk/settings.json b/app/javascript/dashboard/i18n/locale/uk/settings.json index d5dbd201f..b39f49818 100644 --- a/app/javascript/dashboard/i18n/locale/uk/settings.json +++ b/app/javascript/dashboard/i18n/locale/uk/settings.json @@ -21,7 +21,7 @@ }, "MESSAGE_SIGNATURE_SECTION": { "TITLE": "Підпис особистого повідомлення", - "NOTE": "Create a personal message signature that would be added to all the messages you send from your email inbox. Use the rich content editor to create a highly personalised signature.", + "NOTE": "Створити особистий підпис повідомлення, який буде додано до всіх повідомлень, надісланих з поштової скриньки. Використовуйте редактор багатокористувацького контенту для створення персоналізованого підпису.", "BTN_TEXT": "Зберегти підпис повідомлення", "API_ERROR": "Не вдалося зберегти підпис! Повторіть спробу", "API_SUCCESS": "Підпис успішно збережено" @@ -151,7 +151,7 @@ }, "SIDEBAR": { "CURRENTLY_VIEWING_ACCOUNT": "Зараз переглядається:", - "SWITCH": "Switch", + "SWITCH": "Перемкнути", "CONVERSATIONS": "Бесіди", "ALL_CONVERSATIONS": "Всі розмови", "MENTIONED_CONVERSATIONS": "Згадування", @@ -188,7 +188,7 @@ "REPORTS_INBOX": "Канал", "REPORTS_TEAM": "Команда", "SET_AVAILABILITY_TITLE": "Позначити себе як", - "BETA": "Бета-версія", + "BETA": "Beta", "REPORTS_OVERVIEW": "Огляд", "FACEBOOK_REAUTHORIZE": "Підключення до Facebook закінчилося, будь ласка, поновіть сторінку Facebook, щоб продовжити роботу служб" }, diff --git a/app/javascript/dashboard/i18n/locale/uk/whatsappTemplates.json b/app/javascript/dashboard/i18n/locale/uk/whatsappTemplates.json index bbcf28156..5e392b592 100644 --- a/app/javascript/dashboard/i18n/locale/uk/whatsappTemplates.json +++ b/app/javascript/dashboard/i18n/locale/uk/whatsappTemplates.json @@ -1,25 +1,25 @@ { "WHATSAPP_TEMPLATES": { "MODAL": { - "TITLE": "Whatsapp Templates", - "SUBTITLE": "Select the whatsapp template you want to send", - "TEMPLATE_SELECTED_SUBTITLE": "Process %{templateName}" + "TITLE": "Шаблони Whatsapp", + "SUBTITLE": "Виберіть шаблон whatsApp, який Ви хочете надіслати", + "TEMPLATE_SELECTED_SUBTITLE": "Процес %{templateName}" }, "PICKER": { - "SEARCH_PLACEHOLDER": "Search Templates", - "NO_TEMPLATES_FOUND": "No templates found for", + "SEARCH_PLACEHOLDER": "Знайти шаблони", + "NO_TEMPLATES_FOUND": "Шаблонів не знайдено для", "LABELS": { - "LANGUAGE": "Language", - "TEMPLATE_BODY": "Template Body", - "CATEGORY": "Category" + "LANGUAGE": "Мова", + "TEMPLATE_BODY": "Тіло шаблона", + "CATEGORY": "Категорія" } }, "PARSER": { - "VARIABLES_LABEL": "Variables", - "VARIABLE_PLACEHOLDER": "Enter %{variable} value", - "GO_BACK_LABEL": "Go Back", - "SEND_MESSAGE_LABEL": "Send Message", - "FORM_ERROR_MESSAGE": "Please fill all variables before sending" + "VARIABLES_LABEL": "Змінні", + "VARIABLE_PLACEHOLDER": "Введіть значення %{variable}", + "GO_BACK_LABEL": "Повернутися", + "SEND_MESSAGE_LABEL": "Надіслати повідомлення", + "FORM_ERROR_MESSAGE": "Будь ласка, заповніть всі змінні перед надсиланням" } } } diff --git a/app/javascript/dashboard/i18n/locale/ur/bulkActions.json b/app/javascript/dashboard/i18n/locale/ur/bulkActions.json index e540720a3..7061e5e70 100644 --- a/app/javascript/dashboard/i18n/locale/ur/bulkActions.json +++ b/app/javascript/dashboard/i18n/locale/ur/bulkActions.json @@ -1,17 +1,29 @@ { - "BULK_ACTION": { - "CONVERSATIONS_SELECTED": "%{conversationCount} conversations selected", - "AGENT_SELECT_LABEL": "Select Agent", - "ASSIGN_CONFIRMATION_LABEL": "Are you sure you want to assign %{conversationCount} %{conversationLabel} to", - "GO_BACK_LABEL": "Go back", - "ASSIGN_LABEL": "Assign", - "ASSIGN_AGENT_TOOLTIP": "Assign Agent", - "RESOLVE_TOOLTIP": "حل کریں۔", - "ASSIGN_SUCCESFUL": "Conversations assigned successfully", - "ASSIGN_FAILED": "Failed to assign conversations, please try again", - "RESOLVE_SUCCESFUL": "Conversations resolved successfully", - "RESOLVE_FAILED": "Failed to resolve conversations, please try again", - "ALL_CONVERSATIONS_SELECTED_ALERT": "Conversations visible on this page are only selected.", - "AGENT_LIST_LOADING": "Loading Agents" + "BULK_ACTION": { + "CONVERSATIONS_SELECTED": "%{conversationCount} conversations selected", + "AGENT_SELECT_LABEL": "Select Agent", + "ASSIGN_CONFIRMATION_LABEL": "Are you sure you want to assign %{conversationCount} %{conversationLabel} to", + "GO_BACK_LABEL": "Go back", + "ASSIGN_LABEL": "Assign", + "ASSIGN_AGENT_TOOLTIP": "Assign Agent", + "ASSIGN_SUCCESFUL": "Conversations assigned successfully", + "ASSIGN_FAILED": "Failed to assign conversations, please try again", + "RESOLVE_SUCCESFUL": "Conversations resolved successfully", + "RESOLVE_FAILED": "Failed to resolve conversations, please try again", + "ALL_CONVERSATIONS_SELECTED_ALERT": "Conversations visible on this page are only selected.", + "AGENT_LIST_LOADING": "Loading Agents", + "UPDATE": { + "CHANGE_STATUS": "Change status", + "SNOOZE_UNTIL_NEXT_REPLY": "Snooze until next reply", + "UPDATE_SUCCESFUL": "Conversation status updated successfully.", + "UPDATE_FAILED": "Failed to update conversations, please try again" + }, + "LABELS": { + "ASSIGN_LABELS": "Assign Labels", + "NO_LABELS_FOUND": "No labels found for", + "ASSIGN_SELECTED_LABELS": "Assign selected labels", + "ASSIGN_SUCCESFUL": "Labels assigned successfully", + "ASSIGN_FAILED": "Failed to assign labels, please try again" } + } } diff --git a/app/javascript/dashboard/i18n/locale/ur/contact.json b/app/javascript/dashboard/i18n/locale/ur/contact.json index a2c5575ef..88c168434 100644 --- a/app/javascript/dashboard/i18n/locale/ur/contact.json +++ b/app/javascript/dashboard/i18n/locale/ur/contact.json @@ -111,7 +111,8 @@ "EMAIL_ADDRESS": { "PLACEHOLDER": "کانٹیکٹ کا ای میل درج کریں۔", "LABEL": "ای میل اڈریس", - "DUPLICATE": "یہ ای میل دوسرے کانٹیکٹ کے لیے استعمال میں ہے۔." + "DUPLICATE": "یہ ای میل دوسرے کانٹیکٹ کے لیے استعمال میں ہے۔.", + "ERROR": "Please enter a valid email address." }, "PHONE_NUMBER": { "PLACEHOLDER": "کانٹیکٹ کا فون نمبر درج کریں۔", diff --git a/app/javascript/dashboard/i18n/locale/ur/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ur/inboxMgmt.json index 608cc19b7..0e703ff39 100644 --- a/app/javascript/dashboard/i18n/locale/ur/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/ur/inboxMgmt.json @@ -30,7 +30,8 @@ "ADD": { "CHANNEL_NAME": { "LABEL": "Inbox Name", - "PLACEHOLDER": "Enter your inbox name (eg: Acme Inc)" + "PLACEHOLDER": "Enter your inbox name (eg: Acme Inc)", + "ERROR": "Please enter a valid inbox name" }, "WEBSITE_NAME": { "LABEL": "Website Name", @@ -82,7 +83,7 @@ }, "CHANNEL_GREETING_TOGGLE": { "LABEL": "Enable channel greeting", - "HELP_TEXT": "Send a greeting message to the users when they starts the conversation.", + "HELP_TEXT": "Automatically send a greeting message when a new conversation is created.", "ENABLED": "Enabled", "DISABLED": "Disabled" }, @@ -97,7 +98,10 @@ "LABEL": "Widget Color", "PLACEHOLDER": "Update the widget color used in widget" }, - "SUBMIT_BUTTON": "Create inbox" + "SUBMIT_BUTTON": "Create inbox", + "API": { + "ERROR_MESSAGE": "We were not able to create a website channel, please try again" + } }, "TWILIO": { "TITLE": "Twilio SMS/WhatsApp Channel", @@ -193,6 +197,7 @@ "PROVIDERS": { "LABEL": "API Provider", "TWILIO": "Twilio", + "WHATSAPP_CLOUD": "WhatsApp Cloud", "360_DIALOG": "360Dialog" }, "INBOX_NAME": { @@ -205,13 +210,31 @@ "PLACEHOLDER": "Please enter the phone number from which message will be sent.", "ERROR": "Please enter a valid value. Phone number should start with `+` sign." }, + "PHONE_NUMBER_ID": { + "LABEL": "Phone number ID", + "PLACEHOLDER": "Please enter the Phone number ID obtained from Facebook developer dashboard.", + "ERROR": "Please enter a valid value." + }, + "BUSINESS_ACCOUNT_ID": { + "LABEL": "Business Account ID", + "PLACEHOLDER": "Please enter the Business Account ID obtained from Facebook developer dashboard.", + "ERROR": "Please enter a valid value." + }, + "WEBHOOK_VERIFY_TOKEN": { + "LABEL": "Webhook Verify Token", + "PLACEHOLDER": "Enter a verify token which you want to configure for facebook webhooks.", + "ERROR": "Please enter a valid value." + }, "API_KEY": { "LABEL": "API key", "SUBTITLE": "Configure the WhatsApp API key.", "PLACEHOLDER": "API key", - "APPLY_FOR_ACCESS": "Don't have any API key? Apply for access here", "ERROR": "Please enter a valid value." }, + "API_CALLBACK": { + "TITLE": "Callback URL", + "SUBTITLE": "You have to configure the webhook URL in facebook developer portal with the URL mentioned here." + }, "SUBMIT_BUTTON": "Create WhatsApp Channel", "API": { "ERROR_MESSAGE": "We were not able to save the WhatsApp channel" @@ -298,7 +321,7 @@ }, "AUTH": { "TITLE": "Choose a channel", - "DESC": "Chatwoot supports live-chat widget, Facebook page, Twitter profile, WhatsApp, Email etc., as channels. If you want to build a custom channel, you can create it using the API channel. Select one channel from the options below to proceed." + "DESC": "Chatwoot supports live-chat widgets, Facebook Messenger, Twitter profiles, WhatsApp, Emails, etc., as channels. If you want to build a custom channel, you can create it using the API channel. To get started, choose one of the channels below." }, "AGENTS": { "TITLE": "ایجنٹ", @@ -339,7 +362,7 @@ "API": { "SUCCESS_MESSAGE": "Inbox settings updated successfully", "AUTO_ASSIGNMENT_SUCCESS_MESSAGE": "Auto assignment updated successfully", - "ERROR_MESSAGE": "Could not update widget color. Please try again later." + "ERROR_MESSAGE": "We couldn't update inbox settings. Please try again later." }, "EMAIL_COLLECT_BOX": { "ENABLED": "Enabled", @@ -412,15 +435,22 @@ "INBOX_UPDATE_SUB_TEXT": "Update your inbox settings", "AUTO_ASSIGNMENT_SUB_TEXT": "Enable or disable the automatic assignment of new conversations to the agents added to this inbox.", "HMAC_VERIFICATION": "User Identity Validation", - "HMAC_DESCRIPTION": "Inorder to validate the user's identity, the SDK allows you to pass an `identifier_hash` for each user. You can generate HMAC using 'sha256' with the key shown here.", + "HMAC_DESCRIPTION": "In order to validate the user's identity, you can pass an `identifier_hash` for each user. You can generate a HMAC sha256 hash using the `identifier` with the key shown here.", "HMAC_MANDATORY_VERIFICATION": "Enforce User Identity Validation", - "HMAC_MANDATORY_DESCRIPTION": "If enabled, Chatwoot SDKs setUser method will not work unless the `identifier_hash` is provided for each user.", + "HMAC_MANDATORY_DESCRIPTION": "If enabled, requests missing the `identifier_hash` will be rejected.", "INBOX_IDENTIFIER": "Inbox Identifier", "INBOX_IDENTIFIER_SUB_TEXT": "Use the `inbox_identifier` token shown here to authentication your API clients.", "FORWARD_EMAIL_TITLE": "Forward to Email", "FORWARD_EMAIL_SUB_TEXT": "Start forwarding your emails to the following email address.", "ALLOW_MESSAGES_AFTER_RESOLVED": "Allow messages after conversation resolved", - "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Allow the end-users to send messages even after the conversation is resolved." + "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Allow the end-users to send messages even after the conversation is resolved.", + "WHATSAPP_SECTION_SUBHEADER": "This API Key is used for the integration with the WhatsApp APIs.", + "WHATSAPP_SECTION_TITLE": "API Key" + }, + "AUTO_ASSIGNMENT": { + "MAX_ASSIGNMENT_LIMIT": "Auto assignment limit", + "MAX_ASSIGNMENT_LIMIT_RANGE_ERROR": "Please enter a value greater than 0", + "MAX_ASSIGNMENT_LIMIT_SUB_TEXT": "Limit the maximum number of conversations from this inbox that can be auto assigned to an agent" }, "FACEBOOK_REAUTHORIZE": { "TITLE": "Reauthorize", diff --git a/app/javascript/dashboard/i18n/locale/ur/report.json b/app/javascript/dashboard/i18n/locale/ur/report.json index 524e1f812..aab038eb0 100644 --- a/app/javascript/dashboard/i18n/locale/ur/report.json +++ b/app/javascript/dashboard/i18n/locale/ur/report.json @@ -65,6 +65,7 @@ "PLACEHOLDER": "Select date range" }, "GROUP_BY_FILTER_DROPDOWN_LABEL": "Group By", + "DURATION_FILTER_LABEL": "Duration", "GROUP_BY_DAY_OPTIONS": [ { "id": 1, diff --git a/app/javascript/dashboard/i18n/locale/ur_IN/bulkActions.json b/app/javascript/dashboard/i18n/locale/ur_IN/bulkActions.json index bfd688bef..7061e5e70 100644 --- a/app/javascript/dashboard/i18n/locale/ur_IN/bulkActions.json +++ b/app/javascript/dashboard/i18n/locale/ur_IN/bulkActions.json @@ -1,17 +1,29 @@ { - "BULK_ACTION": { - "CONVERSATIONS_SELECTED": "%{conversationCount} conversations selected", - "AGENT_SELECT_LABEL": "Select Agent", - "ASSIGN_CONFIRMATION_LABEL": "Are you sure you want to assign %{conversationCount} %{conversationLabel} to", - "GO_BACK_LABEL": "Go back", - "ASSIGN_LABEL": "Assign", - "ASSIGN_AGENT_TOOLTIP": "Assign Agent", - "RESOLVE_TOOLTIP": "Resolve", - "ASSIGN_SUCCESFUL": "Conversations assigned successfully", - "ASSIGN_FAILED": "Failed to assign conversations, please try again", - "RESOLVE_SUCCESFUL": "Conversations resolved successfully", - "RESOLVE_FAILED": "Failed to resolve conversations, please try again", - "ALL_CONVERSATIONS_SELECTED_ALERT": "Conversations visible on this page are only selected.", - "AGENT_LIST_LOADING": "Loading Agents" + "BULK_ACTION": { + "CONVERSATIONS_SELECTED": "%{conversationCount} conversations selected", + "AGENT_SELECT_LABEL": "Select Agent", + "ASSIGN_CONFIRMATION_LABEL": "Are you sure you want to assign %{conversationCount} %{conversationLabel} to", + "GO_BACK_LABEL": "Go back", + "ASSIGN_LABEL": "Assign", + "ASSIGN_AGENT_TOOLTIP": "Assign Agent", + "ASSIGN_SUCCESFUL": "Conversations assigned successfully", + "ASSIGN_FAILED": "Failed to assign conversations, please try again", + "RESOLVE_SUCCESFUL": "Conversations resolved successfully", + "RESOLVE_FAILED": "Failed to resolve conversations, please try again", + "ALL_CONVERSATIONS_SELECTED_ALERT": "Conversations visible on this page are only selected.", + "AGENT_LIST_LOADING": "Loading Agents", + "UPDATE": { + "CHANGE_STATUS": "Change status", + "SNOOZE_UNTIL_NEXT_REPLY": "Snooze until next reply", + "UPDATE_SUCCESFUL": "Conversation status updated successfully.", + "UPDATE_FAILED": "Failed to update conversations, please try again" + }, + "LABELS": { + "ASSIGN_LABELS": "Assign Labels", + "NO_LABELS_FOUND": "No labels found for", + "ASSIGN_SELECTED_LABELS": "Assign selected labels", + "ASSIGN_SUCCESFUL": "Labels assigned successfully", + "ASSIGN_FAILED": "Failed to assign labels, please try again" } + } } diff --git a/app/javascript/dashboard/i18n/locale/ur_IN/contact.json b/app/javascript/dashboard/i18n/locale/ur_IN/contact.json index 2257b4573..fa6bb6ce7 100644 --- a/app/javascript/dashboard/i18n/locale/ur_IN/contact.json +++ b/app/javascript/dashboard/i18n/locale/ur_IN/contact.json @@ -111,7 +111,8 @@ "EMAIL_ADDRESS": { "PLACEHOLDER": "Enter the email address of the contact", "LABEL": "Email Address", - "DUPLICATE": "This email address is in use for another contact." + "DUPLICATE": "This email address is in use for another contact.", + "ERROR": "Please enter a valid email address." }, "PHONE_NUMBER": { "PLACEHOLDER": "Enter the phone number of the contact", diff --git a/app/javascript/dashboard/i18n/locale/ur_IN/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ur_IN/inboxMgmt.json index e9ee9c5b8..09f918351 100644 --- a/app/javascript/dashboard/i18n/locale/ur_IN/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/ur_IN/inboxMgmt.json @@ -30,7 +30,8 @@ "ADD": { "CHANNEL_NAME": { "LABEL": "Inbox Name", - "PLACEHOLDER": "Enter your inbox name (eg: Acme Inc)" + "PLACEHOLDER": "Enter your inbox name (eg: Acme Inc)", + "ERROR": "Please enter a valid inbox name" }, "WEBSITE_NAME": { "LABEL": "Website Name", @@ -82,7 +83,7 @@ }, "CHANNEL_GREETING_TOGGLE": { "LABEL": "Enable channel greeting", - "HELP_TEXT": "Send a greeting message to the users when they starts the conversation.", + "HELP_TEXT": "Automatically send a greeting message when a new conversation is created.", "ENABLED": "Enabled", "DISABLED": "Disabled" }, @@ -97,7 +98,10 @@ "LABEL": "Widget Color", "PLACEHOLDER": "Update the widget color used in widget" }, - "SUBMIT_BUTTON": "Create inbox" + "SUBMIT_BUTTON": "Create inbox", + "API": { + "ERROR_MESSAGE": "We were not able to create a website channel, please try again" + } }, "TWILIO": { "TITLE": "Twilio SMS/WhatsApp Channel", @@ -193,6 +197,7 @@ "PROVIDERS": { "LABEL": "API Provider", "TWILIO": "Twilio", + "WHATSAPP_CLOUD": "WhatsApp Cloud", "360_DIALOG": "360Dialog" }, "INBOX_NAME": { @@ -205,13 +210,31 @@ "PLACEHOLDER": "Please enter the phone number from which message will be sent.", "ERROR": "Please enter a valid value. Phone number should start with `+` sign." }, + "PHONE_NUMBER_ID": { + "LABEL": "Phone number ID", + "PLACEHOLDER": "Please enter the Phone number ID obtained from Facebook developer dashboard.", + "ERROR": "Please enter a valid value." + }, + "BUSINESS_ACCOUNT_ID": { + "LABEL": "Business Account ID", + "PLACEHOLDER": "Please enter the Business Account ID obtained from Facebook developer dashboard.", + "ERROR": "Please enter a valid value." + }, + "WEBHOOK_VERIFY_TOKEN": { + "LABEL": "Webhook Verify Token", + "PLACEHOLDER": "Enter a verify token which you want to configure for facebook webhooks.", + "ERROR": "Please enter a valid value." + }, "API_KEY": { "LABEL": "API key", "SUBTITLE": "Configure the WhatsApp API key.", "PLACEHOLDER": "API key", - "APPLY_FOR_ACCESS": "Don't have any API key? Apply for access here", "ERROR": "Please enter a valid value." }, + "API_CALLBACK": { + "TITLE": "Callback URL", + "SUBTITLE": "You have to configure the webhook URL in facebook developer portal with the URL mentioned here." + }, "SUBMIT_BUTTON": "Create WhatsApp Channel", "API": { "ERROR_MESSAGE": "We were not able to save the WhatsApp channel" @@ -298,7 +321,7 @@ }, "AUTH": { "TITLE": "Choose a channel", - "DESC": "Chatwoot supports live-chat widget, Facebook page, Twitter profile, WhatsApp, Email etc., as channels. If you want to build a custom channel, you can create it using the API channel. Select one channel from the options below to proceed." + "DESC": "Chatwoot supports live-chat widgets, Facebook Messenger, Twitter profiles, WhatsApp, Emails, etc., as channels. If you want to build a custom channel, you can create it using the API channel. To get started, choose one of the channels below." }, "AGENTS": { "TITLE": "Agents", @@ -339,7 +362,7 @@ "API": { "SUCCESS_MESSAGE": "Inbox settings updated successfully", "AUTO_ASSIGNMENT_SUCCESS_MESSAGE": "Auto assignment updated successfully", - "ERROR_MESSAGE": "Could not update widget color. Please try again later." + "ERROR_MESSAGE": "We couldn't update inbox settings. Please try again later." }, "EMAIL_COLLECT_BOX": { "ENABLED": "Enabled", @@ -412,15 +435,22 @@ "INBOX_UPDATE_SUB_TEXT": "Update your inbox settings", "AUTO_ASSIGNMENT_SUB_TEXT": "Enable or disable the automatic assignment of new conversations to the agents added to this inbox.", "HMAC_VERIFICATION": "User Identity Validation", - "HMAC_DESCRIPTION": "Inorder to validate the user's identity, the SDK allows you to pass an `identifier_hash` for each user. You can generate HMAC using 'sha256' with the key shown here.", + "HMAC_DESCRIPTION": "In order to validate the user's identity, you can pass an `identifier_hash` for each user. You can generate a HMAC sha256 hash using the `identifier` with the key shown here.", "HMAC_MANDATORY_VERIFICATION": "Enforce User Identity Validation", - "HMAC_MANDATORY_DESCRIPTION": "If enabled, Chatwoot SDKs setUser method will not work unless the `identifier_hash` is provided for each user.", + "HMAC_MANDATORY_DESCRIPTION": "If enabled, requests missing the `identifier_hash` will be rejected.", "INBOX_IDENTIFIER": "Inbox Identifier", "INBOX_IDENTIFIER_SUB_TEXT": "Use the `inbox_identifier` token shown here to authentication your API clients.", "FORWARD_EMAIL_TITLE": "Forward to Email", "FORWARD_EMAIL_SUB_TEXT": "Start forwarding your emails to the following email address.", "ALLOW_MESSAGES_AFTER_RESOLVED": "Allow messages after conversation resolved", - "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Allow the end-users to send messages even after the conversation is resolved." + "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Allow the end-users to send messages even after the conversation is resolved.", + "WHATSAPP_SECTION_SUBHEADER": "This API Key is used for the integration with the WhatsApp APIs.", + "WHATSAPP_SECTION_TITLE": "API Key" + }, + "AUTO_ASSIGNMENT": { + "MAX_ASSIGNMENT_LIMIT": "Auto assignment limit", + "MAX_ASSIGNMENT_LIMIT_RANGE_ERROR": "Please enter a value greater than 0", + "MAX_ASSIGNMENT_LIMIT_SUB_TEXT": "Limit the maximum number of conversations from this inbox that can be auto assigned to an agent" }, "FACEBOOK_REAUTHORIZE": { "TITLE": "Reauthorize", diff --git a/app/javascript/dashboard/i18n/locale/ur_IN/report.json b/app/javascript/dashboard/i18n/locale/ur_IN/report.json index 2388e913a..0bd9b544d 100644 --- a/app/javascript/dashboard/i18n/locale/ur_IN/report.json +++ b/app/javascript/dashboard/i18n/locale/ur_IN/report.json @@ -65,6 +65,7 @@ "PLACEHOLDER": "Select date range" }, "GROUP_BY_FILTER_DROPDOWN_LABEL": "Group By", + "DURATION_FILTER_LABEL": "Duration", "GROUP_BY_DAY_OPTIONS": [ { "id": 1, diff --git a/app/javascript/dashboard/i18n/locale/vi/advancedFilters.json b/app/javascript/dashboard/i18n/locale/vi/advancedFilters.json index c3763b79b..4d1fa6407 100644 --- a/app/javascript/dashboard/i18n/locale/vi/advancedFilters.json +++ b/app/javascript/dashboard/i18n/locale/vi/advancedFilters.json @@ -22,7 +22,7 @@ "is_not_present": "Không có", "is_greater_than": "Lớn hơn", "is_less_than": "Nhỏ hơn", - "days_before": "Is x days before" + "days_before": "Khoảng x ngày trước" }, "ATTRIBUTE_LABELS": { "TRUE": "Đúng", @@ -44,7 +44,7 @@ "CUSTOM_ATTRIBUTE_NUMBER": "Số", "CUSTOM_ATTRIBUTE_LINK": "Liên kết", "CUSTOM_ATTRIBUTE_CHECKBOX": "Checkbox", - "CREATED_AT": "Created At", + "CREATED_AT": "Tạo vào lúc", "LAST_ACTIVITY": "Hành động cuối cùng" }, "GROUPS": { diff --git a/app/javascript/dashboard/i18n/locale/vi/automation.json b/app/javascript/dashboard/i18n/locale/vi/automation.json index ac127a1b8..fddc23837 100644 --- a/app/javascript/dashboard/i18n/locale/vi/automation.json +++ b/app/javascript/dashboard/i18n/locale/vi/automation.json @@ -90,27 +90,27 @@ }, "ACTION": { "DELETE_MESSAGE": "Bạn cần có ít nhất một hành động để lưu", - "TEAM_MESSAGE_INPUT_PLACEHOLDER": "Enter your message here", - "TEAM_DROPDOWN_PLACEHOLDER": "Select teams" + "TEAM_MESSAGE_INPUT_PLACEHOLDER": "Viết tin nhắn ở đây", + "TEAM_DROPDOWN_PLACEHOLDER": "Chọn nhóm" }, "TOGGLE": { - "ACTIVATION_TITLE": "Activate Automation Rule", - "DEACTIVATION_TITLE": "Deactivate Automation Rule", - "ACTIVATION_DESCRIPTION": "This action will activate the automation rule '{automationName}'. Are you sure you want to proceed?", - "DEACTIVATION_DESCRIPTION": "This action will deactivate the automation rule '{automationName}'. Are you sure you want to proceed?", - "ACTIVATION_SUCCESFUL": "Automation Rule Activated Successfully", - "DEACTIVATION_SUCCESFUL": "Automation Rule Deactivated Successfully", - "ACTIVATION_ERROR": "Could not Activate Automation, Please try again later", - "DEACTIVATION_ERROR": "Could not Deactivate Automation, Please try again later", + "ACTIVATION_TITLE": "Kích hoạt Quy tắc Tự động hoá", + "DEACTIVATION_TITLE": "Vô hiệu hoá Quy tắc Tự động hoá", + "ACTIVATION_DESCRIPTION": "Thao tác này sẽ kích hoạt quy tắc tự động hoá tên '{automationName}'. Bạn có chắc là muốn tiếp tục?", + "DEACTIVATION_DESCRIPTION": "Thao tác này sẽ vô hiệu hoá quy tắc tự động hoá tên '{automationName}'. Bạn có chắc là muốn tiếp tục?", + "ACTIVATION_SUCCESFUL": "Quy tắc tự động hoá đã được kích hoạt thành công", + "DEACTIVATION_SUCCESFUL": "Quy tắc tự động hoá đã vô hiệu hoá thành công", + "ACTIVATION_ERROR": "Không thể kích hoạt quy tắc tự động hoá, Vui lòng thử lại sau", + "DEACTIVATION_ERROR": "Không thể vô hiệu hoá quy tắc tự động hoá, Vui lòng thử lại sau", "CONFIRMATION_LABEL": "Có", "CANCEL_LABEL": "Không" }, "ATTACHMENT": { - "UPLOAD_ERROR": "Could not upload attachment, Please try again", - "LABEL_IDLE": "Upload Attachment", + "UPLOAD_ERROR": "Không thể tải tập tin đính kèm, Vui lòng thử lại sau", + "LABEL_IDLE": "Tải tập tin đính kèm", "LABEL_UPLOADING": "Đang tải lên...", - "LABEL_UPLOADED": "Succesfully Uploaded", - "LABEL_UPLOAD_FAILED": "Upload Failed" + "LABEL_UPLOADED": "Đã tải lên thành công", + "LABEL_UPLOAD_FAILED": "Không tải lên được" } } } diff --git a/app/javascript/dashboard/i18n/locale/vi/bulkActions.json b/app/javascript/dashboard/i18n/locale/vi/bulkActions.json index 486a1b7cd..d80114873 100644 --- a/app/javascript/dashboard/i18n/locale/vi/bulkActions.json +++ b/app/javascript/dashboard/i18n/locale/vi/bulkActions.json @@ -1,17 +1,29 @@ { - "BULK_ACTION": { - "CONVERSATIONS_SELECTED": "%{conversationCount} conversations selected", - "AGENT_SELECT_LABEL": "Chọn đại lý", - "ASSIGN_CONFIRMATION_LABEL": "Are you sure you want to assign %{conversationCount} %{conversationLabel} to", - "GO_BACK_LABEL": "Go back", - "ASSIGN_LABEL": "Phân công", - "ASSIGN_AGENT_TOOLTIP": "Assign Agent", - "RESOLVE_TOOLTIP": "Giải quyết", - "ASSIGN_SUCCESFUL": "Conversations assigned successfully", - "ASSIGN_FAILED": "Failed to assign conversations, please try again", - "RESOLVE_SUCCESFUL": "Conversations resolved successfully", - "RESOLVE_FAILED": "Failed to resolve conversations, please try again", - "ALL_CONVERSATIONS_SELECTED_ALERT": "Conversations visible on this page are only selected.", - "AGENT_LIST_LOADING": "Loading Agents" + "BULK_ACTION": { + "CONVERSATIONS_SELECTED": "%{conversationCount} cuộc hội thoại đã được chọn", + "AGENT_SELECT_LABEL": "Chọn đại lý", + "ASSIGN_CONFIRMATION_LABEL": "Bạn có chắc là muốn giao %{conversationCount} %{conversationLabel} cho", + "GO_BACK_LABEL": "Trở về", + "ASSIGN_LABEL": "Phân công", + "ASSIGN_AGENT_TOOLTIP": "Giao cho hỗ trợ viên", + "ASSIGN_SUCCESFUL": "Cuộc hội thoại đã được phân công thành công", + "ASSIGN_FAILED": "Không thể phân công các cuộc hội thoại, xin vui lòng thử lại", + "RESOLVE_SUCCESFUL": "Cuộc hội thoại đã được giải quyết thành công", + "RESOLVE_FAILED": "Không thể giải quyết các cuộc hội thoại, xin vui lòng thử lại", + "ALL_CONVERSATIONS_SELECTED_ALERT": "Chỉ những cuộc hội thoại hiển thị trên trang này mới có thể được chọn.", + "AGENT_LIST_LOADING": "Đang tải hỗ trợ viên", + "UPDATE": { + "CHANGE_STATUS": "Change status", + "SNOOZE_UNTIL_NEXT_REPLY": "Snooze until next reply", + "UPDATE_SUCCESFUL": "Conversation status updated successfully.", + "UPDATE_FAILED": "Failed to update conversations, please try again" + }, + "LABELS": { + "ASSIGN_LABELS": "Assign Labels", + "NO_LABELS_FOUND": "No labels found for", + "ASSIGN_SELECTED_LABELS": "Assign selected labels", + "ASSIGN_SUCCESFUL": "Labels assigned successfully", + "ASSIGN_FAILED": "Failed to assign labels, please try again" } + } } diff --git a/app/javascript/dashboard/i18n/locale/vi/chatlist.json b/app/javascript/dashboard/i18n/locale/vi/chatlist.json index 72ef062ee..fc9571fde 100644 --- a/app/javascript/dashboard/i18n/locale/vi/chatlist.json +++ b/app/javascript/dashboard/i18n/locale/vi/chatlist.json @@ -54,12 +54,12 @@ "RECEIVED_VIA_EMAIL": "Nhận được từ email", "VIEW_TWEET_IN_TWITTER": "Xem tweet trên Twitter", "REPLY_TO_TWEET": "Trả lời cho tweet này", - "LINK_TO_STORY": "Go to instagram story", + "LINK_TO_STORY": "Đến xem câu chuyên insta", "SENT": "Gửi thành công", "NO_MESSAGES": "Không có tin nhắn", "NO_CONTENT": "Không có nội dung", "HIDE_QUOTED_TEXT": "Ẩn văn bản được trích dẫn", "SHOW_QUOTED_TEXT": "Hiện Văn bản được trích dẫn", - "MESSAGE_READ": "Read" + "MESSAGE_READ": "Đã xem" } } diff --git a/app/javascript/dashboard/i18n/locale/vi/contact.json b/app/javascript/dashboard/i18n/locale/vi/contact.json index 1b11235b0..1a41aa54a 100644 --- a/app/javascript/dashboard/i18n/locale/vi/contact.json +++ b/app/javascript/dashboard/i18n/locale/vi/contact.json @@ -73,8 +73,8 @@ "DELETE_NOTE": { "CONFIRM": { "TITLE": "Xác nhận xoá", - "MESSAGE": "Are you want sure to delete this note?", - "YES": "Yes, Delete it", + "MESSAGE": "Bạn có chắc chắn muốn xoá ghi chú này?", + "YES": "Có, xoá", "NO": "Không, Giữ" } }, @@ -111,7 +111,8 @@ "EMAIL_ADDRESS": { "PLACEHOLDER": "Nhập địa chỉ email của liên hệ", "LABEL": "Email", - "DUPLICATE": "Địa chỉ email này đang được sử dụng cho một liên hệ khác." + "DUPLICATE": "Địa chỉ email này đang được sử dụng cho một liên hệ khác.", + "ERROR": "Vui lòng nhập một địa chỉ email hợp lệ." }, "PHONE_NUMBER": { "PLACEHOLDER": "Nhập số điện thoại của liên hệ", diff --git a/app/javascript/dashboard/i18n/locale/vi/contactFilters.json b/app/javascript/dashboard/i18n/locale/vi/contactFilters.json index fb64f8eed..f7f3759e2 100644 --- a/app/javascript/dashboard/i18n/locale/vi/contactFilters.json +++ b/app/javascript/dashboard/i18n/locale/vi/contactFilters.json @@ -23,7 +23,7 @@ "is_not_present": "Không có", "is_greater_than": "Lớn hơn", "is_lesser_than": "Nhỏ hơn", - "days_before": "Is x days before" + "days_before": "Khoảng x ngày trước" }, "ATTRIBUTES": { "NAME": "Tên", @@ -37,7 +37,7 @@ "CUSTOM_ATTRIBUTE_NUMBER": "Số", "CUSTOM_ATTRIBUTE_LINK": "Liên kết", "CUSTOM_ATTRIBUTE_CHECKBOX": "Checkbox", - "CREATED_AT": "Created At", + "CREATED_AT": "Tạo vào lúc", "LAST_ACTIVITY": "Hành động cuối cùng" }, "GROUPS": { diff --git a/app/javascript/dashboard/i18n/locale/vi/conversation.json b/app/javascript/dashboard/i18n/locale/vi/conversation.json index 7109a0016..8acee1d63 100644 --- a/app/javascript/dashboard/i18n/locale/vi/conversation.json +++ b/app/javascript/dashboard/i18n/locale/vi/conversation.json @@ -1,7 +1,7 @@ { "CONVERSATION": { "404": "Vui lòng chọn một cuộc trò chuyện từ ngăn bên trái", - "DASHBOARD_APP_TAB_MESSAGES": "Messages", + "DASHBOARD_APP_TAB_MESSAGES": "Tin nhắn", "UNVERIFIED_SESSION": "Danh tính của người dùng này không được xác thực", "NO_MESSAGE_1": "Uh oh! Có vẻ như không có tin nhắn nào từ khách hàng trong hộp thư đến của bạn.", "NO_MESSAGE_2": " gửi tin nhắn đến trang của bạn!", @@ -31,7 +31,7 @@ "REPLYING_TO": "Bạn đang trả lời:", "REMOVE_SELECTION": "Xóa lựa chọn", "DOWNLOAD": "Tải xuống", - "UNKNOWN_FILE_TYPE": "Unknown File", + "UNKNOWN_FILE_TYPE": "Tập tin chưa xác định", "UPLOADING_ATTACHMENTS": "Đang tải file đính kèm...", "SUCCESS_DELETE_MESSAGE": "Tin nhắn được xoá thành công", "FAIL_DELETE_MESSSAGE": "Không thể xoá tin nhắn! Thử lại", @@ -64,8 +64,8 @@ "DISABLE_SIGN_TOOLTIP": "Tắt chữ ký", "MSG_INPUT": "Shift + enter cho dòng mới. Bắt đầu với '/' để chọn Câu trả lời soạn trước.", "PRIVATE_MSG_INPUT": "Shift + enter cho dòng mới. Điều này sẽ chỉ hiển thị cho Đại lý", - "MESSAGE_SIGNATURE_NOT_CONFIGURED": "Message signature is not configured, please configure it in profile settings.", - "CLICK_HERE": "Click here to update" + "MESSAGE_SIGNATURE_NOT_CONFIGURED": "Chứ ký cuối tin nhắn chưa được cài đặt, xin hãy cài đặt một chữ ký trong phần cài đặt hồ sơ.", + "CLICK_HERE": "Bấm vào đây để cập nhật" }, "REPLYBOX": { "REPLY": "Trả lời", @@ -76,13 +76,13 @@ "TIP_FORMAT_ICON": "Hiển thị trình soạn thảo văn bản đa dạng thức", "TIP_EMOJI_ICON": "Hiển thị chọn emoji", "TIP_ATTACH_ICON": "Đính kèm files", - "TIP_AUDIORECORDER_ICON": "Record audio", - "TIP_AUDIORECORDER_PERMISSION": "Allow access to audio", - "TIP_AUDIORECORDER_ERROR": "Could not open the audio", + "TIP_AUDIORECORDER_ICON": "Ghi âm", + "TIP_AUDIORECORDER_PERMISSION": "Cho phép truy cập ghi âm", + "TIP_AUDIORECORDER_ERROR": "Không thể mở bản ghi âm", "ENTER_TO_SEND": "Nhấn Enter để gửi", "DRAG_DROP": "Kéo thả vào đây để đính kèm", - "START_AUDIO_RECORDING": "Start audio recording", - "STOP_AUDIO_RECORDING": "Stop audio recording", + "START_AUDIO_RECORDING": "Bắt đầu ghi âm", + "STOP_AUDIO_RECORDING": "Dừng ghi âm", "": "", "EMAIL_HEAD": { "ADD_BCC": "Thêm bcc", diff --git a/app/javascript/dashboard/i18n/locale/vi/generalSettings.json b/app/javascript/dashboard/i18n/locale/vi/generalSettings.json index 6d3f8f6ec..5e019bf91 100644 --- a/app/javascript/dashboard/i18n/locale/vi/generalSettings.json +++ b/app/javascript/dashboard/i18n/locale/vi/generalSettings.json @@ -48,7 +48,7 @@ } }, "UPDATE_CHATWOOT": "Đã có bản cập nhật %{latestChatwootVersion} cho Chatwoot. Vui lòng cập nhật phiên bản của bạn.", - "LEARN_MORE": "Learn more" + "LEARN_MORE": "Tìm hiểu thêm" }, "FORMS": { "MULTISELECT": { @@ -60,12 +60,12 @@ "NOTIFICATIONS_PAGE": { "HEADER": "Thông báo", "MARK_ALL_DONE": "Đánh dấu tất cả đã xong", - "DELETE_TITLE": "deleted", + "DELETE_TITLE": "đã xoá", "UNREAD_NOTIFICATION": { - "TITLE": "Unread Notifications", - "ALL_NOTIFICATIONS": "View all notifications", - "LOADING_UNREAD_MESSAGE": "Loading unread notifications...", - "EMPTY_MESSAGE": "You have no unread notifications" + "TITLE": "Thông báo tin chưa đọc", + "ALL_NOTIFICATIONS": "Xem tất cả thông báo", + "LOADING_UNREAD_MESSAGE": "Đang tải thông báo tin chưa đọc...", + "EMPTY_MESSAGE": "Bạn không có thông báo tin chưa đọc" }, "LIST": { "LOADING_MESSAGE": "Đang tải thông báo...", @@ -108,7 +108,7 @@ "GO_TO_CONVERSATION_DASHBOARD": "Đi tới Trang tổng quan cuộc trò chuyện", "GO_TO_CONTACTS_DASHBOARD": "Đi tới Trang tổng quan liên hệ", "GO_TO_REPORTS_OVERVIEW": "Đi đến Tổng quan Báo cáo", - "GO_TO_CONVERSATION_REPORTS": "Go to Conversation Reports", + "GO_TO_CONVERSATION_REPORTS": "Đi tới Trang Báo cáo cuộc trò chuyện", "GO_TO_AGENT_REPORTS": "Đi đến Báo cáo Đại lý", "GO_TO_LABEL_REPORTS": "Đi đến Báo cáo Nhãn", "GO_TO_INBOX_REPORTS": "Đi đến Báo cáo Hộp thư đến", diff --git a/app/javascript/dashboard/i18n/locale/vi/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/vi/inboxMgmt.json index fb51c9ea9..c70fa9dbc 100644 --- a/app/javascript/dashboard/i18n/locale/vi/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/vi/inboxMgmt.json @@ -30,7 +30,8 @@ "ADD": { "CHANNEL_NAME": { "LABEL": "Tên hộp thư đến", - "PLACEHOLDER": "Nhập tên hộp thư đến của bạn (ví dụ: Acme Inc)" + "PLACEHOLDER": "Nhập tên hộp thư đến của bạn (ví dụ: Acme Inc)", + "ERROR": "Please enter a valid inbox name" }, "WEBSITE_NAME": { "LABEL": "Tên trang web", @@ -82,7 +83,7 @@ }, "CHANNEL_GREETING_TOGGLE": { "LABEL": "Bật lời chào kênh", - "HELP_TEXT": "Gửi tin nhắn chào mừng đến người dùng khi họ bắt đầu cuộc trò chuyện.", + "HELP_TEXT": "Automatically send a greeting message when a new conversation is created.", "ENABLED": "Bật", "DISABLED": "Không bật" }, @@ -97,7 +98,10 @@ "LABEL": "Màu tiện ích", "PLACEHOLDER": "Cập nhật màu tiện ích con được sử dụng trong tiện ích con" }, - "SUBMIT_BUTTON": "Tạo hộp thư đến" + "SUBMIT_BUTTON": "Tạo hộp thư đến", + "API": { + "ERROR_MESSAGE": "We were not able to create a website channel, please try again" + } }, "TWILIO": { "TITLE": "Kênh Twilio SMS/WhatsApp", @@ -193,6 +197,7 @@ "PROVIDERS": { "LABEL": "Nhà cung cấp API", "TWILIO": "Twilio", + "WHATSAPP_CLOUD": "WhatsApp Cloud", "360_DIALOG": "360Dialog" }, "INBOX_NAME": { @@ -205,13 +210,31 @@ "PLACEHOLDER": "Vui lòng nhập số điện thoại mà tin nhắn sẽ được gửi.", "ERROR": "Vui lòng nhập một giá trị hợp lệ. Số điện thoại phải bắt đầu bằng `+`." }, + "PHONE_NUMBER_ID": { + "LABEL": "Phone number ID", + "PLACEHOLDER": "Please enter the Phone number ID obtained from Facebook developer dashboard.", + "ERROR": "Vui lòng điền giá trị hợp lệ." + }, + "BUSINESS_ACCOUNT_ID": { + "LABEL": "Business Account ID", + "PLACEHOLDER": "Please enter the Business Account ID obtained from Facebook developer dashboard.", + "ERROR": "Vui lòng điền giá trị hợp lệ." + }, + "WEBHOOK_VERIFY_TOKEN": { + "LABEL": "Webhook Verify Token", + "PLACEHOLDER": "Enter a verify token which you want to configure for facebook webhooks.", + "ERROR": "Vui lòng điền giá trị hợp lệ." + }, "API_KEY": { "LABEL": "Khoá API", "SUBTITLE": "Cấu hình Khoá API WhatsApp.", "PLACEHOLDER": "Khoá API", - "APPLY_FOR_ACCESS": "Không có khoá API? Đăng ký quyền truy cập ở đây", "ERROR": "Vui lòng điền giá trị hợp lệ." }, + "API_CALLBACK": { + "TITLE": "URL gọi lại", + "SUBTITLE": "You have to configure the webhook URL in facebook developer portal with the URL mentioned here." + }, "SUBMIT_BUTTON": "Tạo kênh WhatsApp", "API": { "ERROR_MESSAGE": "Chúng tôi không thể lưu kênh WhatsApp" @@ -298,7 +321,7 @@ }, "AUTH": { "TITLE": "Chọn kênh", - "DESC": "Chatwoot hỗ trợ tiện ích trò chuyện trực tiếp, trang Facebook, hồ sơ Twitter, WhatsApp, Email, v. v., dưới dạng các kênh. Nếu bạn muốn xây dựng một kênh tùy chỉnh, bạn có thể tạo bằng cách sử dụng kênh API. Chọn một kênh từ các tùy chọn bên dưới để tiếp tục." + "DESC": "Chatwoot supports live-chat widgets, Facebook Messenger, Twitter profiles, WhatsApp, Emails, etc., as channels. If you want to build a custom channel, you can create it using the API channel. To get started, choose one of the channels below." }, "AGENTS": { "TITLE": "Nhà Cung Cấp", @@ -339,7 +362,7 @@ "API": { "SUCCESS_MESSAGE": "Đã cập nhật cài đặt hộp thư đến thành công", "AUTO_ASSIGNMENT_SUCCESS_MESSAGE": "Đã cập nhật thành công bài tập tự động", - "ERROR_MESSAGE": "Không thể cập nhật màu tiện ích. Vui lòng thử lại sau." + "ERROR_MESSAGE": "We couldn't update inbox settings. Please try again later." }, "EMAIL_COLLECT_BOX": { "ENABLED": "Bật", @@ -391,15 +414,15 @@ "LABEL": "Các tính năng", "DISPLAY_FILE_PICKER": "Hiển thị bộ chọn tệp trên tiện ích con", "DISPLAY_EMOJI_PICKER": "Hiển thị bộ chọn biểu tượng cảm xúc trên tiện ích con", - "ALLOW_END_CONVERSATION": "Allow users to end conversation from the widget" + "ALLOW_END_CONVERSATION": "Cho phép người dùng kết thúc cuộc trò chuyện từ công cụ chat" }, "SETTINGS_POPUP": { "MESSENGER_HEADING": "Tập lệnh Messenger", "MESSENGER_SUB_HEAD": "Đặt nút này bên trong thẻ body của bạn", "INBOX_AGENTS": "Nhà cung cấp", "INBOX_AGENTS_SUB_TEXT": "Thêm hoặc xóa tác nhân khỏi hộp thư đến này", - "AGENT_ASSIGNMENT": "Conversation Assignment", - "AGENT_ASSIGNMENT_SUB_TEXT": "Update conversation assignment settings", + "AGENT_ASSIGNMENT": "Phân công cuộc trò chuyện", + "AGENT_ASSIGNMENT_SUB_TEXT": "Cập nhật phân công cuộc trò chuyện", "UPDATE": "Cập nhật", "ENABLE_EMAIL_COLLECT_BOX": "Bật hộp thu thập email", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Bật hoặc tắt hộp thu thập email trên cuộc trò chuyện mới", @@ -412,15 +435,22 @@ "INBOX_UPDATE_SUB_TEXT": "Cập nhật cài đặt hộp thư đến của bạn", "AUTO_ASSIGNMENT_SUB_TEXT": "Bật hoặc tắt tính năng tự động gán các cuộc hội thoại mới cho các tác nhân được thêm vào hộp thư đến này.", "HMAC_VERIFICATION": "Xác thực danh tính người dùng", - "HMAC_DESCRIPTION": "Để xác thực danh tính của người dùng, SDK cho phép bạn gửi thêm `identifier_hash` cho mỗi người dùng. Bạn có thể tạo HMAC bằng cách sử dụng 'sha256' với khóa được hiển thị ở đây.", + "HMAC_DESCRIPTION": "In order to validate the user's identity, you can pass an `identifier_hash` for each user. You can generate a HMAC sha256 hash using the `identifier` with the key shown here.", "HMAC_MANDATORY_VERIFICATION": "Bắt buộc Xác thực danh tính người dùng", - "HMAC_MANDATORY_DESCRIPTION": "Nếu được bật, phương thức SetUser của Chatwoot SDKs sẽ không hoạt động trừ khi `identifier_hash` được cung cấp cho mỗi người dùng.", + "HMAC_MANDATORY_DESCRIPTION": "If enabled, requests missing the `identifier_hash` will be rejected.", "INBOX_IDENTIFIER": "Định danh hộp thư đến", "INBOX_IDENTIFIER_SUB_TEXT": "Dùng token định danh hộp thư đến hiện ở đây để xác thực các ứng dụng khách API của bạn.", "FORWARD_EMAIL_TITLE": "Chuyển tiếp đến Email", "FORWARD_EMAIL_SUB_TEXT": "Bắt đầu chuyển tiếp email của bạn tới địa chỉ email sau.", "ALLOW_MESSAGES_AFTER_RESOLVED": "Cho phép nhắn tin sau khi cuộc trò chuyện được giải quyết", - "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Cho phép người dùng cuối nhắn tin sau khi cuộc trò chuyện được giải quyết." + "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Cho phép người dùng cuối nhắn tin sau khi cuộc trò chuyện được giải quyết.", + "WHATSAPP_SECTION_SUBHEADER": "This API Key is used for the integration with the WhatsApp APIs.", + "WHATSAPP_SECTION_TITLE": "Khoá API" + }, + "AUTO_ASSIGNMENT": { + "MAX_ASSIGNMENT_LIMIT": "Giới hạn tự động phân công tối đa", + "MAX_ASSIGNMENT_LIMIT_RANGE_ERROR": "Xin nhập vào một số lớn hơn 0", + "MAX_ASSIGNMENT_LIMIT_SUB_TEXT": "Giới hạn số cuộc trò chuyện tối đa từ hộp thư này mà có thể được tự động phân công cho một hỗ trợ viên" }, "FACEBOOK_REAUTHORIZE": { "TITLE": "Ủy quyền lại", @@ -430,14 +460,14 @@ }, "PRE_CHAT_FORM": { "DESCRIPTION": "Biểu mẫu trước khi trò chuyện cho phép bạn nắm bắt thông tin người dùng trước khi họ bắt đầu cuộc trò chuyện với bạn.", - "SET_FIELDS": "Pre chat form fields", + "SET_FIELDS": "Những ô cần điền vào trước cuộc trò chuyện", "SET_FIELDS_HEADER": { - "FIELDS": "Fields", - "LABEL": "Label", - "PLACE_HOLDER": "Placeholder", + "FIELDS": "Ô cần điền", + "LABEL": "Nhãn", + "PLACE_HOLDER": "Cụm từ hiện nền trong ô", "KEY": "Khoá", "TYPE": "Loại", - "REQUIRED": "Required" + "REQUIRED": "Bắt buộc" }, "ENABLE": { "LABEL": "Bật biểu mẫu trước khi trò chuyện", @@ -447,7 +477,7 @@ } }, "PRE_CHAT_MESSAGE": { - "LABEL": "Pre chat message", + "LABEL": "Tin nhắn trước khi trò chuyện", "PLACEHOLDER": "Tin nhắn này sẽ hiện cho những người dùng cùng với biểu mẫu" }, "REQUIRE_EMAIL": { @@ -471,12 +501,12 @@ "VALIDATION_ERROR": "Giờ bắt đầu nên trước giờ đóng cửa.", "CHOOSE": "Chọn" }, - "ALL_DAY": "All-Day" + "ALL_DAY": "Cả ngày" }, "IMAP": { "TITLE": "IMAP", "SUBTITLE": "Đặt chi tiết IMAP", - "NOTE_TEXT": "To enable SMTP, please configure IMAP.", + "NOTE_TEXT": "Để bật chế độ SMTP, xin hãy cấu hình IMAP.", "UPDATE": "Cập nhật chi tiết IMAP", "TOGGLE_AVAILABILITY": "Kích hoạt cấu hình IMAP cho hộp thư đến này", "TOGGLE_HELP": "Kích hoạt IMAP sẽ giúp cho người dùng nhận được email", @@ -536,8 +566,8 @@ "SSL_TLS": "SSL/TLS", "START_TLS": "STARTTLS", "OPEN_SSL_VERIFY_MODE": "Mở Chế độ xác minh SSL", - "AUTH_MECHANISM": "Authentication" + "AUTH_MECHANISM": "Xác minh" }, - "NOTE": "Note: " + "NOTE": "Ghi chú: " } } diff --git a/app/javascript/dashboard/i18n/locale/vi/integrations.json b/app/javascript/dashboard/i18n/locale/vi/integrations.json index 97af1e32b..d7278063f 100644 --- a/app/javascript/dashboard/i18n/locale/vi/integrations.json +++ b/app/javascript/dashboard/i18n/locale/vi/integrations.json @@ -2,18 +2,18 @@ "INTEGRATION_SETTINGS": { "HEADER": "Tích hợp", "WEBHOOK": { - "SUBSCRIBED_EVENTS": "Subscribed Events", + "SUBSCRIBED_EVENTS": "Những sự kiện được theo dõi", "FORM": { "CANCEL": "Huỷ", "DESC": "Webhook events cung cấp cho bạn thông tin thời gian thực về những gì đang xảy ra trong tài khoản Chatwoot của bạn. Vui lòng nhập một URL hợp lệ để định cấu hình một cuộc gọi lại.", "SUBSCRIPTIONS": { - "LABEL": "Events", + "LABEL": "Các sự kiện", "EVENTS": { - "CONVERSATION_CREATED": "Conversation Created", - "CONVERSATION_STATUS_CHANGED": "Conversation Status Changed", - "CONVERSATION_UPDATED": "Conversation Updated", - "MESSAGE_CREATED": "Message created", - "MESSAGE_UPDATED": "Message updated", + "CONVERSATION_CREATED": "Cuộc trò chuyện đã được tạo", + "CONVERSATION_STATUS_CHANGED": "Trạng thái cuộc trò chuyện đã thay đổi", + "CONVERSATION_UPDATED": "Cuộc trò chuyện đã được cập nhật", + "MESSAGE_CREATED": "Tin nhắn đã được tạo", + "MESSAGE_UPDATED": "Tin nhắn đã được cập nhật", "WEBWIDGET_TRIGGERED": "Live chat widget opened by the user" } }, diff --git a/app/javascript/dashboard/i18n/locale/vi/report.json b/app/javascript/dashboard/i18n/locale/vi/report.json index 8ff6b2014..c5abfa5bc 100644 --- a/app/javascript/dashboard/i18n/locale/vi/report.json +++ b/app/javascript/dashboard/i18n/locale/vi/report.json @@ -65,6 +65,7 @@ "PLACEHOLDER": "Chọn phạm vi ngày" }, "GROUP_BY_FILTER_DROPDOWN_LABEL": "Nhóm theo", + "DURATION_FILTER_LABEL": "Duration", "GROUP_BY_DAY_OPTIONS": [ { "id": 1, diff --git a/app/javascript/dashboard/i18n/locale/zh_CN/bulkActions.json b/app/javascript/dashboard/i18n/locale/zh_CN/bulkActions.json index 3d8727130..0919e095c 100644 --- a/app/javascript/dashboard/i18n/locale/zh_CN/bulkActions.json +++ b/app/javascript/dashboard/i18n/locale/zh_CN/bulkActions.json @@ -1,17 +1,29 @@ { - "BULK_ACTION": { - "CONVERSATIONS_SELECTED": "%{conversationCount} conversations selected", - "AGENT_SELECT_LABEL": "选择代理", - "ASSIGN_CONFIRMATION_LABEL": "Are you sure you want to assign %{conversationCount} %{conversationLabel} to", - "GO_BACK_LABEL": "Go back", - "ASSIGN_LABEL": "Assign", - "ASSIGN_AGENT_TOOLTIP": "Assign Agent", - "RESOLVE_TOOLTIP": "已解决", - "ASSIGN_SUCCESFUL": "Conversations assigned successfully", - "ASSIGN_FAILED": "Failed to assign conversations, please try again", - "RESOLVE_SUCCESFUL": "Conversations resolved successfully", - "RESOLVE_FAILED": "Failed to resolve conversations, please try again", - "ALL_CONVERSATIONS_SELECTED_ALERT": "Conversations visible on this page are only selected.", - "AGENT_LIST_LOADING": "Loading Agents" + "BULK_ACTION": { + "CONVERSATIONS_SELECTED": "%{conversationCount} conversations selected", + "AGENT_SELECT_LABEL": "选择代理", + "ASSIGN_CONFIRMATION_LABEL": "Are you sure you want to assign %{conversationCount} %{conversationLabel} to", + "GO_BACK_LABEL": "Go back", + "ASSIGN_LABEL": "Assign", + "ASSIGN_AGENT_TOOLTIP": "Assign Agent", + "ASSIGN_SUCCESFUL": "Conversations assigned successfully", + "ASSIGN_FAILED": "Failed to assign conversations, please try again", + "RESOLVE_SUCCESFUL": "Conversations resolved successfully", + "RESOLVE_FAILED": "Failed to resolve conversations, please try again", + "ALL_CONVERSATIONS_SELECTED_ALERT": "Conversations visible on this page are only selected.", + "AGENT_LIST_LOADING": "Loading Agents", + "UPDATE": { + "CHANGE_STATUS": "Change status", + "SNOOZE_UNTIL_NEXT_REPLY": "Snooze until next reply", + "UPDATE_SUCCESFUL": "Conversation status updated successfully.", + "UPDATE_FAILED": "Failed to update conversations, please try again" + }, + "LABELS": { + "ASSIGN_LABELS": "Assign Labels", + "NO_LABELS_FOUND": "No labels found for", + "ASSIGN_SELECTED_LABELS": "Assign selected labels", + "ASSIGN_SUCCESFUL": "Labels assigned successfully", + "ASSIGN_FAILED": "Failed to assign labels, please try again" } + } } diff --git a/app/javascript/dashboard/i18n/locale/zh_CN/contact.json b/app/javascript/dashboard/i18n/locale/zh_CN/contact.json index 8be366df2..a4711f0c6 100644 --- a/app/javascript/dashboard/i18n/locale/zh_CN/contact.json +++ b/app/javascript/dashboard/i18n/locale/zh_CN/contact.json @@ -111,7 +111,8 @@ "EMAIL_ADDRESS": { "PLACEHOLDER": "输入联系人的电子邮件地址", "LABEL": "电子邮件地址", - "DUPLICATE": "This email address is in use for another contact." + "DUPLICATE": "This email address is in use for another contact.", + "ERROR": "请输入一个有效的电子邮件." }, "PHONE_NUMBER": { "PLACEHOLDER": "输入联系人的电话号码", diff --git a/app/javascript/dashboard/i18n/locale/zh_CN/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/zh_CN/inboxMgmt.json index 6e11b666c..cb0ee17b0 100644 --- a/app/javascript/dashboard/i18n/locale/zh_CN/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/zh_CN/inboxMgmt.json @@ -30,7 +30,8 @@ "ADD": { "CHANNEL_NAME": { "LABEL": "收件箱名称", - "PLACEHOLDER": "Enter your inbox name (eg: Acme Inc)" + "PLACEHOLDER": "Enter your inbox name (eg: Acme Inc)", + "ERROR": "Please enter a valid inbox name" }, "WEBSITE_NAME": { "LABEL": "网站名称", @@ -82,7 +83,7 @@ }, "CHANNEL_GREETING_TOGGLE": { "LABEL": "开启频道问候功能", - "HELP_TEXT": "Send a greeting message to the users when they starts the conversation.", + "HELP_TEXT": "Automatically send a greeting message when a new conversation is created.", "ENABLED": "已启用", "DISABLED": "已禁用" }, @@ -97,7 +98,10 @@ "LABEL": "窗口小部件颜色", "PLACEHOLDER": "更新小部件中使用的部件颜色" }, - "SUBMIT_BUTTON": "创建收件箱" + "SUBMIT_BUTTON": "创建收件箱", + "API": { + "ERROR_MESSAGE": "We were not able to create a website channel, please try again" + } }, "TWILIO": { "TITLE": "Twilio SMS/WhatsApp Channel", @@ -193,6 +197,7 @@ "PROVIDERS": { "LABEL": "API Provider", "TWILIO": "Twilio", + "WHATSAPP_CLOUD": "WhatsApp Cloud", "360_DIALOG": "360Dialog" }, "INBOX_NAME": { @@ -205,13 +210,31 @@ "PLACEHOLDER": "请输入发送消息的电话号码。", "ERROR": "请输入一个有效的值。电话号码应该以`+`开始。" }, + "PHONE_NUMBER_ID": { + "LABEL": "Phone number ID", + "PLACEHOLDER": "Please enter the Phone number ID obtained from Facebook developer dashboard.", + "ERROR": "Please enter a valid value." + }, + "BUSINESS_ACCOUNT_ID": { + "LABEL": "Business Account ID", + "PLACEHOLDER": "Please enter the Business Account ID obtained from Facebook developer dashboard.", + "ERROR": "Please enter a valid value." + }, + "WEBHOOK_VERIFY_TOKEN": { + "LABEL": "Webhook Verify Token", + "PLACEHOLDER": "Enter a verify token which you want to configure for facebook webhooks.", + "ERROR": "Please enter a valid value." + }, "API_KEY": { "LABEL": "API key", "SUBTITLE": "Configure the WhatsApp API key.", "PLACEHOLDER": "API key", - "APPLY_FOR_ACCESS": "Don't have any API key? Apply for access here", "ERROR": "Please enter a valid value." }, + "API_CALLBACK": { + "TITLE": "回调地址", + "SUBTITLE": "You have to configure the webhook URL in facebook developer portal with the URL mentioned here." + }, "SUBMIT_BUTTON": "Create WhatsApp Channel", "API": { "ERROR_MESSAGE": "We were not able to save the WhatsApp channel" @@ -298,7 +321,7 @@ }, "AUTH": { "TITLE": "Choose a channel", - "DESC": "Chatwoot supports live-chat widget, Facebook page, Twitter profile, WhatsApp, Email etc., as channels. If you want to build a custom channel, you can create it using the API channel. Select one channel from the options below to proceed." + "DESC": "Chatwoot supports live-chat widgets, Facebook Messenger, Twitter profiles, WhatsApp, Emails, etc., as channels. If you want to build a custom channel, you can create it using the API channel. To get started, choose one of the channels below." }, "AGENTS": { "TITLE": "客服代理们", @@ -339,7 +362,7 @@ "API": { "SUCCESS_MESSAGE": "已成功更新收件箱设置", "AUTO_ASSIGNMENT_SUCCESS_MESSAGE": "自动分配成功更新", - "ERROR_MESSAGE": "无法更新部件颜色。请稍后再试。" + "ERROR_MESSAGE": "We couldn't update inbox settings. Please try again later." }, "EMAIL_COLLECT_BOX": { "ENABLED": "已启用", @@ -412,15 +435,22 @@ "INBOX_UPDATE_SUB_TEXT": "更新收件箱设置", "AUTO_ASSIGNMENT_SUB_TEXT": "启用或禁用添加到此收件箱的代理人自动分配新的会话。", "HMAC_VERIFICATION": "User Identity Validation", - "HMAC_DESCRIPTION": "Inorder to validate the user's identity, the SDK allows you to pass an `identifier_hash` for each user. You can generate HMAC using 'sha256' with the key shown here.", + "HMAC_DESCRIPTION": "In order to validate the user's identity, you can pass an `identifier_hash` for each user. You can generate a HMAC sha256 hash using the `identifier` with the key shown here.", "HMAC_MANDATORY_VERIFICATION": "Enforce User Identity Validation", - "HMAC_MANDATORY_DESCRIPTION": "If enabled, Chatwoot SDKs setUser method will not work unless the `identifier_hash` is provided for each user.", + "HMAC_MANDATORY_DESCRIPTION": "If enabled, requests missing the `identifier_hash` will be rejected.", "INBOX_IDENTIFIER": "Inbox Identifier", "INBOX_IDENTIFIER_SUB_TEXT": "Use the `inbox_identifier` token shown here to authentication your API clients.", "FORWARD_EMAIL_TITLE": "Forward to Email", "FORWARD_EMAIL_SUB_TEXT": "开始将您的电子邮件转发到以下电子邮件地址。", "ALLOW_MESSAGES_AFTER_RESOLVED": "Allow messages after conversation resolved", - "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Allow the end-users to send messages even after the conversation is resolved." + "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Allow the end-users to send messages even after the conversation is resolved.", + "WHATSAPP_SECTION_SUBHEADER": "This API Key is used for the integration with the WhatsApp APIs.", + "WHATSAPP_SECTION_TITLE": "API Key" + }, + "AUTO_ASSIGNMENT": { + "MAX_ASSIGNMENT_LIMIT": "Auto assignment limit", + "MAX_ASSIGNMENT_LIMIT_RANGE_ERROR": "Please enter a value greater than 0", + "MAX_ASSIGNMENT_LIMIT_SUB_TEXT": "Limit the maximum number of conversations from this inbox that can be auto assigned to an agent" }, "FACEBOOK_REAUTHORIZE": { "TITLE": "重新授权", diff --git a/app/javascript/dashboard/i18n/locale/zh_CN/report.json b/app/javascript/dashboard/i18n/locale/zh_CN/report.json index d41223fa0..720e16633 100644 --- a/app/javascript/dashboard/i18n/locale/zh_CN/report.json +++ b/app/javascript/dashboard/i18n/locale/zh_CN/report.json @@ -65,6 +65,7 @@ "PLACEHOLDER": "Select date range" }, "GROUP_BY_FILTER_DROPDOWN_LABEL": "Group By", + "DURATION_FILTER_LABEL": "Duration", "GROUP_BY_DAY_OPTIONS": [ { "id": 1, diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/bulkActions.json b/app/javascript/dashboard/i18n/locale/zh_TW/bulkActions.json index c13692274..f24db6a86 100644 --- a/app/javascript/dashboard/i18n/locale/zh_TW/bulkActions.json +++ b/app/javascript/dashboard/i18n/locale/zh_TW/bulkActions.json @@ -1,17 +1,29 @@ { - "BULK_ACTION": { - "CONVERSATIONS_SELECTED": "%{conversationCount} conversations selected", - "AGENT_SELECT_LABEL": "選擇客服", - "ASSIGN_CONFIRMATION_LABEL": "Are you sure you want to assign %{conversationCount} %{conversationLabel} to", - "GO_BACK_LABEL": "Go back", - "ASSIGN_LABEL": "指派", - "ASSIGN_AGENT_TOOLTIP": "Assign Agent", - "RESOLVE_TOOLTIP": "已解決", - "ASSIGN_SUCCESFUL": "Conversations assigned successfully", - "ASSIGN_FAILED": "Failed to assign conversations, please try again", - "RESOLVE_SUCCESFUL": "Conversations resolved successfully", - "RESOLVE_FAILED": "Failed to resolve conversations, please try again", - "ALL_CONVERSATIONS_SELECTED_ALERT": "Conversations visible on this page are only selected.", - "AGENT_LIST_LOADING": "Loading Agents" + "BULK_ACTION": { + "CONVERSATIONS_SELECTED": "%{conversationCount} conversations selected", + "AGENT_SELECT_LABEL": "選擇客服", + "ASSIGN_CONFIRMATION_LABEL": "Are you sure you want to assign %{conversationCount} %{conversationLabel} to", + "GO_BACK_LABEL": "Go back", + "ASSIGN_LABEL": "指派", + "ASSIGN_AGENT_TOOLTIP": "Assign Agent", + "ASSIGN_SUCCESFUL": "Conversations assigned successfully", + "ASSIGN_FAILED": "Failed to assign conversations, please try again", + "RESOLVE_SUCCESFUL": "Conversations resolved successfully", + "RESOLVE_FAILED": "Failed to resolve conversations, please try again", + "ALL_CONVERSATIONS_SELECTED_ALERT": "Conversations visible on this page are only selected.", + "AGENT_LIST_LOADING": "Loading Agents", + "UPDATE": { + "CHANGE_STATUS": "Change status", + "SNOOZE_UNTIL_NEXT_REPLY": "Snooze until next reply", + "UPDATE_SUCCESFUL": "Conversation status updated successfully.", + "UPDATE_FAILED": "Failed to update conversations, please try again" + }, + "LABELS": { + "ASSIGN_LABELS": "Assign Labels", + "NO_LABELS_FOUND": "No labels found for", + "ASSIGN_SELECTED_LABELS": "Assign selected labels", + "ASSIGN_SUCCESFUL": "Labels assigned successfully", + "ASSIGN_FAILED": "Failed to assign labels, please try again" } + } } diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/contact.json b/app/javascript/dashboard/i18n/locale/zh_TW/contact.json index ec4143330..2e9bbc50e 100644 --- a/app/javascript/dashboard/i18n/locale/zh_TW/contact.json +++ b/app/javascript/dashboard/i18n/locale/zh_TW/contact.json @@ -111,7 +111,8 @@ "EMAIL_ADDRESS": { "PLACEHOLDER": "請輸入聯絡人電子信箱", "LABEL": "電子信箱地址", - "DUPLICATE": "這個電子信箱已經被其他聯絡人使用了。" + "DUPLICATE": "這個電子信箱已經被其他聯絡人使用了。", + "ERROR": "請輸入一個有效的電子信箱." }, "PHONE_NUMBER": { "PLACEHOLDER": "請輸入聯絡人電話", diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/zh_TW/inboxMgmt.json index 33f939139..74f8e6d4f 100644 --- a/app/javascript/dashboard/i18n/locale/zh_TW/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/zh_TW/inboxMgmt.json @@ -30,7 +30,8 @@ "ADD": { "CHANNEL_NAME": { "LABEL": "收件匣名稱", - "PLACEHOLDER": "Enter your inbox name (eg: Acme Inc)" + "PLACEHOLDER": "Enter your inbox name (eg: Acme Inc)", + "ERROR": "Please enter a valid inbox name" }, "WEBSITE_NAME": { "LABEL": "網站名稱", @@ -82,7 +83,7 @@ }, "CHANNEL_GREETING_TOGGLE": { "LABEL": "開啟頻道問候功能", - "HELP_TEXT": "Send a greeting message to the users when they starts the conversation.", + "HELP_TEXT": "Automatically send a greeting message when a new conversation is created.", "ENABLED": "已啟用", "DISABLED": "已停用" }, @@ -97,7 +98,10 @@ "LABEL": "視窗小元件顏色", "PLACEHOLDER": "更新小元件中使用的元件顏色" }, - "SUBMIT_BUTTON": "建立收件匣" + "SUBMIT_BUTTON": "建立收件匣", + "API": { + "ERROR_MESSAGE": "We were not able to create a website channel, please try again" + } }, "TWILIO": { "TITLE": "Twilio SMS/WhatsApp Channel", @@ -193,6 +197,7 @@ "PROVIDERS": { "LABEL": "API Provider", "TWILIO": "Twilio", + "WHATSAPP_CLOUD": "WhatsApp Cloud", "360_DIALOG": "360Dialog" }, "INBOX_NAME": { @@ -205,13 +210,31 @@ "PLACEHOLDER": "請輸入發送消息的電話號碼。", "ERROR": "請輸入一個有效的值。電話號碼應該以`+`開始。" }, + "PHONE_NUMBER_ID": { + "LABEL": "Phone number ID", + "PLACEHOLDER": "Please enter the Phone number ID obtained from Facebook developer dashboard.", + "ERROR": "Please enter a valid value." + }, + "BUSINESS_ACCOUNT_ID": { + "LABEL": "Business Account ID", + "PLACEHOLDER": "Please enter the Business Account ID obtained from Facebook developer dashboard.", + "ERROR": "Please enter a valid value." + }, + "WEBHOOK_VERIFY_TOKEN": { + "LABEL": "Webhook Verify Token", + "PLACEHOLDER": "Enter a verify token which you want to configure for facebook webhooks.", + "ERROR": "Please enter a valid value." + }, "API_KEY": { "LABEL": "API key", "SUBTITLE": "Configure the WhatsApp API key.", "PLACEHOLDER": "API key", - "APPLY_FOR_ACCESS": "Don't have any API key? Apply for access here", "ERROR": "Please enter a valid value." }, + "API_CALLBACK": { + "TITLE": "回呼地址", + "SUBTITLE": "You have to configure the webhook URL in facebook developer portal with the URL mentioned here." + }, "SUBMIT_BUTTON": "Create WhatsApp Channel", "API": { "ERROR_MESSAGE": "We were not able to save the WhatsApp channel" @@ -298,7 +321,7 @@ }, "AUTH": { "TITLE": "Choose a channel", - "DESC": "Chatwoot supports live-chat widget, Facebook page, Twitter profile, WhatsApp, Email etc., as channels. If you want to build a custom channel, you can create it using the API channel. Select one channel from the options below to proceed." + "DESC": "Chatwoot supports live-chat widgets, Facebook Messenger, Twitter profiles, WhatsApp, Emails, etc., as channels. If you want to build a custom channel, you can create it using the API channel. To get started, choose one of the channels below." }, "AGENTS": { "TITLE": "客服", @@ -339,7 +362,7 @@ "API": { "SUCCESS_MESSAGE": "已成功更新收件匣設定", "AUTO_ASSIGNMENT_SUCCESS_MESSAGE": "自動分配成功更新", - "ERROR_MESSAGE": "無法更新元件顏色。請稍後再試。" + "ERROR_MESSAGE": "We couldn't update inbox settings. Please try again later." }, "EMAIL_COLLECT_BOX": { "ENABLED": "已啟用", @@ -412,15 +435,22 @@ "INBOX_UPDATE_SUB_TEXT": "更新收件匣設定", "AUTO_ASSIGNMENT_SUB_TEXT": "啟用或停用此收件匣客服的對話自動分配。", "HMAC_VERIFICATION": "使用者身份驗證", - "HMAC_DESCRIPTION": "Inorder to validate the user's identity, the SDK allows you to pass an `identifier_hash` for each user. You can generate HMAC using 'sha256' with the key shown here.", + "HMAC_DESCRIPTION": "In order to validate the user's identity, you can pass an `identifier_hash` for each user. You can generate a HMAC sha256 hash using the `identifier` with the key shown here.", "HMAC_MANDATORY_VERIFICATION": "Enforce User Identity Validation", - "HMAC_MANDATORY_DESCRIPTION": "If enabled, Chatwoot SDKs setUser method will not work unless the `identifier_hash` is provided for each user.", + "HMAC_MANDATORY_DESCRIPTION": "If enabled, requests missing the `identifier_hash` will be rejected.", "INBOX_IDENTIFIER": "Inbox Identifier", "INBOX_IDENTIFIER_SUB_TEXT": "Use the `inbox_identifier` token shown here to authentication your API clients.", "FORWARD_EMAIL_TITLE": "Forward to Email", "FORWARD_EMAIL_SUB_TEXT": "開始將您的電子信箱轉發到以下電子信箱地址。", "ALLOW_MESSAGES_AFTER_RESOLVED": "Allow messages after conversation resolved", - "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Allow the end-users to send messages even after the conversation is resolved." + "ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Allow the end-users to send messages even after the conversation is resolved.", + "WHATSAPP_SECTION_SUBHEADER": "This API Key is used for the integration with the WhatsApp APIs.", + "WHATSAPP_SECTION_TITLE": "API Key" + }, + "AUTO_ASSIGNMENT": { + "MAX_ASSIGNMENT_LIMIT": "Auto assignment limit", + "MAX_ASSIGNMENT_LIMIT_RANGE_ERROR": "Please enter a value greater than 0", + "MAX_ASSIGNMENT_LIMIT_SUB_TEXT": "Limit the maximum number of conversations from this inbox that can be auto assigned to an agent" }, "FACEBOOK_REAUTHORIZE": { "TITLE": "重新授權", diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/report.json b/app/javascript/dashboard/i18n/locale/zh_TW/report.json index ceb0f230e..2f7d08b19 100644 --- a/app/javascript/dashboard/i18n/locale/zh_TW/report.json +++ b/app/javascript/dashboard/i18n/locale/zh_TW/report.json @@ -65,6 +65,7 @@ "PLACEHOLDER": "Select date range" }, "GROUP_BY_FILTER_DROPDOWN_LABEL": "Group By", + "DURATION_FILTER_LABEL": "Duration", "GROUP_BY_DAY_OPTIONS": [ { "id": 1, diff --git a/app/javascript/survey/i18n/locale/ar.json b/app/javascript/survey/i18n/locale/ar.json index 9cd0cc6d1..945c640a2 100644 --- a/app/javascript/survey/i18n/locale/ar.json +++ b/app/javascript/survey/i18n/locale/ar.json @@ -15,5 +15,5 @@ "ERROR_MESSAGE": "تعذر الاتصال بالخادم، الرجاء المحاولة مرة أخرى لاحقاً" } }, - "POWERED_BY": "مدعوم بواسطة Chatwoot" + "POWERED_BY": "مدعوم بواسطة تشات وت" } diff --git a/config/locales/ar.yml b/config/locales/ar.yml index 3f568fc4b..8b5a6ecca 100644 --- a/config/locales/ar.yml +++ b/config/locales/ar.yml @@ -32,6 +32,15 @@ ar: contacts: import: failed: الملف فارغ + inboxes: + imap: + socket_error: الرجاء التحقق من اتصال الشبكة، عنوان IMAP وحاول مرة أخرى. + no_response_error: الرجاء التحقق من بيانات اعتماد IMAP وحاول مرة أخرى. + host_unreachable_error: المضيف لا يمكن الوصول إليه، الرجاء التحقق من عنوان IMAP، منفذ IMAP وحاول مرة أخرى. + connection_timed_out_error: انتهت مهلة الاتصال لـ %{address}:%{port} + connection_closed_error: تم إغلاق الاتصال. + validations: + name: لا ينبغي أن تبدأ أو تنتهي بالرموز، ولا ينبغي أن يكون أقل من > / \ أحرف @ . reports: period: فترة التبليغ %{since} إلى %{until} agent_csv: diff --git a/config/locales/bg.yml b/config/locales/bg.yml index 101b76ee9..519f63cd8 100644 --- a/config/locales/bg.yml +++ b/config/locales/bg.yml @@ -32,6 +32,15 @@ bg: contacts: import: failed: File is blank + 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. reports: period: Reporting period %{since} to %{until} agent_csv: diff --git a/config/locales/ca.yml b/config/locales/ca.yml index f23afb7a7..02161a1e6 100644 --- a/config/locales/ca.yml +++ b/config/locales/ca.yml @@ -32,6 +32,15 @@ ca: contacts: import: failed: File is blank + 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. reports: period: Període d'informes %{since} a %{until} agent_csv: diff --git a/config/locales/cs.yml b/config/locales/cs.yml index afd830dbd..1eda067f4 100644 --- a/config/locales/cs.yml +++ b/config/locales/cs.yml @@ -32,6 +32,15 @@ cs: contacts: import: failed: File is blank + 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. reports: period: Reporting period %{since} to %{until} agent_csv: diff --git a/config/locales/da.yml b/config/locales/da.yml index ce6b0479e..10c4fc53d 100644 --- a/config/locales/da.yml +++ b/config/locales/da.yml @@ -32,6 +32,15 @@ da: contacts: import: failed: File is blank + 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. reports: period: Reporting period %{since} to %{until} agent_csv: diff --git a/config/locales/de.yml b/config/locales/de.yml index ecda08060..daa4bfbd9 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -32,6 +32,15 @@ de: contacts: import: failed: Datei ist leer + inboxes: + imap: + socket_error: Bitte überprüfen Sie die Netzwerkverbindung, die IMAP-Adresse und versuchen Sie es erneut. + no_response_error: Bitte überprüfen Sie die IMAP-Anmeldeinformationen und versuchen Sie es erneut. + host_unreachable_error: Host nicht erreichbar. Bitte überprüfen Sie die IMAP-Adresse und den IMAP-Port und versuchen Sie es erneut. + connection_timed_out_error: Zeitüberschreitung der Verbindung für %{address}:%{port} + connection_closed_error: Verbindung geschlossen. + validations: + name: Sollte nicht mit Symbolen beginnen oder enden, und es sollte keine < > / \ @ Zeichen enthalten. reports: period: Berichtszeitraum von %{since} bis %{until} agent_csv: diff --git a/config/locales/el.yml b/config/locales/el.yml index 456731e7c..f65ea702d 100644 --- a/config/locales/el.yml +++ b/config/locales/el.yml @@ -32,6 +32,15 @@ el: contacts: import: failed: Το αρχείο είναι κενό + inboxes: + imap: + socket_error: Παρακαλώ ελέγξτε τη σύνδεση δικτύου, τη διεύθυνση IMAP και προσπαθήστε ξανά. + no_response_error: Παρακαλούμε ελέγξτε τα διαπιστευτήρια IMAP και προσπαθήστε ξανά. + host_unreachable_error: Μη προσβάσιμος διακομιστής, ελέγξτε τη διεύθυνση IMAP, τη θύρα IMAP και προσπαθήστε ξανά. + connection_timed_out_error: Λήξη χρονικού ορίου σύνδεσης για %{address}:%{port} + connection_closed_error: Η σύνδεση έκλεισε. + validations: + name: should not start or end with symbols, and it should not have < > / \ @ characters. reports: period: Περίοδος αναφοράς %{since} έως %{until} agent_csv: diff --git a/config/locales/es.yml b/config/locales/es.yml index 9ca9b2c50..538316061 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -32,6 +32,15 @@ es: contacts: import: failed: Archivo está en blanco + inboxes: + imap: + socket_error: Verifique la conexión de red, la dirección IMAP y vuelva a intentarlo. + no_response_error: Verifique las credenciales de IMAP y vuelva a intentarlo. + host_unreachable_error: Host inaccesible. Verifique la dirección IMAP, el puerto IMAP e intente nuevamente. + connection_timed_out_error: Se agotó el tiempo de conexión para %{address}:%{port} + connection_closed_error: Conexión cerrada. + validations: + name: should not start or end with symbols, and it should not have < > / \ @ characters. reports: period: Reportando el periodo desde %{since} hasta %{until} agent_csv: diff --git a/config/locales/fa.yml b/config/locales/fa.yml index cdf50fedc..1d03eea6c 100644 --- a/config/locales/fa.yml +++ b/config/locales/fa.yml @@ -32,6 +32,15 @@ fa: contacts: import: failed: پرونده خالی است + inboxes: + imap: + socket_error: لطفا اتصال شبکه، آدرس IMAP را بررسی کنید و دوباره امتحان کنید. + no_response_error: لطفا اعتبارنامه IMAP را بررسی کنید و دوباره امتحان کنید. + host_unreachable_error: میزبان غیرقابل دسترسی است، لطفا آدرس IMAP و پورت IMAP را بررسی کنید و دوباره امتحان کنید. + connection_timed_out_error: زمان اتصال برای %{address}:%{port} تمام شد + connection_closed_error: اتصال بسته شد. + validations: + name: نباید با نمادها شروع یا ختم شود و نباید دارای کاراکترهای < > / \ @ باشد. reports: period: زمان گزارش از %{since} تا %{until} agent_csv: diff --git a/config/locales/fi.yml b/config/locales/fi.yml index 8331ee75a..81ad5397d 100644 --- a/config/locales/fi.yml +++ b/config/locales/fi.yml @@ -32,6 +32,15 @@ fi: contacts: import: failed: File is blank + 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. reports: period: Raportointijakso %{since} – %{until} agent_csv: diff --git a/config/locales/fr.yml b/config/locales/fr.yml index e9eddddbc..6e5f2f2e4 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -32,6 +32,15 @@ fr: contacts: import: failed: Le fichier est vide + 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. reports: period: Période de rapport %{since} à %{until} agent_csv: diff --git a/config/locales/he.yml b/config/locales/he.yml index 7a3cca980..990ec8495 100644 --- a/config/locales/he.yml +++ b/config/locales/he.yml @@ -32,6 +32,15 @@ he: contacts: import: failed: File is blank + 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. reports: period: Reporting period %{since} to %{until} agent_csv: diff --git a/config/locales/hi.yml b/config/locales/hi.yml index eeeccb9f2..62dd23378 100644 --- a/config/locales/hi.yml +++ b/config/locales/hi.yml @@ -32,6 +32,15 @@ hi: contacts: import: failed: File is blank + 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. reports: period: Reporting period %{since} to %{until} agent_csv: diff --git a/config/locales/hu.yml b/config/locales/hu.yml index 7d401d86f..32ec8bd45 100644 --- a/config/locales/hu.yml +++ b/config/locales/hu.yml @@ -32,6 +32,15 @@ hu: contacts: import: failed: A fájl üres + 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. reports: period: Jelentési időszak %{since}-tól %{until}-ig agent_csv: diff --git a/config/locales/id.yml b/config/locales/id.yml index ab38f992f..626367aec 100644 --- a/config/locales/id.yml +++ b/config/locales/id.yml @@ -32,6 +32,15 @@ id: contacts: import: failed: File kosong + 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. reports: period: Periode pelaporan %{since} hingga %{until} agent_csv: diff --git a/config/locales/it.yml b/config/locales/it.yml index 97dfb0ffb..a99437ce7 100644 --- a/config/locales/it.yml +++ b/config/locales/it.yml @@ -32,6 +32,15 @@ it: contacts: import: failed: Il file è vuoto + inboxes: + imap: + socket_error: Controlla la connessione di rete, l'indirizzo IMAP e riprova. + no_response_error: Controlla le credenziali IMAP e riprova. + host_unreachable_error: Host irraggiungibile, Controlla l'indirizzo IMAP, la porta IMAP e riprova. + connection_timed_out_error: Connessione scaduta per %{address}:%{port} + connection_closed_error: Connessione chiusa. + validations: + name: non dovrebbe iniziare o terminare con i simboli, e non dovrebbe avere < > / \ @ caratteri. reports: period: Periodo di segnalazione da %{since} a %{until} agent_csv: diff --git a/config/locales/ja.yml b/config/locales/ja.yml index 51ec1b922..a7d33fa18 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -32,6 +32,15 @@ ja: contacts: import: failed: File is blank + 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. reports: period: Reporting period %{since} to %{until} agent_csv: diff --git a/config/locales/ko.yml b/config/locales/ko.yml index 2a5eea72c..5697b7451 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -32,6 +32,15 @@ ko: contacts: import: failed: File is blank + 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. reports: period: 보고 기간 %{since} - %{until} agent_csv: diff --git a/config/locales/lv.yml b/config/locales/lv.yml index cf12dc0eb..c3b228f74 100644 --- a/config/locales/lv.yml +++ b/config/locales/lv.yml @@ -32,6 +32,15 @@ lv: contacts: import: failed: File is blank + 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. reports: period: Reporting period %{since} to %{until} agent_csv: diff --git a/config/locales/ml.yml b/config/locales/ml.yml index 0896849fb..b51cc9268 100644 --- a/config/locales/ml.yml +++ b/config/locales/ml.yml @@ -32,6 +32,15 @@ ml: contacts: import: failed: File is blank + 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. reports: period: Reporting period %{since} to %{until} agent_csv: diff --git a/config/locales/ne.yml b/config/locales/ne.yml index f0edba6a8..b8a6db2b1 100644 --- a/config/locales/ne.yml +++ b/config/locales/ne.yml @@ -32,6 +32,15 @@ ne: contacts: import: failed: File is blank + 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. reports: period: Reporting period %{since} to %{until} agent_csv: diff --git a/config/locales/nl.yml b/config/locales/nl.yml index 7780f960c..d2b082e0c 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -32,6 +32,15 @@ nl: contacts: import: failed: File is blank + 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. reports: period: Reporting period %{since} to %{until} agent_csv: diff --git a/config/locales/no.yml b/config/locales/no.yml index e5b592df0..f25c6b194 100644 --- a/config/locales/no.yml +++ b/config/locales/no.yml @@ -32,6 +32,15 @@ contacts: import: failed: File is blank + 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. reports: period: Rapporteringsperiode %{since} til %{until} agent_csv: diff --git a/config/locales/pl.yml b/config/locales/pl.yml index d2f715e74..24e819bcb 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -32,6 +32,15 @@ pl: contacts: import: failed: Plik jest pusty + 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. reports: period: Okres raportowania od %{since} do %{until} agent_csv: diff --git a/config/locales/pt.yml b/config/locales/pt.yml index 86890ee02..90663406e 100644 --- a/config/locales/pt.yml +++ b/config/locales/pt.yml @@ -32,6 +32,15 @@ pt: contacts: import: failed: Arquivo está vazio + 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. reports: period: Período do relatório de %{since} a %{until} agent_csv: diff --git a/config/locales/pt_BR.yml b/config/locales/pt_BR.yml index a7e0425cd..efe4aff8c 100644 --- a/config/locales/pt_BR.yml +++ b/config/locales/pt_BR.yml @@ -32,6 +32,15 @@ pt_BR: contacts: import: failed: Arquivo vazio + inboxes: + imap: + socket_error: Por favor, verifique a conexão de rede, endereço de IMAP e tente novamente. + no_response_error: Por favor, verifique as credenciais de IMAP e tente novamente. + host_unreachable_error: Servidor inacessível, por favor, verifique o endereço e a porta de IMAP e tente novamente. + connection_timed_out_error: Tempo esgotado de conexão para %{address}:%{port} + connection_closed_error: Conexão fechada. + validations: + name: 'não deve iniciar ou terminar com símbolos e não deve ter os caracteres: < > / \ @.' reports: period: Reportando o período %{since} a %{until} agent_csv: diff --git a/config/locales/ro.yml b/config/locales/ro.yml index 0ac716b04..73a80b5f7 100644 --- a/config/locales/ro.yml +++ b/config/locales/ro.yml @@ -32,6 +32,15 @@ ro: contacts: import: failed: Fișierul este necompletat + 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. reports: period: Perioada de raportare %{since}-%{until} agent_csv: diff --git a/config/locales/ru.yml b/config/locales/ru.yml index 47ded8644..828659797 100644 --- a/config/locales/ru.yml +++ b/config/locales/ru.yml @@ -32,6 +32,15 @@ ru: contacts: import: failed: Пустой файл + inboxes: + imap: + socket_error: Пожалуйста, проверьте сетевое подключение, адрес IMAP и повторите попытку. + no_response_error: Проверьте учетные данные IMAP и повторите попытку. + host_unreachable_error: Хост недоступен. Проверьте адрес IMAP, порт IMAP и повторите попытку. + connection_timed_out_error: Время ожидания соединения для %{address}:%{port} истекло + connection_closed_error: Соединение закрыто. + validations: + name: Не должен начинаться или заканчиваться символами, и у него Не должно быть < > / \ @ символов. reports: period: Отчётный период с %{since} по %{until} agent_csv: diff --git a/config/locales/sk.yml b/config/locales/sk.yml index 8a592a040..6664fa7a7 100644 --- a/config/locales/sk.yml +++ b/config/locales/sk.yml @@ -32,6 +32,15 @@ sk: contacts: import: failed: File is blank + 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. reports: period: Reporting period %{since} to %{until} agent_csv: diff --git a/config/locales/sr.yml b/config/locales/sr.yml index 9bbea927b..9371ee8c9 100644 --- a/config/locales/sr.yml +++ b/config/locales/sr.yml @@ -32,6 +32,15 @@ sr-Latn: contacts: import: failed: File is blank + 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. reports: period: Reporting period %{since} to %{until} agent_csv: diff --git a/config/locales/sv.yml b/config/locales/sv.yml index 930b481d1..3a4bc8b17 100644 --- a/config/locales/sv.yml +++ b/config/locales/sv.yml @@ -32,6 +32,15 @@ sv: contacts: import: failed: File is blank + 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. reports: period: Rapporteringsperiod %{since} till %{until} agent_csv: diff --git a/config/locales/ta.yml b/config/locales/ta.yml index e1a340b5a..fa52b558f 100644 --- a/config/locales/ta.yml +++ b/config/locales/ta.yml @@ -32,6 +32,15 @@ ta: contacts: import: failed: File is blank + 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. reports: period: Reporting period %{since} to %{until} agent_csv: diff --git a/config/locales/th.yml b/config/locales/th.yml index 211e3392f..fa0a34505 100644 --- a/config/locales/th.yml +++ b/config/locales/th.yml @@ -32,6 +32,15 @@ th: contacts: import: failed: File is blank + 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. reports: period: Reporting period %{since} to %{until} agent_csv: diff --git a/config/locales/tr.yml b/config/locales/tr.yml index 5470142ab..e55d27e5e 100644 --- a/config/locales/tr.yml +++ b/config/locales/tr.yml @@ -32,6 +32,15 @@ tr: contacts: import: failed: Dosya boş + 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. reports: period: Raporlama aralığı %{since}'dan %{until}'a agent_csv: diff --git a/config/locales/uk.yml b/config/locales/uk.yml index bd7b9718e..dc4a9b9ea 100644 --- a/config/locales/uk.yml +++ b/config/locales/uk.yml @@ -32,6 +32,15 @@ uk: contacts: import: failed: Файл порожній + inboxes: + imap: + socket_error: Перевірте підключення до мережі, адреса IMAP і повторіть спробу. + no_response_error: Будь ласка, перевірте облікові дані IMAP і повторіть спробу. + host_unreachable_error: Хост недоступний. Будь-ласка, перевірте адресу IMAP, порт IMAP і повторіть спробу. + connection_timed_out_error: Вичерпано час очікування з'єднання для %{address}:%{port} + connection_closed_error: З'єднання закрито. + validations: + name: should not start or end with symbols, and it should not have < > / \ @ characters. reports: period: Період звіту %{since} до %{until} agent_csv: @@ -40,14 +49,14 @@ uk: avg_first_response_time: Середній час першої відповіді (Хвилин) avg_resolution_time: Середній час вирішення (Хвилин) inbox_csv: - inbox_name: Inbox name - inbox_type: Inbox type - conversations_count: No. of conversations + inbox_name: Назва Джерела + inbox_type: Тип Джерела + conversations_count: '№ розмов' avg_first_response_time: Середній час першої відповіді (Хвилин) avg_resolution_time: Середній час вирішення (Хвилин) label_csv: label_title: Мітка - conversations_count: No. of conversations + conversations_count: '№ розмов' avg_first_response_time: Середній час першої відповіді (Хвилин) avg_resolution_time: Середній час вирішення (Хвилин) team_csv: @@ -65,7 +74,7 @@ uk: agent_name: Ім'я агента rating: Оцінка feedback: Відгук - recorded_at: Recorded date + recorded_at: Дата запису notifications: notification_title: conversation_creation: "[Новий діалог] - #%{display_id} було створено в %{inbox_name}" diff --git a/config/locales/ur.yml b/config/locales/ur.yml index a14706483..b2328df46 100644 --- a/config/locales/ur.yml +++ b/config/locales/ur.yml @@ -32,6 +32,15 @@ ur: contacts: import: failed: File is blank + 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. reports: period: Reporting period %{since} to %{until} agent_csv: diff --git a/config/locales/ur_IN.yml b/config/locales/ur_IN.yml index 0f05aec46..522924280 100644 --- a/config/locales/ur_IN.yml +++ b/config/locales/ur_IN.yml @@ -32,6 +32,15 @@ ur: contacts: import: failed: File is blank + 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. reports: period: Reporting period %{since} to %{until} agent_csv: diff --git a/config/locales/vi.yml b/config/locales/vi.yml index f1e0faca3..36813a862 100644 --- a/config/locales/vi.yml +++ b/config/locales/vi.yml @@ -32,6 +32,15 @@ vi: contacts: import: failed: Chưa chọn file + 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. reports: period: Thời gian báo cáo từ %{since} đến %{until} agent_csv: @@ -46,7 +55,7 @@ vi: avg_first_response_time: Thời gian trung bình của phản hồi đầu tiên (phút) avg_resolution_time: Thời gian giải quyết trung bình (phút) label_csv: - label_title: Label + label_title: Nhãn conversations_count: No. of conversations avg_first_response_time: Thời gian trung bình của phản hồi đầu tiên (phút) avg_resolution_time: Thời gian giải quyết trung bình (phút) diff --git a/config/locales/zh_CN.yml b/config/locales/zh_CN.yml index 0bc5acad0..a1b65d0b3 100644 --- a/config/locales/zh_CN.yml +++ b/config/locales/zh_CN.yml @@ -32,6 +32,15 @@ zh_CN: contacts: import: failed: File is blank + 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. reports: period: Reporting period %{since} to %{until} agent_csv: diff --git a/config/locales/zh_TW.yml b/config/locales/zh_TW.yml index b76b65e0a..4a06dc8a8 100644 --- a/config/locales/zh_TW.yml +++ b/config/locales/zh_TW.yml @@ -32,6 +32,15 @@ zh_TW: contacts: import: failed: File is blank + 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. reports: period: Reporting period %{since} to %{until} agent_csv: From bca347149aa27d0ffd8fda8d93dcde44bc3e8114 Mon Sep 17 00:00:00 2001 From: Pranav Raj S Date: Fri, 8 Jul 2022 13:53:01 +0700 Subject: [PATCH 39/70] feat: Add responsive tab styles (#4997) --- .../dashboard/assets/scss/_variables.scss | 4 ++ .../dashboard/assets/scss/widgets/_tabs.scss | 28 +++++++- .../dashboard/components/ui/Tabs/Tabs.js | 70 +++++++++++++++++-- .../widgets/conversation/ConversationBox.vue | 1 + .../dashboard/settings/inbox/Settings.vue | 6 +- .../FluentIcon/dashboard-icons.json | 6 +- 6 files changed, 106 insertions(+), 9 deletions(-) diff --git a/app/javascript/dashboard/assets/scss/_variables.scss b/app/javascript/dashboard/assets/scss/_variables.scss index ea8334c57..f24f00830 100644 --- a/app/javascript/dashboard/assets/scss/_variables.scss +++ b/app/javascript/dashboard/assets/scss/_variables.scss @@ -99,3 +99,7 @@ $ionicons-font-path: '~ionicons/fonts'; // Transitions $transition-ease-in: all 0.250s ease-in; + +:root { + --dashboard-app-tabs-height: 3.9rem; +} diff --git a/app/javascript/dashboard/assets/scss/widgets/_tabs.scss b/app/javascript/dashboard/assets/scss/widgets/_tabs.scss index dbb68f6d5..234d7e171 100644 --- a/app/javascript/dashboard/assets/scss/widgets/_tabs.scss +++ b/app/javascript/dashboard/assets/scss/widgets/_tabs.scss @@ -1,9 +1,34 @@ +.tabs--container { + display: flex; +} + +.tabs--container--with-border { + @include border-normal-bottom; +} + .tabs { @include padding($zero $space-normal); - @include border-normal-bottom; border-left-width: 0; border-right-width: 0; border-top-width: 0; + display: flex; + min-width: var(--space-mega); +} + +.tabs--with-scroll { + max-width: calc(100% - 64px); + overflow: hidden; + padding: 0 var(--space-smaller); +} + +.tabs--scroll-button { + align-items: center; + border-radius: 0; + cursor: pointer; + display: flex; + height: auto; + justify-content: center; + min-width: var(--space-large); } // Tab chat type @@ -22,6 +47,7 @@ .tabs-title { @include margin($zero $space-slab); + flex-shrink: 0; .badge { background: $color-background; diff --git a/app/javascript/dashboard/components/ui/Tabs/Tabs.js b/app/javascript/dashboard/components/ui/Tabs/Tabs.js index 87abd41f7..cae81b91f 100644 --- a/app/javascript/dashboard/components/ui/Tabs/Tabs.js +++ b/app/javascript/dashboard/components/ui/Tabs/Tabs.js @@ -5,8 +5,61 @@ export default { type: Number, default: 0, }, + border: { + type: Boolean, + default: true, + }, }, - render() { + data() { + return { hasScroll: false }; + }, + created() { + window.addEventListener('resize', this.computeScrollWidth); + }, + beforeDestroy() { + window.removeEventListener('resize', this.computeScrollWidth); + }, + mounted() { + this.computeScrollWidth(); + }, + methods: { + computeScrollWidth() { + const tabElement = this.$el.getElementsByClassName('tabs')[0]; + this.hasScroll = tabElement.scrollWidth > tabElement.clientWidth; + }, + onScrollClick(direction) { + const tabElement = this.$el.getElementsByClassName('tabs')[0]; + let scrollPosition = tabElement.scrollLeft; + if (direction === 'left') { + scrollPosition -= 100; + } else { + scrollPosition += 100; + } + tabElement.scrollTo({ + top: 0, + left: scrollPosition, + behavior: 'smooth', + }); + }, + createScrollButton(createElement, direction) { + if (!this.hasScroll) { + return false; + } + return createElement( + 'button', + { + class: 'tabs--scroll-button button clear secondary button--only-icon', + on: { click: () => this.onScrollClick(direction) }, + }, + [ + createElement('fluent-icon', { + props: { icon: `chevron-${direction}`, size: 16 }, + }), + ] + ); + }, + }, + render(createElement) { const Tabs = this.$slots.default .filter( node => @@ -18,14 +71,21 @@ export default { data.index = index; return node; }); + const leftButton = this.createScrollButton(createElement, 'left'); + const rightButton = this.createScrollButton(createElement, 'right'); return ( -
    - {Tabs} -
+ {leftButton} +
    + {Tabs} +
+ {rightButton} +
); }, }; diff --git a/app/javascript/dashboard/components/widgets/conversation/ConversationBox.vue b/app/javascript/dashboard/components/widgets/conversation/ConversationBox.vue index d2eb8a4bd..08909566e 100644 --- a/app/javascript/dashboard/components/widgets/conversation/ConversationBox.vue +++ b/app/javascript/dashboard/components/widgets/conversation/ConversationBox.vue @@ -141,6 +141,7 @@ export default { .dashboard-app--tabs { background: var(--white); margin-top: -1px; + min-height: var(--dashboard-app-tabs-height); } .messages-and-sidebar { diff --git a/app/javascript/dashboard/routes/dashboard/settings/inbox/Settings.vue b/app/javascript/dashboard/routes/dashboard/settings/inbox/Settings.vue index 256f2b0c5..b73289b8d 100644 --- a/app/javascript/dashboard/routes/dashboard/settings/inbox/Settings.vue +++ b/app/javascript/dashboard/routes/dashboard/settings/inbox/Settings.vue @@ -4,7 +4,11 @@ :header-image="inbox.avatarUrl" :header-title="inboxName" > - + Date: Fri, 8 Jul 2022 10:28:09 +0200 Subject: [PATCH 40/70] chore: Fix contact model silently discarding invalid attributes (#4994) fixes: #4775 --- app/actions/contact_identify_action.rb | 7 ++++--- .../api/v1/widget/contacts_controller.rb | 3 ++- app/models/contact.rb | 12 ++++++++--- spec/actions/contact_identify_action_spec.rb | 18 +++++++++++++++++ .../api/v1/widget/contacts_controller_spec.rb | 2 +- spec/models/contact_spec.rb | 20 ++++--------------- 6 files changed, 38 insertions(+), 24 deletions(-) diff --git a/app/actions/contact_identify_action.rb b/app/actions/contact_identify_action.rb index ed90306ec..f19caac77 100644 --- a/app/actions/contact_identify_action.rb +++ b/app/actions/contact_identify_action.rb @@ -6,7 +6,7 @@ # We don't want to update the name of the identified original contact. class ContactIdentifyAction - pattr_initialize [:contact!, :params!, { retain_original_contact_name: false }] + pattr_initialize [:contact!, :params!, { retain_original_contact_name: false, discard_invalid_attrs: false }] def perform @attributes_to_update = [:identifier, :name, :email, :phone_number] @@ -97,12 +97,13 @@ class ContactIdentifyAction end def update_contact - params_to_update = params.slice(*@attributes_to_update).reject do |_k, v| + @contact.attributes = params.slice(*@attributes_to_update).reject do |_k, v| v.blank? end.merge({ custom_attributes: custom_attributes, additional_attributes: additional_attributes }) # blank identifier or email will throw unique index error # TODO: replace reject { |_k, v| v.blank? } with compact_blank when rails is upgraded - @contact.update!(params_to_update) + @contact.discard_invalid_attrs if discard_invalid_attrs + @contact.save! ContactAvatarJob.perform_later(@contact, params[:avatar_url]) if params[:avatar_url].present? end diff --git a/app/controllers/api/v1/widget/contacts_controller.rb b/app/controllers/api/v1/widget/contacts_controller.rb index b6f997b06..5138fe675 100644 --- a/app/controllers/api/v1/widget/contacts_controller.rb +++ b/app/controllers/api/v1/widget/contacts_controller.rb @@ -36,7 +36,8 @@ class Api::V1::Widget::ContactsController < Api::V1::Widget::BaseController def identify_contact(contact) contact_identify_action = ContactIdentifyAction.new( contact: contact, - params: permitted_params.to_h.deep_symbolize_keys + params: permitted_params.to_h.deep_symbolize_keys, + discard_invalid_attrs: true ) @contact = contact_identify_action.perform end diff --git a/app/models/contact.rb b/app/models/contact.rb index 53dc9d281..157878654 100644 --- a/app/models/contact.rb +++ b/app/models/contact.rb @@ -28,10 +28,12 @@ class Contact < ApplicationRecord include Labelable validates :account_id, presence: true - validates :email, allow_blank: true, uniqueness: { scope: [:account_id], case_sensitive: false } + validates :email, allow_blank: true, uniqueness: { scope: [:account_id], case_sensitive: false }, + format: { with: Devise.email_regexp, message: 'Invalid email' } validates :identifier, allow_blank: true, uniqueness: { scope: [:account_id] } validates :phone_number, - allow_blank: true, uniqueness: { scope: [:account_id] } + allow_blank: true, uniqueness: { scope: [:account_id] }, + format: { with: /\+[1-9]\d{1,14}\z/, message: 'Should be in e164 format' } validates :name, length: { maximum: 255 } belongs_to :account @@ -42,7 +44,6 @@ class Contact < ApplicationRecord has_many :messages, as: :sender, dependent: :destroy_async has_many :notes, dependent: :destroy_async before_validation :prepare_contact_attributes - before_save :phone_number_format, :email_format after_create_commit :dispatch_create_event, :ip_lookup after_update_commit :dispatch_update_event after_destroy_commit :dispatch_destroy_event @@ -134,6 +135,11 @@ class Contact < ApplicationRecord ).or(Current.account.contacts.where.not(identifier: [nil, ''])) end + def discard_invalid_attrs + phone_number_format + email_format + end + private def ip_lookup diff --git a/spec/actions/contact_identify_action_spec.rb b/spec/actions/contact_identify_action_spec.rb index 00599c65d..d64731c3e 100644 --- a/spec/actions/contact_identify_action_spec.rb +++ b/spec/actions/contact_identify_action_spec.rb @@ -115,5 +115,23 @@ describe ::ContactIdentifyAction do expect { contact.reload }.to raise_error(ActiveRecord::RecordNotFound) end end + + context 'when discard_invalid_attrs is set to false' do + it 'will not update the name of the existing contact' do + params = { email: 'blah blah blah', name: 'new name' } + expect do + described_class.new(contact: contact, params: params, retain_original_contact_name: true).perform + end.to raise_error(ActiveRecord::RecordInvalid) + end + end + + context 'when discard_invalid_attrs is set to true' do + it 'will not update the name of the existing contact' do + params = { phone_number: 'blahblah blah', name: 'new name' } + described_class.new(contact: contact, params: params, discard_invalid_attrs: true).perform + expect(contact.reload.name).to eq 'new name' + expect(contact.phone_number).to eq nil + end + end end end diff --git a/spec/controllers/api/v1/widget/contacts_controller_spec.rb b/spec/controllers/api/v1/widget/contacts_controller_spec.rb index 0a29d8285..0b69c0859 100644 --- a/spec/controllers/api/v1/widget/contacts_controller_spec.rb +++ b/spec/controllers/api/v1/widget/contacts_controller_spec.rb @@ -33,7 +33,7 @@ RSpec.describe '/api/v1/widget/contacts', type: :request do as: :json expect(response).to have_http_status(:success) - expected_params = { contact: contact, params: params } + expected_params = { contact: contact, params: params, discard_invalid_attrs: true } expect(ContactIdentifyAction).to have_received(:new).with(expected_params) expect(identify_action).to have_received(:perform) end diff --git a/spec/models/contact_spec.rb b/spec/models/contact_spec.rb index 416e0e68d..a6893ae76 100644 --- a/spec/models/contact_spec.rb +++ b/spec/models/contact_spec.rb @@ -44,41 +44,29 @@ RSpec.describe Contact do end end - # rubocop:disable Rails/SkipsModelValidations context 'when phone number format' do - it 'will not throw error for existing invalid phone number' do + it 'will throw error for existing invalid phone number' do contact = create(:contact) - contact.update_column(:phone_number, '344234') - contact.reload - expect(contact.update!(name: 'test')).to eq true - expect(contact.phone_number).to eq '344234' + expect { contact.update!(phone_number: '123456789') }.to raise_error(ActiveRecord::RecordInvalid) end it 'updates phone number when adding valid phone number' do contact = create(:contact) - contact.update_column(:phone_number, '344234') - contact.reload expect(contact.update!(phone_number: '+12312312321')).to eq true expect(contact.phone_number).to eq '+12312312321' end end context 'when email format' do - it 'will not throw error for existing invalid email' do + it 'will throw error for existing invalid email' do contact = create(:contact) - contact.update_column(:email, 'ssfdasdf Date: Fri, 8 Jul 2022 14:25:32 +0530 Subject: [PATCH 41/70] feat: Add the ability to create dashboard apps from the UI (#4924) Co-authored-by: Pranav Raj S --- .../layout/config/sidebarItems/settings.js | 1 + .../i18n/locale/en/integrations.json | 53 +++++- .../DashboardApps/DashboardAppModal.vue | 174 ++++++++++++++++++ .../DashboardApps/DashboardAppsRow.vue | 45 +++++ .../integrations/DashboardApps/Index.vue | 158 ++++++++++++++++ .../dashboard/settings/integrations/Index.vue | 14 ++ .../integrations/integrations.routes.js | 7 + .../dashboard/store/modules/dashboardApps.js | 37 ++++ .../specs/dashboardApps/actions.spec.js | 66 ++++++- .../modules/specs/dashboardApps/fixtures.js | 19 ++ .../specs/dashboardApps/mutations.spec.js | 28 +++ .../dashboard/store/mutation-types.js | 3 + .../dashboard/images/integrations/cable.svg | 97 ++++------ .../images/integrations/dashboard-apps.svg | 75 ++++++++ 14 files changed, 713 insertions(+), 64 deletions(-) create mode 100644 app/javascript/dashboard/routes/dashboard/settings/integrations/DashboardApps/DashboardAppModal.vue create mode 100644 app/javascript/dashboard/routes/dashboard/settings/integrations/DashboardApps/DashboardAppsRow.vue create mode 100644 app/javascript/dashboard/routes/dashboard/settings/integrations/DashboardApps/Index.vue create mode 100644 app/javascript/dashboard/store/modules/specs/dashboardApps/fixtures.js create mode 100644 public/dashboard/images/integrations/dashboard-apps.svg diff --git a/app/javascript/dashboard/components/layout/config/sidebarItems/settings.js b/app/javascript/dashboard/components/layout/config/sidebarItems/settings.js index 176fd152c..0b78e8a21 100644 --- a/app/javascript/dashboard/components/layout/config/sidebarItems/settings.js +++ b/app/javascript/dashboard/components/layout/config/sidebarItems/settings.js @@ -18,6 +18,7 @@ const settings = accountId => ({ 'settings_integrations_webhook', 'settings_integrations_integration', 'settings_applications', + 'settings_integrations_dashboard_apps', 'settings_applications_webhook', 'settings_applications_integration', 'general_settings', diff --git a/app/javascript/dashboard/i18n/locale/en/integrations.json b/app/javascript/dashboard/i18n/locale/en/integrations.json index 2094f269b..6c6cecde9 100644 --- a/app/javascript/dashboard/i18n/locale/en/integrations.json +++ b/app/javascript/dashboard/i18n/locale/en/integrations.json @@ -35,7 +35,10 @@ "LIST": { "404": "There are no webhooks configured for this account.", "TITLE": "Manage webhooks", - "TABLE_HEADER": ["Webhook endpoint", "Actions"] + "TABLE_HEADER": [ + "Webhook endpoint", + "Actions" + ] }, "EDIT": { "BUTTON_TEXT": "Edit", @@ -68,7 +71,7 @@ } }, "SLACK": { - "HELP_TEXT" : { + "HELP_TEXT": { "TITLE": "Using Slack Integration", "BODY": "

Chatwoot will now sync all the incoming conversations into the customer-conversations channel inside your slack workplace.

Replying to a conversation thread in customer-conversations slack channel will create a response back to the customer through chatwoot.

Start the replies with note: to create private notes instead of replies.

If the replier on slack has an agent profile in chatwoot under the same email, the replies will be associated accordingly.

When the replier doesn't have an associated agent profile, the replies will be made from the bot profile.

" } @@ -81,6 +84,52 @@ }, "CONNECT": { "BUTTON_TEXT": "Connect" + }, + "DASHBOARD_APPS": { + "TITLE": "Dashboard Apps", + "HEADER_BTN_TXT": "Add a new dashboard app", + "SIDEBAR_TXT": "

Dashboard Apps

Dashboard Apps allow organizations to embed an application inside the Chatwoot dashboard to provide the context for customer support agents. This feature allows you to create an application independently and embed that inside the dashboard to provide user information, their orders, or their previous payment history.

When you embed your application using the dashboard in Chatwoot, your application will get the context of the conversation and contact as a window event. Implement a listener for the message event on your page to receive the context.

To add a new dashboard app, click on the button 'Add a new dashboard app'.

", + "DESCRIPTION": "Dashboard Apps allow organizations to embed an application inside the dashboard to provide the context for customer support agents. This feature allows you to create an application independently and embed that to provide user information, their orders, or their previous payment history.", + "LIST": { + "404": "There are no dashboard apps configured on this account yet", + "LOADING": "Fetching dashboard apps...", + "TABLE_HEADER": [ + "Name", + "Endpoint" + ], + "EDIT_TOOLTIP": "Edit app", + "DELETE_TOOLTIP": "Delete app" + }, + "FORM": { + "TITLE_LABEL": "Name", + "TITLE_PLACEHOLDER": "Enter a name for your dashboard app", + "TITLE_ERROR": "A name for the dashboard app is required", + "URL_LABEL": "Endpoint", + "URL_PLACEHOLDER": "Enter the endpoint URL where your app is hosted", + "URL_ERROR": "A valid URL is required" + }, + "CREATE": { + "HEADER": "Add a new dashboard app", + "FORM_SUBMIT": "Submit", + "FORM_CANCEL": "Cancel", + "API_SUCCESS": "Dashboard app configured successfully", + "API_ERROR": "We couldn't create an app. Please try again later" + }, + "UPDATE": { + "HEADER": "Edit dashboard app", + "FORM_SUBMIT": "Update", + "FORM_CANCEL": "Cancel", + "API_SUCCESS": "Dashboard app updated successfully", + "API_ERROR": "We couldn't update the app. Please try again later" + }, + "DELETE": { + "CONFIRM_YES": "Yes, delete it", + "CONFIRM_NO": "No, keep it", + "TITLE": "Confirm deletion", + "MESSAGE": "Are you sure to delete the app - %{appName}?", + "API_SUCCESS": "Dashboard app deleted successfully", + "API_ERROR": "We couldn't delete the app. Please try again later" + } } } } diff --git a/app/javascript/dashboard/routes/dashboard/settings/integrations/DashboardApps/DashboardAppModal.vue b/app/javascript/dashboard/routes/dashboard/settings/integrations/DashboardApps/DashboardAppModal.vue new file mode 100644 index 000000000..00e99edb8 --- /dev/null +++ b/app/javascript/dashboard/routes/dashboard/settings/integrations/DashboardApps/DashboardAppModal.vue @@ -0,0 +1,174 @@ + + + + + diff --git a/app/javascript/dashboard/routes/dashboard/settings/integrations/DashboardApps/DashboardAppsRow.vue b/app/javascript/dashboard/routes/dashboard/settings/integrations/DashboardApps/DashboardAppsRow.vue new file mode 100644 index 000000000..6b1cce332 --- /dev/null +++ b/app/javascript/dashboard/routes/dashboard/settings/integrations/DashboardApps/DashboardAppsRow.vue @@ -0,0 +1,45 @@ + + + diff --git a/app/javascript/dashboard/routes/dashboard/settings/integrations/DashboardApps/Index.vue b/app/javascript/dashboard/routes/dashboard/settings/integrations/DashboardApps/Index.vue new file mode 100644 index 000000000..ce0b48e3e --- /dev/null +++ b/app/javascript/dashboard/routes/dashboard/settings/integrations/DashboardApps/Index.vue @@ -0,0 +1,158 @@ + + diff --git a/app/javascript/dashboard/routes/dashboard/settings/integrations/Index.vue b/app/javascript/dashboard/routes/dashboard/settings/integrations/Index.vue index 5bfeceac2..c7452067e 100644 --- a/app/javascript/dashboard/routes/dashboard/settings/integrations/Index.vue +++ b/app/javascript/dashboard/routes/dashboard/settings/integrations/Index.vue @@ -17,6 +17,20 @@ :integration-action="item.action" />
+
+ +
diff --git a/app/javascript/dashboard/routes/dashboard/settings/integrations/integrations.routes.js b/app/javascript/dashboard/routes/dashboard/settings/integrations/integrations.routes.js index 4240062e6..211945308 100644 --- a/app/javascript/dashboard/routes/dashboard/settings/integrations/integrations.routes.js +++ b/app/javascript/dashboard/routes/dashboard/settings/integrations/integrations.routes.js @@ -1,6 +1,7 @@ import Index from './Index'; import SettingsContent from '../Wrapper'; import Webhook from './Webhooks/Index'; +import DashboardApps from './DashboardApps/Index'; import ShowIntegration from './ShowIntegration'; import { frontendURL } from '../../../../helper/URLHelper'; @@ -35,6 +36,12 @@ export default { name: 'settings_integrations_webhook', roles: ['administrator'], }, + { + path: 'dashboard-apps', + component: DashboardApps, + name: 'settings_integrations_dashboard_apps', + roles: ['administrator'], + }, { path: ':integration_id', name: 'settings_integrations_integration', diff --git a/app/javascript/dashboard/store/modules/dashboardApps.js b/app/javascript/dashboard/store/modules/dashboardApps.js index fda1f4de4..260b9409a 100644 --- a/app/javascript/dashboard/store/modules/dashboardApps.js +++ b/app/javascript/dashboard/store/modules/dashboardApps.js @@ -32,6 +32,40 @@ export const actions = { commit(types.SET_DASHBOARD_APPS_UI_FLAG, { isFetching: false }); } }, + create: async function createApp({ commit }, appObj) { + commit(types.SET_DASHBOARD_APPS_UI_FLAG, { isCreating: true }); + try { + const response = await DashboardAppsAPI.create(appObj); + commit(types.CREATE_DASHBOARD_APP, response.data); + } catch (error) { + const errorMessage = error?.response?.data?.message; + throw new Error(errorMessage); + } finally { + commit(types.SET_DASHBOARD_APPS_UI_FLAG, { isCreating: false }); + } + }, + update: async function updateApp({ commit }, { id, ...updateObj }) { + commit(types.SET_DASHBOARD_APPS_UI_FLAG, { isUpdating: true }); + try { + const response = await DashboardAppsAPI.update(id, updateObj); + commit(types.EDIT_DASHBOARD_APP, response.data); + } catch (error) { + throw new Error(error); + } finally { + commit(types.SET_DASHBOARD_APPS_UI_FLAG, { isUpdating: false }); + } + }, + delete: async function deleteApp({ commit }, id) { + commit(types.SET_DASHBOARD_APPS_UI_FLAG, { isDeleting: true }); + try { + await DashboardAppsAPI.delete(id); + commit(types.DELETE_DASHBOARD_APP, id); + } catch (error) { + throw new Error(error); + } finally { + commit(types.SET_DASHBOARD_APPS_UI_FLAG, { isDeleting: false }); + } + }, }; export const mutations = { @@ -43,6 +77,9 @@ export const mutations = { }, [types.SET_DASHBOARD_APPS]: MutationHelpers.set, + [types.CREATE_DASHBOARD_APP]: MutationHelpers.create, + [types.EDIT_DASHBOARD_APP]: MutationHelpers.update, + [types.DELETE_DASHBOARD_APP]: MutationHelpers.destroy, }; export default { diff --git a/app/javascript/dashboard/store/modules/specs/dashboardApps/actions.spec.js b/app/javascript/dashboard/store/modules/specs/dashboardApps/actions.spec.js index d24d879bf..0a214108f 100644 --- a/app/javascript/dashboard/store/modules/specs/dashboardApps/actions.spec.js +++ b/app/javascript/dashboard/store/modules/specs/dashboardApps/actions.spec.js @@ -1,7 +1,7 @@ import axios from 'axios'; import { actions } from '../../dashboardApps'; import types from '../../../mutation-types'; - +import { payload, automationsList } from './fixtures'; const commit = jest.fn(); global.axios = axios; jest.mock('axios'); @@ -18,4 +18,68 @@ describe('#actions', () => { ]); }); }); + + describe('#create', () => { + it('sends correct actions if API is success', async () => { + axios.post.mockResolvedValue({ data: payload }); + await actions.create({ commit }, payload); + expect(commit.mock.calls).toEqual([ + [types.SET_DASHBOARD_APPS_UI_FLAG, { isCreating: true }], + [types.CREATE_DASHBOARD_APP, payload], + [types.SET_DASHBOARD_APPS_UI_FLAG, { isCreating: false }], + ]); + }); + it('sends correct actions if API is error', async () => { + axios.post.mockRejectedValue({ message: 'Incorrect header' }); + await expect(actions.create({ commit })).rejects.toThrow(Error); + expect(commit.mock.calls).toEqual([ + [types.SET_DASHBOARD_APPS_UI_FLAG, { isCreating: true }], + [types.SET_DASHBOARD_APPS_UI_FLAG, { isCreating: false }], + ]); + }); + }); + + describe('#update', () => { + it('sends correct actions if API is success', async () => { + axios.patch.mockResolvedValue({ data: automationsList[0] }); + await actions.update({ commit }, automationsList[0]); + expect(commit.mock.calls).toEqual([ + [types.SET_DASHBOARD_APPS_UI_FLAG, { isUpdating: true }], + [types.EDIT_DASHBOARD_APP, automationsList[0]], + [types.SET_DASHBOARD_APPS_UI_FLAG, { isUpdating: false }], + ]); + }); + it('sends correct actions if API is error', async () => { + axios.patch.mockRejectedValue({ message: 'Incorrect header' }); + await expect( + actions.update({ commit }, automationsList[0]) + ).rejects.toThrow(Error); + expect(commit.mock.calls).toEqual([ + [types.SET_DASHBOARD_APPS_UI_FLAG, { isUpdating: true }], + [types.SET_DASHBOARD_APPS_UI_FLAG, { isUpdating: false }], + ]); + }); + }); + + describe('#delete', () => { + it('sends correct actions if API is success', async () => { + axios.delete.mockResolvedValue({ data: automationsList[0] }); + await actions.delete({ commit }, automationsList[0].id); + expect(commit.mock.calls).toEqual([ + [types.SET_DASHBOARD_APPS_UI_FLAG, { isDeleting: true }], + [types.DELETE_DASHBOARD_APP, automationsList[0].id], + [types.SET_DASHBOARD_APPS_UI_FLAG, { isDeleting: false }], + ]); + }); + it('sends correct actions if API is error', async () => { + axios.delete.mockRejectedValue({ message: 'Incorrect header' }); + await expect( + actions.delete({ commit }, automationsList[0].id) + ).rejects.toThrow(Error); + expect(commit.mock.calls).toEqual([ + [types.SET_DASHBOARD_APPS_UI_FLAG, { isDeleting: true }], + [types.SET_DASHBOARD_APPS_UI_FLAG, { isDeleting: false }], + ]); + }); + }); }); diff --git a/app/javascript/dashboard/store/modules/specs/dashboardApps/fixtures.js b/app/javascript/dashboard/store/modules/specs/dashboardApps/fixtures.js new file mode 100644 index 000000000..f6271682e --- /dev/null +++ b/app/javascript/dashboard/store/modules/specs/dashboardApps/fixtures.js @@ -0,0 +1,19 @@ +export const payload = { + title: 'Test', + content: [ + { url: 'https://example.com', type: 'frame' }, + { url: 'https://chatwoot.com', type: 'frame' }, + ], +}; + +export const automationsList = [ + { + id: 15, + title: 'Test', + content: [ + { url: 'https://example.com', type: 'frame' }, + { url: 'https://chatwoot.com', type: 'frame' }, + ], + created_at: '2022-06-27T08:28:29.841Z', + }, +]; diff --git a/app/javascript/dashboard/store/modules/specs/dashboardApps/mutations.spec.js b/app/javascript/dashboard/store/modules/specs/dashboardApps/mutations.spec.js index aaf4da33e..12359fc3d 100644 --- a/app/javascript/dashboard/store/modules/specs/dashboardApps/mutations.spec.js +++ b/app/javascript/dashboard/store/modules/specs/dashboardApps/mutations.spec.js @@ -1,5 +1,6 @@ import types from '../../../mutation-types'; import { mutations } from '../../dashboardApps'; +import { automationsList } from './fixtures'; describe('#mutations', () => { describe('#SET_DASHBOARD_APPS_UI_FLAG', () => { @@ -17,4 +18,31 @@ describe('#mutations', () => { expect(state.records).toEqual([{ title: 'Title 1' }]); }); }); + + describe('#ADD_DASHBOARD_APP', () => { + it('push newly created app to the store', () => { + const state = { records: [automationsList[0]] }; + mutations[types.CREATE_DASHBOARD_APP](state, automationsList[1]); + expect(state.records).toEqual([automationsList[0], automationsList[1]]); + }); + }); + + describe('#EDIT_DASHBOARD_APP', () => { + it('update label record', () => { + const state = { records: [automationsList[0]] }; + mutations[types.EDIT_DASHBOARD_APP](state, { + id: 15, + title: 'updated-title', + }); + expect(state.records[0].title).toEqual('updated-title'); + }); + }); + + describe('#DELETE_DASHBOARD_APP', () => { + it('delete label record', () => { + const state = { records: [automationsList[0]] }; + mutations[types.DELETE_DASHBOARD_APP](state, 15); + expect(state.records).toEqual([]); + }); + }); }); diff --git a/app/javascript/dashboard/store/mutation-types.js b/app/javascript/dashboard/store/mutation-types.js index e20efbf78..40a44c066 100755 --- a/app/javascript/dashboard/store/mutation-types.js +++ b/app/javascript/dashboard/store/mutation-types.js @@ -217,4 +217,7 @@ export default { // Dashboard Apps SET_DASHBOARD_APPS_UI_FLAG: 'SET_DASHBOARD_APPS_UI_FLAG', SET_DASHBOARD_APPS: 'SET_DASHBOARD_APPS', + CREATE_DASHBOARD_APP: 'CREATE_DASHBOARD_APP', + EDIT_DASHBOARD_APP: 'EDIT_DASHBOARD_APP', + DELETE_DASHBOARD_APP: 'DELETE_DASHBOARD_APP', }; diff --git a/public/dashboard/images/integrations/cable.svg b/public/dashboard/images/integrations/cable.svg index 2a9f7008d..b39742a29 100644 --- a/public/dashboard/images/integrations/cable.svg +++ b/public/dashboard/images/integrations/cable.svg @@ -1,64 +1,39 @@ - - - - - - - + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + diff --git a/public/dashboard/images/integrations/dashboard-apps.svg b/public/dashboard/images/integrations/dashboard-apps.svg new file mode 100644 index 000000000..76e165588 --- /dev/null +++ b/public/dashboard/images/integrations/dashboard-apps.svg @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 19c637eb33a41f78320aacb3b53e12a8dd249d49 Mon Sep 17 00:00:00 2001 From: "Aswin Dev P.S" Date: Fri, 8 Jul 2022 15:09:06 +0530 Subject: [PATCH 42/70] chore: Fix sentry issues (#4940) Fixes: #4810 --- app/jobs/inboxes/fetch_imap_emails_job.rb | 4 +++- app/mailboxes/mailbox_helper.rb | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/app/jobs/inboxes/fetch_imap_emails_job.rb b/app/jobs/inboxes/fetch_imap_emails_job.rb index 2b77d068c..6a30562e8 100644 --- a/app/jobs/inboxes/fetch_imap_emails_job.rb +++ b/app/jobs/inboxes/fetch_imap_emails_job.rb @@ -9,8 +9,10 @@ class Inboxes::FetchImapEmailsJob < ApplicationJob fetch_mail_for_channel(channel) # clearing old failures like timeouts since the mail is now successfully processed channel.reauthorized! - rescue Errno::ECONNREFUSED, Net::OpenTimeout, Net::IMAP::NoResponseError + rescue Errno::ECONNREFUSED, Net::OpenTimeout, Net::IMAP::NoResponseError, Errno::ECONNRESET, Errno::ENETUNREACH, Net::IMAP::ByeResponseError channel.authorization_error! + rescue EOFError => e + Rails.logger.error e rescue StandardError => e ChatwootExceptionTracker.new(e, account: channel.account).capture_exception end diff --git a/app/mailboxes/mailbox_helper.rb b/app/mailboxes/mailbox_helper.rb index 6aaf4fde3..f0abc0eba 100644 --- a/app/mailboxes/mailbox_helper.rb +++ b/app/mailboxes/mailbox_helper.rb @@ -35,7 +35,7 @@ module MailboxHelper def create_contact @contact_inbox = ::ContactBuilder.new( - source_id: "email:#{processed_mail.message_id}", + source_id: processed_mail.original_sender, inbox: @inbox, contact_attributes: { name: identify_contact_name, From 13a4e0e6d99cecb977d89b4e24f4127b0f0d48f1 Mon Sep 17 00:00:00 2001 From: "Aswin Dev P.S" Date: Fri, 8 Jul 2022 16:43:24 +0530 Subject: [PATCH 43/70] chore: Email improvements. (#4901) * Update email processing logic. * Fix sentry issues --- app/jobs/inboxes/fetch_imap_emails_job.rb | 9 +---- config/schedule.yml | 2 +- .../inboxes/fetch_imap_emails_job_spec.rb | 38 ++++++++++++++----- 3 files changed, 31 insertions(+), 18 deletions(-) diff --git a/app/jobs/inboxes/fetch_imap_emails_job.rb b/app/jobs/inboxes/fetch_imap_emails_job.rb index 6a30562e8..9f69f32d7 100644 --- a/app/jobs/inboxes/fetch_imap_emails_job.rb +++ b/app/jobs/inboxes/fetch_imap_emails_job.rb @@ -34,16 +34,11 @@ class Inboxes::FetchImapEmailsJob < ApplicationJob enable_ssl: channel.imap_enable_ssl end - new_mails = false - - Mail.find(what: :last, count: 10, order: :desc).each do |inbound_mail| - next unless inbound_mail.date.utc >= channel.imap_inbox_synced_at + Mail.find(what: :last, count: 10, order: :asc).each do |inbound_mail| + next if channel.inbox.messages.find_by(source_id: inbound_mail.message_id).present? process_mail(inbound_mail, channel) - new_mails = true end - - channel.update(imap_inbox_synced_at: Time.now.utc) if new_mails end def process_mail(inbound_mail, channel) diff --git a/config/schedule.yml b/config/schedule.yml index 156a19787..94aca4896 100644 --- a/config/schedule.yml +++ b/config/schedule.yml @@ -16,6 +16,6 @@ trigger_scheduled_items_job: # executed At every 5th minute.. trigger_imap_email_inboxes_job: - cron: '*/5 * * * *' + cron: '*/1 * * * *' class: 'Inboxes::FetchImapEmailInboxesJob' queue: scheduled_jobs diff --git a/spec/jobs/inboxes/fetch_imap_emails_job_spec.rb b/spec/jobs/inboxes/fetch_imap_emails_job_spec.rb index e61198bed..dfdf1783a 100644 --- a/spec/jobs/inboxes/fetch_imap_emails_job_spec.rb +++ b/spec/jobs/inboxes/fetch_imap_emails_job_spec.rb @@ -4,34 +4,52 @@ RSpec.describe Inboxes::FetchImapEmailsJob, type: :job do let(:account) { create(:account) } let(:imap_email_channel) do create(:channel_email, imap_enabled: true, imap_address: 'imap.gmail.com', imap_port: 993, imap_login: 'imap@gmail.com', - imap_password: 'password', imap_inbox_synced_at: Time.now.utc - 10, account: account) + imap_password: 'password', imap_inbox_synced_at: Time.now.utc, account: account) end - let(:email_inbox) { create(:inbox, channel: imap_email_channel, account: account) } + let!(:conversation) { create(:conversation, inbox: imap_email_channel.inbox, account: account) } it 'enqueues the job' do expect { described_class.perform_later }.to have_enqueued_job(described_class) .on_queue('low') end - context 'when imap fetch latest 10 emails' do - it 'check for the new emails' do - mail_date = Time.now.utc - mail = Mail.new do + context 'when imap fetch new emails' do + it 'process the email' do + email = Mail.new do to 'test@outlook.com' from 'test@gmail.com' subject :test.to_s body 'hello' - date mail_date end - allow(Mail).to receive(:find).and_return([mail]) + allow(Mail).to receive(:find).and_return([email]) imap_mailbox = double allow(Imap::ImapMailbox).to receive(:new).and_return(imap_mailbox) - expect(imap_mailbox).to receive(:process).with(mail, imap_email_channel).once + expect(imap_mailbox).to receive(:process).with(email, imap_email_channel).once described_class.perform_now(imap_email_channel) + end + end - expect(imap_email_channel.reload.imap_inbox_synced_at).to be > mail_date + context 'when imap fetch existing emails' do + it 'does not process the email' do + email = Mail.new do + to 'test@outlook.com' + from 'test@gmail.com' + subject :test.to_s + body 'hello' + message_id '' + end + + create(:message, message_type: 'incoming', source_id: email.message_id, account: account, inbox: imap_email_channel.inbox, + conversation: conversation) + + allow(Mail).to receive(:find).and_return([email]) + imap_mailbox = double + allow(Imap::ImapMailbox).to receive(:new).and_return(imap_mailbox) + expect(imap_mailbox).not_to receive(:process).with(email, imap_email_channel) + + described_class.perform_now(imap_email_channel) end end end From fdf449dc873d2dbb68c8119acbce9a6887c3c365 Mon Sep 17 00:00:00 2001 From: Tejaswini Chile Date: Fri, 8 Jul 2022 17:24:38 +0530 Subject: [PATCH 44/70] Feat: Article public apis (#4955) --- .../api/v1/accounts/articles_controller.rb | 2 +- .../api/v1/accounts/categories_controller.rb | 2 +- .../api/v1/portals/articles_controller.rb | 25 +++++++++ app/models/article.rb | 2 +- app/models/category.rb | 40 +++++++------ .../categories/_category.json.jbuilder | 6 +- .../api/v1/models/_article.json.jbuilder | 30 ++++++++++ .../models/_associated_article.json.jbuilder | 15 +++++ .../api/v1/models/_category.json.jbuilder | 6 +- .../v1/portals/articles/index.json.jbuilder | 3 + .../v1/portals/articles/show.json.jbuilder | 1 + config/routes.rb | 5 +- ...5458_rename_linked_category_column_name.rb | 5 ++ db/schema.rb | 8 +-- .../v1/accounts/articles_controller_spec.rb | 17 ++++++ .../v1/accounts/categories_controller_spec.rb | 16 +++--- .../v1/portals/articles_controller_spec.rb | 56 +++++++++++++++++++ spec/models/article_spec.rb | 10 ++-- spec/models/category_spec.rb | 2 +- 19 files changed, 205 insertions(+), 46 deletions(-) create mode 100644 app/controllers/public/api/v1/portals/articles_controller.rb create mode 100644 app/views/public/api/v1/models/_article.json.jbuilder create mode 100644 app/views/public/api/v1/models/_associated_article.json.jbuilder create mode 100644 app/views/public/api/v1/portals/articles/index.json.jbuilder create mode 100644 app/views/public/api/v1/portals/articles/show.json.jbuilder create mode 100644 db/migrate/20220706085458_rename_linked_category_column_name.rb create mode 100644 spec/controllers/public/api/v1/portals/articles_controller_spec.rb diff --git a/app/controllers/api/v1/accounts/articles_controller.rb b/app/controllers/api/v1/accounts/articles_controller.rb index 249352e18..77a1fdf65 100644 --- a/app/controllers/api/v1/accounts/articles_controller.rb +++ b/app/controllers/api/v1/accounts/articles_controller.rb @@ -5,7 +5,7 @@ class Api::V1::Accounts::ArticlesController < Api::V1::Accounts::BaseController def index @articles = @portal.articles - @articles.search(list_params) if params[:payload].present? + @articles = @articles.search(list_params) if params[:payload].present? end def create diff --git a/app/controllers/api/v1/accounts/categories_controller.rb b/app/controllers/api/v1/accounts/categories_controller.rb index f242d3385..c4491b2e2 100644 --- a/app/controllers/api/v1/accounts/categories_controller.rb +++ b/app/controllers/api/v1/accounts/categories_controller.rb @@ -46,7 +46,7 @@ class Api::V1::Accounts::CategoriesController < Api::V1::Accounts::BaseControlle def category_params params.require(:category).permit( - :name, :description, :position, :slug, :locale, :parent_category_id, :linked_category_id + :name, :description, :position, :slug, :locale, :parent_category_id, :associated_category_id ) end end diff --git a/app/controllers/public/api/v1/portals/articles_controller.rb b/app/controllers/public/api/v1/portals/articles_controller.rb new file mode 100644 index 000000000..2a961b7a9 --- /dev/null +++ b/app/controllers/public/api/v1/portals/articles_controller.rb @@ -0,0 +1,25 @@ +class Public::Api::V1::Portals::ArticlesController < ApplicationController + before_action :set_portal + before_action :set_article, only: [:show] + + def index + @articles = @portal.articles + @articles = @articles.search(list_params) if params[:payload].present? + end + + def show; end + + private + + def set_article + @article = @portal.articles.find(params[:id]) + end + + def set_portal + @portal = ::Portal.find_by!(slug: params[:portal_slug], archived: false) + end + + def list_params + params.require(:payload).permit(:query) + end +end diff --git a/app/models/article.rb b/app/models/article.rb index 65482957e..7cf4ebd41 100644 --- a/app/models/article.rb +++ b/app/models/article.rb @@ -77,7 +77,7 @@ class Article < ApplicationRecord records = joins( :category ).search_by_category_slug(params[:category_slug]).search_by_category_locale(params[:locale]) - records.text_search(params[:query]) if params[:query].present? + records = records.text_search(params[:query]) if params[:query].present? records.page(current_page(params)) end diff --git a/app/models/category.rb b/app/models/category.rb index 6e9b30ae0..a3955ae91 100644 --- a/app/models/category.rb +++ b/app/models/category.rb @@ -2,22 +2,22 @@ # # Table name: categories # -# id :bigint not null, primary key -# description :text -# locale :string default("en") -# name :string -# position :integer -# slug :string not null -# created_at :datetime not null -# updated_at :datetime not null -# account_id :integer not null -# linked_category_id :bigint -# parent_category_id :bigint -# portal_id :integer not null +# id :bigint not null, primary key +# description :text +# locale :string default("en") +# name :string +# position :integer +# slug :string not null +# created_at :datetime not null +# updated_at :datetime not null +# account_id :integer not null +# associated_category_id :bigint +# parent_category_id :bigint +# portal_id :integer not null # # Indexes # -# index_categories_on_linked_category_id (linked_category_id) +# index_categories_on_associated_category_id (associated_category_id) # index_categories_on_locale (locale) # index_categories_on_locale_and_account_id (locale,account_id) # index_categories_on_parent_category_id (parent_category_id) @@ -25,7 +25,7 @@ # # Foreign Keys # -# fk_rails_... (linked_category_id => categories.id) +# fk_rails_... (associated_category_id => categories.id) # fk_rails_... (parent_category_id => categories.id) # class Category < ApplicationRecord @@ -45,13 +45,17 @@ class Category < ApplicationRecord foreign_key: :parent_category_id, dependent: :nullify, inverse_of: 'parent_category' - has_many :linked_categories, + has_many :associated_categories, class_name: :Category, - foreign_key: :linked_category_id, + foreign_key: :associated_category_id, dependent: :nullify, - inverse_of: 'linked_category' + inverse_of: 'root_category' belongs_to :parent_category, class_name: :Category, optional: true - belongs_to :linked_category, class_name: :Category, optional: true + belongs_to :root_category, + class_name: :Category, + foreign_key: :associated_category_id, + inverse_of: :associated_categories, + optional: true before_validation :ensure_account_id validates :account_id, presence: true diff --git a/app/views/api/v1/accounts/categories/_category.json.jbuilder b/app/views/api/v1/accounts/categories/_category.json.jbuilder index d299a50d0..2e4263722 100644 --- a/app/views/api/v1/accounts/categories/_category.json.jbuilder +++ b/app/views/api/v1/accounts/categories/_category.json.jbuilder @@ -20,8 +20,8 @@ if category.parent_category.present? end end -if category.linked_category.present? - json.linked_category do - json.partial! 'api/v1/accounts/categories/associated_category.json.jbuilder', category: category.linked_category +if category.root_category.present? + json.root_category do + json.partial! 'api/v1/accounts/categories/associated_category.json.jbuilder', category: category.root_category end end diff --git a/app/views/public/api/v1/models/_article.json.jbuilder b/app/views/public/api/v1/models/_article.json.jbuilder new file mode 100644 index 000000000..80b254a8a --- /dev/null +++ b/app/views/public/api/v1/models/_article.json.jbuilder @@ -0,0 +1,30 @@ +json.id article.id +json.category_id article.category_id +json.title article.title +json.content article.content +json.description article.description +json.status article.status +json.account_id article.account_id +json.last_updated_at article.updated_at + +if article.portal.present? + json.portal do + json.partial! 'api/v1/accounts/portals/portal.json.jbuilder', portal: article.portal + end +end + +json.views article.views + +if article.author.present? + json.author do + json.partial! 'api/v1/models/agent.json.jbuilder', resource: article.author + end +end + +json.associated_articles do + if article.associated_articles.any? + json.array! article.associated_articles.each do |associated_article| + json.partial! 'api/v1/accounts/articles/associated_article.json.jbuilder', article: associated_article + end + end +end diff --git a/app/views/public/api/v1/models/_associated_article.json.jbuilder b/app/views/public/api/v1/models/_associated_article.json.jbuilder new file mode 100644 index 000000000..02b4dd4db --- /dev/null +++ b/app/views/public/api/v1/models/_associated_article.json.jbuilder @@ -0,0 +1,15 @@ +json.id article.id +json.category_id article.category_id +json.title article.title +json.content article.content +json.description article.description +json.status article.status +json.account_id article.account_id +json.last_updated_at article.updated_at +json.views article.views + +if article.author.present? + json.author do + json.partial! 'api/v1/models/agent.json.jbuilder', resource: article.author + end +end diff --git a/app/views/public/api/v1/models/_category.json.jbuilder b/app/views/public/api/v1/models/_category.json.jbuilder index c79febc63..ee3057ae3 100644 --- a/app/views/public/api/v1/models/_category.json.jbuilder +++ b/app/views/public/api/v1/models/_category.json.jbuilder @@ -18,8 +18,8 @@ if category.parent_category.present? end end -if category.linked_category.present? - json.linked_category do - json.partial! partial: 'associated_category', category: category.linked_category +if category.root_category.present? + json.root_category do + json.partial! partial: 'associated_category', category: category.root_category end end diff --git a/app/views/public/api/v1/portals/articles/index.json.jbuilder b/app/views/public/api/v1/portals/articles/index.json.jbuilder new file mode 100644 index 000000000..477662a36 --- /dev/null +++ b/app/views/public/api/v1/portals/articles/index.json.jbuilder @@ -0,0 +1,3 @@ +json.payload do + json.array! @articles, partial: 'public/api/v1/models/article.json.jbuilder', as: :article +end diff --git a/app/views/public/api/v1/portals/articles/show.json.jbuilder b/app/views/public/api/v1/portals/articles/show.json.jbuilder new file mode 100644 index 000000000..16444b425 --- /dev/null +++ b/app/views/public/api/v1/portals/articles/show.json.jbuilder @@ -0,0 +1 @@ +json.partial! 'public/api/v1/models/article.json.jbuilder', article: @article diff --git a/config/routes.rb b/config/routes.rb index 37e435adb..4ff36aba8 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -260,9 +260,8 @@ Rails.application.routes.draw do end resources :portals, only: [:show], param: :slug do scope module: :portals do - resources :categories, only: [:index, :show], param: :slug do - resources :articles, only: [:index, :show], param: :slug - end + resources :categories, only: [:index, :show], param: :slug + resources :articles, only: [:index, :show] end end resources :csat_survey, only: [:show, :update] diff --git a/db/migrate/20220706085458_rename_linked_category_column_name.rb b/db/migrate/20220706085458_rename_linked_category_column_name.rb new file mode 100644 index 000000000..295b70c31 --- /dev/null +++ b/db/migrate/20220706085458_rename_linked_category_column_name.rb @@ -0,0 +1,5 @@ +class RenameLinkedCategoryColumnName < ActiveRecord::Migration[6.1] + def change + rename_column :categories, :linked_category_id, :associated_category_id + end +end diff --git a/db/schema.rb b/db/schema.rb index 811c9d460..a68d81b96 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2022_06_28_124837) do +ActiveRecord::Schema.define(version: 2022_07_06_085458) do # These are extensions that must be enabled in order to support this database enable_extension "pg_stat_statements" @@ -200,8 +200,8 @@ ActiveRecord::Schema.define(version: 2022_06_28_124837) do t.string "locale", default: "en" t.string "slug", null: false t.bigint "parent_category_id" - t.bigint "linked_category_id" - t.index ["linked_category_id"], name: "index_categories_on_linked_category_id" + t.bigint "associated_category_id" + t.index ["associated_category_id"], name: "index_categories_on_associated_category_id" t.index ["locale", "account_id"], name: "index_categories_on_locale_and_account_id" t.index ["locale"], name: "index_categories_on_locale" t.index ["parent_category_id"], name: "index_categories_on_parent_category_id" @@ -851,7 +851,7 @@ ActiveRecord::Schema.define(version: 2022_06_28_124837) do add_foreign_key "articles", "users", column: "author_id" add_foreign_key "campaigns", "accounts", on_delete: :cascade add_foreign_key "campaigns", "inboxes", on_delete: :cascade - add_foreign_key "categories", "categories", column: "linked_category_id" + add_foreign_key "categories", "categories", column: "associated_category_id" add_foreign_key "categories", "categories", column: "parent_category_id" add_foreign_key "contact_inboxes", "contacts", on_delete: :cascade add_foreign_key "contact_inboxes", "inboxes", on_delete: :cascade diff --git a/spec/controllers/api/v1/accounts/articles_controller_spec.rb b/spec/controllers/api/v1/accounts/articles_controller_spec.rb index 807def183..976cebc0d 100644 --- a/spec/controllers/api/v1/accounts/articles_controller_spec.rb +++ b/spec/controllers/api/v1/accounts/articles_controller_spec.rb @@ -174,6 +174,23 @@ RSpec.describe 'Api::V1::Accounts::Articles', type: :request do json_response = JSON.parse(response.body) expect(json_response['payload'].count).to be 2 end + + it 'get all articles with searched text query' do + article2 = create(:article, + account_id: account.id, + portal: portal, + category: category, + author_id: agent.id, + content: 'this is some test and funny content') + expect(article2.id).not_to be nil + + get "/api/v1/accounts/#{account.id}/portals/#{portal.slug}/articles", + headers: agent.create_new_auth_token, + params: { payload: { query: 'funny' } } + expect(response).to have_http_status(:success) + json_response = JSON.parse(response.body) + expect(json_response['payload'].count).to be 1 + end end describe 'GET /api/v1/accounts/{account.id}/portals/{portal.slug}/articles/{article.id}' do diff --git a/spec/controllers/api/v1/accounts/categories_controller_spec.rb b/spec/controllers/api/v1/accounts/categories_controller_spec.rb index b5e2e5434..91992c7c8 100644 --- a/spec/controllers/api/v1/accounts/categories_controller_spec.rb +++ b/spec/controllers/api/v1/accounts/categories_controller_spec.rb @@ -5,7 +5,9 @@ RSpec.describe 'Api::V1::Accounts::Categories', type: :request do let(:agent) { create(:user, account: account, role: :agent) } let!(:portal) { create(:portal, name: 'test_portal', account_id: account.id) } let!(:category) { create(:category, name: 'category', portal: portal, account_id: account.id, slug: 'category_slug') } - let!(:category_to_link) { create(:category, name: 'linked category', portal: portal, account_id: account.id, slug: 'linked_category_slug') } + let!(:category_to_associate) do + create(:category, name: 'associated category', portal: portal, account_id: account.id, slug: 'associated_category_slug') + end let!(:related_category_1) { create(:category, name: 'related category 1', portal: portal, account_id: account.id, slug: 'category_slug_1') } let!(:related_category_2) { create(:category, name: 'related category 2', portal: portal, account_id: account.id, slug: 'category_slug_2') } @@ -29,7 +31,7 @@ RSpec.describe 'Api::V1::Accounts::Categories', type: :request do locale: 'es', slug: 'test_category_1', parent_category_id: category.id, - linked_category_id: category_to_link.id, + associated_category_id: category_to_associate.id, related_category_ids: [related_category_1.id, related_category_2.id] } } @@ -44,7 +46,7 @@ RSpec.describe 'Api::V1::Accounts::Categories', type: :request do locale: 'es', slug: 'test_category_2', parent_category_id: category.id, - linked_category_id: category_to_link.id, + associated_category_id: category_to_associate.id, related_category_ids: [related_category_1.id, related_category_2.id] } } @@ -61,9 +63,9 @@ RSpec.describe 'Api::V1::Accounts::Categories', type: :request do expect(json_response['payload']['related_categories'][0]['id']).to eql(related_category_1.id) expect(json_response['payload']['related_categories'][1]['id']).to eql(related_category_2.id) expect(json_response['payload']['parent_category']['id']).to eql(category.id) - expect(json_response['payload']['linked_category']['id']).to eql(category_to_link.id) + expect(json_response['payload']['root_category']['id']).to eql(category_to_associate.id) expect(category.reload.sub_category_ids).to eql([Category.last.id]) - expect(category_to_link.reload.linked_category_ids).to eql([Category.last.id]) + expect(category_to_associate.reload.associated_category_ids).to eql([Category.last.id]) end it 'creates multiple sub_categories under one parent_category' do @@ -79,7 +81,7 @@ RSpec.describe 'Api::V1::Accounts::Categories', type: :request do expect(category.reload.sub_category_ids).to eql(Category.last(2).pluck(:id)) end - it 'creates multiple linked_categories with one category' do + it 'creates multiple associated_categories with one category' do post "/api/v1/accounts/#{account.id}/portals/#{portal.slug}/categories", params: category_params, headers: agent.create_new_auth_token @@ -89,7 +91,7 @@ RSpec.describe 'Api::V1::Accounts::Categories', type: :request do headers: agent.create_new_auth_token expect(response).to have_http_status(:success) - expect(category_to_link.reload.linked_category_ids).to eql(Category.last(2).pluck(:id)) + expect(category_to_associate.reload.associated_category_ids).to eql(Category.last(2).pluck(:id)) end it 'will throw an error on locale, category_id uniqueness' do diff --git a/spec/controllers/public/api/v1/portals/articles_controller_spec.rb b/spec/controllers/public/api/v1/portals/articles_controller_spec.rb new file mode 100644 index 000000000..894a5e995 --- /dev/null +++ b/spec/controllers/public/api/v1/portals/articles_controller_spec.rb @@ -0,0 +1,56 @@ +require 'rails_helper' + +RSpec.describe 'Public Articles API', type: :request do + let!(:account) { create(:account) } + let(:agent) { create(:user, account: account, role: :agent) } + let!(:portal) { create(:portal, slug: 'test-portal') } + let!(:category) { create(:category, name: 'category', portal: portal, account_id: account.id, locale: 'en', slug: 'category_slug') } + let!(:category_2) { create(:category, name: 'category', portal: portal, account_id: account.id, locale: 'es', slug: 'category_2_slug') } + let!(:article) { create(:article, category: category, portal: portal, account_id: account.id, author_id: agent.id) } + + before do + create(:article, category: category, portal: portal, account_id: account.id, author_id: agent.id) + create(:article, category: category, portal: portal, account_id: account.id, author_id: agent.id, associated_article_id: article.id) + create(:article, category: category_2, portal: portal, account_id: account.id, author_id: agent.id, associated_article_id: article.id) + create(:article, category: category_2, portal: portal, account_id: account.id, author_id: agent.id) + end + + describe 'GET /public/api/v1/portals/:portal_slug/articles' do + it 'Fetch all articles in the portal' do + get "/public/api/v1/portals/#{portal.slug}/articles" + + expect(response).to have_http_status(:success) + json_response = JSON.parse(response.body) + + expect(json_response['payload'].length).to eql portal.articles.count + end + + it 'get all articles with searched text query' do + article2 = create(:article, + account_id: account.id, + portal: portal, + category: category, + author_id: agent.id, + content: 'this is some test and funny content') + expect(article2.id).not_to be nil + + get "/public/api/v1/portals/#{portal.slug}/articles", + headers: agent.create_new_auth_token, + params: { payload: { query: 'funny' } } + expect(response).to have_http_status(:success) + json_response = JSON.parse(response.body) + expect(json_response['payload'].count).to be 1 + end + end + + describe 'GET /public/api/v1/portals/:portal_slug/articles/:id' do + it 'Fetch article with the id' do + get "/public/api/v1/portals/#{portal.slug}/articles/#{article.id}" + + expect(response).to have_http_status(:success) + json_response = JSON.parse(response.body) + + expect(json_response['title']).to eql article.title + end + end +end diff --git a/spec/models/article_spec.rb b/spec/models/article_spec.rb index 90e69b384..f018e277d 100644 --- a/spec/models/article_spec.rb +++ b/spec/models/article_spec.rb @@ -27,7 +27,7 @@ RSpec.describe Article, type: :model do before do create(:article, category_id: category_1.id, content: 'This is the content', description: 'this is the description', title: 'this is title', portal_id: portal_1.id, author_id: user.id) - create(:article, category_id: category_1.id, title: 'title 1', portal_id: portal_1.id, author_id: user.id) + create(:article, category_id: category_1.id, title: 'title 1', content: 'This is the content', portal_id: portal_1.id, author_id: user.id) create(:article, category_id: category_2.id, title: 'title 2', portal_id: portal_2.id, author_id: user.id) create(:article, category_id: category_2.id, title: 'title 3', portal_id: portal_1.id, author_id: user.id) create(:article, category_id: category_3.id, title: 'title 6', portal_id: portal_2.id, author_id: user.id) @@ -76,6 +76,7 @@ RSpec.describe Article, type: :model do it 'returns data with text_search query' do params = { query: 'title' } records = portal_2.articles.search(params) + expect(records.count).to eq(2) params = { query: 'title' } @@ -84,12 +85,13 @@ RSpec.describe Article, type: :model do expect(records.count).to eq(4) params = { query: 'the content' } - records = portal_2.articles.search(params) + records = portal_1.articles.search(params) + expect(records.count).to eq(2) end it 'returns data with text_search query and locale' do - params = { query: 'the title', locale: 'es' } + params = { query: 'title', locale: 'es' } records = portal_2.articles.search(params) expect(records.count).to eq(2) end @@ -101,7 +103,7 @@ RSpec.describe Article, type: :model do end it 'return records with category_slug and text_search query' do - params = { category_slug: 'category_2', query: 'the title' } + params = { category_slug: 'category_2', query: 'title' } records = portal_1.articles.search(params) expect(records.count).to eq(2) end diff --git a/spec/models/category_spec.rb b/spec/models/category_spec.rb index 565abba8c..fd3da0778 100644 --- a/spec/models/category_spec.rb +++ b/spec/models/category_spec.rb @@ -11,7 +11,7 @@ RSpec.describe Category, type: :model do it { is_expected.to belong_to(:portal) } it { is_expected.to have_many(:articles) } it { is_expected.to have_many(:sub_categories) } - it { is_expected.to have_many(:linked_categories) } + it { is_expected.to have_many(:associated_categories) } it { is_expected.to have_many(:related_categories) } end From 49d08a677301050c7ae00a87d5a56154baf1c9c5 Mon Sep 17 00:00:00 2001 From: Jordan Brough Date: Fri, 8 Jul 2022 06:50:07 -0600 Subject: [PATCH 45/70] feat: Support Twilio Messaging Services (#4242) This allows sending and receiving from multiple phone numbers using Twilio messaging services Fixes: #4204 --- Gemfile | 2 +- Gemfile.lock | 6 +- .../channels/twilio_channels_controller.rb | 3 +- app/controllers/twilio/callback_controller.rb | 5 +- app/javascript/dashboard/helper/inbox.js | 2 +- .../dashboard/i18n/locale/en/inboxMgmt.json | 6 ++ .../dashboard/settings/inbox/Settings.vue | 6 +- .../settings/inbox/channels/Twilio.vue | 78 ++++++++++++++++-- app/models/channel/twilio_sms.rb | 48 ++++++++--- .../twilio/incoming_message_service.rb | 7 +- .../twilio/oneoff_sms_campaign_service.rb | 10 +-- app/services/twilio/send_on_twilio_service.rb | 14 +--- app/services/twilio/webhook_setup_service.rb | 26 +++++- app/views/api/v1/models/_inbox.json.jbuilder | 1 + ...aging_service_sid_to_channel_twilio_sms.rb | 7 ++ db/schema.rb | 6 +- .../twilio_channels_controller_spec.rb | 33 +++++++- spec/factories/channel/twilio_sms.rb | 7 +- spec/models/channel/twilio_sms_spec.rb | 75 ++++++++++++++--- .../twilio/incoming_message_service_spec.rb | 39 ++++++++- .../oneoff_sms_campaign_service_spec.rb | 21 +++-- .../twilio/webhook_setup_service_spec.rb | 82 +++++++++++++------ 22 files changed, 379 insertions(+), 105 deletions(-) create mode 100644 db/migrate/20220317171031_add_messaging_service_sid_to_channel_twilio_sms.rb diff --git a/Gemfile b/Gemfile index 9029ccbcb..937f0bd60 100644 --- a/Gemfile +++ b/Gemfile @@ -78,7 +78,7 @@ gem 'wisper', '2.0.0' # TODO: bump up gem to 2.0 gem 'facebook-messenger' gem 'line-bot-api' -gem 'twilio-ruby', '~> 5.32.0' +gem 'twilio-ruby', '~> 5.66' # twitty will handle subscription of twitter account events # gem 'twitty', git: 'https://github.com/chatwoot/twitty' gem 'twitty' diff --git a/Gemfile.lock b/Gemfile.lock index f19ff70fa..fa8f9d9f0 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -582,8 +582,8 @@ GEM activesupport i18n trailblazer-option (0.1.2) - twilio-ruby (5.32.0) - faraday (~> 1.0.0) + twilio-ruby (5.66.0) + faraday (>= 0.9, < 2.0) jwt (>= 1.5, <= 2.5) nokogiri (>= 1.6, < 2.0) twitty (0.1.4) @@ -730,7 +730,7 @@ DEPENDENCIES squasher telephone_number time_diff - twilio-ruby (~> 5.32.0) + twilio-ruby (~> 5.66) twitty tzinfo-data uglifier diff --git a/app/controllers/api/v1/accounts/channels/twilio_channels_controller.rb b/app/controllers/api/v1/accounts/channels/twilio_channels_controller.rb index f5a3c6a6d..24a8ba7eb 100644 --- a/app/controllers/api/v1/accounts/channels/twilio_channels_controller.rb +++ b/app/controllers/api/v1/accounts/channels/twilio_channels_controller.rb @@ -38,6 +38,7 @@ class Api::V1::Accounts::Channels::TwilioChannelsController < Api::V1::Accounts: @twilio_channel = Current.account.twilio_sms.create!( account_sid: permitted_params[:account_sid], auth_token: permitted_params[:auth_token], + messaging_service_sid: permitted_params[:messaging_service_sid], phone_number: phone_number, medium: medium ) @@ -49,7 +50,7 @@ class Api::V1::Accounts::Channels::TwilioChannelsController < Api::V1::Accounts: def permitted_params params.require(:twilio_channel).permit( - :account_id, :phone_number, :account_sid, :auth_token, :name, :medium + :account_id, :messaging_service_sid, :phone_number, :account_sid, :auth_token, :name, :medium ) end end diff --git a/app/controllers/twilio/callback_controller.rb b/app/controllers/twilio/callback_controller.rb index 44dcc9b6f..7723e5dd2 100644 --- a/app/controllers/twilio/callback_controller.rb +++ b/app/controllers/twilio/callback_controller.rb @@ -7,7 +7,7 @@ class Twilio::CallbackController < ApplicationController private - def permitted_params + def permitted_params # rubocop:disable Metrics/MethodLength params.permit( :ApiVersion, :SmsSid, @@ -25,7 +25,8 @@ class Twilio::CallbackController < ApplicationController :ToCountry, :FromState, :MediaUrl0, - :MediaContentType0 + :MediaContentType0, + :MessagingServiceSid ) end end diff --git a/app/javascript/dashboard/helper/inbox.js b/app/javascript/dashboard/helper/inbox.js index 3f0eedbda..e2ff2ec41 100644 --- a/app/javascript/dashboard/helper/inbox.js +++ b/app/javascript/dashboard/helper/inbox.js @@ -12,7 +12,7 @@ export const getInboxClassByType = (type, phoneNumber) => { return 'brand-twitter'; case INBOX_TYPES.TWILIO: - return phoneNumber.startsWith('whatsapp') + return phoneNumber?.startsWith('whatsapp') ? 'brand-whatsapp' : 'brand-sms'; diff --git a/app/javascript/dashboard/i18n/locale/en/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/en/inboxMgmt.json index f0ff2c2fe..2b8005e1d 100644 --- a/app/javascript/dashboard/i18n/locale/en/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/en/inboxMgmt.json @@ -111,6 +111,12 @@ "PLACEHOLDER": "Please enter your Twilio Account SID", "ERROR": "This field is required" }, + "MESSAGING_SERVICE_SID": { + "LABEL": "Messaging Service SID", + "PLACEHOLDER": "Please enter your Twilio Messaging Service SID", + "ERROR": "This field is required", + "USE_MESSAGING_SERVICE": "Use a Twilio Messaging Service" + }, "CHANNEL_TYPE": { "LABEL": "Channel Type", "ERROR": "Please select your Channel Type" diff --git a/app/javascript/dashboard/routes/dashboard/settings/inbox/Settings.vue b/app/javascript/dashboard/routes/dashboard/settings/inbox/Settings.vue index b73289b8d..d9d05877a 100644 --- a/app/javascript/dashboard/routes/dashboard/settings/inbox/Settings.vue +++ b/app/javascript/dashboard/routes/dashboard/settings/inbox/Settings.vue @@ -438,7 +438,11 @@ export default { return this.$store.getters['inboxes/getInbox'](this.currentInboxId); }, inboxName() { - if (this.isATwilioSMSChannel || this.isAWhatsappChannel) { + if (this.isATwilioSMSChannel || this.isATwilioWhatsappChannel) { + return `${this.inbox.name} (${this.inbox.messaging_service_sid || + this.inbox.phone_number})`; + } + if (this.isAWhatsappChannel) { return `${this.inbox.name} (${this.inbox.phone_number})`; } if (this.isAnEmailChannel) { diff --git a/app/javascript/dashboard/routes/dashboard/settings/inbox/channels/Twilio.vue b/app/javascript/dashboard/routes/dashboard/settings/inbox/channels/Twilio.vue index 27cf47437..f5439155d 100644 --- a/app/javascript/dashboard/routes/dashboard/settings/inbox/channels/Twilio.vue +++ b/app/javascript/dashboard/routes/dashboard/settings/inbox/channels/Twilio.vue @@ -17,6 +17,26 @@
+ +
+ +
+
+ +
+