diff --git a/.env.example b/.env.example
index 26b1487ae..1b57141f0 100644
--- a/.env.example
+++ b/.env.example
@@ -1,4 +1,9 @@
+# Learn about the various environment variables at
+# https://www.chatwoot.com/docs/self-hosted/configuration/environment-variables/#rails-production-variables
+
# Used to verify the integrity of signed cookies. so ensure a secure value is set
+# SECRET_KEY_BASE should be alphanumeric. Avoid special characters or symbols.
+# Use `rake secret` to generate this variable
SECRET_KEY_BASE=replace_with_lengthy_secure_hex
# Replace with the URL you are planning to use for your app
@@ -184,12 +189,6 @@ ANDROID_SHA256_CERT_FINGERPRINT=AC:73:8E:DE:EB:56:EA:CC:10:87:02:A7:65:37:7B:38:
# SENTRY_DSN=
-# MICROSOFT CLARITY
-# MS_CLARITY_TOKEN=xxxxxxxxx
-
-# GOOGLE_TAG_MANAGER
-# GOOGLE_TAG = GTM-XXXXXXX
-
## Scout
## https://scoutapm.com/docs/ruby/configuration
# SCOUT_KEY=YOURKEY
diff --git a/Gemfile b/Gemfile
index 38dee9bc4..1b2ed90b9 100644
--- a/Gemfile
+++ b/Gemfile
@@ -71,13 +71,13 @@ gem 'barnes'
##--- gems for authentication & authorization ---##
gem 'devise', '>= 4.9.4'
gem 'devise-secure_password', git: 'https://github.com/chatwoot/devise-secure_password', branch: 'chatwoot'
-gem 'devise_token_auth'
+gem 'devise_token_auth', '>= 1.2.3'
# authorization
gem 'jwt'
gem 'pundit'
# super admin
gem 'administrate', '>= 0.20.1'
-gem 'administrate-field-active_storage', '>= 1.0.2'
+gem 'administrate-field-active_storage', '>= 1.0.3'
gem 'administrate-field-belongs_to_search', '>= 0.9.0'
##--- gems for pubsub service ---##
@@ -166,7 +166,7 @@ gem 'audited', '~> 5.4', '>= 5.4.1'
# need for google auth
gem 'omniauth', '>= 2.1.2'
gem 'omniauth-google-oauth2', '>= 1.1.2'
-gem 'omniauth-rails_csrf_protection', '~> 1.0'
+gem 'omniauth-rails_csrf_protection', '~> 1.0', '>= 1.0.2'
## Gems for reponse bot
# adds cosine similarity to postgres using vector extension
diff --git a/Gemfile.lock b/Gemfile.lock
index 5dc67bef1..374555cc3 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -33,70 +33,70 @@ GIT
GEM
remote: https://rubygems.org/
specs:
- actioncable (7.0.8.1)
- actionpack (= 7.0.8.1)
- activesupport (= 7.0.8.1)
+ actioncable (7.0.8.3)
+ actionpack (= 7.0.8.3)
+ activesupport (= 7.0.8.3)
nio4r (~> 2.0)
websocket-driver (>= 0.6.1)
- actionmailbox (7.0.8.1)
- actionpack (= 7.0.8.1)
- activejob (= 7.0.8.1)
- activerecord (= 7.0.8.1)
- activestorage (= 7.0.8.1)
- activesupport (= 7.0.8.1)
+ actionmailbox (7.0.8.3)
+ actionpack (= 7.0.8.3)
+ activejob (= 7.0.8.3)
+ activerecord (= 7.0.8.3)
+ activestorage (= 7.0.8.3)
+ activesupport (= 7.0.8.3)
mail (>= 2.7.1)
net-imap
net-pop
net-smtp
- actionmailer (7.0.8.1)
- actionpack (= 7.0.8.1)
- actionview (= 7.0.8.1)
- activejob (= 7.0.8.1)
- activesupport (= 7.0.8.1)
+ actionmailer (7.0.8.3)
+ actionpack (= 7.0.8.3)
+ actionview (= 7.0.8.3)
+ activejob (= 7.0.8.3)
+ activesupport (= 7.0.8.3)
mail (~> 2.5, >= 2.5.4)
net-imap
net-pop
net-smtp
rails-dom-testing (~> 2.0)
- actionpack (7.0.8.1)
- actionview (= 7.0.8.1)
- activesupport (= 7.0.8.1)
+ actionpack (7.0.8.3)
+ actionview (= 7.0.8.3)
+ activesupport (= 7.0.8.3)
rack (~> 2.0, >= 2.2.4)
rack-test (>= 0.6.3)
rails-dom-testing (~> 2.0)
rails-html-sanitizer (~> 1.0, >= 1.2.0)
- actiontext (7.0.8.1)
- actionpack (= 7.0.8.1)
- activerecord (= 7.0.8.1)
- activestorage (= 7.0.8.1)
- activesupport (= 7.0.8.1)
+ actiontext (7.0.8.3)
+ actionpack (= 7.0.8.3)
+ activerecord (= 7.0.8.3)
+ activestorage (= 7.0.8.3)
+ activesupport (= 7.0.8.3)
globalid (>= 0.6.0)
nokogiri (>= 1.8.5)
- actionview (7.0.8.1)
- activesupport (= 7.0.8.1)
+ actionview (7.0.8.3)
+ activesupport (= 7.0.8.3)
builder (~> 3.1)
erubi (~> 1.4)
rails-dom-testing (~> 2.0)
rails-html-sanitizer (~> 1.1, >= 1.2.0)
active_record_query_trace (1.8)
- activejob (7.0.8.1)
- activesupport (= 7.0.8.1)
+ activejob (7.0.8.3)
+ activesupport (= 7.0.8.3)
globalid (>= 0.3.6)
- activemodel (7.0.8.1)
- activesupport (= 7.0.8.1)
- activerecord (7.0.8.1)
- activemodel (= 7.0.8.1)
- activesupport (= 7.0.8.1)
+ activemodel (7.0.8.3)
+ activesupport (= 7.0.8.3)
+ activerecord (7.0.8.3)
+ activemodel (= 7.0.8.3)
+ activesupport (= 7.0.8.3)
activerecord-import (1.4.1)
activerecord (>= 4.2)
- activestorage (7.0.8.1)
- actionpack (= 7.0.8.1)
- activejob (= 7.0.8.1)
- activerecord (= 7.0.8.1)
- activesupport (= 7.0.8.1)
+ activestorage (7.0.8.3)
+ actionpack (= 7.0.8.3)
+ activejob (= 7.0.8.3)
+ activerecord (= 7.0.8.3)
+ activesupport (= 7.0.8.3)
marcel (~> 1.0)
mini_mime (>= 1.1.0)
- activesupport (7.0.8.1)
+ activesupport (7.0.8.3)
concurrent-ruby (~> 1.0, >= 1.0.2)
i18n (>= 1.6, < 2)
minitest (>= 5.1)
@@ -113,7 +113,7 @@ GEM
kaminari (~> 1.2.2)
sassc-rails (~> 2.1)
selectize-rails (~> 0.6)
- administrate-field-active_storage (1.0.2)
+ administrate-field-active_storage (1.0.3)
administrate (>= 0.2.2)
rails (>= 7.0)
administrate-field-belongs_to_search (0.9.0)
@@ -148,7 +148,7 @@ GEM
barnes (0.0.9)
multi_json (~> 1)
statsd-ruby (~> 1.1)
- base64 (0.1.1)
+ base64 (0.2.0)
bcrypt (3.1.20)
bigdecimal (3.1.7)
bindex (0.8.1)
@@ -200,10 +200,10 @@ GEM
railties (>= 4.1.0)
responders
warden (~> 1.2.3)
- devise_token_auth (1.2.1)
+ devise_token_auth (1.2.3)
bcrypt (~> 3.0)
devise (> 3.5.2, < 5)
- rails (>= 4.2.0, < 7.1)
+ rails (>= 4.2.0, < 7.2)
diff-lcs (1.5.0)
digest-crc (0.6.4)
rake (>= 12.0.0, < 14.0.0)
@@ -369,7 +369,7 @@ GEM
mini_mime (>= 1.0.0)
multi_xml (>= 0.5.2)
httpclient (2.8.3)
- i18n (1.14.4)
+ i18n (1.14.5)
concurrent-ruby (~> 1.0)
image_processing (1.12.2)
mini_magick (>= 4.9.5, < 5)
@@ -461,7 +461,7 @@ GEM
mini_magick (4.12.0)
mini_mime (1.1.5)
mini_portile2 (2.8.6)
- minitest (5.22.3)
+ minitest (5.23.0)
mock_redis (0.36.0)
ruby2_keywords
msgpack (1.7.0)
@@ -474,7 +474,7 @@ GEM
uri
net-http-persistent (4.0.2)
connection_pool (~> 2.2)
- net-imap (0.4.10)
+ net-imap (0.4.11)
date
net-protocol
net-pop (0.1.2)
@@ -489,15 +489,15 @@ GEM
sidekiq
newrelic_rpm (9.6.0)
base64
- nio4r (2.7.1)
- nokogiri (1.16.4)
+ nio4r (2.7.3)
+ nokogiri (1.16.5)
mini_portile2 (~> 2.8.2)
racc (~> 1.4)
- nokogiri (1.16.4-arm64-darwin)
+ nokogiri (1.16.5-arm64-darwin)
racc (~> 1.4)
- nokogiri (1.16.4-x86_64-darwin)
+ nokogiri (1.16.5-x86_64-darwin)
racc (~> 1.4)
- nokogiri (1.16.4-x86_64-linux)
+ nokogiri (1.16.5-x86_64-linux)
racc (~> 1.4)
oauth (1.1.0)
oauth-tty (~> 1.0, >= 1.0.1)
@@ -524,7 +524,7 @@ GEM
omniauth-oauth2 (1.8.0)
oauth2 (>= 1.4, < 3)
omniauth (~> 2.0)
- omniauth-rails_csrf_protection (1.0.1)
+ omniauth-rails_csrf_protection (1.0.2)
actionpack (>= 4.2)
omniauth (~> 2.0)
openssl (3.1.0)
@@ -555,7 +555,7 @@ GEM
rack (2.2.9)
rack-attack (6.7.0)
rack (>= 1.0, < 4)
- rack-contrib (2.4.0)
+ rack-contrib (2.5.0)
rack (< 4)
rack-cors (2.0.0)
rack (>= 2.0.0)
@@ -569,20 +569,20 @@ GEM
rack-test (2.1.0)
rack (>= 1.3)
rack-timeout (0.6.3)
- rails (7.0.8.1)
- actioncable (= 7.0.8.1)
- actionmailbox (= 7.0.8.1)
- actionmailer (= 7.0.8.1)
- actionpack (= 7.0.8.1)
- actiontext (= 7.0.8.1)
- actionview (= 7.0.8.1)
- activejob (= 7.0.8.1)
- activemodel (= 7.0.8.1)
- activerecord (= 7.0.8.1)
- activestorage (= 7.0.8.1)
- activesupport (= 7.0.8.1)
+ rails (7.0.8.3)
+ actioncable (= 7.0.8.3)
+ actionmailbox (= 7.0.8.3)
+ actionmailer (= 7.0.8.3)
+ actionpack (= 7.0.8.3)
+ actiontext (= 7.0.8.3)
+ actionview (= 7.0.8.3)
+ activejob (= 7.0.8.3)
+ activemodel (= 7.0.8.3)
+ activerecord (= 7.0.8.3)
+ activestorage (= 7.0.8.3)
+ activesupport (= 7.0.8.3)
bundler (>= 1.15.0)
- railties (= 7.0.8.1)
+ railties (= 7.0.8.3)
rails-dom-testing (2.2.0)
activesupport (>= 5.0.0)
minitest
@@ -590,9 +590,9 @@ GEM
rails-html-sanitizer (1.6.0)
loofah (~> 2.21)
nokogiri (~> 1.14)
- railties (7.0.8.1)
- actionpack (= 7.0.8.1)
- activesupport (= 7.0.8.1)
+ railties (7.0.8.3)
+ actionpack (= 7.0.8.3)
+ activesupport (= 7.0.8.3)
method_source
rake (>= 12.2)
thor (~> 1.0)
@@ -628,7 +628,8 @@ GEM
retriable (3.1.2)
reverse_markdown (2.1.1)
nokogiri
- rexml (3.2.5)
+ rexml (3.2.8)
+ strscan (>= 3.0.9)
rspec-core (3.12.2)
rspec-support (~> 3.12.0)
rspec-expectations (3.12.3)
@@ -758,6 +759,7 @@ GEM
stackprof (0.2.25)
statsd-ruby (1.5.0)
stripe (8.5.0)
+ strscan (3.1.0)
telephone_number (1.4.20)
test-prof (1.2.1)
thor (1.3.1)
@@ -819,7 +821,7 @@ GEM
working_hours (1.4.1)
activesupport (>= 3.2)
tzinfo
- zeitwerk (2.6.13)
+ zeitwerk (2.6.14)
PLATFORMS
arm64-darwin-20
@@ -837,7 +839,7 @@ DEPENDENCIES
activerecord-import
acts-as-taggable-on
administrate (>= 0.20.1)
- administrate-field-active_storage (>= 1.0.2)
+ administrate-field-active_storage (>= 1.0.3)
administrate-field-belongs_to_search (>= 0.9.0)
annotate
attr_extras
@@ -860,7 +862,7 @@ DEPENDENCIES
debug (~> 1.8)
devise (>= 4.9.4)
devise-secure_password!
- devise_token_auth
+ devise_token_auth (>= 1.2.3)
dotenv-rails
down
elastic-apm
@@ -904,7 +906,7 @@ DEPENDENCIES
omniauth (>= 2.1.2)
omniauth-google-oauth2 (>= 1.1.2)
omniauth-oauth2
- omniauth-rails_csrf_protection (~> 1.0)
+ omniauth-rails_csrf_protection (~> 1.0, >= 1.0.2)
pg
pg_search
pgvector
diff --git a/app.json b/app.json
index 4ee025f06..d50040814 100644
--- a/app.json
+++ b/app.json
@@ -55,7 +55,7 @@
"plan": "heroku-redis:mini"
},
{
- "plan": "heroku-postgresql:mini"
+ "plan": "heroku-postgresql:essential-0"
}
],
"stack": "heroku-20",
diff --git a/app/builders/v2/reports/conversations/base_report_builder.rb b/app/builders/v2/reports/conversations/base_report_builder.rb
new file mode 100644
index 000000000..a7961b0d6
--- /dev/null
+++ b/app/builders/v2/reports/conversations/base_report_builder.rb
@@ -0,0 +1,30 @@
+class V2::Reports::Conversations::BaseReportBuilder
+ pattr_initialize :account, :params
+
+ private
+
+ AVG_METRICS = %w[avg_first_response_time avg_resolution_time reply_time].freeze
+ COUNT_METRICS = %w[
+ conversations_count
+ incoming_messages_count
+ outgoing_messages_count
+ resolutions_count
+ bot_resolutions_count
+ bot_handoffs_count
+ ].freeze
+
+ def builder_class(metric)
+ case metric
+ when *AVG_METRICS
+ V2::Reports::Timeseries::AverageReportBuilder
+ when *COUNT_METRICS
+ V2::Reports::Timeseries::CountReportBuilder
+ end
+ end
+
+ def log_invalid_metric
+ Rails.logger.error "ReportBuilder: Invalid metric - #{params[:metric]}"
+
+ {}
+ end
+end
diff --git a/app/builders/v2/reports/conversations/metric_builder.rb b/app/builders/v2/reports/conversations/metric_builder.rb
new file mode 100644
index 000000000..6635fb186
--- /dev/null
+++ b/app/builders/v2/reports/conversations/metric_builder.rb
@@ -0,0 +1,30 @@
+class V2::Reports::Conversations::MetricBuilder < V2::Reports::Conversations::BaseReportBuilder
+ def summary
+ {
+ conversations_count: count('conversations_count'),
+ incoming_messages_count: count('incoming_messages_count'),
+ outgoing_messages_count: count('outgoing_messages_count'),
+ avg_first_response_time: count('avg_first_response_time'),
+ avg_resolution_time: count('avg_resolution_time'),
+ resolutions_count: count('resolutions_count'),
+ reply_time: count('reply_time')
+ }
+ end
+
+ def bot_summary
+ {
+ bot_resolutions_count: count('bot_resolutions_count'),
+ bot_handoffs_count: count('bot_handoffs_count')
+ }
+ end
+
+ private
+
+ def count(metric)
+ builder_class(metric).new(account, builder_params(metric)).aggregate_value
+ end
+
+ def builder_params(metric)
+ params.merge({ metric: metric })
+ end
+end
diff --git a/app/builders/v2/reports/conversations/report_builder.rb b/app/builders/v2/reports/conversations/report_builder.rb
new file mode 100644
index 000000000..8f992d4c6
--- /dev/null
+++ b/app/builders/v2/reports/conversations/report_builder.rb
@@ -0,0 +1,21 @@
+class V2::Reports::Conversations::ReportBuilder < V2::Reports::Conversations::BaseReportBuilder
+ def timeseries
+ perform_action(:timeseries)
+ end
+
+ def aggregate_value
+ perform_action(:aggregate_value)
+ end
+
+ private
+
+ def perform_action(method_name)
+ return builder.new(account, params).public_send(method_name) if builder.present?
+
+ log_invalid_metric
+ end
+
+ def builder
+ builder_class(params[:metric])
+ end
+end
diff --git a/app/builders/v2/reports/timeseries/average_report_builder.rb b/app/builders/v2/reports/timeseries/average_report_builder.rb
new file mode 100644
index 000000000..3e30557e1
--- /dev/null
+++ b/app/builders/v2/reports/timeseries/average_report_builder.rb
@@ -0,0 +1,48 @@
+class V2::Reports::Timeseries::AverageReportBuilder < V2::Reports::Timeseries::BaseTimeseriesBuilder
+ def timeseries
+ grouped_average_time = reporting_events.average(average_value_key)
+ grouped_event_count = reporting_events.count
+ grouped_average_time.each_with_object([]) do |element, arr|
+ event_date, average_time = element
+ arr << {
+ value: average_time,
+ timestamp: event_date.in_time_zone(timezone).to_i,
+ count: grouped_event_count[event_date]
+ }
+ end
+ end
+
+ def aggregate_value
+ object_scope.average(average_value_key)
+ end
+
+ private
+
+ def event_name
+ metric_to_event_name = {
+ avg_first_response_time: :first_response,
+ avg_resolution_time: :conversation_resolved,
+ reply_time: :reply_time
+ }
+ metric_to_event_name[params[:metric].to_sym]
+ end
+
+ def object_scope
+ scope.reporting_events.where(name: event_name, created_at: range)
+ end
+
+ def reporting_events
+ @grouped_values = object_scope.group_by_period(
+ group_by,
+ :created_at,
+ default_value: 0,
+ range: range,
+ permit: %w[day week month year hour],
+ time_zone: timezone
+ )
+ end
+
+ def average_value_key
+ @average_value_key ||= params[:business_hours].present? ? :value_in_business_hours : :value
+ end
+end
diff --git a/app/builders/v2/reports/timeseries/base_timeseries_builder.rb b/app/builders/v2/reports/timeseries/base_timeseries_builder.rb
new file mode 100644
index 000000000..50699417d
--- /dev/null
+++ b/app/builders/v2/reports/timeseries/base_timeseries_builder.rb
@@ -0,0 +1,46 @@
+class V2::Reports::Timeseries::BaseTimeseriesBuilder
+ include TimezoneHelper
+ include DateRangeHelper
+ DEFAULT_GROUP_BY = 'day'.freeze
+
+ pattr_initialize :account, :params
+
+ def scope
+ case params[:type].to_sym
+ when :account
+ account
+ when :inbox
+ inbox
+ when :agent
+ user
+ when :label
+ label
+ when :team
+ team
+ end
+ end
+
+ def inbox
+ @inbox ||= account.inboxes.find(params[:id])
+ end
+
+ def user
+ @user ||= account.users.find(params[:id])
+ end
+
+ def label
+ @label ||= account.labels.find(params[:id])
+ end
+
+ def team
+ @team ||= account.teams.find(params[:id])
+ end
+
+ def group_by
+ @group_by ||= %w[day week month year hour].include?(params[:group_by]) ? params[:group_by] : DEFAULT_GROUP_BY
+ end
+
+ def timezone
+ @timezone ||= timezone_name_from_offset(params[:timezone_offset])
+ end
+end
diff --git a/app/builders/v2/reports/timeseries/count_report_builder.rb b/app/builders/v2/reports/timeseries/count_report_builder.rb
new file mode 100644
index 000000000..03a87a6fa
--- /dev/null
+++ b/app/builders/v2/reports/timeseries/count_report_builder.rb
@@ -0,0 +1,71 @@
+class V2::Reports::Timeseries::CountReportBuilder < V2::Reports::Timeseries::BaseTimeseriesBuilder
+ def timeseries
+ grouped_count.each_with_object([]) do |element, arr|
+ event_date, event_count = element
+
+ # The `event_date` is in Date format (without time), such as "Wed, 15 May 2024".
+ # We need a timestamp for the start of the day. However, we can't use `event_date.to_time.to_i`
+ # because it converts the date to 12:00 AM server timezone.
+ # The desired output should be 12:00 AM in the specified timezone.
+ arr << { value: event_count, timestamp: event_date.in_time_zone(timezone).to_i }
+ end
+ end
+
+ def aggregate_value
+ object_scope.count
+ end
+
+ private
+
+ def metric
+ @metric ||= params[:metric]
+ end
+
+ def object_scope
+ send("scope_for_#{metric}")
+ end
+
+ def scope_for_conversations_count
+ scope.conversations.where(account_id: account.id, created_at: range)
+ end
+
+ def scope_for_incoming_messages_count
+ scope.messages.where(account_id: account.id, created_at: range).incoming.unscope(:order)
+ end
+
+ def scope_for_outgoing_messages_count
+ scope.messages.where(account_id: account.id, created_at: range).outgoing.unscope(:order)
+ end
+
+ def scope_for_resolutions_count
+ scope.reporting_events.joins(:conversation).select(:conversation_id).where(
+ name: :conversation_resolved,
+ conversations: { status: :resolved }, created_at: range
+ ).distinct
+ end
+
+ def scope_for_bot_resolutions_count
+ scope.reporting_events.joins(:conversation).select(:conversation_id).where(
+ name: :conversation_bot_resolved,
+ conversations: { status: :resolved }, created_at: range
+ ).distinct
+ end
+
+ def scope_for_bot_handoffs_count
+ scope.reporting_events.joins(:conversation).select(:conversation_id).where(
+ name: :conversation_bot_handoff,
+ created_at: range
+ ).distinct
+ end
+
+ def grouped_count
+ @grouped_values = object_scope.group_by_period(
+ group_by,
+ :created_at,
+ default_value: 0,
+ range: range,
+ permit: %w[day week month year hour],
+ time_zone: timezone
+ ).count
+ end
+end
diff --git a/app/controllers/api/v1/accounts/integrations/linear_controller.rb b/app/controllers/api/v1/accounts/integrations/linear_controller.rb
new file mode 100644
index 000000000..814373c7e
--- /dev/null
+++ b/app/controllers/api/v1/accounts/integrations/linear_controller.rb
@@ -0,0 +1,93 @@
+class Api::V1::Accounts::Integrations::LinearController < Api::V1::Accounts::BaseController
+ before_action :fetch_conversation, only: [:link_issue, :linked_issues]
+
+ def teams
+ teams = linear_processor_service.teams
+ if teams[:error]
+ render json: { error: teams[:error] }, status: :unprocessable_entity
+ else
+ render json: teams[:data], status: :ok
+ end
+ end
+
+ def team_entities
+ team_id = permitted_params[:team_id]
+ team_entities = linear_processor_service.team_entities(team_id)
+ if team_entities[:error]
+ render json: { error: team_entities[:error] }, status: :unprocessable_entity
+ else
+ render json: team_entities[:data], status: :ok
+ end
+ end
+
+ def create_issue
+ issue = linear_processor_service.create_issue(permitted_params)
+ if issue[:error]
+ render json: { error: issue[:error] }, status: :unprocessable_entity
+ else
+ render json: issue[:data], status: :ok
+ end
+ end
+
+ def link_issue
+ issue_id = permitted_params[:issue_id]
+ title = permitted_params[:title]
+ issue = linear_processor_service.link_issue(conversation_link, issue_id, title)
+ if issue[:error]
+ render json: { error: issue[:error] }, status: :unprocessable_entity
+ else
+ render json: issue[:data], status: :ok
+ end
+ end
+
+ def unlink_issue
+ link_id = permitted_params[:link_id]
+ issue = linear_processor_service.unlink_issue(link_id)
+
+ if issue[:error]
+ render json: { error: issue[:error] }, status: :unprocessable_entity
+ else
+ render json: issue[:data], status: :ok
+ end
+ end
+
+ def linked_issues
+ issues = linear_processor_service.linked_issues(conversation_link)
+
+ if issues[:error]
+ render json: { error: issues[:error] }, status: :unprocessable_entity
+ else
+ render json: issues[:data], status: :ok
+ end
+ end
+
+ def search_issue
+ render json: { error: 'Specify search string with parameter q' }, status: :unprocessable_entity if params[:q].blank? && return
+
+ term = params[:q]
+ issues = linear_processor_service.search_issue(term)
+ if issues[:error]
+ render json: { error: issues[:error] }, status: :unprocessable_entity
+ else
+ render json: issues[:data], status: :ok
+ end
+ end
+
+ private
+
+ def conversation_link
+ "#{ENV.fetch('FRONTEND_URL', nil)}/app/accounts/#{Current.account.id}/conversations/#{@conversation.display_id}"
+ end
+
+ def fetch_conversation
+ @conversation = Current.account.conversations.find_by!(display_id: permitted_params[:conversation_id])
+ end
+
+ def linear_processor_service
+ Integrations::Linear::ProcessorService.new(account: Current.account)
+ end
+
+ def permitted_params
+ params.permit(:team_id, :project_id, :conversation_id, :issue_id, :link_id, :title, :description, :assignee_id, :priority, label_ids: [])
+ end
+end
diff --git a/app/controllers/api/v2/accounts/reports_controller.rb b/app/controllers/api/v2/accounts/reports_controller.rb
index c67b74a43..ed5be5518 100644
--- a/app/controllers/api/v2/accounts/reports_controller.rb
+++ b/app/controllers/api/v2/accounts/reports_controller.rb
@@ -5,19 +5,17 @@ class Api::V2::Accounts::ReportsController < Api::V1::Accounts::BaseController
before_action :check_authorization
def index
- builder = V2::ReportBuilder.new(Current.account, report_params)
- data = builder.build
+ builder = V2::Reports::Conversations::ReportBuilder.new(Current.account, report_params)
+ data = builder.timeseries
render json: data
end
def summary
- render json: summary_metrics
+ render json: build_summary(:summary)
end
def bot_summary
- summary = V2::ReportBuilder.new(Current.account, current_summary_params).bot_summary
- summary[:previous] = V2::ReportBuilder.new(Current.account, previous_summary_params).bot_summary
- render json: summary
+ render json: build_summary(:bot_summary)
end
def agents
@@ -126,10 +124,11 @@ class Api::V2::Accounts::ReportsController < Api::V1::Accounts::BaseController
}
end
- def summary_metrics
- summary = V2::ReportBuilder.new(Current.account, current_summary_params).summary
- summary[:previous] = V2::ReportBuilder.new(Current.account, previous_summary_params).summary
- summary
+ def build_summary(method)
+ builder = V2::Reports::Conversations::MetricBuilder
+ current_summary = builder.new(Current.account, current_summary_params).send(method)
+ previous_summary = builder.new(Current.account, previous_summary_params).send(method)
+ current_summary.merge(previous: previous_summary)
end
def conversation_metrics
diff --git a/app/controllers/concerns/microsoft_concern.rb b/app/controllers/concerns/microsoft_concern.rb
index 3aa3e4e81..0f37bd03f 100644
--- a/app/controllers/concerns/microsoft_concern.rb
+++ b/app/controllers/concerns/microsoft_concern.rb
@@ -2,7 +2,10 @@ module MicrosoftConcern
extend ActiveSupport::Concern
def microsoft_client
- ::OAuth2::Client.new(ENV.fetch('AZURE_APP_ID', nil), ENV.fetch('AZURE_APP_SECRET', nil),
+ app_id = GlobalConfigService.load('AZURE_APP_ID', nil)
+ app_secret = GlobalConfigService.load('AZURE_APP_SECRET', nil)
+
+ ::OAuth2::Client.new(app_id, app_secret,
{
site: 'https://login.microsoftonline.com',
authorize_url: 'https://login.microsoftonline.com/common/oauth2/v2.0/authorize',
diff --git a/app/controllers/dashboard_controller.rb b/app/controllers/dashboard_controller.rb
index 047fd10c3..e656c2550 100644
--- a/app/controllers/dashboard_controller.rb
+++ b/app/controllers/dashboard_controller.rb
@@ -3,6 +3,7 @@ class DashboardController < ActionController::Base
before_action :set_application_pack
before_action :set_global_config
+ before_action :set_dashboard_scripts
around_action :switch_locale
before_action :ensure_installation_onboarding, only: [:index]
before_action :render_hc_if_custom_domain, only: [:index]
@@ -35,6 +36,10 @@ class DashboardController < ActionController::Base
).merge(app_config)
end
+ def set_dashboard_scripts
+ @dashboard_scripts = GlobalConfig.get_value('DASHBOARD_SCRIPTS')
+ end
+
def ensure_installation_onboarding
redirect_to '/installation/onboarding' if ::Redis::Alfred.get(::Redis::Alfred::CHATWOOT_INSTALLATION_ONBOARDING)
end
@@ -58,7 +63,7 @@ class DashboardController < ActionController::Base
FB_APP_ID: GlobalConfigService.load('FB_APP_ID', ''),
FACEBOOK_API_VERSION: GlobalConfigService.load('FACEBOOK_API_VERSION', 'v17.0'),
IS_ENTERPRISE: ChatwootApp.enterprise?,
- AZURE_APP_ID: ENV.fetch('AZURE_APP_ID', ''),
+ AZURE_APP_ID: GlobalConfigService.load('AZURE_APP_ID', ''),
GIT_SHA: GIT_HASH
}
end
diff --git a/app/controllers/microsoft/callbacks_controller.rb b/app/controllers/microsoft/callbacks_controller.rb
index 215103bd4..aa1c22d91 100644
--- a/app/controllers/microsoft/callbacks_controller.rb
+++ b/app/controllers/microsoft/callbacks_controller.rb
@@ -7,9 +7,14 @@ class Microsoft::CallbacksController < ApplicationController
redirect_uri: "#{base_url}/microsoft/callback"
)
- inbox = find_or_create_inbox
+ inbox, already_exists = find_or_create_inbox
::Redis::Alfred.delete(users_data['email'].downcase)
- redirect_to app_microsoft_inbox_agents_url(account_id: account.id, inbox_id: inbox.id)
+
+ if already_exists
+ redirect_to app_microsoft_inbox_settings_url(account_id: account.id, inbox_id: inbox.id)
+ else
+ redirect_to app_microsoft_inbox_agents_url(account_id: account.id, inbox_id: inbox.id)
+ end
rescue StandardError => e
ChatwootExceptionTracker.new(e).capture_exception
redirect_to '/'
@@ -40,9 +45,17 @@ class Microsoft::CallbacksController < ApplicationController
def find_or_create_inbox
channel_email = Channel::Email.find_by(email: users_data['email'], account: account)
+ # we need this value to know where to redirect on sucessful processing of the callback
+ channel_exists = channel_email.present?
+
channel_email ||= create_microsoft_channel_with_inbox
update_microsoft_channel(channel_email)
- channel_email.inbox
+
+ # reauthorize channel, this code path only triggers when microsoft auth is successful
+ # reauthorized will also update cache keys for the associated inbox
+ channel_email.reauthorized!
+
+ [channel_email.inbox, channel_exists]
end
# Fallback name, for when name field is missing from users_data
diff --git a/app/controllers/microsoft_controller.rb b/app/controllers/microsoft_controller.rb
index 07e58d4db..e6a12dafa 100644
--- a/app/controllers/microsoft_controller.rb
+++ b/app/controllers/microsoft_controller.rb
@@ -12,6 +12,6 @@ class MicrosoftController < ApplicationController
end
def microsoft_indentity
- @identity_json = ENV.fetch('AZURE_APP_ID', nil)
+ @identity_json = GlobalConfigService.load('AZURE_APP_ID', nil)
end
end
diff --git a/app/controllers/super_admin/app_configs_controller.rb b/app/controllers/super_admin/app_configs_controller.rb
index 6223f7174..9d9494fc4 100644
--- a/app/controllers/super_admin/app_configs_controller.rb
+++ b/app/controllers/super_admin/app_configs_controller.rb
@@ -35,6 +35,8 @@ class SuperAdmin::AppConfigsController < SuperAdmin::ApplicationController
@allowed_configs = case @config
when 'facebook'
%w[FB_APP_ID FB_VERIFY_TOKEN FB_APP_SECRET IG_VERIFY_TOKEN FACEBOOK_API_VERSION ENABLE_MESSENGER_CHANNEL_HUMAN_AGENT]
+ when 'microsoft'
+ %w[AZURE_APP_ID AZURE_APP_SECRET]
when 'email'
['MAILER_INBOUND_EMAIL_DOMAIN']
else
diff --git a/app/helpers/timezone_helper.rb b/app/helpers/timezone_helper.rb
new file mode 100644
index 000000000..b016cc9d9
--- /dev/null
+++ b/app/helpers/timezone_helper.rb
@@ -0,0 +1,19 @@
+module TimezoneHelper
+ # ActiveSupport TimeZone is not aware of the current time, so ActiveSupport::Timezone[offset]
+ # would return the timezone without considering day light savings. To get the correct timezone,
+ # this method uses zone.now.utc_offset for comparison as referenced in the issues below
+ #
+ # https://github.com/rails/rails/pull/22243
+ # https://github.com/rails/rails/issues/21501
+ # https://github.com/rails/rails/issues/7297
+ def timezone_name_from_offset(offset)
+ return 'UTC' if offset.blank?
+
+ offset_in_seconds = offset.to_f * 3600
+ matching_zone = ActiveSupport::TimeZone.all.find do |zone|
+ zone.now.utc_offset == offset_in_seconds
+ end
+
+ return matching_zone.name if matching_zone
+ end
+end
diff --git a/app/javascript/dashboard/api/inbox/conversation.js b/app/javascript/dashboard/api/inbox/conversation.js
index 94cc81354..ebc6176e7 100644
--- a/app/javascript/dashboard/api/inbox/conversation.js
+++ b/app/javascript/dashboard/api/inbox/conversation.js
@@ -15,6 +15,7 @@ class ConversationApi extends ApiClient {
teamId,
conversationType,
sortBy,
+ updatedWithin,
}) {
return axios.get(this.url, {
params: {
@@ -26,6 +27,7 @@ class ConversationApi extends ApiClient {
labels,
conversation_type: conversationType,
sort_by: sortBy,
+ updated_within: updatedWithin,
},
});
}
diff --git a/app/javascript/dashboard/api/integrations/linear.js b/app/javascript/dashboard/api/integrations/linear.js
new file mode 100644
index 000000000..2ac0940aa
--- /dev/null
+++ b/app/javascript/dashboard/api/integrations/linear.js
@@ -0,0 +1,47 @@
+/* global axios */
+
+import ApiClient from '../ApiClient';
+
+class LinearAPI extends ApiClient {
+ constructor() {
+ super('integrations/linear', { accountScoped: true });
+ }
+
+ getTeams() {
+ return axios.get(`${this.url}/teams`);
+ }
+
+ getTeamEntities(teamId) {
+ return axios.get(`${this.url}/team_entities?team_id=${teamId}`);
+ }
+
+ createIssue(data) {
+ return axios.post(`${this.url}/create_issue`, data);
+ }
+
+ link_issue(conversationId, issueId, title) {
+ return axios.post(`${this.url}/link_issue`, {
+ issue_id: issueId,
+ conversation_id: conversationId,
+ title: title,
+ });
+ }
+
+ getLinkedIssue(conversationId) {
+ return axios.get(
+ `${this.url}/linked_issues?conversation_id=${conversationId}`
+ );
+ }
+
+ unlinkIssue(linkId) {
+ return axios.post(`${this.url}/unlink_issue`, {
+ link_id: linkId,
+ });
+ }
+
+ searchIssues(query) {
+ return axios.get(`${this.url}/search_issue?q=${query}`);
+ }
+}
+
+export default new LinearAPI();
diff --git a/app/javascript/dashboard/api/specs/inbox/conversation.spec.js b/app/javascript/dashboard/api/specs/inbox/conversation.spec.js
index ecc833e16..3287d7477 100644
--- a/app/javascript/dashboard/api/specs/inbox/conversation.spec.js
+++ b/app/javascript/dashboard/api/specs/inbox/conversation.spec.js
@@ -46,6 +46,7 @@ describe('#ConversationAPI', () => {
page: 1,
labels: [],
teamId: 1,
+ updatedWithin: 20,
});
expect(axiosMock.get).toHaveBeenCalledWith('/api/v1/conversations', {
params: {
@@ -55,6 +56,7 @@ describe('#ConversationAPI', () => {
assignee_type: 'me',
page: 1,
labels: [],
+ updated_within: 20,
},
});
});
diff --git a/app/javascript/dashboard/api/specs/integrations/linear.spec.js b/app/javascript/dashboard/api/specs/integrations/linear.spec.js
new file mode 100644
index 000000000..cc16feb16
--- /dev/null
+++ b/app/javascript/dashboard/api/specs/integrations/linear.spec.js
@@ -0,0 +1,202 @@
+import LinearAPIClient from '../../integrations/linear';
+import ApiClient from '../../ApiClient';
+
+describe('#linearAPI', () => {
+ it('creates correct instance', () => {
+ expect(LinearAPIClient).toBeInstanceOf(ApiClient);
+ expect(LinearAPIClient).toHaveProperty('getTeams');
+ expect(LinearAPIClient).toHaveProperty('getTeamEntities');
+ expect(LinearAPIClient).toHaveProperty('createIssue');
+ expect(LinearAPIClient).toHaveProperty('link_issue');
+ expect(LinearAPIClient).toHaveProperty('getLinkedIssue');
+ expect(LinearAPIClient).toHaveProperty('unlinkIssue');
+ expect(LinearAPIClient).toHaveProperty('searchIssues');
+ });
+
+ describe('getTeams', () => {
+ const originalAxios = window.axios;
+ const axiosMock = {
+ post: jest.fn(() => Promise.resolve()),
+ get: jest.fn(() => Promise.resolve()),
+ patch: jest.fn(() => Promise.resolve()),
+ delete: jest.fn(() => Promise.resolve()),
+ };
+
+ beforeEach(() => {
+ window.axios = axiosMock;
+ });
+
+ afterEach(() => {
+ window.axios = originalAxios;
+ });
+
+ it('creates a valid request', () => {
+ LinearAPIClient.getTeams();
+ expect(axiosMock.get).toHaveBeenCalledWith(
+ '/api/v1/integrations/linear/teams'
+ );
+ });
+ });
+
+ describe('getTeamEntities', () => {
+ const originalAxios = window.axios;
+ const axiosMock = {
+ post: jest.fn(() => Promise.resolve()),
+ get: jest.fn(() => Promise.resolve()),
+ patch: jest.fn(() => Promise.resolve()),
+ delete: jest.fn(() => Promise.resolve()),
+ };
+
+ beforeEach(() => {
+ window.axios = axiosMock;
+ });
+
+ afterEach(() => {
+ window.axios = originalAxios;
+ });
+
+ it('creates a valid request', () => {
+ LinearAPIClient.getTeamEntities(1);
+ expect(axiosMock.get).toHaveBeenCalledWith(
+ '/api/v1/integrations/linear/team_entities?team_id=1'
+ );
+ });
+ });
+
+ describe('createIssue', () => {
+ const originalAxios = window.axios;
+ const axiosMock = {
+ post: jest.fn(() => Promise.resolve()),
+ get: jest.fn(() => Promise.resolve()),
+ patch: jest.fn(() => Promise.resolve()),
+ delete: jest.fn(() => Promise.resolve()),
+ };
+
+ beforeEach(() => {
+ window.axios = axiosMock;
+ });
+
+ afterEach(() => {
+ window.axios = originalAxios;
+ });
+
+ it('creates a valid request', () => {
+ const issueData = {
+ title: 'New Issue',
+ description: 'Issue description',
+ };
+ LinearAPIClient.createIssue(issueData);
+ expect(axiosMock.post).toHaveBeenCalledWith(
+ '/api/v1/integrations/linear/create_issue',
+ issueData
+ );
+ });
+ });
+
+ describe('link_issue', () => {
+ const originalAxios = window.axios;
+ const axiosMock = {
+ post: jest.fn(() => Promise.resolve()),
+ get: jest.fn(() => Promise.resolve()),
+ patch: jest.fn(() => Promise.resolve()),
+ delete: jest.fn(() => Promise.resolve()),
+ };
+
+ beforeEach(() => {
+ window.axios = axiosMock;
+ });
+
+ afterEach(() => {
+ window.axios = originalAxios;
+ });
+
+ it('creates a valid request', () => {
+ LinearAPIClient.link_issue(1, 2);
+ expect(axiosMock.post).toHaveBeenCalledWith(
+ '/api/v1/integrations/linear/link_issue',
+ {
+ issue_id: 2,
+ conversation_id: 1,
+ }
+ );
+ });
+ });
+
+ describe('getLinkedIssue', () => {
+ const originalAxios = window.axios;
+ const axiosMock = {
+ post: jest.fn(() => Promise.resolve()),
+ get: jest.fn(() => Promise.resolve()),
+ patch: jest.fn(() => Promise.resolve()),
+ delete: jest.fn(() => Promise.resolve()),
+ };
+
+ beforeEach(() => {
+ window.axios = axiosMock;
+ });
+
+ afterEach(() => {
+ window.axios = originalAxios;
+ });
+
+ it('creates a valid request', () => {
+ LinearAPIClient.getLinkedIssue(1);
+ expect(axiosMock.get).toHaveBeenCalledWith(
+ '/api/v1/integrations/linear/linked_issues?conversation_id=1'
+ );
+ });
+ });
+
+ describe('unlinkIssue', () => {
+ const originalAxios = window.axios;
+ const axiosMock = {
+ post: jest.fn(() => Promise.resolve()),
+ get: jest.fn(() => Promise.resolve()),
+ patch: jest.fn(() => Promise.resolve()),
+ delete: jest.fn(() => Promise.resolve()),
+ };
+
+ beforeEach(() => {
+ window.axios = axiosMock;
+ });
+
+ afterEach(() => {
+ window.axios = originalAxios;
+ });
+
+ it('creates a valid request', () => {
+ LinearAPIClient.unlinkIssue(1);
+ expect(axiosMock.post).toHaveBeenCalledWith(
+ '/api/v1/integrations/linear/unlink_issue',
+ {
+ link_id: 1,
+ }
+ );
+ });
+ });
+
+ describe('searchIssues', () => {
+ const originalAxios = window.axios;
+ const axiosMock = {
+ post: jest.fn(() => Promise.resolve()),
+ get: jest.fn(() => Promise.resolve()),
+ patch: jest.fn(() => Promise.resolve()),
+ delete: jest.fn(() => Promise.resolve()),
+ };
+
+ beforeEach(() => {
+ window.axios = axiosMock;
+ });
+
+ afterEach(() => {
+ window.axios = originalAxios;
+ });
+
+ it('creates a valid request', () => {
+ LinearAPIClient.searchIssues('query');
+ expect(axiosMock.get).toHaveBeenCalledWith(
+ '/api/v1/integrations/linear/search_issue?q=query'
+ );
+ });
+ });
+});
diff --git a/app/javascript/dashboard/components/ChatList.vue b/app/javascript/dashboard/components/ChatList.vue
index e7fae6e01..3e251f42b 100644
--- a/app/javascript/dashboard/components/ChatList.vue
+++ b/app/javascript/dashboard/components/ChatList.vue
@@ -7,79 +7,17 @@
]"
>
Agent Bots
Agent Bots are like the most fabulous members of your team. They can handle the small stuff, so you can focus on the stuff that matters. Give them a try.
You can manage your bots from this page or create new ones using the 'Add bot configuraton' button.
Open the Agent bots handbook in another tab for a helping hand.
", "CSML_BOT_EDITOR": { diff --git a/app/javascript/dashboard/i18n/locale/ca/agentMgmt.json b/app/javascript/dashboard/i18n/locale/ca/agentMgmt.json index 829bcc7ef..33d2d8506 100644 --- a/app/javascript/dashboard/i18n/locale/ca/agentMgmt.json +++ b/app/javascript/dashboard/i18n/locale/ca/agentMgmt.json @@ -3,7 +3,7 @@ "HEADER": "Agents", "HEADER_BTN_TXT": "Afegir Agent", "LOADING": "S'està recollint la llista d'agents", - "SIDEBAR_TXT": "Agents
Un Agent és membre del vostre equip d’atenció al client.
Els agents podran veure i respondre missatges dels teus usuaris. La llista mostra tots els agents que hi ha actualment al teu compte.
Fer clic a Afegeix Agent per afegir un agent nou. L’agent que afegeixes rebrà un correu electrònic amb un enllaç de confirmació per activar el seu compte, després del qual podrà accedir a Chatwoot i respondre als missatges.
L’accés a les funcions de Chatwoot es basa en els següents rols.
Agent - Els agents amb aquesta funció només poden accedir a les bústies d’entrada, als informes i a les converses. Poden assignar converses a altres agents o a ells mateixos i resoldre converses.
Administrador - L'administrador tindrà accés a totes les funcions de Chatwoot habilitades per al teu compte, inclosa la configuració, juntament amb tots els privilegis dels agents normals.
", + "SIDEBAR_TXT": "Agents
Un Agent és membre del vostre equip d’atenció al client.
Els agents podran veure i respondre missatges dels teus usuaris. La llista mostra tots els agents que hi ha actualment al teu compte.
Fer clic a Afegeix Agent per afegir un agent nou. L´agent que afegeixes rebrà un correu electrònic amb un enllaç de confirmació per activar el seu compte, després del qual podrà accedir a Chatwoot i respondre als missatges.
L´accés a les funcions de Chatwoot es basa en els següents rols.
Agent - Els agents amb aquesta funció només poden accedir a les bústies d´entrada, als informes i a les converses. Poden assignar converses a altres agents o a ells mateixos i resoldre converses.
Administrador - L´administrador tindrà accés a totes les funcions de Chatwoot habilitades per al teu compte, inclosa la configuració, juntament amb tots els privilegis dels agents normals.
", "AGENT_TYPES": { "ADMINISTRATOR": "Administrador/a", "AGENT": "Agent" @@ -31,7 +31,7 @@ "AGENT_TYPE": { "LABEL": "Tipus d'Agent", "PLACEHOLDER": "Selecciona un tipus", - "ERROR": "El tipus d'Agent és necessari" + "ERROR": "El rol és necessari" }, "EMAIL": { "LABEL": "Adreça de correu electrònic", @@ -76,8 +76,8 @@ }, "AGENT_AVAILABILITY": { "LABEL": "Disponibilitat", - "PLACEHOLDER": "Please select an availability status", - "ERROR": "Availability is required" + "PLACEHOLDER": "Seleccioneu un estat de disponibilitat", + "ERROR": "Es requereix disponibilitat" }, "SUBMIT": "Editar l'agent" }, @@ -111,7 +111,7 @@ "PLACEHOLDER": { "AGENT": "Cerca agents", "TEAM": "Cerca equips", - "INPUT": "Search for agents" + "INPUT": "Cerca agents" } } } diff --git a/app/javascript/dashboard/i18n/locale/ca/auditLogs.json b/app/javascript/dashboard/i18n/locale/ca/auditLogs.json index 6cb1c776f..e3dd7c68c 100644 --- a/app/javascript/dashboard/i18n/locale/ca/auditLogs.json +++ b/app/javascript/dashboard/i18n/locale/ca/auditLogs.json @@ -11,7 +11,7 @@ "DESC": "Audit Logs are trails for events and actions in a Chatwoot System.", "TABLE_HEADER": [ "User", - "Action", + "Temps", "Adreça IP" ] }, diff --git a/app/javascript/dashboard/i18n/locale/ca/bulkActions.json b/app/javascript/dashboard/i18n/locale/ca/bulkActions.json index 9cd87b5d6..4595a205b 100644 --- a/app/javascript/dashboard/i18n/locale/ca/bulkActions.json +++ b/app/javascript/dashboard/i18n/locale/ca/bulkActions.json @@ -17,7 +17,7 @@ "AGENT_LIST_LOADING": "Loading agents", "UPDATE": { "CHANGE_STATUS": "Change status", - "SNOOZE_UNTIL_NEXT_REPLY": "Snooze until next reply.", + "SNOOZE_UNTIL": "Snooze", "UPDATE_SUCCESFUL": "Conversation status updated successfully.", "UPDATE_FAILED": "Failed to update conversations. Please try again." }, diff --git a/app/javascript/dashboard/i18n/locale/ca/campaign.json b/app/javascript/dashboard/i18n/locale/ca/campaign.json index e3d69bc29..182e49bd6 100644 --- a/app/javascript/dashboard/i18n/locale/ca/campaign.json +++ b/app/javascript/dashboard/i18n/locale/ca/campaign.json @@ -98,7 +98,7 @@ "CREATED_AT": "Created at" }, "BUTTONS": { - "ADD": "Add", + "ADD": "Afegir", "EDIT": "Edita", "DELETE": "Esborrar" }, diff --git a/app/javascript/dashboard/i18n/locale/ca/cannedMgmt.json b/app/javascript/dashboard/i18n/locale/ca/cannedMgmt.json index 187c3ac27..f0129c7bc 100644 --- a/app/javascript/dashboard/i18n/locale/ca/cannedMgmt.json +++ b/app/javascript/dashboard/i18n/locale/ca/cannedMgmt.json @@ -1,75 +1,75 @@ { "CANNED_MGMT": { "HEADER": "Respostes predeterminades", - "HEADER_BTN_TXT": "Add canned response", - "LOADING": "Fetching canned responses...", + "HEADER_BTN_TXT": "Afegir resposta predeterminada", + "LOADING": "S'estan recollint les respostes predeterminades...", "SEARCH_404": "No hi ha cap resposta que coincideixi amb aquesta consulta.", - "SIDEBAR_TXT": "Canned Responses
Canned Responses are pre-written reply templates that help you quickly respond to a conversation. To insert a canned response during a chat, agents can type a short code preceded by a '/' character.
You can manage your canned responses from this page or create new ones using the \"Add canned response\" button.
Open the Canned Responses handbook in another tab for a helping hand.
Also, check out the all-new Canned Responses Library.
", + "SIDEBAR_TXT": "Respostes predeterminades
Les respostes predeterminades són plantilles de respostes escrites prèviament que us ajuden a respondre ràpidament a una conversa. Per inserir una resposta predefinida durant un xat, els agents poden escriure un codi curt precedit d'un caràcter '/'.
Pots gestionar les teves respostes predefinides des d'aquesta pàgina o crear-ne de noves mitjançant el botó \"Afegeix una resposta predefinida\".
Obre el Manual de respostes llaunes en una altra pestanya per ajudar-te.
També, fes una ullada al nou Biblioteca de respostes predeterminades.
", "LIST": { "404": "No hi ha respostes predeterminades disponibles en aquest compte.", "TITLE": "Gestiona les respostes predeterminades", - "DESC": "Canned Responses are predefined reply templates which can be used to quickly send out replies to conversations.", + "DESC": "Les respostes predeterminades són plantilles de resposta predefinides que es poden utilitzar per enviar ràpidament respostes a les converses.", "TABLE_HEADER": [ - "Short code", + "Codi curt", "Contingut", "Accions" ] }, "ADD": { - "TITLE": "Add canned response", - "DESC": "Canned Responses are predefined reply templates which can be used to quickly send out replies to conversations.", + "TITLE": "Afegir resposta predeterminada", + "DESC": "Les respostes predeterminades són plantilles de resposta predefinides que es poden utilitzar per enviar ràpidament respostes a les converses.", "CANCEL_BUTTON_TEXT": "Cancel·la", "FORM": { "SHORT_CODE": { - "LABEL": "Short code", - "PLACEHOLDER": "Please enter a short code.", - "ERROR": "Short Code is required." + "LABEL": "Codi curt", + "PLACEHOLDER": "Introduïu un codi curt.", + "ERROR": "És necessari el codi curt." }, "CONTENT": { "LABEL": "Missatge", - "PLACEHOLDER": "Please write the message you want to save as a template to use later.", - "ERROR": "Message is required." + "PLACEHOLDER": "Escriviu el missatge que voleu desar com a plantilla per utilitzar-lo més tard.", + "ERROR": "El missatge és obligatori." }, "SUBMIT": "Envia" }, "API": { - "SUCCESS_MESSAGE": "Canned response added successfully.", + "SUCCESS_MESSAGE": "Resposta predeterminada afegida correctament.", "ERROR_MESSAGE": "No s'ha pogut connectar amb el servidor Woot. Torna-ho a provar més endavant" } }, "EDIT": { - "TITLE": "Edit canned response", + "TITLE": "Edita la resposta predeterminada", "CANCEL_BUTTON_TEXT": "Cancel·la", "FORM": { "SHORT_CODE": { - "LABEL": "Short code", - "PLACEHOLDER": "Please enter a shortcode.", - "ERROR": "Short code is required." + "LABEL": "Codi curt", + "PLACEHOLDER": "Introduïu un codi curt.", + "ERROR": "És necessari el codi curt." }, "CONTENT": { "LABEL": "Missatge", - "PLACEHOLDER": "Please write the message you want to save as a template to use later.", - "ERROR": "Message is required." + "PLACEHOLDER": "Escriviu el missatge que voleu desar com a plantilla per utilitzar-lo més tard.", + "ERROR": "El missatge és obligatori." }, "SUBMIT": "Envia" }, "BUTTON_TEXT": "Edita", "API": { - "SUCCESS_MESSAGE": "Canned response is updated successfully.", + "SUCCESS_MESSAGE": "Resposta predeterminada actualitzada correctament.", "ERROR_MESSAGE": "No s'ha pogut connectar amb el servidor Woot. Torna-ho a provar més endavant" } }, "DELETE": { "BUTTON_TEXT": "Esborra", "API": { - "SUCCESS_MESSAGE": "Canned response deleted successfully.", + "SUCCESS_MESSAGE": "Resposta predeterminada eliminada correctament.", "ERROR_MESSAGE": "No s'ha pogut connectar amb el servidor Woot. Torna-ho a provar més endavant" }, "CONFIRM": { - "TITLE": "Confirm deletion", + "TITLE": "Confirma l'esborrat", "MESSAGE": "N'estas segur ", - "YES": "Yes, delete ", - "NO": "No, keep " + "YES": "Sí, esborra ", + "NO": "No, mantén-la " } } } diff --git a/app/javascript/dashboard/i18n/locale/ca/chatlist.json b/app/javascript/dashboard/i18n/locale/ca/chatlist.json index 1608a5a8b..971ae7f33 100644 --- a/app/javascript/dashboard/i18n/locale/ca/chatlist.json +++ b/app/javascript/dashboard/i18n/locale/ca/chatlist.json @@ -8,7 +8,7 @@ }, "TAB_HEADING": "Converses", "MENTION_HEADING": "Mencions", - "UNATTENDED_HEADING": "Unattended", + "UNATTENDED_HEADING": "Sense assistència", "SEARCH": { "INPUT": "Cerca persones, xats, respostes desades .." }, @@ -36,27 +36,27 @@ } }, "VIEW_FILTER": "Veure", - "SORT_TOOLTIP_LABEL": "Sort conversations", + "SORT_TOOLTIP_LABEL": "Ordena les converses", "CHAT_SORT": { "STATUS": "Estat", - "ORDER_BY": "Order by" + "ORDER_BY": "Ordena per" }, "CHAT_TIME_STAMP": { "CREATED": { - "LATEST": "Created", - "OLDEST": "Created at:" + "LATEST": "Creat", + "OLDEST": "Creat per:" }, "LAST_ACTIVITY": { - "NOT_ACTIVE": "Last activity:", - "ACTIVE": "Last activity" + "NOT_ACTIVE": "Darrera activitat:", + "ACTIVE": "Darrera activitat" } }, "SORT_ORDER_ITEMS": { "last_activity_at_asc": { - "TEXT": "Last activity: Oldest first" + "TEXT": "Última activitat: Més antic primer" }, "last_activity_at_desc": { - "TEXT": "Last activity: Newest first" + "TEXT": "Última activitat: La més nova primer" }, "created_at_desc": { "TEXT": "Created at: Newest first" @@ -99,15 +99,15 @@ }, "CHAT_SORT_BY_FILTER": { "TITLE": "Sort conversation", - "DROPDOWN_TITLE": "Sort by", + "DROPDOWN_TITLE": "Ordenat per", "ITEMS": { "LATEST": { "NAME": "Last activity at", "LABEL": "Last activity" }, "CREATED_AT": { - "NAME": "Created at", - "LABEL": "Created at" + "NAME": "Creat per", + "LABEL": "Creat per" }, "LAST_USER_MESSAGE_AT": { "NAME": "Last user message at", diff --git a/app/javascript/dashboard/i18n/locale/ca/contact.json b/app/javascript/dashboard/i18n/locale/ca/contact.json index 1ccb8ee10..7ba57c201 100644 --- a/app/javascript/dashboard/i18n/locale/ca/contact.json +++ b/app/javascript/dashboard/i18n/locale/ca/contact.json @@ -15,7 +15,7 @@ "INITIATED_FROM": "Iniciada des de", "INITIATED_AT": "Iniciada a les", "IP_ADDRESS": "Adreça IP", - "CREATED_AT_LABEL": "Created", + "CREATED_AT_LABEL": "Creat", "NEW_MESSAGE": "Nou missatge", "CONVERSATIONS": { "NO_RECORDS_FOUND": "No hi han converses prèvies associades a aquest contacte.", @@ -49,7 +49,7 @@ "CUSTOM_ATTRIBUTES": "Atributs personalitzats", "CONTACT_LABELS": "Etiquetes de contactes", "PREVIOUS_CONVERSATIONS": "Converses prèvies", - "NO_RECORDS_FOUND": "No attributes found" + "NO_RECORDS_FOUND": "No s'han trobat atributs" } }, "EDIT_CONTACT": { @@ -76,16 +76,17 @@ "ERROR_MESSAGE": "S'ha produït un error; tornau-ho a provar" }, "EXPORT_CONTACTS": { - "BUTTON_LABEL": "Export", - "TITLE": "Export Contacts", - "DESC": "Export contacts to a CSV file.", + "BUTTON_LABEL": "Exporta", + "TITLE": "Exporta contactes", + "DESC": "Exporta contactes a través d'un fitxer CSV.", "SUCCESS_MESSAGE": "Export is in progress, You will be notified via email when export file is ready to dowanlod.", "ERROR_MESSAGE": "S'ha produït un error; tornau-ho a provar", "CONFIRM": { - "TITLE": "Export Contacts", - "MESSAGE": "Are you sure you want to export all contacts?", - "YES": "Yes, Export", - "NO": "No, Cancel" + "TITLE": "Exporta contactes", + "MESSAGE": "Esteu segur que voleu exportar tots els contactes?", + "FILTERED_MESSAGE": "Esteu segur que voleu exportar tots els contactes filtrats?", + "YES": "Sí, Exporta", + "NO": "No, cancel·la" } }, "DELETE_NOTE": { @@ -151,13 +152,13 @@ "COUNTRY": { "PLACEHOLDER": "Enter the country name", "LABEL": "Nom del país", - "SELECT_PLACEHOLDER": "Select", + "SELECT_PLACEHOLDER": "Selecciona", "REMOVE": "Suprimeix", - "SELECT_COUNTRY": "Select Country" + "SELECT_COUNTRY": "Selecciona país" }, "CITY": { - "PLACEHOLDER": "Enter the city name", - "LABEL": "City Name" + "PLACEHOLDER": "Introdueix el nom de la ciutat", + "LABEL": "Nom de la ciutat" }, "SOCIAL_PROFILES": { "FACEBOOK": { @@ -180,8 +181,8 @@ }, "DELETE_AVATAR": { "API": { - "SUCCESS_MESSAGE": "Contact avatar deleted successfully", - "ERROR_MESSAGE": "Could not delete the contact avatar. Please try again later." + "SUCCESS_MESSAGE": "L'avatar del contacte s'ha suprimit correctament", + "ERROR_MESSAGE": "No s'ha pogut esborrar l'avatar de contacte. Torneu-ho a provar." } }, "SUCCESS_MESSAGE": "Contacte guardat correctament", @@ -190,30 +191,30 @@ "NEW_CONVERSATION": { "BUTTON_LABEL": "Inicia la conversa", "TITLE": "Nova conversació", - "DESC": "Start a new conversation by sending a new message.", + "DESC": "Inicia una conversa nova enviant un missatge nou.", "NO_INBOX": "Couldn't find an inbox to initiate a new conversation with this contact.", "FORM": { "TO": { - "LABEL": "To" + "LABEL": "Per" }, "INBOX": { "LABEL": "Inbox", - "PLACEHOLDER": "Choose source inbox", + "PLACEHOLDER": "Trieu la safata d'entrada d'origen", "ERROR": "Select an inbox" }, "SUBJECT": { - "LABEL": "Subject", - "PLACEHOLDER": "Subject", + "LABEL": "Assumpte", + "PLACEHOLDER": "Assumpte", "ERROR": "Subject can't be empty" }, "MESSAGE": { "LABEL": "Missatge", "PLACEHOLDER": "Write your message here", - "ERROR": "Message can't be empty" + "ERROR": "El missatge no pot estar buit" }, "ATTACHMENTS": { - "SELECT": "Choose files", - "HELP_TEXT": "Drag and drop files here or choose files to attach" + "SELECT": "Trieu fitxers", + "HELP_TEXT": "Arrossegueu i deixeu anar fitxers aquí o trieu fitxers per adjuntar" }, "SUBMIT": "Send message", "CANCEL": "Cancel·la", @@ -227,10 +228,10 @@ "FIELDS": "Contact fields", "SEARCH_BUTTON": "Cercar", "SEARCH_INPUT_PLACEHOLDER": "Cerca de contactes", - "FILTER_CONTACTS": "Filter", - "FILTER_CONTACTS_SAVE": "Save filter", - "FILTER_CONTACTS_DELETE": "Delete filter", - "FILTER_CONTACTS_EDIT": "Edit segment", + "FILTER_CONTACTS": "Filtre", + "FILTER_CONTACTS_SAVE": "Desa el filtre", + "FILTER_CONTACTS_DELETE": "Suprimir el filtre", + "FILTER_CONTACTS_EDIT": "Edita segment", "LIST": { "LOADING_MESSAGE": "Carregant contactes...", "404": "No hi ha cap contacte que coincideixi amb la vostra cerca 🔍", @@ -241,8 +242,8 @@ "CONVERSATIONS": "Converses", "LAST_ACTIVITY": "Last Activity", "CREATED_AT": "Created At", - "COUNTRY": "Country", - "CITY": "City", + "COUNTRY": "País", + "CITY": "Ciutat", "SOCIAL_PROFILES": "Social Profiles", "COMPANY": "Companyia", "EMAIL_ADDRESS": "Adreça de correu electrònic" @@ -256,93 +257,93 @@ }, "REMINDER": { "ADD_BUTTON": { - "BUTTON": "Add", - "TITLE": "Shift + Enter to create a task" + "BUTTON": "Afegir", + "TITLE": "Shift + Enter per crear una tasca" }, "FOOTER": { - "DUE_DATE": "Due date", - "LABEL_TITLE": "Set type" + "DUE_DATE": "Data de venciment", + "LABEL_TITLE": "Establir tipus" } }, "NOTES": { - "FETCHING_NOTES": "Fetching notes...", + "FETCHING_NOTES": "S'estan obtenint notes...", "NOT_AVAILABLE": "There are no notes created for this contact", "HEADER": { "TITLE": "Notes" }, "LIST": { - "LABEL": "added a note" + "LABEL": "afegeix una nota" }, "ADD": { - "BUTTON": "Add", - "PLACEHOLDER": "Add a note", - "TITLE": "Shift + Enter to create a note" + "BUTTON": "Afegir", + "PLACEHOLDER": "Afegeix una nota", + "TITLE": "Shift + Enter per crear una nota" }, "CONTENT_HEADER": { - "DELETE": "Delete note" + "DELETE": "Suprimeix la nota" } }, "EVENTS": { "HEADER": { - "TITLE": "Activities" + "TITLE": "Activitats" }, "BUTTON": { "PILL_BUTTON_NOTES": "notes", - "PILL_BUTTON_EVENTS": "events", + "PILL_BUTTON_EVENTS": "esdeveniment", "PILL_BUTTON_CONVO": "converses" } }, "CUSTOM_ATTRIBUTES": { - "ADD_BUTTON_TEXT": "Add attributes", - "BUTTON": "Add custom attribute", - "NOT_AVAILABLE": "There are no custom attributes available for this contact.", + "ADD_BUTTON_TEXT": "Afegir atributs", + "BUTTON": "Afegir atributs personalitzats", + "NOT_AVAILABLE": "No hi ha atributs personalitzats disponibles per a aquest contacte.", "COPY_SUCCESSFUL": "S'ha copiat al porta-retalls amb èxit", - "SHOW_MORE": "Show all attributes", - "SHOW_LESS": "Show less attributes", + "SHOW_MORE": "Mostra tots els atributs", + "SHOW_LESS": "Mostra menys atributs", "ACTIONS": { - "COPY": "Copy attribute", - "DELETE": "Delete attribute", - "EDIT": "Edit attribute" + "COPY": "Copia l'atribut", + "DELETE": "Suprimeix l'atribut", + "EDIT": "Edita l'atribut" }, "ADD": { - "TITLE": "Create custom attribute", - "DESC": "Add custom information to this contact." + "TITLE": "Crear atribut personalitzat", + "DESC": "Afegeix informació personalitzada a aquest contacte." }, "FORM": { - "CREATE": "Add attribute", + "CREATE": "Afegir atribut", "CANCEL": "Cancel·la", "NAME": { - "LABEL": "Custom attribute name", - "PLACEHOLDER": "Eg: shopify id", - "ERROR": "Invalid custom attribute name" + "LABEL": "Personalitza el nom de l'atribut", + "PLACEHOLDER": "P. ex.: identificador de Shopify", + "ERROR": "El nom de l'atribut personalitzat no és vàlid" }, "VALUE": { "LABEL": "Attribute value", "PLACEHOLDER": "Eg: 11901 " }, "ADD": { - "TITLE": "Create new attribute ", - "SUCCESS": "Attribute added successfully", - "ERROR": "Unable to add attribute. Please try again later" + "TITLE": "Crear nou atribut ", + "SUCCESS": "Atribut afegit correctament", + "ERROR": "No es pot afegir l'atribut. Si us plau, intenta-ho més tard" }, "UPDATE": { - "SUCCESS": "Attribute updated successfully", - "ERROR": "Unable to update attribute. Please try again later" + "SUCCESS": "Atribut actualitzat correctament", + "ERROR": "No es pot actualitzar l'atribut. Si us plau, intenta-ho més tard" }, "DELETE": { - "SUCCESS": "Attribute deleted successfully", - "ERROR": "Unable to delete attribute. Please try again later" + "SUCCESS": "Atribut esborrat correctament", + "ERROR": "No es pot esborrar l'atribut. Si us plau, intenta-ho més tard" }, "ATTRIBUTE_SELECT": { - "TITLE": "Add attributes", - "PLACEHOLDER": "Search attributes", - "NO_RESULT": "No attributes found" + "TITLE": "Afegir atributs", + "PLACEHOLDER": "Cerca atributs", + "NO_RESULT": "No s'han trobat atributs" }, "ATTRIBUTE_TYPE": { "LIST": { - "PLACEHOLDER": "Select value", - "SEARCH_INPUT_PLACEHOLDER": "Search value", - "NO_RESULT": "No result found" + "PLACEHOLDER": "Selecciona valor", + "SEARCH_INPUT_PLACEHOLDER": "Cerca valor", + "NO_RESULT": "No s'ha trobat cap resultat" } } }, @@ -365,7 +366,7 @@ "HELP_LABEL": "To be kept" }, "SUMMARY": { - "TITLE": "Summary", + "TITLE": "Resum", "DELETE_WARNING": "Contact of %{primaryContactName} will be deleted.", "ATTRIBUTE_WARNING": "Contact details of %{primaryContactName} will be copied to %{parentContactName}." }, @@ -373,13 +374,13 @@ "ERROR": "ERROR_MESSAGE" }, "FORM": { - "SUBMIT": " Merge contacts", + "SUBMIT": " Fusiona contactes", "CANCEL": "Cancel·la", "CHILD_CONTACT": { - "ERROR": "Select a child contact to merge" + "ERROR": "Seleccioneu un contacte fill per fusionar" }, - "SUCCESS_MESSAGE": "Contact merged successfully", - "ERROR_MESSAGE": "Could not merge contacts, try again!" + "SUCCESS_MESSAGE": "Contacte fusionat correctament", + "ERROR_MESSAGE": "No s'ha pogut fusionar els contactes, torna-ho a provar!" } } } diff --git a/app/javascript/dashboard/i18n/locale/ca/contactFilters.json b/app/javascript/dashboard/i18n/locale/ca/contactFilters.json index 75c3c44c9..d70dc97d4 100644 --- a/app/javascript/dashboard/i18n/locale/ca/contactFilters.json +++ b/app/javascript/dashboard/i18n/locale/ca/contactFilters.json @@ -28,24 +28,24 @@ "is_not_present": "No és present", "is_greater_than": "És més gran que", "is_lesser_than": "Is lesser than", - "days_before": "Is x days before" + "days_before": "És x dies abans" }, "ATTRIBUTES": { "NAME": "Nom", "EMAIL": "Correu electrònic", "PHONE_NUMBER": "Número de telèfon", "IDENTIFIER": "Identifier", - "CITY": "City", - "COUNTRY": "Country", - "CUSTOM_ATTRIBUTE_LIST": "List", + "CITY": "Ciutat", + "COUNTRY": "País", + "CUSTOM_ATTRIBUTE_LIST": "Llista", "CUSTOM_ATTRIBUTE_TEXT": "Llista", "CUSTOM_ATTRIBUTE_NUMBER": "Número", "CUSTOM_ATTRIBUTE_LINK": "Enllaç", - "CUSTOM_ATTRIBUTE_CHECKBOX": "Checkbox", + "CUSTOM_ATTRIBUTE_CHECKBOX": "Casella de selecció", "CREATED_AT": "Created At", "LAST_ACTIVITY": "Last Activity", "REFERER_LINK": "Referrer link", - "BLOCKED": "Blocked" + "BLOCKED": "Blocat" }, "GROUPS": { "STANDARD_FILTERS": "Standard Filters", diff --git a/app/javascript/dashboard/i18n/locale/ca/conversation.json b/app/javascript/dashboard/i18n/locale/ca/conversation.json index b60206c63..8b1b7e5fa 100644 --- a/app/javascript/dashboard/i18n/locale/ca/conversation.json +++ b/app/javascript/dashboard/i18n/locale/ca/conversation.json @@ -1,11 +1,11 @@ { "CONVERSATION": { "SELECT_A_CONVERSATION": "Si us plau, selecciona una conversa al panell de l’esquerra", - "CSAT_REPLY_MESSAGE": "Please rate the conversation", - "404": "Sorry, we cannot find the conversation. Please try again", - "SWITCH_VIEW_LAYOUT": "Switch the layout", - "DASHBOARD_APP_TAB_MESSAGES": "Messages", - "UNVERIFIED_SESSION": "The identity of this user is not verified", + "CSAT_REPLY_MESSAGE": "Si us plau, valoreu la conversa", + "404": "Ho sentim, no podem trobar la conversa. Torneu-ho a provar", + "SWITCH_VIEW_LAYOUT": "Canvia el disseny", + "DASHBOARD_APP_TAB_MESSAGES": "Missatges", + "UNVERIFIED_SESSION": "La identitat d'aquest usuari no està verificada", "NO_MESSAGE_1": "Uh oh! Sembla que no hi ha missatges de clients a la safata d'entrada.", "NO_MESSAGE_2": " per enviar un missatge a la vostra pàgina!", "NO_INBOX_1": "Hola! Sembla que encara no heu afegit cap safata d'entrada.", @@ -13,15 +13,15 @@ "NO_INBOX_AGENT": "Uh Oh! Sembla que no ets a cap safata d'entrada. Si us plau, poseu-vos en contacte amb l'administrador", "SEARCH_MESSAGES": "Cerca missatges a les converses", "EMPTY_STATE": { - "CMD_BAR": "to open command menu", - "KEYBOARD_SHORTCUTS": "to view keyboard shortcuts" + "CMD_BAR": "per obrir el menú d'ordres", + "KEYBOARD_SHORTCUTS": "per veure les dreceres del teclat" }, "SEARCH": { "TITLE": "Cerca missatges", - "RESULT_TITLE": "Search Results", + "RESULT_TITLE": "Resultats de la cerca", "LOADING_MESSAGE": "S'estan restringint les dades...", "PLACEHOLDER": "Escriu qualsevol text per cercar missatges", - "NO_MATCHING_RESULTS": "No results found." + "NO_MATCHING_RESULTS": "No s'han trobat resultats." }, "UNREAD_MESSAGES": "Missatges no Llegits", "UNREAD_MESSAGE": "Missatge no Llegit", @@ -30,15 +30,15 @@ "LOADING_CONVERSATIONS": "S'estan carregant les converses", "CANNOT_REPLY": "No pots respondre degut a", "24_HOURS_WINDOW": "Restricció de finestra de missatges de 24 hores", - "NOT_ASSIGNED_TO_YOU": "This conversation is not assigned to you. Would you like to assign this conversation to yourself?", - "ASSIGN_TO_ME": "Assign to me", - "TWILIO_WHATSAPP_CAN_REPLY": "You can only reply to this conversation using a template message due to", + "NOT_ASSIGNED_TO_YOU": "Aquesta conversa no està assignada a tu. Vols assignar-te-la?", + "ASSIGN_TO_ME": "Assigna'm", + "TWILIO_WHATSAPP_CAN_REPLY": "Només pots respondre a aquesta conversa mitjançant una plantilla de missatge a causa de", "TWILIO_WHATSAPP_24_HOURS_WINDOW": "Restricció de finestra de missatges de 24 hores", "REPLYING_TO": "Estas responent a:", "REMOVE_SELECTION": "Elimina la selecció", "DOWNLOAD": "Descarrega", - "UNKNOWN_FILE_TYPE": "Unknown File", - "SAVE_CONTACT": "Save", + "UNKNOWN_FILE_TYPE": "Fitxer desconegut", + "SAVE_CONTACT": "Desar", "UPLOADING_ATTACHMENTS": "Pujant fitxers adjunts...", "REPLIED_TO_STORY": "Replied to your story", "UNSUPPORTED_MESSAGE": "This message is unsupported.", @@ -89,7 +89,7 @@ "CANCEL": "Cancel·la" }, "PRIORITY": { - "TITLE": "Priority", + "TITLE": "Prioritat", "OPTIONS": { "NONE": "Ningú", "URGENT": "Urgent", @@ -280,29 +280,29 @@ }, "CONVERSATION_CUSTOM_ATTRIBUTES": { "ADD_BUTTON_TEXT": "Create attribute", - "NO_RECORDS_FOUND": "No attributes found", + "NO_RECORDS_FOUND": "No s'han trobat atributs", "UPDATE": { - "SUCCESS": "Attribute updated successfully", - "ERROR": "Unable to update attribute. Please try again later" + "SUCCESS": "Atribut actualitzat correctament", + "ERROR": "No es pot actualitzar l'atribut. Si us plau, intenta-ho més tard" }, "ADD": { - "TITLE": "Add", - "SUCCESS": "Attribute added successfully", - "ERROR": "Unable to add attribute. Please try again later" + "TITLE": "Afegir", + "SUCCESS": "Atribut afegit correctament", + "ERROR": "No es pot afegir l'atribut. Si us plau, intenta-ho més tard" }, "DELETE": { - "SUCCESS": "Attribute deleted successfully", - "ERROR": "Unable to delete attribute. Please try again later" + "SUCCESS": "Atribut esborrat correctament", + "ERROR": "No es pot esborrar l'atribut. Si us plau, intenta-ho més tard" }, "ATTRIBUTE_SELECT": { - "TITLE": "Add attributes", - "PLACEHOLDER": "Search attributes", - "NO_RESULT": "No attributes found" + "TITLE": "Afegir atributs", + "PLACEHOLDER": "Cerca atributs", + "NO_RESULT": "No s'han trobat atributs" } }, "EMAIL_HEADER": { "FROM": "From", - "TO": "To", + "TO": "Per", "BCC": "Bcc", "CC": "Cc", "SUBJECT": "Subject" diff --git a/app/javascript/dashboard/i18n/locale/ca/emoji.json b/app/javascript/dashboard/i18n/locale/ca/emoji.json index f89f088b6..4da107aac 100644 --- a/app/javascript/dashboard/i18n/locale/ca/emoji.json +++ b/app/javascript/dashboard/i18n/locale/ca/emoji.json @@ -1,7 +1,7 @@ { "EMOJI": { - "PLACEHOLDER": "Search emojis", - "NOT_FOUND": "No emoji match your search", + "PLACEHOLDER": "Cerca emojis", + "NOT_FOUND": "Cap emoji coincideix amb la teva cerca", "REMOVE": "Suprimeix" } } diff --git a/app/javascript/dashboard/i18n/locale/ca/general.json b/app/javascript/dashboard/i18n/locale/ca/general.json index 25bb4dfb7..c67a5f9e7 100644 --- a/app/javascript/dashboard/i18n/locale/ca/general.json +++ b/app/javascript/dashboard/i18n/locale/ca/general.json @@ -1,5 +1,5 @@ { "GENERAL": { - "SHOWING_RESULTS": "Showing {firstIndex}-{lastIndex} of {totalCount} items" + "SHOWING_RESULTS": "Es mostren {firstIndex}-{lastIndex} de {totalCount} elements" } } diff --git a/app/javascript/dashboard/i18n/locale/ca/generalSettings.json b/app/javascript/dashboard/i18n/locale/ca/generalSettings.json index 77b60aa94..b1717a408 100644 --- a/app/javascript/dashboard/i18n/locale/ca/generalSettings.json +++ b/app/javascript/dashboard/i18n/locale/ca/generalSettings.json @@ -3,7 +3,7 @@ "TITLE": "Configuració del compte", "SUBMIT": "Actualització de la configuració", "BACK": "Enrere", - "DISMISS": "Dismiss", + "DISMISS": "Descartar", "UPDATE": { "ERROR": "No s'ha pogut actualitzar la configuració, torna-ho a provar!", "SUCCESS": "La configuració del compte s'ha actualitzat correctament" @@ -15,8 +15,8 @@ "NOTE": "" }, "ACCOUNT_ID": { - "TITLE": "Account ID", - "NOTE": "This ID is required if you are building an API based integration" + "TITLE": "ID del compte", + "NOTE": "Aquest identificador és necessari si esteu creant una integració basada en API" }, "NAME": { "LABEL": "Nom del compte", @@ -24,7 +24,7 @@ "ERROR": "Introduïu un nom de compte vàlid" }, "LANGUAGE": { - "LABEL": "Site language", + "LABEL": "Idioma del lloc", "PLACEHOLDER": "El nom del vostre compte", "ERROR": "" }, @@ -41,7 +41,7 @@ "AUTO_RESOLVE_DURATION": { "LABEL": "El nombre de dies després que un ticket es resolgui automàticament si no hi ha activitat", "PLACEHOLDER": "30", - "ERROR": "Please enter a valid auto resolve duration (minimum 1 day and maximum 999 days)" + "ERROR": "Introduïu una durada de resolució automàtica vàlida (mínim 1 dia i màxim 999 dies)" }, "FEATURES": { "INBOUND_EMAIL_ENABLED": "La continuïtat de converses amb correus electrònics està habilitada per al vostre compte.", @@ -49,8 +49,8 @@ } }, "UPDATE_CHATWOOT": "L'actualització %{latestChatwootVersion} per Chatwoot està disponible. Si us plau, actualitza l'instancia.", - "LEARN_MORE": "Learn more", - "PAYMENT_PENDING": "Your payment is pending. Please update your payment information to continue using Chatwoot", + "LEARN_MORE": "Aprèn més", + "PAYMENT_PENDING": "El teu pagament està pendent. Actualitzeu la vostra informació de pagament per continuar utilitzant Chatwoot", "LIMITS_UPGRADE": "Your account has exceeded the usage limits, please upgrade your plan to continue using Chatwoot", "OPEN_BILLING": "Open billing" }, @@ -107,6 +107,7 @@ "GENERAL": "General", "REPORTS": "Informes", "CONVERSATION": "Conversation", + "BULK_ACTIONS": "Bulk Actions", "CHANGE_ASSIGNEE": "Change Assignee", "CHANGE_PRIORITY": "Change Priority", "CHANGE_TEAM": "Change Team", diff --git a/app/javascript/dashboard/i18n/locale/ca/helpCenter.json b/app/javascript/dashboard/i18n/locale/ca/helpCenter.json index 232cf9424..a387032ed 100644 --- a/app/javascript/dashboard/i18n/locale/ca/helpCenter.json +++ b/app/javascript/dashboard/i18n/locale/ca/helpCenter.json @@ -460,7 +460,7 @@ "DESCRIPTION": "Create user-friendly self-service portals. Help your users to access the articles and get support 24/7. Upgrade your subscription to enable this feature.", "SELF_HOSTED_DESCRIPTION": "Create user-friendly self-service portals. Help your users to access the articles and get support 24/7. Please contact your administrator to enable this feature.", "BUTTON": { - "LEARN_MORE": "Learn more", + "LEARN_MORE": "Aprèn més", "UPGRADE": "Upgrade" }, "FEATURES": { diff --git a/app/javascript/dashboard/i18n/locale/ca/inbox.json b/app/javascript/dashboard/i18n/locale/ca/inbox.json index d7311ebdd..56c87c266 100644 --- a/app/javascript/dashboard/i18n/locale/ca/inbox.json +++ b/app/javascript/dashboard/i18n/locale/ca/inbox.json @@ -42,7 +42,7 @@ "SORT_OPTIONS": { "NEWEST": "Newest", "OLDEST": "Oldest", - "PRIORITY": "Priority" + "PRIORITY": "Prioritat" }, "DISPLAY_OPTIONS": { "SNOOZED": "Posposat", diff --git a/app/javascript/dashboard/i18n/locale/ca/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ca/inboxMgmt.json index e1ba4025e..785818757 100644 --- a/app/javascript/dashboard/i18n/locale/ca/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/ca/inboxMgmt.json @@ -83,7 +83,7 @@ }, "CHANNEL_GREETING_TOGGLE": { "LABEL": "Activa la salutació del canal", - "HELP_TEXT": "Automatically send a greeting message when a new conversation is created.", + "HELP_TEXT": "Envia automàticament missatges de salutació quan els clients inicien una conversa i envien el seu primer missatge.", "ENABLED": "Habilita", "DISABLED": "Inhabilita" }, @@ -169,7 +169,7 @@ }, "BANDWIDTH": { "ACCOUNT_ID": { - "LABEL": "Account ID", + "LABEL": "ID del compte", "PLACEHOLDER": "Please enter your Bandwidth Account ID", "ERROR": "Aquest camp és obligatori" }, @@ -340,7 +340,7 @@ }, "AUTH": { "TITLE": "Choose a 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." + "DESC": "Chatwoot admet widgets de xat en directe, Facebook Messenger, WhatsApp, correus electrònics, etc., com a canals. Si voleu crear un canal personalitzat, podeu crear-lo mitjançant el canal API. Per començar, tria un dels canals següents." }, "AGENTS": { "TITLE": "Agents", @@ -420,7 +420,7 @@ "BUSINESS_NAME": { "BUTTON_TEXT": "+ Configure your business name", "PLACEHOLDER": "Enter your business name", - "SAVE_BUTTON_TEXT": "Save" + "SAVE_BUTTON_TEXT": "Desar" } }, "ALLOW_MESSAGES_AFTER_RESOLVED": { diff --git a/app/javascript/dashboard/i18n/locale/ca/integrations.json b/app/javascript/dashboard/i18n/locale/ca/integrations.json index 1be0b5cbc..f732cb103 100644 --- a/app/javascript/dashboard/i18n/locale/ca/integrations.json +++ b/app/javascript/dashboard/i18n/locale/ca/integrations.json @@ -68,7 +68,7 @@ "TITLE": "Confirma l'esborrat", "MESSAGE": "Are you sure to delete the webhook? (%{webhookURL})", "YES": "Si, esborra ", - "NO": "No, manten-la" + "NO": "No, mantén-la" } } }, @@ -79,8 +79,8 @@ "MESSAGE": "Are you sure you want to delete the integration? Doing so will result in the loss of access to conversations on your Slack workspace." }, "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.
", + "TITLE": "Com utilitzar la integració de Slack?", + "BODY": "Amb aquesta integració, totes les teves converses entrants se sincronitzaran amb el canal ***%{selectedChannelName}*** del teu espai de treball de Slack. Podeu gestionar totes les converses dels vostres clients directament des del canal i no perdreu cap missatge.\n\nAquestes són les principals característiques de la integració:\n\n**Respondre a converses des de Slack:** Per respondre a una conversa al ***%{selectedChannelName}*** canal de Slack, només has d'escriure el teu missatge i enviar-lo com a fil. Això crearà una resposta al client mitjançant Chatwoot. Així de senzill!\n\n **Crear notes privades:** si vols crear notes privades en lloc de respostes, comença el teu missatge amb ***`nota:`***. Això garanteix que el vostre missatge es mantingui privat i no serà visible per al client.\n\n**Associar un perfil d'agent:** si la persona que va respondre a Slack té un perfil d'agent a Chatwoot amb el mateix correu electrònic, les respostes s'associaran amb aquest perfil d'agent automàticament. Això vol dir que podeu fer un seguiment fàcilment qui va dir què i quan. D'altra banda, quan el contestador no té un perfil d'agent associat, les respostes apareixeran des del perfil del bot al client.", "SELECTED": "selected" }, "SELECT_CHANNEL": { @@ -131,7 +131,7 @@ "KEY_PLACEHOLDER": "Enter your OpenAI API key", "BUTTONS": { "NEED_HELP": "Need help?", - "DISMISS": "Dismiss", + "DISMISS": "Descartar", "FINISH": "Finish Setup" }, "DISMISS_MESSAGE": "You can setup OpenAI integration later Whenever you want.", diff --git a/app/javascript/dashboard/i18n/locale/ca/labelsMgmt.json b/app/javascript/dashboard/i18n/locale/ca/labelsMgmt.json index 12c66de11..b197e8814 100644 --- a/app/javascript/dashboard/i18n/locale/ca/labelsMgmt.json +++ b/app/javascript/dashboard/i18n/locale/ca/labelsMgmt.json @@ -46,7 +46,7 @@ "DISMISS": "Dismiss suggestion" }, "POWERED_BY": "Chatwoot AI", - "DISMISS": "Dismiss", + "DISMISS": "Descartar", "ADD_SELECTED_LABELS": "Add selected labels", "ADD_SELECTED_LABEL": "Add selected label", "ADD_ALL_LABELS": "Add all labels" diff --git a/app/javascript/dashboard/i18n/locale/ca/login.json b/app/javascript/dashboard/i18n/locale/ca/login.json index 787445e5b..f7892513a 100644 --- a/app/javascript/dashboard/i18n/locale/ca/login.json +++ b/app/javascript/dashboard/i18n/locale/ca/login.json @@ -3,7 +3,7 @@ "TITLE": "Entra a Chatwoot", "EMAIL": { "LABEL": "Correu electrònic", - "PLACEHOLDER": "Correu electrònic p.e.: someone@exemple.com", + "PLACEHOLDER": "exemple@nomdelacompanyia.com", "ERROR": "Introduïu una adreça de correu electrònic vàlida" }, "PASSWORD": { @@ -16,9 +16,9 @@ "UNAUTH": "Nom d'usuari / contrasenya incorrecte. Torna-ho a provar-ho" }, "OAUTH": { - "GOOGLE_LOGIN": "Login with Google", - "BUSINESS_ACCOUNTS_ONLY": "Please use your company email address to login", - "NO_ACCOUNT_FOUND": "We couldn't find an account for your email address." + "GOOGLE_LOGIN": "Inicieu sessió amb Google", + "BUSINESS_ACCOUNTS_ONLY": "Si us plau, utilitzeu l'adreça de correu electrònic de la vostra empresa per iniciar sessió", + "NO_ACCOUNT_FOUND": "No hem trobat cap compte per a la vostra adreça de correu electrònic." }, "FORGOT_PASSWORD": "Has oblidat la contrasenya?", "CREATE_NEW_ACCOUNT": "Crear un nou compte", diff --git a/app/javascript/dashboard/i18n/locale/ca/report.json b/app/javascript/dashboard/i18n/locale/ca/report.json index 73dbc655e..0817e4562 100644 --- a/app/javascript/dashboard/i18n/locale/ca/report.json +++ b/app/javascript/dashboard/i18n/locale/ca/report.json @@ -92,7 +92,7 @@ "DAY": "Day", "WEEK": "Week", "MONTH": "Month", - "YEAR": "Month" + "YEAR": "Any" }, "GROUP_BY_DAY_OPTIONS": [ { @@ -140,7 +140,7 @@ ], "BUSINESS_HOURS": "Business Hours", "FILTER_ACTIONS": { - "CLEAR_FILTER": "Clear filter", + "CLEAR_FILTER": "Esborra els filtres", "EMPTY_LIST": "No s'ha trobat agents" } }, @@ -232,7 +232,7 @@ }, "FIRST_RESPONSE_TIME": { "NAME": "First Response Time", - "DESC": "( Promig )", + "DESC": "(Mitjana)", "INFO_TEXT": "Total number of conversations used for computation:", "TOOLTIP_TEXT": "First Response Time is %{metricValue} (based on %{conversationCount} conversations)" }, @@ -511,52 +511,52 @@ "SATURDAY": "Saturday" }, "SLA_REPORTS": { - "HEADER": "SLA Reports", - "NO_RECORDS": "SLA applied conversations are not available.", - "LOADING": "Loading SLA data...", - "DOWNLOAD_SLA_REPORTS": "Download SLA reports", - "DOWNLOAD_FAILED": "Failed to download SLA Reports", + "HEADER": "Informes SLA", + "NO_RECORDS": "Les converses aplicades per l'SLA no estan disponibles.", + "LOADING": "S'estan carregant dades del SLA...", + "DOWNLOAD_SLA_REPORTS": "Descarregar informes SLA", + "DOWNLOAD_FAILED": "No s'han pogut baixar els informes SLA", "DROPDOWN": { - "ADD_FIlTER": "Add filter", - "CLEAR_ALL": "Clear all", - "CLEAR_FILTER": "Clear filter", + "ADD_FIlTER": "Afegeix un filtre", + "CLEAR_ALL": "Esborrar tot", + "CLEAR_FILTER": "Esborra els filtres", "EMPTY_LIST": "No s'ha trobat agents", - "NO_FILTER": "No filters available", - "SEARCH": "Search filter", + "NO_FILTER": "No hi ha filtres disponibles", + "SEARCH": "Cerca filtre", "INPUT_PLACEHOLDER": { - "SLA": "SLA name", - "AGENTS": "Agent name", - "INBOXES": "Inbox name", + "SLA": "Nom del SLA", + "AGENTS": "Nom de l'Agent", + "INBOXES": "Nom de la safata d'entrada", "LABELS": "Nom de l'etiqueta", - "TEAMS": "Team name" + "TEAMS": "Nom de l'equip" }, - "SLA": "SLA Policy", - "INBOXES": "Inbox", + "SLA": "Política SLA", + "INBOXES": "Safata d'entrada", "AGENTS": "Agent", - "LABELS": "Label", - "TEAMS": "Team" + "LABELS": "Etiqueta", + "TEAMS": "Equip" }, "METRICS": { "HIT_RATE": { - "LABEL": "Hit Rate", - "TOOLTIP": "Percentage of SLAs created were completed successfully" + "LABEL": "Proporció d'encerts", + "TOOLTIP": "El percentatge de SLA creats s'ha completat correctament" }, "NO_OF_MISSES": { - "LABEL": "Number of Misses", - "TOOLTIP": "Total SLA misses in a certain period" + "LABEL": "Nombre de faltes", + "TOOLTIP": "SLA total faltes en un període determinat" }, "NO_OF_CONVERSATIONS": { - "LABEL": "Number of Conversations", - "TOOLTIP": "Total number of conversations with SLA" + "LABEL": "Número de Converses", + "TOOLTIP": "Nombre total de converses amb SLA" } }, "TABLE": { "HEADER": { - "POLICY": "Policy", - "CONVERSATION": "Conversation", + "POLICY": "Política", + "CONVERSATION": "Converses", "AGENT": "Agent" }, - "VIEW_DETAILS": "View Details" + "VIEW_DETAILS": "Veure Detalls" } } } diff --git a/app/javascript/dashboard/i18n/locale/ca/search.json b/app/javascript/dashboard/i18n/locale/ca/search.json index a114145ee..ba89f20ec 100644 --- a/app/javascript/dashboard/i18n/locale/ca/search.json +++ b/app/javascript/dashboard/i18n/locale/ca/search.json @@ -4,12 +4,12 @@ "ALL": "Totes", "CONTACTS": "Contactes", "CONVERSATIONS": "Converses", - "MESSAGES": "Messages" + "MESSAGES": "Missatges" }, "SECTION": { "CONTACTS": "Contactes", "CONVERSATIONS": "Converses", - "MESSAGES": "Messages" + "MESSAGES": "Missatges" }, "EMPTY_STATE": "No %{item} found for query '%{query}'", "EMPTY_STATE_FULL": "No results found for query '%{query}'", diff --git a/app/javascript/dashboard/i18n/locale/ca/settings.json b/app/javascript/dashboard/i18n/locale/ca/settings.json index f2c60fbd8..3c5009512 100644 --- a/app/javascript/dashboard/i18n/locale/ca/settings.json +++ b/app/javascript/dashboard/i18n/locale/ca/settings.json @@ -91,9 +91,9 @@ "CONVERSATION_MENTION": "Enviar notificacions per mail quan siguis esmentat en una conversació", "ASSIGNED_CONVERSATION_NEW_MESSAGE": "Envia notificacions per correu electrònic quan es creï un missatge nou en una conversa assignada", "PARTICIPATING_CONVERSATION_NEW_MESSAGE": "Send email notifications when a new message is created in a participating conversation", - "SLA_MISSED_FIRST_RESPONSE": "Send email notifications when a conversation misses first response SLA", - "SLA_MISSED_NEXT_RESPONSE": "Send email notifications when a conversation misses next response SLA", - "SLA_MISSED_RESOLUTION": "Send email notifications when a conversation misses resolution SLA" + "SLA_MISSED_FIRST_RESPONSE": "Envia notificacions per correu electrònic quan una conversa no compleixi un SLA de primera resposta", + "SLA_MISSED_NEXT_RESPONSE": "Envia notificacions per correu electrònic quan una conversa es perdi la següent resposta SLA", + "SLA_MISSED_RESOLUTION": "Envia notificacions per correu electrònic quan una conversa no resol un SLA" }, "NOTIFICATIONS": { "TITLE": "Notification preferences", @@ -109,7 +109,8 @@ "SLA_MISSED_FIRST_RESPONSE": "A conversation misses first response SLA", "SLA_MISSED_NEXT_RESPONSE": "A conversation misses next response SLA", "SLA_MISSED_RESOLUTION": "A conversation misses resolution SLA" - } + }, + "BROWSER_PERMISSION": "Enable push notifications for your browser so you’re able to receive them" }, "API": { "UPDATE_SUCCESS": "Les teves preferències de notificació s’han actualitzat correctament", @@ -125,9 +126,9 @@ "PARTICIPATING_CONVERSATION_NEW_MESSAGE": "Send push notifications when a new message is created in a participating conversation", "HAS_ENABLED_PUSH": "Heu activat les notificacions per a aquest navegador.", "REQUEST_PUSH": "Activa les notificacions", - "SLA_MISSED_FIRST_RESPONSE": "Send push notifications when a conversation misses first response SLA", - "SLA_MISSED_NEXT_RESPONSE": "Send push notifications when a conversation misses next response SLA", - "SLA_MISSED_RESOLUTION": "Send push notifications when a conversation misses resolution SLA" + "SLA_MISSED_FIRST_RESPONSE": "Envia notificacions automàtiques quan una conversa no tingui un SLA de primera resposta", + "SLA_MISSED_NEXT_RESPONSE": "Envia notificacions automàtiques quan una conversa no s'aconsegueixi la següent resposta SLA", + "SLA_MISSED_RESOLUTION": "Envia notificacions quan una conversa no resol el SLA" }, "PROFILE_IMAGE": { "LABEL": "Imatge del Perfil" diff --git a/app/javascript/dashboard/i18n/locale/ca/signup.json b/app/javascript/dashboard/i18n/locale/ca/signup.json index 16dead7a5..e0ce2abae 100644 --- a/app/javascript/dashboard/i18n/locale/ca/signup.json +++ b/app/javascript/dashboard/i18n/locale/ca/signup.json @@ -11,7 +11,7 @@ "COMPANY_NAME": { "LABEL": "Company name", "PLACEHOLDER": "Enter your company name. eg: Wayne Enterprises", - "ERROR": "Company name is too short" + "ERROR": "El nom de l'empresa és massa curt." }, "FULL_NAME": { "LABEL": "Nom complet", @@ -20,7 +20,7 @@ }, "EMAIL": { "LABEL": "Email de treball", - "PLACEHOLDER": "Introdueix la teva adreça email de treball. ex: bruce@wayne.enterprises", + "PLACEHOLDER": "Introdueix la teva adreça de correu electrònica de la feina. P. ex.: bruce@wayne.enterprises", "ERROR": "Please enter a valid work email address" }, "PASSWORD": { @@ -32,7 +32,7 @@ "CONFIRM_PASSWORD": { "LABEL": "Confirma la contrasenya", "PLACEHOLDER": "Confirma la contrasenya", - "ERROR": "Les contrasenyes no coincideixen" + "ERROR": "La contrasenya no coincideix." }, "API": { "SUCCESS_MESSAGE": "Registrat correctament", diff --git a/app/javascript/dashboard/i18n/locale/ca/sla.json b/app/javascript/dashboard/i18n/locale/ca/sla.json index 73d977c22..3c24b3c5f 100644 --- a/app/javascript/dashboard/i18n/locale/ca/sla.json +++ b/app/javascript/dashboard/i18n/locale/ca/sla.json @@ -1,10 +1,10 @@ { "SLA": { "HEADER": "SLA", - "ADD_ACTION": "Add SLA", - "ADD_ACTION_LONG": "Create a new SLA Policy", - "DESCRIPTION": "Service Level Agreements (SLAs) are contracts that define clear expectations between your team and customers. They establish standards for response and resolution times, creating a framework for accountability and ensures a consistent, high-quality experience.", - "LEARN_MORE": "Learn more about SLA", + "ADD_ACTION": "Afegeix SLA", + "ADD_ACTION_LONG": "Crea una nova política de SLA", + "DESCRIPTION": "Els acords de nivell de servei (SLA) són contractes que defineixen expectatives clares entre el vostre equip i els clients. Estableixen estàndards de temps de resposta i resolució, creen un marc de responsabilitat i garanteixen una experiència coherent i d'alta qualitat.", + "LEARN_MORE": "Més informació sobre SLA", "LOADING": "Fetching SLAs", "PAYWALL": { "TITLE": "Upgrade to create SLAs", @@ -21,10 +21,10 @@ "LIST": { "404": "There are no SLAs available in this account.", "EMPTY": { - "TITLE_1": "Enterprise P0", - "DESC_1": "Issues raised by enterprise customers, that require immediate attention.", - "TITLE_2": "Enterprise P1", - "DESC_2": "Issues raised by enterprise customers, that needs to be acknowledged quickly." + "TITLE_1": "Empresa P0", + "DESC_1": "Problemes plantejats pels clients empresarials, que requereixen atenció immediata.", + "TITLE_2": "Empresa P1", + "DESC_2": "Problemes plantejats pels clients empresarials, que cal reconèixer ràpidament." }, "BUSINESS_HOURS_ON": "Business hours on", "BUSINESS_HOURS_OFF": "Business hours off", @@ -77,7 +77,7 @@ }, "ADD": { "TITLE": "Add SLA", - "DESC": "Friendly promises for great service!", + "DESC": "Promeses amistoses per a un gran servei!", "API": { "SUCCESS_MESSAGE": "SLA added successfully", "ERROR_MESSAGE": "S'ha produït un error; tornau-ho a provar" @@ -97,12 +97,12 @@ } }, "EVENTS": { - "TITLE": "SLA Misses", + "TITLE": "Faltes SLA", "FRT": "Primer temps de resposta", - "NRT": "Next response time", - "RT": "Resolution time", - "SHOW_MORE": "{count} more", - "HIDE": "Hide {count} rows" + "NRT": "Pròxim temps de resposta", + "RT": "Temps de resolució", + "SHOW_MORE": "{count} més", + "HIDE": "Amaga {count} files" } } } \ No newline at end of file diff --git a/app/javascript/dashboard/i18n/locale/cs/bulkActions.json b/app/javascript/dashboard/i18n/locale/cs/bulkActions.json index 081045841..0b6578024 100644 --- a/app/javascript/dashboard/i18n/locale/cs/bulkActions.json +++ b/app/javascript/dashboard/i18n/locale/cs/bulkActions.json @@ -17,7 +17,7 @@ "AGENT_LIST_LOADING": "Načítání agentů", "UPDATE": { "CHANGE_STATUS": "Change status", - "SNOOZE_UNTIL_NEXT_REPLY": "Snooze until next reply.", + "SNOOZE_UNTIL": "Odložit", "UPDATE_SUCCESFUL": "Conversation status updated successfully.", "UPDATE_FAILED": "Failed to update conversations. Please try again." }, diff --git a/app/javascript/dashboard/i18n/locale/cs/contact.json b/app/javascript/dashboard/i18n/locale/cs/contact.json index fa9869c0b..81380a072 100644 --- a/app/javascript/dashboard/i18n/locale/cs/contact.json +++ b/app/javascript/dashboard/i18n/locale/cs/contact.json @@ -84,6 +84,7 @@ "CONFIRM": { "TITLE": "Export Contacts", "MESSAGE": "Are you sure you want to export all contacts?", + "FILTERED_MESSAGE": "Are you sure you want to export all the filtered contacts?", "YES": "Yes, Export", "NO": "No, Cancel" } diff --git a/app/javascript/dashboard/i18n/locale/cs/generalSettings.json b/app/javascript/dashboard/i18n/locale/cs/generalSettings.json index a5614818c..00cf1d19d 100644 --- a/app/javascript/dashboard/i18n/locale/cs/generalSettings.json +++ b/app/javascript/dashboard/i18n/locale/cs/generalSettings.json @@ -107,6 +107,7 @@ "GENERAL": "General", "REPORTS": "Zprávy", "CONVERSATION": "Conversation", + "BULK_ACTIONS": "Bulk Actions", "CHANGE_ASSIGNEE": "Change Assignee", "CHANGE_PRIORITY": "Change Priority", "CHANGE_TEAM": "Change Team", diff --git a/app/javascript/dashboard/i18n/locale/cs/settings.json b/app/javascript/dashboard/i18n/locale/cs/settings.json index 54c0388ff..684133e33 100644 --- a/app/javascript/dashboard/i18n/locale/cs/settings.json +++ b/app/javascript/dashboard/i18n/locale/cs/settings.json @@ -109,7 +109,8 @@ "SLA_MISSED_FIRST_RESPONSE": "A conversation misses first response SLA", "SLA_MISSED_NEXT_RESPONSE": "A conversation misses next response SLA", "SLA_MISSED_RESOLUTION": "A conversation misses resolution SLA" - } + }, + "BROWSER_PERMISSION": "Enable push notifications for your browser so you’re able to receive them" }, "API": { "UPDATE_SUCCESS": "Vaše předvolby oznámení byly úspěšně aktualizovány", diff --git a/app/javascript/dashboard/i18n/locale/da/bulkActions.json b/app/javascript/dashboard/i18n/locale/da/bulkActions.json index 4edc6a89b..4e8644021 100644 --- a/app/javascript/dashboard/i18n/locale/da/bulkActions.json +++ b/app/javascript/dashboard/i18n/locale/da/bulkActions.json @@ -17,7 +17,7 @@ "AGENT_LIST_LOADING": "Indlæser agenter", "UPDATE": { "CHANGE_STATUS": "Skift status", - "SNOOZE_UNTIL_NEXT_REPLY": "Udsæt til næste svar.", + "SNOOZE_UNTIL": "Udsæt", "UPDATE_SUCCESFUL": "Samtalens status blev opdateret.", "UPDATE_FAILED": "Failed to update conversations. Please try again." }, diff --git a/app/javascript/dashboard/i18n/locale/da/contact.json b/app/javascript/dashboard/i18n/locale/da/contact.json index 71efb87b4..a58948f55 100644 --- a/app/javascript/dashboard/i18n/locale/da/contact.json +++ b/app/javascript/dashboard/i18n/locale/da/contact.json @@ -84,6 +84,7 @@ "CONFIRM": { "TITLE": "Export Contacts", "MESSAGE": "Are you sure you want to export all contacts?", + "FILTERED_MESSAGE": "Are you sure you want to export all the filtered contacts?", "YES": "Yes, Export", "NO": "No, Cancel" } diff --git a/app/javascript/dashboard/i18n/locale/da/generalSettings.json b/app/javascript/dashboard/i18n/locale/da/generalSettings.json index f11a95841..01c27c60f 100644 --- a/app/javascript/dashboard/i18n/locale/da/generalSettings.json +++ b/app/javascript/dashboard/i18n/locale/da/generalSettings.json @@ -107,6 +107,7 @@ "GENERAL": "Generelt", "REPORTS": "Rapporter", "CONVERSATION": "Samtale", + "BULK_ACTIONS": "Bulk Actions", "CHANGE_ASSIGNEE": "Skift Modtager", "CHANGE_PRIORITY": "Change Priority", "CHANGE_TEAM": "Skift Team", diff --git a/app/javascript/dashboard/i18n/locale/da/settings.json b/app/javascript/dashboard/i18n/locale/da/settings.json index 792ff30a7..3ca82a299 100644 --- a/app/javascript/dashboard/i18n/locale/da/settings.json +++ b/app/javascript/dashboard/i18n/locale/da/settings.json @@ -109,7 +109,8 @@ "SLA_MISSED_FIRST_RESPONSE": "A conversation misses first response SLA", "SLA_MISSED_NEXT_RESPONSE": "A conversation misses next response SLA", "SLA_MISSED_RESOLUTION": "A conversation misses resolution SLA" - } + }, + "BROWSER_PERMISSION": "Enable push notifications for your browser so you’re able to receive them" }, "API": { "UPDATE_SUCCESS": "Dine notifikationsindstillinger er opdateret", diff --git a/app/javascript/dashboard/i18n/locale/de/bulkActions.json b/app/javascript/dashboard/i18n/locale/de/bulkActions.json index 0f1155b07..ea0ba5e2c 100644 --- a/app/javascript/dashboard/i18n/locale/de/bulkActions.json +++ b/app/javascript/dashboard/i18n/locale/de/bulkActions.json @@ -17,7 +17,7 @@ "AGENT_LIST_LOADING": "Agenten werden geladen", "UPDATE": { "CHANGE_STATUS": "Status ändern", - "SNOOZE_UNTIL_NEXT_REPLY": "Bis zur nächsten Antwort zurückstellen.", + "SNOOZE_UNTIL": "Erinnern", "UPDATE_SUCCESFUL": "Der Konversationsstatus wurde erfolgreich aktualisiert.", "UPDATE_FAILED": "Failed to update conversations. Please try again." }, diff --git a/app/javascript/dashboard/i18n/locale/de/contact.json b/app/javascript/dashboard/i18n/locale/de/contact.json index 91a64d6c0..111f90ece 100644 --- a/app/javascript/dashboard/i18n/locale/de/contact.json +++ b/app/javascript/dashboard/i18n/locale/de/contact.json @@ -84,6 +84,7 @@ "CONFIRM": { "TITLE": "Kontakte exportieren", "MESSAGE": "Are you sure you want to export all contacts?", + "FILTERED_MESSAGE": "Are you sure you want to export all the filtered contacts?", "YES": "Yes, Export", "NO": "No, Cancel" } diff --git a/app/javascript/dashboard/i18n/locale/de/conversation.json b/app/javascript/dashboard/i18n/locale/de/conversation.json index 1328959a2..3f38361ce 100644 --- a/app/javascript/dashboard/i18n/locale/de/conversation.json +++ b/app/javascript/dashboard/i18n/locale/de/conversation.json @@ -1,7 +1,7 @@ { "CONVERSATION": { "SELECT_A_CONVERSATION": "Bitte wählen Sie eine Konversation aus dem linken Bereich aus", - "CSAT_REPLY_MESSAGE": "Bitte bewerten Sie diese Unterhaltung", + "CSAT_REPLY_MESSAGE": "Bitte bewerten Sie diese Konversation", "404": "Wir können die Konversation leider nicht finden. Bitte versuche es erneut", "SWITCH_VIEW_LAYOUT": "Layout wechseln", "DASHBOARD_APP_TAB_MESSAGES": "Nachrichten", @@ -49,7 +49,7 @@ "NO_RESPONSE": "Keine Antwort", "RATING_TITLE": "Bewertung", "FEEDBACK_TITLE": "Feedback", - "REPLY_MESSAGE_NOT_FOUND": "Message not available", + "REPLY_MESSAGE_NOT_FOUND": "Nachricht nicht verfügbar", "CARD": { "SHOW_LABELS": "Labels anzeigen", "HIDE_LABELS": "Labels ausblenden" @@ -150,8 +150,8 @@ "SEND": "Senden", "CREATE": "Notiz hinzufügen", "INSERT_READ_MORE": "Mehr erfahren", - "DISMISS_REPLY": "Dismiss reply", - "REPLYING_TO": "Replying to:", + "DISMISS_REPLY": "Antwort verwerfen", + "REPLYING_TO": "Antwort auf:", "TIP_FORMAT_ICON": "Rich Text Editor anzeigen", "TIP_EMOJI_ICON": "Emoji-Auswahl anzeigen", "TIP_ATTACH_ICON": "Dateien anhängen", @@ -206,7 +206,7 @@ }, "CONTEXT_MENU": { "COPY": "Kopieren", - "REPLY_TO": "Reply to this message", + "REPLY_TO": "Auf diese Nachricht antworten", "DELETE": "Löschen", "CREATE_A_CANNED_RESPONSE": "Zu vorgefertigten Antworten hinzufügen", "TRANSLATE": "Übersetzen", diff --git a/app/javascript/dashboard/i18n/locale/de/generalSettings.json b/app/javascript/dashboard/i18n/locale/de/generalSettings.json index 7f1cd1467..02b43472f 100644 --- a/app/javascript/dashboard/i18n/locale/de/generalSettings.json +++ b/app/javascript/dashboard/i18n/locale/de/generalSettings.json @@ -107,6 +107,7 @@ "GENERAL": "Generell", "REPORTS": "Berichte", "CONVERSATION": "Konversation", + "BULK_ACTIONS": "Bulk Actions", "CHANGE_ASSIGNEE": "Beauftragten ändern", "CHANGE_PRIORITY": "Priorität ändern", "CHANGE_TEAM": "Team wechseln", diff --git a/app/javascript/dashboard/i18n/locale/de/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/de/inboxMgmt.json index 288be8081..2a5aa7a41 100644 --- a/app/javascript/dashboard/i18n/locale/de/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/de/inboxMgmt.json @@ -717,7 +717,7 @@ "IN_A_DAY": "Wir antworten üblicherweise innerhalb eines Tages" }, "FOOTER": { - "START_CONVERSATION_BUTTON_TEXT": "Unterhaltung beginnen", + "START_CONVERSATION_BUTTON_TEXT": "Konversation beginnen", "CHAT_INPUT_PLACEHOLDER": "Schreiben Sie Ihre Nachricht" }, "BODY": { diff --git a/app/javascript/dashboard/i18n/locale/de/resetPassword.json b/app/javascript/dashboard/i18n/locale/de/resetPassword.json index 033a2bdf0..c06e4a414 100644 --- a/app/javascript/dashboard/i18n/locale/de/resetPassword.json +++ b/app/javascript/dashboard/i18n/locale/de/resetPassword.json @@ -1,7 +1,7 @@ { "RESET_PASSWORD": { "TITLE": "Passwort zurücksetzen", - "DESCRIPTION": "Enter the email address you use to log in to Chatwoot to get the password reset instructions.", + "DESCRIPTION": "Geben Sie die E-Mail-Adresse ein, mit der Sie sich bei Chatwoot anmelden, um die Anweisungen zum Zurücksetzen des Passworts zu erhalten.", "GO_BACK_TO_LOGIN": "If you want to go back to the login page,", "EMAIL": { "LABEL": "E-Mail", diff --git a/app/javascript/dashboard/i18n/locale/de/settings.json b/app/javascript/dashboard/i18n/locale/de/settings.json index 4ed37ce82..e16a11344 100644 --- a/app/javascript/dashboard/i18n/locale/de/settings.json +++ b/app/javascript/dashboard/i18n/locale/de/settings.json @@ -109,7 +109,8 @@ "SLA_MISSED_FIRST_RESPONSE": "A conversation misses first response SLA", "SLA_MISSED_NEXT_RESPONSE": "A conversation misses next response SLA", "SLA_MISSED_RESOLUTION": "A conversation misses resolution SLA" - } + }, + "BROWSER_PERMISSION": "Enable push notifications for your browser so you’re able to receive them" }, "API": { "UPDATE_SUCCESS": "Ihre Benachrichtigungseinstellungen wurden erfolgreich aktualisiert", @@ -189,9 +190,9 @@ "TRIAL_MESSAGE": "Tage der Testversion verbleibend.", "TRAIL_BUTTON": "Jetzt kaufen", "DELETED_USER": "Gelöschter Benutzer", - "EMAIL_VERIFICATION_PENDING": "It seems that you haven't verified your email address yet. Please check your inbox for the verification email.", - "RESEND_VERIFICATION_MAIL": "Resend verification email", - "EMAIL_VERIFICATION_SENT": "Verification email has been sent. Please check your inbox.", + "EMAIL_VERIFICATION_PENDING": "Es scheint, dass Sie Ihre E-Mail-Adresse noch nicht verifiziert haben. Bitte überprüfen Sie Ihren Posteingang auf die Verifizierungs-E-Mail.", + "RESEND_VERIFICATION_MAIL": "Verifizierungs-E-Mail erneut senden", + "EMAIL_VERIFICATION_SENT": "Verifizierungs-E-Mail wurde versendet. Bitte überprüfen Sie Ihren Posteingang.", "ACCOUNT_SUSPENDED": { "TITLE": "Konto gesperrt", "MESSAGE": "Ihr Account wurde gesperrt. Wenden Sie sich für weitere Informationen bitte an das Support-Team." diff --git a/app/javascript/dashboard/i18n/locale/el/bulkActions.json b/app/javascript/dashboard/i18n/locale/el/bulkActions.json index 2ce083dff..f69d32ea1 100644 --- a/app/javascript/dashboard/i18n/locale/el/bulkActions.json +++ b/app/javascript/dashboard/i18n/locale/el/bulkActions.json @@ -17,7 +17,7 @@ "AGENT_LIST_LOADING": "Φόρτωση πρακτόρων", "UPDATE": { "CHANGE_STATUS": "Αλλαγή κατάστασης", - "SNOOZE_UNTIL_NEXT_REPLY": "Αναβολή έως την επόμενη απάντηση.", + "SNOOZE_UNTIL": "Αναβολή", "UPDATE_SUCCESFUL": "Η κατάσταση συνομιλίας ενημερώθηκε με επιτυχία.", "UPDATE_FAILED": "Failed to update conversations. Please try again." }, diff --git a/app/javascript/dashboard/i18n/locale/el/contact.json b/app/javascript/dashboard/i18n/locale/el/contact.json index 42e950d83..9c9a88f73 100644 --- a/app/javascript/dashboard/i18n/locale/el/contact.json +++ b/app/javascript/dashboard/i18n/locale/el/contact.json @@ -84,6 +84,7 @@ "CONFIRM": { "TITLE": "Export Contacts", "MESSAGE": "Are you sure you want to export all contacts?", + "FILTERED_MESSAGE": "Are you sure you want to export all the filtered contacts?", "YES": "Yes, Export", "NO": "No, Cancel" } diff --git a/app/javascript/dashboard/i18n/locale/el/generalSettings.json b/app/javascript/dashboard/i18n/locale/el/generalSettings.json index fe24ea038..ea9e14e13 100644 --- a/app/javascript/dashboard/i18n/locale/el/generalSettings.json +++ b/app/javascript/dashboard/i18n/locale/el/generalSettings.json @@ -107,6 +107,7 @@ "GENERAL": "Γενικά", "REPORTS": "Αναφορές", "CONVERSATION": "Συνομιλία", + "BULK_ACTIONS": "Bulk Actions", "CHANGE_ASSIGNEE": "Αλλαγή Αναδόχου", "CHANGE_PRIORITY": "Change Priority", "CHANGE_TEAM": "Αλλαγή Ομάδας", diff --git a/app/javascript/dashboard/i18n/locale/el/settings.json b/app/javascript/dashboard/i18n/locale/el/settings.json index cbb48fac3..e63cbc8d2 100644 --- a/app/javascript/dashboard/i18n/locale/el/settings.json +++ b/app/javascript/dashboard/i18n/locale/el/settings.json @@ -109,7 +109,8 @@ "SLA_MISSED_FIRST_RESPONSE": "A conversation misses first response SLA", "SLA_MISSED_NEXT_RESPONSE": "A conversation misses next response SLA", "SLA_MISSED_RESOLUTION": "A conversation misses resolution SLA" - } + }, + "BROWSER_PERMISSION": "Enable push notifications for your browser so you’re able to receive them" }, "API": { "UPDATE_SUCCESS": "Οι προτιμήσεις σας για τις ειδοποιήσεις ενημερώθηκαν", diff --git a/app/javascript/dashboard/i18n/locale/en/bulkActions.json b/app/javascript/dashboard/i18n/locale/en/bulkActions.json index 6af8316e9..aa5829b8d 100644 --- a/app/javascript/dashboard/i18n/locale/en/bulkActions.json +++ b/app/javascript/dashboard/i18n/locale/en/bulkActions.json @@ -17,7 +17,7 @@ "AGENT_LIST_LOADING": "Loading agents", "UPDATE": { "CHANGE_STATUS": "Change status", - "SNOOZE_UNTIL_NEXT_REPLY": "Snooze until next reply.", + "SNOOZE_UNTIL": "Snooze", "UPDATE_SUCCESFUL": "Conversation status updated successfully.", "UPDATE_FAILED": "Failed to update conversations. Please try again." }, @@ -33,7 +33,7 @@ "NONE": "None", "NO_TEAMS_AVAILABLE": "There are no teams added to this account yet.", "ASSIGN_SELECTED_TEAMS": "Assign selected team.", - "ASSIGN_SUCCESFUL": "Teams assiged successfully.", + "ASSIGN_SUCCESFUL": "Teams assigned successfully.", "ASSIGN_FAILED": "Failed to assign team. Please try again." } } diff --git a/app/javascript/dashboard/i18n/locale/en/generalSettings.json b/app/javascript/dashboard/i18n/locale/en/generalSettings.json index a252d776f..e7b740f45 100644 --- a/app/javascript/dashboard/i18n/locale/en/generalSettings.json +++ b/app/javascript/dashboard/i18n/locale/en/generalSettings.json @@ -107,6 +107,7 @@ "GENERAL": "General", "REPORTS": "Reports", "CONVERSATION": "Conversation", + "BULK_ACTIONS": "Bulk Actions", "CHANGE_ASSIGNEE": "Change Assignee", "CHANGE_PRIORITY": "Change Priority", "CHANGE_TEAM": "Change Team", @@ -153,7 +154,7 @@ "UNTIL_TOMORROW": "Until tomorrow", "UNTIL_NEXT_MONTH": "Until next month", "AN_HOUR_FROM_NOW": "Until an hour from now", - "CUSTOM": "Custom...", + "UNTIL_CUSTOM_TIME": "Custom...", "CHANGE_APPEARANCE": "Change Appearance", "LIGHT_MODE": "Light", "DARK_MODE": "Dark", diff --git a/app/javascript/dashboard/i18n/locale/en/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/en/inboxMgmt.json index a168e82f0..95821069c 100644 --- a/app/javascript/dashboard/i18n/locale/en/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/en/inboxMgmt.json @@ -2,6 +2,8 @@ "INBOX_MGMT": { "HEADER": "Inboxes", "SIDEBAR_TXT": "Inbox
When you connect a website or a facebook Page to Chatwoot, it is called an Inbox. You can have unlimited inboxes in your Chatwoot account.
Click on Add Inbox to connect a website or a Facebook Page.
In the Dashboard, you can see all the conversations from all your inboxes in a single place and respond to them under the `Conversations` tab.
You can also see conversations specific to an inbox by clicking on the inbox name on the left pane of the dashboard.
", + "RECONNECTION_REQUIRED": "Your inbox is disconnected. You won't receive new messages until you reauthorize it.", + "CLICK_TO_RECONNECT": "Click here to reconnect.", "LIST": { "404": "There are no inboxes attached to this account." }, @@ -736,4 +738,4 @@ "OTHER_PROVIDERS": "Other Providers" } } -} +} \ No newline at end of file diff --git a/app/javascript/dashboard/i18n/locale/en/integrations.json b/app/javascript/dashboard/i18n/locale/en/integrations.json index 231892079..6e052949c 100644 --- a/app/javascript/dashboard/i18n/locale/en/integrations.json +++ b/app/javascript/dashboard/i18n/locale/en/integrations.json @@ -203,6 +203,87 @@ "API_SUCCESS": "Dashboard app deleted successfully", "API_ERROR": "We couldn't delete the app. Please try again later" } + }, + "LINEAR": { + "ADD_OR_LINK_BUTTON": "Create/Link Linear Issue", + "LOADING": "Fetching linear issues...", + "LOADING_ERROR": "There was an error fetching the linear issues, please try again", + "CREATE": "Create", + "LINK": { + "SEARCH": "Search issues", + "SELECT": "Select issue", + "TITLE": "Link", + "EMPTY_LIST": "No linear issues found", + "LOADING": "Loading", + "ERROR": "There was an error fetching the linear issues, please try again", + "LINK_SUCCESS": "Issue linked successfully", + "LINK_ERROR": "There was an error linking the issue, please try again", + "LINK_TITLE": "Conversation (#%{conversationId}) with %{name}" + }, + "ADD_OR_LINK": { + "TITLE": "Create/link linear issue", + "DESCRIPTION": "Create Linear issues from conversations, or link existing ones for seamless tracking.", + "FORM": { + "TITLE": { + "LABEL": "Title", + "PLACEHOLDER": "Enter title", + "REQUIRED_ERROR": "Title is required" + }, + "DESCRIPTION": { + "LABEL": "Description", + "PLACEHOLDER": "Enter description" + }, + "TEAM": { + "LABEL": "Team", + "PLACEHOLDER": "Select team", + "SEARCH": "Search team", + "REQUIRED_ERROR": "Team is required" + }, + "ASSIGNEE": { + "LABEL": "Assignee", + "PLACEHOLDER": "Select assignee", + "SEARCH": "Search assignee" + }, + "PRIORITY": { + "LABEL": "Priority", + "PLACEHOLDER": "Select priority", + "SEARCH": "Search priority" + }, + "LABEL": { + "LABEL": "Label", + "PLACEHOLDER": "Select label", + "SEARCH": "Search label" + }, + "STATUS": { + "LABEL": "Status", + "PLACEHOLDER": "Select status", + "SEARCH": "Search status" + }, + "PROJECT": { + "LABEL": "Project", + "PLACEHOLDER": "Select project", + "SEARCH": "Search project" + } + }, + "CREATE": "Create", + "CANCEL": "Cancel", + "CREATE_SUCCESS": "Issue created successfully", + "CREATE_ERROR": "There was an error creating the issue, please try again", + "LOADING_TEAM_ERROR": "There was an error fetching the teams, please try again", + "LOADING_TEAM_ENTITIES_ERROR": "There was an error fetching the team entities, please try again" + }, + "ISSUE": { + "STATUS": "Status", + "PRIORITY": "Priority", + "ASSIGNEE": "Assignee", + "LABELS": "Labels", + "CREATED_AT": "Created at %{createdAt}" + }, + "UNLINK": { + "TITLE": "Unlink", + "SUCCESS": "Issue unlinked successfully", + "ERROR": "There was an error unlinking the issue, please try again" + } } } } diff --git a/app/javascript/dashboard/i18n/locale/en/settings.json b/app/javascript/dashboard/i18n/locale/en/settings.json index 1f4d44e22..445b7244e 100644 --- a/app/javascript/dashboard/i18n/locale/en/settings.json +++ b/app/javascript/dashboard/i18n/locale/en/settings.json @@ -274,7 +274,7 @@ "SLA": "SLA", "BETA": "Beta", "REPORTS_OVERVIEW": "Overview", - "FACEBOOK_REAUTHORIZE": "Your Facebook connection has expired, please reconnect your Facebook page to continue services", + "REAUTHORIZE": "Your inbox connection has expired, please reconnect\n to continue receiving and sending messages", "HELP_CENTER": { "TITLE": "Help Center", "ALL_ARTICLES": "All Articles", diff --git a/app/javascript/dashboard/i18n/locale/es/bulkActions.json b/app/javascript/dashboard/i18n/locale/es/bulkActions.json index 00c47a16a..72c40ad98 100644 --- a/app/javascript/dashboard/i18n/locale/es/bulkActions.json +++ b/app/javascript/dashboard/i18n/locale/es/bulkActions.json @@ -17,7 +17,7 @@ "AGENT_LIST_LOADING": "Cargando agentes", "UPDATE": { "CHANGE_STATUS": "Cambiar estado", - "SNOOZE_UNTIL_NEXT_REPLY": "Posponer hasta la próxima respuesta.", + "SNOOZE_UNTIL": "Posponer", "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." }, diff --git a/app/javascript/dashboard/i18n/locale/es/contact.json b/app/javascript/dashboard/i18n/locale/es/contact.json index 1c12c2094..5fb0bb5ce 100644 --- a/app/javascript/dashboard/i18n/locale/es/contact.json +++ b/app/javascript/dashboard/i18n/locale/es/contact.json @@ -84,6 +84,7 @@ "CONFIRM": { "TITLE": "Exportar contactos", "MESSAGE": "¿Está seguro que desea exportar todos los contactos?", + "FILTERED_MESSAGE": "Are you sure you want to export all the filtered contacts?", "YES": "Sí, exportar", "NO": "No, cancelar" } diff --git a/app/javascript/dashboard/i18n/locale/es/generalSettings.json b/app/javascript/dashboard/i18n/locale/es/generalSettings.json index 52bbf1fed..63a9b7b0b 100644 --- a/app/javascript/dashboard/i18n/locale/es/generalSettings.json +++ b/app/javascript/dashboard/i18n/locale/es/generalSettings.json @@ -107,6 +107,7 @@ "GENERAL": "General", "REPORTS": "Informes", "CONVERSATION": "Conversación", + "BULK_ACTIONS": "Bulk Actions", "CHANGE_ASSIGNEE": "Cambiar Asignado", "CHANGE_PRIORITY": "Cambiar prioridad", "CHANGE_TEAM": "Cambiar equipo", diff --git a/app/javascript/dashboard/i18n/locale/es/settings.json b/app/javascript/dashboard/i18n/locale/es/settings.json index 8c2220085..b03322a99 100644 --- a/app/javascript/dashboard/i18n/locale/es/settings.json +++ b/app/javascript/dashboard/i18n/locale/es/settings.json @@ -109,7 +109,8 @@ "SLA_MISSED_FIRST_RESPONSE": "A conversation misses first response SLA", "SLA_MISSED_NEXT_RESPONSE": "A conversation misses next response SLA", "SLA_MISSED_RESOLUTION": "A conversation misses resolution SLA" - } + }, + "BROWSER_PERMISSION": "Enable push notifications for your browser so you’re able to receive them" }, "API": { "UPDATE_SUCCESS": "Sus preferencias de notificación se actualizaron correctamente", diff --git a/app/javascript/dashboard/i18n/locale/fa/bulkActions.json b/app/javascript/dashboard/i18n/locale/fa/bulkActions.json index 657a9622e..613790399 100644 --- a/app/javascript/dashboard/i18n/locale/fa/bulkActions.json +++ b/app/javascript/dashboard/i18n/locale/fa/bulkActions.json @@ -17,7 +17,7 @@ "AGENT_LIST_LOADING": "بارگذاری ایجنت ها", "UPDATE": { "CHANGE_STATUS": "تغییر وضعیت", - "SNOOZE_UNTIL_NEXT_REPLY": "تا پاسخ بعدی به تعویق بیافتد.", + "SNOOZE_UNTIL": "به تعویق انداختن", "UPDATE_SUCCESFUL": "وضعیت گفتگو با موفقیت به روز شد.", "UPDATE_FAILED": "گفتگوها به روز نشدند، لطفا دوباره امتحان کنید." }, diff --git a/app/javascript/dashboard/i18n/locale/fa/contact.json b/app/javascript/dashboard/i18n/locale/fa/contact.json index 6d6cef163..844c4b862 100644 --- a/app/javascript/dashboard/i18n/locale/fa/contact.json +++ b/app/javascript/dashboard/i18n/locale/fa/contact.json @@ -84,6 +84,7 @@ "CONFIRM": { "TITLE": "خروجی گرفتن مخاطب ها", "MESSAGE": "آیا مطمئن هستید که می خواهید از همه مخاطبین خروجی بگیرید؟", + "FILTERED_MESSAGE": "Are you sure you want to export all the filtered contacts?", "YES": "بله، خروجی بگیر", "NO": "نه، انصراف" } diff --git a/app/javascript/dashboard/i18n/locale/fa/datePicker.json b/app/javascript/dashboard/i18n/locale/fa/datePicker.json index 890c4e88a..e6adf109f 100644 --- a/app/javascript/dashboard/i18n/locale/fa/datePicker.json +++ b/app/javascript/dashboard/i18n/locale/fa/datePicker.json @@ -1,13 +1,13 @@ { "DATE_PICKER": { "APPLY_BUTTON": "درخواست دادن", - "CLEAR_BUTTON": "Clear", + "CLEAR_BUTTON": "پاک کردن", "DATE_RANGE_INPUT": { - "START": "Start Date", - "END": "End Date" + "START": "تاریخ شروع", + "END": "تاریخ پایان" }, "DATE_RANGE_OPTIONS": { - "TITLE": "DATE RANGE", + "TITLE": "محدوده زمانی", "LAST_7_DAYS": "در ۷ روز گذشته", "LAST_30_DAYS": "در ۳۰ روز گذشته", "LAST_3_MONTHS": "۳ ماه گذشته", diff --git a/app/javascript/dashboard/i18n/locale/fa/generalSettings.json b/app/javascript/dashboard/i18n/locale/fa/generalSettings.json index d70922c6a..7c80079a3 100644 --- a/app/javascript/dashboard/i18n/locale/fa/generalSettings.json +++ b/app/javascript/dashboard/i18n/locale/fa/generalSettings.json @@ -107,6 +107,7 @@ "GENERAL": "عمومی", "REPORTS": "گزارشات", "CONVERSATION": "گفتگو", + "BULK_ACTIONS": "Bulk Actions", "CHANGE_ASSIGNEE": "اپراتور را تغییر دهید", "CHANGE_PRIORITY": "تغییر اولویت", "CHANGE_TEAM": "تیم را تغییر دهید", diff --git a/app/javascript/dashboard/i18n/locale/fa/integrations.json b/app/javascript/dashboard/i18n/locale/fa/integrations.json index 69d7c42b9..e7e92b2f3 100644 --- a/app/javascript/dashboard/i18n/locale/fa/integrations.json +++ b/app/javascript/dashboard/i18n/locale/fa/integrations.json @@ -81,12 +81,12 @@ "HELP_TEXT": { "TITLE": "استفاده از اسلک", "BODY": "ما اکنون تمام مکالمات ورودی را در کانال گفتگوهای مشتری داخل محل کار شما همگام سازی می کنیم.
پاسخ به یک رشته مکالمه در کانال مکالمه مشتری- مکالمات i> از طریق برنامه پاسخی به مشتری ایجاد می کند. p>
پاسخ ها را با شروع کنید توجه: برای ایجاد یادداشت های خصوصی به جای پاسخ ها.
اگر پاسخ دهنده در slack نمایه نماینده ای در برنامه تحت همان ایمیل داشته باشد ، پاسخ ها به همین ترتیب مرتبط می شوند. p>
وقتی ارسال کننده نمایه نماینده مرتبطی ندارد ، پاسخها از نمایه ربات انجام می شود.
", - "SELECTED": "selected" + "SELECTED": "انتخاب شد" }, "SELECT_CHANNEL": { - "OPTION_LABEL": "Select a channel", + "OPTION_LABEL": "یک کانال انتخاب کنید", "UPDATE": "اعمال شود", - "BUTTON_TEXT": "Connect channel", + "BUTTON_TEXT": "اتصال کانال", "DESCRIPTION": "Your Slack workspace is now linked with Chatwoot. However, the integration is currently inactive. To activate the integration and connect a channel to Chatwoot, please click the button below.\n\n**Note:** If you are attempting to connect a private channel, add the Chatwoot app to the Slack channel before proceeding with this step.", "ATTENTION_REQUIRED": "Attention required", "EXPIRED": "Your Slack integration has expired. To continue receiving messages on Slack, please delete the integration and connect your workspace again." @@ -106,7 +106,7 @@ "AI_ASSIST": "دستیار هوش مصنوعی", "WITH_AI": " %{option} with AI ", "OPTIONS": { - "REPLY_SUGGESTION": "Reply Suggestion", + "REPLY_SUGGESTION": "پیشنهاد پاسخ", "SUMMARIZE": "Summarize", "REPHRASE": "Improve Writing", "FIX_SPELLING_GRAMMAR": "Fix Spelling and Grammar", @@ -144,13 +144,13 @@ "TONE": { "TITLE": "Tone", "OPTIONS": { - "PROFESSIONAL": "Professional", + "PROFESSIONAL": "حرفهای", "FRIENDLY": "دوستانه" } }, "BUTTONS": { - "GENERATE": "Generate", - "GENERATING": "Generating...", + "GENERATE": "تولید", + "GENERATING": "در حال تولید...", "CANCEL": "انصراف" }, "GENERATE_ERROR": "There was an error processing the content, please try again" diff --git a/app/javascript/dashboard/i18n/locale/fa/settings.json b/app/javascript/dashboard/i18n/locale/fa/settings.json index 3285c824d..0f364dc91 100644 --- a/app/javascript/dashboard/i18n/locale/fa/settings.json +++ b/app/javascript/dashboard/i18n/locale/fa/settings.json @@ -10,7 +10,7 @@ "PASSWORD_UPDATE_SUCCESS": "رمز عبورتان عوض شد", "AFTER_EMAIL_CHANGED": "پروفایلتان با موفقیت تغییر یافت، اطلاعات ورود به سیستم تغییر کرده لذا لطفا مجددا به سیستم وارد شوید", "FORM": { - "PICTURE": "Profile Picture", + "PICTURE": "عکس نمایه", "AVATAR": "عکس پروفایل", "ERROR": "لطفا ایرادات ذکر شده را برطرف کنید", "REMOVE_IMAGE": "حذف", @@ -65,7 +65,7 @@ "NOTE": "اعلان های صوتی را در داشبورد برای پیام ها و مکالمات جدید فعال کنید.", "ALERT_TYPES": { "NONE": "هیچکدام", - "MINE": "Assigned", + "MINE": "اختصاص داده", "ALL": "همه" }, "ALERT_TYPE": { @@ -96,8 +96,8 @@ "SLA_MISSED_RESOLUTION": "هر وقت گفتگویی سیاست SLA مربوط به زمان حل موضوع را نقض کرد ایمیل ارسال کن" }, "NOTIFICATIONS": { - "TITLE": "Notification preferences", - "TYPE_TITLE": "Notification type", + "TITLE": "تنظیمات آگاهسازی", + "TYPE_TITLE": "نوع آگاهسازی", "EMAIL": "ایمیل", "PUSH": "Push notification", "TYPES": { @@ -109,7 +109,8 @@ "SLA_MISSED_FIRST_RESPONSE": "A conversation misses first response SLA", "SLA_MISSED_NEXT_RESPONSE": "A conversation misses next response SLA", "SLA_MISSED_RESOLUTION": "A conversation misses resolution SLA" - } + }, + "BROWSER_PERMISSION": "Enable push notifications for your browser so you’re able to receive them" }, "API": { "UPDATE_SUCCESS": "تغییرات تنظیمات اعلامیهها با موفقیت ثبت شد", diff --git a/app/javascript/dashboard/i18n/locale/fi/bulkActions.json b/app/javascript/dashboard/i18n/locale/fi/bulkActions.json index 7bb45133f..72705e8b1 100644 --- a/app/javascript/dashboard/i18n/locale/fi/bulkActions.json +++ b/app/javascript/dashboard/i18n/locale/fi/bulkActions.json @@ -17,7 +17,7 @@ "AGENT_LIST_LOADING": "Loading agents", "UPDATE": { "CHANGE_STATUS": "Change status", - "SNOOZE_UNTIL_NEXT_REPLY": "Snooze until next reply.", + "SNOOZE_UNTIL": "Snooze", "UPDATE_SUCCESFUL": "Conversation status updated successfully.", "UPDATE_FAILED": "Failed to update conversations. Please try again." }, diff --git a/app/javascript/dashboard/i18n/locale/fi/contact.json b/app/javascript/dashboard/i18n/locale/fi/contact.json index 3a4a15e09..599fcf56f 100644 --- a/app/javascript/dashboard/i18n/locale/fi/contact.json +++ b/app/javascript/dashboard/i18n/locale/fi/contact.json @@ -84,6 +84,7 @@ "CONFIRM": { "TITLE": "Export Contacts", "MESSAGE": "Are you sure you want to export all contacts?", + "FILTERED_MESSAGE": "Are you sure you want to export all the filtered contacts?", "YES": "Yes, Export", "NO": "No, Cancel" } diff --git a/app/javascript/dashboard/i18n/locale/fi/generalSettings.json b/app/javascript/dashboard/i18n/locale/fi/generalSettings.json index beea6efac..6df26953f 100644 --- a/app/javascript/dashboard/i18n/locale/fi/generalSettings.json +++ b/app/javascript/dashboard/i18n/locale/fi/generalSettings.json @@ -107,6 +107,7 @@ "GENERAL": "General", "REPORTS": "Raportit", "CONVERSATION": "Conversation", + "BULK_ACTIONS": "Bulk Actions", "CHANGE_ASSIGNEE": "Change Assignee", "CHANGE_PRIORITY": "Change Priority", "CHANGE_TEAM": "Change Team", diff --git a/app/javascript/dashboard/i18n/locale/fi/settings.json b/app/javascript/dashboard/i18n/locale/fi/settings.json index 36f0e8a04..6918a7eb9 100644 --- a/app/javascript/dashboard/i18n/locale/fi/settings.json +++ b/app/javascript/dashboard/i18n/locale/fi/settings.json @@ -109,7 +109,8 @@ "SLA_MISSED_FIRST_RESPONSE": "A conversation misses first response SLA", "SLA_MISSED_NEXT_RESPONSE": "A conversation misses next response SLA", "SLA_MISSED_RESOLUTION": "A conversation misses resolution SLA" - } + }, + "BROWSER_PERMISSION": "Enable push notifications for your browser so you’re able to receive them" }, "API": { "UPDATE_SUCCESS": "Ilmoitusasetuksesi päivitetään onnistuneesti", diff --git a/app/javascript/dashboard/i18n/locale/fr/bulkActions.json b/app/javascript/dashboard/i18n/locale/fr/bulkActions.json index 485b02c0e..8a2591413 100644 --- a/app/javascript/dashboard/i18n/locale/fr/bulkActions.json +++ b/app/javascript/dashboard/i18n/locale/fr/bulkActions.json @@ -17,7 +17,7 @@ "AGENT_LIST_LOADING": "Chargement des agents", "UPDATE": { "CHANGE_STATUS": "Changer le statut", - "SNOOZE_UNTIL_NEXT_REPLY": "Reporté jusqu'à la prochaine réponse.", + "SNOOZE_UNTIL": "Reporter", "UPDATE_SUCCESFUL": "Le statut de la conversation a été mis à jour avec succès.", "UPDATE_FAILED": "Impossible de mettre à jour les conversations, veuillez réessayer." }, diff --git a/app/javascript/dashboard/i18n/locale/fr/contact.json b/app/javascript/dashboard/i18n/locale/fr/contact.json index 622a7a28e..a15cb65cf 100644 --- a/app/javascript/dashboard/i18n/locale/fr/contact.json +++ b/app/javascript/dashboard/i18n/locale/fr/contact.json @@ -84,6 +84,7 @@ "CONFIRM": { "TITLE": "Exporter les contacts", "MESSAGE": "Are you sure you want to export all contacts?", + "FILTERED_MESSAGE": "Are you sure you want to export all the filtered contacts?", "YES": "Yes, Export", "NO": "No, Cancel" } diff --git a/app/javascript/dashboard/i18n/locale/fr/generalSettings.json b/app/javascript/dashboard/i18n/locale/fr/generalSettings.json index e35100090..87d60620f 100644 --- a/app/javascript/dashboard/i18n/locale/fr/generalSettings.json +++ b/app/javascript/dashboard/i18n/locale/fr/generalSettings.json @@ -107,6 +107,7 @@ "GENERAL": "Général", "REPORTS": "Rapports", "CONVERSATION": "Conversation", + "BULK_ACTIONS": "Bulk Actions", "CHANGE_ASSIGNEE": "Changer de responsable", "CHANGE_PRIORITY": "Modifier la priorité", "CHANGE_TEAM": "Changer d’équipe", diff --git a/app/javascript/dashboard/i18n/locale/fr/settings.json b/app/javascript/dashboard/i18n/locale/fr/settings.json index c5bf5d1b9..379b4e182 100644 --- a/app/javascript/dashboard/i18n/locale/fr/settings.json +++ b/app/javascript/dashboard/i18n/locale/fr/settings.json @@ -109,7 +109,8 @@ "SLA_MISSED_FIRST_RESPONSE": "A conversation misses first response SLA", "SLA_MISSED_NEXT_RESPONSE": "A conversation misses next response SLA", "SLA_MISSED_RESOLUTION": "A conversation misses resolution SLA" - } + }, + "BROWSER_PERMISSION": "Enable push notifications for your browser so you’re able to receive them" }, "API": { "UPDATE_SUCCESS": "Vos préférences de notifications ont été mises à jour avec succès", diff --git a/app/javascript/dashboard/i18n/locale/he/bulkActions.json b/app/javascript/dashboard/i18n/locale/he/bulkActions.json index d8c7c12e4..6f138be06 100644 --- a/app/javascript/dashboard/i18n/locale/he/bulkActions.json +++ b/app/javascript/dashboard/i18n/locale/he/bulkActions.json @@ -17,7 +17,7 @@ "AGENT_LIST_LOADING": "טוען סוכנים", "UPDATE": { "CHANGE_STATUS": "שנה סטאטוס", - "SNOOZE_UNTIL_NEXT_REPLY": "נדנד עד התגובה הבאה.", + "SNOOZE_UNTIL": "נודניק", "UPDATE_SUCCESFUL": "סטאטוס השיחה שונה בהצלחה.", "UPDATE_FAILED": "Failed to update conversations. Please try again." }, diff --git a/app/javascript/dashboard/i18n/locale/he/contact.json b/app/javascript/dashboard/i18n/locale/he/contact.json index ed10c4fad..9354c8642 100644 --- a/app/javascript/dashboard/i18n/locale/he/contact.json +++ b/app/javascript/dashboard/i18n/locale/he/contact.json @@ -84,6 +84,7 @@ "CONFIRM": { "TITLE": "Export Contacts", "MESSAGE": "Are you sure you want to export all contacts?", + "FILTERED_MESSAGE": "Are you sure you want to export all the filtered contacts?", "YES": "Yes, Export", "NO": "No, Cancel" } diff --git a/app/javascript/dashboard/i18n/locale/he/generalSettings.json b/app/javascript/dashboard/i18n/locale/he/generalSettings.json index 0833b47ac..b4e7d1580 100644 --- a/app/javascript/dashboard/i18n/locale/he/generalSettings.json +++ b/app/javascript/dashboard/i18n/locale/he/generalSettings.json @@ -107,6 +107,7 @@ "GENERAL": "כללי", "REPORTS": "דוחות", "CONVERSATION": "שיחה", + "BULK_ACTIONS": "Bulk Actions", "CHANGE_ASSIGNEE": "שנה מוקצה", "CHANGE_PRIORITY": "Change Priority", "CHANGE_TEAM": "להחליף קבוצה", diff --git a/app/javascript/dashboard/i18n/locale/he/settings.json b/app/javascript/dashboard/i18n/locale/he/settings.json index 7b05c4217..6bb85c95d 100644 --- a/app/javascript/dashboard/i18n/locale/he/settings.json +++ b/app/javascript/dashboard/i18n/locale/he/settings.json @@ -109,7 +109,8 @@ "SLA_MISSED_FIRST_RESPONSE": "A conversation misses first response SLA", "SLA_MISSED_NEXT_RESPONSE": "A conversation misses next response SLA", "SLA_MISSED_RESOLUTION": "A conversation misses resolution SLA" - } + }, + "BROWSER_PERMISSION": "Enable push notifications for your browser so you’re able to receive them" }, "API": { "UPDATE_SUCCESS": "העדפות ההתראות עודכנו בהצלחה", diff --git a/app/javascript/dashboard/i18n/locale/hi/bulkActions.json b/app/javascript/dashboard/i18n/locale/hi/bulkActions.json index 6af8316e9..fe7c8de4a 100644 --- a/app/javascript/dashboard/i18n/locale/hi/bulkActions.json +++ b/app/javascript/dashboard/i18n/locale/hi/bulkActions.json @@ -17,7 +17,7 @@ "AGENT_LIST_LOADING": "Loading agents", "UPDATE": { "CHANGE_STATUS": "Change status", - "SNOOZE_UNTIL_NEXT_REPLY": "Snooze until next reply.", + "SNOOZE_UNTIL": "Snooze", "UPDATE_SUCCESFUL": "Conversation status updated successfully.", "UPDATE_FAILED": "Failed to update conversations. Please try again." }, diff --git a/app/javascript/dashboard/i18n/locale/hi/contact.json b/app/javascript/dashboard/i18n/locale/hi/contact.json index 072322f03..7a4a3af37 100644 --- a/app/javascript/dashboard/i18n/locale/hi/contact.json +++ b/app/javascript/dashboard/i18n/locale/hi/contact.json @@ -84,6 +84,7 @@ "CONFIRM": { "TITLE": "Export Contacts", "MESSAGE": "Are you sure you want to export all contacts?", + "FILTERED_MESSAGE": "Are you sure you want to export all the filtered contacts?", "YES": "Yes, Export", "NO": "No, Cancel" } diff --git a/app/javascript/dashboard/i18n/locale/hi/generalSettings.json b/app/javascript/dashboard/i18n/locale/hi/generalSettings.json index a252d776f..10b72907b 100644 --- a/app/javascript/dashboard/i18n/locale/hi/generalSettings.json +++ b/app/javascript/dashboard/i18n/locale/hi/generalSettings.json @@ -107,6 +107,7 @@ "GENERAL": "General", "REPORTS": "Reports", "CONVERSATION": "Conversation", + "BULK_ACTIONS": "Bulk Actions", "CHANGE_ASSIGNEE": "Change Assignee", "CHANGE_PRIORITY": "Change Priority", "CHANGE_TEAM": "Change Team", diff --git a/app/javascript/dashboard/i18n/locale/hi/settings.json b/app/javascript/dashboard/i18n/locale/hi/settings.json index 94dfcd6c5..fc8d99827 100644 --- a/app/javascript/dashboard/i18n/locale/hi/settings.json +++ b/app/javascript/dashboard/i18n/locale/hi/settings.json @@ -109,7 +109,8 @@ "SLA_MISSED_FIRST_RESPONSE": "A conversation misses first response SLA", "SLA_MISSED_NEXT_RESPONSE": "A conversation misses next response SLA", "SLA_MISSED_RESOLUTION": "A conversation misses resolution SLA" - } + }, + "BROWSER_PERMISSION": "Enable push notifications for your browser so you’re able to receive them" }, "API": { "UPDATE_SUCCESS": "Your notification preferences are updated successfully", diff --git a/app/javascript/dashboard/i18n/locale/hr/bulkActions.json b/app/javascript/dashboard/i18n/locale/hr/bulkActions.json index 6af8316e9..fe7c8de4a 100644 --- a/app/javascript/dashboard/i18n/locale/hr/bulkActions.json +++ b/app/javascript/dashboard/i18n/locale/hr/bulkActions.json @@ -17,7 +17,7 @@ "AGENT_LIST_LOADING": "Loading agents", "UPDATE": { "CHANGE_STATUS": "Change status", - "SNOOZE_UNTIL_NEXT_REPLY": "Snooze until next reply.", + "SNOOZE_UNTIL": "Snooze", "UPDATE_SUCCESFUL": "Conversation status updated successfully.", "UPDATE_FAILED": "Failed to update conversations. Please try again." }, diff --git a/app/javascript/dashboard/i18n/locale/hr/contact.json b/app/javascript/dashboard/i18n/locale/hr/contact.json index 5458f3dbc..ba36b5118 100644 --- a/app/javascript/dashboard/i18n/locale/hr/contact.json +++ b/app/javascript/dashboard/i18n/locale/hr/contact.json @@ -84,6 +84,7 @@ "CONFIRM": { "TITLE": "Export Contacts", "MESSAGE": "Are you sure you want to export all contacts?", + "FILTERED_MESSAGE": "Are you sure you want to export all the filtered contacts?", "YES": "Yes, Export", "NO": "No, Cancel" } diff --git a/app/javascript/dashboard/i18n/locale/hr/generalSettings.json b/app/javascript/dashboard/i18n/locale/hr/generalSettings.json index 588262c7c..fe625da3c 100644 --- a/app/javascript/dashboard/i18n/locale/hr/generalSettings.json +++ b/app/javascript/dashboard/i18n/locale/hr/generalSettings.json @@ -107,6 +107,7 @@ "GENERAL": "General", "REPORTS": "Reports", "CONVERSATION": "Conversation", + "BULK_ACTIONS": "Bulk Actions", "CHANGE_ASSIGNEE": "Change Assignee", "CHANGE_PRIORITY": "Promjena prioriteta", "CHANGE_TEAM": "Change Team", diff --git a/app/javascript/dashboard/i18n/locale/hr/settings.json b/app/javascript/dashboard/i18n/locale/hr/settings.json index f3769ad60..2c65d0245 100644 --- a/app/javascript/dashboard/i18n/locale/hr/settings.json +++ b/app/javascript/dashboard/i18n/locale/hr/settings.json @@ -109,7 +109,8 @@ "SLA_MISSED_FIRST_RESPONSE": "A conversation misses first response SLA", "SLA_MISSED_NEXT_RESPONSE": "A conversation misses next response SLA", "SLA_MISSED_RESOLUTION": "A conversation misses resolution SLA" - } + }, + "BROWSER_PERMISSION": "Enable push notifications for your browser so you’re able to receive them" }, "API": { "UPDATE_SUCCESS": "Your notification preferences are updated successfully", diff --git a/app/javascript/dashboard/i18n/locale/hu/bulkActions.json b/app/javascript/dashboard/i18n/locale/hu/bulkActions.json index c57da4956..e8c8e8ebf 100644 --- a/app/javascript/dashboard/i18n/locale/hu/bulkActions.json +++ b/app/javascript/dashboard/i18n/locale/hu/bulkActions.json @@ -17,7 +17,7 @@ "AGENT_LIST_LOADING": "Ügynökök betöltése", "UPDATE": { "CHANGE_STATUS": "Státusz változtatása", - "SNOOZE_UNTIL_NEXT_REPLY": "Alvómód a következő válaszig.", + "SNOOZE_UNTIL": "Halasztás", "UPDATE_SUCCESFUL": "Beszélgetés státusza sikeresen frissítve ", "UPDATE_FAILED": "Nem sikerült frissíteni a beszélgetéseket. Kérjük, próbálja újra." }, diff --git a/app/javascript/dashboard/i18n/locale/hu/contact.json b/app/javascript/dashboard/i18n/locale/hu/contact.json index eec799933..7ba9a6d8a 100644 --- a/app/javascript/dashboard/i18n/locale/hu/contact.json +++ b/app/javascript/dashboard/i18n/locale/hu/contact.json @@ -84,6 +84,7 @@ "CONFIRM": { "TITLE": "Kontaktok exportálása", "MESSAGE": "Are you sure you want to export all contacts?", + "FILTERED_MESSAGE": "Are you sure you want to export all the filtered contacts?", "YES": "Yes, Export", "NO": "No, Cancel" } diff --git a/app/javascript/dashboard/i18n/locale/hu/generalSettings.json b/app/javascript/dashboard/i18n/locale/hu/generalSettings.json index b725d644a..09a23508d 100644 --- a/app/javascript/dashboard/i18n/locale/hu/generalSettings.json +++ b/app/javascript/dashboard/i18n/locale/hu/generalSettings.json @@ -107,6 +107,7 @@ "GENERAL": "Általános", "REPORTS": "Jelentések", "CONVERSATION": "Beszélgetés", + "BULK_ACTIONS": "Bulk Actions", "CHANGE_ASSIGNEE": "Felelős megváltoztatása", "CHANGE_PRIORITY": "Prioritás megváltoztatása", "CHANGE_TEAM": "Csapat megváltoztatása", diff --git a/app/javascript/dashboard/i18n/locale/hu/settings.json b/app/javascript/dashboard/i18n/locale/hu/settings.json index 83ffe3d29..80e9ac2a3 100644 --- a/app/javascript/dashboard/i18n/locale/hu/settings.json +++ b/app/javascript/dashboard/i18n/locale/hu/settings.json @@ -109,7 +109,8 @@ "SLA_MISSED_FIRST_RESPONSE": "A conversation misses first response SLA", "SLA_MISSED_NEXT_RESPONSE": "A conversation misses next response SLA", "SLA_MISSED_RESOLUTION": "A conversation misses resolution SLA" - } + }, + "BROWSER_PERMISSION": "Enable push notifications for your browser so you’re able to receive them" }, "API": { "UPDATE_SUCCESS": "Az értesítési beállításaid sikeresen frissítve", diff --git a/app/javascript/dashboard/i18n/locale/hy/bulkActions.json b/app/javascript/dashboard/i18n/locale/hy/bulkActions.json index 6af8316e9..fe7c8de4a 100644 --- a/app/javascript/dashboard/i18n/locale/hy/bulkActions.json +++ b/app/javascript/dashboard/i18n/locale/hy/bulkActions.json @@ -17,7 +17,7 @@ "AGENT_LIST_LOADING": "Loading agents", "UPDATE": { "CHANGE_STATUS": "Change status", - "SNOOZE_UNTIL_NEXT_REPLY": "Snooze until next reply.", + "SNOOZE_UNTIL": "Snooze", "UPDATE_SUCCESFUL": "Conversation status updated successfully.", "UPDATE_FAILED": "Failed to update conversations. Please try again." }, diff --git a/app/javascript/dashboard/i18n/locale/hy/contact.json b/app/javascript/dashboard/i18n/locale/hy/contact.json index 072322f03..7a4a3af37 100644 --- a/app/javascript/dashboard/i18n/locale/hy/contact.json +++ b/app/javascript/dashboard/i18n/locale/hy/contact.json @@ -84,6 +84,7 @@ "CONFIRM": { "TITLE": "Export Contacts", "MESSAGE": "Are you sure you want to export all contacts?", + "FILTERED_MESSAGE": "Are you sure you want to export all the filtered contacts?", "YES": "Yes, Export", "NO": "No, Cancel" } diff --git a/app/javascript/dashboard/i18n/locale/hy/generalSettings.json b/app/javascript/dashboard/i18n/locale/hy/generalSettings.json index a252d776f..10b72907b 100644 --- a/app/javascript/dashboard/i18n/locale/hy/generalSettings.json +++ b/app/javascript/dashboard/i18n/locale/hy/generalSettings.json @@ -107,6 +107,7 @@ "GENERAL": "General", "REPORTS": "Reports", "CONVERSATION": "Conversation", + "BULK_ACTIONS": "Bulk Actions", "CHANGE_ASSIGNEE": "Change Assignee", "CHANGE_PRIORITY": "Change Priority", "CHANGE_TEAM": "Change Team", diff --git a/app/javascript/dashboard/i18n/locale/hy/settings.json b/app/javascript/dashboard/i18n/locale/hy/settings.json index 32d866538..4dca590e9 100644 --- a/app/javascript/dashboard/i18n/locale/hy/settings.json +++ b/app/javascript/dashboard/i18n/locale/hy/settings.json @@ -109,7 +109,8 @@ "SLA_MISSED_FIRST_RESPONSE": "A conversation misses first response SLA", "SLA_MISSED_NEXT_RESPONSE": "A conversation misses next response SLA", "SLA_MISSED_RESOLUTION": "A conversation misses resolution SLA" - } + }, + "BROWSER_PERMISSION": "Enable push notifications for your browser so you’re able to receive them" }, "API": { "UPDATE_SUCCESS": "Your notification preferences are updated successfully", diff --git a/app/javascript/dashboard/i18n/locale/id/bulkActions.json b/app/javascript/dashboard/i18n/locale/id/bulkActions.json index 2390ca58f..2f07fe8a0 100644 --- a/app/javascript/dashboard/i18n/locale/id/bulkActions.json +++ b/app/javascript/dashboard/i18n/locale/id/bulkActions.json @@ -17,7 +17,7 @@ "AGENT_LIST_LOADING": "Sedang memuat agen", "UPDATE": { "CHANGE_STATUS": "Ubah status", - "SNOOZE_UNTIL_NEXT_REPLY": "Tunda hingga balasan berikutnya.", + "SNOOZE_UNTIL": "Tunda", "UPDATE_SUCCESFUL": "Status percakapan berhasil diperbarui.", "UPDATE_FAILED": "Failed to update conversations. Please try again." }, diff --git a/app/javascript/dashboard/i18n/locale/id/contact.json b/app/javascript/dashboard/i18n/locale/id/contact.json index fb40a7ec5..d9eb8c2dc 100644 --- a/app/javascript/dashboard/i18n/locale/id/contact.json +++ b/app/javascript/dashboard/i18n/locale/id/contact.json @@ -84,6 +84,7 @@ "CONFIRM": { "TITLE": "Ekspor Kontak", "MESSAGE": "Are you sure you want to export all contacts?", + "FILTERED_MESSAGE": "Are you sure you want to export all the filtered contacts?", "YES": "Yes, Export", "NO": "No, Cancel" } diff --git a/app/javascript/dashboard/i18n/locale/id/generalSettings.json b/app/javascript/dashboard/i18n/locale/id/generalSettings.json index d703c99b5..4327e5a70 100644 --- a/app/javascript/dashboard/i18n/locale/id/generalSettings.json +++ b/app/javascript/dashboard/i18n/locale/id/generalSettings.json @@ -107,6 +107,7 @@ "GENERAL": "Umum", "REPORTS": "Laporan", "CONVERSATION": "Percakapan", + "BULK_ACTIONS": "Bulk Actions", "CHANGE_ASSIGNEE": "Ubah Penerima Tugas", "CHANGE_PRIORITY": "Ubah Prioritas", "CHANGE_TEAM": "Ubah Tim", diff --git a/app/javascript/dashboard/i18n/locale/id/settings.json b/app/javascript/dashboard/i18n/locale/id/settings.json index 83fdadb9a..18b143847 100644 --- a/app/javascript/dashboard/i18n/locale/id/settings.json +++ b/app/javascript/dashboard/i18n/locale/id/settings.json @@ -109,7 +109,8 @@ "SLA_MISSED_FIRST_RESPONSE": "A conversation misses first response SLA", "SLA_MISSED_NEXT_RESPONSE": "A conversation misses next response SLA", "SLA_MISSED_RESOLUTION": "A conversation misses resolution SLA" - } + }, + "BROWSER_PERMISSION": "Enable push notifications for your browser so you’re able to receive them" }, "API": { "UPDATE_SUCCESS": "Preferensi notifikasi Anda berhasil diperbarui", diff --git a/app/javascript/dashboard/i18n/locale/is/bulkActions.json b/app/javascript/dashboard/i18n/locale/is/bulkActions.json index dbdb2d970..fbdab2cdb 100644 --- a/app/javascript/dashboard/i18n/locale/is/bulkActions.json +++ b/app/javascript/dashboard/i18n/locale/is/bulkActions.json @@ -17,7 +17,7 @@ "AGENT_LIST_LOADING": "Loading agents", "UPDATE": { "CHANGE_STATUS": "Change status", - "SNOOZE_UNTIL_NEXT_REPLY": "Snooze until next reply.", + "SNOOZE_UNTIL": "Snooze", "UPDATE_SUCCESFUL": "Conversation status updated successfully.", "UPDATE_FAILED": "Failed to update conversations. Please try again." }, diff --git a/app/javascript/dashboard/i18n/locale/is/contact.json b/app/javascript/dashboard/i18n/locale/is/contact.json index e185ec27e..507ca4664 100644 --- a/app/javascript/dashboard/i18n/locale/is/contact.json +++ b/app/javascript/dashboard/i18n/locale/is/contact.json @@ -84,6 +84,7 @@ "CONFIRM": { "TITLE": "Export Contacts", "MESSAGE": "Are you sure you want to export all contacts?", + "FILTERED_MESSAGE": "Are you sure you want to export all the filtered contacts?", "YES": "Yes, Export", "NO": "No, Cancel" } diff --git a/app/javascript/dashboard/i18n/locale/is/generalSettings.json b/app/javascript/dashboard/i18n/locale/is/generalSettings.json index 8c6e8d395..02e892c26 100644 --- a/app/javascript/dashboard/i18n/locale/is/generalSettings.json +++ b/app/javascript/dashboard/i18n/locale/is/generalSettings.json @@ -107,6 +107,7 @@ "GENERAL": "Almennar", "REPORTS": "Skýrslur", "CONVERSATION": "Samtal", + "BULK_ACTIONS": "Bulk Actions", "CHANGE_ASSIGNEE": "Breyta úthlutun", "CHANGE_PRIORITY": "Change Priority", "CHANGE_TEAM": "Breyta Teymi", diff --git a/app/javascript/dashboard/i18n/locale/is/settings.json b/app/javascript/dashboard/i18n/locale/is/settings.json index e1dfb6947..32acdec20 100644 --- a/app/javascript/dashboard/i18n/locale/is/settings.json +++ b/app/javascript/dashboard/i18n/locale/is/settings.json @@ -109,7 +109,8 @@ "SLA_MISSED_FIRST_RESPONSE": "A conversation misses first response SLA", "SLA_MISSED_NEXT_RESPONSE": "A conversation misses next response SLA", "SLA_MISSED_RESOLUTION": "A conversation misses resolution SLA" - } + }, + "BROWSER_PERMISSION": "Enable push notifications for your browser so you’re able to receive them" }, "API": { "UPDATE_SUCCESS": "Tilkynningarstillingarnar þínar hafa verið uppfærðar", diff --git a/app/javascript/dashboard/i18n/locale/it/bulkActions.json b/app/javascript/dashboard/i18n/locale/it/bulkActions.json index 5a4465ac5..320d61f81 100644 --- a/app/javascript/dashboard/i18n/locale/it/bulkActions.json +++ b/app/javascript/dashboard/i18n/locale/it/bulkActions.json @@ -17,7 +17,7 @@ "AGENT_LIST_LOADING": "Caricamento agenti", "UPDATE": { "CHANGE_STATUS": "Cambia stato", - "SNOOZE_UNTIL_NEXT_REPLY": "Posticipa fino alla prossima risposta.", + "SNOOZE_UNTIL": "Posticipa", "UPDATE_SUCCESFUL": "Stato della conversazione aggiornata correttamente.", "UPDATE_FAILED": "Failed to update conversations. Please try again." }, diff --git a/app/javascript/dashboard/i18n/locale/it/contact.json b/app/javascript/dashboard/i18n/locale/it/contact.json index 0db4acc70..02e813746 100644 --- a/app/javascript/dashboard/i18n/locale/it/contact.json +++ b/app/javascript/dashboard/i18n/locale/it/contact.json @@ -84,6 +84,7 @@ "CONFIRM": { "TITLE": "Export Contacts", "MESSAGE": "Are you sure you want to export all contacts?", + "FILTERED_MESSAGE": "Are you sure you want to export all the filtered contacts?", "YES": "Yes, Export", "NO": "No, Cancel" } diff --git a/app/javascript/dashboard/i18n/locale/it/generalSettings.json b/app/javascript/dashboard/i18n/locale/it/generalSettings.json index 9041bc210..ee72c3e97 100644 --- a/app/javascript/dashboard/i18n/locale/it/generalSettings.json +++ b/app/javascript/dashboard/i18n/locale/it/generalSettings.json @@ -107,6 +107,7 @@ "GENERAL": "Generale", "REPORTS": "Rapporti", "CONVERSATION": "Conversazioni", + "BULK_ACTIONS": "Bulk Actions", "CHANGE_ASSIGNEE": "Cambia assegnatario", "CHANGE_PRIORITY": "Change Priority", "CHANGE_TEAM": "Cambia Team", diff --git a/app/javascript/dashboard/i18n/locale/it/settings.json b/app/javascript/dashboard/i18n/locale/it/settings.json index 2bce9004b..7f3ff3627 100644 --- a/app/javascript/dashboard/i18n/locale/it/settings.json +++ b/app/javascript/dashboard/i18n/locale/it/settings.json @@ -109,7 +109,8 @@ "SLA_MISSED_FIRST_RESPONSE": "A conversation misses first response SLA", "SLA_MISSED_NEXT_RESPONSE": "A conversation misses next response SLA", "SLA_MISSED_RESOLUTION": "A conversation misses resolution SLA" - } + }, + "BROWSER_PERMISSION": "Enable push notifications for your browser so you’re able to receive them" }, "API": { "UPDATE_SUCCESS": "Le preferenze per le notifiche sono state aggiornate con successo", diff --git a/app/javascript/dashboard/i18n/locale/ja/bulkActions.json b/app/javascript/dashboard/i18n/locale/ja/bulkActions.json index 029b191a9..223ceeb87 100644 --- a/app/javascript/dashboard/i18n/locale/ja/bulkActions.json +++ b/app/javascript/dashboard/i18n/locale/ja/bulkActions.json @@ -17,7 +17,7 @@ "AGENT_LIST_LOADING": "エージェントを読み込む", "UPDATE": { "CHANGE_STATUS": "Change status", - "SNOOZE_UNTIL_NEXT_REPLY": "Snooze until next reply.", + "SNOOZE_UNTIL": "スヌーズ", "UPDATE_SUCCESFUL": "Conversation status updated successfully.", "UPDATE_FAILED": "Failed to update conversations. Please try again." }, diff --git a/app/javascript/dashboard/i18n/locale/ja/contact.json b/app/javascript/dashboard/i18n/locale/ja/contact.json index 339864d34..20a70df5b 100644 --- a/app/javascript/dashboard/i18n/locale/ja/contact.json +++ b/app/javascript/dashboard/i18n/locale/ja/contact.json @@ -84,6 +84,7 @@ "CONFIRM": { "TITLE": "Export Contacts", "MESSAGE": "Are you sure you want to export all contacts?", + "FILTERED_MESSAGE": "Are you sure you want to export all the filtered contacts?", "YES": "Yes, Export", "NO": "No, Cancel" } diff --git a/app/javascript/dashboard/i18n/locale/ja/generalSettings.json b/app/javascript/dashboard/i18n/locale/ja/generalSettings.json index 0127bf42c..df9e36055 100644 --- a/app/javascript/dashboard/i18n/locale/ja/generalSettings.json +++ b/app/javascript/dashboard/i18n/locale/ja/generalSettings.json @@ -107,6 +107,7 @@ "GENERAL": "General", "REPORTS": "レポート", "CONVERSATION": "Conversation", + "BULK_ACTIONS": "Bulk Actions", "CHANGE_ASSIGNEE": "Change Assignee", "CHANGE_PRIORITY": "Change Priority", "CHANGE_TEAM": "Change Team", diff --git a/app/javascript/dashboard/i18n/locale/ja/settings.json b/app/javascript/dashboard/i18n/locale/ja/settings.json index ff3472b0a..ddac71cdb 100644 --- a/app/javascript/dashboard/i18n/locale/ja/settings.json +++ b/app/javascript/dashboard/i18n/locale/ja/settings.json @@ -109,7 +109,8 @@ "SLA_MISSED_FIRST_RESPONSE": "A conversation misses first response SLA", "SLA_MISSED_NEXT_RESPONSE": "A conversation misses next response SLA", "SLA_MISSED_RESOLUTION": "A conversation misses resolution SLA" - } + }, + "BROWSER_PERMISSION": "Enable push notifications for your browser so you’re able to receive them" }, "API": { "UPDATE_SUCCESS": "通知設定が正常に更新されました", diff --git a/app/javascript/dashboard/i18n/locale/ka/bulkActions.json b/app/javascript/dashboard/i18n/locale/ka/bulkActions.json index 6af8316e9..fe7c8de4a 100644 --- a/app/javascript/dashboard/i18n/locale/ka/bulkActions.json +++ b/app/javascript/dashboard/i18n/locale/ka/bulkActions.json @@ -17,7 +17,7 @@ "AGENT_LIST_LOADING": "Loading agents", "UPDATE": { "CHANGE_STATUS": "Change status", - "SNOOZE_UNTIL_NEXT_REPLY": "Snooze until next reply.", + "SNOOZE_UNTIL": "Snooze", "UPDATE_SUCCESFUL": "Conversation status updated successfully.", "UPDATE_FAILED": "Failed to update conversations. Please try again." }, diff --git a/app/javascript/dashboard/i18n/locale/ka/contact.json b/app/javascript/dashboard/i18n/locale/ka/contact.json index 072322f03..7a4a3af37 100644 --- a/app/javascript/dashboard/i18n/locale/ka/contact.json +++ b/app/javascript/dashboard/i18n/locale/ka/contact.json @@ -84,6 +84,7 @@ "CONFIRM": { "TITLE": "Export Contacts", "MESSAGE": "Are you sure you want to export all contacts?", + "FILTERED_MESSAGE": "Are you sure you want to export all the filtered contacts?", "YES": "Yes, Export", "NO": "No, Cancel" } diff --git a/app/javascript/dashboard/i18n/locale/ka/generalSettings.json b/app/javascript/dashboard/i18n/locale/ka/generalSettings.json index a252d776f..10b72907b 100644 --- a/app/javascript/dashboard/i18n/locale/ka/generalSettings.json +++ b/app/javascript/dashboard/i18n/locale/ka/generalSettings.json @@ -107,6 +107,7 @@ "GENERAL": "General", "REPORTS": "Reports", "CONVERSATION": "Conversation", + "BULK_ACTIONS": "Bulk Actions", "CHANGE_ASSIGNEE": "Change Assignee", "CHANGE_PRIORITY": "Change Priority", "CHANGE_TEAM": "Change Team", diff --git a/app/javascript/dashboard/i18n/locale/ka/settings.json b/app/javascript/dashboard/i18n/locale/ka/settings.json index 94dfcd6c5..fc8d99827 100644 --- a/app/javascript/dashboard/i18n/locale/ka/settings.json +++ b/app/javascript/dashboard/i18n/locale/ka/settings.json @@ -109,7 +109,8 @@ "SLA_MISSED_FIRST_RESPONSE": "A conversation misses first response SLA", "SLA_MISSED_NEXT_RESPONSE": "A conversation misses next response SLA", "SLA_MISSED_RESOLUTION": "A conversation misses resolution SLA" - } + }, + "BROWSER_PERMISSION": "Enable push notifications for your browser so you’re able to receive them" }, "API": { "UPDATE_SUCCESS": "Your notification preferences are updated successfully", diff --git a/app/javascript/dashboard/i18n/locale/ko/bulkActions.json b/app/javascript/dashboard/i18n/locale/ko/bulkActions.json index bf75d9399..2a774aecd 100644 --- a/app/javascript/dashboard/i18n/locale/ko/bulkActions.json +++ b/app/javascript/dashboard/i18n/locale/ko/bulkActions.json @@ -17,7 +17,7 @@ "AGENT_LIST_LOADING": "Loading agents", "UPDATE": { "CHANGE_STATUS": "Change status", - "SNOOZE_UNTIL_NEXT_REPLY": "Snooze until next reply.", + "SNOOZE_UNTIL": "Snooze", "UPDATE_SUCCESFUL": "Conversation status updated successfully.", "UPDATE_FAILED": "Failed to update conversations. Please try again." }, diff --git a/app/javascript/dashboard/i18n/locale/ko/contact.json b/app/javascript/dashboard/i18n/locale/ko/contact.json index b813ff087..a73b63deb 100644 --- a/app/javascript/dashboard/i18n/locale/ko/contact.json +++ b/app/javascript/dashboard/i18n/locale/ko/contact.json @@ -84,6 +84,7 @@ "CONFIRM": { "TITLE": "Export Contacts", "MESSAGE": "Are you sure you want to export all contacts?", + "FILTERED_MESSAGE": "Are you sure you want to export all the filtered contacts?", "YES": "Yes, Export", "NO": "No, Cancel" } diff --git a/app/javascript/dashboard/i18n/locale/ko/generalSettings.json b/app/javascript/dashboard/i18n/locale/ko/generalSettings.json index 2dc7b730a..a2eb25cd7 100644 --- a/app/javascript/dashboard/i18n/locale/ko/generalSettings.json +++ b/app/javascript/dashboard/i18n/locale/ko/generalSettings.json @@ -107,6 +107,7 @@ "GENERAL": "General", "REPORTS": "보고서", "CONVERSATION": "Conversation", + "BULK_ACTIONS": "Bulk Actions", "CHANGE_ASSIGNEE": "Change Assignee", "CHANGE_PRIORITY": "Change Priority", "CHANGE_TEAM": "Change Team", diff --git a/app/javascript/dashboard/i18n/locale/ko/settings.json b/app/javascript/dashboard/i18n/locale/ko/settings.json index 8608e43c3..b8628279f 100644 --- a/app/javascript/dashboard/i18n/locale/ko/settings.json +++ b/app/javascript/dashboard/i18n/locale/ko/settings.json @@ -109,7 +109,8 @@ "SLA_MISSED_FIRST_RESPONSE": "A conversation misses first response SLA", "SLA_MISSED_NEXT_RESPONSE": "A conversation misses next response SLA", "SLA_MISSED_RESOLUTION": "A conversation misses resolution SLA" - } + }, + "BROWSER_PERMISSION": "Enable push notifications for your browser so you’re able to receive them" }, "API": { "UPDATE_SUCCESS": "알림 기본 설정이 성공적으로 업데이트됨", diff --git a/app/javascript/dashboard/i18n/locale/lt/bulkActions.json b/app/javascript/dashboard/i18n/locale/lt/bulkActions.json index 976da20db..b89464acd 100644 --- a/app/javascript/dashboard/i18n/locale/lt/bulkActions.json +++ b/app/javascript/dashboard/i18n/locale/lt/bulkActions.json @@ -17,7 +17,7 @@ "AGENT_LIST_LOADING": "Agentai užkraunami", "UPDATE": { "CHANGE_STATUS": "Pakeisti būseną", - "SNOOZE_UNTIL_NEXT_REPLY": "Atidėti iki kito atsakymo.", + "SNOOZE_UNTIL": "Atidėti", "UPDATE_SUCCESFUL": "Pokalbio būsena atnaujinta sėkmingai.", "UPDATE_FAILED": "Nepavyko atnaujinti pokalbių. Bandykite dar kartą." }, diff --git a/app/javascript/dashboard/i18n/locale/lt/contact.json b/app/javascript/dashboard/i18n/locale/lt/contact.json index 9709ab56e..fa49f9749 100644 --- a/app/javascript/dashboard/i18n/locale/lt/contact.json +++ b/app/javascript/dashboard/i18n/locale/lt/contact.json @@ -84,6 +84,7 @@ "CONFIRM": { "TITLE": "Eksportuoti Kontaktus", "MESSAGE": "Ar esate tikri, kad norite išeksportuoti visus kontaktus?", + "FILTERED_MESSAGE": "Are you sure you want to export all the filtered contacts?", "YES": "Taip, išeksportuoti", "NO": "Ne, atšaukti" } diff --git a/app/javascript/dashboard/i18n/locale/lt/generalSettings.json b/app/javascript/dashboard/i18n/locale/lt/generalSettings.json index 1b38b0141..b3488d4d0 100644 --- a/app/javascript/dashboard/i18n/locale/lt/generalSettings.json +++ b/app/javascript/dashboard/i18n/locale/lt/generalSettings.json @@ -107,6 +107,7 @@ "GENERAL": "Pagrindinis", "REPORTS": "Ataskaitos", "CONVERSATION": "Pokalbis", + "BULK_ACTIONS": "Bulk Actions", "CHANGE_ASSIGNEE": "Pakeisti Priskirtąjį", "CHANGE_PRIORITY": "Pakeisti Prioritetą", "CHANGE_TEAM": "Pakeisti Komandą", diff --git a/app/javascript/dashboard/i18n/locale/lt/settings.json b/app/javascript/dashboard/i18n/locale/lt/settings.json index defb2a1f9..e1e9a17e8 100644 --- a/app/javascript/dashboard/i18n/locale/lt/settings.json +++ b/app/javascript/dashboard/i18n/locale/lt/settings.json @@ -109,7 +109,8 @@ "SLA_MISSED_FIRST_RESPONSE": "A conversation misses first response SLA", "SLA_MISSED_NEXT_RESPONSE": "A conversation misses next response SLA", "SLA_MISSED_RESOLUTION": "A conversation misses resolution SLA" - } + }, + "BROWSER_PERMISSION": "Enable push notifications for your browser so you’re able to receive them" }, "API": { "UPDATE_SUCCESS": "Jūsų perspėjimų nuostatos sėkmingai atnaujintos", diff --git a/app/javascript/dashboard/i18n/locale/lv/bulkActions.json b/app/javascript/dashboard/i18n/locale/lv/bulkActions.json index a2ad9bfb9..42b88f9c4 100644 --- a/app/javascript/dashboard/i18n/locale/lv/bulkActions.json +++ b/app/javascript/dashboard/i18n/locale/lv/bulkActions.json @@ -17,7 +17,7 @@ "AGENT_LIST_LOADING": "Notiek aģentu ielāde", "UPDATE": { "CHANGE_STATUS": "Mainīt statusu", - "SNOOZE_UNTIL_NEXT_REPLY": "Atlikt līdz nākamajai atbildei.", + "SNOOZE_UNTIL": "Atlikt", "UPDATE_SUCCESFUL": "Sarunas statuss ir veiksmīgi atjaunināts.", "UPDATE_FAILED": "Neizdevās atjaunināt sarunas. Lūdzu mēģiniet vēlreiz." }, diff --git a/app/javascript/dashboard/i18n/locale/lv/contact.json b/app/javascript/dashboard/i18n/locale/lv/contact.json index b472ad361..f14e91958 100644 --- a/app/javascript/dashboard/i18n/locale/lv/contact.json +++ b/app/javascript/dashboard/i18n/locale/lv/contact.json @@ -84,6 +84,7 @@ "CONFIRM": { "TITLE": "Eksportēt Kontaktpersonas", "MESSAGE": "Vai vēlaties eksportēt visas kontaktpersonas?", + "FILTERED_MESSAGE": "Vai tiešām vēlaties eksportēt visas filtrētās kontaktpersonas?", "YES": "Jā, Eksportēt", "NO": "Nē, Atcelt" } diff --git a/app/javascript/dashboard/i18n/locale/lv/datePicker.json b/app/javascript/dashboard/i18n/locale/lv/datePicker.json index 264c4402b..b1e7894ab 100644 --- a/app/javascript/dashboard/i18n/locale/lv/datePicker.json +++ b/app/javascript/dashboard/i18n/locale/lv/datePicker.json @@ -1,13 +1,13 @@ { "DATE_PICKER": { "APPLY_BUTTON": "Pielietot", - "CLEAR_BUTTON": "Clear", + "CLEAR_BUTTON": "Notīrīt", "DATE_RANGE_INPUT": { - "START": "Start Date", - "END": "End Date" + "START": "Sākuma Datums", + "END": "Beigu Datums" }, "DATE_RANGE_OPTIONS": { - "TITLE": "DATE RANGE", + "TITLE": "DATUMU DIAPAZONS", "LAST_7_DAYS": "Pēdējās 7 dienas", "LAST_30_DAYS": "Pēdējās 30 dienas", "LAST_3_MONTHS": "Pēdējie 3 mēneši", diff --git a/app/javascript/dashboard/i18n/locale/lv/generalSettings.json b/app/javascript/dashboard/i18n/locale/lv/generalSettings.json index cda081602..860edb902 100644 --- a/app/javascript/dashboard/i18n/locale/lv/generalSettings.json +++ b/app/javascript/dashboard/i18n/locale/lv/generalSettings.json @@ -107,6 +107,7 @@ "GENERAL": "Vispārēji", "REPORTS": "Pārskati", "CONVERSATION": "Saruna", + "BULK_ACTIONS": "Lielapjoma Darbības", "CHANGE_ASSIGNEE": "Mainīt Pilnvaroto", "CHANGE_PRIORITY": "Mainīt prioritāti", "CHANGE_TEAM": "Mainīt Komandu", diff --git a/app/javascript/dashboard/i18n/locale/lv/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/lv/inboxMgmt.json index f51bb773c..e39f07ee5 100644 --- a/app/javascript/dashboard/i18n/locale/lv/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/lv/inboxMgmt.json @@ -22,7 +22,7 @@ "body": "Pievienojiet aģentus izveidotajai iesūtnei." }, { - "title": "Voilà!", + "title": "Gatavs!", "route": "settings_inbox_finish", "body": "Jūs varat sākt darboties!" } @@ -43,7 +43,7 @@ "CHOOSE_PLACEHOLDER": "Izvēlieties lapu no saraksta", "INBOX_NAME": "Iesūtnes Nosaukums", "ADD_NAME": "Pievienojiet savas iesūtnes nosaukumu", - "PICK_NAME": "Pick a Name for your Inbox", + "PICK_NAME": "Lūdzu ievadiet Iesūtnes nosaukumu", "PICK_A_VALUE": "Izvēlieties vērtību" }, "TWITTER": { @@ -62,7 +62,7 @@ }, "CHANNEL_WEBHOOK_URL": { "LABEL": "Webhook URL", - "PLACEHOLDER": "Please enter your Webhook URL", + "PLACEHOLDER": "Lūdzu ievadiet Webhook URL", "ERROR": "Lūdzu, ievadiet derīgu URL" }, "CHANNEL_DOMAIN": { @@ -175,12 +175,12 @@ }, "API_KEY": { "LABEL": "API atslēga", - "PLACEHOLDER": "Please enter your Bandwidth API Key", + "PLACEHOLDER": "Lūdzu ievadiet Bandwidth API Key", "ERROR": "Šis lauks ir nepieciešams" }, "API_SECRET": { "LABEL": "API Secret", - "PLACEHOLDER": "Please enter your Bandwidth API Secret", + "PLACEHOLDER": "Lūdzu ievadiet Bandwidth API Secret", "ERROR": "Šis lauks ir nepieciešams" }, "APPLICATION_ID": { @@ -239,7 +239,7 @@ }, "WEBHOOK_VERIFY_TOKEN": { "LABEL": "Webhook Pārbaudes Token", - "PLACEHOLDER": "Enter a verify token which you want to configure for Facebook webhooks.", + "PLACEHOLDER": "Ievadiet verifikācijas token, ko vēlaties izmantot priekš Facebook webhook.", "ERROR": "Lūdzu, ievadiet derīgu vērtību." }, "API_KEY": { @@ -269,7 +269,7 @@ }, "WEBHOOK_URL": { "LABEL": "Webhook URL", - "SUBTITLE": "Configure the URL where you want to receive callbacks on events.", + "SUBTITLE": "Konfigurēt URL, kurā vēlaties saņemt notikumu atzvanus.", "PLACEHOLDER": "Webhook URL" }, "SUBMIT_BUTTON": "Izveidot API kanālu", @@ -279,7 +279,7 @@ }, "EMAIL_CHANNEL": { "TITLE": "E-pasta Kanāls", - "DESC": "Integrate your email inbox.", + "DESC": "Integrēt sava e-pasta iesūtni.", "CHANNEL_NAME": { "LABEL": "Kanāla Nosaukums", "PLACEHOLDER": "Lūdzu, ievadiet kanāla nosaukumu", @@ -345,7 +345,7 @@ "AGENTS": { "TITLE": "Aģenti", "DESC": "Šeit Jūs varat pievienot aģentus, lai pārvaldītu savu jaunizveidoto iesūtni. Tikai šiem atlasītajiem aģentiem būs piekļuve Jūsu iesūtnei. Aģenti, kas neietilpst šajā iesūtnē, nevarēs redzēt ziņojumus vai atbildēt uz ziņojumiem šajā iesūtnē, kad būs pierakstījušies sistēmā.Agent Bots
Agent Bots are like the most fabulous members of your team. They can handle the small stuff, so you can focus on the stuff that matters. Give them a try.
You can manage your bots from this page or create new ones using the 'Add bot configuraton' button.
Open the Agent bots handbook in another tab for a helping hand.
", "CSML_BOT_EDITOR": { "NAME": { - "LABEL": "Bot name", - "PLACEHOLDER": "Name your bot.", + "LABEL": "機器人名稱", + "PLACEHOLDER": "命名你的機器人", "ERROR": "機器人名稱為必填." }, "DESCRIPTION": { - "LABEL": "Bot description", + "LABEL": "機器人描述", "PLACEHOLDER": "這個機器人的作用是什麼" }, "BOT_CONFIG": { - "ERROR": "Please enter your CSML bot configuration above.", - "API_ERROR": "Your CSML configuration is invalid. Please fix it and try again." + "ERROR": "請在上方輸入你的CSML機器人設定", + "API_ERROR": "你的CSML設定是無效的. 請修正後再試." }, - "SUBMIT": "Validate and save" + "SUBMIT": "驗證並儲存" }, "BOT_CONFIGURATION": { "TITLE": "選擇一個客服機器人", "DESC": "Assign an Agent Bot to your inbox. They can handle initial conversations and transfer them to a live agent when necessary.", "SUBMIT": "更新", - "DISCONNECT": "Disconnect bot", + "DISCONNECT": "取消機器人連結", "SUCCESS_MESSAGE": "成功更新客服機器人.", "DISCONNECTED_SUCCESS_MESSAGE": "成功解除客服機器人連結.", "ERROR_MESSAGE": "Could not update the agent bot. Please try again.", "DISCONNECTED_ERROR_MESSAGE": "Could not disconnect the agent bot. Please try again.", - "SELECT_PLACEHOLDER": "Select bot" + "SELECT_PLACEHOLDER": "選擇機器人" }, "ADD": { "TITLE": "設定新的機器人", "CANCEL_BUTTON_TEXT": "取消", "API": { "SUCCESS_MESSAGE": "機器人新增成功.", - "ERROR_MESSAGE": "Could not add bot. Please try again later." + "ERROR_MESSAGE": "無法新增機器人,請稍後再試." } }, "LIST": { - "404": "No bots found. You can create a bot by clicking the 'Configure new bot' button ↗", - "LOADING": "Fetching bots...", - "TYPE": "Bot type" + "404": "查無機器人,你可以點擊「設定新的機器人」按鈕設定一個機器人", + "LOADING": "正在取得機器人...", + "TYPE": "機器人類型" }, "DELETE": { "BUTTON_TEXT": "刪除", - "TITLE": "Delete bot", + "TITLE": "刪除機器人", "SUBMIT": "刪除", "CANCEL_BUTTON_TEXT": "取消", "DESCRIPTION": "Are you sure you want to delete this bot? This action is irreversible.", @@ -57,17 +57,17 @@ }, "EDIT": { "BUTTON_TEXT": "編輯", - "LOADING": "Fetching bots...", - "TITLE": "Edit bot", + "LOADING": "正在取得機器人...", + "TITLE": "編輯機器人", "CANCEL_BUTTON_TEXT": "取消", "API": { "SUCCESS_MESSAGE": "機器人更新成功.", - "ERROR_MESSAGE": "Could not update bot. Please try again." + "ERROR_MESSAGE": "無法更新機器人,請稍後再試" } }, "TYPES": { - "WEBHOOK": "Webhook bot", - "CSML": "CSML bot" + "WEBHOOK": "Webhook 機器人", + "CSML": "CSML 機器人" } } } diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/bulkActions.json b/app/javascript/dashboard/i18n/locale/zh_TW/bulkActions.json index ea3f02a43..1f80e99f5 100644 --- a/app/javascript/dashboard/i18n/locale/zh_TW/bulkActions.json +++ b/app/javascript/dashboard/i18n/locale/zh_TW/bulkActions.json @@ -4,11 +4,11 @@ "AGENT_SELECT_LABEL": "選擇客服", "ASSIGN_CONFIRMATION_LABEL": "Are you sure to assign %{conversationCount} %{conversationLabel} to", "UNASSIGN_CONFIRMATION_LABEL": "Are you sure to unassign %{conversationCount} %{conversationLabel}?", - "GO_BACK_LABEL": "Go back", + "GO_BACK_LABEL": "返回", "ASSIGN_LABEL": "指派", "YES": "是", - "ASSIGN_AGENT_TOOLTIP": "Assign agent", - "ASSIGN_TEAM_TOOLTIP": "Assign team", + "ASSIGN_AGENT_TOOLTIP": "指派客服", + "ASSIGN_TEAM_TOOLTIP": "指派團隊", "ASSIGN_SUCCESFUL": "Conversations assigned successfully.", "ASSIGN_FAILED": "Failed to assign conversations. Please try again.", "RESOLVE_SUCCESFUL": "Conversations resolved successfully.", @@ -17,7 +17,7 @@ "AGENT_LIST_LOADING": "Loading agents", "UPDATE": { "CHANGE_STATUS": "Change status", - "SNOOZE_UNTIL_NEXT_REPLY": "Snooze until next reply.", + "SNOOZE_UNTIL": "Snooze", "UPDATE_SUCCESFUL": "Conversation status updated successfully.", "UPDATE_FAILED": "Failed to update conversations. Please try again." }, diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/cannedMgmt.json b/app/javascript/dashboard/i18n/locale/zh_TW/cannedMgmt.json index dce1758d9..bdf71dec7 100644 --- a/app/javascript/dashboard/i18n/locale/zh_TW/cannedMgmt.json +++ b/app/javascript/dashboard/i18n/locale/zh_TW/cannedMgmt.json @@ -28,7 +28,7 @@ "CONTENT": { "LABEL": "訊息", "PLACEHOLDER": "Please write the message you want to save as a template to use later.", - "ERROR": "Message is required." + "ERROR": "訊息為必填." }, "SUBMIT": "送出" }, @@ -38,7 +38,7 @@ } }, "EDIT": { - "TITLE": "Edit canned response", + "TITLE": "編輯罐頭回覆", "CANCEL_BUTTON_TEXT": "取消操作", "FORM": { "SHORT_CODE": { diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/contact.json b/app/javascript/dashboard/i18n/locale/zh_TW/contact.json index a42ea8e3f..6902a3e63 100644 --- a/app/javascript/dashboard/i18n/locale/zh_TW/contact.json +++ b/app/javascript/dashboard/i18n/locale/zh_TW/contact.json @@ -84,6 +84,7 @@ "CONFIRM": { "TITLE": "Export Contacts", "MESSAGE": "Are you sure you want to export all contacts?", + "FILTERED_MESSAGE": "Are you sure you want to export all the filtered contacts?", "YES": "Yes, Export", "NO": "No, Cancel" } diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/generalSettings.json b/app/javascript/dashboard/i18n/locale/zh_TW/generalSettings.json index 2d3949f38..49f69de56 100644 --- a/app/javascript/dashboard/i18n/locale/zh_TW/generalSettings.json +++ b/app/javascript/dashboard/i18n/locale/zh_TW/generalSettings.json @@ -107,6 +107,7 @@ "GENERAL": "General", "REPORTS": "報表", "CONVERSATION": "對話", + "BULK_ACTIONS": "Bulk Actions", "CHANGE_ASSIGNEE": "Change Assignee", "CHANGE_PRIORITY": "Change Priority", "CHANGE_TEAM": "Change Team", diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/settings.json b/app/javascript/dashboard/i18n/locale/zh_TW/settings.json index 73798b909..1e57f93e0 100644 --- a/app/javascript/dashboard/i18n/locale/zh_TW/settings.json +++ b/app/javascript/dashboard/i18n/locale/zh_TW/settings.json @@ -109,7 +109,8 @@ "SLA_MISSED_FIRST_RESPONSE": "A conversation misses first response SLA", "SLA_MISSED_NEXT_RESPONSE": "A conversation misses next response SLA", "SLA_MISSED_RESOLUTION": "A conversation misses resolution SLA" - } + }, + "BROWSER_PERMISSION": "Enable push notifications for your browser so you’re able to receive them" }, "API": { "UPDATE_SUCCESS": "您的通知設定已成功更新", diff --git a/app/javascript/dashboard/mixins/uiSettings.js b/app/javascript/dashboard/mixins/uiSettings.js index 2c60db3cb..f3743c402 100644 --- a/app/javascript/dashboard/mixins/uiSettings.js +++ b/app/javascript/dashboard/mixins/uiSettings.js @@ -15,7 +15,7 @@ export const DEFAULT_CONTACT_SIDEBAR_ITEMS_ORDER = [ ]; const slugifyChannel = name => - name.toLowerCase().replace(' ', '_').replace('-', '_').replace('::', '_'); + name?.toLowerCase().replace(' ', '_').replace('-', '_').replace('::', '_'); export const isEditorHotKeyEnabled = (uiSettings, key) => { const { @@ -70,6 +70,8 @@ export default { this.updateUISettings({ [key]: !this.isContactSidebarItemOpen(key) }); }, setSignatureFlagForInbox(channelType, value) { + if (!channelType) return; + channelType = slugifyChannel(channelType); this.updateUISettings({ [`${channelType}_signature_enabled`]: value, diff --git a/app/javascript/dashboard/routes/dashboard/commands/bulkActionsHotKeys.js b/app/javascript/dashboard/routes/dashboard/commands/bulkActionsHotKeys.js new file mode 100644 index 000000000..2071fee44 --- /dev/null +++ b/app/javascript/dashboard/routes/dashboard/commands/bulkActionsHotKeys.js @@ -0,0 +1,85 @@ +import { mapGetters } from 'vuex'; +import wootConstants from 'dashboard/constants/globals'; + +import { + CMD_BULK_ACTION_SNOOZE_CONVERSATION, + CMD_BULK_ACTION_REOPEN_CONVERSATION, + CMD_BULK_ACTION_RESOLVE_CONVERSATION, +} from './commandBarBusEvents'; +import { + ICON_SNOOZE_CONVERSATION, + ICON_REOPEN_CONVERSATION, + ICON_RESOLVE_CONVERSATION, +} from './CommandBarIcons'; + +import { createSnoozeHandlers } from './commandBarActions'; + +const SNOOZE_OPTIONS = wootConstants.SNOOZE_OPTIONS; + +export const SNOOZE_CONVERSATION_BULK_ACTIONS = [ + { + id: 'bulk_action_snooze_conversation', + title: 'COMMAND_BAR.COMMANDS.SNOOZE_CONVERSATION', + section: 'COMMAND_BAR.SECTIONS.BULK_ACTIONS', + icon: ICON_SNOOZE_CONVERSATION, + children: Object.values(SNOOZE_OPTIONS), + }, + ...createSnoozeHandlers( + CMD_BULK_ACTION_SNOOZE_CONVERSATION, + 'bulk_action_snooze_conversation', + 'COMMAND_BAR.SECTIONS.BULK_ACTIONS' + ), +]; + +export const RESOLVED_CONVERSATION_BULK_ACTIONS = [ + { + id: 'bulk_action_reopen_conversation', + title: 'COMMAND_BAR.COMMANDS.REOPEN_CONVERSATION', + section: 'COMMAND_BAR.SECTIONS.BULK_ACTIONS', + icon: ICON_REOPEN_CONVERSATION, + handler: () => bus.$emit(CMD_BULK_ACTION_REOPEN_CONVERSATION), + }, +]; + +export const OPEN_CONVERSATION_BULK_ACTIONS = [ + { + id: 'bulk_action_resolve_conversation', + title: 'COMMAND_BAR.COMMANDS.RESOLVE_CONVERSATION', + section: 'COMMAND_BAR.SECTIONS.BULK_ACTIONS', + icon: ICON_RESOLVE_CONVERSATION, + handler: () => bus.$emit(CMD_BULK_ACTION_RESOLVE_CONVERSATION), + }, +]; + +export default { + computed: { + ...mapGetters({ + selectedConversations: 'bulkActions/getSelectedConversationIds', + }), + bulkActionsHotKeys() { + let actions = []; + if (this.selectedConversations.length > 0) { + actions = [ + ...SNOOZE_CONVERSATION_BULK_ACTIONS, + ...RESOLVED_CONVERSATION_BULK_ACTIONS, + ...OPEN_CONVERSATION_BULK_ACTIONS, + ]; + } + return this.prepareActions(actions); + }, + }, + watch: { + selectedConversations() { + this.setCommandbarData(); + }, + }, + methods: { + prepareActions(actions) { + return actions.map(action => ({ + ...action, + title: this.$t(action.title), + section: this.$t(action.section), + })); + }, + }, +}; diff --git a/app/javascript/dashboard/routes/dashboard/commands/commandBarActions.js b/app/javascript/dashboard/routes/dashboard/commands/commandBarActions.js index 1c728b01c..8be375e30 100644 --- a/app/javascript/dashboard/routes/dashboard/commands/commandBarActions.js +++ b/app/javascript/dashboard/routes/dashboard/commands/commandBarActions.js @@ -30,6 +30,17 @@ export const OPEN_CONVERSATION_ACTIONS = [ }, ]; +export const createSnoozeHandlers = (busEventName, parentId, section) => { + return Object.values(SNOOZE_OPTIONS).map(option => ({ + id: option, + title: `COMMAND_BAR.COMMANDS.${option.toUpperCase()}`, + parent: parentId, + section: section, + icon: ICON_SNOOZE_CONVERSATION, + handler: () => bus.$emit(busEventName, option), + })); +}; + export const SNOOZE_CONVERSATION_ACTIONS = [ { id: 'snooze_conversation', @@ -37,61 +48,11 @@ export const SNOOZE_CONVERSATION_ACTIONS = [ icon: ICON_SNOOZE_CONVERSATION, children: Object.values(SNOOZE_OPTIONS), }, - - { - id: SNOOZE_OPTIONS.UNTIL_NEXT_REPLY, - title: 'COMMAND_BAR.COMMANDS.UNTIL_NEXT_REPLY', - parent: 'snooze_conversation', - section: 'COMMAND_BAR.SECTIONS.SNOOZE_CONVERSATION', - icon: ICON_SNOOZE_CONVERSATION, - handler: () => - bus.$emit(CMD_SNOOZE_CONVERSATION, SNOOZE_OPTIONS.UNTIL_NEXT_REPLY), - }, - { - id: SNOOZE_OPTIONS.AN_HOUR_FROM_NOW, - title: 'COMMAND_BAR.COMMANDS.AN_HOUR_FROM_NOW', - parent: 'snooze_conversation', - section: 'COMMAND_BAR.SECTIONS.SNOOZE_CONVERSATION', - icon: ICON_SNOOZE_CONVERSATION, - handler: () => - bus.$emit(CMD_SNOOZE_CONVERSATION, SNOOZE_OPTIONS.AN_HOUR_FROM_NOW), - }, - { - id: SNOOZE_OPTIONS.UNTIL_TOMORROW, - title: 'COMMAND_BAR.COMMANDS.UNTIL_TOMORROW', - section: 'COMMAND_BAR.SECTIONS.SNOOZE_CONVERSATION', - parent: 'snooze_conversation', - icon: ICON_SNOOZE_CONVERSATION, - handler: () => - bus.$emit(CMD_SNOOZE_CONVERSATION, SNOOZE_OPTIONS.UNTIL_TOMORROW), - }, - { - id: SNOOZE_OPTIONS.UNTIL_NEXT_WEEK, - title: 'COMMAND_BAR.COMMANDS.UNTIL_NEXT_WEEK', - section: 'COMMAND_BAR.SECTIONS.SNOOZE_CONVERSATION', - parent: 'snooze_conversation', - icon: ICON_SNOOZE_CONVERSATION, - handler: () => - bus.$emit(CMD_SNOOZE_CONVERSATION, SNOOZE_OPTIONS.UNTIL_NEXT_WEEK), - }, - { - id: SNOOZE_OPTIONS.UNTIL_NEXT_MONTH, - title: 'COMMAND_BAR.COMMANDS.UNTIL_NEXT_MONTH', - section: 'COMMAND_BAR.SECTIONS.SNOOZE_CONVERSATION', - parent: 'snooze_conversation', - icon: ICON_SNOOZE_CONVERSATION, - handler: () => - bus.$emit(CMD_SNOOZE_CONVERSATION, SNOOZE_OPTIONS.UNTIL_NEXT_MONTH), - }, - { - id: SNOOZE_OPTIONS.UNTIL_CUSTOM_TIME, - title: 'COMMAND_BAR.COMMANDS.CUSTOM', - section: 'COMMAND_BAR.SECTIONS.SNOOZE_CONVERSATION', - parent: 'snooze_conversation', - icon: ICON_SNOOZE_CONVERSATION, - handler: () => - bus.$emit(CMD_SNOOZE_CONVERSATION, SNOOZE_OPTIONS.UNTIL_CUSTOM_TIME), - }, + ...createSnoozeHandlers( + CMD_SNOOZE_CONVERSATION, + 'snooze_conversation', + 'COMMAND_BAR.SECTIONS.SNOOZE_CONVERSATION' + ), ]; export const RESOLVED_CONVERSATION_ACTIONS = [ diff --git a/app/javascript/dashboard/routes/dashboard/commands/commandBarBusEvents.js b/app/javascript/dashboard/routes/dashboard/commands/commandBarBusEvents.js index 86e417ad7..f42688f54 100644 --- a/app/javascript/dashboard/routes/dashboard/commands/commandBarBusEvents.js +++ b/app/javascript/dashboard/routes/dashboard/commands/commandBarBusEvents.js @@ -16,5 +16,13 @@ export const CMD_RESOLVE_CONVERSATION = 'CMD_RESOLVE_CONVERSATION'; export const CMD_SNOOZE_CONVERSATION = 'CMD_SNOOZE_CONVERSATION'; export const CMD_AI_ASSIST = 'CMD_AI_ASSIST'; +// Bulk Actions +export const CMD_BULK_ACTION_SNOOZE_CONVERSATION = + 'CMD_BULK_ACTION_SNOOZE_CONVERSATION'; +export const CMD_BULK_ACTION_REOPEN_CONVERSATION = + 'CMD_BULK_ACTION_REOPEN_CONVERSATION'; +export const CMD_BULK_ACTION_RESOLVE_CONVERSATION = + 'CMD_BULK_ACTION_RESOLVE_CONVERSATION'; + // Inbox Commands (Notifications) export const CMD_SNOOZE_NOTIFICATION = 'CMD_SNOOZE_NOTIFICATION'; diff --git a/app/javascript/dashboard/routes/dashboard/commands/commandbar.vue b/app/javascript/dashboard/routes/dashboard/commands/commandbar.vue index 45b807fb3..6174d3569 100644 --- a/app/javascript/dashboard/routes/dashboard/commands/commandbar.vue +++ b/app/javascript/dashboard/routes/dashboard/commands/commandbar.vue @@ -6,12 +6,15 @@ hideBreadcrumbs :placeholder="placeholder" @selected="onSelected" + @closed="onClosed" /> diff --git a/app/javascript/dashboard/routes/dashboard/commands/conversationHotKeys.js b/app/javascript/dashboard/routes/dashboard/commands/conversationHotKeys.js index 5d0b1960d..aaa73c5d4 100644 --- a/app/javascript/dashboard/routes/dashboard/commands/conversationHotKeys.js +++ b/app/javascript/dashboard/routes/dashboard/commands/conversationHotKeys.js @@ -55,11 +55,15 @@ export default { replyMode() { this.setCommandbarData(); }, + contextMenuChatId() { + this.setCommandbarData(); + }, }, computed: { ...mapGetters({ currentChat: 'getSelectedChat', replyMode: 'draftMessages/getReplyEditorMode', + contextMenuChatId: 'getContextMenuChatId', }), draftMessage() { return this.$store.getters['draftMessages/get'](this.draftKey); @@ -93,6 +97,7 @@ export default { } return this.prepareActions(actions); }, + priorityOptions() { return [ { @@ -327,25 +332,42 @@ export default { ]; }, - conversationHotKeys() { - if ( + isConversationOrInboxRoute() { + return ( isAConversationRoute(this.$route.name) || isAInboxViewRoute(this.$route.name) - ) { - const defaultConversationHotKeys = [ - ...this.statusActions, - ...this.conversationAdditionalActions, - ...this.assignAgentActions, - ...this.assignTeamActions, - ...this.labelActions, - ...this.assignPriorityActions, - ]; - if (this.isAIIntegrationEnabled) { - return [...defaultConversationHotKeys, ...this.AIAssistActions]; - } - return defaultConversationHotKeys; - } + ); + }, + shouldShowSnoozeOption() { + return ( + isAConversationRoute(this.$route.name, true, false) && + this.contextMenuChatId + ); + }, + + getDefaultConversationHotKeys() { + const defaultConversationHotKeys = [ + ...this.statusActions, + ...this.conversationAdditionalActions, + ...this.assignAgentActions, + ...this.assignTeamActions, + ...this.labelActions, + ...this.assignPriorityActions, + ]; + if (this.isAIIntegrationEnabled) { + return [...defaultConversationHotKeys, ...this.AIAssistActions]; + } + return defaultConversationHotKeys; + }, + + conversationHotKeys() { + if (this.shouldShowSnoozeOption) { + return this.prepareActions(SNOOZE_CONVERSATION_ACTIONS); + } + if (this.isConversationOrInboxRoute) { + return this.getDefaultConversationHotKeys; + } return []; }, }, diff --git a/app/javascript/dashboard/routes/dashboard/conversation/ContactPanel.vue b/app/javascript/dashboard/routes/dashboard/conversation/ContactPanel.vue index aa5f5cc12..731ac26e4 100644 --- a/app/javascript/dashboard/routes/dashboard/conversation/ContactPanel.vue +++ b/app/javascript/dashboard/routes/dashboard/conversation/ContactPanel.vue @@ -145,7 +145,6 @@ import CustomAttributes from './customAttributes/CustomAttributes.vue'; import draggable from 'vuedraggable'; import uiSettingsMixin from 'dashboard/mixins/uiSettings'; import MacrosList from './Macros/List.vue'; - export default { components: { AccordionItem, diff --git a/app/javascript/dashboard/routes/dashboard/inbox/InboxList.vue b/app/javascript/dashboard/routes/dashboard/inbox/InboxList.vue index 93ba310c3..f120bbea5 100644 --- a/app/javascript/dashboard/routes/dashboard/inbox/InboxList.vue +++ b/app/javascript/dashboard/routes/dashboard/inbox/InboxList.vue @@ -47,6 +47,7 @@ - + + + +
-
-