Compare commits
51
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
dbe4bc2833 | ||
|
|
e9950afb1a | ||
|
|
f21298aeb9 | ||
|
|
7b6a56714f | ||
|
|
94a20af9db | ||
|
|
616371adbb | ||
|
|
2d4ef0c328 | ||
|
|
5e6e234afe | ||
|
|
18e9e771b5 | ||
|
|
0245e01763 | ||
|
|
1c9993e01b | ||
|
|
fcd40e9636 | ||
|
|
4f5c5e9f85 | ||
|
|
cb07ac16d1 | ||
|
|
4fa299ff15 | ||
|
|
71e9566854 | ||
|
|
a1a59684cd | ||
|
|
272f920811 | ||
|
|
e39d19b1e8 | ||
|
|
6c39aed882 | ||
|
|
8d43101892 | ||
|
|
f05535c5ad | ||
|
|
4503ba018d | ||
|
|
8bc2bc6d40 | ||
|
|
bfd192ebb2 | ||
|
|
6e13d22ff7 | ||
|
|
3e8b6e1aee | ||
|
|
3038aaef67 | ||
|
|
57a68666cb | ||
|
|
4acb824857 | ||
|
|
5c74674c2b | ||
|
|
52e49d5f9d | ||
|
|
e529e1206e | ||
|
|
a8009c7b39 | ||
|
|
99bb074656 | ||
|
|
9322112481 | ||
|
|
ce4cfee8bd | ||
|
|
f31fc2b375 | ||
|
|
e5f7807833 | ||
|
|
2483d99d3c | ||
|
|
336584c95a | ||
|
|
9ebabb9832 | ||
|
|
2acf09b3eb | ||
|
|
d18d3e9e2e | ||
|
|
deec1d213b | ||
|
|
25c3fb3c36 | ||
|
|
e2a6dc3e04 | ||
|
|
57feedbf25 | ||
|
|
71310c21ad | ||
|
|
623cd72897 | ||
|
|
04aa13e8aa |
@@ -15,9 +15,9 @@ defaults: &defaults
|
|||||||
- image: cimg/postgres:15.3
|
- image: cimg/postgres:15.3
|
||||||
- image: cimg/redis:6.2.6
|
- image: cimg/redis:6.2.6
|
||||||
environment:
|
environment:
|
||||||
- RAILS_LOG_TO_STDOUT: false
|
- RAILS_LOG_TO_STDOUT: false
|
||||||
- COVERAGE: true
|
- COVERAGE: true
|
||||||
- LOG_LEVEL: warn
|
- LOG_LEVEL: warn
|
||||||
parallelism: 4
|
parallelism: 4
|
||||||
resource_class: large
|
resource_class: large
|
||||||
|
|
||||||
@@ -46,7 +46,7 @@ jobs:
|
|||||||
export NVM_DIR="$HOME/.nvm"
|
export NVM_DIR="$HOME/.nvm"
|
||||||
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
|
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
|
||||||
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"
|
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"
|
||||||
nvm install v16
|
nvm install v20
|
||||||
echo 'export NVM_DIR="$HOME/.nvm"' >> $BASH_ENV
|
echo 'export NVM_DIR="$HOME/.nvm"' >> $BASH_ENV
|
||||||
echo '[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"' >> $BASH_ENV
|
echo '[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"' >> $BASH_ENV
|
||||||
|
|
||||||
@@ -64,7 +64,6 @@ jobs:
|
|||||||
- ~/.bundle
|
- ~/.bundle
|
||||||
key: chatwoot-bundle-{{ .Environment.CACHE_VERSION }}-v20220524-{{ checksum "Gemfile.lock" }}
|
key: chatwoot-bundle-{{ .Environment.CACHE_VERSION }}-v20220524-{{ checksum "Gemfile.lock" }}
|
||||||
|
|
||||||
|
|
||||||
# Only necessary if app uses webpacker or yarn in some other way
|
# Only necessary if app uses webpacker or yarn in some other way
|
||||||
- restore_cache:
|
- restore_cache:
|
||||||
keys:
|
keys:
|
||||||
@@ -82,7 +81,7 @@ jobs:
|
|||||||
- ~/.cache/yarn
|
- ~/.cache/yarn
|
||||||
|
|
||||||
- run:
|
- run:
|
||||||
name: Download cc-test-reporter
|
name: Download cc-test-reporter
|
||||||
command: |
|
command: |
|
||||||
mkdir -p ~/tmp
|
mkdir -p ~/tmp
|
||||||
curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ~/tmp/cc-test-reporter
|
curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ~/tmp/cc-test-reporter
|
||||||
@@ -182,7 +181,7 @@ jobs:
|
|||||||
- attach_workspace:
|
- attach_workspace:
|
||||||
at: ~/build
|
at: ~/build
|
||||||
- run:
|
- run:
|
||||||
name: Download cc-test-reporter
|
name: Download cc-test-reporter
|
||||||
command: |
|
command: |
|
||||||
mkdir -p ~/tmp
|
mkdir -p ~/tmp
|
||||||
curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ~/tmp/cc-test-reporter
|
curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ~/tmp/cc-test-reporter
|
||||||
@@ -204,4 +203,4 @@ workflows:
|
|||||||
- build
|
- build
|
||||||
- upload-coverage:
|
- upload-coverage:
|
||||||
requires:
|
requires:
|
||||||
- build
|
- build
|
||||||
|
|||||||
@@ -199,6 +199,8 @@ ANDROID_SHA256_CERT_FINGERPRINT=AC:73:8E:DE:EB:56:EA:CC:10:87:02:A7:65:37:7B:38:
|
|||||||
## Rack Attack configuration
|
## Rack Attack configuration
|
||||||
## To prevent and throttle abusive requests
|
## To prevent and throttle abusive requests
|
||||||
# ENABLE_RACK_ATTACK=true
|
# ENABLE_RACK_ATTACK=true
|
||||||
|
# RACK_ATTACK_IP_LIMIT=3000
|
||||||
|
# ENABLE_RACK_ATTACK_WIDGET_API=true
|
||||||
|
|
||||||
## Running chatwoot as an API only server
|
## Running chatwoot as an API only server
|
||||||
## setting this value to true will disable the frontend dashboard endpoints
|
## setting this value to true will disable the frontend dashboard endpoints
|
||||||
|
|||||||
@@ -52,7 +52,8 @@ jobs:
|
|||||||
|
|
||||||
- uses: actions/setup-node@v3
|
- uses: actions/setup-node@v3
|
||||||
with:
|
with:
|
||||||
node-version: 16
|
node-version: 20
|
||||||
|
cache: yarn
|
||||||
|
|
||||||
- name: yarn
|
- name: yarn
|
||||||
run: yarn install
|
run: yarn install
|
||||||
@@ -75,6 +76,8 @@ jobs:
|
|||||||
- name: Run backend tests
|
- name: Run backend tests
|
||||||
run: |
|
run: |
|
||||||
bundle exec rspec --profile=10 --format documentation
|
bundle exec rspec --profile=10 --format documentation
|
||||||
|
env:
|
||||||
|
NODE_OPTIONS: --openssl-legacy-provider
|
||||||
|
|
||||||
- name: Upload rails log folder
|
- name: Upload rails log folder
|
||||||
uses: actions/upload-artifact@v3
|
uses: actions/upload-artifact@v3
|
||||||
|
|||||||
@@ -51,7 +51,8 @@ jobs:
|
|||||||
|
|
||||||
- uses: actions/setup-node@v3
|
- uses: actions/setup-node@v3
|
||||||
with:
|
with:
|
||||||
node-version: 16
|
node-version: 20
|
||||||
|
cache: yarn
|
||||||
|
|
||||||
- name: yarn
|
- name: yarn
|
||||||
run: yarn install
|
run: yarn install
|
||||||
|
|||||||
@@ -21,7 +21,8 @@ jobs:
|
|||||||
|
|
||||||
- uses: actions/setup-node@v3
|
- uses: actions/setup-node@v3
|
||||||
with:
|
with:
|
||||||
node-version: 16
|
node-version: 20
|
||||||
|
cache: 'yarn'
|
||||||
|
|
||||||
- name: yarn
|
- name: yarn
|
||||||
run: yarn install
|
run: yarn install
|
||||||
@@ -30,9 +31,11 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
rm -rf enterprise
|
rm -rf enterprise
|
||||||
rm -rf spec/enterprise
|
rm -rf spec/enterprise
|
||||||
|
|
||||||
- name: Run asset compile
|
- name: Run asset compile
|
||||||
run: bundle exec rake assets:precompile
|
run: bundle exec rake assets:precompile
|
||||||
|
env:
|
||||||
|
NODE_OPTIONS: --openssl-legacy-provider
|
||||||
|
|
||||||
- name: Size Check
|
- name: Size Check
|
||||||
run: yarn run size
|
run: yarn run size
|
||||||
|
|||||||
+3
-7
@@ -8,15 +8,11 @@ Layout/LineLength:
|
|||||||
Max: 150
|
Max: 150
|
||||||
|
|
||||||
Metrics/ClassLength:
|
Metrics/ClassLength:
|
||||||
Max: 125
|
Max: 175
|
||||||
Exclude:
|
Exclude:
|
||||||
- 'app/models/conversation.rb'
|
|
||||||
- 'app/models/contact.rb'
|
|
||||||
- 'app/mailers/conversation_reply_mailer.rb'
|
|
||||||
- 'app/models/message.rb'
|
- 'app/models/message.rb'
|
||||||
- 'app/builders/messages/facebook/message_builder.rb'
|
- 'app/models/conversation.rb'
|
||||||
- 'app/controllers/api/v1/accounts/contacts_controller.rb'
|
|
||||||
- 'app/listeners/action_cable_listener.rb'
|
|
||||||
RSpec/ExampleLength:
|
RSpec/ExampleLength:
|
||||||
Max: 25
|
Max: 25
|
||||||
Style/Documentation:
|
Style/Documentation:
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ ruby '3.2.2'
|
|||||||
|
|
||||||
##-- base gems for rails --##
|
##-- base gems for rails --##
|
||||||
gem 'rack-cors', require: 'rack/cors'
|
gem 'rack-cors', require: 'rack/cors'
|
||||||
gem 'rails', '~> 7.0.7.2'
|
gem 'rails', '~> 7.0.8.0'
|
||||||
# Reduces boot times through caching; required in config/boot.rb
|
# Reduces boot times through caching; required in config/boot.rb
|
||||||
gem 'bootsnap', require: false
|
gem 'bootsnap', require: false
|
||||||
|
|
||||||
@@ -108,14 +108,14 @@ gem 'elastic-apm', require: false
|
|||||||
gem 'newrelic_rpm', require: false
|
gem 'newrelic_rpm', require: false
|
||||||
gem 'newrelic-sidekiq-metrics', require: false
|
gem 'newrelic-sidekiq-metrics', require: false
|
||||||
gem 'scout_apm', require: false
|
gem 'scout_apm', require: false
|
||||||
gem 'sentry-rails', '>= 5.10.0', require: false
|
gem 'sentry-rails', '>= 5.11.0', require: false
|
||||||
gem 'sentry-ruby', require: false
|
gem 'sentry-ruby', require: false
|
||||||
gem 'sentry-sidekiq', '>= 5.10.0', require: false
|
gem 'sentry-sidekiq', '>= 5.11.0', require: false
|
||||||
|
|
||||||
##-- background job processing --##
|
##-- background job processing --##
|
||||||
gem 'sidekiq'
|
gem 'sidekiq', '>= 7.1.3'
|
||||||
# We want cron jobs
|
# We want cron jobs
|
||||||
gem 'sidekiq-cron'
|
gem 'sidekiq-cron', '>= 1.10.1'
|
||||||
|
|
||||||
##-- Push notification service --##
|
##-- Push notification service --##
|
||||||
gem 'fcm'
|
gem 'fcm'
|
||||||
@@ -188,7 +188,7 @@ group :development do
|
|||||||
gem 'bullet'
|
gem 'bullet'
|
||||||
gem 'letter_opener'
|
gem 'letter_opener'
|
||||||
gem 'scss_lint', require: false
|
gem 'scss_lint', require: false
|
||||||
gem 'web-console'
|
gem 'web-console', '>= 4.2.1'
|
||||||
|
|
||||||
# used in swagger build
|
# used in swagger build
|
||||||
gem 'json_refs'
|
gem 'json_refs'
|
||||||
|
|||||||
+80
-80
@@ -33,70 +33,70 @@ GIT
|
|||||||
GEM
|
GEM
|
||||||
remote: https://rubygems.org/
|
remote: https://rubygems.org/
|
||||||
specs:
|
specs:
|
||||||
actioncable (7.0.7.2)
|
actioncable (7.0.8)
|
||||||
actionpack (= 7.0.7.2)
|
actionpack (= 7.0.8)
|
||||||
activesupport (= 7.0.7.2)
|
activesupport (= 7.0.8)
|
||||||
nio4r (~> 2.0)
|
nio4r (~> 2.0)
|
||||||
websocket-driver (>= 0.6.1)
|
websocket-driver (>= 0.6.1)
|
||||||
actionmailbox (7.0.7.2)
|
actionmailbox (7.0.8)
|
||||||
actionpack (= 7.0.7.2)
|
actionpack (= 7.0.8)
|
||||||
activejob (= 7.0.7.2)
|
activejob (= 7.0.8)
|
||||||
activerecord (= 7.0.7.2)
|
activerecord (= 7.0.8)
|
||||||
activestorage (= 7.0.7.2)
|
activestorage (= 7.0.8)
|
||||||
activesupport (= 7.0.7.2)
|
activesupport (= 7.0.8)
|
||||||
mail (>= 2.7.1)
|
mail (>= 2.7.1)
|
||||||
net-imap
|
net-imap
|
||||||
net-pop
|
net-pop
|
||||||
net-smtp
|
net-smtp
|
||||||
actionmailer (7.0.7.2)
|
actionmailer (7.0.8)
|
||||||
actionpack (= 7.0.7.2)
|
actionpack (= 7.0.8)
|
||||||
actionview (= 7.0.7.2)
|
actionview (= 7.0.8)
|
||||||
activejob (= 7.0.7.2)
|
activejob (= 7.0.8)
|
||||||
activesupport (= 7.0.7.2)
|
activesupport (= 7.0.8)
|
||||||
mail (~> 2.5, >= 2.5.4)
|
mail (~> 2.5, >= 2.5.4)
|
||||||
net-imap
|
net-imap
|
||||||
net-pop
|
net-pop
|
||||||
net-smtp
|
net-smtp
|
||||||
rails-dom-testing (~> 2.0)
|
rails-dom-testing (~> 2.0)
|
||||||
actionpack (7.0.7.2)
|
actionpack (7.0.8)
|
||||||
actionview (= 7.0.7.2)
|
actionview (= 7.0.8)
|
||||||
activesupport (= 7.0.7.2)
|
activesupport (= 7.0.8)
|
||||||
rack (~> 2.0, >= 2.2.4)
|
rack (~> 2.0, >= 2.2.4)
|
||||||
rack-test (>= 0.6.3)
|
rack-test (>= 0.6.3)
|
||||||
rails-dom-testing (~> 2.0)
|
rails-dom-testing (~> 2.0)
|
||||||
rails-html-sanitizer (~> 1.0, >= 1.2.0)
|
rails-html-sanitizer (~> 1.0, >= 1.2.0)
|
||||||
actiontext (7.0.7.2)
|
actiontext (7.0.8)
|
||||||
actionpack (= 7.0.7.2)
|
actionpack (= 7.0.8)
|
||||||
activerecord (= 7.0.7.2)
|
activerecord (= 7.0.8)
|
||||||
activestorage (= 7.0.7.2)
|
activestorage (= 7.0.8)
|
||||||
activesupport (= 7.0.7.2)
|
activesupport (= 7.0.8)
|
||||||
globalid (>= 0.6.0)
|
globalid (>= 0.6.0)
|
||||||
nokogiri (>= 1.8.5)
|
nokogiri (>= 1.8.5)
|
||||||
actionview (7.0.7.2)
|
actionview (7.0.8)
|
||||||
activesupport (= 7.0.7.2)
|
activesupport (= 7.0.8)
|
||||||
builder (~> 3.1)
|
builder (~> 3.1)
|
||||||
erubi (~> 1.4)
|
erubi (~> 1.4)
|
||||||
rails-dom-testing (~> 2.0)
|
rails-dom-testing (~> 2.0)
|
||||||
rails-html-sanitizer (~> 1.1, >= 1.2.0)
|
rails-html-sanitizer (~> 1.1, >= 1.2.0)
|
||||||
active_record_query_trace (1.8)
|
active_record_query_trace (1.8)
|
||||||
activejob (7.0.7.2)
|
activejob (7.0.8)
|
||||||
activesupport (= 7.0.7.2)
|
activesupport (= 7.0.8)
|
||||||
globalid (>= 0.3.6)
|
globalid (>= 0.3.6)
|
||||||
activemodel (7.0.7.2)
|
activemodel (7.0.8)
|
||||||
activesupport (= 7.0.7.2)
|
activesupport (= 7.0.8)
|
||||||
activerecord (7.0.7.2)
|
activerecord (7.0.8)
|
||||||
activemodel (= 7.0.7.2)
|
activemodel (= 7.0.8)
|
||||||
activesupport (= 7.0.7.2)
|
activesupport (= 7.0.8)
|
||||||
activerecord-import (1.4.1)
|
activerecord-import (1.4.1)
|
||||||
activerecord (>= 4.2)
|
activerecord (>= 4.2)
|
||||||
activestorage (7.0.7.2)
|
activestorage (7.0.8)
|
||||||
actionpack (= 7.0.7.2)
|
actionpack (= 7.0.8)
|
||||||
activejob (= 7.0.7.2)
|
activejob (= 7.0.8)
|
||||||
activerecord (= 7.0.7.2)
|
activerecord (= 7.0.8)
|
||||||
activesupport (= 7.0.7.2)
|
activesupport (= 7.0.8)
|
||||||
marcel (~> 1.0)
|
marcel (~> 1.0)
|
||||||
mini_mime (>= 1.1.0)
|
mini_mime (>= 1.1.0)
|
||||||
activesupport (7.0.7.2)
|
activesupport (7.0.8)
|
||||||
concurrent-ruby (~> 1.0, >= 1.0.2)
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
||||||
i18n (>= 1.6, < 2)
|
i18n (>= 1.6, < 2)
|
||||||
minitest (>= 5.1)
|
minitest (>= 5.1)
|
||||||
@@ -269,8 +269,8 @@ GEM
|
|||||||
grpc (~> 1.36)
|
grpc (~> 1.36)
|
||||||
geocoder (1.8.1)
|
geocoder (1.8.1)
|
||||||
gli (2.21.0)
|
gli (2.21.0)
|
||||||
globalid (1.1.0)
|
globalid (1.2.1)
|
||||||
activesupport (>= 5.0)
|
activesupport (>= 6.1)
|
||||||
gmail_xoauth (0.4.2)
|
gmail_xoauth (0.4.2)
|
||||||
oauth (>= 0.3.6)
|
oauth (>= 0.3.6)
|
||||||
google-apis-core (0.11.0)
|
google-apis-core (0.11.0)
|
||||||
@@ -450,9 +450,9 @@ GEM
|
|||||||
mime-types-data (~> 3.2015)
|
mime-types-data (~> 3.2015)
|
||||||
mime-types-data (3.2023.0218.1)
|
mime-types-data (3.2023.0218.1)
|
||||||
mini_magick (4.12.0)
|
mini_magick (4.12.0)
|
||||||
mini_mime (1.1.2)
|
mini_mime (1.1.5)
|
||||||
mini_portile2 (2.8.4)
|
mini_portile2 (2.8.4)
|
||||||
minitest (5.19.0)
|
minitest (5.20.0)
|
||||||
mock_redis (0.36.0)
|
mock_redis (0.36.0)
|
||||||
ruby2_keywords
|
ruby2_keywords
|
||||||
msgpack (1.7.0)
|
msgpack (1.7.0)
|
||||||
@@ -463,7 +463,7 @@ GEM
|
|||||||
activerecord (>= 5.2)
|
activerecord (>= 5.2)
|
||||||
net-http-persistent (4.0.2)
|
net-http-persistent (4.0.2)
|
||||||
connection_pool (~> 2.2)
|
connection_pool (~> 2.2)
|
||||||
net-imap (0.3.6)
|
net-imap (0.3.7)
|
||||||
date
|
date
|
||||||
net-protocol
|
net-protocol
|
||||||
net-pop (0.1.2)
|
net-pop (0.1.2)
|
||||||
@@ -478,14 +478,14 @@ GEM
|
|||||||
sidekiq
|
sidekiq
|
||||||
newrelic_rpm (8.16.0)
|
newrelic_rpm (8.16.0)
|
||||||
nio4r (2.5.9)
|
nio4r (2.5.9)
|
||||||
nokogiri (1.15.3)
|
nokogiri (1.15.4)
|
||||||
mini_portile2 (~> 2.8.2)
|
mini_portile2 (~> 2.8.2)
|
||||||
racc (~> 1.4)
|
racc (~> 1.4)
|
||||||
nokogiri (1.15.3-arm64-darwin)
|
nokogiri (1.15.4-arm64-darwin)
|
||||||
racc (~> 1.4)
|
racc (~> 1.4)
|
||||||
nokogiri (1.15.3-x86_64-darwin)
|
nokogiri (1.15.4-x86_64-darwin)
|
||||||
racc (~> 1.4)
|
racc (~> 1.4)
|
||||||
nokogiri (1.15.3-x86_64-linux)
|
nokogiri (1.15.4-x86_64-linux)
|
||||||
racc (~> 1.4)
|
racc (~> 1.4)
|
||||||
numo-narray (0.9.2.1)
|
numo-narray (0.9.2.1)
|
||||||
oauth (1.1.0)
|
oauth (1.1.0)
|
||||||
@@ -563,30 +563,30 @@ GEM
|
|||||||
rack-test (2.1.0)
|
rack-test (2.1.0)
|
||||||
rack (>= 1.3)
|
rack (>= 1.3)
|
||||||
rack-timeout (0.6.3)
|
rack-timeout (0.6.3)
|
||||||
rails (7.0.7.2)
|
rails (7.0.8)
|
||||||
actioncable (= 7.0.7.2)
|
actioncable (= 7.0.8)
|
||||||
actionmailbox (= 7.0.7.2)
|
actionmailbox (= 7.0.8)
|
||||||
actionmailer (= 7.0.7.2)
|
actionmailer (= 7.0.8)
|
||||||
actionpack (= 7.0.7.2)
|
actionpack (= 7.0.8)
|
||||||
actiontext (= 7.0.7.2)
|
actiontext (= 7.0.8)
|
||||||
actionview (= 7.0.7.2)
|
actionview (= 7.0.8)
|
||||||
activejob (= 7.0.7.2)
|
activejob (= 7.0.8)
|
||||||
activemodel (= 7.0.7.2)
|
activemodel (= 7.0.8)
|
||||||
activerecord (= 7.0.7.2)
|
activerecord (= 7.0.8)
|
||||||
activestorage (= 7.0.7.2)
|
activestorage (= 7.0.8)
|
||||||
activesupport (= 7.0.7.2)
|
activesupport (= 7.0.8)
|
||||||
bundler (>= 1.15.0)
|
bundler (>= 1.15.0)
|
||||||
railties (= 7.0.7.2)
|
railties (= 7.0.8)
|
||||||
rails-dom-testing (2.1.1)
|
rails-dom-testing (2.2.0)
|
||||||
activesupport (>= 5.0.0)
|
activesupport (>= 5.0.0)
|
||||||
minitest
|
minitest
|
||||||
nokogiri (>= 1.6)
|
nokogiri (>= 1.6)
|
||||||
rails-html-sanitizer (1.6.0)
|
rails-html-sanitizer (1.6.0)
|
||||||
loofah (~> 2.21)
|
loofah (~> 2.21)
|
||||||
nokogiri (~> 1.14)
|
nokogiri (~> 1.14)
|
||||||
railties (7.0.7.2)
|
railties (7.0.8)
|
||||||
actionpack (= 7.0.7.2)
|
actionpack (= 7.0.8)
|
||||||
activesupport (= 7.0.7.2)
|
activesupport (= 7.0.8)
|
||||||
method_source
|
method_source
|
||||||
rake (>= 12.2)
|
rake (>= 12.2)
|
||||||
thor (~> 1.0)
|
thor (~> 1.0)
|
||||||
@@ -598,7 +598,7 @@ GEM
|
|||||||
ffi (~> 1.0)
|
ffi (~> 1.0)
|
||||||
redis (5.0.6)
|
redis (5.0.6)
|
||||||
redis-client (>= 0.9.0)
|
redis-client (>= 0.9.0)
|
||||||
redis-client (0.14.1)
|
redis-client (0.17.0)
|
||||||
connection_pool
|
connection_pool
|
||||||
redis-namespace (1.10.0)
|
redis-namespace (1.10.0)
|
||||||
redis (>= 4)
|
redis (>= 4)
|
||||||
@@ -697,23 +697,23 @@ GEM
|
|||||||
activesupport (>= 4)
|
activesupport (>= 4)
|
||||||
selectize-rails (0.12.6)
|
selectize-rails (0.12.6)
|
||||||
semantic_range (3.0.0)
|
semantic_range (3.0.0)
|
||||||
sentry-rails (5.10.0)
|
sentry-rails (5.11.0)
|
||||||
railties (>= 5.0)
|
railties (>= 5.0)
|
||||||
sentry-ruby (~> 5.10.0)
|
sentry-ruby (~> 5.11.0)
|
||||||
sentry-ruby (5.10.0)
|
sentry-ruby (5.11.0)
|
||||||
concurrent-ruby (~> 1.0, >= 1.0.2)
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
||||||
sentry-sidekiq (5.10.0)
|
sentry-sidekiq (5.11.0)
|
||||||
sentry-ruby (~> 5.10.0)
|
sentry-ruby (~> 5.11.0)
|
||||||
sidekiq (>= 3.0)
|
sidekiq (>= 3.0)
|
||||||
sexp_processor (4.17.0)
|
sexp_processor (4.17.0)
|
||||||
shoulda-matchers (5.3.0)
|
shoulda-matchers (5.3.0)
|
||||||
activesupport (>= 5.2.0)
|
activesupport (>= 5.2.0)
|
||||||
sidekiq (7.1.2)
|
sidekiq (7.1.3)
|
||||||
concurrent-ruby (< 2)
|
concurrent-ruby (< 2)
|
||||||
connection_pool (>= 2.3.0)
|
connection_pool (>= 2.3.0)
|
||||||
rack (>= 2.2.4)
|
rack (>= 2.2.4)
|
||||||
redis-client (>= 0.14.0)
|
redis-client (>= 0.14.0)
|
||||||
sidekiq-cron (1.10.0)
|
sidekiq-cron (1.10.1)
|
||||||
fugit (~> 1.8)
|
fugit (~> 1.8)
|
||||||
globalid (>= 1.0.1)
|
globalid (>= 1.0.1)
|
||||||
sidekiq (>= 6)
|
sidekiq (>= 6)
|
||||||
@@ -786,7 +786,7 @@ GEM
|
|||||||
version_gem (1.1.2)
|
version_gem (1.1.2)
|
||||||
warden (1.2.9)
|
warden (1.2.9)
|
||||||
rack (>= 2.0.9)
|
rack (>= 2.0.9)
|
||||||
web-console (4.2.0)
|
web-console (4.2.1)
|
||||||
actionview (>= 6.0.0)
|
actionview (>= 6.0.0)
|
||||||
activemodel (>= 6.0.0)
|
activemodel (>= 6.0.0)
|
||||||
bindex (>= 0.4.0)
|
bindex (>= 0.4.0)
|
||||||
@@ -805,14 +805,14 @@ GEM
|
|||||||
railties (>= 5.2)
|
railties (>= 5.2)
|
||||||
semantic_range (>= 2.3.0)
|
semantic_range (>= 2.3.0)
|
||||||
webrick (1.8.1)
|
webrick (1.8.1)
|
||||||
websocket-driver (0.7.5)
|
websocket-driver (0.7.6)
|
||||||
websocket-extensions (>= 0.1.0)
|
websocket-extensions (>= 0.1.0)
|
||||||
websocket-extensions (0.1.5)
|
websocket-extensions (0.1.5)
|
||||||
wisper (2.0.0)
|
wisper (2.0.0)
|
||||||
working_hours (1.4.1)
|
working_hours (1.4.1)
|
||||||
activesupport (>= 3.2)
|
activesupport (>= 3.2)
|
||||||
tzinfo
|
tzinfo
|
||||||
zeitwerk (2.6.9)
|
zeitwerk (2.6.11)
|
||||||
|
|
||||||
PLATFORMS
|
PLATFORMS
|
||||||
arm64-darwin-20
|
arm64-darwin-20
|
||||||
@@ -907,7 +907,7 @@ DEPENDENCIES
|
|||||||
rack-cors
|
rack-cors
|
||||||
rack-mini-profiler (>= 3.1.1)
|
rack-mini-profiler (>= 3.1.1)
|
||||||
rack-timeout
|
rack-timeout
|
||||||
rails (~> 7.0.7.2)
|
rails (~> 7.0.8.0)
|
||||||
redis
|
redis
|
||||||
redis-namespace
|
redis-namespace
|
||||||
responders
|
responders
|
||||||
@@ -922,12 +922,12 @@ DEPENDENCIES
|
|||||||
scout_apm
|
scout_apm
|
||||||
scss_lint
|
scss_lint
|
||||||
seed_dump
|
seed_dump
|
||||||
sentry-rails (>= 5.10.0)
|
sentry-rails (>= 5.11.0)
|
||||||
sentry-ruby
|
sentry-ruby
|
||||||
sentry-sidekiq (>= 5.10.0)
|
sentry-sidekiq (>= 5.11.0)
|
||||||
shoulda-matchers
|
shoulda-matchers
|
||||||
sidekiq
|
sidekiq (>= 7.1.3)
|
||||||
sidekiq-cron
|
sidekiq-cron (>= 1.10.1)
|
||||||
simplecov (= 0.17.1)
|
simplecov (= 0.17.1)
|
||||||
slack-ruby-client (~> 2.0.0)
|
slack-ruby-client (~> 2.0.0)
|
||||||
spring
|
spring
|
||||||
@@ -943,7 +943,7 @@ DEPENDENCIES
|
|||||||
tzinfo-data
|
tzinfo-data
|
||||||
uglifier
|
uglifier
|
||||||
valid_email2
|
valid_email2
|
||||||
web-console
|
web-console (>= 4.2.1)
|
||||||
web-push
|
web-push
|
||||||
webmock
|
webmock
|
||||||
webpacker
|
webpacker
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
backend: bin/rails s -p 3000
|
backend: bin/rails s -p 3000
|
||||||
frontend: bin/webpack-dev-server
|
frontend: export NODE_OPTIONS=--openssl-legacy-provider && bin/webpack-dev-server
|
||||||
# https://github.com/mperham/sidekiq/issues/3090#issuecomment-389748695
|
# https://github.com/mperham/sidekiq/issues/3090#issuecomment-389748695
|
||||||
worker: dotenv bundle exec sidekiq -C config/sidekiq.yml
|
worker: dotenv bundle exec sidekiq -C config/sidekiq.yml
|
||||||
|
|||||||
@@ -60,6 +60,9 @@
|
|||||||
],
|
],
|
||||||
"stack": "heroku-20",
|
"stack": "heroku-20",
|
||||||
"buildpacks": [
|
"buildpacks": [
|
||||||
|
{
|
||||||
|
"url": "heroku/nodejs"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"url": "heroku/ruby"
|
"url": "heroku/ruby"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
class Api::V1::Accounts::ArticlesController < Api::V1::Accounts::BaseController
|
class Api::V1::Accounts::ArticlesController < Api::V1::Accounts::BaseController
|
||||||
before_action :portal
|
before_action :portal
|
||||||
before_action :check_authorization
|
before_action :check_authorization
|
||||||
before_action :fetch_article, except: [:index, :create, :attach_file, :reorder]
|
before_action :fetch_article, except: [:index, :create, :reorder]
|
||||||
before_action :set_current_page, only: [:index]
|
before_action :set_current_page, only: [:index]
|
||||||
|
|
||||||
def index
|
def index
|
||||||
@@ -36,17 +36,6 @@ class Api::V1::Accounts::ArticlesController < Api::V1::Accounts::BaseController
|
|||||||
head :ok
|
head :ok
|
||||||
end
|
end
|
||||||
|
|
||||||
def attach_file
|
|
||||||
file_blob = ActiveStorage::Blob.create_and_upload!(
|
|
||||||
key: nil,
|
|
||||||
io: params[:background_image].tempfile,
|
|
||||||
filename: params[:background_image].original_filename,
|
|
||||||
content_type: params[:background_image].content_type
|
|
||||||
)
|
|
||||||
file_blob.save!
|
|
||||||
render json: { file_url: url_for(file_blob) }
|
|
||||||
end
|
|
||||||
|
|
||||||
def reorder
|
def reorder
|
||||||
Article.update_positions(params[:positions_hash])
|
Article.update_positions(params[:positions_hash])
|
||||||
head :ok
|
head :ok
|
||||||
|
|||||||
@@ -20,16 +20,6 @@ class Api::V1::Accounts::AutomationRulesController < Api::V1::Accounts::BaseCont
|
|||||||
@automation_rule
|
@automation_rule
|
||||||
end
|
end
|
||||||
|
|
||||||
def attach_file
|
|
||||||
file_blob = ActiveStorage::Blob.create_and_upload!(
|
|
||||||
key: nil,
|
|
||||||
io: params[:attachment].tempfile,
|
|
||||||
filename: params[:attachment].original_filename,
|
|
||||||
content_type: params[:attachment].content_type
|
|
||||||
)
|
|
||||||
render json: { blob_key: file_blob.key, blob_id: file_blob.id }
|
|
||||||
end
|
|
||||||
|
|
||||||
def update
|
def update
|
||||||
ActiveRecord::Base.transaction do
|
ActiveRecord::Base.transaction do
|
||||||
automation_rule_update
|
automation_rule_update
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ class Api::V1::Accounts::ContactsController < Api::V1::Accounts::BaseController
|
|||||||
|
|
||||||
def index
|
def index
|
||||||
@contacts_count = resolved_contacts.count
|
@contacts_count = resolved_contacts.count
|
||||||
@contacts = fetch_contacts_with_conversation_count(resolved_contacts)
|
@contacts = fetch_contacts(resolved_contacts)
|
||||||
end
|
end
|
||||||
|
|
||||||
def search
|
def search
|
||||||
@@ -29,7 +29,7 @@ class Api::V1::Accounts::ContactsController < Api::V1::Accounts::BaseController
|
|||||||
search: "%#{params[:q].strip}%"
|
search: "%#{params[:q].strip}%"
|
||||||
)
|
)
|
||||||
@contacts_count = contacts.count
|
@contacts_count = contacts.count
|
||||||
@contacts = fetch_contacts_with_conversation_count(contacts)
|
@contacts = fetch_contacts(contacts)
|
||||||
end
|
end
|
||||||
|
|
||||||
def import
|
def import
|
||||||
@@ -63,7 +63,7 @@ class Api::V1::Accounts::ContactsController < Api::V1::Accounts::BaseController
|
|||||||
result = ::Contacts::FilterService.new(params.permit!, current_user).perform
|
result = ::Contacts::FilterService.new(params.permit!, current_user).perform
|
||||||
contacts = result[:contacts]
|
contacts = result[:contacts]
|
||||||
@contacts_count = result[:count]
|
@contacts_count = result[:count]
|
||||||
@contacts = fetch_contacts_with_conversation_count(contacts)
|
@contacts = fetch_contacts(contacts)
|
||||||
end
|
end
|
||||||
|
|
||||||
def contactable_inboxes
|
def contactable_inboxes
|
||||||
@@ -125,17 +125,14 @@ class Api::V1::Accounts::ContactsController < Api::V1::Accounts::BaseController
|
|||||||
@current_page = params[:page] || 1
|
@current_page = params[:page] || 1
|
||||||
end
|
end
|
||||||
|
|
||||||
def fetch_contacts_with_conversation_count(contacts)
|
def fetch_contacts(contacts)
|
||||||
conversation_count_sub_query = 'SELECT COUNT(*) FROM "conversations" WHERE "conversations"."contact_id" = "contacts"."id"'
|
contacts_with_avatar = filtrate(contacts)
|
||||||
contacts_with_conversation_count = filtrate(contacts)
|
.includes([{ avatar_attachment: [:blob] }])
|
||||||
.select("contacts.*, (#{conversation_count_sub_query}) as conversations_count")
|
.page(@current_page).per(RESULTS_PER_PAGE)
|
||||||
.group('contacts.id')
|
|
||||||
.includes([{ avatar_attachment: [:blob] }])
|
|
||||||
.page(@current_page).per(RESULTS_PER_PAGE)
|
|
||||||
|
|
||||||
return contacts_with_conversation_count.includes([{ contact_inboxes: [:inbox] }]) if @include_contact_inboxes
|
return contacts_with_avatar.includes([{ contact_inboxes: [:inbox] }]) if @include_contact_inboxes
|
||||||
|
|
||||||
contacts_with_conversation_count
|
contacts_with_avatar
|
||||||
end
|
end
|
||||||
|
|
||||||
def build_contact_inbox
|
def build_contact_inbox
|
||||||
|
|||||||
@@ -39,16 +39,6 @@ class Api::V1::Accounts::MacrosController < Api::V1::Accounts::BaseController
|
|||||||
head :ok
|
head :ok
|
||||||
end
|
end
|
||||||
|
|
||||||
def attach_file
|
|
||||||
file_blob = ActiveStorage::Blob.create_and_upload!(
|
|
||||||
key: nil,
|
|
||||||
io: params[:attachment].tempfile,
|
|
||||||
filename: params[:attachment].original_filename,
|
|
||||||
content_type: params[:attachment].content_type
|
|
||||||
)
|
|
||||||
render json: { blob_key: file_blob.key, blob_id: file_blob.id }
|
|
||||||
end
|
|
||||||
|
|
||||||
def execute
|
def execute
|
||||||
::MacrosExecutionJob.perform_later(@macro, conversation_ids: params[:conversation_ids], user: Current.user)
|
::MacrosExecutionJob.perform_later(@macro, conversation_ids: params[:conversation_ids], user: Current.user)
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
class Api::V1::Accounts::PortalsController < Api::V1::Accounts::BaseController
|
class Api::V1::Accounts::PortalsController < Api::V1::Accounts::BaseController
|
||||||
include ::FileTypeHelper
|
include ::FileTypeHelper
|
||||||
|
|
||||||
before_action :fetch_portal, except: [:index, :create, :attach_file]
|
before_action :fetch_portal, except: [:index, :create]
|
||||||
before_action :check_authorization
|
before_action :check_authorization
|
||||||
before_action :set_current_page, only: [:index]
|
before_action :set_current_page, only: [:index]
|
||||||
|
|
||||||
@@ -53,16 +53,6 @@ class Api::V1::Accounts::PortalsController < Api::V1::Accounts::BaseController
|
|||||||
@portal.logo.attach(blob)
|
@portal.logo.attach(blob)
|
||||||
end
|
end
|
||||||
|
|
||||||
def attach_file
|
|
||||||
file_blob = ActiveStorage::Blob.create_and_upload!(
|
|
||||||
key: nil,
|
|
||||||
io: params[:logo].tempfile,
|
|
||||||
filename: params[:logo].original_filename,
|
|
||||||
content_type: params[:logo].content_type
|
|
||||||
)
|
|
||||||
render json: { blob_key: file_blob.key, blob_id: file_blob.id }
|
|
||||||
end
|
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def fetch_portal
|
def fetch_portal
|
||||||
|
|||||||
@@ -0,0 +1,13 @@
|
|||||||
|
class Api::V1::UploadController < Api::BaseController
|
||||||
|
def create
|
||||||
|
file_blob = ActiveStorage::Blob.create_and_upload!(
|
||||||
|
key: nil,
|
||||||
|
io: params[:attachment].tempfile,
|
||||||
|
filename: params[:attachment].original_filename,
|
||||||
|
content_type: params[:attachment].content_type
|
||||||
|
)
|
||||||
|
file_blob.save!
|
||||||
|
|
||||||
|
render json: { file_url: url_for(file_blob), blob_key: file_blob.key, blob_id: file_blob.id }
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -8,7 +8,7 @@ module EnsureCurrentAccountHelper
|
|||||||
|
|
||||||
def ensure_current_account
|
def ensure_current_account
|
||||||
account = Account.find(params[:account_id])
|
account = Account.find(params[:account_id])
|
||||||
ensure_account_is_active?(account)
|
render_unauthorized('Account is suspended') and return unless account.active?
|
||||||
|
|
||||||
if current_user
|
if current_user
|
||||||
account_accessible_for_user?(account)
|
account_accessible_for_user?(account)
|
||||||
@@ -27,8 +27,4 @@ module EnsureCurrentAccountHelper
|
|||||||
def account_accessible_for_bot?(account)
|
def account_accessible_for_bot?(account)
|
||||||
render_unauthorized('You are not authorized to access this account') unless @resource.agent_bot_inboxes.find_by(account_id: account.id)
|
render_unauthorized('You are not authorized to access this account') unless @resource.agent_bot_inboxes.find_by(account_id: account.id)
|
||||||
end
|
end
|
||||||
|
|
||||||
def ensure_account_is_active?(account)
|
|
||||||
render_unauthorized('Account is suspended') unless account.active?
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ class DashboardController < ActionController::Base
|
|||||||
VAPID_PUBLIC_KEY: VapidService.public_key,
|
VAPID_PUBLIC_KEY: VapidService.public_key,
|
||||||
ENABLE_ACCOUNT_SIGNUP: GlobalConfigService.load('ENABLE_ACCOUNT_SIGNUP', 'false'),
|
ENABLE_ACCOUNT_SIGNUP: GlobalConfigService.load('ENABLE_ACCOUNT_SIGNUP', 'false'),
|
||||||
FB_APP_ID: GlobalConfigService.load('FB_APP_ID', ''),
|
FB_APP_ID: GlobalConfigService.load('FB_APP_ID', ''),
|
||||||
FACEBOOK_API_VERSION: 'v14.0',
|
FACEBOOK_API_VERSION: 'v17.0',
|
||||||
IS_ENTERPRISE: ChatwootApp.enterprise?,
|
IS_ENTERPRISE: ChatwootApp.enterprise?,
|
||||||
AZURE_APP_ID: ENV.fetch('AZURE_APP_ID', ''),
|
AZURE_APP_ID: ENV.fetch('AZURE_APP_ID', ''),
|
||||||
GIT_SHA: GIT_HASH
|
GIT_SHA: GIT_HASH
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
class Public::Api::V1::Portals::BaseController < PublicController
|
class Public::Api::V1::Portals::BaseController < PublicController
|
||||||
before_action :show_plain_layout
|
before_action :show_plain_layout
|
||||||
around_action :set_locale
|
around_action :set_locale
|
||||||
|
after_action :allow_iframe_requests
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
@@ -39,4 +40,8 @@ class Public::Api::V1::Portals::BaseController < PublicController
|
|||||||
|
|
||||||
I18n.with_locale(@locale, &)
|
I18n.with_locale(@locale, &)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def allow_iframe_requests
|
||||||
|
response.headers.delete('X-Frame-Options') if @is_plain_layout_enabled
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -9,14 +9,6 @@ class AutomationsAPI extends ApiClient {
|
|||||||
clone(automationId) {
|
clone(automationId) {
|
||||||
return axios.post(`${this.url}/${automationId}/clone`);
|
return axios.post(`${this.url}/${automationId}/clone`);
|
||||||
}
|
}
|
||||||
|
|
||||||
attachment(file) {
|
|
||||||
return axios.post(`${this.url}/attach_file`, file, {
|
|
||||||
headers: {
|
|
||||||
'Content-Type': 'multipart/form-data',
|
|
||||||
},
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export default new AutomationsAPI();
|
export default new AutomationsAPI();
|
||||||
|
|||||||
@@ -47,20 +47,6 @@ class ArticlesAPI extends PortalsAPI {
|
|||||||
return axios.delete(`${this.url}/${portalSlug}/articles/${articleId}`);
|
return axios.delete(`${this.url}/${portalSlug}/articles/${articleId}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
uploadImage({ portalSlug, file }) {
|
|
||||||
let formData = new FormData();
|
|
||||||
formData.append('background_image', file);
|
|
||||||
return axios.post(
|
|
||||||
`${this.url}/${portalSlug}/articles/attach_file`,
|
|
||||||
formData,
|
|
||||||
{
|
|
||||||
headers: {
|
|
||||||
'Content-Type': 'multipart/form-data',
|
|
||||||
},
|
|
||||||
}
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
reorderArticles({ portalSlug, reorderedGroup, categorySlug }) {
|
reorderArticles({ portalSlug, reorderedGroup, categorySlug }) {
|
||||||
return axios.post(`${this.url}/${portalSlug}/articles/reorder`, {
|
return axios.post(`${this.url}/${portalSlug}/articles/reorder`, {
|
||||||
positions_hash: reorderedGroup,
|
positions_hash: reorderedGroup,
|
||||||
|
|||||||
@@ -61,7 +61,7 @@
|
|||||||
>
|
>
|
||||||
<a
|
<a
|
||||||
v-if="isAttributeTypeLink"
|
v-if="isAttributeTypeLink"
|
||||||
:href="value"
|
:href="hrefURL"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
rel="noopener noreferrer"
|
rel="noopener noreferrer"
|
||||||
class="value inline-block rounded-sm mb-0 break-all py-0.5 px-1"
|
class="value inline-block rounded-sm mb-0 break-all py-0.5 px-1"
|
||||||
@@ -188,6 +188,9 @@ export default {
|
|||||||
urlValue() {
|
urlValue() {
|
||||||
return isValidURL(this.value) ? this.value : '---';
|
return isValidURL(this.value) ? this.value : '---';
|
||||||
},
|
},
|
||||||
|
hrefURL() {
|
||||||
|
return isValidURL(this.value) ? this.value : '';
|
||||||
|
},
|
||||||
notAttributeTypeCheckboxAndList() {
|
notAttributeTypeCheckboxAndList() {
|
||||||
return !this.isAttributeTypeCheckbox && !this.isAttributeTypeList;
|
return !this.isAttributeTypeCheckbox && !this.isAttributeTypeList;
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -61,11 +61,9 @@ export default {
|
|||||||
this.label = this.$t('AUTOMATION.ATTACHMENT.LABEL_UPLOADING');
|
this.label = this.$t('AUTOMATION.ATTACHMENT.LABEL_UPLOADING');
|
||||||
try {
|
try {
|
||||||
const file = event.target.files[0];
|
const file = event.target.files[0];
|
||||||
const formData = new FormData();
|
|
||||||
formData.append('attachment', file, file.name);
|
|
||||||
const id = await this.$store.dispatch(
|
const id = await this.$store.dispatch(
|
||||||
'automations/uploadAttachment',
|
'automations/uploadAttachment',
|
||||||
formData
|
file
|
||||||
);
|
);
|
||||||
this.$emit('input', [id]);
|
this.$emit('input', [id]);
|
||||||
this.uploadState = 'uploaded';
|
this.uploadState = 'uploaded';
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="flex items-center text-left">
|
<div class="flex items-center gap-1.5 text-left">
|
||||||
<thumbnail
|
<thumbnail
|
||||||
:src="user.thumbnail"
|
:src="user.thumbnail"
|
||||||
:size="size"
|
:size="size"
|
||||||
@@ -7,7 +7,7 @@
|
|||||||
:status="user.availability_status"
|
:status="user.availability_status"
|
||||||
/>
|
/>
|
||||||
<h6
|
<h6
|
||||||
class="my-0 mx-2 dark:text-slate-100 overflow-hidden whitespace-nowrap text-ellipsis text-capitalize"
|
class="my-0 dark:text-slate-100 overflow-hidden whitespace-nowrap text-ellipsis text-capitalize"
|
||||||
:class="textClass"
|
:class="textClass"
|
||||||
>
|
>
|
||||||
{{ user.name }}
|
{{ user.name }}
|
||||||
|
|||||||
@@ -15,6 +15,13 @@
|
|||||||
:search-key="variableSearchTerm"
|
:search-key="variableSearchTerm"
|
||||||
@click="insertVariable"
|
@click="insertVariable"
|
||||||
/>
|
/>
|
||||||
|
<input
|
||||||
|
ref="imageUpload"
|
||||||
|
type="file"
|
||||||
|
accept="image/png, image/jpeg, image/jpg, image/gif, image/webp"
|
||||||
|
hidden
|
||||||
|
@change="onFileChange"
|
||||||
|
/>
|
||||||
<div ref="editor" />
|
<div ref="editor" />
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@@ -22,7 +29,7 @@
|
|||||||
<script>
|
<script>
|
||||||
import {
|
import {
|
||||||
messageSchema,
|
messageSchema,
|
||||||
wootMessageWriterSetup,
|
buildEditor,
|
||||||
EditorView,
|
EditorView,
|
||||||
MessageMarkdownTransformer,
|
MessageMarkdownTransformer,
|
||||||
MessageMarkdownSerializer,
|
MessageMarkdownSerializer,
|
||||||
@@ -39,6 +46,7 @@ import CannedResponse from '../conversation/CannedResponse';
|
|||||||
import VariableList from '../conversation/VariableList';
|
import VariableList from '../conversation/VariableList';
|
||||||
|
|
||||||
const TYPING_INDICATOR_IDLE_TIME = 4000;
|
const TYPING_INDICATOR_IDLE_TIME = 4000;
|
||||||
|
const MAXIMUM_FILE_UPLOAD_SIZE = 4; // in MB
|
||||||
|
|
||||||
import {
|
import {
|
||||||
hasPressedEnterAndNotCmdOrShift,
|
hasPressedEnterAndNotCmdOrShift,
|
||||||
@@ -51,14 +59,27 @@ import uiSettingsMixin from 'dashboard/mixins/uiSettings';
|
|||||||
import { isEditorHotKeyEnabled } from 'dashboard/mixins/uiSettings';
|
import { isEditorHotKeyEnabled } from 'dashboard/mixins/uiSettings';
|
||||||
import { replaceVariablesInMessage } from '@chatwoot/utils';
|
import { replaceVariablesInMessage } from '@chatwoot/utils';
|
||||||
import { CONVERSATION_EVENTS } from '../../../helper/AnalyticsHelper/events';
|
import { CONVERSATION_EVENTS } from '../../../helper/AnalyticsHelper/events';
|
||||||
|
import { checkFileSizeLimit } from 'shared/helpers/FileHelper';
|
||||||
|
import { uploadFile } from 'dashboard/helper/uploadHelper';
|
||||||
|
import alertMixin from 'shared/mixins/alertMixin';
|
||||||
|
import { findNodeToInsertImage } from 'dashboard/helper/messageEditorHelper';
|
||||||
|
import { MESSAGE_EDITOR_MENU_OPTIONS } from 'dashboard/constants/editor';
|
||||||
|
|
||||||
const createState = (content, placeholder, plugins = []) => {
|
const createState = (
|
||||||
|
content,
|
||||||
|
placeholder,
|
||||||
|
plugins = [],
|
||||||
|
methods = {},
|
||||||
|
enabledMenuOptions
|
||||||
|
) => {
|
||||||
return EditorState.create({
|
return EditorState.create({
|
||||||
doc: new MessageMarkdownTransformer(messageSchema).parse(content),
|
doc: new MessageMarkdownTransformer(messageSchema).parse(content),
|
||||||
plugins: wootMessageWriterSetup({
|
plugins: buildEditor({
|
||||||
schema: messageSchema,
|
schema: messageSchema,
|
||||||
placeholder,
|
placeholder,
|
||||||
|
methods,
|
||||||
plugins,
|
plugins,
|
||||||
|
enabledMenuOptions,
|
||||||
}),
|
}),
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
@@ -66,7 +87,7 @@ const createState = (content, placeholder, plugins = []) => {
|
|||||||
export default {
|
export default {
|
||||||
name: 'WootMessageEditor',
|
name: 'WootMessageEditor',
|
||||||
components: { TagAgents, CannedResponse, VariableList },
|
components: { TagAgents, CannedResponse, VariableList },
|
||||||
mixins: [eventListenerMixins, uiSettingsMixin],
|
mixins: [eventListenerMixins, uiSettingsMixin, alertMixin],
|
||||||
props: {
|
props: {
|
||||||
value: { type: String, default: '' },
|
value: { type: String, default: '' },
|
||||||
editorId: { type: String, default: '' },
|
editorId: { type: String, default: '' },
|
||||||
@@ -78,6 +99,7 @@ export default {
|
|||||||
enableVariables: { type: Boolean, default: false },
|
enableVariables: { type: Boolean, default: false },
|
||||||
enableCannedResponses: { type: Boolean, default: true },
|
enableCannedResponses: { type: Boolean, default: true },
|
||||||
variables: { type: Object, default: () => ({}) },
|
variables: { type: Object, default: () => ({}) },
|
||||||
|
enabledMenuOptions: { type: Array, default: () => [] },
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
@@ -104,6 +126,11 @@ export default {
|
|||||||
this.enableCannedResponses && this.showCannedMenu && !this.isPrivate
|
this.enableCannedResponses && this.showCannedMenu && !this.isPrivate
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
editorMenuOptions() {
|
||||||
|
return this.enabledMenuOptions.length
|
||||||
|
? this.enabledMenuOptions
|
||||||
|
: MESSAGE_EDITOR_MENU_OPTIONS;
|
||||||
|
},
|
||||||
plugins() {
|
plugins() {
|
||||||
if (!this.enableSuggestions) {
|
if (!this.enableSuggestions) {
|
||||||
return [];
|
return [];
|
||||||
@@ -204,18 +231,18 @@ export default {
|
|||||||
showVariables(updatedValue) {
|
showVariables(updatedValue) {
|
||||||
this.$emit('toggle-variables-menu', !this.isPrivate && updatedValue);
|
this.$emit('toggle-variables-menu', !this.isPrivate && updatedValue);
|
||||||
},
|
},
|
||||||
value(newValue = '') {
|
value(newVal = '') {
|
||||||
if (newValue !== this.contentFromEditor) {
|
if (newVal !== this.contentFromEditor) {
|
||||||
this.reloadState();
|
this.reloadState(newVal);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
editorId() {
|
editorId() {
|
||||||
this.showCannedMenu = false;
|
this.showCannedMenu = false;
|
||||||
this.cannedSearchTerm = '';
|
this.cannedSearchTerm = '';
|
||||||
this.reloadState();
|
this.reloadState(this.value);
|
||||||
},
|
},
|
||||||
isPrivate() {
|
isPrivate() {
|
||||||
this.reloadState();
|
this.reloadState(this.value);
|
||||||
},
|
},
|
||||||
|
|
||||||
updateSelectionWith(newValue, oldValue) {
|
updateSelectionWith(newValue, oldValue) {
|
||||||
@@ -238,7 +265,13 @@ export default {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
created() {
|
created() {
|
||||||
this.state = createState(this.value, this.placeholder, this.plugins);
|
this.state = createState(
|
||||||
|
this.value,
|
||||||
|
this.placeholder,
|
||||||
|
this.plugins,
|
||||||
|
{ onImageUpload: this.openFileBrowser },
|
||||||
|
this.editorMenuOptions
|
||||||
|
);
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
this.createEditorView();
|
this.createEditorView();
|
||||||
@@ -246,8 +279,14 @@ export default {
|
|||||||
this.focusEditorInputField();
|
this.focusEditorInputField();
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
reloadState() {
|
reloadState(content = this.value) {
|
||||||
this.state = createState(this.value, this.placeholder, this.plugins);
|
this.state = createState(
|
||||||
|
content,
|
||||||
|
this.placeholder,
|
||||||
|
this.plugins,
|
||||||
|
{ onImageUpload: this.openFileBrowser },
|
||||||
|
this.editorMenuOptions
|
||||||
|
);
|
||||||
this.editorView.updateState(this.state);
|
this.editorView.updateState(this.state);
|
||||||
this.focusEditorInputField();
|
this.focusEditorInputField();
|
||||||
},
|
},
|
||||||
@@ -374,6 +413,57 @@ export default {
|
|||||||
tr.scrollIntoView();
|
tr.scrollIntoView();
|
||||||
return false;
|
return false;
|
||||||
},
|
},
|
||||||
|
openFileBrowser() {
|
||||||
|
this.$refs.imageUpload.click();
|
||||||
|
},
|
||||||
|
onFileChange() {
|
||||||
|
const file = this.$refs.imageUpload.files[0];
|
||||||
|
if (checkFileSizeLimit(file, MAXIMUM_FILE_UPLOAD_SIZE)) {
|
||||||
|
this.uploadImageToStorage(file);
|
||||||
|
} else {
|
||||||
|
this.showAlert(
|
||||||
|
this.$t(
|
||||||
|
'PROFILE_SETTINGS.FORM.MESSAGE_SIGNATURE_SECTION.IMAGE_UPLOAD_SIZE_ERROR',
|
||||||
|
{
|
||||||
|
size: MAXIMUM_FILE_UPLOAD_SIZE,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.$refs.imageUpload.value = '';
|
||||||
|
},
|
||||||
|
async uploadImageToStorage(file) {
|
||||||
|
try {
|
||||||
|
const { fileUrl } = await uploadFile(file);
|
||||||
|
if (fileUrl) {
|
||||||
|
this.onImageInsertInEditor(fileUrl);
|
||||||
|
}
|
||||||
|
this.showAlert(
|
||||||
|
this.$t(
|
||||||
|
'PROFILE_SETTINGS.FORM.MESSAGE_SIGNATURE_SECTION.IMAGE_UPLOAD_SUCCESS'
|
||||||
|
)
|
||||||
|
);
|
||||||
|
} catch (error) {
|
||||||
|
this.showAlert(
|
||||||
|
this.$t(
|
||||||
|
'PROFILE_SETTINGS.FORM.MESSAGE_SIGNATURE_SECTION.IMAGE_UPLOAD_ERROR'
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
onImageInsertInEditor(fileUrl) {
|
||||||
|
const { tr } = this.editorView.state;
|
||||||
|
|
||||||
|
const insertData = findNodeToInsertImage(this.editorView.state, fileUrl);
|
||||||
|
|
||||||
|
if (insertData) {
|
||||||
|
this.editorView.dispatch(
|
||||||
|
tr.insert(insertData.pos, insertData.node).scrollIntoView()
|
||||||
|
);
|
||||||
|
this.focusEditorInputField();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
emitOnChange() {
|
emitOnChange() {
|
||||||
this.editorView.updateState(this.state);
|
this.editorView.updateState(this.state);
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
<script>
|
<script>
|
||||||
import {
|
import {
|
||||||
fullSchema,
|
fullSchema,
|
||||||
wootArticleWriterSetup,
|
buildEditor,
|
||||||
EditorView,
|
EditorView,
|
||||||
ArticleMarkdownSerializer,
|
ArticleMarkdownSerializer,
|
||||||
ArticleMarkdownTransformer,
|
ArticleMarkdownTransformer,
|
||||||
@@ -33,15 +33,17 @@ const createState = (
|
|||||||
content,
|
content,
|
||||||
placeholder,
|
placeholder,
|
||||||
plugins = [],
|
plugins = [],
|
||||||
onImageUpload = () => {}
|
methods = {},
|
||||||
|
enabledMenuOptions
|
||||||
) => {
|
) => {
|
||||||
return EditorState.create({
|
return EditorState.create({
|
||||||
doc: new ArticleMarkdownTransformer(fullSchema).parse(content),
|
doc: new ArticleMarkdownTransformer(fullSchema).parse(content),
|
||||||
plugins: wootArticleWriterSetup({
|
plugins: buildEditor({
|
||||||
schema: fullSchema,
|
schema: fullSchema,
|
||||||
placeholder,
|
placeholder,
|
||||||
|
methods,
|
||||||
plugins,
|
plugins,
|
||||||
onImageUpload,
|
enabledMenuOptions,
|
||||||
}),
|
}),
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
@@ -52,6 +54,7 @@ export default {
|
|||||||
value: { type: String, default: '' },
|
value: { type: String, default: '' },
|
||||||
editorId: { type: String, default: '' },
|
editorId: { type: String, default: '' },
|
||||||
placeholder: { type: String, default: '' },
|
placeholder: { type: String, default: '' },
|
||||||
|
enabledMenuOptions: { type: Array, default: () => [] },
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
@@ -83,7 +86,8 @@ export default {
|
|||||||
this.value,
|
this.value,
|
||||||
this.placeholder,
|
this.placeholder,
|
||||||
this.plugins,
|
this.plugins,
|
||||||
this.openFileBrowser
|
{ onImageUpload: this.openFileBrowser },
|
||||||
|
this.enabledMenuOptions
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
@@ -152,7 +156,8 @@ export default {
|
|||||||
this.value,
|
this.value,
|
||||||
this.placeholder,
|
this.placeholder,
|
||||||
this.plugins,
|
this.plugins,
|
||||||
this.openFileBrowser
|
{ onImageUpload: this.openFileBrowser },
|
||||||
|
this.enabledMenuOptions
|
||||||
);
|
);
|
||||||
this.editorView.updateState(this.state);
|
this.editorView.updateState(this.state);
|
||||||
this.focusEditorInputField();
|
this.focusEditorInputField();
|
||||||
|
|||||||
+1
@@ -358,6 +358,7 @@ export default {
|
|||||||
applied_filters: this.appliedFilters.map(filter => ({
|
applied_filters: this.appliedFilters.map(filter => ({
|
||||||
key: filter.attribute_key,
|
key: filter.attribute_key,
|
||||||
operator: filter.filter_operator,
|
operator: filter.filter_operator,
|
||||||
|
query_operator: filter.query_operator,
|
||||||
})),
|
})),
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -0,0 +1,34 @@
|
|||||||
|
export const MESSAGE_EDITOR_MENU_OPTIONS = [
|
||||||
|
'strong',
|
||||||
|
'em',
|
||||||
|
'link',
|
||||||
|
'undo',
|
||||||
|
'redo',
|
||||||
|
'bulletList',
|
||||||
|
'orderedList',
|
||||||
|
'code',
|
||||||
|
];
|
||||||
|
|
||||||
|
export const MESSAGE_SIGNATURE_EDITOR_MENU_OPTIONS = [
|
||||||
|
'strong',
|
||||||
|
'em',
|
||||||
|
'link',
|
||||||
|
'undo',
|
||||||
|
'redo',
|
||||||
|
'imageUpload',
|
||||||
|
];
|
||||||
|
|
||||||
|
export const ARTICLE_EDITOR_MENU_OPTIONS = [
|
||||||
|
'strong',
|
||||||
|
'em',
|
||||||
|
'link',
|
||||||
|
'undo',
|
||||||
|
'redo',
|
||||||
|
'bulletList',
|
||||||
|
'orderedList',
|
||||||
|
'h1',
|
||||||
|
'h2',
|
||||||
|
'h3',
|
||||||
|
'imageUpload',
|
||||||
|
'code',
|
||||||
|
];
|
||||||
@@ -120,9 +120,18 @@ export const generateConditionOptions = (options, key = 'id') => {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Add the "None" option to the agent list
|
||||||
|
export const agentList = agents => [
|
||||||
|
{
|
||||||
|
id: 'nil',
|
||||||
|
name: 'None',
|
||||||
|
},
|
||||||
|
...(agents || []),
|
||||||
|
];
|
||||||
|
|
||||||
export const getActionOptions = ({ agents, teams, labels, type }) => {
|
export const getActionOptions = ({ agents, teams, labels, type }) => {
|
||||||
const actionsMap = {
|
const actionsMap = {
|
||||||
assign_agent: agents,
|
assign_agent: agentList(agents),
|
||||||
assign_team: teams,
|
assign_team: teams,
|
||||||
send_email_to_team: teams,
|
send_email_to_team: teams,
|
||||||
add_label: generateConditionOptions(labels, 'title'),
|
add_label: generateConditionOptions(labels, 'title'),
|
||||||
|
|||||||
@@ -0,0 +1,40 @@
|
|||||||
|
/**
|
||||||
|
* Determines the appropriate node and position to insert an image in the editor.
|
||||||
|
*
|
||||||
|
* Based on the current editor state and the provided image URL, this function finds out the correct node (either
|
||||||
|
* a standalone image node or an image wrapped in a paragraph) and its respective position in the editor.
|
||||||
|
*
|
||||||
|
* 1. If the current node is a paragraph and doesn't contain an image or text, the image is inserted directly into it.
|
||||||
|
* 2. If the current node isn't a paragraph or it's a paragraph containing text, the image will be wrapped
|
||||||
|
* in a new paragraph and then inserted.
|
||||||
|
* 3. If the current node is a paragraph containing an image, the new image will be inserted directly into it.
|
||||||
|
*
|
||||||
|
* @param {Object} editorState - The current state of the editor. It provides necessary details like selection, schema, etc.
|
||||||
|
* @param {string} fileUrl - The URL of the image to be inserted into the editor.
|
||||||
|
* @returns {Object|null} An object containing details about the node to be inserted and its position. It returns null if no image node can be created.
|
||||||
|
* @property {Node} node - The ProseMirror node to be inserted (either an image node or a paragraph containing the image).
|
||||||
|
* @property {number} pos - The position where the new node should be inserted in the editor.
|
||||||
|
*/
|
||||||
|
|
||||||
|
export const findNodeToInsertImage = (editorState, fileUrl) => {
|
||||||
|
const { selection, schema } = editorState;
|
||||||
|
const { nodes } = schema;
|
||||||
|
const currentNode = selection.$from.node();
|
||||||
|
const {
|
||||||
|
type: { name: typeName },
|
||||||
|
content: { size, content },
|
||||||
|
} = currentNode;
|
||||||
|
|
||||||
|
const imageNode = nodes.image.create({ src: fileUrl });
|
||||||
|
|
||||||
|
if (!imageNode) return null;
|
||||||
|
|
||||||
|
const isInParagraph = typeName === 'paragraph';
|
||||||
|
const needsNewLine =
|
||||||
|
!content.some(n => n.type.name === 'image') && size !== 0 ? 1 : 0;
|
||||||
|
|
||||||
|
return {
|
||||||
|
node: isInParagraph ? imageNode : nodes.paragraph.create({}, imageNode),
|
||||||
|
pos: selection.from + needsNewLine,
|
||||||
|
};
|
||||||
|
};
|
||||||
@@ -49,3 +49,38 @@ export const validateLoggedInRoutes = (to, user, roleWiseRoutes) => {
|
|||||||
// Proceed to the route if none of the above conditions are met
|
// Proceed to the route if none of the above conditions are met
|
||||||
return null;
|
return null;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const isAConversationRoute = routeName =>
|
||||||
|
[
|
||||||
|
'inbox_conversation',
|
||||||
|
'conversation_through_mentions',
|
||||||
|
'conversation_through_unattended',
|
||||||
|
'conversation_through_inbox',
|
||||||
|
'conversations_through_label',
|
||||||
|
'conversations_through_team',
|
||||||
|
'conversations_through_folders',
|
||||||
|
'conversation_through_participating',
|
||||||
|
].includes(routeName);
|
||||||
|
|
||||||
|
export const getConversationDashboardRoute = routeName => {
|
||||||
|
switch (routeName) {
|
||||||
|
case 'inbox_conversation':
|
||||||
|
return 'home';
|
||||||
|
case 'conversation_through_mentions':
|
||||||
|
return 'conversation_mentions';
|
||||||
|
case 'conversation_through_unattended':
|
||||||
|
return 'conversation_unattended';
|
||||||
|
case 'conversations_through_label':
|
||||||
|
return 'label_conversations';
|
||||||
|
case 'conversations_through_team':
|
||||||
|
return 'team_conversations';
|
||||||
|
case 'conversations_through_folders':
|
||||||
|
return 'folder_conversations';
|
||||||
|
case 'conversation_through_participating':
|
||||||
|
return 'conversation_participating';
|
||||||
|
case 'conversation_through_inbox':
|
||||||
|
return 'inbox_dashboard';
|
||||||
|
default:
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|||||||
@@ -0,0 +1,100 @@
|
|||||||
|
import { findNodeToInsertImage } from '../messageEditorHelper';
|
||||||
|
|
||||||
|
describe('findNodeToInsertImage', () => {
|
||||||
|
let mockEditorState;
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
mockEditorState = {
|
||||||
|
selection: {
|
||||||
|
$from: {
|
||||||
|
node: jest.fn(() => ({})),
|
||||||
|
},
|
||||||
|
from: 0,
|
||||||
|
},
|
||||||
|
schema: {
|
||||||
|
nodes: {
|
||||||
|
image: {
|
||||||
|
create: jest.fn(attrs => ({ type: { name: 'image' }, attrs })),
|
||||||
|
},
|
||||||
|
paragraph: {
|
||||||
|
create: jest.fn((_, node) => ({
|
||||||
|
type: { name: 'paragraph' },
|
||||||
|
content: [node],
|
||||||
|
})),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should insert image directly into an empty paragraph', () => {
|
||||||
|
const mockNode = {
|
||||||
|
type: { name: 'paragraph' },
|
||||||
|
content: { size: 0, content: [] },
|
||||||
|
};
|
||||||
|
mockEditorState.selection.$from.node.mockReturnValueOnce(mockNode);
|
||||||
|
|
||||||
|
const result = findNodeToInsertImage(mockEditorState, 'image-url');
|
||||||
|
expect(result).toEqual({
|
||||||
|
node: { type: { name: 'image' }, attrs: { src: 'image-url' } },
|
||||||
|
pos: 0,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should insert image directly into a paragraph without an image but with other content', () => {
|
||||||
|
const mockNode = {
|
||||||
|
type: { name: 'paragraph' },
|
||||||
|
content: {
|
||||||
|
size: 1,
|
||||||
|
content: [
|
||||||
|
{
|
||||||
|
type: { name: 'text' },
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
};
|
||||||
|
mockEditorState.selection.$from.node.mockReturnValueOnce(mockNode);
|
||||||
|
mockEditorState.selection.from = 1;
|
||||||
|
|
||||||
|
const result = findNodeToInsertImage(mockEditorState, 'image-url');
|
||||||
|
expect(result).toEqual({
|
||||||
|
node: { type: { name: 'image' }, attrs: { src: 'image-url' } },
|
||||||
|
pos: 2, // Because it should insert after the text, on a new line.
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should wrap image in a new paragraph when the current node isn't a paragraph", () => {
|
||||||
|
const mockNode = {
|
||||||
|
type: { name: 'not-a-paragraph' },
|
||||||
|
content: { size: 0, content: [] },
|
||||||
|
};
|
||||||
|
mockEditorState.selection.$from.node.mockReturnValueOnce(mockNode);
|
||||||
|
|
||||||
|
const result = findNodeToInsertImage(mockEditorState, 'image-url');
|
||||||
|
expect(result.node.type.name).toBe('paragraph');
|
||||||
|
expect(result.node.content[0].type.name).toBe('image');
|
||||||
|
expect(result.node.content[0].attrs.src).toBe('image-url');
|
||||||
|
expect(result.pos).toBe(0);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should insert a new image directly into the paragraph that already contains an image', () => {
|
||||||
|
const mockNode = {
|
||||||
|
type: { name: 'paragraph' },
|
||||||
|
content: {
|
||||||
|
size: 1,
|
||||||
|
content: [
|
||||||
|
{
|
||||||
|
type: { name: 'image', attrs: { src: 'existing-image-url' } },
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
};
|
||||||
|
mockEditorState.selection.$from.node.mockReturnValueOnce(mockNode);
|
||||||
|
mockEditorState.selection.from = 1;
|
||||||
|
|
||||||
|
const result = findNodeToInsertImage(mockEditorState, 'image-url');
|
||||||
|
expect(result.node.type.name).toBe('image');
|
||||||
|
expect(result.node.attrs.src).toBe('image-url');
|
||||||
|
expect(result.pos).toBe(1);
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -1,6 +1,8 @@
|
|||||||
import {
|
import {
|
||||||
|
getConversationDashboardRoute,
|
||||||
getCurrentAccount,
|
getCurrentAccount,
|
||||||
getUserRole,
|
getUserRole,
|
||||||
|
isAConversationRoute,
|
||||||
routeIsAccessibleFor,
|
routeIsAccessibleFor,
|
||||||
validateLoggedInRoutes,
|
validateLoggedInRoutes,
|
||||||
} from '../routeHelpers';
|
} from '../routeHelpers';
|
||||||
@@ -94,3 +96,41 @@ describe('#validateLoggedInRoutes', () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('isAConversationRoute', () => {
|
||||||
|
it('returns true if conversation route name is provided', () => {
|
||||||
|
expect(isAConversationRoute('inbox_conversation')).toBe(true);
|
||||||
|
expect(isAConversationRoute('conversation_through_inbox')).toBe(true);
|
||||||
|
expect(isAConversationRoute('conversations_through_label')).toBe(true);
|
||||||
|
expect(isAConversationRoute('conversations_through_team')).toBe(true);
|
||||||
|
expect(isAConversationRoute('dashboard')).toBe(false);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('getConversationDashboardRoute', () => {
|
||||||
|
it('returns dashboard route for conversation', () => {
|
||||||
|
expect(getConversationDashboardRoute('inbox_conversation')).toEqual('home');
|
||||||
|
expect(
|
||||||
|
getConversationDashboardRoute('conversation_through_mentions')
|
||||||
|
).toEqual('conversation_mentions');
|
||||||
|
expect(
|
||||||
|
getConversationDashboardRoute('conversation_through_unattended')
|
||||||
|
).toEqual('conversation_unattended');
|
||||||
|
expect(
|
||||||
|
getConversationDashboardRoute('conversations_through_label')
|
||||||
|
).toEqual('label_conversations');
|
||||||
|
expect(getConversationDashboardRoute('conversations_through_team')).toEqual(
|
||||||
|
'team_conversations'
|
||||||
|
);
|
||||||
|
expect(
|
||||||
|
getConversationDashboardRoute('conversations_through_folders')
|
||||||
|
).toEqual('folder_conversations');
|
||||||
|
expect(
|
||||||
|
getConversationDashboardRoute('conversation_through_participating')
|
||||||
|
).toEqual('conversation_participating');
|
||||||
|
expect(getConversationDashboardRoute('conversation_through_inbox')).toEqual(
|
||||||
|
'inbox_dashboard'
|
||||||
|
);
|
||||||
|
expect(getConversationDashboardRoute('non_existent_route')).toBeNull();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|||||||
@@ -0,0 +1,53 @@
|
|||||||
|
import { uploadFile } from '../uploadHelper';
|
||||||
|
import axios from 'axios';
|
||||||
|
|
||||||
|
// Mocking axios using jest-mock-axios
|
||||||
|
global.axios = axios;
|
||||||
|
jest.mock('axios');
|
||||||
|
|
||||||
|
describe('#Upload Helpers', () => {
|
||||||
|
afterEach(() => {
|
||||||
|
// Cleaning up the mock after each test
|
||||||
|
axios.post.mockReset();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should send a POST request with correct data', async () => {
|
||||||
|
const mockFile = new File(['dummy content'], 'example.png', {
|
||||||
|
type: 'image/png',
|
||||||
|
});
|
||||||
|
const mockResponse = {
|
||||||
|
data: {
|
||||||
|
file_url: 'https://example.com/fileUrl',
|
||||||
|
blob_key: 'blobKey123',
|
||||||
|
blob_id: 'blobId456',
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
axios.post.mockResolvedValueOnce(mockResponse);
|
||||||
|
|
||||||
|
const result = await uploadFile(mockFile);
|
||||||
|
|
||||||
|
expect(axios.post).toHaveBeenCalledWith(
|
||||||
|
'/api/v1/upload',
|
||||||
|
expect.any(FormData),
|
||||||
|
{ headers: { 'Content-Type': 'multipart/form-data' } }
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(result).toEqual({
|
||||||
|
fileUrl: 'https://example.com/fileUrl',
|
||||||
|
blobKey: 'blobKey123',
|
||||||
|
blobId: 'blobId456',
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle errors', async () => {
|
||||||
|
const mockFile = new File(['dummy content'], 'example.png', {
|
||||||
|
type: 'image/png',
|
||||||
|
});
|
||||||
|
const mockError = new Error('Failed to upload');
|
||||||
|
|
||||||
|
axios.post.mockRejectedValueOnce(mockError);
|
||||||
|
|
||||||
|
await expect(uploadFile(mockFile)).rejects.toThrow('Failed to upload');
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
/* global axios */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constants and Configuration
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Version for the API endpoint.
|
||||||
|
const API_VERSION = 'v1';
|
||||||
|
|
||||||
|
// Default headers to be used in the axios request.
|
||||||
|
const HEADERS = {
|
||||||
|
'Content-Type': 'multipart/form-data',
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Uploads a file to the server.
|
||||||
|
*
|
||||||
|
* This function sends a POST request to a given API endpoint and uploads the specified file.
|
||||||
|
* The function uses FormData to wrap the file and axios to send the request.
|
||||||
|
*
|
||||||
|
* @param {File} file - The file to be uploaded. It should be a File object (typically coming from a file input element).
|
||||||
|
* @returns {Promise} A promise that resolves with the server's response when the upload is successful, or rejects if there's an error.
|
||||||
|
*/
|
||||||
|
export async function uploadFile(file) {
|
||||||
|
// Create a new FormData instance.
|
||||||
|
let formData = new FormData();
|
||||||
|
|
||||||
|
// Append the file to the FormData instance under the key 'attachment'.
|
||||||
|
formData.append('attachment', file);
|
||||||
|
|
||||||
|
// Use axios to send a POST request to the upload endpoint.
|
||||||
|
const { data } = await axios.post(`/api/${API_VERSION}/upload`, formData, {
|
||||||
|
headers: HEADERS,
|
||||||
|
});
|
||||||
|
|
||||||
|
return {
|
||||||
|
fileUrl: data.file_url,
|
||||||
|
blobKey: data.blob_key,
|
||||||
|
blobId: data.blob_id,
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -26,6 +26,7 @@ import pt_BR from './locale/pt_BR';
|
|||||||
import ro from './locale/ro';
|
import ro from './locale/ro';
|
||||||
import ru from './locale/ru';
|
import ru from './locale/ru';
|
||||||
import sk from './locale/sk';
|
import sk from './locale/sk';
|
||||||
|
import sr from './locale/sr';
|
||||||
import sv from './locale/sv';
|
import sv from './locale/sv';
|
||||||
import ta from './locale/ta';
|
import ta from './locale/ta';
|
||||||
import th from './locale/th';
|
import th from './locale/th';
|
||||||
@@ -66,6 +67,7 @@ export default {
|
|||||||
ro,
|
ro,
|
||||||
ru,
|
ru,
|
||||||
sk,
|
sk,
|
||||||
|
sr,
|
||||||
sv,
|
sv,
|
||||||
ta,
|
ta,
|
||||||
th,
|
th,
|
||||||
|
|||||||
@@ -39,7 +39,10 @@
|
|||||||
"NOTE": "Create a personal message signature that would be added to all the messages you send from your email inbox. Use the rich content editor to create a highly personalised signature.",
|
"NOTE": "Create a personal message signature that would be added to all the messages you send from your email inbox. Use the rich content editor to create a highly personalised signature.",
|
||||||
"BTN_TEXT": "Save message signature",
|
"BTN_TEXT": "Save message signature",
|
||||||
"API_ERROR": "Couldn't save signature! Try again",
|
"API_ERROR": "Couldn't save signature! Try again",
|
||||||
"API_SUCCESS": "Signature saved successfully"
|
"API_SUCCESS": "Signature saved successfully",
|
||||||
|
"IMAGE_UPLOAD_ERROR": "Couldn't upload image! Try again",
|
||||||
|
"IMAGE_UPLOAD_SUCCESS": "Image added successfully. Please click on save to save the signature",
|
||||||
|
"IMAGE_UPLOAD_SIZE_ERROR": "Image size should be less than {size}MB"
|
||||||
},
|
},
|
||||||
"MESSAGE_SIGNATURE": {
|
"MESSAGE_SIGNATURE": {
|
||||||
"LABEL": "Message Signature",
|
"LABEL": "Message Signature",
|
||||||
|
|||||||
@@ -39,7 +39,10 @@
|
|||||||
"NOTE": "إنشاء توقيع رسالة شخصية يتم إضافتها إلى جميع الرسائل التي ترسلها من المنصة. استخدم محرر المحتوى الغني لإنشاء توقيع شديد التخصيص.",
|
"NOTE": "إنشاء توقيع رسالة شخصية يتم إضافتها إلى جميع الرسائل التي ترسلها من المنصة. استخدم محرر المحتوى الغني لإنشاء توقيع شديد التخصيص.",
|
||||||
"BTN_TEXT": "حفظ توقيع الرسالة",
|
"BTN_TEXT": "حفظ توقيع الرسالة",
|
||||||
"API_ERROR": "تعذر إرسال الرسالة! حاول مرة أخرى",
|
"API_ERROR": "تعذر إرسال الرسالة! حاول مرة أخرى",
|
||||||
"API_SUCCESS": "تم حفظ التوقيع بنجاح"
|
"API_SUCCESS": "تم حفظ التوقيع بنجاح",
|
||||||
|
"IMAGE_UPLOAD_ERROR": "Couldn't upload image! Try again",
|
||||||
|
"IMAGE_UPLOAD_SUCCESS": "Image added successfully. Please click on save to save the signature",
|
||||||
|
"IMAGE_UPLOAD_SIZE_ERROR": "Image size should be less than {size}MB"
|
||||||
},
|
},
|
||||||
"MESSAGE_SIGNATURE": {
|
"MESSAGE_SIGNATURE": {
|
||||||
"LABEL": "توقيع الرسالة",
|
"LABEL": "توقيع الرسالة",
|
||||||
|
|||||||
@@ -39,7 +39,10 @@
|
|||||||
"NOTE": "Create a personal message signature that would be added to all the messages you send from your email inbox. Use the rich content editor to create a highly personalised signature.",
|
"NOTE": "Create a personal message signature that would be added to all the messages you send from your email inbox. Use the rich content editor to create a highly personalised signature.",
|
||||||
"BTN_TEXT": "Save message signature",
|
"BTN_TEXT": "Save message signature",
|
||||||
"API_ERROR": "Couldn't save signature! Try again",
|
"API_ERROR": "Couldn't save signature! Try again",
|
||||||
"API_SUCCESS": "Signature saved successfully"
|
"API_SUCCESS": "Signature saved successfully",
|
||||||
|
"IMAGE_UPLOAD_ERROR": "Couldn't upload image! Try again",
|
||||||
|
"IMAGE_UPLOAD_SUCCESS": "Image added successfully. Please click on save to save the signature",
|
||||||
|
"IMAGE_UPLOAD_SIZE_ERROR": "Image size should be less than {size}MB"
|
||||||
},
|
},
|
||||||
"MESSAGE_SIGNATURE": {
|
"MESSAGE_SIGNATURE": {
|
||||||
"LABEL": "Message Signature",
|
"LABEL": "Message Signature",
|
||||||
|
|||||||
@@ -39,7 +39,10 @@
|
|||||||
"NOTE": "Create a personal message signature that would be added to all the messages you send from your email inbox. Use the rich content editor to create a highly personalised signature.",
|
"NOTE": "Create a personal message signature that would be added to all the messages you send from your email inbox. Use the rich content editor to create a highly personalised signature.",
|
||||||
"BTN_TEXT": "Save message signature",
|
"BTN_TEXT": "Save message signature",
|
||||||
"API_ERROR": "Couldn't save signature! Try again",
|
"API_ERROR": "Couldn't save signature! Try again",
|
||||||
"API_SUCCESS": "Signature saved successfully"
|
"API_SUCCESS": "Signature saved successfully",
|
||||||
|
"IMAGE_UPLOAD_ERROR": "Couldn't upload image! Try again",
|
||||||
|
"IMAGE_UPLOAD_SUCCESS": "Image added successfully. Please click on save to save the signature",
|
||||||
|
"IMAGE_UPLOAD_SIZE_ERROR": "Image size should be less than {size}MB"
|
||||||
},
|
},
|
||||||
"MESSAGE_SIGNATURE": {
|
"MESSAGE_SIGNATURE": {
|
||||||
"LABEL": "Message Signature",
|
"LABEL": "Message Signature",
|
||||||
|
|||||||
@@ -39,7 +39,10 @@
|
|||||||
"NOTE": "Create a personal message signature that would be added to all the messages you send from your email inbox. Use the rich content editor to create a highly personalised signature.",
|
"NOTE": "Create a personal message signature that would be added to all the messages you send from your email inbox. Use the rich content editor to create a highly personalised signature.",
|
||||||
"BTN_TEXT": "Save message signature",
|
"BTN_TEXT": "Save message signature",
|
||||||
"API_ERROR": "Couldn't save signature! Try again",
|
"API_ERROR": "Couldn't save signature! Try again",
|
||||||
"API_SUCCESS": "Signature saved successfully"
|
"API_SUCCESS": "Signature saved successfully",
|
||||||
|
"IMAGE_UPLOAD_ERROR": "Couldn't upload image! Try again",
|
||||||
|
"IMAGE_UPLOAD_SUCCESS": "Image added successfully. Please click on save to save the signature",
|
||||||
|
"IMAGE_UPLOAD_SIZE_ERROR": "Image size should be less than {size}MB"
|
||||||
},
|
},
|
||||||
"MESSAGE_SIGNATURE": {
|
"MESSAGE_SIGNATURE": {
|
||||||
"LABEL": "Message Signature",
|
"LABEL": "Message Signature",
|
||||||
|
|||||||
@@ -39,7 +39,10 @@
|
|||||||
"NOTE": "Opret en personlig besked signatur, der vil blive føjet til alle de meddelelser, du sender fra din e-mail indbakke. Brug den rige content editor til at oprette en meget personlig signatur.",
|
"NOTE": "Opret en personlig besked signatur, der vil blive føjet til alle de meddelelser, du sender fra din e-mail indbakke. Brug den rige content editor til at oprette en meget personlig signatur.",
|
||||||
"BTN_TEXT": "Gem beskedsignatur",
|
"BTN_TEXT": "Gem beskedsignatur",
|
||||||
"API_ERROR": "Kunne ikke gemme signatur! Prøv igen",
|
"API_ERROR": "Kunne ikke gemme signatur! Prøv igen",
|
||||||
"API_SUCCESS": "Signatur gemt"
|
"API_SUCCESS": "Signatur gemt",
|
||||||
|
"IMAGE_UPLOAD_ERROR": "Couldn't upload image! Try again",
|
||||||
|
"IMAGE_UPLOAD_SUCCESS": "Image added successfully. Please click on save to save the signature",
|
||||||
|
"IMAGE_UPLOAD_SIZE_ERROR": "Image size should be less than {size}MB"
|
||||||
},
|
},
|
||||||
"MESSAGE_SIGNATURE": {
|
"MESSAGE_SIGNATURE": {
|
||||||
"LABEL": "Besked Signatur",
|
"LABEL": "Besked Signatur",
|
||||||
|
|||||||
@@ -39,7 +39,10 @@
|
|||||||
"NOTE": "Erstellen Sie eine persönliche Nachrichtensignatur, die allen Nachrichten hinzugefügt wird, die Sie aus Ihrem E-Mail-Posteingang senden. Verwenden Sie den Rich-Content-Editor, um eine stark personalisierte Signatur zu erstellen.",
|
"NOTE": "Erstellen Sie eine persönliche Nachrichtensignatur, die allen Nachrichten hinzugefügt wird, die Sie aus Ihrem E-Mail-Posteingang senden. Verwenden Sie den Rich-Content-Editor, um eine stark personalisierte Signatur zu erstellen.",
|
||||||
"BTN_TEXT": "Nachrichten-Signatur speichern",
|
"BTN_TEXT": "Nachrichten-Signatur speichern",
|
||||||
"API_ERROR": "Signatur konnte nicht gespeichert werden! Versuch es noch einmal",
|
"API_ERROR": "Signatur konnte nicht gespeichert werden! Versuch es noch einmal",
|
||||||
"API_SUCCESS": "Signatur erfolgreich gespeichert"
|
"API_SUCCESS": "Signatur erfolgreich gespeichert",
|
||||||
|
"IMAGE_UPLOAD_ERROR": "Couldn't upload image! Try again",
|
||||||
|
"IMAGE_UPLOAD_SUCCESS": "Image added successfully. Please click on save to save the signature",
|
||||||
|
"IMAGE_UPLOAD_SIZE_ERROR": "Bildgröße sollte kleiner als {size}MB sein"
|
||||||
},
|
},
|
||||||
"MESSAGE_SIGNATURE": {
|
"MESSAGE_SIGNATURE": {
|
||||||
"LABEL": "Nachrichten-Signatur",
|
"LABEL": "Nachrichten-Signatur",
|
||||||
|
|||||||
@@ -39,7 +39,10 @@
|
|||||||
"NOTE": "Δημιουργήστε μια προσωπική υπογραφή, η οποία θα προστεθεί σε όλα τα μηνύματα που στέλνετε από τα εισερχόμενα email σας. Χρησιμοποιήστε τον επεξεργαστή πλούσιου περιεχομένου για να δημιουργήσετε μια εξατομικευμένη υπογραφή.",
|
"NOTE": "Δημιουργήστε μια προσωπική υπογραφή, η οποία θα προστεθεί σε όλα τα μηνύματα που στέλνετε από τα εισερχόμενα email σας. Χρησιμοποιήστε τον επεξεργαστή πλούσιου περιεχομένου για να δημιουργήσετε μια εξατομικευμένη υπογραφή.",
|
||||||
"BTN_TEXT": "Αποθήκευση υπογραφής μηνύματος",
|
"BTN_TEXT": "Αποθήκευση υπογραφής μηνύματος",
|
||||||
"API_ERROR": "Δεν ήταν δυνατή η αποθήκευση της υπογραφής! Δοκιμάστε ξανά",
|
"API_ERROR": "Δεν ήταν δυνατή η αποθήκευση της υπογραφής! Δοκιμάστε ξανά",
|
||||||
"API_SUCCESS": "Η υπογραφή αποθηκεύτηκε με επιτυχία"
|
"API_SUCCESS": "Η υπογραφή αποθηκεύτηκε με επιτυχία",
|
||||||
|
"IMAGE_UPLOAD_ERROR": "Couldn't upload image! Try again",
|
||||||
|
"IMAGE_UPLOAD_SUCCESS": "Image added successfully. Please click on save to save the signature",
|
||||||
|
"IMAGE_UPLOAD_SIZE_ERROR": "Image size should be less than {size}MB"
|
||||||
},
|
},
|
||||||
"MESSAGE_SIGNATURE": {
|
"MESSAGE_SIGNATURE": {
|
||||||
"LABEL": "Υπογραφή μηνύματος",
|
"LABEL": "Υπογραφή μηνύματος",
|
||||||
|
|||||||
@@ -39,7 +39,10 @@
|
|||||||
"NOTE": "Create a personal message signature that would be added to all the messages you send from your email inbox. Use the rich content editor to create a highly personalised signature.",
|
"NOTE": "Create a personal message signature that would be added to all the messages you send from your email inbox. Use the rich content editor to create a highly personalised signature.",
|
||||||
"BTN_TEXT": "Save message signature",
|
"BTN_TEXT": "Save message signature",
|
||||||
"API_ERROR": "Couldn't save signature! Try again",
|
"API_ERROR": "Couldn't save signature! Try again",
|
||||||
"API_SUCCESS": "Signature saved successfully"
|
"API_SUCCESS": "Signature saved successfully",
|
||||||
|
"IMAGE_UPLOAD_ERROR": "Couldn't upload image! Try again",
|
||||||
|
"IMAGE_UPLOAD_SUCCESS": "Image added successfully. Please click on save to save the signature",
|
||||||
|
"IMAGE_UPLOAD_SIZE_ERROR": "Image size should be less than {size}MB"
|
||||||
},
|
},
|
||||||
"MESSAGE_SIGNATURE": {
|
"MESSAGE_SIGNATURE": {
|
||||||
"LABEL": "Message Signature",
|
"LABEL": "Message Signature",
|
||||||
|
|||||||
@@ -57,15 +57,15 @@
|
|||||||
"DELETE": "%{agentName} eliminó una macro (#%{id})"
|
"DELETE": "%{agentName} eliminó una macro (#%{id})"
|
||||||
},
|
},
|
||||||
"INBOX_MEMBER": {
|
"INBOX_MEMBER": {
|
||||||
"ADD": "%{agentName} added %{user} to the inbox(#%{inbox_id})",
|
"ADD": "%{agentName} agregó %{user} a la bandeja de entrada (#%{inbox_id})",
|
||||||
"REMOVE": "%{agentName} removed %{user} from the inbox(#%{inbox_id})"
|
"REMOVE": "%{agentName} eliminó %{user} de la bandeja de entrada(#%{inbox_id})"
|
||||||
},
|
},
|
||||||
"TEAM_MEMBER": {
|
"TEAM_MEMBER": {
|
||||||
"ADD": "%{agentName} added %{user} to the team(#%{team_id})",
|
"ADD": "%{agentName} agregó %{user} al equipo (#%{team_id})",
|
||||||
"REMOVE": "%{agentName} removed %{user} from the team(#%{team_id})"
|
"REMOVE": "%{agentName} eliminó %{user} del equipo (#%{team_id})"
|
||||||
},
|
},
|
||||||
"ACCOUNT": {
|
"ACCOUNT": {
|
||||||
"EDIT": "%{agentName} updated the account configuration (#%{id})"
|
"EDIT": "%{agentName} Actualizó la configuración de la cuenta (#%{id})"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
},
|
},
|
||||||
"TAB_HEADING": "Conversaciones",
|
"TAB_HEADING": "Conversaciones",
|
||||||
"MENTION_HEADING": "Menciones",
|
"MENTION_HEADING": "Menciones",
|
||||||
"UNATTENDED_HEADING": "Sin atender",
|
"UNATTENDED_HEADING": "Desatendido",
|
||||||
"SEARCH": {
|
"SEARCH": {
|
||||||
"INPUT": "Búsqueda de Personas, Chats, Respuestas Salvadas .."
|
"INPUT": "Búsqueda de Personas, Chats, Respuestas Salvadas .."
|
||||||
},
|
},
|
||||||
@@ -20,7 +20,7 @@
|
|||||||
},
|
},
|
||||||
"CHAT_STATUS_FILTER_ITEMS": {
|
"CHAT_STATUS_FILTER_ITEMS": {
|
||||||
"open": {
|
"open": {
|
||||||
"TEXT": "Abiertas"
|
"TEXT": "Abrir"
|
||||||
},
|
},
|
||||||
"resolved": {
|
"resolved": {
|
||||||
"TEXT": "Resueltas"
|
"TEXT": "Resueltas"
|
||||||
|
|||||||
@@ -71,7 +71,7 @@
|
|||||||
"SUBMIT": "Importar",
|
"SUBMIT": "Importar",
|
||||||
"CANCEL": "Cancelar"
|
"CANCEL": "Cancelar"
|
||||||
},
|
},
|
||||||
"SUCCESS_MESSAGE": "You will be notified via email when the import is complete.",
|
"SUCCESS_MESSAGE": "Se le notificará por correo electrónico cuando se complete la importación.",
|
||||||
"ERROR_MESSAGE": "Hubo un error, por favor inténtelo de nuevo"
|
"ERROR_MESSAGE": "Hubo un error, por favor inténtelo de nuevo"
|
||||||
},
|
},
|
||||||
"EXPORT_CONTACTS": {
|
"EXPORT_CONTACTS": {
|
||||||
|
|||||||
@@ -13,8 +13,8 @@
|
|||||||
"NO_INBOX_AGENT": "¡Uh Oh! Parece que no eres parte de ninguna bandeja de entrada. Por favor, contacta con tu administrador",
|
"NO_INBOX_AGENT": "¡Uh Oh! Parece que no eres parte de ninguna bandeja de entrada. Por favor, contacta con tu administrador",
|
||||||
"SEARCH_MESSAGES": "Buscar mensajes en conversaciones",
|
"SEARCH_MESSAGES": "Buscar mensajes en conversaciones",
|
||||||
"EMPTY_STATE": {
|
"EMPTY_STATE": {
|
||||||
"CMD_BAR": "to open command menu",
|
"CMD_BAR": "para abrir el menú de comandos",
|
||||||
"KEYBOARD_SHORTCUTS": "to view keyboard shortcuts"
|
"KEYBOARD_SHORTCUTS": "para ver los atajos del teclado"
|
||||||
},
|
},
|
||||||
"SEARCH": {
|
"SEARCH": {
|
||||||
"TITLE": "Buscar mensajes",
|
"TITLE": "Buscar mensajes",
|
||||||
|
|||||||
@@ -134,7 +134,7 @@
|
|||||||
"GO_TO_NOTIFICATIONS": "Ir a Notificaciones",
|
"GO_TO_NOTIFICATIONS": "Ir a Notificaciones",
|
||||||
"ADD_LABELS_TO_CONVERSATION": "Añadir etiqueta a la conversación",
|
"ADD_LABELS_TO_CONVERSATION": "Añadir etiqueta a la conversación",
|
||||||
"ASSIGN_AN_AGENT": "Asignar un agente",
|
"ASSIGN_AN_AGENT": "Asignar un agente",
|
||||||
"AI_ASSIST": "AI Assist",
|
"AI_ASSIST": "Asistencia AI",
|
||||||
"ASSIGN_PRIORITY": "Asignar prioridad",
|
"ASSIGN_PRIORITY": "Asignar prioridad",
|
||||||
"ASSIGN_A_TEAM": "Asignar un equipo",
|
"ASSIGN_A_TEAM": "Asignar un equipo",
|
||||||
"MUTE_CONVERSATION": "Silenciar conversación",
|
"MUTE_CONVERSATION": "Silenciar conversación",
|
||||||
@@ -160,7 +160,7 @@
|
|||||||
"LOADING_MESSAGE": "Cargando aplicación del tablero..."
|
"LOADING_MESSAGE": "Cargando aplicación del tablero..."
|
||||||
},
|
},
|
||||||
"COMMON": {
|
"COMMON": {
|
||||||
"OR": "Or",
|
"OR": "O",
|
||||||
"CLICK_HERE": "haz clic aquí"
|
"CLICK_HERE": "haz clic aquí"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -112,14 +112,14 @@
|
|||||||
"ERROR": "Este campo es obligatorio"
|
"ERROR": "Este campo es obligatorio"
|
||||||
},
|
},
|
||||||
"API_KEY": {
|
"API_KEY": {
|
||||||
"USE_API_KEY": "Use API Key Authentication",
|
"USE_API_KEY": "Usar autenticación de Clave API",
|
||||||
"LABEL": "API Key SID",
|
"LABEL": "API Key SID",
|
||||||
"PLACEHOLDER": "Please enter your API Key SID",
|
"PLACEHOLDER": "Por favor ingrese su API Key SID",
|
||||||
"ERROR": "Este campo es obligatorio"
|
"ERROR": "Este campo es obligatorio"
|
||||||
},
|
},
|
||||||
"API_KEY_SECRET": {
|
"API_KEY_SECRET": {
|
||||||
"LABEL": "API Key Secret",
|
"LABEL": "Clave API secreta",
|
||||||
"PLACEHOLDER": "Please enter your API Key Secret",
|
"PLACEHOLDER": "Por favor ingrese su Clave API secreta",
|
||||||
"ERROR": "Este campo es obligatorio"
|
"ERROR": "Este campo es obligatorio"
|
||||||
},
|
},
|
||||||
"MESSAGING_SERVICE_SID": {
|
"MESSAGING_SERVICE_SID": {
|
||||||
@@ -403,21 +403,21 @@
|
|||||||
"DISABLED": "Deshabilitado"
|
"DISABLED": "Deshabilitado"
|
||||||
},
|
},
|
||||||
"SENDER_NAME_SECTION": {
|
"SENDER_NAME_SECTION": {
|
||||||
"TITLE": "Sender name",
|
"TITLE": "Nombre del remitente",
|
||||||
"SUB_TEXT": "Select the name shown to the your customer when they receive emails from your agents.",
|
"SUB_TEXT": "Seleccione el nombre que se muestra al cliente cuando reciba correos electrónicos de sus agentes.",
|
||||||
"FOR_EG": "For eg:",
|
"FOR_EG": "Por ejemplo:",
|
||||||
"FRIENDLY": {
|
"FRIENDLY": {
|
||||||
"TITLE": "Amigable",
|
"TITLE": "Amigable",
|
||||||
"FROM": "De",
|
"FROM": "De",
|
||||||
"SUBTITLE": "Add the name of the agent who sent the reply in the sender name to make it friendly."
|
"SUBTITLE": "Añada el nombre del agente que envió la respuesta en el nombre del remitente para que sea amistoso."
|
||||||
},
|
},
|
||||||
"PROFESSIONAL": {
|
"PROFESSIONAL": {
|
||||||
"TITLE": "Profesional",
|
"TITLE": "Profesional",
|
||||||
"SUBTITLE": "Use only the configured business name as the sender name in the email header."
|
"SUBTITLE": "Utilice sólo el nombre del negocio configurado como nombre del remitente en el encabezado del correo electrónico."
|
||||||
},
|
},
|
||||||
"BUSINESS_NAME": {
|
"BUSINESS_NAME": {
|
||||||
"BUTTON_TEXT": "+ Configure your business name",
|
"BUTTON_TEXT": "+ Configura el nombre de tu negocio",
|
||||||
"PLACEHOLDER": "Enter your business name",
|
"PLACEHOLDER": "Introduce el nombre de tu negocio",
|
||||||
"SAVE_BUTTON_TEXT": "Guardar"
|
"SAVE_BUTTON_TEXT": "Guardar"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -484,9 +484,9 @@
|
|||||||
"ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Activar o desactivar la caja de recolección de correo electrónico",
|
"ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Activar o desactivar la caja de recolección de correo electrónico",
|
||||||
"AUTO_ASSIGNMENT": "Activar asignación automática",
|
"AUTO_ASSIGNMENT": "Activar asignación automática",
|
||||||
"ENABLE_CSAT": "Habilitar Encuesta de Satisfacción",
|
"ENABLE_CSAT": "Habilitar Encuesta de Satisfacción",
|
||||||
"SENDER_NAME_SECTION": "Enable Agent Name in Email",
|
"SENDER_NAME_SECTION": "Habilitar nombre del agente en el correo electrónico",
|
||||||
"ENABLE_CSAT_SUB_TEXT": "Habilitar/deshabilitar encuesta CSAT(satisfacción del cliente) después de resolver una conversación",
|
"ENABLE_CSAT_SUB_TEXT": "Habilitar/deshabilitar encuesta CSAT(satisfacción del cliente) después de resolver una conversación",
|
||||||
"SENDER_NAME_SECTION_TEXT": "Enable/Disable showing Agent's name in email, if disabled it will show business name",
|
"SENDER_NAME_SECTION_TEXT": "Habilitar/Deshabilitar mostrando el nombre del agente en el correo electrónico, si está deshabilitado, mostrará el nombre del negocio",
|
||||||
"ENABLE_CONTINUITY_VIA_EMAIL": "Habilitar continuidad de conversación por correo electrónico",
|
"ENABLE_CONTINUITY_VIA_EMAIL": "Habilitar continuidad de conversación por correo electrónico",
|
||||||
"ENABLE_CONTINUITY_VIA_EMAIL_SUB_TEXT": "Las conversaciones continuarán por correo electrónico si la dirección de correo electrónico de contacto está disponible.",
|
"ENABLE_CONTINUITY_VIA_EMAIL_SUB_TEXT": "Las conversaciones continuarán por correo electrónico si la dirección de correo electrónico de contacto está disponible.",
|
||||||
"LOCK_TO_SINGLE_CONVERSATION": "Bloquear a una sola conversación",
|
"LOCK_TO_SINGLE_CONVERSATION": "Bloquear a una sola conversación",
|
||||||
|
|||||||
@@ -75,25 +75,25 @@
|
|||||||
"SLACK": {
|
"SLACK": {
|
||||||
"DELETE": "Eliminar",
|
"DELETE": "Eliminar",
|
||||||
"DELETE_CONFIRMATION": {
|
"DELETE_CONFIRMATION": {
|
||||||
"TITLE": "Delete the integration",
|
"TITLE": "Eliminar la integración",
|
||||||
"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."
|
"MESSAGE": "¿Está seguro que desea eliminar la integración? Si lo hace, perderá el acceso a las conversaciones en su espacio de trabajo Slack."
|
||||||
},
|
},
|
||||||
"HELP_TEXT": {
|
"HELP_TEXT": {
|
||||||
"TITLE": "Utilizando integración de Slack",
|
"TITLE": "¿Cómo utilizar la Integración Slack?",
|
||||||
"BODY": "<br/><p>Chatwoot ahora sincronizará todas las conversaciones entrantes en el canal <b><i>de conversaciones del cliente</i></b> dentro de tu lugar de trabajo slack.</p><p>Respondiendo a un tema de conversación en <b><i>conversaciones de clientes</i></b> canal de slack creará una respuesta al cliente a través de chatwoot.</p><p>Inicie las respuestas con <b><i>nota:</i></b> para crear notas privadas en lugar de respuestas.</p><p>Si el respondente de slack tiene un perfil de agente en el chatwoot bajo el mismo correo electrónico, las respuestas se asociarán en consecuencia.</p><p>Cuando el replicador no tiene un perfil de agente asociado, las respuestas se harán con el perfil del bot.</p>",
|
"BODY": "<br/><p>Chatwoot ahora sincronizará todas las conversaciones entrantes en el canal <b><i>de conversaciones del cliente</i></b> dentro de tu lugar de trabajo slack.</p><p>Respondiendo a un tema de conversación en <b><i>conversaciones de clientes</i></b> canal de slack creará una respuesta al cliente a través de chatwoot.</p><p>Inicie las respuestas con <b><i>nota:</i></b> para crear notas privadas en lugar de respuestas.</p><p>Si el respondente de slack tiene un perfil de agente en el chatwoot bajo el mismo correo electrónico, las respuestas se asociarán en consecuencia.</p><p>Cuando el replicador no tiene un perfil de agente asociado, las respuestas se harán con el perfil del bot.</p>",
|
||||||
"SELECTED": "selected"
|
"SELECTED": "seleccionado"
|
||||||
},
|
},
|
||||||
"SELECT_CHANNEL": {
|
"SELECT_CHANNEL": {
|
||||||
"OPTION_LABEL": "Select a channel",
|
"OPTION_LABEL": "Seleccione un canal",
|
||||||
"UPDATE": "Actualizar",
|
"UPDATE": "Actualizar",
|
||||||
"BUTTON_TEXT": "Connect channel",
|
"BUTTON_TEXT": "Conectar canal",
|
||||||
"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.",
|
"DESCRIPTION": "Su espacio de trabajo de Slack ahora esta enlazado con Chatwoot. Sin embarbo, la integración esta actualmente inactiva. Para activar la integración y conectar un canal a Chatwoot, por favor haga clic en el siguiente boton.\n\n**Nota.** Si esta intentando conectar un canal privado, agregue la aplicación Chatwoot al canal de Slack antes de proceder con este paso.",
|
||||||
"ATTENTION_REQUIRED": "Attention required",
|
"ATTENTION_REQUIRED": "Atención requerida",
|
||||||
"EXPIRED": "Your Slack integration has expired. To continue receiving messages on Slack, please delete the integration and connect your workspace again."
|
"EXPIRED": "Su integración de Slack ha caducado. Para continuar recibiendo mensajes en Slack, por favor elimine la integración y vuelva a conectar su área de trabajo."
|
||||||
},
|
},
|
||||||
"UPDATE_ERROR": "There was an error updating the integration, please try again",
|
"UPDATE_ERROR": "Se presento un error actualizando la integración, por favor inténtelo nuevamente",
|
||||||
"UPDATE_SUCCESS": "The channel is connected successfully",
|
"UPDATE_SUCCESS": "El canal está conectado correctamente",
|
||||||
"FAILED_TO_FETCH_CHANNELS": "There was an error fetching the channels from Slack, please try again"
|
"FAILED_TO_FETCH_CHANNELS": "Hubo un error obteniendo los canales de Slack, por favor inténtalo de nuevo"
|
||||||
},
|
},
|
||||||
"DYTE": {
|
"DYTE": {
|
||||||
"CLICK_HERE_TO_JOIN": "Haga clic aquí para unirse",
|
"CLICK_HERE_TO_JOIN": "Haga clic aquí para unirse",
|
||||||
@@ -103,39 +103,39 @@
|
|||||||
"CREATE_ERROR": "Hubo un error al crear un enlace de reunión, por favor inténtelo de nuevo"
|
"CREATE_ERROR": "Hubo un error al crear un enlace de reunión, por favor inténtelo de nuevo"
|
||||||
},
|
},
|
||||||
"OPEN_AI": {
|
"OPEN_AI": {
|
||||||
"AI_ASSIST": "AI Assist",
|
"AI_ASSIST": "Asistencia AI",
|
||||||
"WITH_AI": " %{option} with AI ",
|
"WITH_AI": " %{option} con IA ",
|
||||||
"OPTIONS": {
|
"OPTIONS": {
|
||||||
"REPLY_SUGGESTION": "Reply Suggestion",
|
"REPLY_SUGGESTION": "Responder sugerencia",
|
||||||
"SUMMARIZE": "Summarize",
|
"SUMMARIZE": "Resumir",
|
||||||
"REPHRASE": "Improve Writing",
|
"REPHRASE": "Mejorar escritura",
|
||||||
"FIX_SPELLING_GRAMMAR": "Fix Spelling and Grammar",
|
"FIX_SPELLING_GRAMMAR": "Corregir ortografía y gramática",
|
||||||
"SHORTEN": "Shorten",
|
"SHORTEN": "Acortar",
|
||||||
"EXPAND": "Expand",
|
"EXPAND": "Expandir",
|
||||||
"MAKE_FRIENDLY": "Change message tone to friendly",
|
"MAKE_FRIENDLY": "Cambiar tono de mensaje a amigable",
|
||||||
"MAKE_FORMAL": "Use formal tone",
|
"MAKE_FORMAL": "Usar tono formal",
|
||||||
"SIMPLIFY": "Simplify"
|
"SIMPLIFY": "Simplificar"
|
||||||
},
|
},
|
||||||
"ASSISTANCE_MODAL": {
|
"ASSISTANCE_MODAL": {
|
||||||
"DRAFT_TITLE": "Draft content",
|
"DRAFT_TITLE": "Contenido de borrador",
|
||||||
"GENERATED_TITLE": "Generated content",
|
"GENERATED_TITLE": "Contenido generado",
|
||||||
"AI_WRITING": "AI is writing",
|
"AI_WRITING": "AI está escribiendo",
|
||||||
"BUTTONS": {
|
"BUTTONS": {
|
||||||
"APPLY": "Use this suggestion",
|
"APPLY": "Usar esta sugerencia",
|
||||||
"CANCEL": "Cancelar"
|
"CANCEL": "Cancelar"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"CTA_MODAL": {
|
"CTA_MODAL": {
|
||||||
"TITLE": "Integrate with OpenAI",
|
"TITLE": "Integrar con OpenAI",
|
||||||
"DESC": "Bring advanced AI features to your dashboard with OpenAI's GPT models. To begin, enter the API key from your OpenAI account.",
|
"DESC": "Trae las características avanzadas de IA a tu panel de control con los modelos GPT de OpenAI. Para empezar, introduce la clave API desde tu cuenta OpenAI.",
|
||||||
"KEY_PLACEHOLDER": "Enter your OpenAI API key",
|
"KEY_PLACEHOLDER": "Introduzca su clave API OpenAI",
|
||||||
"BUTTONS": {
|
"BUTTONS": {
|
||||||
"NEED_HELP": "¿Necesitas ayuda?",
|
"NEED_HELP": "¿Necesitas ayuda?",
|
||||||
"DISMISS": "Descartar",
|
"DISMISS": "Descartar",
|
||||||
"FINISH": "Finish Setup"
|
"FINISH": "Finalizar configuración"
|
||||||
},
|
},
|
||||||
"DISMISS_MESSAGE": "You can setup OpenAI integration later Whenever you want.",
|
"DISMISS_MESSAGE": "Puedes configurar la integración OpenAI más tarde cuando quieras.",
|
||||||
"SUCCESS_MESSAGE": "OpenAI integration setup successfully"
|
"SUCCESS_MESSAGE": "Configuración de integración OpenAI exitosa"
|
||||||
},
|
},
|
||||||
"TITLE": "Mejorar con IA",
|
"TITLE": "Mejorar con IA",
|
||||||
"SUMMARY_TITLE": "Resumen con IA",
|
"SUMMARY_TITLE": "Resumen con IA",
|
||||||
@@ -153,7 +153,7 @@
|
|||||||
"GENERATING": "Generando...",
|
"GENERATING": "Generando...",
|
||||||
"CANCEL": "Cancelar"
|
"CANCEL": "Cancelar"
|
||||||
},
|
},
|
||||||
"GENERATE_ERROR": "Hubo un error al procesar el contenido, por favor inténtelo de nuevo"
|
"GENERATE_ERROR": "Hubo un error al procesar el contenido, por favor verifique su clave API OpenAI e inténtelo de nuevo"
|
||||||
},
|
},
|
||||||
"DELETE": {
|
"DELETE": {
|
||||||
"BUTTON_TEXT": "Eliminar",
|
"BUTTON_TEXT": "Eliminar",
|
||||||
|
|||||||
@@ -40,16 +40,16 @@
|
|||||||
},
|
},
|
||||||
"SUGGESTIONS": {
|
"SUGGESTIONS": {
|
||||||
"TOOLTIP": {
|
"TOOLTIP": {
|
||||||
"SINGLE_SUGGESTION": "Add label to conversation",
|
"SINGLE_SUGGESTION": "Añadir etiqueta a la conversación",
|
||||||
"MULTIPLE_SUGGESTION": "Select this label",
|
"MULTIPLE_SUGGESTION": "Seleccionar esta etiqueta",
|
||||||
"DESELECT": "Deselect label",
|
"DESELECT": "Deseleccionar etiqueta",
|
||||||
"DISMISS": "Dismiss suggestion"
|
"DISMISS": "Descartar sugerencia"
|
||||||
},
|
},
|
||||||
"POWERED_BY": "Chatwoot AI",
|
"POWERED_BY": "Chatwoot AI",
|
||||||
"DISMISS": "Descartar",
|
"DISMISS": "Descartar",
|
||||||
"ADD_SELECTED_LABELS": "Add selected labels",
|
"ADD_SELECTED_LABELS": "Asignar etiquetas seleccionadas",
|
||||||
"ADD_SELECTED_LABEL": "Add selected label",
|
"ADD_SELECTED_LABEL": "Añadir etiqueta seleccionada",
|
||||||
"ADD_ALL_LABELS": "Add all labels"
|
"ADD_ALL_LABELS": "Añadir todas las etiquetas"
|
||||||
},
|
},
|
||||||
"ADD": {
|
"ADD": {
|
||||||
"TITLE": "Añadir etiqueta",
|
"TITLE": "Añadir etiqueta",
|
||||||
|
|||||||
@@ -12,11 +12,11 @@
|
|||||||
"DESC": "( Total )"
|
"DESC": "( Total )"
|
||||||
},
|
},
|
||||||
"INCOMING_MESSAGES": {
|
"INCOMING_MESSAGES": {
|
||||||
"NAME": "Mensajes entrantes",
|
"NAME": "Mensajes recibidos",
|
||||||
"DESC": "( Total )"
|
"DESC": "( Total )"
|
||||||
},
|
},
|
||||||
"OUTGOING_MESSAGES": {
|
"OUTGOING_MESSAGES": {
|
||||||
"NAME": "Mensajes salientes",
|
"NAME": "Mensajes enviados",
|
||||||
"DESC": "( Total )"
|
"DESC": "( Total )"
|
||||||
},
|
},
|
||||||
"FIRST_RESPONSE_TIME": {
|
"FIRST_RESPONSE_TIME": {
|
||||||
@@ -36,8 +36,8 @@
|
|||||||
"DESC": "( Total )"
|
"DESC": "( Total )"
|
||||||
},
|
},
|
||||||
"REPLY_TIME": {
|
"REPLY_TIME": {
|
||||||
"NAME": "Customer waiting time",
|
"NAME": "Tiempo de espera del cliente",
|
||||||
"TOOLTIP_TEXT": "Waiting time is %{metricValue} (based on %{conversationCount} conversations)"
|
"TOOLTIP_TEXT": "El tiempo de espera es %{metricValue} (basado en %{conversationCount} conversaciones)"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"DATE_RANGE_OPTIONS": {
|
"DATE_RANGE_OPTIONS": {
|
||||||
@@ -117,10 +117,6 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"GROUP_BY_YEAR_OPTIONS": [
|
"GROUP_BY_YEAR_OPTIONS": [
|
||||||
{
|
|
||||||
"id": 1,
|
|
||||||
"groupBy": "Día"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"id": 2,
|
"id": 2,
|
||||||
"groupBy": "Semana"
|
"groupBy": "Semana"
|
||||||
@@ -128,6 +124,10 @@
|
|||||||
{
|
{
|
||||||
"id": 3,
|
"id": 3,
|
||||||
"groupBy": "Mes"
|
"groupBy": "Mes"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 4,
|
||||||
|
"groupBy": "Mes"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"BUSINESS_HOURS": "Horarios"
|
"BUSINESS_HOURS": "Horarios"
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
{
|
{
|
||||||
"RESET_PASSWORD": {
|
"RESET_PASSWORD": {
|
||||||
"TITLE": "Restablecer contraseña",
|
"TITLE": "Restablecer contraseña",
|
||||||
"DESCRIPTION": "Enter the email address you use to log in to Chatwoot to get the password reset instructions.",
|
"DESCRIPTION": "Introduzca la dirección de correo electrónico que utiliza para iniciar sesión en Chatwoot para obtener las instrucciones de restablecimiento de contraseña.",
|
||||||
"GO_BACK_TO_LOGIN": "If you want to go back to the login page,",
|
"GO_BACK_TO_LOGIN": "Si desea volver a la página de inicio de sesión,",
|
||||||
"EMAIL": {
|
"EMAIL": {
|
||||||
"LABEL": "E-mail",
|
"LABEL": "E-mail",
|
||||||
"PLACEHOLDER": "Por favor ingrese su email.",
|
"PLACEHOLDER": "Por favor ingrese su email.",
|
||||||
|
|||||||
@@ -39,7 +39,10 @@
|
|||||||
"NOTE": "Cree una firma de mensaje personal que se añadirá a todos los mensajes que envíe desde su buzón de correo electrónico. Utilice el rico editor de contenidos para crear una firma altamente personalizada.",
|
"NOTE": "Cree una firma de mensaje personal que se añadirá a todos los mensajes que envíe desde su buzón de correo electrónico. Utilice el rico editor de contenidos para crear una firma altamente personalizada.",
|
||||||
"BTN_TEXT": "Guardar firma de mensaje",
|
"BTN_TEXT": "Guardar firma de mensaje",
|
||||||
"API_ERROR": "¡No se pudo guardar la firma! Inténtalo de nuevo",
|
"API_ERROR": "¡No se pudo guardar la firma! Inténtalo de nuevo",
|
||||||
"API_SUCCESS": "Firma guardada correctamente"
|
"API_SUCCESS": "Firma guardada correctamente",
|
||||||
|
"IMAGE_UPLOAD_ERROR": "¡No se pudo subir la imagen! Intente nuevamente",
|
||||||
|
"IMAGE_UPLOAD_SUCCESS": "Imagen agregada satisfactoriamente. Por favor haga clic en salvar para guardar la firma",
|
||||||
|
"IMAGE_UPLOAD_SIZE_ERROR": "El tamaño de la imagen debe ser menor que {size}MB"
|
||||||
},
|
},
|
||||||
"MESSAGE_SIGNATURE": {
|
"MESSAGE_SIGNATURE": {
|
||||||
"LABEL": "Firma del mensaje",
|
"LABEL": "Firma del mensaje",
|
||||||
@@ -205,7 +208,7 @@
|
|||||||
"AGENTS": "Agentes",
|
"AGENTS": "Agentes",
|
||||||
"AGENT_BOTS": "Bots",
|
"AGENT_BOTS": "Bots",
|
||||||
"AUDIT_LOGS": "Auditoría de registros",
|
"AUDIT_LOGS": "Auditoría de registros",
|
||||||
"INBOXES": "Bandejas de entrada",
|
"INBOXES": "Entradas",
|
||||||
"NOTIFICATIONS": "Notificaciones",
|
"NOTIFICATIONS": "Notificaciones",
|
||||||
"CANNED_RESPONSES": "Respuestas predefinidas",
|
"CANNED_RESPONSES": "Respuestas predefinidas",
|
||||||
"INTEGRATIONS": "Integraciones",
|
"INTEGRATIONS": "Integraciones",
|
||||||
|
|||||||
@@ -39,7 +39,10 @@
|
|||||||
"NOTE": "یک امضای پیام شخصی ایجاد کنید که به همه پیامهایی که از صندوق ورودی ایمیل ارسال میکنید اضافه شود. از ویرایشگر محتوای غنی برای ایجاد یک امضای بسیار شخصی استفاده کنید.",
|
"NOTE": "یک امضای پیام شخصی ایجاد کنید که به همه پیامهایی که از صندوق ورودی ایمیل ارسال میکنید اضافه شود. از ویرایشگر محتوای غنی برای ایجاد یک امضای بسیار شخصی استفاده کنید.",
|
||||||
"BTN_TEXT": "ذخیره امضای پیام",
|
"BTN_TEXT": "ذخیره امضای پیام",
|
||||||
"API_ERROR": "امضا ذخیره نشد! دوباره امتحان کنید",
|
"API_ERROR": "امضا ذخیره نشد! دوباره امتحان کنید",
|
||||||
"API_SUCCESS": "امضا با موفقیت ذخیره شد"
|
"API_SUCCESS": "امضا با موفقیت ذخیره شد",
|
||||||
|
"IMAGE_UPLOAD_ERROR": "Couldn't upload image! Try again",
|
||||||
|
"IMAGE_UPLOAD_SUCCESS": "Image added successfully. Please click on save to save the signature",
|
||||||
|
"IMAGE_UPLOAD_SIZE_ERROR": "اندازه تصویر باید کمتر از {size} مگابایت باشد"
|
||||||
},
|
},
|
||||||
"MESSAGE_SIGNATURE": {
|
"MESSAGE_SIGNATURE": {
|
||||||
"LABEL": "امضای پیام",
|
"LABEL": "امضای پیام",
|
||||||
|
|||||||
@@ -39,7 +39,10 @@
|
|||||||
"NOTE": "Create a personal message signature that would be added to all the messages you send from your email inbox. Use the rich content editor to create a highly personalised signature.",
|
"NOTE": "Create a personal message signature that would be added to all the messages you send from your email inbox. Use the rich content editor to create a highly personalised signature.",
|
||||||
"BTN_TEXT": "Save message signature",
|
"BTN_TEXT": "Save message signature",
|
||||||
"API_ERROR": "Couldn't save signature! Try again",
|
"API_ERROR": "Couldn't save signature! Try again",
|
||||||
"API_SUCCESS": "Signature saved successfully"
|
"API_SUCCESS": "Signature saved successfully",
|
||||||
|
"IMAGE_UPLOAD_ERROR": "Couldn't upload image! Try again",
|
||||||
|
"IMAGE_UPLOAD_SUCCESS": "Image added successfully. Please click on save to save the signature",
|
||||||
|
"IMAGE_UPLOAD_SIZE_ERROR": "Image size should be less than {size}MB"
|
||||||
},
|
},
|
||||||
"MESSAGE_SIGNATURE": {
|
"MESSAGE_SIGNATURE": {
|
||||||
"LABEL": "Message Signature",
|
"LABEL": "Message Signature",
|
||||||
|
|||||||
@@ -39,7 +39,10 @@
|
|||||||
"NOTE": "Créez une signature de message personnelle qui sera ajoutée à tous les messages que vous envoyez depuis votre boîte aux lettres électronique. Utilisez l'éditeur de contenu riche pour créer une signature personnalisée.",
|
"NOTE": "Créez une signature de message personnelle qui sera ajoutée à tous les messages que vous envoyez depuis votre boîte aux lettres électronique. Utilisez l'éditeur de contenu riche pour créer une signature personnalisée.",
|
||||||
"BTN_TEXT": "Enregistrer la signature du message",
|
"BTN_TEXT": "Enregistrer la signature du message",
|
||||||
"API_ERROR": "Impossible d'enregistrer la signature ! Réessayez",
|
"API_ERROR": "Impossible d'enregistrer la signature ! Réessayez",
|
||||||
"API_SUCCESS": "Signature enregistrée avec succès"
|
"API_SUCCESS": "Signature enregistrée avec succès",
|
||||||
|
"IMAGE_UPLOAD_ERROR": "Couldn't upload image! Try again",
|
||||||
|
"IMAGE_UPLOAD_SUCCESS": "Image added successfully. Please click on save to save the signature",
|
||||||
|
"IMAGE_UPLOAD_SIZE_ERROR": "La taille de l'image doit être inférieure à {size}Mo"
|
||||||
},
|
},
|
||||||
"MESSAGE_SIGNATURE": {
|
"MESSAGE_SIGNATURE": {
|
||||||
"LABEL": "Signature du message",
|
"LABEL": "Signature du message",
|
||||||
|
|||||||
@@ -39,7 +39,10 @@
|
|||||||
"NOTE": "ניתן לרשום חתימה לכל ההודעות שתרשום ללקוחות שלך.",
|
"NOTE": "ניתן לרשום חתימה לכל ההודעות שתרשום ללקוחות שלך.",
|
||||||
"BTN_TEXT": "שמירה",
|
"BTN_TEXT": "שמירה",
|
||||||
"API_ERROR": "לא ניתן לשמור את החתימה! אנא נסה שנית",
|
"API_ERROR": "לא ניתן לשמור את החתימה! אנא נסה שנית",
|
||||||
"API_SUCCESS": "החתימה נשמרה בהצלחה"
|
"API_SUCCESS": "החתימה נשמרה בהצלחה",
|
||||||
|
"IMAGE_UPLOAD_ERROR": "Couldn't upload image! Try again",
|
||||||
|
"IMAGE_UPLOAD_SUCCESS": "Image added successfully. Please click on save to save the signature",
|
||||||
|
"IMAGE_UPLOAD_SIZE_ERROR": "גודל התמונה צריך להיות פחות מ-{size}MB"
|
||||||
},
|
},
|
||||||
"MESSAGE_SIGNATURE": {
|
"MESSAGE_SIGNATURE": {
|
||||||
"LABEL": "חתימת הודעה",
|
"LABEL": "חתימת הודעה",
|
||||||
|
|||||||
@@ -39,7 +39,10 @@
|
|||||||
"NOTE": "Create a personal message signature that would be added to all the messages you send from your email inbox. Use the rich content editor to create a highly personalised signature.",
|
"NOTE": "Create a personal message signature that would be added to all the messages you send from your email inbox. Use the rich content editor to create a highly personalised signature.",
|
||||||
"BTN_TEXT": "Save message signature",
|
"BTN_TEXT": "Save message signature",
|
||||||
"API_ERROR": "Couldn't save signature! Try again",
|
"API_ERROR": "Couldn't save signature! Try again",
|
||||||
"API_SUCCESS": "Signature saved successfully"
|
"API_SUCCESS": "Signature saved successfully",
|
||||||
|
"IMAGE_UPLOAD_ERROR": "Couldn't upload image! Try again",
|
||||||
|
"IMAGE_UPLOAD_SUCCESS": "Image added successfully. Please click on save to save the signature",
|
||||||
|
"IMAGE_UPLOAD_SIZE_ERROR": "Image size should be less than {size}MB"
|
||||||
},
|
},
|
||||||
"MESSAGE_SIGNATURE": {
|
"MESSAGE_SIGNATURE": {
|
||||||
"LABEL": "Message Signature",
|
"LABEL": "Message Signature",
|
||||||
|
|||||||
@@ -39,7 +39,10 @@
|
|||||||
"NOTE": "Create a personal message signature that would be added to all the messages you send from your email inbox. Use the rich content editor to create a highly personalised signature.",
|
"NOTE": "Create a personal message signature that would be added to all the messages you send from your email inbox. Use the rich content editor to create a highly personalised signature.",
|
||||||
"BTN_TEXT": "Save message signature",
|
"BTN_TEXT": "Save message signature",
|
||||||
"API_ERROR": "Couldn't save signature! Try again",
|
"API_ERROR": "Couldn't save signature! Try again",
|
||||||
"API_SUCCESS": "Signature saved successfully"
|
"API_SUCCESS": "Signature saved successfully",
|
||||||
|
"IMAGE_UPLOAD_ERROR": "Couldn't upload image! Try again",
|
||||||
|
"IMAGE_UPLOAD_SUCCESS": "Image added successfully. Please click on save to save the signature",
|
||||||
|
"IMAGE_UPLOAD_SIZE_ERROR": "Image size should be less than {size}MB"
|
||||||
},
|
},
|
||||||
"MESSAGE_SIGNATURE": {
|
"MESSAGE_SIGNATURE": {
|
||||||
"LABEL": "Message Signature",
|
"LABEL": "Message Signature",
|
||||||
|
|||||||
@@ -39,7 +39,10 @@
|
|||||||
"NOTE": "Hozz létre egy személyes üzenetaláírást, amelyet az e-mail postafiókodból küldött összes üzenethez hozzáadhatsz. A sokszínű tartalomszerkesztő segítségével személyre szabott aláírást hozhatsz létre.",
|
"NOTE": "Hozz létre egy személyes üzenetaláírást, amelyet az e-mail postafiókodból küldött összes üzenethez hozzáadhatsz. A sokszínű tartalomszerkesztő segítségével személyre szabott aláírást hozhatsz létre.",
|
||||||
"BTN_TEXT": "Üzenet aláírás mentése",
|
"BTN_TEXT": "Üzenet aláírás mentése",
|
||||||
"API_ERROR": "Nem sikerült menteni az aláírást! Próbáld újra",
|
"API_ERROR": "Nem sikerült menteni az aláírást! Próbáld újra",
|
||||||
"API_SUCCESS": "Aláírás sikeresen mentve"
|
"API_SUCCESS": "Aláírás sikeresen mentve",
|
||||||
|
"IMAGE_UPLOAD_ERROR": "Couldn't upload image! Try again",
|
||||||
|
"IMAGE_UPLOAD_SUCCESS": "Image added successfully. Please click on save to save the signature",
|
||||||
|
"IMAGE_UPLOAD_SIZE_ERROR": "A kép mérete kevesebb, mint {size} MB"
|
||||||
},
|
},
|
||||||
"MESSAGE_SIGNATURE": {
|
"MESSAGE_SIGNATURE": {
|
||||||
"LABEL": "Üzenet aláírás",
|
"LABEL": "Üzenet aláírás",
|
||||||
|
|||||||
@@ -39,7 +39,10 @@
|
|||||||
"NOTE": "Create a personal message signature that would be added to all the messages you send from your email inbox. Use the rich content editor to create a highly personalised signature.",
|
"NOTE": "Create a personal message signature that would be added to all the messages you send from your email inbox. Use the rich content editor to create a highly personalised signature.",
|
||||||
"BTN_TEXT": "Save message signature",
|
"BTN_TEXT": "Save message signature",
|
||||||
"API_ERROR": "Couldn't save signature! Try again",
|
"API_ERROR": "Couldn't save signature! Try again",
|
||||||
"API_SUCCESS": "Signature saved successfully"
|
"API_SUCCESS": "Signature saved successfully",
|
||||||
|
"IMAGE_UPLOAD_ERROR": "Couldn't upload image! Try again",
|
||||||
|
"IMAGE_UPLOAD_SUCCESS": "Image added successfully. Please click on save to save the signature",
|
||||||
|
"IMAGE_UPLOAD_SIZE_ERROR": "Image size should be less than {size}MB"
|
||||||
},
|
},
|
||||||
"MESSAGE_SIGNATURE": {
|
"MESSAGE_SIGNATURE": {
|
||||||
"LABEL": "Message Signature",
|
"LABEL": "Message Signature",
|
||||||
|
|||||||
@@ -39,7 +39,10 @@
|
|||||||
"NOTE": "Buat tanda tangan pesan pribadi yang akan ditambahkan ke semua pesan yang Anda kirim dari kotak masuk email Anda. Gunakan editor konten kaya untuk membuat tanda tangan yang sangat personal.",
|
"NOTE": "Buat tanda tangan pesan pribadi yang akan ditambahkan ke semua pesan yang Anda kirim dari kotak masuk email Anda. Gunakan editor konten kaya untuk membuat tanda tangan yang sangat personal.",
|
||||||
"BTN_TEXT": "Simpan tanda tangan pesan",
|
"BTN_TEXT": "Simpan tanda tangan pesan",
|
||||||
"API_ERROR": "Tidak dapat menyimpan tanda tangan! Coba lagi",
|
"API_ERROR": "Tidak dapat menyimpan tanda tangan! Coba lagi",
|
||||||
"API_SUCCESS": "Tanda tangan berhasil disimpan"
|
"API_SUCCESS": "Tanda tangan berhasil disimpan",
|
||||||
|
"IMAGE_UPLOAD_ERROR": "Couldn't upload image! Try again",
|
||||||
|
"IMAGE_UPLOAD_SUCCESS": "Image added successfully. Please click on save to save the signature",
|
||||||
|
"IMAGE_UPLOAD_SIZE_ERROR": "Ukuran gambar harus kurang dari {size}MB"
|
||||||
},
|
},
|
||||||
"MESSAGE_SIGNATURE": {
|
"MESSAGE_SIGNATURE": {
|
||||||
"LABEL": "Tanda Tangan Pesan",
|
"LABEL": "Tanda Tangan Pesan",
|
||||||
|
|||||||
@@ -39,7 +39,10 @@
|
|||||||
"NOTE": "Búðu til persónulega skilaboðaundirskrift sem verður bætt við öll skilaboðin sem þú sendir úr pósthólfinu þínu. Notaðu innihaldsríka ritilinn til að búa til mjög persónulega undirskrift.",
|
"NOTE": "Búðu til persónulega skilaboðaundirskrift sem verður bætt við öll skilaboðin sem þú sendir úr pósthólfinu þínu. Notaðu innihaldsríka ritilinn til að búa til mjög persónulega undirskrift.",
|
||||||
"BTN_TEXT": "Vista undirskrift á skilaboðum",
|
"BTN_TEXT": "Vista undirskrift á skilaboðum",
|
||||||
"API_ERROR": "Gat ekki vistað undirskrift! Reyndu aftur",
|
"API_ERROR": "Gat ekki vistað undirskrift! Reyndu aftur",
|
||||||
"API_SUCCESS": "Undirskrift var vistuð"
|
"API_SUCCESS": "Undirskrift var vistuð",
|
||||||
|
"IMAGE_UPLOAD_ERROR": "Couldn't upload image! Try again",
|
||||||
|
"IMAGE_UPLOAD_SUCCESS": "Image added successfully. Please click on save to save the signature",
|
||||||
|
"IMAGE_UPLOAD_SIZE_ERROR": "Image size should be less than {size}MB"
|
||||||
},
|
},
|
||||||
"MESSAGE_SIGNATURE": {
|
"MESSAGE_SIGNATURE": {
|
||||||
"LABEL": "Undirskrift skilaboða",
|
"LABEL": "Undirskrift skilaboða",
|
||||||
|
|||||||
@@ -39,7 +39,10 @@
|
|||||||
"NOTE": "Crea una firma personale del messaggio che sarà aggiunta a tutti i messaggi inviati dalla tua casella di posta elettronica. Usa l'editor di contenuti per creare una firma altamente personalizzata.",
|
"NOTE": "Crea una firma personale del messaggio che sarà aggiunta a tutti i messaggi inviati dalla tua casella di posta elettronica. Usa l'editor di contenuti per creare una firma altamente personalizzata.",
|
||||||
"BTN_TEXT": "Salva firma del messaggio",
|
"BTN_TEXT": "Salva firma del messaggio",
|
||||||
"API_ERROR": "Impossibile salvare la firma! Riprova",
|
"API_ERROR": "Impossibile salvare la firma! Riprova",
|
||||||
"API_SUCCESS": "Firma salvata con successo"
|
"API_SUCCESS": "Firma salvata con successo",
|
||||||
|
"IMAGE_UPLOAD_ERROR": "Couldn't upload image! Try again",
|
||||||
|
"IMAGE_UPLOAD_SUCCESS": "Image added successfully. Please click on save to save the signature",
|
||||||
|
"IMAGE_UPLOAD_SIZE_ERROR": "Image size should be less than {size}MB"
|
||||||
},
|
},
|
||||||
"MESSAGE_SIGNATURE": {
|
"MESSAGE_SIGNATURE": {
|
||||||
"LABEL": "Firma del messaggio",
|
"LABEL": "Firma del messaggio",
|
||||||
|
|||||||
@@ -39,7 +39,10 @@
|
|||||||
"NOTE": "Create a personal message signature that would be added to all the messages you send from your email inbox. Use the rich content editor to create a highly personalised signature.",
|
"NOTE": "Create a personal message signature that would be added to all the messages you send from your email inbox. Use the rich content editor to create a highly personalised signature.",
|
||||||
"BTN_TEXT": "Save message signature",
|
"BTN_TEXT": "Save message signature",
|
||||||
"API_ERROR": "Couldn't save signature! Try again",
|
"API_ERROR": "Couldn't save signature! Try again",
|
||||||
"API_SUCCESS": "Signature saved successfully"
|
"API_SUCCESS": "Signature saved successfully",
|
||||||
|
"IMAGE_UPLOAD_ERROR": "Couldn't upload image! Try again",
|
||||||
|
"IMAGE_UPLOAD_SUCCESS": "Image added successfully. Please click on save to save the signature",
|
||||||
|
"IMAGE_UPLOAD_SIZE_ERROR": "Image size should be less than {size}MB"
|
||||||
},
|
},
|
||||||
"MESSAGE_SIGNATURE": {
|
"MESSAGE_SIGNATURE": {
|
||||||
"LABEL": "Message Signature",
|
"LABEL": "Message Signature",
|
||||||
|
|||||||
@@ -39,7 +39,10 @@
|
|||||||
"NOTE": "Create a personal message signature that would be added to all the messages you send from your email inbox. Use the rich content editor to create a highly personalised signature.",
|
"NOTE": "Create a personal message signature that would be added to all the messages you send from your email inbox. Use the rich content editor to create a highly personalised signature.",
|
||||||
"BTN_TEXT": "Save message signature",
|
"BTN_TEXT": "Save message signature",
|
||||||
"API_ERROR": "Couldn't save signature! Try again",
|
"API_ERROR": "Couldn't save signature! Try again",
|
||||||
"API_SUCCESS": "Signature saved successfully"
|
"API_SUCCESS": "Signature saved successfully",
|
||||||
|
"IMAGE_UPLOAD_ERROR": "Couldn't upload image! Try again",
|
||||||
|
"IMAGE_UPLOAD_SUCCESS": "Image added successfully. Please click on save to save the signature",
|
||||||
|
"IMAGE_UPLOAD_SIZE_ERROR": "Image size should be less than {size}MB"
|
||||||
},
|
},
|
||||||
"MESSAGE_SIGNATURE": {
|
"MESSAGE_SIGNATURE": {
|
||||||
"LABEL": "Message Signature",
|
"LABEL": "Message Signature",
|
||||||
|
|||||||
@@ -39,7 +39,10 @@
|
|||||||
"NOTE": "Create a personal message signature that would be added to all the messages you send from your email inbox. Use the rich content editor to create a highly personalised signature.",
|
"NOTE": "Create a personal message signature that would be added to all the messages you send from your email inbox. Use the rich content editor to create a highly personalised signature.",
|
||||||
"BTN_TEXT": "Save message signature",
|
"BTN_TEXT": "Save message signature",
|
||||||
"API_ERROR": "Couldn't save signature! Try again",
|
"API_ERROR": "Couldn't save signature! Try again",
|
||||||
"API_SUCCESS": "Signature saved successfully"
|
"API_SUCCESS": "Signature saved successfully",
|
||||||
|
"IMAGE_UPLOAD_ERROR": "Couldn't upload image! Try again",
|
||||||
|
"IMAGE_UPLOAD_SUCCESS": "Image added successfully. Please click on save to save the signature",
|
||||||
|
"IMAGE_UPLOAD_SIZE_ERROR": "Image size should be less than {size}MB"
|
||||||
},
|
},
|
||||||
"MESSAGE_SIGNATURE": {
|
"MESSAGE_SIGNATURE": {
|
||||||
"LABEL": "Message Signature",
|
"LABEL": "Message Signature",
|
||||||
|
|||||||
@@ -39,7 +39,10 @@
|
|||||||
"NOTE": "Sukurkite asmeninį pranešimo parašą, kuris būtų pridėtas prie visų pranešimų, kuriuos siunčiate iš el. pašto dėžutės. Naudokite turtingo turinio redagavimo priemonę, kad sukurtumėte labai suasmenintą parašą.",
|
"NOTE": "Sukurkite asmeninį pranešimo parašą, kuris būtų pridėtas prie visų pranešimų, kuriuos siunčiate iš el. pašto dėžutės. Naudokite turtingo turinio redagavimo priemonę, kad sukurtumėte labai suasmenintą parašą.",
|
||||||
"BTN_TEXT": "Išsaugoti pranešimo parašą",
|
"BTN_TEXT": "Išsaugoti pranešimo parašą",
|
||||||
"API_ERROR": "Nepavyko išsaugoti parašo! Bandykite dar kartą",
|
"API_ERROR": "Nepavyko išsaugoti parašo! Bandykite dar kartą",
|
||||||
"API_SUCCESS": "Parašas išsaugotas sėkmingai"
|
"API_SUCCESS": "Parašas išsaugotas sėkmingai",
|
||||||
|
"IMAGE_UPLOAD_ERROR": "Nepavyko įkelti vaizdo! Prašau, pabandykite dar kartą",
|
||||||
|
"IMAGE_UPLOAD_SUCCESS": "Vaizdas sėkmingai pridėtas. Spustelėkite \"Išsaugoti\", kad išsaugotumėte parašą",
|
||||||
|
"IMAGE_UPLOAD_SIZE_ERROR": "Paveiksliuko dydis turi būti mažesnis nei {size} MB"
|
||||||
},
|
},
|
||||||
"MESSAGE_SIGNATURE": {
|
"MESSAGE_SIGNATURE": {
|
||||||
"LABEL": "Pranešimo parašas",
|
"LABEL": "Pranešimo parašas",
|
||||||
|
|||||||
@@ -39,7 +39,10 @@
|
|||||||
"NOTE": "Izveidojiet personīgu ziņojumu parakstu, kas tiks pievienots visiem ziņojumiem, kurus nosūtat no jūsu e -pasta iesūtnes. Izmantojiet bagātīgā satura redaktoru, lai izveidotu īpaši personalizētu parakstu.",
|
"NOTE": "Izveidojiet personīgu ziņojumu parakstu, kas tiks pievienots visiem ziņojumiem, kurus nosūtat no jūsu e -pasta iesūtnes. Izmantojiet bagātīgā satura redaktoru, lai izveidotu īpaši personalizētu parakstu.",
|
||||||
"BTN_TEXT": "Saglabāt ziņojuma parakstu",
|
"BTN_TEXT": "Saglabāt ziņojuma parakstu",
|
||||||
"API_ERROR": "Nevarēja saglabāt parakstu! Lūdzu, mēģiniet vēlreiz",
|
"API_ERROR": "Nevarēja saglabāt parakstu! Lūdzu, mēģiniet vēlreiz",
|
||||||
"API_SUCCESS": "Paraksts ir veiksmīgi saglabāts"
|
"API_SUCCESS": "Paraksts ir veiksmīgi saglabāts",
|
||||||
|
"IMAGE_UPLOAD_ERROR": "Nevarēja augšupielādēt attēlu! Lūdzu, mēģiniet vēlreiz",
|
||||||
|
"IMAGE_UPLOAD_SUCCESS": "Attēls ir veiksmīgi pievienots. Lūdzu, noklikšķiniet uz saglabāt, lai saglabātu parakstu",
|
||||||
|
"IMAGE_UPLOAD_SIZE_ERROR": "Attēla izmēram ir jābūt mazākam par {size}MB"
|
||||||
},
|
},
|
||||||
"MESSAGE_SIGNATURE": {
|
"MESSAGE_SIGNATURE": {
|
||||||
"LABEL": "Ziņojuma Paraksts",
|
"LABEL": "Ziņojuma Paraksts",
|
||||||
|
|||||||
@@ -39,7 +39,10 @@
|
|||||||
"NOTE": "Create a personal message signature that would be added to all the messages you send from your email inbox. Use the rich content editor to create a highly personalised signature.",
|
"NOTE": "Create a personal message signature that would be added to all the messages you send from your email inbox. Use the rich content editor to create a highly personalised signature.",
|
||||||
"BTN_TEXT": "Save message signature",
|
"BTN_TEXT": "Save message signature",
|
||||||
"API_ERROR": "Couldn't save signature! Try again",
|
"API_ERROR": "Couldn't save signature! Try again",
|
||||||
"API_SUCCESS": "Signature saved successfully"
|
"API_SUCCESS": "Signature saved successfully",
|
||||||
|
"IMAGE_UPLOAD_ERROR": "Couldn't upload image! Try again",
|
||||||
|
"IMAGE_UPLOAD_SUCCESS": "Image added successfully. Please click on save to save the signature",
|
||||||
|
"IMAGE_UPLOAD_SIZE_ERROR": "Image size should be less than {size}MB"
|
||||||
},
|
},
|
||||||
"MESSAGE_SIGNATURE": {
|
"MESSAGE_SIGNATURE": {
|
||||||
"LABEL": "Message Signature",
|
"LABEL": "Message Signature",
|
||||||
|
|||||||
@@ -39,7 +39,10 @@
|
|||||||
"NOTE": "Create a personal message signature that would be added to all the messages you send from your email inbox. Use the rich content editor to create a highly personalised signature.",
|
"NOTE": "Create a personal message signature that would be added to all the messages you send from your email inbox. Use the rich content editor to create a highly personalised signature.",
|
||||||
"BTN_TEXT": "Save message signature",
|
"BTN_TEXT": "Save message signature",
|
||||||
"API_ERROR": "Couldn't save signature! Try again",
|
"API_ERROR": "Couldn't save signature! Try again",
|
||||||
"API_SUCCESS": "Signature saved successfully"
|
"API_SUCCESS": "Signature saved successfully",
|
||||||
|
"IMAGE_UPLOAD_ERROR": "Couldn't upload image! Try again",
|
||||||
|
"IMAGE_UPLOAD_SUCCESS": "Image added successfully. Please click on save to save the signature",
|
||||||
|
"IMAGE_UPLOAD_SIZE_ERROR": "Image size should be less than {size}MB"
|
||||||
},
|
},
|
||||||
"MESSAGE_SIGNATURE": {
|
"MESSAGE_SIGNATURE": {
|
||||||
"LABEL": "Message Signature",
|
"LABEL": "Message Signature",
|
||||||
|
|||||||
@@ -39,7 +39,10 @@
|
|||||||
"NOTE": "Create a personal message signature that would be added to all the messages you send from your email inbox. Use the rich content editor to create a highly personalised signature.",
|
"NOTE": "Create a personal message signature that would be added to all the messages you send from your email inbox. Use the rich content editor to create a highly personalised signature.",
|
||||||
"BTN_TEXT": "Save message signature",
|
"BTN_TEXT": "Save message signature",
|
||||||
"API_ERROR": "Couldn't save signature! Try again",
|
"API_ERROR": "Couldn't save signature! Try again",
|
||||||
"API_SUCCESS": "Signature saved successfully"
|
"API_SUCCESS": "Signature saved successfully",
|
||||||
|
"IMAGE_UPLOAD_ERROR": "Couldn't upload image! Try again",
|
||||||
|
"IMAGE_UPLOAD_SUCCESS": "Image added successfully. Please click on save to save the signature",
|
||||||
|
"IMAGE_UPLOAD_SIZE_ERROR": "Image size should be less than {size}MB"
|
||||||
},
|
},
|
||||||
"MESSAGE_SIGNATURE": {
|
"MESSAGE_SIGNATURE": {
|
||||||
"LABEL": "Message Signature",
|
"LABEL": "Message Signature",
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
"TITLE": "Conversaties filteren",
|
"TITLE": "Conversaties filteren",
|
||||||
"SUBTITLE": "Voeg hieronder filters toe en druk op 'Filters toepassen' om te filteren.",
|
"SUBTITLE": "Voeg hieronder filters toe en druk op 'Filters toepassen' om te filteren.",
|
||||||
"EDIT_CUSTOM_FILTER": "Map bewerken",
|
"EDIT_CUSTOM_FILTER": "Map bewerken",
|
||||||
"CUSTOM_VIEWS_SUBTITLE": "Add or remove filters and update your folder.",
|
"CUSTOM_VIEWS_SUBTITLE": "Filters toevoegen of verwijderen en bijwerken van uw folder.",
|
||||||
"ADD_NEW_FILTER": "Filter toevoegen",
|
"ADD_NEW_FILTER": "Filter toevoegen",
|
||||||
"FILTER_DELETE_ERROR": "U moet minstens één filter hebben om op te slaan",
|
"FILTER_DELETE_ERROR": "U moet minstens één filter hebben om op te slaan",
|
||||||
"SUBMIT_BUTTON_LABEL": "Filters toepassen",
|
"SUBMIT_BUTTON_LABEL": "Filters toepassen",
|
||||||
@@ -11,7 +11,7 @@
|
|||||||
"CANCEL_BUTTON_LABEL": "Annuleren",
|
"CANCEL_BUTTON_LABEL": "Annuleren",
|
||||||
"CLEAR_BUTTON_LABEL": "Filters wissen",
|
"CLEAR_BUTTON_LABEL": "Filters wissen",
|
||||||
"EMPTY_VALUE_ERROR": "Waarde is vereist",
|
"EMPTY_VALUE_ERROR": "Waarde is vereist",
|
||||||
"FOLDER_LABEL": "Folder Name",
|
"FOLDER_LABEL": "Folder naam",
|
||||||
"FOLDER_QUERY_LABEL": "Folder Query",
|
"FOLDER_QUERY_LABEL": "Folder Query",
|
||||||
"TOOLTIP_LABEL": "Gesprekken filteren",
|
"TOOLTIP_LABEL": "Gesprekken filteren",
|
||||||
"QUERY_DROPDOWN_LABELS": {
|
"QUERY_DROPDOWN_LABELS": {
|
||||||
@@ -28,7 +28,7 @@
|
|||||||
"is_greater_than": "Is groter dan",
|
"is_greater_than": "Is groter dan",
|
||||||
"is_less_than": "Is lager dan",
|
"is_less_than": "Is lager dan",
|
||||||
"days_before": "Is x dagen vóór",
|
"days_before": "Is x dagen vóór",
|
||||||
"starts_with": "Starts with"
|
"starts_with": "Begint met"
|
||||||
},
|
},
|
||||||
"ATTRIBUTE_LABELS": {
|
"ATTRIBUTE_LABELS": {
|
||||||
"TRUE": "Waar",
|
"TRUE": "Waar",
|
||||||
@@ -43,7 +43,7 @@
|
|||||||
"CAMPAIGN_NAME": "Campagne Naam",
|
"CAMPAIGN_NAME": "Campagne Naam",
|
||||||
"LABELS": "Labelen",
|
"LABELS": "Labelen",
|
||||||
"BROWSER_LANGUAGE": "Browser Taal",
|
"BROWSER_LANGUAGE": "Browser Taal",
|
||||||
"PRIORITY": "Priority",
|
"PRIORITY": "Prioriteit",
|
||||||
"COUNTRY_NAME": "Land Naam",
|
"COUNTRY_NAME": "Land Naam",
|
||||||
"REFERER_LINK": "Verwijzende link",
|
"REFERER_LINK": "Verwijzende link",
|
||||||
"CUSTOM_ATTRIBUTE_LIST": "Lijst",
|
"CUSTOM_ATTRIBUTE_LIST": "Lijst",
|
||||||
@@ -77,7 +77,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"EDIT": {
|
"EDIT": {
|
||||||
"EDIT_BUTTON": "Edit folder"
|
"EDIT_BUTTON": "Map bewerken"
|
||||||
},
|
},
|
||||||
"DELETE": {
|
"DELETE": {
|
||||||
"DELETE_BUTTON": "Filter verwijderen",
|
"DELETE_BUTTON": "Filter verwijderen",
|
||||||
|
|||||||
@@ -1,68 +1,68 @@
|
|||||||
{
|
{
|
||||||
"AGENT_BOTS": {
|
"AGENT_BOTS": {
|
||||||
"HEADER": "Bots",
|
"HEADER": "Bots",
|
||||||
"LOADING_EDITOR": "Loading Editor...",
|
"LOADING_EDITOR": "Editor laden...",
|
||||||
"HEADER_BTN_TXT": "Add Bot Configuration",
|
"HEADER_BTN_TXT": "Botconfiguratie toevoegen",
|
||||||
"SIDEBAR_TXT": "<p><b>Agent Bots</b> <p>Agent bots allows you to automate the conversations</p>",
|
"SIDEBAR_TXT": "<p><b>Agent Bots</b> <p>Agent bots stelt je in staat de gesprekken te automatiseren</p>",
|
||||||
"CSML_BOT_EDITOR": {
|
"CSML_BOT_EDITOR": {
|
||||||
"NAME": {
|
"NAME": {
|
||||||
"LABEL": "Bot Naam",
|
"LABEL": "Bot Naam",
|
||||||
"PLACEHOLDER": "Give your bot a name",
|
"PLACEHOLDER": "Geef uw bot een naam",
|
||||||
"ERROR": "Bot name is required"
|
"ERROR": "Bot naam is vereist"
|
||||||
},
|
},
|
||||||
"DESCRIPTION": {
|
"DESCRIPTION": {
|
||||||
"LABEL": "Bot Description",
|
"LABEL": "Bot Beschrijving",
|
||||||
"PLACEHOLDER": "What does this bot do?"
|
"PLACEHOLDER": "Wat doet deze bot?"
|
||||||
},
|
},
|
||||||
"BOT_CONFIG": {
|
"BOT_CONFIG": {
|
||||||
"ERROR": "Please enter your CSML bot configuration above",
|
"ERROR": "Vul uw CSML bot configuratie hierboven in",
|
||||||
"API_ERROR": "Your CSML configuration is invalid, please fix it and try again."
|
"API_ERROR": "Uw CSML-configuratie is ongeldig, los het op en probeer het opnieuw."
|
||||||
},
|
},
|
||||||
"SUBMIT": "Validate and save"
|
"SUBMIT": "Valideren en opslaan"
|
||||||
},
|
},
|
||||||
"BOT_CONFIGURATION": {
|
"BOT_CONFIGURATION": {
|
||||||
"TITLE": "Select an agent bot",
|
"TITLE": "Selecteer een agent bot",
|
||||||
"DESC": "You can set an agent bot from the list to this inbox. The bot can initially handle the conversation and transfer it to an agent when needed.",
|
"DESC": "U kunt een agent bot instellen vanuit de lijst naar deze inbox. De bot kan het gesprek in eerste instantie afhandelen en indien nodig naar een agent overbrengen.",
|
||||||
"SUBMIT": "Vernieuwen",
|
"SUBMIT": "Vernieuwen",
|
||||||
"DISCONNECT": "Disconnect Bot",
|
"DISCONNECT": "Bot verbinding verbreken",
|
||||||
"SUCCESS_MESSAGE": "Successfully updated the agent bot",
|
"SUCCESS_MESSAGE": "De agent bot is succesvol bijgewerkt",
|
||||||
"DISCONNECTED_SUCCESS_MESSAGE": "Successfully disconnected the agent bot",
|
"DISCONNECTED_SUCCESS_MESSAGE": "Succesvol de agent bot verbinding verbroken",
|
||||||
"ERROR_MESSAGE": "Could not update the agent bot, please try again later",
|
"ERROR_MESSAGE": "Kan de agent bot niet bijwerken, probeer het later opnieuw",
|
||||||
"DISCONNECTED_ERROR_MESSAGE": "Could not disconnect the agent bot, please try again later",
|
"DISCONNECTED_ERROR_MESSAGE": "Kan de agent bot niet ontkoppelen, probeer het later opnieuw",
|
||||||
"SELECT_PLACEHOLDER": "Select Bot"
|
"SELECT_PLACEHOLDER": "Selecteer Bot"
|
||||||
},
|
},
|
||||||
"ADD": {
|
"ADD": {
|
||||||
"TITLE": "Configure new bot",
|
"TITLE": "Configureer nieuwe bot",
|
||||||
"CANCEL_BUTTON_TEXT": "Annuleren",
|
"CANCEL_BUTTON_TEXT": "Annuleren",
|
||||||
"API": {
|
"API": {
|
||||||
"SUCCESS_MESSAGE": "Bot added successfully",
|
"SUCCESS_MESSAGE": "Bot succesvol toegevoegd",
|
||||||
"ERROR_MESSAGE": "Could not add bot, Please try again later"
|
"ERROR_MESSAGE": "Kan bot niet toevoegen, probeer het later opnieuw"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"LIST": {
|
"LIST": {
|
||||||
"404": "No Bots found, you can create a bot by clicking the 'Configure new bot' Button ↗",
|
"404": "Geen bots gevonden, u kunt een bot maken door op de 'Configureer nieuwe bot' knop te klikken ↗",
|
||||||
"LOADING": "Fetching Bots...",
|
"LOADING": "Bots Ophalen...",
|
||||||
"TYPE": "Bot Type"
|
"TYPE": "Bot Type"
|
||||||
},
|
},
|
||||||
"DELETE": {
|
"DELETE": {
|
||||||
"BUTTON_TEXT": "Verwijderen",
|
"BUTTON_TEXT": "Verwijderen",
|
||||||
"TITLE": "Delete Bot",
|
"TITLE": "Bot Verwijderen",
|
||||||
"SUBMIT": "Verwijderen",
|
"SUBMIT": "Verwijderen",
|
||||||
"CANCEL_BUTTON_TEXT": "Annuleren",
|
"CANCEL_BUTTON_TEXT": "Annuleren",
|
||||||
"DESCRIPTION": "Are you sure you want to delete this bot? This action is irreversible",
|
"DESCRIPTION": "Weet u zeker dat u deze bot wilt verwijderen? Deze actie kan niet ongedaan worden gemaakt",
|
||||||
"API": {
|
"API": {
|
||||||
"SUCCESS_MESSAGE": "Bot deleted successfully",
|
"SUCCESS_MESSAGE": "Bot succesvol verwijderd",
|
||||||
"ERROR_MESSAGE": "Could not able to delete bot, Please try again later"
|
"ERROR_MESSAGE": "Kan bot niet verwijderen, probeer het later opnieuw"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"EDIT": {
|
"EDIT": {
|
||||||
"BUTTON_TEXT": "Bewerken",
|
"BUTTON_TEXT": "Bewerken",
|
||||||
"LOADING": "Fetching Bots...",
|
"LOADING": "Bots Ophalen...",
|
||||||
"TITLE": "Edit Bot",
|
"TITLE": "Bot Bewerken",
|
||||||
"CANCEL_BUTTON_TEXT": "Annuleren",
|
"CANCEL_BUTTON_TEXT": "Annuleren",
|
||||||
"API": {
|
"API": {
|
||||||
"SUCCESS_MESSAGE": "Bot updated successfully",
|
"SUCCESS_MESSAGE": "Bot succesvol bijgewerkt",
|
||||||
"ERROR_MESSAGE": "Could not update bot, Please try again later"
|
"ERROR_MESSAGE": "Kan bot niet updaten, probeer het later opnieuw"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"TYPES": {
|
"TYPES": {
|
||||||
|
|||||||
@@ -76,8 +76,8 @@
|
|||||||
},
|
},
|
||||||
"AGENT_AVAILABILITY": {
|
"AGENT_AVAILABILITY": {
|
||||||
"LABEL": "Beschikbaarheid",
|
"LABEL": "Beschikbaarheid",
|
||||||
"PLACEHOLDER": "Please select an availability status",
|
"PLACEHOLDER": "Selecteer een beschikbaarheidsstatus",
|
||||||
"ERROR": "Availability is required"
|
"ERROR": "Beschikbaarheid is vereist"
|
||||||
},
|
},
|
||||||
"SUBMIT": "Bewerk medewerker"
|
"SUBMIT": "Bewerk medewerker"
|
||||||
},
|
},
|
||||||
@@ -111,7 +111,7 @@
|
|||||||
"PLACEHOLDER": {
|
"PLACEHOLDER": {
|
||||||
"AGENT": "Zoek agenten",
|
"AGENT": "Zoek agenten",
|
||||||
"TEAM": "Teams zoeken",
|
"TEAM": "Teams zoeken",
|
||||||
"INPUT": "Search for agents"
|
"INPUT": "Zoeken naar agents"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,82 +1,82 @@
|
|||||||
{
|
{
|
||||||
"ATTRIBUTES_MGMT": {
|
"ATTRIBUTES_MGMT": {
|
||||||
"HEADER": "Custom Attributes",
|
"HEADER": "Aangepaste attributen",
|
||||||
"HEADER_BTN_TXT": "Add Custom Attribute",
|
"HEADER_BTN_TXT": "Aangepast attribuut toevoegen",
|
||||||
"LOADING": "Fetching custom attributes",
|
"LOADING": "Aangepaste attributen ophalen",
|
||||||
"SIDEBAR_TXT": "<p><b>Custom Attributes</b> <p>A custom attribute tracks facts about your contacts/conversation — like the subscription plan, or when they ordered the first item etc. <br /><br />For creating a Custom Attribute, just click on the <b>Add Custom Attribute.</b> You can also edit or delete an existing Custom Attribute by clicking on the Edit or Delete button.</p>",
|
"SIDEBAR_TXT": "<p><b>Aangepaste Attributen</b> <p>Een aangepast attribuut volgt feiten over uw contacten/conversaties - zoals het abonnement of wanneer ze voor het eerst een item bestelden etc. <br /><br />Voor het maken van een aangepast attribuut, klik op <b>Voeg Aangepast Attribuut toe.</b> U kunt ook een bestaand Aangepast Attribuut bewerken of verwijderen door op de knop Bewerken of Verwijderen te klikken.</p>",
|
||||||
"ADD": {
|
"ADD": {
|
||||||
"TITLE": "Add Custom Attribute",
|
"TITLE": "Aangepast attribuut toevoegen",
|
||||||
"SUBMIT": "Aanmaken",
|
"SUBMIT": "Aanmaken",
|
||||||
"CANCEL_BUTTON_TEXT": "Annuleren",
|
"CANCEL_BUTTON_TEXT": "Annuleren",
|
||||||
"FORM": {
|
"FORM": {
|
||||||
"NAME": {
|
"NAME": {
|
||||||
"LABEL": "Display Name",
|
"LABEL": "Weergave naam",
|
||||||
"PLACEHOLDER": "Enter custom attribute display name",
|
"PLACEHOLDER": "Voer aangepaste attribuut weergavenaam in",
|
||||||
"ERROR": "Name is required"
|
"ERROR": "Naam is vereist"
|
||||||
},
|
},
|
||||||
"DESC": {
|
"DESC": {
|
||||||
"LABEL": "Beschrijving",
|
"LABEL": "Beschrijving",
|
||||||
"PLACEHOLDER": "Enter custom attribute description",
|
"PLACEHOLDER": "Voer aangepaste attribuutbeschrijving in",
|
||||||
"ERROR": "Description is required"
|
"ERROR": "Omschrijving is vereist"
|
||||||
},
|
},
|
||||||
"MODEL": {
|
"MODEL": {
|
||||||
"LABEL": "Applies to",
|
"LABEL": "Van toepassing op",
|
||||||
"PLACEHOLDER": "Please select one",
|
"PLACEHOLDER": "Selecteer er een",
|
||||||
"ERROR": "Model is required"
|
"ERROR": "Model is vereist"
|
||||||
},
|
},
|
||||||
"TYPE": {
|
"TYPE": {
|
||||||
"LABEL": "Type",
|
"LABEL": "Type",
|
||||||
"PLACEHOLDER": "Selecteer een type",
|
"PLACEHOLDER": "Selecteer een type",
|
||||||
"ERROR": "Type is required",
|
"ERROR": "Type is vereist",
|
||||||
"LIST": {
|
"LIST": {
|
||||||
"LABEL": "List Values",
|
"LABEL": "Toon waardes",
|
||||||
"PLACEHOLDER": "Please enter value and press enter key",
|
"PLACEHOLDER": "Voer waarde in en druk op enter-toets",
|
||||||
"ERROR": "Must have at least one value"
|
"ERROR": "Moet minstens één waarde bevatten"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"KEY": {
|
"KEY": {
|
||||||
"LABEL": "Key",
|
"LABEL": "Sleutel",
|
||||||
"PLACEHOLDER": "Enter custom attribute key",
|
"PLACEHOLDER": "Voer aangepaste attribuut sleutel in",
|
||||||
"ERROR": "Key is required",
|
"ERROR": "Sleutel is vereist",
|
||||||
"IN_VALID": "Invalid key"
|
"IN_VALID": "Ongeldige sleutel"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"API": {
|
"API": {
|
||||||
"SUCCESS_MESSAGE": "Custom Attribute added successfully!",
|
"SUCCESS_MESSAGE": "Aangepast attribuut succesvol toegevoegd!",
|
||||||
"ERROR_MESSAGE": "Could not create a Custom Attribute. Please try again later."
|
"ERROR_MESSAGE": "Aanmaken van aangepaste attribuut mislukt. Probeer het later opnieuw."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"DELETE": {
|
"DELETE": {
|
||||||
"BUTTON_TEXT": "Verwijderen",
|
"BUTTON_TEXT": "Verwijderen",
|
||||||
"API": {
|
"API": {
|
||||||
"SUCCESS_MESSAGE": "Custom Attribute deleted successfully.",
|
"SUCCESS_MESSAGE": "Aangepast attribuut succesvol verwijderd.",
|
||||||
"ERROR_MESSAGE": "Couldn't delete the custom attribute. Try again."
|
"ERROR_MESSAGE": "Kan het aangepaste attribuut niet verwijderen. Probeer het opnieuw."
|
||||||
},
|
},
|
||||||
"CONFIRM": {
|
"CONFIRM": {
|
||||||
"TITLE": "Are you sure want to delete - %{attributeName}",
|
"TITLE": "Weet u zeker dat u wilt verwijderen - %{attributeName}",
|
||||||
"PLACE_HOLDER": "Please type {attributeName} to confirm",
|
"PLACE_HOLDER": "Voer {attributeName} in om te bevestigen",
|
||||||
"MESSAGE": "Deleting will remove the custom attribute",
|
"MESSAGE": "Verwijderen zal het aangepaste attribuut verwijderen",
|
||||||
"YES": "Verwijderen ",
|
"YES": "Verwijderen ",
|
||||||
"NO": "Annuleren"
|
"NO": "Annuleren"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"EDIT": {
|
"EDIT": {
|
||||||
"TITLE": "Edit Custom Attribute",
|
"TITLE": "Aangepast attribuut bewerken",
|
||||||
"UPDATE_BUTTON_TEXT": "Vernieuwen",
|
"UPDATE_BUTTON_TEXT": "Vernieuwen",
|
||||||
"TYPE": {
|
"TYPE": {
|
||||||
"LIST": {
|
"LIST": {
|
||||||
"LABEL": "List Values",
|
"LABEL": "Toon waardes",
|
||||||
"PLACEHOLDER": "Please enter values and press enter key"
|
"PLACEHOLDER": "Voer waarden in en druk op enter-toets"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"API": {
|
"API": {
|
||||||
"SUCCESS_MESSAGE": "Custom Attribute updated successfully",
|
"SUCCESS_MESSAGE": "Aangepast attribuut succesvol bijgewerkt",
|
||||||
"ERROR_MESSAGE": "There was an error updating custom attribute, please try again"
|
"ERROR_MESSAGE": "Er is een fout opgetreden bij het bijwerken van aangepaste attributen, probeer het opnieuw"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"TABS": {
|
"TABS": {
|
||||||
"HEADER": "Custom Attributes",
|
"HEADER": "Aangepaste attributen",
|
||||||
"CONVERSATION": "Conversation",
|
"CONVERSATION": "Gesprek",
|
||||||
"CONTACT": "Contact"
|
"CONTACT": "Contact"
|
||||||
},
|
},
|
||||||
"LIST": {
|
"LIST": {
|
||||||
@@ -84,15 +84,15 @@
|
|||||||
"Naam",
|
"Naam",
|
||||||
"Beschrijving",
|
"Beschrijving",
|
||||||
"Type",
|
"Type",
|
||||||
"Key"
|
"Toets"
|
||||||
],
|
],
|
||||||
"BUTTONS": {
|
"BUTTONS": {
|
||||||
"EDIT": "Bewerken",
|
"EDIT": "Bewerken",
|
||||||
"DELETE": "Verwijderen"
|
"DELETE": "Verwijderen"
|
||||||
},
|
},
|
||||||
"EMPTY_RESULT": {
|
"EMPTY_RESULT": {
|
||||||
"404": "There are no custom attributes created",
|
"404": "Er zijn geen aangepaste attributen aangemaakt",
|
||||||
"NOT_FOUND": "There are no custom attributes configured"
|
"NOT_FOUND": "Er zijn geen aangepaste attributen geconfigureerd"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,71 +1,71 @@
|
|||||||
{
|
{
|
||||||
"AUDIT_LOGS": {
|
"AUDIT_LOGS": {
|
||||||
"HEADER": "Audit Logs",
|
"HEADER": "Audit Logs",
|
||||||
"HEADER_BTN_TXT": "Add Audit Logs",
|
"HEADER_BTN_TXT": "Audit-logs toevoegen",
|
||||||
"LOADING": "Fetching Audit Logs",
|
"LOADING": "Ophalen van Audit Logs",
|
||||||
"SEARCH_404": "Er zijn geen items die overeenkomen met deze zoekopdracht",
|
"SEARCH_404": "Er zijn geen items die overeenkomen met deze zoekopdracht",
|
||||||
"SIDEBAR_TXT": "<p><b>Audit Logs</b> </p><p> Audit Logs are trails for events and actions in a Chatwoot System. </p>",
|
"SIDEBAR_TXT": "<p><b>Audit Logs</b> </p><p> Audit Logs zijn sporen voor gebeurtenissen en acties in een Chatwoot Systeem. </p>",
|
||||||
"LIST": {
|
"LIST": {
|
||||||
"404": "There are no Audit Logs available in this account.",
|
"404": "Er zijn geen Audit Logs beschikbaar in dit account.",
|
||||||
"TITLE": "Manage Audit Logs",
|
"TITLE": "Beheer Audit Logs",
|
||||||
"DESC": "Audit Logs are trails for events and actions in a Chatwoot System.",
|
"DESC": "Audit Logs zijn sporen voor gebeurtenissen en acties in een Chatwoot Systeem.",
|
||||||
"TABLE_HEADER": [
|
"TABLE_HEADER": [
|
||||||
"User",
|
"User",
|
||||||
"Action",
|
"Tijd",
|
||||||
"IP-adres"
|
"IP-adres"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"API": {
|
"API": {
|
||||||
"SUCCESS_MESSAGE": "AuditLogs retrieved successfully",
|
"SUCCESS_MESSAGE": "AuditLogs succesvol opgehaald",
|
||||||
"ERROR_MESSAGE": "Kan geen verbinding maken met Woot Server, probeer het later opnieuw"
|
"ERROR_MESSAGE": "Kan geen verbinding maken met Woot Server, probeer het later opnieuw"
|
||||||
},
|
},
|
||||||
"DEFAULT_USER": "System",
|
"DEFAULT_USER": "Systeem",
|
||||||
"AUTOMATION_RULE": {
|
"AUTOMATION_RULE": {
|
||||||
"ADD": "%{agentName} created a new automation rule (#%{id})",
|
"ADD": "%{agentName} heeft een nieuwe automatiseringsregel aangemaakt (#%{id})",
|
||||||
"EDIT": "%{agentName} updated an automation rule (#%{id})",
|
"EDIT": "%{agentName} heeft een automatiseringsregel bijgewerkt (#%{id})",
|
||||||
"DELETE": "%{agentName} deleted an automation rule (#%{id})"
|
"DELETE": "%{agentName} heeft een automatiseringsregel verwijderd (#%{id})"
|
||||||
},
|
},
|
||||||
"ACCOUNT_USER": {
|
"ACCOUNT_USER": {
|
||||||
"ADD": "%{agentName} invited %{invitee} to the account as an %{role}",
|
"ADD": "%{agentName} heeft %{invitee} uitgenodigd voor het account als een %{role}",
|
||||||
"EDIT": {
|
"EDIT": {
|
||||||
"SELF": "%{agentName} changed their %{attributes} to %{values}",
|
"SELF": "%{agentName} heeft zijn %{attributes} gewijzigd naar %{values}",
|
||||||
"OTHER": "%{agentName} changed %{attributes} of %{user} to %{values}"
|
"OTHER": "%{agentName} heeft %{attributes} van %{user} gewijzigd naar %{values}"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"INBOX": {
|
"INBOX": {
|
||||||
"ADD": "%{agentName} created a new inbox (#%{id})",
|
"ADD": "%{agentName} heeft een nieuwe inbox aangemaakt (#%{id})",
|
||||||
"EDIT": "%{agentName} updated an inbox (#%{id})",
|
"EDIT": "%{agentName} heeft een inbox bijgewerkt (#%{id})",
|
||||||
"DELETE": "%{agentName} deleted an inbox (#%{id})"
|
"DELETE": "%{agentName} heeft een inbox verwijderd (#%{id})"
|
||||||
},
|
},
|
||||||
"WEBHOOK": {
|
"WEBHOOK": {
|
||||||
"ADD": "%{agentName} created a new webhook (#%{id})",
|
"ADD": "%{agentName} heeft een nieuwe webhook aangemaakt (#%{id})",
|
||||||
"EDIT": "%{agentName} updated a webhook (#%{id})",
|
"EDIT": "%{agentName} heeft een webhook bijgewerkt (#%{id})",
|
||||||
"DELETE": "%{agentName} deleted a webhook (#%{id})"
|
"DELETE": "%{agentName} heeft een webhook verwijderd (#%{id})"
|
||||||
},
|
},
|
||||||
"USER_ACTION": {
|
"USER_ACTION": {
|
||||||
"SIGN_IN": "%{agentName} signed in",
|
"SIGN_IN": "%{agentName} is ingelogd",
|
||||||
"SIGN_OUT": "%{agentName} signed out"
|
"SIGN_OUT": "%{agentName} heeft zich afgemeld"
|
||||||
},
|
},
|
||||||
"TEAM": {
|
"TEAM": {
|
||||||
"ADD": "%{agentName} created a new team (#%{id})",
|
"ADD": "%{agentName} heeft een nieuw team aangemaakt (#%{id})",
|
||||||
"EDIT": "%{agentName} updated a team (#%{id})",
|
"EDIT": "%{agentName} heeft een team bijgewerkt (#%{id})",
|
||||||
"DELETE": "%{agentName} deleted a team (#%{id})"
|
"DELETE": "%{agentName} heeft een team verwijderd (#%{id})"
|
||||||
},
|
},
|
||||||
"MACRO": {
|
"MACRO": {
|
||||||
"ADD": "%{agentName} created a new macro (#%{id})",
|
"ADD": "%{agentName} heeft een nieuwe macro aangemaakt (#%{id})",
|
||||||
"EDIT": "%{agentName} updated a macro (#%{id})",
|
"EDIT": "%{agentName} heeft een macro bijgewerkt (#%{id})",
|
||||||
"DELETE": "%{agentName} deleted a macro (#%{id})"
|
"DELETE": "%{agentName} heeft een macro verwijderd (#%{id})"
|
||||||
},
|
},
|
||||||
"INBOX_MEMBER": {
|
"INBOX_MEMBER": {
|
||||||
"ADD": "%{agentName} added %{user} to the inbox(#%{inbox_id})",
|
"ADD": "%{agentName} heeft %{user} toegevoegd aan de inbox (#%{inbox_id})",
|
||||||
"REMOVE": "%{agentName} removed %{user} from the inbox(#%{inbox_id})"
|
"REMOVE": "%{agentName} heeft %{user} verwijderd uit de inbox (#%{inbox_id})"
|
||||||
},
|
},
|
||||||
"TEAM_MEMBER": {
|
"TEAM_MEMBER": {
|
||||||
"ADD": "%{agentName} added %{user} to the team(#%{team_id})",
|
"ADD": "%{agentName} heeft %{user} toegevoegd aan het team (#%{team_id})",
|
||||||
"REMOVE": "%{agentName} removed %{user} from the team(#%{team_id})"
|
"REMOVE": "%{agentName} heeft %{user} verwijderd van het team (#%{team_id})"
|
||||||
},
|
},
|
||||||
"ACCOUNT": {
|
"ACCOUNT": {
|
||||||
"EDIT": "%{agentName} updated the account configuration (#%{id})"
|
"EDIT": "%{agentName} heeft de accountconfiguratie bijgewerkt (#%{id})"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,54 +1,54 @@
|
|||||||
{
|
{
|
||||||
"AUTOMATION": {
|
"AUTOMATION": {
|
||||||
"HEADER": "Automations",
|
"HEADER": "Automatisering",
|
||||||
"HEADER_BTN_TXT": "Add Automation Rule",
|
"HEADER_BTN_TXT": "Automatiseringsregel toevoegen",
|
||||||
"LOADING": "Fetching automation rules",
|
"LOADING": "Automatiseringsregels ophalen",
|
||||||
"SIDEBAR_TXT": "<p><b>Automation Rules</b> <p>Automation can replace and automate existing processes that require manual effort. You can do many things with automation, including adding labels and assigning conversation to the best agent. So the team focuses on what they do best and spends more little time on manual tasks.</p>",
|
"SIDEBAR_TXT": "<p><b>Automatiseringsregels</b> <p>Automation kan bestaande processen vervangen en automatiseren die handmatige inspanning vereisen. U kunt veel dingen doen met automatisering, inclusief het toevoegen van labels en het toewijzen van gesprekken aan uw beste agent. Het team concentreert zich dus op wat ze het beste doen en besteedt minder tijd aan handmatige taken.</p>",
|
||||||
"ADD": {
|
"ADD": {
|
||||||
"TITLE": "Add Automation Rule",
|
"TITLE": "Automatiseringsregel toevoegen",
|
||||||
"SUBMIT": "Aanmaken",
|
"SUBMIT": "Aanmaken",
|
||||||
"CANCEL_BUTTON_TEXT": "Annuleren",
|
"CANCEL_BUTTON_TEXT": "Annuleren",
|
||||||
"FORM": {
|
"FORM": {
|
||||||
"NAME": {
|
"NAME": {
|
||||||
"LABEL": "Rule Name",
|
"LABEL": "Regel naam",
|
||||||
"PLACEHOLDER": "Enter rule name",
|
"PLACEHOLDER": "Voer regelnaam in",
|
||||||
"ERROR": "Name is required"
|
"ERROR": "Naam is vereist"
|
||||||
},
|
},
|
||||||
"DESC": {
|
"DESC": {
|
||||||
"LABEL": "Beschrijving",
|
"LABEL": "Beschrijving",
|
||||||
"PLACEHOLDER": "Enter rule description",
|
"PLACEHOLDER": "Voer regelomschrijving in",
|
||||||
"ERROR": "Description is required"
|
"ERROR": "Omschrijving is vereist"
|
||||||
},
|
},
|
||||||
"EVENT": {
|
"EVENT": {
|
||||||
"LABEL": "Event",
|
"LABEL": "Event",
|
||||||
"PLACEHOLDER": "Please select one",
|
"PLACEHOLDER": "Selecteer er een",
|
||||||
"ERROR": "Event is required"
|
"ERROR": "Event is verplicht"
|
||||||
},
|
},
|
||||||
"CONDITIONS": {
|
"CONDITIONS": {
|
||||||
"LABEL": "Conditions"
|
"LABEL": "Voorwaarden"
|
||||||
},
|
},
|
||||||
"ACTIONS": {
|
"ACTIONS": {
|
||||||
"LABEL": "Acties"
|
"LABEL": "Acties"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"CONDITION_BUTTON_LABEL": "Add Condition",
|
"CONDITION_BUTTON_LABEL": "Voorwaarde toevoegen",
|
||||||
"ACTION_BUTTON_LABEL": "Add Action",
|
"ACTION_BUTTON_LABEL": "Actie toevoegen",
|
||||||
"API": {
|
"API": {
|
||||||
"SUCCESS_MESSAGE": "Automation rule added successfully",
|
"SUCCESS_MESSAGE": "Automatiseringsregel succesvol toegevoegd",
|
||||||
"ERROR_MESSAGE": "Could not able to create a automation rule, Please try again later"
|
"ERROR_MESSAGE": "Kan geen automatiseringsregel aanmaken, probeer het later opnieuw"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"LIST": {
|
"LIST": {
|
||||||
"TABLE_HEADER": [
|
"TABLE_HEADER": [
|
||||||
"Naam",
|
"Naam",
|
||||||
"Beschrijving",
|
"Beschrijving",
|
||||||
"Active",
|
"Actief",
|
||||||
"Created on"
|
"Aangemaakt op"
|
||||||
],
|
],
|
||||||
"404": "No automation rules found"
|
"404": "Geen automatiseringsregels gevonden"
|
||||||
},
|
},
|
||||||
"DELETE": {
|
"DELETE": {
|
||||||
"TITLE": "Delete Automation Rule",
|
"TITLE": "Automatiseringsregel verwijderen",
|
||||||
"SUBMIT": "Verwijderen",
|
"SUBMIT": "Verwijderen",
|
||||||
"CANCEL_BUTTON_TEXT": "Annuleren",
|
"CANCEL_BUTTON_TEXT": "Annuleren",
|
||||||
"CONFIRM": {
|
"CONFIRM": {
|
||||||
@@ -58,24 +58,24 @@
|
|||||||
"NO": "Nee, Behouden "
|
"NO": "Nee, Behouden "
|
||||||
},
|
},
|
||||||
"API": {
|
"API": {
|
||||||
"SUCCESS_MESSAGE": "Automation rule deleted successfully",
|
"SUCCESS_MESSAGE": "Automatiseringsregel succesvol verwijderd",
|
||||||
"ERROR_MESSAGE": "Could not able to delete a automation rule, Please try again later"
|
"ERROR_MESSAGE": "Kon geen automatiseringsregel verwijderen, probeer het later opnieuw"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"EDIT": {
|
"EDIT": {
|
||||||
"TITLE": "Edit Automation Rule",
|
"TITLE": "Automatiseringsregel bewerken",
|
||||||
"SUBMIT": "Vernieuwen",
|
"SUBMIT": "Vernieuwen",
|
||||||
"CANCEL_BUTTON_TEXT": "Annuleren",
|
"CANCEL_BUTTON_TEXT": "Annuleren",
|
||||||
"API": {
|
"API": {
|
||||||
"SUCCESS_MESSAGE": "Automation rule updated successfully",
|
"SUCCESS_MESSAGE": "Automatiseringsregel succesvol bijgewerkt",
|
||||||
"ERROR_MESSAGE": "Could not update automation rule, Please try again later"
|
"ERROR_MESSAGE": "Automatiseringsregel kon niet worden bijgewerkt, probeer het later opnieuw"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"CLONE": {
|
"CLONE": {
|
||||||
"TOOLTIP": "Clone",
|
"TOOLTIP": "Kloon",
|
||||||
"API": {
|
"API": {
|
||||||
"SUCCESS_MESSAGE": "Automation cloned successfully",
|
"SUCCESS_MESSAGE": "Automatisering met succes gekloond",
|
||||||
"ERROR_MESSAGE": "Could not clone automation rule, Please try again later"
|
"ERROR_MESSAGE": "Automatiseringsregel kon niet worden gekloond, probeer het later opnieuw"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"FORM": {
|
"FORM": {
|
||||||
@@ -83,36 +83,36 @@
|
|||||||
"CREATE": "Aanmaken",
|
"CREATE": "Aanmaken",
|
||||||
"DELETE": "Verwijderen",
|
"DELETE": "Verwijderen",
|
||||||
"CANCEL": "Annuleren",
|
"CANCEL": "Annuleren",
|
||||||
"RESET_MESSAGE": "Changing event type will reset the conditions and events you have added below"
|
"RESET_MESSAGE": "Het veranderen van het event type zal de condities en events die u hieronder hebt toegevoegd resetten"
|
||||||
},
|
},
|
||||||
"CONDITION": {
|
"CONDITION": {
|
||||||
"DELETE_MESSAGE": "You need to have atleast one condition to save",
|
"DELETE_MESSAGE": "U moet tenminste één voorwaarde hebben om op te slaan",
|
||||||
"CONTACT_CUSTOM_ATTR_LABEL": "Contact Custom Attributes",
|
"CONTACT_CUSTOM_ATTR_LABEL": "Aangepaste contactattributen",
|
||||||
"CONVERSATION_CUSTOM_ATTR_LABEL": "Conversation Custom Attributes"
|
"CONVERSATION_CUSTOM_ATTR_LABEL": "Gesprek aangepaste attributen"
|
||||||
},
|
},
|
||||||
"ACTION": {
|
"ACTION": {
|
||||||
"DELETE_MESSAGE": "You need to have atleast one action to save",
|
"DELETE_MESSAGE": "U moet tenminste één actie hebben om op te slaan",
|
||||||
"TEAM_MESSAGE_INPUT_PLACEHOLDER": "Enter your message here",
|
"TEAM_MESSAGE_INPUT_PLACEHOLDER": "Voer hier uw bericht in",
|
||||||
"TEAM_DROPDOWN_PLACEHOLDER": "Select teams"
|
"TEAM_DROPDOWN_PLACEHOLDER": "Teams selecteren"
|
||||||
},
|
},
|
||||||
"TOGGLE": {
|
"TOGGLE": {
|
||||||
"ACTIVATION_TITLE": "Activate Automation Rule",
|
"ACTIVATION_TITLE": "Automatiseringsregel activeren",
|
||||||
"DEACTIVATION_TITLE": "Deactivate Automation Rule",
|
"DEACTIVATION_TITLE": "Automatiseringsregel deactiveren",
|
||||||
"ACTIVATION_DESCRIPTION": "This action will activate the automation rule '{automationName}'. Are you sure you want to proceed?",
|
"ACTIVATION_DESCRIPTION": "Deze actie activeert de automatiseringsregel '{automationName}'. Weet u zeker dat u wilt doorgaan?",
|
||||||
"DEACTIVATION_DESCRIPTION": "This action will deactivate the automation rule '{automationName}'. Are you sure you want to proceed?",
|
"DEACTIVATION_DESCRIPTION": "Deze actie zal de automatiseringsregel '{automationName}' deactiveren. Weet u zeker dat u wilt doorgaan?",
|
||||||
"ACTIVATION_SUCCESFUL": "Automation Rule Activated Successfully",
|
"ACTIVATION_SUCCESFUL": "Automatiseringsregel succesvol geactiveerd",
|
||||||
"DEACTIVATION_SUCCESFUL": "Automation Rule Deactivated Successfully",
|
"DEACTIVATION_SUCCESFUL": "Automatiseringsregel succesvol gedeactiveerd",
|
||||||
"ACTIVATION_ERROR": "Could not Activate Automation, Please try again later",
|
"ACTIVATION_ERROR": "Automatisering kon niet worden geactiveerd, probeer het later opnieuw",
|
||||||
"DEACTIVATION_ERROR": "Could not Deactivate Automation, Please try again later",
|
"DEACTIVATION_ERROR": "Automatisering kon niet worden gedeactiveerd, probeer het later opnieuw",
|
||||||
"CONFIRMATION_LABEL": "Yes",
|
"CONFIRMATION_LABEL": "Ja",
|
||||||
"CANCEL_LABEL": "No"
|
"CANCEL_LABEL": "Nee"
|
||||||
},
|
},
|
||||||
"ATTACHMENT": {
|
"ATTACHMENT": {
|
||||||
"UPLOAD_ERROR": "Could not upload attachment, Please try again",
|
"UPLOAD_ERROR": "Kon bijlage niet uploaden, probeer het opnieuw",
|
||||||
"LABEL_IDLE": "Upload Attachment",
|
"LABEL_IDLE": "Bijlage uploaden",
|
||||||
"LABEL_UPLOADING": "Uploaden...",
|
"LABEL_UPLOADING": "Uploaden...",
|
||||||
"LABEL_UPLOADED": "Successfully Uploaded",
|
"LABEL_UPLOADED": "Succesvol geüpload",
|
||||||
"LABEL_UPLOAD_FAILED": "Upload Failed"
|
"LABEL_UPLOAD_FAILED": "Upload mislukt"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,40 +1,40 @@
|
|||||||
{
|
{
|
||||||
"BULK_ACTION": {
|
"BULK_ACTION": {
|
||||||
"CONVERSATIONS_SELECTED": "%{conversationCount} conversations selected",
|
"CONVERSATIONS_SELECTED": "%{conversationCount} gesprekken geselecteerd",
|
||||||
"AGENT_SELECT_LABEL": "Selecteer medewerker",
|
"AGENT_SELECT_LABEL": "Selecteer medewerker",
|
||||||
"ASSIGN_CONFIRMATION_LABEL": "Are you sure to assign %{conversationCount} %{conversationLabel} to",
|
"ASSIGN_CONFIRMATION_LABEL": "Weet u zeker dat u %{conversationCount} %{conversationLabel} wilt toewijzen aan",
|
||||||
"UNASSIGN_CONFIRMATION_LABEL": "Are you sure to unassign %{conversationCount} %{conversationLabel}?",
|
"UNASSIGN_CONFIRMATION_LABEL": "Weet u zeker dat u %{conversationCount} %{conversationLabel} wilt ontkoppelen?",
|
||||||
"GO_BACK_LABEL": "Go back",
|
"GO_BACK_LABEL": "Ga terug",
|
||||||
"ASSIGN_LABEL": "Toewijzen",
|
"ASSIGN_LABEL": "Toewijzen",
|
||||||
"YES": "Yes",
|
"YES": "Ja",
|
||||||
"ASSIGN_AGENT_TOOLTIP": "Assign Agent",
|
"ASSIGN_AGENT_TOOLTIP": "Agent toewijzen",
|
||||||
"ASSIGN_TEAM_TOOLTIP": "Assign team",
|
"ASSIGN_TEAM_TOOLTIP": "Team toewijzen",
|
||||||
"ASSIGN_SUCCESFUL": "Conversations assigned successfully",
|
"ASSIGN_SUCCESFUL": "Gesprekken succesvol toegewezen",
|
||||||
"ASSIGN_FAILED": "Failed to assign conversations, please try again",
|
"ASSIGN_FAILED": "Toewijzen van gesprekken mislukt, probeer het opnieuw",
|
||||||
"RESOLVE_SUCCESFUL": "Conversations resolved successfully",
|
"RESOLVE_SUCCESFUL": "Gesprekken succesvol opgehaald",
|
||||||
"RESOLVE_FAILED": "Failed to resolve conversations, please try again",
|
"RESOLVE_FAILED": "Fout bij het ophalen van gesprekken, probeer het opnieuw",
|
||||||
"ALL_CONVERSATIONS_SELECTED_ALERT": "Conversations visible on this page are only selected.",
|
"ALL_CONVERSATIONS_SELECTED_ALERT": "Gesprekken die op deze pagina zichtbaar zijn, zijn alleen geselecteerd.",
|
||||||
"AGENT_LIST_LOADING": "Loading Agents",
|
"AGENT_LIST_LOADING": "Agents worden geladen",
|
||||||
"UPDATE": {
|
"UPDATE": {
|
||||||
"CHANGE_STATUS": "Change status",
|
"CHANGE_STATUS": "Status wijzigen",
|
||||||
"SNOOZE_UNTIL_NEXT_REPLY": "Snooze until next reply",
|
"SNOOZE_UNTIL_NEXT_REPLY": "Snooze tot het volgende antwoord",
|
||||||
"UPDATE_SUCCESFUL": "Conversation status updated successfully.",
|
"UPDATE_SUCCESFUL": "Gespreksstatus succesvol bijgewerkt.",
|
||||||
"UPDATE_FAILED": "Failed to update conversations, please try again"
|
"UPDATE_FAILED": "Update van gesprekken mislukt, probeer het opnieuw"
|
||||||
},
|
},
|
||||||
"LABELS": {
|
"LABELS": {
|
||||||
"ASSIGN_LABELS": "Assign Labels",
|
"ASSIGN_LABELS": "Label toewijzen",
|
||||||
"NO_LABELS_FOUND": "No labels found for",
|
"NO_LABELS_FOUND": "Geen labels gevonden voor",
|
||||||
"ASSIGN_SELECTED_LABELS": "Assign selected labels",
|
"ASSIGN_SELECTED_LABELS": "Geselecteerde labels toewijzen",
|
||||||
"ASSIGN_SUCCESFUL": "Labels assigned successfully",
|
"ASSIGN_SUCCESFUL": "Labels met succes toegewezen",
|
||||||
"ASSIGN_FAILED": "Failed to assign labels, please try again"
|
"ASSIGN_FAILED": "Toewijzen van labels mislukt, probeer het opnieuw"
|
||||||
},
|
},
|
||||||
"TEAMS": {
|
"TEAMS": {
|
||||||
"TEAM_SELECT_LABEL": "Selecteer team",
|
"TEAM_SELECT_LABEL": "Selecteer team",
|
||||||
"NONE": "Geen",
|
"NONE": "Geen",
|
||||||
"NO_TEAMS_AVAILABLE": "There are no teams added to this account yet.",
|
"NO_TEAMS_AVAILABLE": "Er zijn nog geen teams toegevoegd aan dit account.",
|
||||||
"ASSIGN_SELECTED_TEAMS": "Assign selected team",
|
"ASSIGN_SELECTED_TEAMS": "Geselecteerde team toewijzen",
|
||||||
"ASSIGN_SUCCESFUL": "Teams assiged successfully",
|
"ASSIGN_SUCCESFUL": "Teams succesvol toegewezen",
|
||||||
"ASSIGN_FAILED": "Failed to assign team, please try again"
|
"ASSIGN_FAILED": "Toewijzen team mislukt, probeer het opnieuw"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,26 +1,26 @@
|
|||||||
{
|
{
|
||||||
"CAMPAIGN": {
|
"CAMPAIGN": {
|
||||||
"HEADER": "Campaigns",
|
"HEADER": "Campagnes",
|
||||||
"SIDEBAR_TXT": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations. Click on <b>Add Campaign</b> to create a new campaign. You can also edit or delete an existing campaign by clicking on the Edit or Delete button.",
|
"SIDEBAR_TXT": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations. Click on <b>Add Campaign</b> to create a new campaign. You can also edit or delete an existing campaign by clicking on the Edit or Delete button.",
|
||||||
"HEADER_BTN_TXT": {
|
"HEADER_BTN_TXT": {
|
||||||
"ONE_OFF": "Create a one off campaign",
|
"ONE_OFF": "Creëer een eenmalige campagne",
|
||||||
"ONGOING": "Create a ongoing campaign"
|
"ONGOING": "Creëer een lopende campagne"
|
||||||
},
|
},
|
||||||
"ADD": {
|
"ADD": {
|
||||||
"TITLE": "Create a campaign",
|
"TITLE": "Creëer een campagne",
|
||||||
"DESC": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations.",
|
"DESC": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations.",
|
||||||
"CANCEL_BUTTON_TEXT": "Annuleren",
|
"CANCEL_BUTTON_TEXT": "Annuleren",
|
||||||
"CREATE_BUTTON_TEXT": "Aanmaken",
|
"CREATE_BUTTON_TEXT": "Aanmaken",
|
||||||
"FORM": {
|
"FORM": {
|
||||||
"TITLE": {
|
"TITLE": {
|
||||||
"LABEL": "Title",
|
"LABEL": "Titel",
|
||||||
"PLACEHOLDER": "Please enter the title of campaign",
|
"PLACEHOLDER": "Please enter the title of campaign",
|
||||||
"ERROR": "Title is required"
|
"ERROR": "Title is required"
|
||||||
},
|
},
|
||||||
"SCHEDULED_AT": {
|
"SCHEDULED_AT": {
|
||||||
"LABEL": "Scheduled time",
|
"LABEL": "Scheduled time",
|
||||||
"PLACEHOLDER": "Please select the time",
|
"PLACEHOLDER": "Please select the time",
|
||||||
"CONFIRM": "Confirm",
|
"CONFIRM": "Bevestigen",
|
||||||
"ERROR": "Scheduled time is required"
|
"ERROR": "Scheduled time is required"
|
||||||
},
|
},
|
||||||
"AUDIENCE": {
|
"AUDIENCE": {
|
||||||
@@ -29,8 +29,8 @@
|
|||||||
"ERROR": "Audience is required"
|
"ERROR": "Audience is required"
|
||||||
},
|
},
|
||||||
"INBOX": {
|
"INBOX": {
|
||||||
"LABEL": "Select Inbox",
|
"LABEL": "Selecteer een inbox",
|
||||||
"PLACEHOLDER": "Select Inbox",
|
"PLACEHOLDER": "Selecteer een inbox",
|
||||||
"ERROR": "Inbox is required"
|
"ERROR": "Inbox is required"
|
||||||
},
|
},
|
||||||
"MESSAGE": {
|
"MESSAGE": {
|
||||||
@@ -87,7 +87,7 @@
|
|||||||
"LOADING_MESSAGE": "Loading campaigns...",
|
"LOADING_MESSAGE": "Loading campaigns...",
|
||||||
"404": "There are no campaigns created for this inbox.",
|
"404": "There are no campaigns created for this inbox.",
|
||||||
"TABLE_HEADER": {
|
"TABLE_HEADER": {
|
||||||
"TITLE": "Title",
|
"TITLE": "Titel",
|
||||||
"MESSAGE": "Bericht",
|
"MESSAGE": "Bericht",
|
||||||
"INBOX": "Postvak In",
|
"INBOX": "Postvak In",
|
||||||
"STATUS": "Status",
|
"STATUS": "Status",
|
||||||
@@ -119,8 +119,8 @@
|
|||||||
},
|
},
|
||||||
"ONGOING": {
|
"ONGOING": {
|
||||||
"HEADER": "Ongoing campaigns",
|
"HEADER": "Ongoing campaigns",
|
||||||
"404": "There are no ongoing campaigns created",
|
"404": "Er zijn geen lopende campagnes aangemaakt",
|
||||||
"INBOXES_NOT_FOUND": "Please create an website inbox and start adding campaigns"
|
"INBOXES_NOT_FOUND": "Maak een website inbox en begin met het toevoegen van campagnes"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
"HEADER_BTN_TXT": "Standaard antwoord toevoegen",
|
"HEADER_BTN_TXT": "Standaard antwoord toevoegen",
|
||||||
"LOADING": "Standaard antwoorden ophalen",
|
"LOADING": "Standaard antwoorden ophalen",
|
||||||
"SEARCH_404": "Er zijn geen items die overeenkomen met deze zoekopdracht",
|
"SEARCH_404": "Er zijn geen items die overeenkomen met deze zoekopdracht",
|
||||||
"SIDEBAR_TXT": "<p><b>Canned Responses</b> </p><p> Canned Responses are saved reply templates which can be used to quickly send out a reply to a conversation. </p><p> For creating a Canned Response, just click on the <b>Add Canned Response</b>. You can also edit or delete an existing Canned Response by clicking on the Edit or Delete button </p><p> Canned responses are used with the help of <b>Short Codes</b>. Agents can access canned responses while on a chat by typing <b>'/'</b> followed by the short code. </p>",
|
"SIDEBAR_TXT": "<p><b> Standaard antwoorden</b> </p><p> Standaard antwoorden zijn opgeslagen antwoordsjablonen die kunnen worden gebruikt om snel een antwoord te sturen naar een gesprek. </p><p> Voor het maken van een standaard antwoord, klik op de <b>Voeg standaard antwoord toe</b>. U kunt een bestaand antwoord bewerken of verwijderen door op de knop Bewerken of Verwijderen te klikken </p><p> Standaard antwoorden worden gebruikt met behulp van <b>korte codes</b>. Medewerkers hebben toegang tot standaard antwoorden in een chat door <b>'/'</b> te typen gevolgd door de korte code. </p>",
|
||||||
"LIST": {
|
"LIST": {
|
||||||
"404": "Er zijn geen standaard antwoorden beschikbaar in dit account.",
|
"404": "Er zijn geen standaard antwoorden beschikbaar in dit account.",
|
||||||
"TITLE": "Beheer standaard antwoorden",
|
"TITLE": "Beheer standaard antwoorden",
|
||||||
@@ -17,7 +17,7 @@
|
|||||||
},
|
},
|
||||||
"ADD": {
|
"ADD": {
|
||||||
"TITLE": "Standaard antwoord toevoegen",
|
"TITLE": "Standaard antwoord toevoegen",
|
||||||
"DESC": "Canned Responses are saved reply templates which can be used to quickly send out reply to conversation.",
|
"DESC": "Standaard antwoorden zijn opgeslagen antwoordsjablonen die kunnen worden gebruikt om snel te reageren op gesprekken.",
|
||||||
"CANCEL_BUTTON_TEXT": "Annuleren",
|
"CANCEL_BUTTON_TEXT": "Annuleren",
|
||||||
"FORM": {
|
"FORM": {
|
||||||
"SHORT_CODE": {
|
"SHORT_CODE": {
|
||||||
|
|||||||
@@ -36,23 +36,23 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"VIEW_FILTER": "Bekijken",
|
"VIEW_FILTER": "Bekijken",
|
||||||
"SORT_TOOLTIP_LABEL": "Sort conversations",
|
"SORT_TOOLTIP_LABEL": "Sorteer gesprekken",
|
||||||
"CHAT_SORT": {
|
"CHAT_SORT": {
|
||||||
"STATUS": "Status",
|
"STATUS": "Status",
|
||||||
"ORDER_BY": "Order by"
|
"ORDER_BY": "Sorteren op"
|
||||||
},
|
},
|
||||||
"CHAT_SORT_FILTER_ITEMS": {
|
"CHAT_SORT_FILTER_ITEMS": {
|
||||||
"latest": {
|
"latest": {
|
||||||
"TEXT": "Last activity"
|
"TEXT": "Laatste Activiteit"
|
||||||
},
|
},
|
||||||
"sort_on_created_at": {
|
"sort_on_created_at": {
|
||||||
"TEXT": "Created at"
|
"TEXT": "Aangemaakt op"
|
||||||
},
|
},
|
||||||
"sort_on_priority": {
|
"sort_on_priority": {
|
||||||
"TEXT": "Priority"
|
"TEXT": "Prioriteit"
|
||||||
},
|
},
|
||||||
"sort_on_waiting_since": {
|
"sort_on_waiting_since": {
|
||||||
"TEXT": "Pending Response"
|
"TEXT": "Wachtend op antwoord"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"ATTACHMENTS": {
|
"ATTACHMENTS": {
|
||||||
@@ -76,20 +76,20 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"CHAT_SORT_BY_FILTER": {
|
"CHAT_SORT_BY_FILTER": {
|
||||||
"TITLE": "Sort conversation",
|
"TITLE": "Gesprek sorteren",
|
||||||
"DROPDOWN_TITLE": "Sort by",
|
"DROPDOWN_TITLE": "Sorteren op",
|
||||||
"ITEMS": {
|
"ITEMS": {
|
||||||
"LATEST": {
|
"LATEST": {
|
||||||
"NAME": "Last activity at",
|
"NAME": "Laatste activiteit om",
|
||||||
"LABEL": "Last activity"
|
"LABEL": "Laatste Activiteit"
|
||||||
},
|
},
|
||||||
"CREATED_AT": {
|
"CREATED_AT": {
|
||||||
"NAME": "Created at",
|
"NAME": "Aangemaakt op",
|
||||||
"LABEL": "Created at"
|
"LABEL": "Aangemaakt op"
|
||||||
},
|
},
|
||||||
"LAST_USER_MESSAGE_AT": {
|
"LAST_USER_MESSAGE_AT": {
|
||||||
"NAME": "Last user message at",
|
"NAME": "Laatste bericht van gebruiker op",
|
||||||
"LABEL": "Last message"
|
"LABEL": "Laatste bericht"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -71,7 +71,7 @@
|
|||||||
"SUBMIT": "Importeren",
|
"SUBMIT": "Importeren",
|
||||||
"CANCEL": "Annuleren"
|
"CANCEL": "Annuleren"
|
||||||
},
|
},
|
||||||
"SUCCESS_MESSAGE": "You will be notified via email when the import is complete.",
|
"SUCCESS_MESSAGE": "U wordt per e-mail geïnformeerd wanneer de import is voltooid.",
|
||||||
"ERROR_MESSAGE": "Er is een fout opgetreden, probeer het opnieuw"
|
"ERROR_MESSAGE": "Er is een fout opgetreden, probeer het opnieuw"
|
||||||
},
|
},
|
||||||
"EXPORT_CONTACTS": {
|
"EXPORT_CONTACTS": {
|
||||||
|
|||||||
@@ -2,17 +2,17 @@
|
|||||||
"CONTACTS_FILTER": {
|
"CONTACTS_FILTER": {
|
||||||
"TITLE": "Contacten filteren",
|
"TITLE": "Contacten filteren",
|
||||||
"SUBTITLE": "Voeg hieronder filters toe en druk op 'Verzenden' om contacten te filteren.",
|
"SUBTITLE": "Voeg hieronder filters toe en druk op 'Verzenden' om contacten te filteren.",
|
||||||
"EDIT_CUSTOM_SEGMENT": "Edit Segment",
|
"EDIT_CUSTOM_SEGMENT": "Bewerk Segment",
|
||||||
"CUSTOM_VIEWS_SUBTITLE": "Add or remove filters and update your segment.",
|
"CUSTOM_VIEWS_SUBTITLE": "Filters toevoegen of verwijderen en bijwerken van uw segment.",
|
||||||
"ADD_NEW_FILTER": "Filter toevoegen",
|
"ADD_NEW_FILTER": "Filter toevoegen",
|
||||||
"CLEAR_ALL_FILTERS": "Alle filters wissen",
|
"CLEAR_ALL_FILTERS": "Alle filters wissen",
|
||||||
"FILTER_DELETE_ERROR": "U moet minstens één filter hebben om op te slaan",
|
"FILTER_DELETE_ERROR": "U moet minstens één filter hebben om op te slaan",
|
||||||
"SUBMIT_BUTTON_LABEL": "Bevestigen",
|
"SUBMIT_BUTTON_LABEL": "Bevestigen",
|
||||||
"UPDATE_BUTTON_LABEL": "Update Segment",
|
"UPDATE_BUTTON_LABEL": "Segment Updaten",
|
||||||
"CANCEL_BUTTON_LABEL": "Annuleren",
|
"CANCEL_BUTTON_LABEL": "Annuleren",
|
||||||
"CLEAR_BUTTON_LABEL": "Filters wissen",
|
"CLEAR_BUTTON_LABEL": "Filters wissen",
|
||||||
"EMPTY_VALUE_ERROR": "Waarde is vereist",
|
"EMPTY_VALUE_ERROR": "Waarde is vereist",
|
||||||
"SEGMENT_LABEL": "Segment Name",
|
"SEGMENT_LABEL": "Segment Naam",
|
||||||
"SEGMENT_QUERY_LABEL": "Segment Query",
|
"SEGMENT_QUERY_LABEL": "Segment Query",
|
||||||
"TOOLTIP_LABEL": "Contacten filteren",
|
"TOOLTIP_LABEL": "Contacten filteren",
|
||||||
"QUERY_DROPDOWN_LABELS": {
|
"QUERY_DROPDOWN_LABELS": {
|
||||||
|
|||||||
@@ -79,7 +79,7 @@
|
|||||||
"CANCEL": "Annuleren"
|
"CANCEL": "Annuleren"
|
||||||
},
|
},
|
||||||
"PRIORITY": {
|
"PRIORITY": {
|
||||||
"TITLE": "Priority",
|
"TITLE": "Prioriteit",
|
||||||
"OPTIONS": {
|
"OPTIONS": {
|
||||||
"NONE": "Geen",
|
"NONE": "Geen",
|
||||||
"URGENT": "Urgent",
|
"URGENT": "Urgent",
|
||||||
|
|||||||
@@ -3,11 +3,11 @@
|
|||||||
"TITLE": "Beoordeel uw gesprek",
|
"TITLE": "Beoordeel uw gesprek",
|
||||||
"PLACEHOLDER": "Vertel ons meer...",
|
"PLACEHOLDER": "Vertel ons meer...",
|
||||||
"RATINGS": {
|
"RATINGS": {
|
||||||
"POOR": "😞 Poor",
|
"POOR": "😞 Slecht",
|
||||||
"FAIR": "😑 Fair",
|
"FAIR": "😑 Redelijk",
|
||||||
"AVERAGE": "😐 Average",
|
"AVERAGE": "😐 Gemiddeld",
|
||||||
"GOOD": "😀 Good",
|
"GOOD": "😀 Goed",
|
||||||
"EXCELLENT": "😍 Excellent"
|
"EXCELLENT": "😍 Uitstekend"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -103,7 +103,7 @@
|
|||||||
"SECTIONS": {
|
"SECTIONS": {
|
||||||
"GENERAL": "General",
|
"GENERAL": "General",
|
||||||
"REPORTS": "Rapporten",
|
"REPORTS": "Rapporten",
|
||||||
"CONVERSATION": "Conversation",
|
"CONVERSATION": "Gesprek",
|
||||||
"CHANGE_ASSIGNEE": "Change Assignee",
|
"CHANGE_ASSIGNEE": "Change Assignee",
|
||||||
"CHANGE_PRIORITY": "Change Priority",
|
"CHANGE_PRIORITY": "Change Priority",
|
||||||
"CHANGE_TEAM": "Change Team",
|
"CHANGE_TEAM": "Change Team",
|
||||||
@@ -153,7 +153,7 @@
|
|||||||
"CHANGE_APPEARANCE": "Change Appearance",
|
"CHANGE_APPEARANCE": "Change Appearance",
|
||||||
"LIGHT_MODE": "Light",
|
"LIGHT_MODE": "Light",
|
||||||
"DARK_MODE": "Dark",
|
"DARK_MODE": "Dark",
|
||||||
"SYSTEM_MODE": "System"
|
"SYSTEM_MODE": "Systeem"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"DASHBOARD_APPS": {
|
"DASHBOARD_APPS": {
|
||||||
|
|||||||
@@ -226,7 +226,7 @@
|
|||||||
"LABEL": "Naam",
|
"LABEL": "Naam",
|
||||||
"PLACEHOLDER": "Portal name",
|
"PLACEHOLDER": "Portal name",
|
||||||
"HELP_TEXT": "The name will be used in the public facing portal internally.",
|
"HELP_TEXT": "The name will be used in the public facing portal internally.",
|
||||||
"ERROR": "Name is required"
|
"ERROR": "Naam is vereist"
|
||||||
},
|
},
|
||||||
"SLUG": {
|
"SLUG": {
|
||||||
"LABEL": "Slug",
|
"LABEL": "Slug",
|
||||||
@@ -304,7 +304,7 @@
|
|||||||
"404": "No articles matches your search 🔍",
|
"404": "No articles matches your search 🔍",
|
||||||
"NO_ARTICLES": "There are no available articles",
|
"NO_ARTICLES": "There are no available articles",
|
||||||
"HEADERS": {
|
"HEADERS": {
|
||||||
"TITLE": "Title",
|
"TITLE": "Titel",
|
||||||
"CATEGORY": "Categorie",
|
"CATEGORY": "Categorie",
|
||||||
"READ_COUNT": "Read count",
|
"READ_COUNT": "Read count",
|
||||||
"STATUS": "Status",
|
"STATUS": "Status",
|
||||||
@@ -366,7 +366,7 @@
|
|||||||
"LABEL": "Naam",
|
"LABEL": "Naam",
|
||||||
"PLACEHOLDER": "Category name",
|
"PLACEHOLDER": "Category name",
|
||||||
"HELP_TEXT": "The category name will be used in the public facing portal to categorize articles.",
|
"HELP_TEXT": "The category name will be used in the public facing portal to categorize articles.",
|
||||||
"ERROR": "Name is required"
|
"ERROR": "Naam is vereist"
|
||||||
},
|
},
|
||||||
"SLUG": {
|
"SLUG": {
|
||||||
"LABEL": "Slug",
|
"LABEL": "Slug",
|
||||||
@@ -377,7 +377,7 @@
|
|||||||
"DESCRIPTION": {
|
"DESCRIPTION": {
|
||||||
"LABEL": "Beschrijving",
|
"LABEL": "Beschrijving",
|
||||||
"PLACEHOLDER": "Give a short description about the category.",
|
"PLACEHOLDER": "Give a short description about the category.",
|
||||||
"ERROR": "Description is required"
|
"ERROR": "Omschrijving is vereist"
|
||||||
},
|
},
|
||||||
"BUTTONS": {
|
"BUTTONS": {
|
||||||
"CREATE": "Create category",
|
"CREATE": "Create category",
|
||||||
@@ -397,7 +397,7 @@
|
|||||||
"LABEL": "Naam",
|
"LABEL": "Naam",
|
||||||
"PLACEHOLDER": "Category name",
|
"PLACEHOLDER": "Category name",
|
||||||
"HELP_TEXT": "The category name will be used in the public facing portal to categorize articles.",
|
"HELP_TEXT": "The category name will be used in the public facing portal to categorize articles.",
|
||||||
"ERROR": "Name is required"
|
"ERROR": "Naam is vereist"
|
||||||
},
|
},
|
||||||
"SLUG": {
|
"SLUG": {
|
||||||
"LABEL": "Slug",
|
"LABEL": "Slug",
|
||||||
@@ -408,7 +408,7 @@
|
|||||||
"DESCRIPTION": {
|
"DESCRIPTION": {
|
||||||
"LABEL": "Beschrijving",
|
"LABEL": "Beschrijving",
|
||||||
"PLACEHOLDER": "Give a short description about the category.",
|
"PLACEHOLDER": "Give a short description about the category.",
|
||||||
"ERROR": "Description is required"
|
"ERROR": "Omschrijving is vereist"
|
||||||
},
|
},
|
||||||
"BUTTONS": {
|
"BUTTONS": {
|
||||||
"CREATE": "Update category",
|
"CREATE": "Update category",
|
||||||
|
|||||||
@@ -189,7 +189,7 @@
|
|||||||
"ERROR": "Dit veld is verplicht"
|
"ERROR": "Dit veld is verplicht"
|
||||||
},
|
},
|
||||||
"INBOX_NAME": {
|
"INBOX_NAME": {
|
||||||
"LABEL": "Inbox Name",
|
"LABEL": "Inbox Naam",
|
||||||
"PLACEHOLDER": "Please enter a inbox name",
|
"PLACEHOLDER": "Please enter a inbox name",
|
||||||
"ERROR": "Dit veld is verplicht"
|
"ERROR": "Dit veld is verplicht"
|
||||||
},
|
},
|
||||||
@@ -458,7 +458,7 @@
|
|||||||
"SETTINGS": "Instellingen",
|
"SETTINGS": "Instellingen",
|
||||||
"COLLABORATORS": "Collaborators",
|
"COLLABORATORS": "Collaborators",
|
||||||
"CONFIGURATION": "Configuration",
|
"CONFIGURATION": "Configuration",
|
||||||
"CAMPAIGN": "Campaigns",
|
"CAMPAIGN": "Campagnes",
|
||||||
"PRE_CHAT_FORM": "Pre Chat Form",
|
"PRE_CHAT_FORM": "Pre Chat Form",
|
||||||
"BUSINESS_HOURS": "Business Hours",
|
"BUSINESS_HOURS": "Business Hours",
|
||||||
"WIDGET_BUILDER": "Widget Builder",
|
"WIDGET_BUILDER": "Widget Builder",
|
||||||
@@ -540,7 +540,7 @@
|
|||||||
"FIELDS": "Fields",
|
"FIELDS": "Fields",
|
||||||
"LABEL": "Label",
|
"LABEL": "Label",
|
||||||
"PLACE_HOLDER": "Placeholder",
|
"PLACE_HOLDER": "Placeholder",
|
||||||
"KEY": "Key",
|
"KEY": "Sleutel",
|
||||||
"TYPE": "Type",
|
"TYPE": "Type",
|
||||||
"REQUIRED": "Required"
|
"REQUIRED": "Required"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1,35 +1,35 @@
|
|||||||
{
|
{
|
||||||
"INTEGRATION_APPS": {
|
"INTEGRATION_APPS": {
|
||||||
"FETCHING": "Fetching Integrations",
|
"FETCHING": "Integraties ophalen",
|
||||||
"NO_HOOK_CONFIGURED": "There are no %{integrationId} integrations configured in this account.",
|
"NO_HOOK_CONFIGURED": "Er zijn geen %{integrationId} integraties geconfigureerd in dit account.",
|
||||||
"HEADER": "Applications",
|
"HEADER": "Applicaties",
|
||||||
"STATUS": {
|
"STATUS": {
|
||||||
"ENABLED": "Ingeschakeld",
|
"ENABLED": "Ingeschakeld",
|
||||||
"DISABLED": "Uitgeschakeld"
|
"DISABLED": "Uitgeschakeld"
|
||||||
},
|
},
|
||||||
"CONFIGURE": "Configureren",
|
"CONFIGURE": "Configureren",
|
||||||
"ADD_BUTTON": "Add a new hook",
|
"ADD_BUTTON": "Nieuwe hook toevoegen",
|
||||||
"DELETE": {
|
"DELETE": {
|
||||||
"TITLE": {
|
"TITLE": {
|
||||||
"INBOX": "Confirm deletion",
|
"INBOX": "Verwijdering bevestigen",
|
||||||
"ACCOUNT": "Disconnect"
|
"ACCOUNT": "Verbinding verbreken"
|
||||||
},
|
},
|
||||||
"MESSAGE": {
|
"MESSAGE": {
|
||||||
"INBOX": "Weet u zeker dat u wilt verwijderen?",
|
"INBOX": "Weet u zeker dat u wilt verwijderen?",
|
||||||
"ACCOUNT": "Are you sure to disconnect?"
|
"ACCOUNT": "Weet u zeker dat u de verbinding wilt verbreken?"
|
||||||
},
|
},
|
||||||
"CONFIRM_BUTTON_TEXT": {
|
"CONFIRM_BUTTON_TEXT": {
|
||||||
"INBOX": "Ja, verwijderen",
|
"INBOX": "Ja, verwijderen",
|
||||||
"ACCOUNT": "Yes, Disconnect"
|
"ACCOUNT": "Ja, verbinding verbreken"
|
||||||
},
|
},
|
||||||
"CANCEL_BUTTON_TEXT": "Annuleren",
|
"CANCEL_BUTTON_TEXT": "Annuleren",
|
||||||
"API": {
|
"API": {
|
||||||
"SUCCESS_MESSAGE": "Hook deleted successfully",
|
"SUCCESS_MESSAGE": "Hook succesvol verwijderd",
|
||||||
"ERROR_MESSAGE": "Kan geen verbinding maken met Woot Server, probeer het later opnieuw"
|
"ERROR_MESSAGE": "Kan geen verbinding maken met Woot Server, probeer het later opnieuw"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"LIST": {
|
"LIST": {
|
||||||
"FETCHING": "Fetching integration hooks",
|
"FETCHING": "Ophalen van integratie-hooks",
|
||||||
"INBOX": "Postvak In",
|
"INBOX": "Postvak In",
|
||||||
"DELETE": {
|
"DELETE": {
|
||||||
"BUTTON_TEXT": "Verwijderen"
|
"BUTTON_TEXT": "Verwijderen"
|
||||||
@@ -38,25 +38,25 @@
|
|||||||
"ADD": {
|
"ADD": {
|
||||||
"FORM": {
|
"FORM": {
|
||||||
"INBOX": {
|
"INBOX": {
|
||||||
"LABEL": "Select Inbox",
|
"LABEL": "Selecteer een inbox",
|
||||||
"PLACEHOLDER": "Select Inbox"
|
"PLACEHOLDER": "Selecteer een inbox"
|
||||||
},
|
},
|
||||||
"SUBMIT": "Aanmaken",
|
"SUBMIT": "Aanmaken",
|
||||||
"CANCEL": "Annuleren"
|
"CANCEL": "Annuleren"
|
||||||
},
|
},
|
||||||
"API": {
|
"API": {
|
||||||
"SUCCESS_MESSAGE": "Integration hook added successfully",
|
"SUCCESS_MESSAGE": "Integratie hook succesvol toegevoegd",
|
||||||
"ERROR_MESSAGE": "Kan geen verbinding maken met Woot Server, probeer het later opnieuw"
|
"ERROR_MESSAGE": "Kan geen verbinding maken met Woot Server, probeer het later opnieuw"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"CONNECT": {
|
"CONNECT": {
|
||||||
"BUTTON_TEXT": "Connect"
|
"BUTTON_TEXT": "Verbinden"
|
||||||
},
|
},
|
||||||
"DISCONNECT": {
|
"DISCONNECT": {
|
||||||
"BUTTON_TEXT": "Disconnect"
|
"BUTTON_TEXT": "Verbinding verbreken"
|
||||||
},
|
},
|
||||||
"SIDEBAR_DESCRIPTION": {
|
"SIDEBAR_DESCRIPTION": {
|
||||||
"DIALOGFLOW": "Dialogflow is a natural language understanding platform that makes it easy to design and integrate a conversational user interface into your mobile app, web application, device, bot, interactive voice response system, and so on. <br /> <br /> Dialogflow integration with %{installationName} allows you to configure a Dialogflow bot with your inboxes which lets the bot handle the queries initially and hand them over to an agent when needed. Dialogflow can be used to qualifying the leads, reduce the workload of agents by providing frequently asked questions etc. <br /> <br /> To add Dialogflow, you need to create a Service Account in your Google project console and share the credentials. Please refer to the Dialogflow docs for more information."
|
"DIALOGFLOW": "Dialogflow is een natuurlijk talenbegrip platform dat het makkelijk maakt om een conversatie-interface te ontwerpen en te integreren in uw mobiele app, Webapplicatie, apparaat, bot, interactieve stem responssysteem, enzovoort. <br /> <br /> Dialogflow integratie met %{installationName} stelt u in staat een Dialogflow bot met uw inboxen te configureren, die de bot in staat stelt de zoekopdrachten in eerste instantie af te handelen en deze aan een agent over te leveren indien nodig. De dialoogstroom kan worden gebruikt om de lood te kwalificeren, de werklast van agenten te verminderen door veelgestelde vragen te stellen, enzovoort. <br /> <br /> Om Dialogflow toe te voegen, moet u een Serviceaccount aanmaken in uw Google-projectconsole en de referenties delen. Raadpleeg de Dialogflow documenten voor meer informatie."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -204,7 +204,7 @@
|
|||||||
"DELETE": {
|
"DELETE": {
|
||||||
"CONFIRM_YES": "Yes, delete it",
|
"CONFIRM_YES": "Yes, delete it",
|
||||||
"CONFIRM_NO": "No, keep it",
|
"CONFIRM_NO": "No, keep it",
|
||||||
"TITLE": "Confirm deletion",
|
"TITLE": "Verwijdering bevestigen",
|
||||||
"MESSAGE": "Are you sure to delete the app - %{appName}?",
|
"MESSAGE": "Are you sure to delete the app - %{appName}?",
|
||||||
"API_SUCCESS": "Dashboard app deleted successfully",
|
"API_SUCCESS": "Dashboard app deleted successfully",
|
||||||
"API_ERROR": "We couldn't delete the app. Please try again later"
|
"API_ERROR": "We couldn't delete the app. Please try again later"
|
||||||
|
|||||||
@@ -40,16 +40,16 @@
|
|||||||
},
|
},
|
||||||
"SUGGESTIONS": {
|
"SUGGESTIONS": {
|
||||||
"TOOLTIP": {
|
"TOOLTIP": {
|
||||||
"SINGLE_SUGGESTION": "Add label to conversation",
|
"SINGLE_SUGGESTION": "Label aan gesprek toevoegen",
|
||||||
"MULTIPLE_SUGGESTION": "Select this label",
|
"MULTIPLE_SUGGESTION": "Dit label selecteren",
|
||||||
"DESELECT": "Deselect label",
|
"DESELECT": "Label deselecteren",
|
||||||
"DISMISS": "Dismiss suggestion"
|
"DISMISS": "Voorstel negeren"
|
||||||
},
|
},
|
||||||
"POWERED_BY": "Chatwoot AI",
|
"POWERED_BY": "Chatwoot AI",
|
||||||
"DISMISS": "Dismiss",
|
"DISMISS": "Negeren",
|
||||||
"ADD_SELECTED_LABELS": "Add selected labels",
|
"ADD_SELECTED_LABELS": "Voeg geselecteerde labels toe",
|
||||||
"ADD_SELECTED_LABEL": "Add selected label",
|
"ADD_SELECTED_LABEL": "Geselecteerde label toevoegen",
|
||||||
"ADD_ALL_LABELS": "Add all labels"
|
"ADD_ALL_LABELS": "Voeg alle labels toe"
|
||||||
},
|
},
|
||||||
"ADD": {
|
"ADD": {
|
||||||
"TITLE": "Label toevoegen",
|
"TITLE": "Label toevoegen",
|
||||||
|
|||||||
@@ -271,7 +271,7 @@
|
|||||||
"LOADING_CHART": "Kaartgegevens laden...",
|
"LOADING_CHART": "Kaartgegevens laden...",
|
||||||
"NO_ENOUGH_DATA": "We hebben niet genoeg datapunten ontvangen om een rapport te genereren, probeer het later opnieuw.",
|
"NO_ENOUGH_DATA": "We hebben niet genoeg datapunten ontvangen om een rapport te genereren, probeer het later opnieuw.",
|
||||||
"DOWNLOAD_INBOX_REPORTS": "Download inbox reports",
|
"DOWNLOAD_INBOX_REPORTS": "Download inbox reports",
|
||||||
"FILTER_DROPDOWN_LABEL": "Select Inbox",
|
"FILTER_DROPDOWN_LABEL": "Selecteer een inbox",
|
||||||
"METRICS": {
|
"METRICS": {
|
||||||
"CONVERSATIONS": {
|
"CONVERSATIONS": {
|
||||||
"NAME": "Gesprekken",
|
"NAME": "Gesprekken",
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
{
|
{
|
||||||
"RESET_PASSWORD": {
|
"RESET_PASSWORD": {
|
||||||
"TITLE": "Wachtwoord opnieuw instellen",
|
"TITLE": "Wachtwoord opnieuw instellen",
|
||||||
"DESCRIPTION": "Enter the email address you use to log in to Chatwoot to get the password reset instructions.",
|
"DESCRIPTION": "Voer het e-mailadres in dat u gebruikt om in te loggen bij Chatwoot om instructies voor het opnieuw instellen van uw wachtwoord te ontvangen.",
|
||||||
"GO_BACK_TO_LOGIN": "If you want to go back to the login page,",
|
"GO_BACK_TO_LOGIN": "Als u terug wilt gaan naar de inlogpagina,",
|
||||||
"EMAIL": {
|
"EMAIL": {
|
||||||
"LABEL": "E-mailadres",
|
"LABEL": "E-mailadres",
|
||||||
"PLACEHOLDER": "Voer uw e-mailadres in.",
|
"PLACEHOLDER": "Voer uw e-mailadres in.",
|
||||||
|
|||||||
@@ -4,21 +4,21 @@
|
|||||||
"ALL": "Allemaal",
|
"ALL": "Allemaal",
|
||||||
"CONTACTS": "Contacten",
|
"CONTACTS": "Contacten",
|
||||||
"CONVERSATIONS": "Gesprekken",
|
"CONVERSATIONS": "Gesprekken",
|
||||||
"MESSAGES": "Messages"
|
"MESSAGES": "Berichten"
|
||||||
},
|
},
|
||||||
"SECTION": {
|
"SECTION": {
|
||||||
"CONTACTS": "Contacten",
|
"CONTACTS": "Contacten",
|
||||||
"CONVERSATIONS": "Gesprekken",
|
"CONVERSATIONS": "Gesprekken",
|
||||||
"MESSAGES": "Messages"
|
"MESSAGES": "Berichten"
|
||||||
},
|
},
|
||||||
"EMPTY_STATE": "No %{item} found for query '%{query}'",
|
"EMPTY_STATE": "Geen %{item} gevonden voor query '%{query}'",
|
||||||
"EMPTY_STATE_FULL": "No results found for query '%{query}'",
|
"EMPTY_STATE_FULL": "Geen resultaten gevonden voor query '%{query}'",
|
||||||
"PLACEHOLDER_KEYBINDING": "/ to focus",
|
"PLACEHOLDER_KEYBINDING": "/ om te focussen",
|
||||||
"INPUT_PLACEHOLDER": "Type 3 or more characters to search",
|
"INPUT_PLACEHOLDER": "Voer 3 of meer tekens in om te zoeken",
|
||||||
"EMPTY_STATE_DEFAULT": "Search by conversation id, email, phone number, messages for better search results. ",
|
"EMPTY_STATE_DEFAULT": "Zoeken op gesprek id, e-mail, telefoonnummer, berichten voor betere zoekresultaten. ",
|
||||||
"BOT_LABEL": "Bot",
|
"BOT_LABEL": "Bot",
|
||||||
"READ_MORE": "Read more",
|
"READ_MORE": "Meer lezen",
|
||||||
"WROTE": "wrote:",
|
"WROTE": "schreef:",
|
||||||
"FROM": "van",
|
"FROM": "van",
|
||||||
"EMAIL": "e-mailadres"
|
"EMAIL": "e-mailadres"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
{
|
{
|
||||||
"SET_NEW_PASSWORD": {
|
"SET_NEW_PASSWORD": {
|
||||||
"TITLE": "Set new password",
|
"TITLE": "Nieuw wachtwoord instellen",
|
||||||
"PASSWORD": {
|
"PASSWORD": {
|
||||||
"LABEL": "Wachtwoord",
|
"LABEL": "Wachtwoord",
|
||||||
"PLACEHOLDER": "Wachtwoord",
|
"PLACEHOLDER": "Wachtwoord",
|
||||||
"ERROR": "Wachtwoord is te kort."
|
"ERROR": "Wachtwoord is te kort."
|
||||||
},
|
},
|
||||||
"CONFIRM_PASSWORD": {
|
"CONFIRM_PASSWORD": {
|
||||||
"LABEL": "Confirm password",
|
"LABEL": "Bevestig wachtwoord",
|
||||||
"PLACEHOLDER": "Bevestig wachtwoord",
|
"PLACEHOLDER": "Bevestig wachtwoord",
|
||||||
"ERROR": "Wachtwoorden komen niet overeen."
|
"ERROR": "Wachtwoorden komen niet overeen."
|
||||||
},
|
},
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user